From 5c20f244c9314e7fd2677251aee7aafa5eb2dfd6 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 2 Sep 2026 04:07:24 +0200 Subject: [PATCH 001/128] [cmake] stop building OpenGL on Android (#4342) Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- we don't even support OpenGL on android Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4342 Reviewed-by: crueter Reviewed-by: CamilleLaVey --- CMakeLists.txt | 2 +- docs/Options.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc4b991b4a..310237bc59 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -238,7 +238,7 @@ option(YUZU_USE_BUNDLED_SIRIT "Download bundled sirit" ${BUNDLED_SIRIT_DEFAULT}) # FreeBSD 15+ has libusb, versions below should disable it cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "WIN32 OR LINUX OR FREEBSD OR APPLE" OFF) -cmake_dependent_option(ENABLE_OPENGL "Enable OpenGL" ON "NOT (WIN32 AND ARCHITECTURE_arm64) AND NOT APPLE" OFF) +cmake_dependent_option(ENABLE_OPENGL "Enable OpenGL" ON "NOT (WIN32 AND ARCHITECTURE_arm64) AND NOT APPLE AND NOT ANDROID" OFF) mark_as_advanced(FORCE ENABLE_OPENGL) option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON) diff --git a/docs/Options.md b/docs/Options.md index a8552f2f0f..ece6bdeba6 100644 --- a/docs/Options.md +++ b/docs/Options.md @@ -76,7 +76,7 @@ The following options are desktop only. - `ENABLE_LIBUSB` (ON) Enable the use of the libusb input backend (HIGHLY RECOMMENDED) - `ENABLE_OPENGL` (ON) Enable the OpenGL graphics backend - - Unavailable on Windows/ARM64 + - Unavailable on Windows/ARM64 and on Android - You probably shouldn't turn this off. ### Qt From 1dcc5745918761f5a554fec981b4d144034f6201 Mon Sep 17 00:00:00 2001 From: xbzk Date: Wed, 2 Sep 2026 14:04:35 +0200 Subject: [PATCH 002/128] [gdb] fix conn state to use same pipe (instead of a copy) (#4339) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- I was trying to use GDB stub to investigate MHR and it was not connecting. Error was suggesting it was not available for connection although i saw it booting on logs. Debugged and noticed signal_pipe_ was not the correct one, and followed the example of client_socket_. GDB stub is now working, on windows, at least. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4339 Reviewed-by: Lizzie and Samuel Reviewed-by: MaranBr --- src/core/debugger/debugger.cpp | 2 +- src/core/hle/kernel/k_process.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/debugger/debugger.cpp b/src/core/debugger/debugger.cpp index d1c767721b..4ed69d8128 100644 --- a/src/core/debugger/debugger.cpp +++ b/src/core/debugger/debugger.cpp @@ -358,7 +358,7 @@ private: ConnectionState(boost::asio::ip::tcp::socket&& client_socket_, async_pipe signal_pipe_, Kernel::KernelCore& kernel) : client_socket{std::move(client_socket_)} - , signal_pipe{signal_pipe_} + , signal_pipe{std::move(signal_pipe_)} , active_thread{kernel, nullptr} {} diff --git a/src/core/hle/kernel/k_process.cpp b/src/core/hle/kernel/k_process.cpp index 7308b0ff87..27d1b1bfc4 100644 --- a/src/core/hle/kernel/k_process.cpp +++ b/src/core/hle/kernel/k_process.cpp @@ -1021,6 +1021,9 @@ Result KProcess::Run(KernelCore& kernel, s32 priority, size_t stack_size) { // Suspend for debug, if we should. if (kernel.System().DebuggerEnabled()) { + LOG_INFO(Debug_GDBStub, + "GDB stub enabled; suspending guest process until a debugger continues execution on port {}", + Settings::values.gdbstub_port.GetValue()); main_thread->RequestSuspend(kernel, SuspendType::Debug); } From f6e768603881713b126cba6f0f5a035981da3b1d Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 4 Sep 2026 13:32:36 +0200 Subject: [PATCH 003/128] [ci] Fix macOS "no type named 'free' in namespace 'std' (#4347) Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4347 Reviewed-by: CamilleLaVey Reviewed-by: MaranBr --- externals/tz/tz/tz.h | 1 + src/common/demangle.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/externals/tz/tz/tz.h b/externals/tz/tz/tz.h index e70092a987..821d60708a 100644 --- a/externals/tz/tz/tz.h +++ b/externals/tz/tz/tz.h @@ -11,6 +11,7 @@ #include #include #include +#include #include namespace Tz { diff --git a/src/common/demangle.cpp b/src/common/demangle.cpp index 8f76a884a8..d5ebc23c0a 100644 --- a/src/common/demangle.cpp +++ b/src/common/demangle.cpp @@ -5,6 +5,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include #ifdef _WIN32 #include From 11de2645411ba83e6fcf47bf30ae48a7ee6ae090 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 5 Sep 2026 23:43:46 +0200 Subject: [PATCH 004/128] [cmake] Fix some macOS compilation errors (#4350) Don't compile GLSL/GLASM backends without OpenGL enabled. These codepaths are unused on non-OpenGL platforms. Fixes other miscellaneous errors that pop up on Clang 23 as well. Signed-off-by: Lizzie lizzie@eden-emu.dev Signed-off-by: crueter crueter@eden-emu.dev - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Co-authored-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4350 Reviewed-by: crueter Reviewed-by: CamilleLaVey --- .../0001-macos-clang.patch | 112 ++++ CMakeLists.txt | 3 +- cpmfile.json | 15 +- src/common/scratch_buffer.h | 6 +- src/common/uuid.h | 1 + src/core/debugger/debugger.cpp | 4 +- src/core/file_sys/fssystem/fs_types.h | 3 +- ...ssystem_aes_ctr_counter_extended_storage.h | 1 + .../fssystem/fssystem_bucket_tree.cpp | 1 + .../file_sys/fssystem/fssystem_bucket_tree.h | 4 + .../fssystem_bucket_tree_template_impl.h | 3 +- .../fssystem/fssystem_compressed_storage.h | 2 + ...rarchical_integrity_verification_storage.h | 4 + .../fssystem/fssystem_indirect_storage.h | 3 + .../fssystem_integrity_verification_storage.h | 6 + .../fssystem_nca_file_system_driver.h | 4 +- .../file_sys/fssystem/fssystem_nca_header.h | 6 + src/core/hle/kernel/k_page_table_base.h | 1 + src/core/hle/result.h | 1 + src/core/hle/service/bcat/bcat_types.h | 4 + src/core/hle/service/caps/caps_manager.cpp | 34 +- src/core/hle/service/caps/caps_su.cpp | 9 +- src/core/hle/service/caps/caps_types.h | 4 + src/core/hle/service/ldn/ldn_types.h | 3 +- src/core/hle/service/psc/time/common.h | 1 + src/core/hle/service/psc/time/shared_memory.h | 5 +- src/core/hle/service/set/settings_types.h | 1 + src/hid_core/hid_types.h | 7 + src/shader_recompiler/CMakeLists.txt | 104 ++-- .../global_memory_to_storage_buffer_pass.cpp | 11 - src/video_core/host1x/codec_types.h | 1 + src/video_core/host1x/nvdec_common.h | 7 + src/video_core/host1x/vic.h | 1 + .../renderer_vulkan/vk_present_manager.cpp | 2 +- .../renderer_vulkan/vk_scheduler.cpp | 2 +- .../vulkan_common/vulkan_memory_allocator.cpp | 567 +++++++++--------- src/yuzu/main_window.cpp | 2 +- tools/cpm/cmake/package/version.cmake | 2 +- 38 files changed, 535 insertions(+), 412 deletions(-) create mode 100644 .patch/vulkan-memory-allocator/0001-macos-clang.patch diff --git a/.patch/vulkan-memory-allocator/0001-macos-clang.patch b/.patch/vulkan-memory-allocator/0001-macos-clang.patch new file mode 100644 index 0000000000..e965292f6f --- /dev/null +++ b/.patch/vulkan-memory-allocator/0001-macos-clang.patch @@ -0,0 +1,112 @@ +diff --git a/include/vk_mem_alloc.h b/include/vk_mem_alloc.h +index 8df0364..4856064 100644 +--- a/include/vk_mem_alloc.h ++++ b/include/vk_mem_alloc.h +@@ -3017,7 +3017,7 @@ remove them if not needed. + + #if defined(__ANDROID_API__) && (__ANDROID_API__ < 16) + #include +-static void* vma_aligned_alloc(size_t alignment, size_t size) ++static inline void* vma_aligned_alloc(size_t alignment, size_t size) + { + // alignment must be >= sizeof(void*) + if(alignment < sizeof(void*)) +@@ -3860,7 +3860,7 @@ Returned value is the found element, if present in the collection or place where + new element with value (key) should be inserted. + */ + template +-static IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, const KeyT& key, const CmpLess& cmp) ++static inline IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, const KeyT& key, const CmpLess& cmp) + { + size_t down = 0; + size_t up = size_t(end - beg); +@@ -3898,7 +3898,7 @@ Warning! O(n^2) complexity. Use only inside VMA_HEAVY_ASSERT. + T must be pointer type, e.g. VmaAllocation, VmaPool. + */ + template +-static bool VmaValidatePointerArray(uint32_t count, const T* arr) ++static inline bool VmaValidatePointerArray(uint32_t count, const T* arr) + { + for (uint32_t i = 0; i < count; ++i) + { +@@ -4188,13 +4188,13 @@ static void VmaFree(const VkAllocationCallbacks* pAllocationCallbacks, void* ptr + } + + template +-static T* VmaAllocate(const VkAllocationCallbacks* pAllocationCallbacks) ++static inline T* VmaAllocate(const VkAllocationCallbacks* pAllocationCallbacks) + { + return (T*)VmaMalloc(pAllocationCallbacks, sizeof(T), VMA_ALIGN_OF(T)); + } + + template +-static T* VmaAllocateArray(const VkAllocationCallbacks* pAllocationCallbacks, size_t count) ++static inline T* VmaAllocateArray(const VkAllocationCallbacks* pAllocationCallbacks, size_t count) + { + return (T*)VmaMalloc(pAllocationCallbacks, sizeof(T) * count, VMA_ALIGN_OF(T)); + } +@@ -4204,14 +4204,14 @@ static T* VmaAllocateArray(const VkAllocationCallbacks* pAllocationCallbacks, si + #define vma_new_array(allocator, type, count) new(VmaAllocateArray((allocator), (count)))(type) + + template +-static void vma_delete(const VkAllocationCallbacks* pAllocationCallbacks, T* ptr) ++static inline void vma_delete(const VkAllocationCallbacks* pAllocationCallbacks, T* ptr) + { + ptr->~T(); + VmaFree(pAllocationCallbacks, ptr); + } + + template +-static void vma_delete_array(const VkAllocationCallbacks* pAllocationCallbacks, T* ptr, size_t count) ++static inline void vma_delete_array(const VkAllocationCallbacks* pAllocationCallbacks, T* ptr, size_t count) + { + if (ptr != VMA_NULL) + { +@@ -4658,13 +4658,13 @@ void VmaVector::remove(size_t index) + #endif // _VMA_VECTOR_FUNCTIONS + + template +-static void VmaVectorInsert(VmaVector& vec, size_t index, const T& item) ++static inline void VmaVectorInsert(VmaVector& vec, size_t index, const T& item) + { + vec.insert(index, item); + } + + template +-static void VmaVectorRemove(VmaVector& vec, size_t index) ++static inline void VmaVectorRemove(VmaVector& vec, size_t index) + { + vec.remove(index); + } +@@ -10620,19 +10620,19 @@ static void VmaFree(VmaAllocator hAllocator, void* ptr) + } + + template +-static T* VmaAllocate(VmaAllocator hAllocator) ++static inline T* VmaAllocate(VmaAllocator hAllocator) + { + return (T*)VmaMalloc(hAllocator, sizeof(T), VMA_ALIGN_OF(T)); + } + + template +-static T* VmaAllocateArray(VmaAllocator hAllocator, size_t count) ++static inline T* VmaAllocateArray(VmaAllocator hAllocator, size_t count) + { + return (T*)VmaMalloc(hAllocator, sizeof(T) * count, VMA_ALIGN_OF(T)); + } + + template +-static void vma_delete(VmaAllocator hAllocator, T* ptr) ++static inline void vma_delete(VmaAllocator hAllocator, T* ptr) + { + if(ptr != VMA_NULL) + { +@@ -10642,7 +10642,7 @@ static void vma_delete(VmaAllocator hAllocator, T* ptr) + } + + template +-static void vma_delete_array(VmaAllocator hAllocator, T* ptr, size_t count) ++static inline void vma_delete_array(VmaAllocator hAllocator, T* ptr, size_t count) + { + if(ptr != VMA_NULL) + { diff --git a/CMakeLists.txt b/CMakeLists.txt index 310237bc59..8b068b85b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 3.31) +set(CMAKE_OSX_DEPLOYMENT_TARGET "15.0" CACHE STRING "macOS deployment target") project(yuzu) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules") @@ -512,7 +513,7 @@ endfunction() # ============================================= if (APPLE) - foreach(fw Carbon Metal Cocoa IOKit CoreVideo CoreMedia Security UniformTypeIdentifiers) + foreach(fw Carbon Metal Cocoa IOKit CoreVideo CoreMedia Security UniformTypeIdentifiers Foundation) find_library(${fw}_LIBRARY ${fw} REQUIRED) list(APPEND PLATFORM_LIBRARIES ${${fw}_LIBRARY}) endforeach() diff --git a/cpmfile.json b/cpmfile.json index c5ea35c955..af773e0bd0 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -1,12 +1,4 @@ { - "": { - "ci": true, - "hash": "9f50d993c39529e022ad456163de91ac5934e16faf8fc348f305355fc0a643c534f87ded707e11bd03bcbc0a1760bd20852b6533a67ac0558a078385181cb184", - "name": "SDL3", - "package": "SDL3", - "repo": "crueter-ci/SDL3", - "version": "3.4.14-1788231389-147a8ee32d" - }, "biscuit": { "hash": "1229f345b014f7ca544dedb4edb3311e41ba736f9aa9a67f88b5f26f3c983288c6bb6cdedcfb0b8a02c63088a37e6a0d7ba97d9c2a4d721b213916327cffe28a", "min_version": "0.9.1", @@ -68,10 +60,10 @@ }, "discord-rpc": { "find_args": "MODULE", - "hash": "8213c43dcb0f7d479f5861091d111ed12fbdec1e62e6d729d65a4bc181d82f48a35d5fd3cd5c291f2393ac7c9681eabc6b76609755f55376284c8a8d67e148f3", + "hash": "8d680b3a16d6f6bf292ad823cf8635595ff986f2a49f758e3009f505b540a9d75194a8cf44cddea75736a8c3e3b5160166e716a0939ce3f18cc463cf648753fe", "package": "DiscordRPC", "repo": "eden-emulator/discord-rpc", - "version": "0d8b2d6a37" + "version": "76616d8675" }, "enet": { "find_args": "MODULE", @@ -311,6 +303,9 @@ "find_args": "CONFIG", "hash": "deb5902ef8db0e329fbd5f3f4385eb0e26bdd9f14f3a2334823fb3fe18f36bc5d235d620d6e5f6fe3551ec3ea7038638899db8778c09f6d5c278f5ff95c3344b", "package": "VulkanMemoryAllocator", + "patches": [ + "0001-macos-clang.patch" + ], "repo": "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator", "version": "v3.3.0" }, diff --git a/src/common/scratch_buffer.h b/src/common/scratch_buffer.h index 2a98cda539..8c1f566301 100644 --- a/src/common/scratch_buffer.h +++ b/src/common/scratch_buffer.h @@ -1,9 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 #pragma once #include +#include #include "common/make_unique_for_overwrite.h" @@ -61,7 +65,7 @@ public: void resize(size_type size) { if (size > buffer_capacity) { auto new_buffer = Common::make_unique_for_overwrite(size); - std::move(buffer.get(), buffer.get() + buffer_capacity, new_buffer.get()); + std::memcpy(new_buffer.get(), buffer.get(), buffer_capacity * sizeof(T)); buffer = std::move(new_buffer); buffer_capacity = size; } diff --git a/src/common/uuid.h b/src/common/uuid.h index c3cbd7b479..3aa3212dd7 100644 --- a/src/common/uuid.h +++ b/src/common/uuid.h @@ -10,6 +10,7 @@ #include #include #include +#include #include "common/common_types.h" diff --git a/src/core/debugger/debugger.cpp b/src/core/debugger/debugger.cpp index 4ed69d8128..a9c1dcfb47 100644 --- a/src/core/debugger/debugger.cpp +++ b/src/core/debugger/debugger.cpp @@ -6,13 +6,13 @@ #include #include +#include + #include #include - #if BOOST_VERSION > 108400 && (!defined(_WINDOWS) && !defined(__ANDROID__)) || defined(YUZU_BOOST_v1) #define USE_BOOST_v1 #endif - #ifdef USE_BOOST_v1 #include #else diff --git a/src/core/file_sys/fssystem/fs_types.h b/src/core/file_sys/fssystem/fs_types.h index f11b7f1dae..fb16697c8f 100644 --- a/src/core/file_sys/fssystem/fs_types.h +++ b/src/core/file_sys/fssystem/fs_types.h @@ -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-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -6,6 +6,7 @@ #pragma once +#include #include "common/common_funcs.h" namespace FileSys { diff --git a/src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.h b/src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.h index b7b004f9e3..b409b3acf3 100644 --- a/src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.h +++ b/src/core/file_sys/fssystem/fssystem_aes_ctr_counter_extended_storage.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include "common/literals.h" #include "core/file_sys/fssystem/fs_i_storage.h" diff --git a/src/core/file_sys/fssystem/fssystem_bucket_tree.cpp b/src/core/file_sys/fssystem/fssystem_bucket_tree.cpp index 07926b7acf..e457f6b239 100644 --- a/src/core/file_sys/fssystem/fssystem_bucket_tree.cpp +++ b/src/core/file_sys/fssystem/fssystem_bucket_tree.cpp @@ -4,6 +4,7 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include "core/file_sys/errors.h" #include "core/file_sys/fssystem/fssystem_bucket_tree.h" #include "core/file_sys/fssystem/fssystem_bucket_tree_utils.h" diff --git a/src/core/file_sys/fssystem/fssystem_bucket_tree.h b/src/core/file_sys/fssystem/fssystem_bucket_tree.h index 3a5e21d1a4..66b6a17bbc 100644 --- a/src/core/file_sys/fssystem/fssystem_bucket_tree.h +++ b/src/core/file_sys/fssystem/fssystem_bucket_tree.h @@ -1,9 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 #pragma once #include +#include #include "common/alignment.h" #include "common/common_funcs.h" diff --git a/src/core/file_sys/fssystem/fssystem_bucket_tree_template_impl.h b/src/core/file_sys/fssystem/fssystem_bucket_tree_template_impl.h index fac6c37214..5e7402e71c 100644 --- a/src/core/file_sys/fssystem/fssystem_bucket_tree_template_impl.h +++ b/src/core/file_sys/fssystem/fssystem_bucket_tree_template_impl.h @@ -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-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -6,6 +6,7 @@ #pragma once +#include #include "core/file_sys/errors.h" #include "core/file_sys/fssystem/fssystem_bucket_tree.h" #include "core/file_sys/fssystem/fssystem_bucket_tree_utils.h" diff --git a/src/core/file_sys/fssystem/fssystem_compressed_storage.h b/src/core/file_sys/fssystem/fssystem_compressed_storage.h index 3fc0449664..97de0f0c9a 100644 --- a/src/core/file_sys/fssystem/fssystem_compressed_storage.h +++ b/src/core/file_sys/fssystem/fssystem_compressed_storage.h @@ -6,6 +6,8 @@ #pragma once +#include +#include #include "common/literals.h" #include "core/file_sys/errors.h" diff --git a/src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.h b/src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.h index bd129db47a..ada1656ef7 100644 --- a/src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.h +++ b/src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.h @@ -1,8 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 #pragma once +#include #include "common/alignment.h" #include "core/file_sys/fssystem/fs_i_storage.h" #include "core/file_sys/fssystem/fs_types.h" diff --git a/src/core/file_sys/fssystem/fssystem_indirect_storage.h b/src/core/file_sys/fssystem/fssystem_indirect_storage.h index 81f94e2e19..728616b964 100644 --- a/src/core/file_sys/fssystem/fssystem_indirect_storage.h +++ b/src/core/file_sys/fssystem/fssystem_indirect_storage.h @@ -6,6 +6,9 @@ #pragma once +#include +#include +#include #include "core/file_sys/errors.h" #include "core/file_sys/fssystem/fs_i_storage.h" #include "core/file_sys/fssystem/fssystem_bucket_tree.h" diff --git a/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.h b/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.h index 09f76799db..b4259419dd 100644 --- a/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.h +++ b/src/core/file_sys/fssystem/fssystem_integrity_verification_storage.h @@ -1,9 +1,15 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 #pragma once #include +#include +#include +#include #include "core/file_sys/fssystem/fs_i_storage.h" #include "core/file_sys/fssystem/fs_types.h" diff --git a/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h b/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h index e09bfc588a..ad8095b6f0 100644 --- a/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h +++ b/src/core/file_sys/fssystem/fssystem_nca_file_system_driver.h @@ -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-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -6,6 +6,8 @@ #pragma once +#include +#include #include "core/file_sys/fssystem/fssystem_compression_common.h" #include "core/file_sys/fssystem/fssystem_nca_header.h" #include "core/file_sys/vfs/vfs.h" diff --git a/src/core/file_sys/fssystem/fssystem_nca_header.h b/src/core/file_sys/fssystem/fssystem_nca_header.h index a02c5d881c..b10bb39e66 100644 --- a/src/core/file_sys/fssystem/fssystem_nca_header.h +++ b/src/core/file_sys/fssystem/fssystem_nca_header.h @@ -1,8 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 #pragma once +#include +#include +#include #include "common/common_funcs.h" #include "common/common_types.h" #include "common/literals.h" diff --git a/src/core/hle/kernel/k_page_table_base.h b/src/core/hle/kernel/k_page_table_base.h index 160e722985..1d4fa85f04 100644 --- a/src/core/hle/kernel/k_page_table_base.h +++ b/src/core/hle/kernel/k_page_table_base.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include "common/common_funcs.h" #include "common/page_table.h" diff --git a/src/core/hle/result.h b/src/core/hle/result.h index cfad30b992..da100ede90 100644 --- a/src/core/hle/result.h +++ b/src/core/hle/result.h @@ -6,6 +6,7 @@ #pragma once +#include #include "common/assert.h" #include "common/bit_field.h" #include "common/common_funcs.h" diff --git a/src/core/hle/service/bcat/bcat_types.h b/src/core/hle/service/bcat/bcat_types.h index b35dab7c5a..303c243542 100644 --- a/src/core/hle/service/bcat/bcat_types.h +++ b/src/core/hle/service/bcat/bcat_types.h @@ -1,9 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include +#include #include #include "common/common_funcs.h" diff --git a/src/core/hle/service/caps/caps_manager.cpp b/src/core/hle/service/caps/caps_manager.cpp index 407557b472..d3c4ab57d1 100644 --- a/src/core/hle/service/caps/caps_manager.cpp +++ b/src/core/hle/service/caps/caps_manager.cpp @@ -175,19 +175,10 @@ Result AlbumManager::LoadAlbumScreenShotImage(LoadAlbumScreenShotImageOutput& ou return ResultIsNotMounted; } - out_image_output = { - .width = 1280, - .height = 720, - .attribute = - { - .unknown_0{}, - .orientation = AlbumImageOrientation::None, - .unknown_1{}, - .unknown_2{}, - .pad163{}, - }, - .pad179{}, - }; + out_image_output = {}; + out_image_output.width = 1280; + out_image_output.height = 720; + out_image_output.attribute.orientation = AlbumImageOrientation::None; std::filesystem::path path; const auto result = GetFile(path, file_id); @@ -211,19 +202,10 @@ Result AlbumManager::LoadAlbumScreenShotThumbnail( return ResultIsNotMounted; } - out_image_output = { - .width = 320, - .height = 180, - .attribute = - { - .unknown_0{}, - .orientation = AlbumImageOrientation::None, - .unknown_1{}, - .unknown_2{}, - .pad163{}, - }, - .pad179{}, - }; + out_image_output = {}; + out_image_output.width = 320; + out_image_output.height = 180; + out_image_output.attribute.orientation = AlbumImageOrientation::None; std::filesystem::path path; const auto result = GetFile(path, file_id); diff --git a/src/core/hle/service/caps/caps_su.cpp b/src/core/hle/service/caps/caps_su.cpp index 3d54564612..4ecfc840e4 100644 --- a/src/core/hle/service/caps/caps_su.cpp +++ b/src/core/hle/service/caps/caps_su.cpp @@ -73,13 +73,8 @@ void IScreenShotApplicationService::CaptureAndSaveScreenshot(AlbumReportOption r Layout::FramebufferLayout layout = Layout::DefaultFrameLayout(screenshot_width, screenshot_height); - const Capture::ScreenShotAttribute attribute{ - .unknown_0{}, - .orientation = Capture::AlbumImageOrientation::None, - .unknown_1{}, - .unknown_2{}, - .pad163{}, - }; + Capture::ScreenShotAttribute attribute{}; + attribute.orientation = Capture::AlbumImageOrientation::None; renderer.RequestScreenshot( image_data.data(), diff --git a/src/core/hle/service/caps/caps_types.h b/src/core/hle/service/caps/caps_types.h index 3deaaad5b8..549ce4a307 100644 --- a/src/core/hle/service/caps/caps_types.h +++ b/src/core/hle/service/caps/caps_types.h @@ -1,8 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include "common/common_funcs.h" #include "common/common_types.h" diff --git a/src/core/hle/service/ldn/ldn_types.h b/src/core/hle/service/ldn/ldn_types.h index 975af5b6c8..4107d579ab 100644 --- a/src/core/hle/service/ldn/ldn_types.h +++ b/src/core/hle/service/ldn/ldn_types.h @@ -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-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -6,6 +6,7 @@ #pragma once +#include #include #include "common/common_funcs.h" diff --git a/src/core/hle/service/psc/time/common.h b/src/core/hle/service/psc/time/common.h index 36a90cd828..2183fa72b8 100644 --- a/src/core/hle/service/psc/time/common.h +++ b/src/core/hle/service/psc/time/common.h @@ -8,6 +8,7 @@ #include #include +#include #include #include "common/common_types.h" diff --git a/src/core/hle/service/psc/time/shared_memory.h b/src/core/hle/service/psc/time/shared_memory.h index b7bd00fc1d..58363bd698 100644 --- a/src/core/hle/service/psc/time/shared_memory.h +++ b/src/core/hle/service/psc/time/shared_memory.h @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 #pragma once #include - +#include #include "common/common_types.h" #include "core/hle/service/psc/time/common.h" diff --git a/src/core/hle/service/set/settings_types.h b/src/core/hle/service/set/settings_types.h index 696938c4c7..acb54856e0 100644 --- a/src/core/hle/service/set/settings_types.h +++ b/src/core/hle/service/set/settings_types.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include "common/bit_field.h" #include "common/common_funcs.h" diff --git a/src/hid_core/hid_types.h b/src/hid_core/hid_types.h index 40a90c2bc3..66d661c80b 100644 --- a/src/hid_core/hid_types.h +++ b/src/hid_core/hid_types.h @@ -1,8 +1,15 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include +#include +#include + #include "common/bit_field.h" #include "common/common_funcs.h" #include "common/common_types.h" diff --git a/src/shader_recompiler/CMakeLists.txt b/src/shader_recompiler/CMakeLists.txt index 1e6a4d173a..957ed5fb55 100644 --- a/src/shader_recompiler/CMakeLists.txt +++ b/src/shader_recompiler/CMakeLists.txt @@ -6,55 +6,6 @@ add_library(shader_recompiler STATIC backend/bindings.h - backend/glasm/emit_glasm.cpp - backend/glasm/emit_glasm.h - backend/glasm/emit_glasm_barriers.cpp - backend/glasm/emit_glasm_bitwise_conversion.cpp - backend/glasm/emit_glasm_composite.cpp - backend/glasm/emit_glasm_context_get_set.cpp - backend/glasm/emit_glasm_control_flow.cpp - backend/glasm/emit_glasm_convert.cpp - backend/glasm/emit_glasm_floating_point.cpp - backend/glasm/emit_glasm_image.cpp - backend/glasm/emit_glasm_instructions.h - backend/glasm/emit_glasm_integer.cpp - backend/glasm/emit_glasm_logical.cpp - backend/glasm/emit_glasm_memory.cpp - backend/glasm/emit_glasm_not_implemented.cpp - backend/glasm/emit_glasm_select.cpp - backend/glasm/emit_glasm_shared_memory.cpp - backend/glasm/emit_glasm_special.cpp - backend/glasm/emit_glasm_undefined.cpp - backend/glasm/emit_glasm_warp.cpp - backend/glasm/glasm_emit_context.cpp - backend/glasm/glasm_emit_context.h - backend/glasm/reg_alloc.cpp - backend/glasm/reg_alloc.h - backend/glsl/emit_glsl.cpp - backend/glsl/emit_glsl.h - backend/glsl/emit_glsl_atomic.cpp - backend/glsl/emit_glsl_barriers.cpp - backend/glsl/emit_glsl_bitwise_conversion.cpp - backend/glsl/emit_glsl_composite.cpp - backend/glsl/emit_glsl_context_get_set.cpp - backend/glsl/emit_glsl_control_flow.cpp - backend/glsl/emit_glsl_convert.cpp - backend/glsl/emit_glsl_floating_point.cpp - backend/glsl/emit_glsl_image.cpp - backend/glsl/emit_glsl_instructions.h - backend/glsl/emit_glsl_integer.cpp - backend/glsl/emit_glsl_logical.cpp - backend/glsl/emit_glsl_memory.cpp - backend/glsl/emit_glsl_not_implemented.cpp - backend/glsl/emit_glsl_select.cpp - backend/glsl/emit_glsl_shared_memory.cpp - backend/glsl/emit_glsl_special.cpp - backend/glsl/emit_glsl_undefined.cpp - backend/glsl/emit_glsl_warp.cpp - backend/glsl/glsl_emit_context.cpp - backend/glsl/glsl_emit_context.h - backend/glsl/var_alloc.cpp - backend/glsl/var_alloc.h backend/spirv/emit_spirv.cpp backend/spirv/emit_spirv.h backend/spirv/emit_spirv_atomic.cpp @@ -239,9 +190,60 @@ add_library(shader_recompiler STATIC program_header.h runtime_info.h shader_info.h - varying_state.h + varying_state.h) -) +if (ENABLE_OPENGL) + target_sources(shader_recompiler PRIVATE + backend/glasm/emit_glasm.cpp + backend/glasm/emit_glasm.h + backend/glasm/emit_glasm_barriers.cpp + backend/glasm/emit_glasm_bitwise_conversion.cpp + backend/glasm/emit_glasm_composite.cpp + backend/glasm/emit_glasm_context_get_set.cpp + backend/glasm/emit_glasm_control_flow.cpp + backend/glasm/emit_glasm_convert.cpp + backend/glasm/emit_glasm_floating_point.cpp + backend/glasm/emit_glasm_image.cpp + backend/glasm/emit_glasm_instructions.h + backend/glasm/emit_glasm_integer.cpp + backend/glasm/emit_glasm_logical.cpp + backend/glasm/emit_glasm_memory.cpp + backend/glasm/emit_glasm_not_implemented.cpp + backend/glasm/emit_glasm_select.cpp + backend/glasm/emit_glasm_shared_memory.cpp + backend/glasm/emit_glasm_special.cpp + backend/glasm/emit_glasm_undefined.cpp + backend/glasm/emit_glasm_warp.cpp + backend/glasm/glasm_emit_context.cpp + backend/glasm/glasm_emit_context.h + backend/glasm/reg_alloc.cpp + backend/glasm/reg_alloc.h + backend/glsl/emit_glsl.cpp + backend/glsl/emit_glsl.h + backend/glsl/emit_glsl_atomic.cpp + backend/glsl/emit_glsl_barriers.cpp + backend/glsl/emit_glsl_bitwise_conversion.cpp + backend/glsl/emit_glsl_composite.cpp + backend/glsl/emit_glsl_context_get_set.cpp + backend/glsl/emit_glsl_control_flow.cpp + backend/glsl/emit_glsl_convert.cpp + backend/glsl/emit_glsl_floating_point.cpp + backend/glsl/emit_glsl_image.cpp + backend/glsl/emit_glsl_instructions.h + backend/glsl/emit_glsl_integer.cpp + backend/glsl/emit_glsl_logical.cpp + backend/glsl/emit_glsl_memory.cpp + backend/glsl/emit_glsl_not_implemented.cpp + backend/glsl/emit_glsl_select.cpp + backend/glsl/emit_glsl_shared_memory.cpp + backend/glsl/emit_glsl_special.cpp + backend/glsl/emit_glsl_undefined.cpp + backend/glsl/emit_glsl_warp.cpp + backend/glsl/glsl_emit_context.cpp + backend/glsl/glsl_emit_context.h + backend/glsl/var_alloc.cpp + backend/glsl/var_alloc.h) +endif() target_link_libraries(shader_recompiler PUBLIC common fmt::fmt sirit::sirit) diff --git a/src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp b/src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp index 3929475ddc..f49d54e7ab 100644 --- a/src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp +++ b/src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp @@ -553,17 +553,6 @@ void GlobalMemoryToStorageBufferPass(IR::Program& program, const HostTranslateIn } } -template -static u32 Add(Descriptors& descriptors, const Descriptor& desc, Func&& pred) { - // TODO: Handle arrays - const auto it{std::ranges::find_if(descriptors, pred)}; - if (it != descriptors.end()) { - return static_cast(std::distance(descriptors.begin(), it)); - } - descriptors.push_back(desc); - return static_cast(descriptors.size()) - 1; -} - void JoinStorageInfo(Info& base, Info& source) { auto& descriptors = base.storage_buffers_descriptors; for (auto& desc : source.storage_buffers_descriptors) { diff --git a/src/video_core/host1x/codec_types.h b/src/video_core/host1x/codec_types.h index 3a10afa8df..b2f80c822a 100644 --- a/src/video_core/host1x/codec_types.h +++ b/src/video_core/host1x/codec_types.h @@ -8,6 +8,7 @@ #include #include +#include #include "common/bit_field.h" #include "common/common_funcs.h" diff --git a/src/video_core/host1x/nvdec_common.h b/src/video_core/host1x/nvdec_common.h index dfd8bb3770..0857a9f95c 100644 --- a/src/video_core/host1x/nvdec_common.h +++ b/src/video_core/host1x/nvdec_common.h @@ -1,8 +1,15 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include +#include +#include + #include "common/bit_field.h" #include "common/common_funcs.h" #include "common/common_types.h" diff --git a/src/video_core/host1x/vic.h b/src/video_core/host1x/vic.h index 18eff3382f..1a580474b5 100644 --- a/src/video_core/host1x/vic.h +++ b/src/video_core/host1x/vic.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include "common/common_types.h" #include "common/scratch_buffer.h" diff --git a/src/video_core/renderer_vulkan/vk_present_manager.cpp b/src/video_core/renderer_vulkan/vk_present_manager.cpp index 523e6d02cb..3491f8fb75 100644 --- a/src/video_core/renderer_vulkan/vk_present_manager.cpp +++ b/src/video_core/renderer_vulkan/vk_present_manager.cpp @@ -338,7 +338,7 @@ void PresentManager::PresentThread(std::stop_token token) { // By exchanging the lock ownership we take the swapchain lock // before the queue lock goes out of scope. This way the swapchain // lock in WaitPresent is guaranteed to occur after here. - std::exchange(lock, std::unique_lock{swapchain_mutex}); + void(std::exchange(lock, std::unique_lock{swapchain_mutex})); CopyToSwapchain(frame); // Free the frame for reuse diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index 92dcd20111..4a7a7d5e78 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -300,7 +300,7 @@ void Scheduler::WorkerThread(std::stop_token stop_token) { // Exchange lock ownership so that we take the execution lock before // the queue lock goes out of scope. This allows us to force execution // to complete in the next step. - std::exchange(lk, std::unique_lock{execution_mutex}); + void(std::exchange(lk, std::unique_lock{execution_mutex})); // Perform the work, tracking whether the chunk was a submission // before executing. diff --git a/src/video_core/vulkan_common/vulkan_memory_allocator.cpp b/src/video_core/vulkan_common/vulkan_memory_allocator.cpp index e57864ede8..20b6b55ef7 100644 --- a/src/video_core/vulkan_common/vulkan_memory_allocator.cpp +++ b/src/video_core/vulkan_common/vulkan_memory_allocator.cpp @@ -26,350 +26,329 @@ #include "common/settings.h" namespace Vulkan { - namespace { +namespace { // Helpers translating MemoryUsage to flags/usage - [[maybe_unused]] VkMemoryPropertyFlags MemoryUsagePropertyFlags(MemoryUsage usage) { - switch (usage) { - case MemoryUsage::DeviceLocal: - return VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; - case MemoryUsage::Upload: - return VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | - VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; - case MemoryUsage::Download: - return VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | - VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | - VK_MEMORY_PROPERTY_HOST_CACHED_BIT; - case MemoryUsage::Stream: - return VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | - VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; - } - ASSERT_MSG(false, "Invalid memory usage={}", usage); - return VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; + [[maybe_unused]] VkMemoryPropertyFlags MemoryUsagePropertyFlags(MemoryUsage usage) { + switch (usage) { + case MemoryUsage::DeviceLocal: + return VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; + case MemoryUsage::Upload: + return VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; + case MemoryUsage::Download: + return VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | + VK_MEMORY_PROPERTY_HOST_CACHED_BIT; + case MemoryUsage::Stream: + return VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; } + ASSERT_MSG(false, "Invalid memory usage={}", usage); + return VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; + } - [[nodiscard]] VkMemoryPropertyFlags MemoryUsagePreferredVmaFlags(MemoryUsage usage) { - if (usage == MemoryUsage::Download) { - return VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; - } - return usage != MemoryUsage::DeviceLocal ? VK_MEMORY_PROPERTY_HOST_COHERENT_BIT - : VkMemoryPropertyFlagBits{}; + [[nodiscard]] VkMemoryPropertyFlags MemoryUsagePreferredVmaFlags(MemoryUsage usage) { + if (usage == MemoryUsage::Download) { + return VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; } + return usage != MemoryUsage::DeviceLocal ? VK_MEMORY_PROPERTY_HOST_COHERENT_BIT + : VkMemoryPropertyFlagBits{}; + } - [[nodiscard]] VmaAllocationCreateFlags MemoryUsageVmaFlags(MemoryUsage usage) { - switch (usage) { - case MemoryUsage::Upload: - case MemoryUsage::Stream: - return VMA_ALLOCATION_CREATE_MAPPED_BIT | - VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; - case MemoryUsage::Download: - return VMA_ALLOCATION_CREATE_MAPPED_BIT | - VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT; - case MemoryUsage::DeviceLocal: - return {}; - } - return {}; + [[nodiscard]] VmaAllocationCreateFlags MemoryUsageVmaFlags(MemoryUsage usage) { + switch (usage) { + case MemoryUsage::Upload: + case MemoryUsage::Stream: + return VMA_ALLOCATION_CREATE_MAPPED_BIT | + VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; + case MemoryUsage::Download: + return VMA_ALLOCATION_CREATE_MAPPED_BIT | + VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT; + case MemoryUsage::DeviceLocal: + return {}; } + return {}; + } - [[nodiscard]] VmaMemoryUsage MemoryUsageVma(MemoryUsage usage) { - switch (usage) { - case MemoryUsage::DeviceLocal: - case MemoryUsage::Stream: - return VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; - case MemoryUsage::Upload: - case MemoryUsage::Download: - return VMA_MEMORY_USAGE_AUTO_PREFER_HOST; - } - return VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; + [[nodiscard]] VmaMemoryUsage MemoryUsageVma(MemoryUsage usage) { + switch (usage) { + case MemoryUsage::DeviceLocal: + case MemoryUsage::Stream: + return VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; + case MemoryUsage::Upload: + case MemoryUsage::Download: + return VMA_MEMORY_USAGE_AUTO_PREFER_HOST; } - - -// This avoids calling vkGetBufferMemoryRequirements* directly. - template - static VkBuffer GetVkHandleFromBuffer(const T &buf) { - if constexpr (requires { static_cast(buf); }) { - return static_cast(buf); - } else if constexpr (requires {{ buf.GetHandle() } -> std::convertible_to; }) { - return buf.GetHandle(); - } else if constexpr (requires {{ buf.Handle() } -> std::convertible_to; }) { - return buf.Handle(); - } else if constexpr (requires {{ buf.vk_handle() } -> std::convertible_to; }) { - return buf.vk_handle(); - } else { - static_assert(sizeof(T) == 0, "Cannot extract VkBuffer handle from vk::Buffer"); - return VK_NULL_HANDLE; - } - } - - } // namespace + return VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE; + } +} // namespace //MemoryCommit is now VMA-backed - MemoryCommit::MemoryCommit(VmaAllocator alloc, VmaAllocation a, - const VmaAllocationInfo &info) noexcept - : allocator{alloc}, allocation{a}, memory{info.deviceMemory}, - offset{info.offset}, size{info.size}, mapped_ptr{info.pMappedData} { - // Log GPU memory allocation +MemoryCommit::MemoryCommit(VmaAllocator alloc, VmaAllocation a, + const VmaAllocationInfo &info) noexcept + : allocator{alloc}, allocation{a}, memory{info.deviceMemory}, + offset{info.offset}, size{info.size}, mapped_ptr{info.pMappedData} { + // Log GPU memory allocation + if (GPU::Logging::IsActive() && + Settings::values.gpu_log_memory_tracking.GetValue()) { + GPU::Logging::GPULogger::GetInstance().LogMemoryAllocation( + reinterpret_cast(memory), + static_cast(size), + 0 // Memory property flags (not easily available from VMA) + ); + } +} + +MemoryCommit::~MemoryCommit() { Release(); } + +MemoryCommit::MemoryCommit(MemoryCommit &&rhs) noexcept + : allocator{std::exchange(rhs.allocator, nullptr)}, + allocation{std::exchange(rhs.allocation, nullptr)}, + memory{std::exchange(rhs.memory, VK_NULL_HANDLE)}, + offset{std::exchange(rhs.offset, 0)}, + size{std::exchange(rhs.size, 0)}, + mapped_ptr{std::exchange(rhs.mapped_ptr, nullptr)} {} + +MemoryCommit &MemoryCommit::operator=(MemoryCommit &&rhs) noexcept { + if (this != &rhs) { + Release(); + allocator = std::exchange(rhs.allocator, nullptr); + allocation = std::exchange(rhs.allocation, nullptr); + memory = std::exchange(rhs.memory, VK_NULL_HANDLE); + offset = std::exchange(rhs.offset, 0); + size = std::exchange(rhs.size, 0); + mapped_ptr = std::exchange(rhs.mapped_ptr, nullptr); + } + return *this; +} + +std::span MemoryCommit::Map() +{ + if (!allocation) return {}; + if (!mapped_ptr) { + if (vmaMapMemory(allocator, allocation, &mapped_ptr) != VK_SUCCESS) return {}; + } + const size_t n = static_cast(std::min(size, + (std::numeric_limits::max)())); + return std::span{static_cast(mapped_ptr), n}; +} + +std::span MemoryCommit::Map() const +{ + if (!allocation) return {}; + if (!mapped_ptr) { + void *p = nullptr; + if (vmaMapMemory(allocator, allocation, &p) != VK_SUCCESS) return {}; + const_cast(this)->mapped_ptr = p; + } + const size_t n = static_cast(std::min(size, + (std::numeric_limits::max)())); + return std::span{static_cast(mapped_ptr), n}; +} + +void MemoryCommit::Unmap() +{ + if (allocation && mapped_ptr) { + vmaUnmapMemory(allocator, allocation); + mapped_ptr = nullptr; + } +} + +void MemoryCommit::Release() { + if (allocation && allocator) { + // Log GPU memory deallocation if (GPU::Logging::IsActive() && - Settings::values.gpu_log_memory_tracking.GetValue()) { - GPU::Logging::GPULogger::GetInstance().LogMemoryAllocation( - reinterpret_cast(memory), - static_cast(size), - 0 // Memory property flags (not easily available from VMA) + Settings::values.gpu_log_memory_tracking.GetValue() && + memory != VK_NULL_HANDLE) { + GPU::Logging::GPULogger::GetInstance().LogMemoryDeallocation( + reinterpret_cast(memory) ); } - } - MemoryCommit::~MemoryCommit() { Release(); } - - MemoryCommit::MemoryCommit(MemoryCommit &&rhs) noexcept - : allocator{std::exchange(rhs.allocator, nullptr)}, - allocation{std::exchange(rhs.allocation, nullptr)}, - memory{std::exchange(rhs.memory, VK_NULL_HANDLE)}, - offset{std::exchange(rhs.offset, 0)}, - size{std::exchange(rhs.size, 0)}, - mapped_ptr{std::exchange(rhs.mapped_ptr, nullptr)} {} - - MemoryCommit &MemoryCommit::operator=(MemoryCommit &&rhs) noexcept { - if (this != &rhs) { - Release(); - allocator = std::exchange(rhs.allocator, nullptr); - allocation = std::exchange(rhs.allocation, nullptr); - memory = std::exchange(rhs.memory, VK_NULL_HANDLE); - offset = std::exchange(rhs.offset, 0); - size = std::exchange(rhs.size, 0); - mapped_ptr = std::exchange(rhs.mapped_ptr, nullptr); - } - return *this; - } - - std::span MemoryCommit::Map() - { - if (!allocation) return {}; - if (!mapped_ptr) { - if (vmaMapMemory(allocator, allocation, &mapped_ptr) != VK_SUCCESS) return {}; - } - const size_t n = static_cast(std::min(size, - (std::numeric_limits::max)())); - return std::span{static_cast(mapped_ptr), n}; - } - - std::span MemoryCommit::Map() const - { - if (!allocation) return {}; - if (!mapped_ptr) { - void *p = nullptr; - if (vmaMapMemory(allocator, allocation, &p) != VK_SUCCESS) return {}; - const_cast(this)->mapped_ptr = p; - } - const size_t n = static_cast(std::min(size, - (std::numeric_limits::max)())); - return std::span{static_cast(mapped_ptr), n}; - } - - void MemoryCommit::Unmap() - { - if (allocation && mapped_ptr) { + if (mapped_ptr) { vmaUnmapMemory(allocator, allocation); mapped_ptr = nullptr; } + vmaFreeMemory(allocator, allocation); } + allocation = nullptr; + allocator = nullptr; + memory = VK_NULL_HANDLE; + offset = 0; + size = 0; +} - void MemoryCommit::Release() { - if (allocation && allocator) { - // Log GPU memory deallocation - if (GPU::Logging::IsActive() && - Settings::values.gpu_log_memory_tracking.GetValue() && - memory != VK_NULL_HANDLE) { - GPU::Logging::GPULogger::GetInstance().LogMemoryDeallocation( - reinterpret_cast(memory) - ); - } +MemoryAllocator::MemoryAllocator(const Device &device_) + : device{device_}, allocator{device.GetAllocator()}, + properties{device_.GetPhysical().GetMemoryProperties().memoryProperties}, + buffer_image_granularity{ + device_.GetPhysical().GetProperties().limits.bufferImageGranularity} { - if (mapped_ptr) { - vmaUnmapMemory(allocator, allocation); - mapped_ptr = nullptr; - } - vmaFreeMemory(allocator, allocation); - } - allocation = nullptr; - allocator = nullptr; - memory = VK_NULL_HANDLE; - offset = 0; - size = 0; - } - - MemoryAllocator::MemoryAllocator(const Device &device_) - : device{device_}, allocator{device.GetAllocator()}, - properties{device_.GetPhysical().GetMemoryProperties().memoryProperties}, - buffer_image_granularity{ - device_.GetPhysical().GetProperties().limits.bufferImageGranularity} { - - // Preserve the previous "RenderDoc small heap" trimming behavior that we had in original vma minus the heap bug - if (device.HasDebuggingToolAttached()) - { - using namespace Common::Literals; - ForEachDeviceLocalHostVisibleHeap(device, [this](size_t heap_idx, VkMemoryHeap &heap) { - if (heap.size <= 256_MiB) { - for (u32 t = 0; t < properties.memoryTypeCount; ++t) { - if (properties.memoryTypes[t].heapIndex == heap_idx) { - valid_memory_types &= ~(1u << t); - } + // Preserve the previous "RenderDoc small heap" trimming behavior that we had in original vma minus the heap bug + if (device.HasDebuggingToolAttached()) + { + using namespace Common::Literals; + ForEachDeviceLocalHostVisibleHeap(device, [this](size_t heap_idx, VkMemoryHeap &heap) { + if (heap.size <= 256_MiB) { + for (u32 t = 0; t < properties.memoryTypeCount; ++t) { + if (properties.memoryTypes[t].heapIndex == heap_idx) { + valid_memory_types &= ~(1u << t); } } - }); - } + } + }); } +} - MemoryAllocator::~MemoryAllocator() = default; +MemoryAllocator::~MemoryAllocator() = default; - vk::Image MemoryAllocator::CreateImage(const VkImageCreateInfo &ci) const - { - const VmaAllocationCreateInfo alloc_ci = { - .flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT, - .usage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE, - .requiredFlags = 0, - .preferredFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - .memoryTypeBits = 0, - .pool = VK_NULL_HANDLE, - .pUserData = nullptr, - .priority = 0.f, - }; - - VkImage handle{}; - VmaAllocation allocation{}; - VmaAllocationInfo alloc_info{}; - vk::Check(vmaCreateImage(allocator, &ci, &alloc_ci, &handle, &allocation, &alloc_info)); - - // Log GPU memory allocation for images - if (GPU::Logging::IsActive() && - Settings::values.gpu_log_memory_tracking.GetValue()) { - GPU::Logging::GPULogger::GetInstance().LogMemoryAllocation( - reinterpret_cast(alloc_info.deviceMemory), - static_cast(alloc_info.size), - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT - ); - } - - return vk::Image(handle, ci.usage, *device.GetLogical(), allocator, allocation, - device.GetDispatchLoader()); - } - - vk::Buffer MemoryAllocator::CreateBuffer(const VkBufferCreateInfo &ci, MemoryUsage usage) const { - // MESA will do memcpy() if not marked as host cached, so just force mark it for most buffers - auto const anv_flags = (usage == MemoryUsage::Stream - && device.GetDriverID() == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA) - ? VK_MEMORY_PROPERTY_HOST_CACHED_BIT : 0; - const VmaAllocationCreateInfo alloc_ci = { - .flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT | MemoryUsageVmaFlags(usage), - .usage = MemoryUsageVma(usage), +vk::Image MemoryAllocator::CreateImage(const VkImageCreateInfo &ci) const +{ + const VmaAllocationCreateInfo alloc_ci = { + .flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT, + .usage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE, .requiredFlags = 0, - .preferredFlags = MemoryUsagePreferredVmaFlags(usage) | anv_flags, - .memoryTypeBits = usage == MemoryUsage::Stream ? 0u : valid_memory_types, + .preferredFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + .memoryTypeBits = 0, .pool = VK_NULL_HANDLE, .pUserData = nullptr, .priority = 0.f, - }; + }; - VkBuffer handle{}; - VmaAllocationInfo alloc_info{}; - VmaAllocation allocation{}; - VkMemoryPropertyFlags property_flags{}; + VkImage handle{}; + VmaAllocation allocation{}; + VmaAllocationInfo alloc_info{}; + vk::Check(vmaCreateImage(allocator, &ci, &alloc_ci, &handle, &allocation, &alloc_info)); - vk::Check(vmaCreateBuffer(allocator, &ci, &alloc_ci, &handle, &allocation, &alloc_info)); - vmaGetAllocationMemoryProperties(allocator, allocation, &property_flags); - - // Log GPU memory allocation for buffers - if (GPU::Logging::IsActive() && - Settings::values.gpu_log_memory_tracking.GetValue()) { - GPU::Logging::GPULogger::GetInstance().LogMemoryAllocation( - reinterpret_cast(alloc_info.deviceMemory), - static_cast(alloc_info.size), - property_flags - ); - } - - u8 *data = reinterpret_cast(alloc_info.pMappedData); - const std::span mapped_data = data ? std::span{data, ci.size} : std::span{}; - const bool is_coherent = (property_flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0; - - return vk::Buffer(handle, *device.GetLogical(), allocator, allocation, mapped_data, - is_coherent, - device.GetDispatchLoader()); + // Log GPU memory allocation for images + if (GPU::Logging::IsActive() && + Settings::values.gpu_log_memory_tracking.GetValue()) { + GPU::Logging::GPULogger::GetInstance().LogMemoryAllocation( + reinterpret_cast(alloc_info.deviceMemory), + static_cast(alloc_info.size), + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT + ); } - MemoryCommit MemoryAllocator::Commit(const VkMemoryRequirements &reqs, MemoryUsage usage) - { - const auto vma_usage = MemoryUsageVma(usage); - VmaAllocationCreateInfo ci{}; - ci.flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT | MemoryUsageVmaFlags(usage); - ci.usage = vma_usage; - ci.memoryTypeBits = reqs.memoryTypeBits & valid_memory_types; - ci.requiredFlags = 0; - ci.preferredFlags = MemoryUsagePreferredVmaFlags(usage); + return vk::Image(handle, ci.usage, *device.GetLogical(), allocator, allocation, + device.GetDispatchLoader()); +} - VmaAllocation a{}; - VmaAllocationInfo info{}; +vk::Buffer MemoryAllocator::CreateBuffer(const VkBufferCreateInfo &ci, MemoryUsage usage) const { + // MESA will do memcpy() if not marked as host cached, so just force mark it for most buffers + auto const anv_flags = (usage == MemoryUsage::Stream + && device.GetDriverID() == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA) + ? VK_MEMORY_PROPERTY_HOST_CACHED_BIT : 0; + const VmaAllocationCreateInfo alloc_ci = { + .flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT | MemoryUsageVmaFlags(usage), + .usage = MemoryUsageVma(usage), + .requiredFlags = 0, + .preferredFlags = MemoryUsagePreferredVmaFlags(usage) | anv_flags, + .memoryTypeBits = usage == MemoryUsage::Stream ? 0u : valid_memory_types, + .pool = VK_NULL_HANDLE, + .pUserData = nullptr, + .priority = 0.f, + }; - VkResult res = vmaAllocateMemory(allocator, &reqs, &ci, &a, &info); + VkBuffer handle{}; + VmaAllocationInfo alloc_info{}; + VmaAllocation allocation{}; + VkMemoryPropertyFlags property_flags{}; - if (res != VK_SUCCESS) { - // Relax 1: drop budget constraint - auto ci2 = ci; - ci2.flags &= ~VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT; - res = vmaAllocateMemory(allocator, &reqs, &ci2, &a, &info); + vk::Check(vmaCreateBuffer(allocator, &ci, &alloc_ci, &handle, &allocation, &alloc_info)); + vmaGetAllocationMemoryProperties(allocator, allocation, &property_flags); - // Relax 2: if we preferred DEVICE_LOCAL, drop that preference - if (res != VK_SUCCESS && (ci.preferredFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) { - auto ci3 = ci2; - ci3.preferredFlags &= ~VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; - res = vmaAllocateMemory(allocator, &reqs, &ci3, &a, &info); - } - } - - vk::Check(res); - return MemoryCommit(allocator, a, info); + // Log GPU memory allocation for buffers + if (GPU::Logging::IsActive() && + Settings::values.gpu_log_memory_tracking.GetValue()) { + GPU::Logging::GPULogger::GetInstance().LogMemoryAllocation( + reinterpret_cast(alloc_info.deviceMemory), + static_cast(alloc_info.size), + property_flags + ); } - MemoryCommit MemoryAllocator::Commit(const vk::Buffer &buffer, MemoryUsage usage) { - // Allocate memory appropriate for this buffer automatically - const auto vma_usage = MemoryUsageVma(usage); + u8 *data = reinterpret_cast(alloc_info.pMappedData); + const std::span mapped_data = data ? std::span{data, ci.size} : std::span{}; + const bool is_coherent = (property_flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0; - VmaAllocationCreateInfo ci{}; - ci.flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT | MemoryUsageVmaFlags(usage); - ci.usage = vma_usage; - ci.requiredFlags = 0; - ci.preferredFlags = MemoryUsagePreferredVmaFlags(usage); - ci.pool = VK_NULL_HANDLE; - ci.pUserData = nullptr; - ci.priority = 0.0f; + return vk::Buffer(handle, *device.GetLogical(), allocator, allocation, mapped_data, + is_coherent, + device.GetDispatchLoader()); +} - const VkBuffer raw = *buffer; +MemoryCommit MemoryAllocator::Commit(const VkMemoryRequirements &reqs, MemoryUsage usage) +{ + const auto vma_usage = MemoryUsageVma(usage); + VmaAllocationCreateInfo ci{}; + ci.flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT | MemoryUsageVmaFlags(usage); + ci.usage = vma_usage; + ci.memoryTypeBits = reqs.memoryTypeBits & valid_memory_types; + ci.requiredFlags = 0; + ci.preferredFlags = MemoryUsagePreferredVmaFlags(usage); - VmaAllocation a{}; - VmaAllocationInfo info{}; + VmaAllocation a{}; + VmaAllocationInfo info{}; - // Let VMA infer memory requirements from the buffer - VkResult res = vmaAllocateMemoryForBuffer(allocator, raw, &ci, &a, &info); + VkResult res = vmaAllocateMemory(allocator, &reqs, &ci, &a, &info); - if (res != VK_SUCCESS) { - auto ci2 = ci; - ci2.flags &= ~VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT; - res = vmaAllocateMemoryForBuffer(allocator, raw, &ci2, &a, &info); + if (res != VK_SUCCESS) { + // Relax 1: drop budget constraint + auto ci2 = ci; + ci2.flags &= ~VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT; + res = vmaAllocateMemory(allocator, &reqs, &ci2, &a, &info); - if (res != VK_SUCCESS && (ci.preferredFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) { - auto ci3 = ci2; - ci3.preferredFlags &= ~VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; - res = vmaAllocateMemoryForBuffer(allocator, raw, &ci3, &a, &info); - } + // Relax 2: if we preferred DEVICE_LOCAL, drop that preference + if (res != VK_SUCCESS && (ci.preferredFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) { + auto ci3 = ci2; + ci3.preferredFlags &= ~VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; + res = vmaAllocateMemory(allocator, &reqs, &ci3, &a, &info); } - - vk::Check(res); - vk::Check(vmaBindBufferMemory2(allocator, a, 0, raw, nullptr)); - return MemoryCommit(allocator, a, info); } + vk::Check(res); + return MemoryCommit(allocator, a, info); +} +MemoryCommit MemoryAllocator::Commit(const vk::Buffer &buffer, MemoryUsage usage) { + // Allocate memory appropriate for this buffer automatically + const auto vma_usage = MemoryUsageVma(usage); + + VmaAllocationCreateInfo ci{}; + ci.flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT | MemoryUsageVmaFlags(usage); + ci.usage = vma_usage; + ci.requiredFlags = 0; + ci.preferredFlags = MemoryUsagePreferredVmaFlags(usage); + ci.pool = VK_NULL_HANDLE; + ci.pUserData = nullptr; + ci.priority = 0.0f; + + const VkBuffer raw = *buffer; + + VmaAllocation a{}; + VmaAllocationInfo info{}; + + // Let VMA infer memory requirements from the buffer + VkResult res = vmaAllocateMemoryForBuffer(allocator, raw, &ci, &a, &info); + + if (res != VK_SUCCESS) { + auto ci2 = ci; + ci2.flags &= ~VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT; + res = vmaAllocateMemoryForBuffer(allocator, raw, &ci2, &a, &info); + + if (res != VK_SUCCESS && (ci.preferredFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) { + auto ci3 = ci2; + ci3.preferredFlags &= ~VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; + res = vmaAllocateMemoryForBuffer(allocator, raw, &ci3, &a, &info); + } + } + + vk::Check(res); + vk::Check(vmaBindBufferMemory2(allocator, a, 0, raw, nullptr)); + return MemoryCommit(allocator, a, info); +} } // namespace Vulkan diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 27b018d9d9..3f7feb83b2 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -4796,6 +4796,6 @@ void VolumeButton::ResetMultiplier() { #endif #if !defined(QT_STATICPLUGIN) || defined(__APPLE__) -#define VMA_IMPLEMENTATION +#define VMA_IMPLEMENTATION 1 #include "video_core/vulkan_common/vma.h" #endif diff --git a/tools/cpm/cmake/package/version.cmake b/tools/cpm/cmake/package/version.cmake index 6ce42a06cd..0f31c1d558 100755 --- a/tools/cpm/cmake/package/version.cmake +++ b/tools/cpm/cmake/package/version.cmake @@ -65,7 +65,7 @@ else() endif() # update cached cpmfile content -string(JSON cpmfile SET "${cpmfile}" "${key}" "${new_object}") +string(JSON cpmfile SET "${cpmfile}" "${KEY}" "${new_object}") # write cached cpmfile get_cpmfile_path(file) From 74ccea3defb9bb2db4674ecb378bd7c865f7fa73 Mon Sep 17 00:00:00 2001 From: xbzk Date: Mon, 7 Sep 2026 08:56:51 +0200 Subject: [PATCH 005/128] [debug,android] expose extend logging setting on android (#4340) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Team asked (gido/cam/liz). No idea what for. Not tested, but should be good. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4340 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey --- .../yuzu_emu/features/settings/model/BooleanSetting.kt | 1 + .../yuzu_emu/features/settings/model/view/SettingsItem.kt | 7 +++++++ .../features/settings/ui/SettingsFragmentPresenter.kt | 1 + src/android/app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 11 insertions(+) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index 39a76a8608..5eaaaaecac 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -83,6 +83,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { SHOW_SHADERS_BUILDING("show_shaders_building"), DEBUG_FLUSH_BY_LINE("flush_line"), + EXTENDED_LOGGING("extended_logging"), DONT_SHOW_DRIVER_SHADER_WARNING("dont_show_driver_shader_warning"), ENABLE_OVERLAY("enable_overlay"), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 119d8ddf9e..30d784267a 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -262,6 +262,13 @@ abstract class SettingsItem( descriptionId = R.string.flush_by_line_description ) ) + put( + SwitchSetting( + BooleanSetting.EXTENDED_LOGGING, + titleId = R.string.extended_logging, + descriptionId = R.string.extended_logging_description + ) + ) val dockedModeSetting = object : AbstractBooleanSetting { override val key = BooleanSetting.USE_DOCKED_MODE.key diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 2b5b966021..bdb10c3146 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -1323,6 +1323,7 @@ class SettingsFragmentPresenter( add(HeaderSetting(R.string.log)) add(BooleanSetting.DEBUG_FLUSH_BY_LINE.key) + add(BooleanSetting.EXTENDED_LOGGING.key) add(StringSetting.LOG_FILTER.key) } diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 55783f6e43..68e9570671 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -636,6 +636,8 @@ Logging Flush debug logs by line Flushes debugging logs on each line written, making debugging easier in cases of crashing or freezing. + Enable extended logging + Increases the maximum log file size from 100 MiB to 1 GiB. Log filter Controls Eden\'s log categories. Example: *:Info Service.LM:Debug From 753b57a8c242c1bba8d2be6e97aa10697abfdb15 Mon Sep 17 00:00:00 2001 From: Eden CI Date: Mon, 7 Sep 2026 21:44:20 +0200 Subject: [PATCH 006/128] [dist, android] Update translations from Transifex for Sep 07 (#4373) Automatic translation update for Sep 07 Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4373 --- dist/languages/ar.ts | 648 ++++++++------- dist/languages/ca.ts | 626 +++++++------- dist/languages/cs.ts | 626 +++++++------- dist/languages/da.ts | 626 +++++++------- dist/languages/de.ts | 740 ++++++++--------- dist/languages/el.ts | 626 +++++++------- dist/languages/es.ts | 638 +++++++-------- dist/languages/fi.ts | 626 +++++++------- dist/languages/fr.ts | 626 +++++++------- dist/languages/hu.ts | 626 +++++++------- dist/languages/id.ts | 626 +++++++------- dist/languages/it.ts | 626 +++++++------- dist/languages/ja_JP.ts | 626 +++++++------- dist/languages/ko_KR.ts | 662 ++++++++------- dist/languages/nb.ts | 626 +++++++------- dist/languages/nl.ts | 626 +++++++------- dist/languages/pl.ts | 626 +++++++------- dist/languages/pt_BR.ts | 626 +++++++------- dist/languages/pt_PT.ts | 626 +++++++------- dist/languages/ru_RU.ts | 626 +++++++------- dist/languages/sv.ts | 768 +++++++++--------- dist/languages/tr_TR.ts | 626 +++++++------- dist/languages/uk.ts | 626 +++++++------- dist/languages/vi.ts | 626 +++++++------- dist/languages/vi_VN.ts | 626 +++++++------- dist/languages/zh_CN.ts | 626 +++++++------- dist/languages/zh_TW.ts | 626 +++++++------- .../app/src/main/res/values-ar/strings.xml | 66 +- .../app/src/main/res/values-ckb/strings.xml | 2 - .../app/src/main/res/values-cs/strings.xml | 2 - .../app/src/main/res/values-de/strings.xml | 76 +- .../app/src/main/res/values-es/strings.xml | 29 +- .../app/src/main/res/values-fr/strings.xml | 3 - .../app/src/main/res/values-he/strings.xml | 2 - .../app/src/main/res/values-hu/strings.xml | 2 - .../app/src/main/res/values-id/strings.xml | 2 - .../app/src/main/res/values-it/strings.xml | 2 - .../app/src/main/res/values-ja/strings.xml | 2 - .../app/src/main/res/values-ko/strings.xml | 2 - .../app/src/main/res/values-nb/strings.xml | 2 - .../app/src/main/res/values-pl/strings.xml | 3 - .../src/main/res/values-pt-rBR/strings.xml | 3 - .../src/main/res/values-pt-rPT/strings.xml | 2 - .../app/src/main/res/values-ru/strings.xml | 72 +- .../app/src/main/res/values-sr/strings.xml | 2 - .../app/src/main/res/values-uk/strings.xml | 3 - .../app/src/main/res/values-vi/strings.xml | 2 - .../src/main/res/values-zh-rCN/strings.xml | 65 +- .../src/main/res/values-zh-rTW/strings.xml | 46 +- 49 files changed, 8842 insertions(+), 8776 deletions(-) diff --git a/dist/languages/ar.ts b/dist/languages/ar.ts index eebfe7ef85..0daf86c725 100644 --- a/dist/languages/ar.ts +++ b/dist/languages/ar.ts @@ -1554,7 +1554,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None لا شيء @@ -1619,563 +1618,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) اليابانية (日本語) - + American English الإنجليزية الأمريكية - + French (français) الفرنسية (français) - + German (Deutsch) الألمانية (Deutsch) - + Italian (italiano) الإيطالية (Italiano) - + Spanish (español) الإسبانية (español) - + Chinese الصينية - + Korean (한국어) الكورية (한국어) - + Dutch (Nederlands) الهولندية (Nederlands) - + Portuguese (português) البرتغالية (Português) - + Russian (Русский) الروسية (Русский) - + Taiwanese تايواني - + British English الإنكليزية البريطانية - + Canadian French الكندية الفرنسية - + Latin American Spanish أمريكا اللاتينية الإسبانية - + Simplified Chinese الصينية المبسطة - + Traditional Chinese (正體中文) الصينية التقليدية (正體中文) - + Brazilian Portuguese (português do Brasil) البرتغالية البرازيلية (português do Brasil) - + Polish (polska) البولندية (polska) - + Thai (แบบไทย) التايلاندية (แบบไทย) - - + + Japan اليابان - + USA الولايات المتحدة الأمريكية - + Europe أوروبا - + Australia أستراليا - + China الصين - + Korea كوريا - + Taiwan تايوان - + Auto (%1) Auto select time zone تلقائي (%1) - + Default (%1) Default time zone افتراضي (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Poland - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkey - + UCT UCT - + Universal عالمي - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono أحادي - + Stereo مجسم - + Surround محيطي - + 4GB DRAM (Default) 4GB DRAM (افتراضي) - + 6GB DRAM (Unsafe) 6GB DRAM (غير آمنة) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (غير آمنة) - + 12GB DRAM (Unsafe) 12GB DRAM (غير آمنة) - + Docked الإرساء - + Handheld محمول - - + + Normal طبيعي - - + + Boost تعزيز - - + + Overclock كسر السرعة - + Always ask (Default) اسأل دائمًا (افتراضي) - + Only if game specifies not to stop فقط إذا حددت اللعبة عدم التوقف - + Never ask لا تسأل أبدا - + Very Small (16 MB) صغير جدًا (16 ميغابايت) - + Small (32 MB) صغير (32 ميغابايت) - + Normal (128 MB) قياسي (128 ميغابايت) - + Large (256 MB) كبير (256 ميغابايت) - + Very Large (512 MB) كبير جدًا (512 ميغابايت) - + Very Low (4 MB) منخفض جدًا (4 ميغابايت) - + Low (8 MB) منخفض (8 ميغابايت) - + Normal (16 MB) قياسي (16 ميغابايت) - + Medium (32 MB) متوسط (32 ميغابايت) - + High (64 MB) عالي (64 ميغابايت) - + Very Low (32) منخفض جدًا (32) - + Low (64) منخفض (64) - + Normal (128) قياسي (128) - + Medium (256) متوسط (256) - + High (512) عالي (512) - + Disabled معطل - + ExtendedDynamicState 1 الحالة الديناميكية الممتدة 1 - + ExtendedDynamicState 2 الحالة الديناميكية الممتدة 2 - + ExtendedDynamicState 3 الحالة الديناميكية الممتدة 3 - + Tree View عرض قائمة - + Grid View عرض شبكة @@ -2308,7 +2297,7 @@ When a program attempts to open the controller applet, it is immediately closed. Toggle CPU Optimizations - تشغيل/إيقاف تحسينات وحدة المعالجة المركزية + تفعيل/تعطيل تحسينات وحدة المعالجة المركزية @@ -4184,7 +4173,7 @@ Would you like to delete the old save data? Toggle button - زر تشغيل/إيقاف + زر تفعيل/تعطيل @@ -4213,7 +4202,7 @@ Would you like to delete the old save data? Toggle axis - تشغيل/إيقاف المحور + تفعيل/تعطيل المحور @@ -6595,42 +6584,42 @@ Debug Message: Toggle Filter Bar - تشغيل/إيقاف شريط التصفية + تفعيل/تعطيل شريط التصفية Toggle Framerate Limit - تشغيل/إيقاف حد معدل الإطارات + تفعيل/تعطيل حد معدل الإطارات Toggle Turbo Speed - تشغيل/إيقاف سرعة تيربو + تفعيل/تعطيل سرعة تيربو Toggle Slow Speed - تشغيل/إيقاف السرعة البطيئة + تفعيل/تعطيل السرعة البطيئة Toggle Mouse Panning - تحريك الماوس + تفعيل/تعطيل تحريك الماوس Toggle Renderdoc Capture - Renderdoc تشغيل/إيقاف التقاط + Renderdoc تفعيل/تعطيل التقاط Toggle Status Bar - تشغيل/إيقاف شريط الحالة + تفعيل/تعطيل شريط الحالة Toggle Performance Overlay - تشغيل/إيقاف طبقة الأداء + تفعيل/تعطيل طبقة الأداء @@ -6932,7 +6921,7 @@ Debug Message: - + &Pause &إيقاف مؤقت @@ -7088,7 +7077,7 @@ Debug Message: - + &Start &بدء @@ -7099,7 +7088,7 @@ Debug Message: - + R&ecord ت&سجيل @@ -7190,7 +7179,7 @@ Debug Message: - + None لا شيء @@ -7211,397 +7200,400 @@ Debug Message: &عرض دائري - + Small (32x32) صغير (32x32) - + Standard (64x64) قياسي (64x64) - + Large (128x128) كبير (128x128) - + Full Size (256x256) حجم كامل (256x256) - + Broken Vulkan Installation Detected Vulkan تم الكشف عن تلف في تثبيت - + Vulkan initialization failed during boot. أثناء التشغيل Vulkan فشل تهيئة. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping تشغيل لعبة - + Loading Web Applet... جارٍ تحميل تطبيق الويب... - - + + Disable Web Applet تعطيل تطبيق الويب - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) قد يؤدي تعطيل أداة الويب إلى سلوك غير محدد، ويجب استخدامه فقط مع لعبة Super Mario 3D All-Stars. هل أنت متأكد من رغبتك في تعطيل أداة الويب؟ (يمكن إعادة تفعيلها في إعدادات التصحيح.) - + The amount of shaders currently being built كمية التظليلات التي يتم بناؤها حاليًا - + The current selected resolution scaling multiplier. مضاعف قياس الدقة المحددة حالياً. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Switch سرعة المحاكاة الحالية. تشير القيم الأعلى أو الأقل من 100٪ إلى أن المحاكاة تعمل بشكل أسرع أو أبطأ من. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. عدد الإطارات في الثانية التي تعرضها اللعبة حاليًا. يختلف هذا العدد من لعبة إلى أخرى ومن مشهد إلى آخر. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. الوقت المستغرق لمحاكاة إطار على جهاز سويتش، بدون احتساب تحديد الإطارات أو المزامنة العمودية. لمحاكاة بسرعة كاملة، يجب أن يكون هذا في حدود 16.67 مللي ثانية كحد أقصى. - + Unmute إلغاء كتم الصوت - + Mute كتم الصوت - + Reset Volume إعادة تعيين مستوى الصوت - + &Clear Recent Files &مسح الملفات الحديثة - + &Continue &متابعة - + Warning: Outdated Game Format تحذير: تنسيق اللعبة قديم - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. أنت تستخدم تنسيق مجلد ROM المُفكك لهذه اللعبة، وهو تنسيق قديم استُبدل بآخر مثل NCA وNAX وXCI وNSP. تفتقر مجلدات ROM المُفككة إلى الأيقونات والبيانات الوصفية ودعم التحديثات. <br>لتوضيح تنسيقات Switch المختلفة التي يدعمها Eden، يُرجى مراجعة دليل المستخدم. لن تظهر هذه الرسالة مرة أخرى. - - + + Error while loading ROM! ROM خطأ أثناء تحميل - + The ROM format is not supported. غير مدعوم ROM تنسيق. - + An error occurred initializing the video core. حدث خطأ أثناء تهيئة نواة الفيديو. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. واجه إيدن خطأً أثناء تشغيل نواة الفيديو. عادةً ما يكون السبب هو برامج تشغيل وحدة معالجة الرسومات القديمة، بما في ذلك المدمجة منها. يُرجى مراجعة السجل لمزيد من التفاصيل. لمزيد من المعلومات حول الوصول إلى السجل، يُرجى زيارة الصفحة التالية: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>كيفيه رفع سجلات الإخطاء</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. حدث خطأ أثناء تحميل ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Discord/Stoat يرجى إعادة تحميل ملفاتك أو طلب المساعدة على - + An unknown error occurred. Please see the log for more details. حدث خطأ غير معروف. يرجى الاطلاع على السجل لمزيد من التفاصيل. - + + (64-bit) (64-bit) - + + (32-bit) (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... جارٍ إغلاق البرنامج... - + Save Data بيانات الحفظ - + Mod Data بيانات التعديل - + Error Opening %1 Folder خطأ في فتح المجلد %1 - - + + Folder does not exist! المجلد غير موجود! - + Remove Installed Game Contents? إزالة محتويات اللعبة المثبتة؟ - + Remove Installed Game Update? إزالة تحديث اللعبة المثبت؟ - + Remove Installed Game DLC? إزالة المحتوى القابل للتنزيل المثبت للعبة؟ - + Remove Entry إزالة الإدخال - + Delete OpenGL Transferable Shader Cache? OpenGL Shader حذف ذاكرة التخزين المؤقتة القابلة للنقل لـ - + Delete Vulkan Transferable Shader Cache? Vulkan Shader حذف ذاكرة التخزين المؤقتة القابلة للنقل لـ - + Delete All Transferable Shader Caches? حذف جميع مخازن ذاكرة التظليل القابلة للنقل؟ - + Remove Custom Game Configuration? إزالة إعدادات اللعبة المخصص؟ - + Remove Cache Storage? إزالة ذاكرة التخزين المؤقتة؟ - + Remove File إزالة الملف - + Remove Play Time Data إزالة بيانات زمن اللعب - + Reset play time? إعادة تعيين زمن اللعب؟ - - + + RomFS Extraction Failed! RomFS فشل استخراج - + There was an error copying the RomFS files or the user cancelled the operation. أو قام المستخدم بإلغاء العملية RomFS حدث خطأ أثناء نسخ ملفات - + Full كامل - + Skeleton Skeleton - + Select RomFS Dump Mode RomFS حدد وضع تفريغ - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. الرجاء تحديد الطريقة التي تريد بها تفريغ RomFS. <br>سيتم نسخ جميع الملفات إلى المجلد الجديد في أثناء <br>قيام الهيكل العظمي بإنشاء بنية المجلد فقط. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root لا توجد مساحة فارغة كافية في %1 لاستخراج نظام الملفات RomFS. يُرجى تحرير مساحة أو اختيار مجلد تفريغ آخر من: المحاكاة > التكوين > النظام > نظام الملفات > تفريغ الجذر. - + Extracting RomFS... RomFS استخراج... - - + + Cancel إلغاء - + RomFS Extraction Succeeded! بنجاح RomFS تم استخراج! - + The operation completed successfully. تمت العملية بنجاح. - + Error Opening %1 خطأ في فتح %1 - + Select Directory حدد المجلد - + Properties خصائص - + The game properties could not be loaded. تعذر تحميل خصائص اللعبة. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. تشغيل الملف القابل للتنفيذ (%1)؛؛جميع الملفات (*.*) - + Load File تحميل الملف - + Open Extracted ROM Directory المستخرج ROM فتح ملف - + Invalid Directory Selected تم تحديد مجلد غير صالح - + The directory you have selected does not contain a 'main' file. لا يحتوي المجلد الذي حددته على ملف رئيسي - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files تثبيت الملفات - + %n file(s) remaining %n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية - + Installing file "%1"... تثبيت الملف ”%1“... - - + + Install Results نتائج التثبيت - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. لتجنب أي تعارضات محتملة، ننصح المستخدمين بعدم تثبيت الألعاب الأساسية على الذاكرة الداخلية. يرجى استخدام هذه الميزة فقط لتثبيت التحديثات والمحتوى القابل للتنزيل. - + %n file(s) were newly installed %n تم تثبيت ملف (ملفات) جديدة @@ -7613,7 +7605,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten %n تم استبدال ملف (ملفات) @@ -7625,7 +7617,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install %n فشل تثبيت ملف (ملفات) @@ -7637,314 +7629,314 @@ Please, only use this feature to install updates and DLC. - + System Application تطبيق النظام - + System Archive أرشيف النظام - + System Application Update تحديث تطبيق النظام - + Firmware Package (Type A) حزمة الفيرموير (النوع أ) - + Firmware Package (Type B) حزمة الفيرموير (النوع ب) - + Game لعبة - + Game Update تحديث اللعبة - + Game DLC الخاص باللعبة DLC الـ - + Delta Title Delta عنوان - + Select NCA Install Type... NCA حدد نوع تثبيت... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) يرجى تحديد نوع اللعبة التي ترغب في تثبيت NCA عليها: (في معظم الحالات، يكون الإعداد الافتراضي "لعبة" مناسبًا.) - + Failed to Install فشل التثبيت - + The title type you selected for the NCA is invalid. غير صالح NCA نوع العنوان الذي حددته لـ. - + File not found لم يتم العثور على الملف - + File "%1" not found لم يتم العثور على الملف "%1" - + OK موافق - + Function Disabled الوظيفة معطلة - + Compatibility list reporting is currently disabled. Check back later! تقارير قائمة التوافق معطلة حاليًا. يرجى التحقق لاحقًا! - + Error opening URL خطأ في فتح الرابط - + Unable to open the URL "%1". تعذر فتح الرابط ”%1“ - + TAS Recording TAS تسجيل - + Overwrite file of player 1? الكتابة فوق ملف اللاعب 1؟ - + Invalid config detected تم اكتشاف إعدادات غير صالح - + Handheld controller can't be used on docked mode. Pro controller will be selected. لا يمكن استخدام وحدة التحكم المحمولة في وضع الإرساء. سيتم اختيار وحدة تحكم احترافية. - - + + Amiibo أميبو - - + + The current amiibo has been removed تمت إزالة أميبو الحالي. - + Error خطأ - - + + The current game is not looking for amiibos اللعبة الحالية لا تبحث عن أميبو - + Amiibo File (%1);; All Files (*.*) جميع الملفات (%1)؛؛ ملف أميبو (*.*) - + Load Amiibo تحميل أميبو - + Error loading Amiibo data خطأ أثناء تحميل بيانات أميبو - + The selected file is not a valid amiibo الملف المحدد ليس أميبو صالح - + The selected file is already on use الملف المحدد قيد الاستخدام بالفعل - + An unknown error occurred حدث خطأ غير معروف - + No firmware available لا يوجد فيرموير متوفر - + Firmware Corrupted الفيرموير تالف - + Unknown applet تطبيق غير معروف - + Applet doesn't map to a known value. لا يرتبط التطبيق المصغر بقيمة معروفة. - + Record not found لم يتم العثور على السجل - + Applet not found. Please reinstall firmware. لم يتم العثور على التطبيق المصغر. يرجى إعادة تثبيت الفيرموير. - + Capture Screenshot التقاط لقطة شاشة - + PNG Image (*.png) PNG Image (*.png) - + TAS state: Running %1/%2 حالة TAS: تشغيل %1/%2 - + TAS state: Recording %1 حالة TAS: تسجيل %1 - + TAS state: Idle %1/%2 حالة TAS: خامل %1/%2 - + TAS State: Invalid حالة TAS: غير صالحة - + &Stop Running &إيقاف التشغيل - + Stop R&ecording إيقاف ال&تسجيل - + Building: %n shader(s) بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات) - + Scale: %1x %1 is the resolution scaling factor الدقة: %1x - + Speed: %1% / %2% السرعة: %1% / %2% - + Speed: %1% السرعة: %1% - + Game: %1 FPS اللعبة: %1 FPS - + Frame: %1 ms الإطار: %1 ms - + NO AA NO AA - + VOLUME: MUTE الصوت: كتم الصوت - + VOLUME: %1% Volume percentage (e.g. 50%) %1% :الصوت - + Derivation Components Missing مكونات الاشتقاق مفقودة - + Decryption keys are missing. Install them now? مفاتيح فك التشفير مفقودة. هل تريد تثبيتها الآن؟ - + Wayland Detected! Wayland تم الكشف عن - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7955,74 +7947,74 @@ Would you like to force it for future launches? هل ترغب في فرض استخدامه في عمليات التشغيل المستقبلية؟ - + Use X11 X11 استخدم - + Continue with Wayland Wayland متابعة مع - + Don't show again لا تعرض مرة أخرى - + Restart Required إعادة التشغيل مطلوبة - + Restart Eden to apply the X11 backend. X11 أعد تشغيل إيدن لتطبيق الخلفية - + Slow بطيء - + Turbo تيربو - + Unlocked إلغاء القفل - + Select RomFS Dump Target RomFS حدد هدف تفريغ - + Please select which RomFS you would like to dump. الذي تريد تفريغه RomFS الرجاء تحديد - + Are you sure you want to close Eden? هل أنت متأكد من أنك تريد إغلاق إيدن؟ - - - + + + Eden إيدن - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. هل أنت متأكد من أنك تريد إيقاف المحاكاة؟ سيتم فقدان أي تقدم لم يتم حفظه. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9822,37 +9814,37 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name اسم التعديل - + What should this mod be called? ما الاسم المناسب لهذا التعديل؟ - + RomFS RomFS - + ExeFS/Patch ExeFS/التصحيح - + Cheat الغش - + Mod Type نوع التعديل - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. @@ -9861,18 +9853,18 @@ Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed فشل استخراج التعديل - + Failed to create temporary directory %1 %1 فشل إنشاء مجلد المؤقت - + Zip file %1 is empty الملف المضغوط 1% فارغ @@ -10574,66 +10566,66 @@ By selecting "From Eden", previous save data stored in Ryujinx will be %1 متاح للتنزيل - + New Version Location موقع الإصدار الجديد - + All Files (*.*) جميع الملفات (*.*) - - - + + + Failed to save file فشل حفظ الملف - + Could not open file %1 for writing. تعذر فتح الملف 1% للكتابة - + Downloading... جارٍ التنزيل... - + Cancel إلغاء - + Could not write to file %1. تعذر الكتابة إلى الملف %1 - + Could not commit to file %1. تعذر حفظ التغييرات في الملف %1 - + Failed to download file فشل تنزيل الملف - + Could not download from %1%2 Error code: %3 تعذر التنزيل من %1%2 رمز الخطأ: %3 - + Download Complete اكتمل التنزيل - + Successfully downloaded %1. Would you like to open it? تم تنزيل 1% بنجاح. هل تريد فتحه؟ diff --git a/dist/languages/ca.ts b/dist/languages/ca.ts index df3c9ec8b1..dd295efbb2 100644 --- a/dist/languages/ca.ts +++ b/dist/languages/ca.ts @@ -1489,7 +1489,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Cap @@ -1554,563 +1553,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) Japonès (日本語) - + American English Anglès americà - + French (français) Francès (français) - + German (Deutsch) Alemany (Deutsch) - + Italian (italiano) Italià (italiano) - + Spanish (español) Castellà (español) - + Chinese Xinès - + Korean (한국어) Coreà (한국어) - + Dutch (Nederlands) Holandès (Nederlands) - + Portuguese (português) Portuguès (português) - + Russian (Русский) Rus (Русский) - + Taiwanese Taiwanès - + British English Anglès britànic - + Canadian French Francès canadenc - + Latin American Spanish Espanyol llatinoamericà - + Simplified Chinese Xinès simplificat - + Traditional Chinese (正體中文) Xinès tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portuguès brasiler (português do Brasil) - + Polish (polska) Polonès (polska) - + Thai (แบบไทย) Tailandès (แบบไทย) - - + + Japan Japó - + USA EUA - + Europe Europa - + Australia Austràlia - + China Xina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Per defecte (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islàndia - + Iran Iran - + Israel Isreal - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polònia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estèreo - + Surround Envoltant - + 4GB DRAM (Default) 4GB DRAM (Insegur) - + 6GB DRAM (Unsafe) 6GB DRAM (Insegur) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Insegur) - + 12GB DRAM (Unsafe) 12GB DRAM (Insegur) - + Docked Sobretaula - + Handheld Portàtil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop Tan sols si el joc especifica no parar - + Never ask No preguntar mai - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6857,7 +6846,7 @@ Debug Message: - + &Pause &Pausar @@ -7013,7 +7002,7 @@ Debug Message: - + &Start &Iniciar @@ -7024,7 +7013,7 @@ Debug Message: - + R&ecord E&nregistrar @@ -7115,7 +7104,7 @@ Debug Message: - + None Cap @@ -7136,719 +7125,722 @@ Debug Message: - + Small (32x32) Petit (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Desilenciar - + Mute Silenciar - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) (64-bit) - + + (32-bit) (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full Complet - + Skeleton Esquelet - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel Cancel·lar - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties Propietats - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File Carregar arxiu - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Instal·lar arxius - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game Joc - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK D'acord - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Escala: %1x - + Speed: %1% / %2% Velocitat: %1% / %2% - + Speed: %1% Velocitat: %1% - + Game: %1 FPS Joc: %1 FPS - + Frame: %1 ms Fotograma: %1 ms - + NO AA SENSE AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUMEN: %1% - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7856,74 +7848,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow Lent - + Turbo Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9700,55 +9692,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10442,65 +10434,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/cs.ts b/dist/languages/cs.ts index 389e435109..4c459d5d52 100644 --- a/dist/languages/cs.ts +++ b/dist/languages/cs.ts @@ -1489,7 +1489,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Žádné @@ -1554,563 +1553,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - - - - - 64x - - - - + Japanese (日本語) Japonština (日本語) - + American English - + French (français) Francouzština (français) - + German (Deutsch) Nemčina (Deutsch) - + Italian (italiano) Italština (Italiano) - + Spanish (español) Španělština (español) - + Chinese Čínština - + Korean (한국어) Korejština (한국어) - + Dutch (Nederlands) Holandština (Nederlands) - + Portuguese (português) Portugalština (português) - + Russian (Русский) Ruština (Русский) - + Taiwanese Tajwanština - + British English Britská Angličtina - + Canadian French Kanadská Francouzština - + Latin American Spanish Latinsko Americká Španělština - + Simplified Chinese Zjednodušená Čínština - + Traditional Chinese (正體中文) Tradiční Čínština (正體中文) - + Brazilian Portuguese (português do Brasil) Brazilská Portugalština (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonsko - + USA USA - + Europe Evropa - + Australia Austrálie - + China Čína - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Lybie - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polsko - + Portugal Portugalsko - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turecko - + UCT UCT - + Universal Univerzální - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Zadokovaná - + Handheld Příruční - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Vždy se zeptat (Výchozí) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6847,7 +6836,7 @@ Debug Message: - + &Pause &Pauza @@ -7003,7 +6992,7 @@ Debug Message: - + &Start &Start @@ -7014,7 +7003,7 @@ Debug Message: - + R&ecord @@ -7105,7 +7094,7 @@ Debug Message: - + None @@ -7126,719 +7115,722 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7846,74 +7838,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9688,55 +9680,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10430,65 +10422,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/da.ts b/dist/languages/da.ts index 320098a52b..a651706061 100644 --- a/dist/languages/da.ts +++ b/dist/languages/da.ts @@ -1491,7 +1491,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Ingen @@ -1556,563 +1555,553 @@ When a program attempts to open the controller applet, it is immediately closed. - - 32x - - - - - 64x - - - - + Japanese (日本語) Japansk (日本語) - + American English - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Hollandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwanesisk - + British English Britisk Engelsk - + Canadian French Candadisk Fransk - + Latin American Spanish Latinamerikansk Spansk - + Simplified Chinese Forenklet Kinesisk - + Traditional Chinese (正體中文) Traditionelt Kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliansk Portugisisk (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ægypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Tyrkiet - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokket - + Handheld Håndholdt - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6855,7 +6844,7 @@ Debug Message: - + &Pause @@ -7011,7 +7000,7 @@ Debug Message: - + &Start @@ -7022,7 +7011,7 @@ Debug Message: - + R&ecord @@ -7113,7 +7102,7 @@ Debug Message: - + None @@ -7134,719 +7123,722 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7854,74 +7846,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9692,55 +9684,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10424,65 +10416,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/de.ts b/dist/languages/de.ts index f906397742..db3d3020b4 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -429,13 +429,13 @@ Kann dazu beitragen, Ruckler bei niedrigeren Bildraten zu reduzieren. CPU Clocks - + CPU-Takte Raises the clock the emulated CPU reports, which removes some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. - + Erhöht den Takt der emulierten CPU Berichte, was manche FPS-Begrenzer entfernt. Schwächere CPUs haben eventuell schlechtere Leistung, und bestimmte Spiele verhalten vielleicht sich nicht richtig. @@ -627,7 +627,7 @@ Steuert außerdem das Seitenverhältnis der aufgenommenen Bildschirmfotos. Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - Ermöglicht das Speichern von Schattierern, um sie beim nächsten Spielstart schneller laden zu können. + Ermöglicht das Speichern von Shadern, um sie beim nächsten Spielstart schneller laden zu können. Die Deaktivierung ist ausschließlich für Fehlerbehebungszwecke vorgesehen. @@ -670,7 +670,7 @@ CPU Asynchronously: Use the CPU to decode ASTC textures on demand. EliminatesAST stuttering but may present artifacts. Diese Option legt fest, wie ASTC-Texturen dekodiert werden sollen. CPU: Die Dekodierung erfolgt über die CPU. -GPU: Die Dekodierung von ASTC-Texturen erfolgt über die Berechnungs-Schattierer der GPU (empfohlen). +GPU: Die Dekodierung von ASTC-Texturen erfolgt über die Compute-Shader der GPU (empfohlen). CPU asynchron: Die Dekodierung von ASTC-Texturen erfolgt bei Bedarf über die CPU. Dies verhindert Ruckeln bei der ASTC-Dekodierung, kann jedoch zu Artefakten führen. @@ -792,7 +792,9 @@ Bei den meisten Grafikkarten kann dieser Wert bedenkenlos auf 16x eingestellt we Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + Steuert den GPU-Emulationsmodus. +Die meisten Spiele werden im Modus Schnell in Ordnung gerendert, für einige ist jedoch weiterhin der Modus Akkurat erforderlich. +Partikel werden in der Regel nur im Modus Akkurat korrekt gerendert. @@ -804,12 +806,14 @@ Particles tend to only render correctly with Accurate mode. Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + Steuert den DMA-Lesemodus. +Unsicher ist schneller, während Sicher stabiler ist und in manchen Spielen Probleme lösen kann. +Standard folgt der GPU-Genauigkeit Einstellung. GPU Fence Behavior: - + GPU-Zaunobjekt-Verhalten: @@ -819,7 +823,12 @@ Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. Strict is the slowest option, but can fix issues that require stricter synchronization. Default follows the GPU Accuracy setting. - + Steuert das GPU-Zaunobjekt-Synchronisations-Verhalten. +Direkt ist die schnellste Option, kann aber zu Problemen führen. +Ausbalanciert bietet bessere Kompatibilität und kann in manchen Spielen Probleme beheben. +Genau bietet noch bessere Kompatibilität auf Kosten von etwas Leisung. +Strikt ist die langsamste Option, kann aber Probleme beheben, die striktere Synchronisation erfordern. +Standard folgt der GPU-Genauigkeit Einstellung. @@ -830,7 +839,8 @@ Default follows the GPU Accuracy setting. Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Bewahrt von der GPU modifizierte Pufferdaten, indem diese vor dem Hochladen zurückgelesen werden. +Einige Spiele benötigen dies, um bestimmte Effekte korrekt darzustellen. @@ -840,17 +850,17 @@ Some games require this to render certain effects properly. May reduce shader stutter. - Kann Schattierer-Ruckler reduzieren. + Kann Shader-Ruckler reduzieren. GPU Clocks - + GPU-Takte Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + Führt dazu, dass das Spiel glaubt, die Arbeit der GPU würde früher fertig sein, als sie eigentlich ist. Dadurch hört das Spiel auf die Auflösung und Render-Distanz zu verringern um sich den Takten der Switch anzupassen. @@ -911,8 +921,8 @@ Eine Erhöhung dieses Werts kann den Durchsatz auf High-End-GPUs verbessern, bei Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - Aktiviert den herstellerspezifischen Rohrleitungs-Cache der GPU. -Diese Option kann die Ladezeit von Schattierern erheblich verkürzen, wenn der Vulkan-Treiber die Rohrleitungs-Cache-Dateien nicht intern speichert. + Aktiviert den herstellerspezifischen Pipeline-Cache der GPU. +Diese Option kann die Ladezeit von Shadern erheblich verkürzen, wenn der Vulkan-Treiber die Pipeline-Cache-Dateien nicht intern speichert. @@ -1023,7 +1033,7 @@ Höhere Stufen ermöglichen mehr Funktionen und können die Leistung steigern, k Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - Ermöglicht es dem Fragment-Schattierer, pro Abtastwert in einem mehrfach abgetasteten Fragment ausgeführt zu werden, anstatt nur einmal pro Fragment. Verbessert die Grafikqualität auf Kosten der Leistung. + Ermöglicht es dem Fragment-Shader, pro Abtastwert in einem mehrfach abgetasteten Fragment ausgeführt zu werden, anstatt nur einmal pro Fragment. Verbessert die Grafikqualität auf Kosten der Leistung. Höhere Werte verbessern die Qualität, beeinträchtigen jedoch die Leistung. @@ -1302,7 +1312,7 @@ Wenn ein Programm versucht, das Controller-Applet zu öffnen, wird es sofort ges OpenGL GLASM (Assembly Shaders, NVIDIA Only) - OpenGL GLASM (Assembler-Schattierer, nur NVIDIA) + OpenGL GLASM (Assembler-Shader, nur NVIDIA) @@ -1346,7 +1356,7 @@ Wenn ein Programm versucht, das Controller-Applet zu öffnen, wird es sofort ges Immediate - + Direkt @@ -1356,7 +1366,7 @@ Wenn ein Programm versucht, das Controller-Applet zu öffnen, wird es sofort ges Strict - + Strikt @@ -1550,7 +1560,6 @@ Wenn ein Programm versucht, das Controller-Applet zu öffnen, wird es sofort ges - None Keiner @@ -1615,563 +1624,553 @@ Wenn ein Programm versucht, das Controller-Applet zu öffnen, wird es sofort ges 16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) Japanisch (日本語) - + American English Amerikanisches Englisch - + French (français) Französisch (français) - + German (Deutsch) Deutsch (German) - + Italian (italiano) Italienisch (italiano) - + Spanish (español) Spanisch (español) - + Chinese Chinesisch - + Korean (한국어) Koreanisch (한국어) - + Dutch (Nederlands) Niederländisch (Nederlands) - + Portuguese (português) Portugiesisch (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanesisch - + British English Britisches Englisch - + Canadian French Kanadisches Französisch - + Latin American Spanish Lateinamerikanisches Spanisch - + Simplified Chinese Vereinfachtes Chinesisch - + Traditional Chinese (正體中文) Traditionelles Chinesisch (正體中文) - + Brazilian Portuguese (português do Brasil) Brasilianisches Portugiesisch (português do Brasil) - + Polish (polska) Polnisch (Polen) - + Thai (แบบไทย) Thailändisch (Thailändische Version) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatisch (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Ägypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkei - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Vorgabe) - + 6GB DRAM (Unsafe) 6GB DRAM (Unsicher) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Unsicher) - + 12GB DRAM (Unsafe) 12GB DRAM (Unsicher) - + Docked Angedockt - + Handheld Handgerät - - + + Normal - + Normal - - + + Boost - + Beschleunigung - - + + Overclock - + Übertaktung - + Always ask (Default) Immer fragen (Vorgabe) - + Only if game specifies not to stop Nur wenn ein Spiel vorgibt, nicht zu stoppen - + Never ask Niemals fragen - + Very Small (16 MB) Sehr klein (16 MB) - + Small (32 MB) Klein (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Groß (256 MB) - + Very Large (512 MB) Sehr groß (512 MB) - + Very Low (4 MB) Sehr niedrig (4 MB) - + Low (8 MB) Niedrig (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Mittel (32 MB) - + High (64 MB) Hoch (64 MB) - + Very Low (32) Sehr niedrig (32) - + Low (64) Niedrig (64) - + Normal (128) Normal (128) - + Medium (256) Mittel (256) - + High (512) Hoch (512) - + Disabled Deaktiviert - + ExtendedDynamicState 1 ErweiterterDynamischerZustand 1 - + ExtendedDynamicState 2 ErweiterterDynamischerZustand 2 - + ExtendedDynamicState 3 ErweiterterDynamischerZustand 3 - + Tree View Baumansicht - + Grid View Rasteransicht @@ -2603,7 +2602,7 @@ Wenn ein Programm versucht, das Controller-Applet zu öffnen, wird es sofort ges When checked, it executes shaders without loop logic changes - Wenn aktiviert, führt es Schattierer ohne Änderungen an der Schleifenlogik aus + Wenn aktiviert, führt es Shader ohne Änderungen an der Schleifenlogik aus @@ -2633,12 +2632,12 @@ Wenn ein Programm versucht, das Controller-Applet zu öffnen, wird es sofort ges When checked, it will dump original Maxwell guest shader bytecode (the input to the recompiler) as .ash files under DumpDir/shaders/. Useful for inspection with nvdisasm. - Wenn aktiviert, wird der ursprüngliche Maxwell-Gast-Schattierer-Bytecode (die Eingabe für den Rekompilierer) als .ash-Dateien unter DumpDir/shaders/ ausgelesen. Dies ist nützlich für die Analyse mit nvdisasm. + Wenn aktiviert, wird der ursprüngliche Maxwell-Guest-Shader-Bytecode (die Eingabe für den Rekompilierer) als .ash-Dateien unter DumpDir/shaders/ ausgelesen. Dies ist nützlich für die Analyse mit nvdisasm. Dump Guest (Maxwell) Shaders - Gast-Schattierer (Maxwell) auslesen + Guest-Shader (Maxwell) auslesen @@ -2683,7 +2682,7 @@ Wenn ein Programm versucht, das Controller-Applet zu öffnen, wird es sofort ges Enable Shader Feedback - Schattierer-Rückmeldung aktivieren + Shader-Rückmeldung aktivieren @@ -2703,7 +2702,7 @@ Wenn ein Programm versucht, das Controller-Applet zu öffnen, wird es sofort ges Dump SPIR-V Shaders - SPIR-V-Schattierer auslesen + SPIR-V-Shader auslesen @@ -3833,12 +3832,12 @@ Möchtest du die alten Speicherdaten löschen? Aimed to disable SDL GUIDE button hack: synthetic GUIDE(HOME) event when SELECT(MINUS) + START(PLUS) pressed. May impact Win related trigger/rumble/etc stuff - + Zielt darauf ab, den SDL-GUIDE-Button-Hack zu deaktivieren: synthetisches GUIDE(HOME) Event wenn SELECT(MINUS) + START(PLUS) gedrückt wird. Beeinflusst eventuell Win bezogene trigger/rumble/etc Sachen. Disable SDL WGI/XInput (Requires restart) - + Deaktiviere SDL WGI/XInput (erfordert Neustart) @@ -5754,7 +5753,7 @@ Ziehe die Punkte, um ihre Position zu ändern, oder doppelklicke auf Tabellenzel Shaders - Schattierer + Shader @@ -6678,12 +6677,12 @@ Fehlerbehebungs-Meldung: Loading Shaders 387 / 1628 - Schattierer werden geladen 387 / 1628 + Shader werden geladen 387 / 1628 Loading Shaders %v out of %m - Schattierer werden geladen: %v von %m + Shader werden geladen: %v von %m @@ -6698,7 +6697,7 @@ Fehlerbehebungs-Meldung: Loading Shaders %1 / %2 - Schattierer werden geladen %1 / %2 + Shader werden geladen %1 / %2 @@ -6939,7 +6938,7 @@ Fehlerbehebungs-Meldung: - + &Pause &Pause @@ -7095,7 +7094,7 @@ Fehlerbehebungs-Meldung: - + &Start &Start @@ -7106,7 +7105,7 @@ Fehlerbehebungs-Meldung: - + R&ecord Aufnahme @@ -7197,7 +7196,7 @@ Fehlerbehebungs-Meldung: - + None Keine @@ -7218,397 +7217,400 @@ Fehlerbehebungs-Meldung: &Karussellansicht - + Small (32x32) Klein (32x32) - + Standard (64x64) Standard (64x64) - + Large (128x128) Groß (128x128) - + Full Size (256x256) Volle Größe (256x256) - + Broken Vulkan Installation Detected Defekte Vulkan-Installation erkannt - + Vulkan initialization failed during boot. Initialisierung von Vulkan ist beim Systemstart fehlgeschlagen. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Spiel wird ausgeführt - + Loading Web Applet... Web-Applet wird geladen... - - + + Disable Web Applet Web-Applet deaktivieren - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Das Deaktivieren des Web-Applets kann zu unvorhersehbarem Verhalten führen und sollte nur bei „Super Mario 3D All-Stars“ verwendet werden. Möchtest du das Web-Applet wirklich deaktivieren? (Dies kann in den Fehlerbehebungs-Einstellungen wieder aktiviert werden.) - + The amount of shaders currently being built - Die Anzahl der Schattierer, die derzeit erstellt werden + Die Anzahl der Shader, die derzeit erstellt werden - + The current selected resolution scaling multiplier. Der aktuell ausgewählte Skalierungsfaktor für die Auflösung. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Aktuelle Emulationsgeschwindigkeit. Werte über oder unter 100 % bedeuten, dass die Emulation schneller oder langsamer läuft als auf einer Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Wie viele Bilder pro Sekunde das Spiel derzeit anzeigt. Dies variiert von Spiel zu Spiel und von Szene zu Szene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Die Zeit, die für die Emulation eines Switch-Frames benötigt wird, ohne Berücksichtigung von Framelimiting oder V-Sync. Bei einer Emulation mit voller Geschwindigkeit sollte dieser Wert höchstens 16,67 ms betragen. - + Unmute Stummschaltung aufheben - + Mute Stummschalten - + Reset Volume Lautstärke zurücksetzen - + &Clear Recent Files &Zuletzt verwendete Dateien löschen - + &Continue &Fortfahren - + Warning: Outdated Game Format Warnung: Veraltetes Spielformat - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Du verwendest für dieses Spiel das dekontruierte ROM-Verzeichnisformat - ein veraltetes Format, das durch andere Formate wie NCA, NAX, XCI oder NSP abgelöst wurde. Dekonstruierten ROM-Verzeichnissen fehlen Symbole, Metadaten und die Unterstützung für Aktualisierungen. <br>Eine Erläuterung der verschiedenen Switch-Formate, die Eden unterstützt, findest du in unserem Benutzerhandbuch. Diese Meldung wird nicht erneut angezeigt. - - + + Error while loading ROM! Fehler beim Laden des ROMs! - + The ROM format is not supported. Das ROM-Format wird nicht unterstützt. - + An error occurred initializing the video core. Beim Initialisieren des Videokerns ist ein Fehler aufgetreten. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. Bei der Ausführung des Videokerns ist bei Eden ein Fehler aufgetreten. Dies wird in der Regel durch veraltete GPU-Treiber verursacht, einschließlich integrierter Treiber. Weitere Details findest du im Protokoll. Informationen zum Abrufen des Protokolls findest du auf der folgenden Seite: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>So lädst du die Protokolldatei hoch</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Fehler beim Laden des ROMs! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Bitte erstelle deine Dateien erneut oder bitte auf Discord/Stoat um Hilfe. - + An unknown error occurred. Please see the log for more details. Es ist ein unbekannter Fehler aufgetreten. Weitere Informationen findest du im Protokoll. - + + (64-bit) (64-bit) - + + (32-bit) (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Software wird geschlossen... - + Save Data Speicherdaten - + Mod Data Mod-Daten - + Error Opening %1 Folder Fehler beim Öffnen des Ordners %1 - - + + Folder does not exist! Der Ordner existiert nicht! - + Remove Installed Game Contents? Installierte Spielinhalte entfernen? - + Remove Installed Game Update? Installierte Spielaktualisierung entfernen? - + Remove Installed Game DLC? Installiertes Spiel-DLC entfernen? - + Remove Entry Eintrag entfernen - + Delete OpenGL Transferable Shader Cache? - Den übertragbaren Schattierer-Cache von OpenGL löschen? + Den übertragbaren Shader-Cache von OpenGL löschen? - + Delete Vulkan Transferable Shader Cache? - Den übertragbaren Schattierer-Cache von Vulkan löschen? + Den übertragbaren Shader-Cache von Vulkan löschen? - + Delete All Transferable Shader Caches? - Alle übertragbaren Schattierer-Caches löschen? + Alle übertragbaren Shader-Caches löschen? - + Remove Custom Game Configuration? Benutzerdefinierte Spielkonfiguration entfernen? - + Remove Cache Storage? Cache-Speicher löschen? - + Remove File Datei entfernen - + Remove Play Time Data Wiedergabezeitdaten löschen - + Reset play time? Spielzeit zurücksetzen? - - + + RomFS Extraction Failed! RomFS-Extraktion fehlgeschlagen! - + There was an error copying the RomFS files or the user cancelled the operation. Beim Kopieren der RomFS-Dateien ist ein Fehler aufgetreten oder der Benutzer hat den Vorgang abgebrochen. - + Full Vollständig - + Skeleton Skelett - + Select RomFS Dump Mode RomFS-Auslesemodus auswählen - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Bitte wähle aus, wie das RomFS kopiert werden soll. <br>Vollständig kopiert alle Dateien in das neue Verzeichnis, während <br>Skelett lediglich die Verzeichnisstruktur erstellt. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Unter %1 ist nicht genügend Speicherplatz vorhanden, um das RomFS zu extrahieren. Bitte schaffe Speicherplatz oder wähle unter „Emulation > Konfigurieren > System > Dateisystem > Dump-Stammverzeichnis“ ein anderes Dump-Verzeichnis aus. - + Extracting RomFS... RomFS wird extrahiert... - - + + Cancel Abbrechen - + RomFS Extraction Succeeded! RomFS wurde erfolgreich extrahiert! - + The operation completed successfully. Der Vorgang wurde erfolgreich abgeschlossen. - + Error Opening %1 Fehler beim Öffnen von %1 - + Select Directory Verzeichnis auswählen - + Properties Eigenschaften - + The game properties could not be loaded. Die Spieleigenschaften konnten nicht geladen werden. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch-Ausführungsdatei (%1);;Alle Dateien (*.*) - + Load File Datei laden - + Open Extracted ROM Directory Verzeichnis mit dem extrahierten ROM öffnen - + Invalid Directory Selected Ungültiges Verzeichnis ausgewählt - + The directory you have selected does not contain a 'main' file. Das von dir ausgewählte Verzeichnis enthält keine „main“-Datei. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installierbare Switch-Dateien (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX-Kassetten-Image (*.xci) - + Install Files Dateien installieren - + %n file(s) remaining %n Datei(en) verbleiben%n Datei(en) verbleiben - + Installing file "%1"... Datei „%1“ wird installiert... - - + + Install Results Installationsergebnisse - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Um mögliche Konflikte zu vermeiden, raten wir davon ab, Basisspiele auf dem NAND-Speicher zu installieren. Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen und DLCs. - + %n file(s) were newly installed %n Datei(en) wurden neu installiert @@ -7616,7 +7618,7 @@ Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen - + %n file(s) were overwritten %n Datei(en) wurden überschrieben @@ -7624,7 +7626,7 @@ Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen - + %n file(s) failed to install %n Datei(en) konnten nicht installiert werden @@ -7632,314 +7634,314 @@ Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen - + System Application Systemanwendung - + System Archive Systemarchiv - + System Application Update System-Anwendungsaktualisierung - + Firmware Package (Type A) Firmware-Paket (Typ A) - + Firmware Package (Type B) Firmware-Paket (Typ B) - + Game Spiel - + Game Update Spielaktualisierung - + Game DLC Spiel-DLC - + Delta Title Delta-Titel - + Select NCA Install Type... NCA-Installationstyp auswählen... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Bitte wähle den Titeltyp aus, unter dem du diese NCA installieren möchtest: (In den meisten Fällen ist die Vorgabe „Spiel“ ausreichend.) - + Failed to Install Installation fehlgeschlagen - + The title type you selected for the NCA is invalid. Der von dir für die NCA ausgewählte Titel ist ungültig. - + File not found Datei nicht gefunden - + File "%1" not found Datei „%1“ nicht gefunden - + OK OK - + Function Disabled Funktion deaktiviert - + Compatibility list reporting is currently disabled. Check back later! Die Anzeige der Kompatibilitätsliste ist derzeit deaktiviert. Schaue später noch einmal vorbei! - + Error opening URL Fehler beim Öffnen der URL - + Unable to open the URL "%1". Die URL „%1“ kann nicht geöffnet werden. - + TAS Recording TAS-Aufnahme - + Overwrite file of player 1? Datei von Spieler 1 überschreiben? - + Invalid config detected Ungültige Konfiguration erkannt - + Handheld controller can't be used on docked mode. Pro controller will be selected. Der Handgerät-Controller kann im angedockten Modus nicht verwendet werden. Es wird der Pro-Controller ausgewählt. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Das aktuelle amiibo wurde entfernt - + Error Fehler - - + + The current game is not looking for amiibos Das aktuelle Spiel sucht nicht nach Amiibos - + Amiibo File (%1);; All Files (*.*) Amiibo-Datei (%1);; Alle Dateien (*.*) - + Load Amiibo Amiibo laden - + Error loading Amiibo data Fehler beim Laden der Amiibo-Daten - + The selected file is not a valid amiibo Die ausgewählte Datei ist kein gültiges amiibo - + The selected file is already on use Die ausgewählte Datei wird bereits verwendet - + An unknown error occurred Ein unbekannter Fehler ist aufgetreten - + No firmware available Keine Firmware verfügbar - + Firmware Corrupted Firmware beschädigt - + Unknown applet Unbekanntes Applet - + Applet doesn't map to a known value. „Applet“ lässt sich keinem bekannten Wert zuordnen. - + Record not found Aufnahme nicht gefunden - + Applet not found. Please reinstall firmware. Applet nicht gefunden. Bitte installiere die Firmware neu. - + Capture Screenshot Bildschirmfoto aufnehmen - + PNG Image (*.png) PNG-Bild (*.png) - + TAS state: Running %1/%2 TAS-Status: %1/%2 läuft - + TAS state: Recording %1 TAS-Status: %1 wird aufgenommen - + TAS state: Idle %1/%2 TAS-Status: Leerlauf %1/%2 - + TAS State: Invalid TAS-Status: Ungültig - + &Stop Running &Ausführung beenden - + Stop R&ecording Aufnahme beenden - + Building: %n shader(s) - Erstellung: %n SchattiererErstellung: %n Schattierer + Erstellung: %n SchattiererErstelle: %n Shader - + Scale: %1x %1 is the resolution scaling factor Maßstab: 1:1 - + Speed: %1% / %2% Geschwindigkeit: %1% / %2% - + Speed: %1% Geschwindigkeit: %1% - + Game: %1 FPS Spiel: %1 FPS - + Frame: %1 ms Frame: %1 ms - + NO AA Kein AA - + VOLUME: MUTE LAUTSTÄRKE: STUMM - + VOLUME: %1% Volume percentage (e.g. 50%) LAUTSTÄRKE: %1% - + Derivation Components Missing Ableitungskomponenten fehlen - + Decryption keys are missing. Install them now? Entschlüsselungsschlüssel fehlen. Möchtest du diese jetzt installieren? - + Wayland Detected! Wayland erkannt! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7950,74 +7952,74 @@ Es wird empfohlen, stattdessen X11 zu verwenden. Möchtest du dies für zukünftige Starts erzwingen? - + Use X11 X11 verwenden - + Continue with Wayland Mit Wayland fortfahren - + Don't show again Nicht mehr anzeigen - + Restart Required Neustart erforderlich - + Restart Eden to apply the X11 backend. Starte Eden neu, um das X11-Backend zu aktivieren. - + Slow Langsam - + Turbo Turbo - + Unlocked Entsperrt - + Select RomFS Dump Target RomFS-Ausleseziel auswählen - + Please select which RomFS you would like to dump. Bitte wähle aus, welches RomFS du auslesen möchtest. - + Are you sure you want to close Eden? Möchtest du Eden wirklich schließen? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Möchtest du die Emulation wirklich beenden? Alle nicht gespeicherten Fortschritte gehen dabei verloren. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -8118,7 +8120,7 @@ Möchtest du diese Anweisung ignorieren und das Programm trotzdem beenden? Handheld - Handgerät + Handheld @@ -8614,7 +8616,7 @@ p, li { white-space: pre-wrap; } Clear Shader Cache - Schattierer-Cache leeren + Shader-Cache leeren @@ -9191,7 +9193,7 @@ p, li { white-space: pre-wrap; } The following amiibo data will be formatted: - Die folgenden amiibo-Daten werden formatiert: + Die folgenden Amiibo-Daten werden formatiert: @@ -9206,7 +9208,7 @@ p, li { white-space: pre-wrap; } Do you wish to restore this amiibo? - Möchtest du diese amiibo wiederherstellen? + Möchtest du diese Amiibo wiederherstellen? @@ -9659,23 +9661,23 @@ Möchtest du manuell einen portablen Ordner auswählen? Error Removing Transferable Shader Cache - Fehler beim Entfernen des übertragbaren Schattierer-Caches + Fehler beim Entfernen des übertragbaren Shader-Caches A shader cache for this title does not exist. - Für diesen Titel gibt es keinen Schattierer-Cache. + Für diesen Titel gibt es keinen Shader-Cache. Successfully removed the transferable shader cache. - Der übertragbare Schattierer-Cache wurde erfolgreich entfernt. + Der übertragbare Shader-Cache wurde erfolgreich entfernt. Failed to remove the transferable shader cache. - Der übertragbare Schattierer-Cache konnte nicht entfernt werden. + Der übertragbare Shader-Cache konnte nicht entfernt werden. @@ -9691,17 +9693,17 @@ Möchtest du manuell einen portablen Ordner auswählen? Error Removing Transferable Shader Caches - Fehler beim Entfernen übertragbarer Schattierer-Caches + Fehler beim Entfernen übertragbarer Shader-Caches Successfully removed the transferable shader caches. - Die übertragbaren Schattierer-Caches wurden erfolgreich entfernt. + Die übertragbaren Shader-Caches wurden erfolgreich entfernt. Failed to remove the transferable shader cache directory. - Das Verzeichnis des übertragbaren Schattierer-Caches konnte nicht entfernt werden. + Das Verzeichnis des übertragbaren Shader-Caches konnte nicht entfernt werden. @@ -9818,37 +9820,37 @@ Möchtest du manuell einen portablen Ordner auswählen? QtCommon::Mod - + Mod Name Mod-Name - + What should this mod be called? Wie soll diese Mod heißen? - + RomFS RomFS - + ExeFS/Patch ExeFS/Patch - + Cheat Cheat - + Mod Type Mod Typ - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. @@ -9857,18 +9859,18 @@ Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed Mod-Extraktion fehlgeschlagen - + Failed to create temporary directory %1 Fehler beim Erstellen des temporären Verzeichnisses %1 - + Zip file %1 is empty ZIP-Datei %1 ist leer @@ -9878,12 +9880,12 @@ Die meisten Mods sind RomFS-Mods, während Patches (.pchtxt) in der Regel ExeFS- Error Opening Shader Cache - Fehler beim Öffnen des Schattierer-Caches + Fehler beim Öffnen des Shader-Caches Failed to create or open shader cache for this title, ensure your app data directory has write permissions. - Der Schattierer-Cache für diesen Titel konnte nicht erstellt oder geöffnet werden. Stelle sicher, dass dein App-Datenverzeichnis über Schreibrechte verfügt. + Der Shader-Cache für diesen Titel konnte nicht erstellt oder geöffnet werden. Stelle sicher, dass dein App-Datenverzeichnis über Schreibrechte verfügt. @@ -9991,7 +9993,7 @@ Dies kann eine Weile dauern. Clearing shader cache is recommended for all users. Do not uncheck unless you know what you're doing. - Das Leeren des Schattierer-Caches wird allen Nutzern empfohlen. + Das Leeren des Shader-Caches wird allen Nutzern empfohlen. Deaktiviere diese Option nur, wenn du genau weißt, was du tust. @@ -10152,7 +10154,7 @@ Dies wird empfohlen, wenn du Daten zwischen Emulatoren austauschen möchtest. Handheld - Handgerät + Handheld @@ -10570,66 +10572,66 @@ Wenn du „Von Eden“ auswählst, werden die zuvor in Ryujinx gespeicherten Dat %1 steht zum Herunterladen bereit. - + New Version Location Speicherort der neuen Version - + All Files (*.*) Alle Dateien (*.*) - - - + + + Failed to save file Speichern der Datei fehlgeschlagen - + Could not open file %1 for writing. Datei %1 konnte nicht zum Schreiben geöffnet werden. - + Downloading... Wird heruntergeladen... - + Cancel Abbrechen - + Could not write to file %1. Es konnte nicht in die Datei %1 geschrieben werden. - + Could not commit to file %1. Änderungen konnten nicht für Datei %1 übernommen werden. - + Failed to download file Herunterladen der Datei fehlgeschlagen - + Could not download from %1%2 Error code: %3 Das Herunterladen von %1%2 konnte nicht durchgeführt werden Fehler-Code: %3 - + Download Complete Download abgeschlossen - + Successfully downloaded %1. Would you like to open it? %1 wurde erfolgreich heruntergeladen. Möchtest du die Datei öffnen? diff --git a/dist/languages/el.ts b/dist/languages/el.ts index 78bcc9c2e2..b679ea8abd 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -1491,7 +1491,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Κανένα @@ -1556,563 +1555,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - - - - - 64x - - - - + Japanese (日本語) Ιαπωνικά (日本語) - + American English - + French (français) Γαλλικά (Français) - + German (Deutsch) Γερμανικά (Deutsch) - + Italian (italiano) Ιταλικά (Italiano) - + Spanish (español) Ισπανικά (Español) - + Chinese Κινέζικα - + Korean (한국어) Κορεάτικα (한국어) - + Dutch (Nederlands) Ολλανδικά (Nederlands) - + Portuguese (português) Πορτογαλικά (Português) - + Russian (Русский) Ρώσικα (Русский) - + Taiwanese Ταϊβανέζικα - + British English Βρετανικά Αγγλικά - + Canadian French Καναδικά Γαλλικά - + Latin American Spanish Λατινοαμερικάνικα Ισπανικά - + Simplified Chinese Απλοποιημένα Κινέζικα - + Traditional Chinese (正體中文) Παραδοσιακά Κινέζικα (正體中文) - + Brazilian Portuguese (português do Brasil) Πορτογαλικά Βραζιλίας (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Ιαπωνία - + USA ΗΠΑ - + Europe Ευρώπη - + Australia Αυστραλία - + China Κίνα - + Korea Κορέα - + Taiwan Ταϊβάν - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Κούβα - + EET EET - + Egypt Αίγυπτος - + Eire - + EST EST - + EST5EDT EST5EDT - + GB - + GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Γκρήνουιτς - + Hongkong Χονγκ Κονγκ - + HST HST - + Iceland Ισλανδία - + Iran Ιράν - + Israel Ισραήλ - + Jamaica Ιαμαϊκή - + Kwajalein - + Libya Λιβύη - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Ναβάχο - + NZ - + NZ-CHAT - + Poland Πολωνία - + Portugal Πορτογαλία - + PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Σιγκαπούρη - + Turkey Τουρκία - + UCT UCT - + Universal Παγκόσμια - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu - + Mono Μονοφωνικό - + Stereo Στέρεοφωνικό - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6846,7 +6835,7 @@ Debug Message: - + &Pause &Παύση @@ -7002,7 +6991,7 @@ Debug Message: - + &Start &Έναρξη @@ -7013,7 +7002,7 @@ Debug Message: - + R&ecord @@ -7104,7 +7093,7 @@ Debug Message: - + None @@ -7125,719 +7114,722 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7845,74 +7837,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9684,55 +9676,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10420,65 +10412,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/es.ts b/dist/languages/es.ts index 5ef3fb998e..46eb96b33b 100644 --- a/dist/languages/es.ts +++ b/dist/languages/es.ts @@ -407,8 +407,8 @@ Desactivarlo hará que el juego se renderice lo más rápido posible según tu o Synchronizes CPU core speed with the game's maximum rendering speed to boost FPS without affecting game speed (animations, physics, etc.). Can help reduce stuttering at lower framerates. - Sincroniza la velocidad del núcleo de la CPU con la velocidad máxima de renderizado del juego para aumentar los fotogramas por segundo sin afectar la velocidad del juego (animaciones, físicas, etc.). -Puede ayudar a reducir los tirones o parpadeos en tasas de fotogramas bajas. + Sincroniza la velocidad del núcleo de la CPU con la velocidad máxima de renderizado del juego para potenciar los fotogramas por segundo sin afectar a la velocidad del juego (animaciones, físicas, etc.). +Puede ayudar a reducir los tirones o parpadeos en las tasas de fotogramas bajas. @@ -429,7 +429,7 @@ Puede ayudar a reducir los tirones o parpadeos en tasas de fotogramas bajas. CPU Clocks - + Relojes de CPU @@ -825,7 +825,7 @@ Default follows the GPU Accuracy setting. Enable GPU buffer readback - Activar la lectura del buffer de la GPU + Activar la lectura del búfer de la GPU @@ -846,7 +846,7 @@ Some games require this to render certain effects properly. GPU Clocks - + Relojes de GPU @@ -1548,7 +1548,6 @@ Cuando un programa intenta abrir el applet del controlador, se cierra inmediatam - None Ninguno @@ -1613,563 +1612,553 @@ Cuando un programa intenta abrir el applet del controlador, se cierra inmediatam x16 - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) Japonés (日本語) - + American English Inglés estadounidense - + French (français) Francés (français) - + German (Deutsch) Alemán (deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Español - + Chinese Chino - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandés (nederlands) - + Portuguese (português) Portugués (português) - + Russian (Русский) Ruso (Русский) - + Taiwanese Taiwanés - + British English Inglés británico - + Canadian French Francés canadiense - + Latin American Spanish Español latinoamericano - + Simplified Chinese Chino simplificado - + Traditional Chinese (正體中文) Chino tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugués brasileño (português do Brasil) - + Polish (polska) Polaco (polska) - + Thai (แบบไทย) Tailandés (แบบไทย) - - + + Japan Japón - + USA EEUU - + Europe Europa - + Australia Australia - + China China - + Korea Corea - + Taiwan Taiwán - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Predeterminada (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Irán - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquía - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulú - + Mono Mono - + Stereo Estéreo - + Surround Envolvente - + 4GB DRAM (Default) 4GB DRAM (Por defecto) - + 6GB DRAM (Unsafe) 6GB DRAM (Inseguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Sobremesa - + Handheld Portátil - - + + Normal Normal - - + + Boost - + Impulso - - + + Overclock Overclock - + Always ask (Default) Preguntar siempre (Por defecto) - + Only if game specifies not to stop Solo si el juego pide no ser cerrado - + Never ask Nunca preguntar - + Very Small (16 MB) Muy pequeño (16 MB) - + Small (32 MB) Pequeño (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muy grande (512 MB) - + Very Low (4 MB) Muy bajo (4 MB) - + Low (8 MB) Bajo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muy bajo (32) - + Low (64) Bajo (64) - + Normal (128) Normal (128) - + Medium (256) Medio (256) - + High (512) Alto (512) - + Disabled Desactivado - + ExtendedDynamicState 1 ModoDynamicoExtendido 1 - + ExtendedDynamicState 2 ModoDynamicoExtendido 2 - + ExtendedDynamicState 3 ModoDynamicoExtendido 3 - + Tree View Vista en árbol - + Grid View Vista en cuadrícula @@ -6937,7 +6926,7 @@ Mensaje de depuración: - + &Pause &Pausar @@ -7093,7 +7082,7 @@ Mensaje de depuración: - + &Start &Iniciar @@ -7104,7 +7093,7 @@ Mensaje de depuración: - + R&ecord G&rabar @@ -7195,7 +7184,7 @@ Mensaje de depuración: - + None Nada @@ -7216,397 +7205,400 @@ Mensaje de depuración: Vista de &carrusel - + Small (32x32) Pequeño (32x32) - + Standard (64x64) Estandar (64x64) - + Large (128x128) Grande (128x128) - + Full Size (256x256) Tamaño completo (256x256) - + Broken Vulkan Installation Detected Detectada instalación fallida de Vulkan - + Vulkan initialization failed during boot. La inicialización de Vulkan falló durante el arranque. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Ejecutando un juego - + Loading Web Applet... Cargando applet web... - - + + Disable Web Applet Desactivar applet web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Desactivar el applet web puede causar comportamientos inesperados y debería solo ser usado con Super Mario 3D All-Stars. ¿Está seguro de que quiere desactivar el applet web? (Puede ser activado en las ajustes de depuración.) - + The amount of shaders currently being built La cantidad de sombreadores que se están contruyendo actualmente - + The current selected resolution scaling multiplier. El multiplicador de escalado de resolución seleccionado actualmente. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocidad de emulación actual. Los valores superiores o inferiores al 100% indican que la emulación se ejecuta más rápida o más lenta que en una Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. La cantidad de fotogramas por segundo que muestra el juego actualmente. Esto varía según el juego y la escena. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tiempo empleado en emular un fotograma de la Switch, sin contar la limitación de fotogramas ni la sincronización vertical. Para una emulación a máxima velocidad, debería ser de 16,67 ms como máximo. - + Unmute Desilenciar - + Mute Silenciar - + Reset Volume Restablecer volumen - + &Clear Recent Files &Limpiar archivos recientes - + &Continue &Continuar - + Warning: Outdated Game Format Advertencia: formato del juego obsoleto - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Estás usando el formato de directorio ROM deconstruido para este juego, el cual es un formato obsoleto que ha sido reemplazado por otros como NCA, NAX, XCI o NSP. Los directorios ROM deconstruidos carecen de iconos, metadatos y compatibilidad con actualizaciones.<br>Para obtener una explicación de los distintos formatos de la Switch compatibles con Eden, consulte nuestro manual de usuario. Este mensaje no volverá a aparecer de nuevo. - - + + Error while loading ROM! ¡Error al cargar la ROM! - + The ROM format is not supported. El formato de la ROM no está soportado. - + An error occurred initializing the video core. Se produjo un error al inicializar el núcleo de video. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. Eden ha detectado un error al ejecutar el núcleo de vídeo. Esto suele deberse por usar controladores de la GPU obsoletos, incluidos los integrados. Consulte el registro para obtener más información. Para más información sobre cómo acceder al archivo de registro, por favor consulte la siguiente página: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>Cómo subir el archivo de registro</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. ¡Error al cargar la ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Por favor vuelva a volcar sus archivos, o pida ayuda en Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Ha ocurrido un error desconocido. Por favor mire el registro para más detalles. - + + (64-bit) (64-bit) - + + (32-bit) (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Cerrando el programa... - + Save Data Datos de guardado - + Mod Data Datos del mod - + Error Opening %1 Folder Error abriendo la carpeta %1 - - + + Folder does not exist! ¡La carpeta no existe! - + Remove Installed Game Contents? ¿Eliminar el contenido instalado del juego? - + Remove Installed Game Update? ¿Eliminar la actualización instalada del juego? - + Remove Installed Game DLC? ¿Eliminar el contenido descargable instalado del juego? - + Remove Entry Eliminar entrada - + Delete OpenGL Transferable Shader Cache? ¿Desea eliminar el caché transferible de sombreadores de OpenGL? - + Delete Vulkan Transferable Shader Cache? ¿Desea eliminar el caché transferible de sombreadores de Vulkan? - + Delete All Transferable Shader Caches? ¿Desea eliminar todo el caché transferible de sombreadores? - + Remove Custom Game Configuration? ¿Borrar configuración personalizada del juego? - + Remove Cache Storage? ¿Borrar el almacenamiento de caché? - + Remove File Eliminar archivo - + Remove Play Time Data Eliminar datos del tiempo de juego - + Reset play time? ¿Reiniciar el tiempo de juego? - - + + RomFS Extraction Failed! ¡Fallo al extraer el RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Ocurrió un error al copiar los archivos de la RomFS o el usuario canceló la operación. - + Full Completo - + Skeleton Esqueleto - + Select RomFS Dump Mode Seleccione el método de volcado del RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Por favor selecciona como quieres que sea volcada la RomFS.<br>Completa copiará todos los archivos en el nuevo directorio mientras que <br>esqueleto solo creará la estructura de los directorios. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root No hay suficiente espacio libre en %1 para extraer la RomFS. Por favor libera espacio o selecciona un directorio de volcado diferente en Emulación > Configurar > Sistema > Sistema de archivos > Volcado raiz - + Extracting RomFS... Extrayendo el RomFS... - - + + Cancel Cancelar - + RomFS Extraction Succeeded! ¡La extracción del RomFS ha sido un éxito! - + The operation completed successfully. La operación se completó con éxito. - + Error Opening %1 Error al abrir %1 - + Select Directory Seleccionar directorio - + Properties Propiedades - + The game properties could not be loaded. No se pudieron cargar las propiedades del juego. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Ejecutable de Switch (%1);;Todos los archivos (*.*) - + Load File Cargar archivo - + Open Extracted ROM Directory Abrir directorio de la ROM extraída - + Invalid Directory Selected Seleccionado directorio inválido - + The directory you have selected does not contain a 'main' file. El directorio seleccionado no contiene un archivo 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Archivo de Switch instalable (*.nca *.nsp *.xci);;Archivo de contenido de Nintendo (*.nca);;Paquete de envío de Nintendo (*.nsp);;Imagen de cartucho NX (*.xci) - + Install Files Instalar archivos - + %n file(s) remaining %n archivo(s) restantes%n archivo(s) restantes%n archivo(s) restantes - + Installing file "%1"... Instalando el archivo "%1"... - - + + Install Results Resultados de la instalación - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Para evitar posibles conflictos, desaconsejamos instalar juegos base en la NAND. Por favor, use solo esta función para instalar actualizaciones y contenido descargable. - + %n file(s) were newly installed %n archivo(s) se instalaron recientemente @@ -7615,7 +7607,7 @@ Por favor, use solo esta función para instalar actualizaciones y contenido desc - + %n file(s) were overwritten %n archivo(s) fueron sobreescritos @@ -7624,7 +7616,7 @@ Por favor, use solo esta función para instalar actualizaciones y contenido desc - + %n file(s) failed to install fallo al instalar %n archivo(s) @@ -7633,314 +7625,314 @@ Por favor, use solo esta función para instalar actualizaciones y contenido desc - + System Application Aplicación del sistema - + System Archive Archivo del sistema - + System Application Update Actualización de la aplicación del sistema - + Firmware Package (Type A) Paquete de firmware (Tipo A) - + Firmware Package (Type B) Paquete de firmware (Tipo B) - + Game Juego - + Game Update Actualización del juego - + Game DLC Contenido descargable del juego - + Delta Title Título Delta - + Select NCA Install Type... Seleccione el tipo de instalación NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Seleccione el tipo de título en el que desea instalar este NCA: (En la mayoría de los casos, la opción predeterminada "Juego" es suficiente). - + Failed to Install Fallo al instalar - + The title type you selected for the NCA is invalid. El tipo de título que ha seleccionado para el NCA es inválido. - + File not found Archivo no encontrado - + File "%1" not found Archivo "%1" no encontrado - + OK Aceptar - + Function Disabled Función desactivada - + Compatibility list reporting is currently disabled. Check back later! Los informes de la lista de compatibilidad están deshabilitados. ¡Vuelva más tarde! - + Error opening URL Error abriendo URL - + Unable to open the URL "%1". No se pudo abrir URL "%1". - + TAS Recording Grabación TAS - + Overwrite file of player 1? ¿Sobrescribir el archivo del jugador 1? - + Invalid config detected Detectada configuración inválida - + Handheld controller can't be used on docked mode. Pro controller will be selected. El mando del modo portátil no puede usarse en el modo sobremesa. El mando pro será seleccionado en su lugar. - - + + Amiibo Amiibo - - + + The current amiibo has been removed El amiibo actual fue borrado - + Error Error - - + + The current game is not looking for amiibos El juego actual no está buscando amiibos - + Amiibo File (%1);; All Files (*.*) Archivo Amiibo (%1);; Todos los archivos (*.*) - + Load Amiibo Cargar Amiibo - + Error loading Amiibo data Error al cargar los datos del Amiibo - + The selected file is not a valid amiibo El archivo seleccionado no es un amiibo válido - + The selected file is already on use El archivo seleccionado se encuentra en uso - + An unknown error occurred Ha ocurrido un error desconocido - + No firmware available No hay firmware disponible - + Firmware Corrupted Firmware corrompido - + Unknown applet Applet desconocido - + Applet doesn't map to a known value. Applet no asigna a un valor conocido. - + Record not found Grabación no encontrada - + Applet not found. Please reinstall firmware. Apple no encontrado. Por favor vuelva a instalar el firmware. - + Capture Screenshot Captura de pantalla - + PNG Image (*.png) Imagen PNG (*.png) - + TAS state: Running %1/%2 Estado de TAS: Ejecutando %1/%2 - + TAS state: Recording %1 Estado de TAS: Grabando %1 - + TAS state: Idle %1/%2 Estado de TAS: Inactivo %1/%2 - + TAS State: Invalid Estado de TAS: Inválido - + &Stop Running &Parar de ejecutarse - + Stop R&ecording &Parar grabación - + Building: %n shader(s) Construyendo: %n sombreador(es)Construyendo: %n sombreador(es)Construyendo: %n sombreador(es) - + Scale: %1x %1 is the resolution scaling factor Escala: %1x - + Speed: %1% / %2% Velocidad: %1% / %2% - + Speed: %1% Velocidad: %1% - + Game: %1 FPS Juego: %1 FPS - + Frame: %1 ms Fotograma: %1 ms - + NO AA NO AA - + VOLUME: MUTE VOLUMEN: SILENCIADO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUMEN: %1% - + Derivation Components Missing Componentes de derivación ausentes - + Decryption keys are missing. Install them now? Las claves de desencriptado están ausentes. ¿Desea instalarlas ahora? - + Wayland Detected! ¡Wayland detectado! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7951,74 +7943,74 @@ Se recomienda usar X11 en su lugar. ¿Le gustaría forzar a usarlo en futuras ejecuciones? - + Use X11 Usar X11 - + Continue with Wayland Continuar con Wayland - + Don't show again No mostrar de nuevo - + Restart Required Reinicio requerido - + Restart Eden to apply the X11 backend. Reinicie Eden para aplicar el motor X11. - + Slow Lento - + Turbo Turbo - + Unlocked Desbloqueado - + Select RomFS Dump Target Seleccione el destinatario para el volcado del RomFS - + Please select which RomFS you would like to dump. Por favor seleccione que RomFS desea volcar. - + Are you sure you want to close Eden? ¿Está seguro de que quiere cerrar Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. ¿Está seguro de que desea parar la emulación? Cualquier progreso sin guardar se perderá. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9822,37 +9814,37 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name Nombre del mod - + What should this mod be called? ¿Cómo debería llamarse este mod? - + RomFS RomFS - + ExeFS/Patch ExeFS/Parche - + Cheat Truco - + Mod Type Tipo de mod - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. @@ -9861,18 +9853,18 @@ Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed Fallo al extraer el mod - + Failed to create temporary directory %1 Fallo al crear directorio temporal %1 - + Zip file %1 is empty El archivo zip %1 está vacío @@ -10578,66 +10570,66 @@ Seleccionando "Desde Eden", los datos de guardado anteriores alojados %1 está disponible para descargar. - + New Version Location Ubicación de la nueva versión - + All Files (*.*) Todos los archivos (*.*) - - - + + + Failed to save file Fallo al guardar el archivo - + Could not open file %1 for writing. No se pudo abrir el archivo %1 para su escritura. - + Downloading... Descargando... - + Cancel Cancelar - + Could not write to file %1. No se pudo escribir en el archivo %1. - + Could not commit to file %1. No se pudo cometer en el archivo %1. - + Failed to download file Fallo al descargar el archivo - + Could not download from %1%2 Error code: %3 No se pudo descargar desde %1%2 Código de error: %3 - + Download Complete Descarga completada - + Successfully downloaded %1. Would you like to open it? %1 descargado con éxito. ¿Desea abrirlo? diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index ebf77cebed..bd2695f4f1 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -1491,7 +1491,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None @@ -1556,563 +1555,553 @@ When a program attempts to open the controller applet, it is immediately closed. - - 32x - - - - - 64x - - - - + Japanese (日本語) - + American English - + French (français) - + German (Deutsch) - + Italian (italiano) - + Spanish (español) - + Chinese - + Korean (한국어) - + Dutch (Nederlands) - + Portuguese (português) - + Russian (Русский) - + Taiwanese - + British English - + Canadian French - + Latin American Spanish - + Simplified Chinese - + Traditional Chinese (正體中文) - + Brazilian Portuguese (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan - + USA - + Europe - + Australia - + China - + Korea - + Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET - + CST6CDT - + Cuba - + EET - + Egypt - + Eire - + EST - + EST5EDT - + GB - + GB-Eire - + GMT - + GMT+0 - + GMT-0 - + GMT0 - + Greenwich - + Hongkong - + HST - + Iceland - + Iran - + Israel - + Jamaica - + Kwajalein - + Libya - + MET - + MST - + MST7MDT - + Navajo - + NZ - + NZ-CHAT - + Poland - + Portugal - + PRC - + PST8PDT - + ROC - + ROK - + Singapore - + Turkey - + UCT - + Universal - + UTC - + W-SU - + WET - + Zulu - + Mono - + Stereo - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked - + Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6824,7 +6813,7 @@ Debug Message: - + &Pause &Pysäytä @@ -6980,7 +6969,7 @@ Debug Message: - + &Start &Käynnistä @@ -6991,7 +6980,7 @@ Debug Message: - + R&ecord @@ -7082,7 +7071,7 @@ Debug Message: - + None @@ -7103,719 +7092,722 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7823,74 +7815,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9661,55 +9653,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10393,65 +10385,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index 9c6a7a55d2..8526b3973d 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -1541,7 +1541,6 @@ Lorsqu’un programme tente d’ouvrir ce menu, il est immédiatement fermé. - None Aucun @@ -1606,563 +1605,553 @@ Lorsqu’un programme tente d’ouvrir ce menu, il est immédiatement fermé.16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) Japonais (日本語) - + American English Anglais Américain - + French (français) Français (français) - + German (Deutsch) Allemand (Deutsch) - + Italian (italiano) Italien (italiano) - + Spanish (español) Espagnol (español) - + Chinese Chinois - + Korean (한국어) Coréen (한국어) - + Dutch (Nederlands) Néerlandais (Nederlands) - + Portuguese (português) Portugais (português) - + Russian (Русский) Russe (Русский) - + Taiwanese Taïwanais - + British English Anglais Britannique - + Canadian French Français Canadien - + Latin American Spanish Espagnol d'Amérique Latine - + Simplified Chinese Chinois Simplifié - + Traditional Chinese (正體中文) Chinois Traditionnel (正體中文) - + Brazilian Portuguese (português do Brasil) Portugais Brésilien (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japon - + USA É.-U.A. - + Europe Europe - + Australia Australie - + China Chine - + Korea Corée - + Taiwan Taïwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Par défaut (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Égypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islande - + Iran Iran - + Israel Israël - + Jamaica Jamaïque - + Kwajalein Kwajalein - + Libya Libye - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Pologne - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapour - + Turkey Turquie - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stéréo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Par défaut) - + 6GB DRAM (Unsafe) 6 GB DRAM (Risqué) - + 8GB DRAM 8GO DRAM - + 10GB DRAM (Unsafe) 10GO DRAM (Insecure) - + 12GB DRAM (Unsafe) 12GO DRAM (Insecure) - + Docked Mode TV - + Handheld Mode Portable - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Toujours demander (par défaut) - + Only if game specifies not to stop Uniquement si le jeu précise de ne pas s'arrêter - + Never ask Jamais demander - + Very Small (16 MB) Très petit (16Mo) - + Small (32 MB) Petit (32Mo) - + Normal (128 MB) Normal (128Mo) - + Large (256 MB) Large (256Mo) - + Very Large (512 MB) Très large (512Mo) - + Very Low (4 MB) Très faible (4 Mo) - + Low (8 MB) Faible (8 Mo) - + Normal (16 MB) Normal (16 Mo) - + Medium (32 MB) Moyen (32 Mo) - + High (64 MB) Élevé (64 Mo) - + Very Low (32) Très faible (32) - + Low (64) Faible (64) - + Normal (128) Normal (128) - + Medium (256) Moyen (256) - + High (512) Élevé (512) - + Disabled Désactivé - + ExtendedDynamicState 1 État dynamique étendu 1 - + ExtendedDynamicState 2 État dynamique étendu 2 - + ExtendedDynamicState 3 État dynamique étendu 3 - + Tree View Vue en liste - + Grid View Vue en grille @@ -6914,7 +6903,7 @@ Message de débogage : - + &Pause &Pause @@ -7070,7 +7059,7 @@ Message de débogage : - + &Start &Démarrer @@ -7081,7 +7070,7 @@ Message de débogage : - + R&ecord En&registrer @@ -7172,7 +7161,7 @@ Message de débogage : - + None Aucun @@ -7193,719 +7182,722 @@ Message de débogage : - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Remettre le son - + Mute Couper le son - + Reset Volume Réinitialiser le volume - + &Clear Recent Files - + &Continue &Continuer - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) (64-bit) - + + (32-bit) (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... Fermeture du logiciel... - + Save Data Données de sauvegarde - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? Réinitialiser le temps de jeu ? - - + + RomFS Extraction Failed! L'extraction de la RomFS a échoué ! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel Annuler - + RomFS Extraction Succeeded! Extraction de la RomFS réussi ! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties Propriétés - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game Jeu - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install Échec de l'installation - + The title type you selected for the NCA is invalid. - + File not found Fichier non trouvé - + File "%1" not found - + OK OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed - + Error Erreur - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo Charger un Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted Firmware corrompu - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE VOLUME : MUET - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! Wayland détecté ! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7913,74 +7905,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9776,55 +9768,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10525,65 +10517,65 @@ En sélectionnant « Depuis Eden », les données de sauvegarde précédemment s - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/hu.ts b/dist/languages/hu.ts index 71480646cc..1f47c4e564 100644 --- a/dist/languages/hu.ts +++ b/dist/languages/hu.ts @@ -1497,7 +1497,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Nincs @@ -1562,563 +1561,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - - - - - 64x - - - - + Japanese (日本語) Japán (日本語) - + American English Amerikai angol - + French (français) Francia (français) - + German (Deutsch) Német (Deutsch) - + Italian (italiano) Olasz (italiano) - + Spanish (español) Spanyol (español) - + Chinese Kínai - + Korean (한국어) Koreai (한국어) - + Dutch (Nederlands) Holland (Nederlands) - + Portuguese (português) Portugál (português) - + Russian (Русский) Orosz (Русский) - + Taiwanese Tajvani - + British English Brit Angol - + Canadian French Kanadai francia - + Latin American Spanish Latin-amerikai spanyol - + Simplified Chinese Egyszerűsített kínai - + Traditional Chinese (正體中文) Hagyományos kínai (正體中文) - + Brazilian Portuguese (português do Brasil) Brazíliai portugál (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japán - + USA USA - + Europe Európa - + Australia Ausztrália - + China Kína - + Korea Korea - + Taiwan Tajvan - + Auto (%1) Auto select time zone Automatikus (%1) - + Default (%1) Default time zone Alapértelmezett (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egyiptom - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Izland - + Iran Irán - + Israel Izrael - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navahó - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Lengyelország - + Portugal Portugália - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Szingapúr - + Turkey Törökország - + UCT UCT - + Universal Univerzális - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Sztereó - + Surround Térhangzás - + 4GB DRAM (Default) 4GB DRAM (Alapértelmezett) - + 6GB DRAM (Unsafe) 6GB DRAM (Nem biztonságos) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokkolt - + Handheld Kézi - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Mindig kérdezz rá (alapértelmezett) - + Only if game specifies not to stop Csak akkor, ha a játék kifejezetten kéri a folytatást. - + Never ask Soha ne kérdezz rá - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6840,7 +6829,7 @@ Debug Message: - + &Pause &Szünet @@ -6996,7 +6985,7 @@ Debug Message: - + &Start &Indítás @@ -7007,7 +6996,7 @@ Debug Message: - + R&ecord F&elvétel @@ -7098,7 +7087,7 @@ Debug Message: - + None @@ -7119,719 +7108,722 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7839,74 +7831,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9683,55 +9675,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10425,65 +10417,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/id.ts b/dist/languages/id.ts index ca11a9a399..0ccf66400b 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -1509,7 +1509,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Tak ada @@ -1574,563 +1573,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - - - - - 64x - - - - + Japanese (日本語) Jepang (日本語) - + American English Bahasa Inggris Amerika - + French (français) Prancis (français) - + German (Deutsch) Jerman (Deutsch) - + Italian (italiano) Italia (italiano) - + Spanish (español) Spanyol (español) - + Chinese Cina - + Korean (한국어) Korea (한국어) - + Dutch (Nederlands) Belanda (Nederlands) - + Portuguese (português) Portugis (português) - + Russian (Русский) Rusia (Русский) - + Taiwanese Taiwan - + British English Inggris Britania - + Canadian French Prancis Kanada - + Latin American Spanish Spanyol Amerika Latin - + Simplified Chinese Cina Sederhana - + Traditional Chinese (正體中文) Cina Tradisional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugis Brazil (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Jepang - + USA USA - + Europe Eropa - + Australia Australia - + China Tiongkok - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Bawaan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Mesir - + Eire Éire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Éire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polandia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turki - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Bawaan) - + 6GB DRAM (Unsafe) 6GB DRAM (Tidak Aman) - + 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Tidak Aman) - + 12GB DRAM (Unsafe) 12GB DRAM (Tidak Aman) - + Docked Terpasang - + Handheld Jinjing - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Selalu tanyakan (Bawaan) - + Only if game specifies not to stop Hanya jika permainan menentukan untuk tidak berhenti - + Never ask Jangan pernah bertanya - + Very Small (16 MB) Sangat Kecil (16 MB) - + Small (32 MB) Kecil (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Sedang (256) - + High (512) Tinggi (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6874,7 +6863,7 @@ Debug Message: - + &Pause &Jeda @@ -7030,7 +7019,7 @@ Debug Message: - + &Start &Mulai @@ -7041,7 +7030,7 @@ Debug Message: - + R&ecord R&ekam @@ -7132,7 +7121,7 @@ Debug Message: - + None @@ -7153,719 +7142,722 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7873,74 +7865,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9711,55 +9703,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name Nama Mod - + What should this mod be called? - + RomFS RomFS - + ExeFS/Patch - + Cheat Cheat - + Mod Type Tipe Mod - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10443,65 +10435,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/it.ts b/dist/languages/it.ts index 5dda88342c..9a94adc3f9 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -1542,7 +1542,6 @@ Quando un programma proverà ad aprire l'applet del controller, quest' - None Nessuna @@ -1607,563 +1606,553 @@ Quando un programma proverà ad aprire l'applet del controller, quest' 16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) Giapponese (日本語) - + American English Inglese americano - + French (français) Francese (français) - + German (Deutsch) Tedesco (Deutsch) - + Italian (italiano) Italiano - + Spanish (español) Spagnolo (español) - + Chinese Cinese - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Olandese (Nederlands) - + Portuguese (português) Portoghese (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanese - + British English Inglese britannico - + Canadian French Francese canadese - + Latin American Spanish Spagnolo latino-americano - + Simplified Chinese Cinese semplificato - + Traditional Chinese (正體中文) Cinese tradizionale (正體中文) - + Brazilian Portuguese (português do Brasil) Portoghese brasiliano (português do Brasil) - + Polish (polska) Polacco (polska) - + Thai (แบบไทย) Thailandese (แบบไทย) - - + + Japan Giappone - + USA USA - + Europe Europa - + Australia Australia - + China Cina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatico (%1) - + Default (%1) Default time zone Predefinito (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egitto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islanda - + Iran Iran - + Israel Israele - + Jamaica Giamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portogallo - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turchia - + UCT UCT - + Universal Universale - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Predefinito) - + 6GB DRAM (Unsafe) 6GB DRAM (Non sicuro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Non sicuro) - + 12GB DRAM (Unsafe) 12GB DRAM (Non sicuro) - + Docked Dock - + Handheld Portatile - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Chiedi sempre (Predefinito) - + Only if game specifies not to stop Solo se il gioco richiede di non essere arrestato - + Never ask Non chiedere mai - + Very Small (16 MB) Molto piccola (16 MB) - + Small (32 MB) Piccola (32 MB) - + Normal (128 MB) Normale (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Molto grande (512 MB) - + Very Low (4 MB) Molto bassa (4 MB) - + Low (8 MB) Bassa (8 MB) - + Normal (16 MB) Normale (16 MB) - + Medium (32 MB) Media (32 MB) - + High (64 MB) Alta (64 MB) - + Very Low (32) Molto basso (32) - + Low (64) Basso (64) - + Normal (128) Normale (128) - + Medium (256) Medio (256) - + High (512) Alto (512) - + Disabled Disabilitato - + ExtendedDynamicState 1 Stato dinamico esteso 1 - + ExtendedDynamicState 2 Stato dinamico esteso 2 - + ExtendedDynamicState 3 Stato dinamico esteso 3 - + Tree View Vista ad albero - + Grid View Vista a griglia @@ -6934,7 +6923,7 @@ Messaggio debug: - + &Pause &Pausa @@ -7090,7 +7079,7 @@ Messaggio debug: - + &Start &Avvia @@ -7101,7 +7090,7 @@ Messaggio debug: - + R&ecord R&egistra @@ -7192,7 +7181,7 @@ Messaggio debug: - + None Nessuno @@ -7213,397 +7202,400 @@ Messaggio debug: - + Small (32x32) Piccola (32x32) - + Standard (64x64) Normale (64x64) - + Large (128x128) Grande (128x128) - + Full Size (256x256) Intera (256x256) - + Broken Vulkan Installation Detected Rilevata installazione di Vulkan non funzionante - + Vulkan initialization failed during boot. L'inizializzazione di Vulkan è fallita durante l'avvio. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Gioco in esecuzione - + Loading Web Applet... Caricamento dell'applet web... - - + + Disable Web Applet Disabilita l'applet web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Disabilitare l'applet web potrebbe causare dei comportamenti indesiderati e andrebbe fatto solo con Super Mario 3D All-Stars. Sei sicuro di voler procedere? (Puoi riabilitarlo quando vuoi nelle impostazioni di debug.) - + The amount of shaders currently being built Il numero di shader in fase di compilazione - + The current selected resolution scaling multiplier. Il moltiplicatore attuale della risoluzione. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocità attuale dell'emulazione. Valori più alti o più bassi di 100% indicano che l'emulazione sta funzionando più velocemente o lentamente rispetto a una Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Il numero di fotogrammi al secondo che il gioco sta attualmente renderizzando. Può variare in base al gioco e alla situazione. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tempo necessario per emulare un fotogramma della Switch, senza tenere conto del limite al framerate o del V-Sync. Per un'emulazione alla massima velocità, il valore non dovrebbe essere superiore a 16.67 ms. - + Unmute Riattiva - + Mute Silenzia - + Reset Volume Reimposta volume - + &Clear Recent Files &Cancella i file recenti - + &Continue &Continua - + Warning: Outdated Game Format Attenzione: Formato del gioco obsoleto - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Stai usando una cartella contenente una ROM decostruita per avviare questo gioco, che è un formato obsoleto e sostituito da NCA, NAX, XCI o NSP. Le ROM decostruite non hanno icone né metadati e non supportano gli aggiornamenti.<br>Per una spiegazione sui vari formati della console Switch supportati da Eden, consulta il manuale utente. Non riceverai di nuovo questo avviso. - - + + Error while loading ROM! Errore nel caricamento della ROM! - + The ROM format is not supported. Il formato della ROM non è supportato. - + An error occurred initializing the video core. Errore durante l'inizializzazione del componente video di base - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. Eden ha riscontrato un errore durante l'esecuzione del componente video di base. Di solito questo errore è causato da driver GPU obsoleti, compresi quelli integrati. Consulta il log per maggiori dettagli. Per informazioni su come accedere al log, visita <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>questa pagina</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Errore nel caricamento della ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Esegui un nuovo dump dei tuoi file o chiedi aiuto su Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Si è verificato un errore sconosciuto. Consulta il log per maggiori dettagli. - + + (64-bit) (64 bit) - + + (32-bit) (32 bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Chiusura del software in corso... - + Save Data Dati di salvataggio - + Mod Data Dati delle mod - + Error Opening %1 Folder Impossibile aprire la cartella %1 - - + + Folder does not exist! La cartella non esiste! - + Remove Installed Game Contents? Rimuovere il contenuto del gioco installato? - + Remove Installed Game Update? Rimuovere l'aggiornamento installato? - + Remove Installed Game DLC? Rimuovere il DLC installato? - + Remove Entry Rimuovi voce - + Delete OpenGL Transferable Shader Cache? Vuoi rimuovere la cache trasferibile degli shader OpenGL? - + Delete Vulkan Transferable Shader Cache? Vuoi rimuovere la cache trasferibile degli shader Vulkan? - + Delete All Transferable Shader Caches? Vuoi rimuovere tutte le cache trasferibili degli shader? - + Remove Custom Game Configuration? Rimuovere la configurazione personalizzata del gioco? - + Remove Cache Storage? Rimuovere la cache del gioco? - + Remove File Rimuovi file - + Remove Play Time Data Reimposta il tempo di gioco - + Reset play time? Vuoi reimpostare il tempo di gioco? - - + + RomFS Extraction Failed! Estrazione RomFS fallita! - + There was an error copying the RomFS files or the user cancelled the operation. Si è verificato un errore durante la copia dei file del RomFS o l'operazione è stata annullata dall'utente. - + Full Completa - + Skeleton Cartelle - + Select RomFS Dump Mode Seleziona la modalità di estrazione del RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Seleziona come vorresti estrarre il RomFS. <br>La modalità Completa copierà tutti i file in una nuova cartella mentre<br>la modalità Cartelle creerà solamente la struttura delle cartelle. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Non c'è abbastanza spazio disponibile in %1 per estrarre il RomFS. Libera lo spazio o seleziona una cartella di estrazione diversa in Emulazione > Configura > Sistema > File system > Cartella di estrazione - + Extracting RomFS... Estrazione RomFS in corso... - - + + Cancel Annulla - + RomFS Extraction Succeeded! Estrazione RomFS riuscita! - + The operation completed successfully. L'operazione è stata completata con successo. - + Error Opening %1 Impossibile aprire %1 - + Select Directory Seleziona cartella - + Properties Proprietà - + The game properties could not be loaded. Non è stato possibile caricare le proprietà del gioco. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Eseguibile Switch (%1);;Tutti i file (*.*) - + Load File Carica file - + Open Extracted ROM Directory Apri la cartella della ROM estratta - + Invalid Directory Selected Cartella selezionata non valida - + The directory you have selected does not contain a 'main' file. La cartella che hai selezionato non contiene un file "main". - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) File Switch installabili (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Installa file - + %n file(s) remaining %n file rimanente%n di file rimanenti%n file rimanenti - + Installing file "%1"... Installazione del file "%1"... - - + + Install Results Risultati dell'installazione - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Per evitare possibli conflitti, sconsigliamo di installare i giochi base su NAND. Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) were newly installed %n nuovo file è stato installato @@ -7612,7 +7604,7 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) were overwritten %n file è stato sovrascritto @@ -7621,7 +7613,7 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) failed to install %n file non è stato installato a causa di errori @@ -7630,314 +7622,314 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + System Application Applicazione di sistema - + System Archive Archivio di sistema - + System Application Update Aggiornamento di un'applicazione di sistema - + Firmware Package (Type A) Pacchetto firmware (tipo A) - + Firmware Package (Type B) Pacchetto firmware (tipo B) - + Game Gioco - + Game Update Aggiornamento di gioco - + Game DLC DLC - + Delta Title Titolo delta - + Select NCA Install Type... Seleziona il tipo di installazione NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Seleziona il tipo del file NCA da installare: (Nella maggior parte dei casi, il valore predefinito "Gioco" va bene) - + Failed to Install Installazione fallita - + The title type you selected for the NCA is invalid. Il tipo che hai selezionato per il file NCA non è valido. - + File not found File non trovato - + File "%1" not found File "%1" non trovato - + OK OK - + Function Disabled Funzionalità disabilitata - + Compatibility list reporting is currently disabled. Check back later! La segnalazione della compatibilità è al momento disabilitata. Torna a controllare più avanti! - + Error opening URL Impossibile aprire l'URL - + Unable to open the URL "%1". Non è stato possibile aprire l'URL "%1". - + TAS Recording Registrazione TAS - + Overwrite file of player 1? Vuoi sovrascrivere il file del giocatore 1? - + Invalid config detected Rilevata configurazione non valida - + Handheld controller can't be used on docked mode. Pro controller will be selected. Il controller portatile non può essere utilizzato in modalità dock. Verrà selezionato il controller Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed L'Amiibo corrente è stato rimosso - + Error Errore - - + + The current game is not looking for amiibos Il gioco in uso non è alla ricerca di Amiibo - + Amiibo File (%1);; All Files (*.*) File Amiibo (%1);; Tutti i file (*.*) - + Load Amiibo Carica Amiibo - + Error loading Amiibo data Impossibile caricare i dati dell'Amiibo - + The selected file is not a valid amiibo Il file selezionato non è un Amiibo valido - + The selected file is already on use Il file selezionato è già in uso - + An unknown error occurred Si è verificato un errore sconosciuto - + No firmware available Nessun firmware disponibile - + Firmware Corrupted Firmware corrotto - + Unknown applet Applet sconosciuto - + Applet doesn't map to a known value. L'applet non è associato a un valore noto. - + Record not found Non trovato - + Applet not found. Please reinstall firmware. Applet non trovato. Reinstalla il firmware. - + Capture Screenshot Cattura screenshot - + PNG Image (*.png) Immagine PNG (*.png) - + TAS state: Running %1/%2 Stato TAS: In esecuzione (%1/%2) - + TAS state: Recording %1 Stato TAS: Registrazione in corso (%1) - + TAS state: Idle %1/%2 Stato TAS: In attesa (%1/%2) - + TAS State: Invalid Stato TAS: Non valido - + &Stop Running &Interrompi esecuzione - + Stop R&ecording Interrompi r&egistrazione - + Building: %n shader(s) Compilazione di %n shaderCompilazione di %n shaderCompilazione di %n shader - + Scale: %1x %1 is the resolution scaling factor Risoluzione: %1x - + Speed: %1% / %2% Velocità: %1% / %2% - + Speed: %1% Velocità: %1% - + Game: %1 FPS Gioco: %1 FPS - + Frame: %1 ms Frame: %1 ms - + NO AA NO AA - + VOLUME: MUTE VOLUME: MUTO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + Derivation Components Missing Componenti di derivazione mancanti - + Decryption keys are missing. Install them now? Chiavi di crittografia mancanti. Vuoi installarle ora? - + Wayland Detected! Wayland rilevato! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7948,74 +7940,74 @@ Si consiglia invece di usare X11. Vuoi forzare l'uso di quest'ultimo per i prossimi avvii? - + Use X11 Usa X11 - + Continue with Wayland Continua con Wayland - + Don't show again Non mostrare di nuovo - + Restart Required Riavvio richiesto - + Restart Eden to apply the X11 backend. Riavvia Eden per usare il back-end X11. - + Slow Lento - + Turbo Turbo - + Unlocked Sbloccato - + Select RomFS Dump Target Seleziona RomFS da estrarre - + Please select which RomFS you would like to dump. Seleziona quale RomFS vorresti estrarre. - + Are you sure you want to close Eden? Sei sicuro di voler uscire da Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Sei sicuro di voler arrestare l'emulazione? Tutti i progressi non salvati verranno perduti. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9803,37 +9795,37 @@ Vuoi selezionare manualmente la cartella dell'installazione portatile da us QtCommon::Mod - + Mod Name Nome mod - + What should this mod be called? Qual è il nome di questa mod? - + RomFS RomFS - + ExeFS/Patch ExeFS/Patch - + Cheat Trucco - + Mod Type Tipologia mod - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. @@ -9842,18 +9834,18 @@ Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed Estrazione mod fallita - + Failed to create temporary directory %1 Impossibile creare la cartella temporanea %1 - + Zip file %1 is empty Il file ZIP %1 è vuoto @@ -10555,65 +10547,65 @@ Selezionando "Da Eden", i dati di salvataggio pre-esistenti in Ryujinx - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index 1e87f4a0b1..a5a357f534 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -1494,7 +1494,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None なし @@ -1559,563 +1558,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) 日本語 - + American English アメリカ英語 - + French (français) フランス語 (français) - + German (Deutsch) ドイツ語 (Deutsch) - + Italian (italiano) イタリア語 (italiano) - + Spanish (español) スペイン語 (español) - + Chinese 中国語 - + Korean (한국어) 韓国語 (한국어) - + Dutch (Nederlands) オランダ語 (Nederlands) - + Portuguese (português) ポルトガル語 (português) - + Russian (Русский) ロシア語 (Русский) - + Taiwanese 台湾語 - + British English イギリス英語 - + Canadian French カナダフランス語 - + Latin American Spanish ラテンアメリカスペイン語 - + Simplified Chinese 簡体字中国語 - + Traditional Chinese (正體中文) 繁体字中国語 (正體中文) - + Brazilian Portuguese (português do Brasil) ブラジルポルトガル語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA アメリカ - + Europe ヨーロッパ - + Australia オーストラリア - + China 中国 - + Korea 韓国 - + Taiwan 台湾 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 既定 (%1) - + CET 中央ヨーロッパ時間 - + CST6CDT CST6CDT - + Cuba キューバ - + EET 東ヨーロッパ標準時 - + Egypt エジプト - + Eire アイルランド - + EST アメリカ東部標準時 - + EST5EDT EST5EDT - + GB GB - + GB-Eire イギリス-アイルランド - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich グリニッジ - + Hongkong 香港 - + HST ハワイ標準時 - + Iceland アイスランド - + Iran イラン - + Israel イスラエル - + Jamaica ジャマイカ - + Kwajalein クェゼリン - + Libya リビア - + MET 中東時間 - + MST MST - + MST7MDT MST7MDT - + Navajo ナバホ - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland ポーランド - + Portugal ポルトガル - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore シンガポール - + Turkey トルコ - + UCT UCT - + Universal ユニバーサル - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu ズールー - + Mono モノラル - + Stereo ステレオ - + Surround サラウンド - + 4GB DRAM (Default) 4GB DRAM (デフォルト) - + 6GB DRAM (Unsafe) 6GB DRAM (不安定) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld 携帯モード - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) 常に確認する (デフォルト) - + Only if game specifies not to stop ゲームが停止しないように指定しているときのみ - + Never ask 確認しない - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled 無効 - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6863,7 +6852,7 @@ Debug Message: - + &Pause 中断(&P) @@ -7019,7 +7008,7 @@ Debug Message: - + &Start 実行(&S) @@ -7030,7 +7019,7 @@ Debug Message: - + R&ecord 記録(&R) @@ -7121,7 +7110,7 @@ Debug Message: - + None @@ -7142,719 +7131,722 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7862,74 +7854,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9706,55 +9698,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10448,65 +10440,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index f6cb5d5177..7844a5ac2f 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -1562,7 +1562,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None 없음 @@ -1627,563 +1626,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) 일본어(日本語) - + American English 미국식 영어 - + French (français) 프랑스어(français) - + German (Deutsch) 독일어(Deutsch) - + Italian (italiano) 이탈리아어(italiano) - + Spanish (español) 스페인어(español) - + Chinese 중국어 - + Korean (한국어) 한국어(Korean) - + Dutch (Nederlands) 네덜란드어(Nederlands) - + Portuguese (português) 포르투갈어(português) - + Russian (Русский) 러시아어(Русский) - + Taiwanese 대만어 - + British English 영국식 영어 - + Canadian French 캐나다 프랑스어 - + Latin American Spanish 라틴아메리카 스페인어 - + Simplified Chinese 중국어 간체 - + Traditional Chinese (正體中文) 중국어 번체(正體中文) - + Brazilian Portuguese (português do Brasil) 브라질 포르투갈어(português do Brasil) - + Polish (polska) 폴란드어(polska) - + Thai (แบบไทย) 태국어(แบบไทย) - - + + Japan 일본 - + USA 미국 - + Europe 유럽 - + Australia 호주 - + China 중국 - + Korea 대한민국 - + Taiwan 대만 - + Auto (%1) Auto select time zone 자동(%1) - + Default (%1) Default time zone 기본(%1) - + CET CET - + CST6CDT CST6CDT - + Cuba 쿠바 - + EET EET - + Egypt 이집트 - + Eire 아일랜드 - + EST EST - + EST5EDT EST5EDT - + GB 영국 - + GB-Eire 영국-아일랜드 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 그리니치 - + Hongkong 홍콩 - + HST HST - + Iceland 아이슬란드 - + Iran 이란 - + Israel 이스라엘 - + Jamaica 자메이카 - + Kwajalein 콰잘레인 - + Libya 리비아 - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo 나바호 - + NZ 뉴질랜드 - + NZ-CHAT 뉴질랜드-채텀 - + Poland 폴란드 - + Portugal 포르투갈 - + PRC 중국 - + PST8PDT PST8PDT - + ROC 대만 - + ROK 대한민국 - + Singapore 싱가포르 - + Turkey 터키 - + UCT UCT - + Universal 세계 - + UTC UTC - + W-SU 모스크바 - + WET WET - + Zulu Zulu - + Mono 모노 - + Stereo 스테레오 - + Surround 서라운드 - + 4GB DRAM (Default) 4GB DRAM(기본값) - + 6GB DRAM (Unsafe) 6GB DRAM(불안전) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM(불안전) - + 12GB DRAM (Unsafe) 12GB DRAM(불안전) - + Docked 독 모드 - + Handheld 휴대 모드 - - + + Normal 보통 - - + + Boost 부스트 - - + + Overclock 오버클럭 - + Always ask (Default) 항상 묻기(기본값) - + Only if game specifies not to stop 게임에서 멈추지 말라고 명시한 경우에만 - + Never ask 절대 묻지 않음 - + Very Small (16 MB) 아주 작은 크기(16 MB) - + Small (32 MB) 작은 크기(32 MB) - + Normal (128 MB) 보통 크기(128 MB) - + Large (256 MB) 큰 크기(256 MB) - + Very Large (512 MB) 아주 큰 크기(512 MB) - + Very Low (4 MB) 매우 낮은 크기(4 MB) - + Low (8 MB) 낮은 크기(8 MB) - + Normal (16 MB) 보통 크기(16 MB) - + Medium (32 MB) 중간 크기(32 MB) - + High (64 MB) 높은 크기(64 MB) - + Very Low (32) 매우 낮은 크기(32) - + Low (64) 낮은 크기(64) - + Normal (128) 보통 크기(128) - + Medium (256) 보통(256) - + High (512) 빠름(512) - + Disabled 비활성화됨 - + ExtendedDynamicState 1 확장된 동적 상태 1 - + ExtendedDynamicState 2 확장된 동적 상태 2 - + ExtendedDynamicState 3 확장된 동적 상태 3 - + Tree View 트리 보기 - + Grid View 격자 보기 @@ -2389,13 +2378,13 @@ When a program attempts to open the controller applet, it is immediately closed. <div>Enables an IR optimization that reduces unnecessary accesses to the CPU context structure.</div> - <div>CPU 컨텍스트 구조에 대한 불필요한 액세스를 줄이는 IR 최적화를 활성화합니다.</div> + <div>CPU 콘텍스트 구조에 대한 불필요한 액세스를 줄이는 IR 최적화를 활성화합니다.</div> Enable context elimination - 컨텍스트 제거 활성화 + 콘텍스트 제거 활성화 @@ -2848,7 +2837,7 @@ When a program attempts to open the controller applet, it is immediately closed. Clear - 비우기 + 지우기 @@ -3403,7 +3392,7 @@ Would you like to delete the old save data? Clear All - 모두 비우기 + 모두 지우기 @@ -3466,7 +3455,7 @@ Would you like to delete the old save data? Clear - 비우기 + 지우기 @@ -3634,7 +3623,7 @@ Would you like to delete the old save data? Clear - 비우기 + 지우기 @@ -4896,7 +4885,7 @@ Check the log for details. Only mods, cheats, and patches can be deleted. To delete NAND-installed updates, right-click the game in the game list and click Remove -> Remove Installed Update. 모드, 치트, 패치만 삭제할 수 있습니다. -NAND에 설치된 업데이트를 삭제하려면 게임 목록에서 게임을 마우스 오른쪽 버튼으로 클릭하고 제거 -> 설치된 업데이트 제거를 클릭하세요. +NAND에 설치된 업데이트를 삭제하려면 게임 목록에서 게임을 우클릭한 후 제거 -> 설치된 업데이트 제거를 클릭하세요. @@ -5324,12 +5313,12 @@ UUID: %2 Click the bottom area to add a point, then press a button to bind. Drag points to change position, or double-click table cells to edit values. 하단 영역을 클릭하여 포인트를 추가 한 다음 버튼을 눌러 바인딩합니다. -포인트들을 끌어서 위치를 변경하거나 테이블 셀을 더블 클릭하여 값을 편집합니다. +포인트를 끌어서 위치를 변경하거나 테이블 셀을 더블 클릭하여 값을 편집합니다. Delete Point - 포인트 삭제하기 + 포인트 삭제 @@ -5361,7 +5350,7 @@ Drag points to change position, or double-click table cells to edit values. Delete Profile - 프로필 삭제하기 + 프로필 삭제 @@ -5715,7 +5704,7 @@ Drag points to change position, or double-click table cells to edit values. Show Current Game in your Discord Status - Discord 상태에 현재 게임 표시 + 디스코드 상태에 현재 게임 표시 @@ -6033,7 +6022,7 @@ Please go to Configure -> System -> Network and make a selection. OpenGL shared contexts are not supported. - OpenGL 공유 컨텍스트는 지원되지 않습니다. + OpenGL 공유 콘텍스트는 지원되지 않습니다. @@ -6123,12 +6112,12 @@ Please go to Configure -> System -> Network and make a selection. Remove Installed Update - 설치된 업데이트 삭제 + 설치된 업데이트 제거 Remove All Installed DLC - 설치된 모든 DLC 삭제 + 설치된 모든 DLC 제거 @@ -6951,7 +6940,7 @@ Debug Message: - + &Pause 일시중지(&P) @@ -7107,7 +7096,7 @@ Debug Message: - + &Start 시작(&S) @@ -7118,7 +7107,7 @@ Debug Message: - + R&ecord 기록(&e) @@ -7209,7 +7198,7 @@ Debug Message: - + None 없음 @@ -7230,725 +7219,728 @@ Debug Message: 캐러셀 보기(&C) - + Small (32x32) 작은 크기(32x32) - + Standard (64x64) 기본 크기(64x64) - + Large (128x128) 큰 크기(128x128) - + Full Size (256x256) 전체 크기(256x256) - + Broken Vulkan Installation Detected 손상된 Vulkan 설치가 발견됨 - + Vulkan initialization failed during boot. 부팅 중 Vulkan 초기화에 실패했습니다. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping 게임 실행 중 - + Loading Web Applet... 웹 애플릿을 불러오는 중... - - + + Disable Web Applet 웹 애플릿 비활성화 - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) 웹 애플릿을 비활성화하면 예기치 않은 동작이 발생할 수 있으며 슈퍼 마리오 3D 컬렉션에서만 사용해야 합니다. 웹 애플릿을 비활성화하겠습니까? (디버그 설정에서 다시 활성화할 수 있습니다.) - + The amount of shaders currently being built 현재 구축 중인 셰이더 수 - + The current selected resolution scaling multiplier. 현재 선택된 해상도 조정 배율입니다. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. 현재 에뮬레이션 속도입니다. 100%보다 높거나 낮은 값은 에뮬레이션이 스위치보다 빠르거나 느리게 실행되고 있음을 나타냅니다. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. 현재 게임이 표시하는 초당 프레임 수입니다. 이 값은 게임 및 장면에 따라 다릅니다. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 프레임 제한이나 수직 동기화를 제외하고 스위치 프레임을 에뮬레이션하는 데 걸리는 시간입니다. 최고 속도 에뮬레이션의 경우 최대 16.67 밀리초입니다. - + Unmute 음소거 해제 - + Mute 음소거 - + Reset Volume 볼륨 재설정 - + &Clear Recent Files 최근 파일 지우기(&C) - + &Continue 재개(&C) - + Warning: Outdated Game Format 경고: 구식 게임 형식입니다 - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. 현재 이 게임에 대해 구형 형식인 분해된 ROM 디렉터리 형식을 사용하고 있습니다. 이 형식은 NCA, NAX, XCI 또는 NSP와 같은 다른 형식으로 대체되었습니다. 분해된 ROM 디렉터리에는 아이콘, 메타데이터 및 업데이트 지원 기능이 없습니다.<br>Eden에서 지원하는 다양한 스위치 형식에 대한 자세한 내용은 사용자 설명서를 참조해 주세요. 이 메시지는 다시 표시되지 않습니다. - - + + Error while loading ROM! ROM 불러오는 중 오류 발생! - + The ROM format is not supported. 해당 ROM 형식은 지원되지 않습니다. - + An error occurred initializing the video core. 비디오 코어 초기화 중 오류가 발생했습니다. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. Eden에서 비디오 코어 실행 중 오류가 발생했습니다. 이는 일반적으로 내장 그래픽 드라이버를 포함한 GPU 드라이버가 최신 버전이 아니기 때문에 발생합니다. 자세한 내용은 로그 파일을 참조해 주세요. 로그 파일 접근 방법에 대한 자세한 내용은 <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>로그 파일 업로드 방법</a> 페이지를 참조해 주세요. - + Error while loading ROM! %1 %1 signifies a numeric error code. ROM 불러오는 중 오류 발생! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>파일을 다시 덤프하거나 디스코드/Stoat에서 도움을 요청해 주세요. - + An unknown error occurred. Please see the log for more details. 알 수 없는 오류가 발생했습니다. 자세한 내용은 로그를 참조해 주세요. - + + (64-bit) (64비트) - + + (32-bit) (32비트) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... 소프트웨어 닫는 중... - + Save Data 저장 데이터 - + Mod Data 모드 데이터 - + Error Opening %1 Folder %1 폴더 여는 중 오류 발생 - - + + Folder does not exist! 폴더가 존재하지 않습니다! - + Remove Installed Game Contents? 설치된 게임 콘텐츠를 제거하겠습니까? - + Remove Installed Game Update? 설치된 게임 업데이트를 제거하겠습니까? - + Remove Installed Game DLC? 설치된 게임 DLC를 제거하겠습니까? - + Remove Entry 항목 제거 - + Delete OpenGL Transferable Shader Cache? OpenGL 이동 가능한 셰이더 캐시를 삭제하겠습니까? - + Delete Vulkan Transferable Shader Cache? Vulkan 이동 가능한 셰이더 캐시를 삭제하겠습니까? - + Delete All Transferable Shader Caches? 이동 가능한 셰이더 캐시를 모두 삭제하겠습니까? - + Remove Custom Game Configuration? 사용자 지정 게임 구성을 제거하겠습니까? - + Remove Cache Storage? 캐시 저장소를 제거하겠습니까? - + Remove File 파일 제거 - + Remove Play Time Data 플레이 시간 데이터 제거 - + Reset play time? 플레이 시간을 재설정하겠습니까? - - + + RomFS Extraction Failed! RomFS 추출 실패! - + There was an error copying the RomFS files or the user cancelled the operation. RomFS 파일을 복사하는 중에 오류가 발생했거나 사용자가 작업을 취소했습니다. - + Full 전체 - + Skeleton 뼈대 - + Select RomFS Dump Mode RomFS 덤프 모드 선택 - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. RomFS 덤프 방식을 선택해 주세요. 전체를 선택하면 모든 파일이 새 디렉터리로 복사되고, 뼈대를 선택하면 디렉터리 구조만 생성됩니다. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root %1 위치에 RomFS를 추출할 수 있는 여유 공간이 부족합니다. 공간을 확보하거나 에뮬레이션 > 구성 > 시스템 > 파일 시스템 > 덤프 경로에서 다른 덤프 디렉터리를 선택해 주세요. - + Extracting RomFS... RomFS 추출 중... - - + + Cancel 취소 - + RomFS Extraction Succeeded! RomFS 추출 성공! - + The operation completed successfully. 작업이 성공적으로 완료되었습니다. - + Error Opening %1 %1을(를) 여는 중 오류 발생 - + Select Directory 디렉터리 선택 - + Properties 속성 - + The game properties could not be loaded. 게임 속성을 불러올 수 없습니다. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. 스위치 실행 파일(%1);;모든 파일(*.*) - + Load File 파일 불러오기 - + Open Extracted ROM Directory 추출된 ROM 디렉터리 열기 - + Invalid Directory Selected 유효하지 않은 디렉터리 선택됨 - + The directory you have selected does not contain a 'main' file. 선택한 디렉터리에는 'main' 파일이 없습니다. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) 설치 가능한 스위치 파일(*.nca, *.nsp, *.xci);;닌텐도 콘텐츠 아카이브(*.nca);;닌텐도 제출 패키지(*.nsp);;NX 카트리지 이미지(*.xci) - + Install Files 파일 설치 - + %n file(s) remaining %n개 파일 남음 - + Installing file "%1"... "%1" 파일 설치 중... - - + + Install Results 설치 결과 - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. 잠재적인 충돌을 방지하기 위해 저희는 사용자가 기본 게임을 NAND에 설치하는 것은 권장하지 않습니다. 이 기능은 업데이트 및 DLC 설치에만 사용해 주세요. - + %n file(s) were newly installed %n개 파일이 새로 설치됨 - + %n file(s) were overwritten %n개 파일이 덮어쓰기됨 - + %n file(s) failed to install %n개 파일 설치 실패 - + System Application 시스템 애플리케이션 - + System Archive 시스템 아카이브 - + System Application Update 시스템 애플리케이션 업데이트 - + Firmware Package (Type A) 펌웨어 패키지(A타입) - + Firmware Package (Type B) 펌웨어 패키지(B타입) - + Game 게임 - + Game Update 게임 업데이트 - + Game DLC 게임 DLC - + Delta Title 델타 타이틀 - + Select NCA Install Type... NCA 설치 유형 선택... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) 이 NCA를 설치할 타이틀 유형을 선택해 주세요: (대부분의 경우 기본값인 '게임'을 선택하면 됩니다.) - + Failed to Install 설치 실패 - + The title type you selected for the NCA is invalid. NCA에 대해 선택한 타이틀 유형이 유효하지 않습니다. - + File not found 파일을 찾을 수 없음 - + File "%1" not found "%1" 파일을 찾을 수 없음 - + OK 확인 - + Function Disabled 기능 비활성화됨 - + Compatibility list reporting is currently disabled. Check back later! 호환성 목록 보고 옵션이 현재 비활성화되어 있습니다. 나중에 다시 확인해 주세요! - + Error opening URL URL 여는 중 오류 발생 - + Unable to open the URL "%1". "%1" URL을 열 수 없습니다. - + TAS Recording TAS 녹화 - + Overwrite file of player 1? 플레이어 1의 파일을 덮어쓰겠습니까? - + Invalid config detected 무효한 구성이 발견됨 - + Handheld controller can't be used on docked mode. Pro controller will be selected. 휴대 모드 컨트롤러는 독 모드에서 사용할 수 없습니다. Pro 컨트롤러로 선택됩니다. - - + + Amiibo Amiibo - - + + The current amiibo has been removed 현재 amiibo가 제거됨 - + Error 오류 - - + + The current game is not looking for amiibos 현재 게임은 amiibo를 찾고 있지 않습니다 - + Amiibo File (%1);; All Files (*.*) Amiibo 파일(%1);; 모든 파일(*.*) - + Load Amiibo Amiibo 불러오기 - + Error loading Amiibo data Amiibo 데이터 불러오는 중 오류 발생 - + The selected file is not a valid amiibo 선택한 파일은 유효한 amiibo가 아닙니다 - + The selected file is already on use 선택한 파일은 이미 사용 중입니다 - + An unknown error occurred 알 수 없는 오류 발생 - + No firmware available 사용 가능한 펌웨어 없음 - + Firmware Corrupted 펌웨어 손상됨 - + Unknown applet 알 수 없는 애플릿 - + Applet doesn't map to a known value. 애플릿이 알려진 값에 매핑되지 않습니다. - + Record not found 기록을 찾을 수 없음 - + Applet not found. Please reinstall firmware. 애플릿을 찾을 수 없습니다. 펌웨어를 다시 설치해 주세요. - + Capture Screenshot 스크린샷 캡처 - + PNG Image (*.png) PNG 이미지(*.png) - + TAS state: Running %1/%2 TAS 상태: %1/%2 실행 중 - + TAS state: Recording %1 TAS 상태: %1 녹화 중 - + TAS state: Idle %1/%2 TAS 상태: %1/%2 유휴 - + TAS State: Invalid TAS 상태: 무효 - + &Stop Running 실행 중지(&S) - + Stop R&ecording 녹화 중지(&e) - + Building: %n shader(s) 구축 중: %n개 셰이더 - + Scale: %1x %1 is the resolution scaling factor 크기: %1x - + Speed: %1% / %2% 속도: %1% / %2% - + Speed: %1% 속도: %1% - + Game: %1 FPS 게임: %1 FPS - + Frame: %1 ms 프레임: %1 밀리초 - + NO AA AA 없음 - + VOLUME: MUTE 볼륨: 음소거 - + VOLUME: %1% Volume percentage (e.g. 50%) 볼륨: %1% - + Derivation Components Missing 파생 구성 요소 누락 - + Decryption keys are missing. Install them now? 복호화 키가 없습니다. 지금 설치하겠습니까? - + Wayland Detected! Wayland 발견됨! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7959,74 +7951,74 @@ Would you like to force it for future launches? 향후 출시를 위해 Wayland 사용을 강제하겠습니까? - + Use X11 X11 사용 - + Continue with Wayland Wayland와 계속 - + Don't show again 다시 보지 않기 - + Restart Required 재시작이 필요함 - + Restart Eden to apply the X11 backend. X11 백엔드를 적용하려면 Eden을 다시 시작하세요. - + Slow 저속 - + Turbo 터보 - + Unlocked - 잠금 해제 + 제한 해제 - + Select RomFS Dump Target RomFS 덤프 대상 선택 - + Please select which RomFS you would like to dump. 덤프할 RomFS를 선택하세요. - + Are you sure you want to close Eden? 정말 Eden을 닫겠습니까? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. 정말 에뮬레이션을 중지하겠습니까? 저장되지 않은 진행 상황은 모두 손실됩니다. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -8634,7 +8626,7 @@ p, li { white-space: pre-wrap; } Clear Old Data - 이전 데이터 삭제 + 이전 데이터 지우기 @@ -9337,7 +9329,7 @@ p, li { white-space: pre-wrap; } Really clear data? - 정말 데이터를 지우는 건가요? + 정말로 데이터를 지우겠습니까? @@ -9638,7 +9630,7 @@ Would you like to manually select a portable folder to use? Successfully removed the installed base game. - 설치된 기본 게임 %1이(가) 성공적으로 제거됐습니다. + 설치된 기본 게임이 성공적으로 제거됐습니다. @@ -9828,37 +9820,37 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name 모드 이름 - + What should this mod be called? 이 모드의 이름은 뭐라고 해야 할까요? - + RomFS RomFS - + ExeFS/Patch ExeFS/패치 - + Cheat 치트 - + Mod Type 모드 유형 - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. @@ -9867,18 +9859,18 @@ Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed 모드 추출 실패 - + Failed to create temporary directory %1 임시 디렉터리 %1을(를) 생성하는 데 실패함 - + Zip file %1 is empty 압축 파일 %1이(가) 비어 있음 @@ -10579,66 +10571,66 @@ By selecting "From Eden", previous save data stored in Ryujinx will be %1은(는) 다운로드가 가능합니다. - + New Version Location 새 버전 위치 - + All Files (*.*) 모든 파일(*.*) - - - + + + Failed to save file 파일 저장 실패 - + Could not open file %1 for writing. %1 파일을 쓰기 위해 열 수 없습니다. - + Downloading... 다운로드 중... - + Cancel 취소 - + Could not write to file %1. %1 파일에 쓸 수 없습니다. - + Could not commit to file %1. %1 파일에 커밋할 수 없습니다. - + Failed to download file 파일 다운로드 실패 - + Could not download from %1%2 Error code: %3 %1%2에서 다운로드할 수 없습니다 오류 코드: %3 - + Download Complete 다운로드 완료 - + Successfully downloaded %1. Would you like to open it? %1이(가) 성공적으로 다운로드됐습니다. 열어보겠습니까? diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index 5ddd027cdc..deaec1bb7e 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -1491,7 +1491,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Ingen @@ -1556,563 +1555,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) Japansk (日本語) - + American English Amerikansk engelsk - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Nederlandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwansk - + British English Britisk engelsk - + Canadian French Kanadisk fransk - + Latin American Spanish Latinamerikansk spansk - + Simplified Chinese Forenklet kinesisk - + Traditional Chinese (正體中文) Tradisjonell kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisisk (português do Brasil) - + Polish (polska) Polsk (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australia - + China Folkerepublikken Kina - + Korea Korea - + Taiwan Taiwan (Republikken Kina) - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET Sentraleuropeisk tid - + CST6CDT CST6CDT - + Cuba Cuba - + EET Østeuropeisk tid - + Egypt Egypt - + Eire Republikken Irland - + EST EST - + EST5EDT EST5EDT - + GB Storbritannia - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC Folkerepublikken Kina - + PST8PDT PST8PDT - + ROC Taiwan (Republikken Kina) - + ROK Sør-Korea - + Singapore Singapore - + Turkey Tyrkia - + UCT UCT - + Universal Universalt - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (Utrygt) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (Utrygt) - + 12GB DRAM (Unsafe) 12 GB DRAM (Utrygt) - + Docked I dokking - + Handheld Håndholdt - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Spør alltid (Standard) - + Only if game specifies not to stop - + Never ask Aldri spør - + Very Small (16 MB) Veldig liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Veldig stor (512 MB) - + Very Low (4 MB) Veldig lav (4 MB) - + Low (8 MB) Lav (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Middels (32 MB) - + High (64 MB) Høy (64 MB) - + Very Low (32) Svært lav (32) - + Low (64) Lav (64) - + Normal (128) Normal (128) - + Medium (256) Middels (256) - + High (512) Høy (512) - + Disabled Skrudd av - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6860,7 +6849,7 @@ Debug Message: - + &Pause &Pause @@ -7016,7 +7005,7 @@ Debug Message: - + &Start &Start @@ -7027,7 +7016,7 @@ Debug Message: - + R&ecord T&a opp @@ -7118,7 +7107,7 @@ Debug Message: - + None Ingen @@ -7139,719 +7128,722 @@ Debug Message: - + Small (32x32) Liten (32x32) - + Standard (64x64) Standard (64x64) - + Large (128x128) Stor (128x128) - + Full Size (256x256) Full størrelse (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Kjører et spill - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Slå på lyd - + Mute Demp - + Reset Volume Tilbakestill volum - + &Clear Recent Files &Tøm nylige filer - + &Continue &Fortsett - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) (64-bit) - + + (32-bit) (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... Lukker programvare ... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! Mappen finnes ikke! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File Fjern fil - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full Full - + Skeleton Skjelett - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... Utvinner RomFS... - - + + Cancel Avbryt - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory Velg mappe - + Properties Egenskaper - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... Installerer filen «%1» ... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application Systemapp - + System Archive Systemarkiv - + System Application Update - + Firmware Package (Type A) Fastvarepakke (Type A) - + Firmware Package (Type B) Fastvarepakke (Type B) - + Game Spill - + Game Update Spilloppdatering - + Game DLC Spill-DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found Filen ble ikke funnet - + File "%1" not found - + OK OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL Feil under åpning av URL - + Unable to open the URL "%1". - + TAS Recording TAS-opptak - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo amiibo - - + + The current amiibo has been removed - + Error Feil - - + + The current game is not looking for amiibos Det nåværende spillet ser ikke etter amiiboer - + Amiibo File (%1);; All Files (*.*) amiibo-fil (%1);; Alle filer (*.*) - + Load Amiibo Last inn amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available Ingen fastvare tilgjengelig - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot Ta skjermklipp - + PNG Image (*.png) PNG-bilde (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Hastighet: %1% / %2% - + Speed: %1% Hastighet: %1% - + Game: %1 FPS Spill: %1 FPS - + Frame: %1 ms Ramme: %1 ms - + NO AA INGEN AA - + VOLUME: MUTE VOLUM: DEMP - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUM: %1% - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7859,74 +7851,74 @@ Would you like to force it for future launches? - + Use X11 Bruk X11 - + Continue with Wayland - + Don't show again Ikke vis igjen - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow Treg - + Turbo Turbo - + Unlocked Ubegrenset - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9705,55 +9697,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name Mod-navn - + What should this mod be called? - + RomFS RomFS - + ExeFS/Patch ExeFS/Patch - + Cheat - + Mod Type Mod-type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty «%1»-zip-filen er tom @@ -10447,65 +10439,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index 87a5698e15..28d6649a8f 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -1498,7 +1498,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Geen @@ -1563,563 +1562,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - - - - - 64x - - - - + Japanese (日本語) Japans (日本語) - + American English Amerikaans-Engels - + French (français) Frans (Français) - + German (Deutsch) Duits (Deutsch) - + Italian (italiano) Italiaans (italiano) - + Spanish (español) Spaans (Español) - + Chinese Chinees - + Korean (한국어) Koreaans (한국어) - + Dutch (Nederlands) Nederlands (Nederlands) - + Portuguese (português) Portugees (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanese - + British English Brits-Engels - + Canadian French Canadees-Frans - + Latin American Spanish Latijns-Amerikaans Spaans - + Simplified Chinese Vereenvoudigd Chinees - + Traditional Chinese (正體中文) Traditioneel Chinees (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliaans-Portugees (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australië - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standaard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Ijsland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libië - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkije - + UCT UCT - + Universal Universeel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6856,7 +6845,7 @@ Debug Message: - + &Pause &Onderbreken @@ -7012,7 +7001,7 @@ Debug Message: - + &Start &Start @@ -7023,7 +7012,7 @@ Debug Message: - + R&ecord Opnemen @@ -7114,7 +7103,7 @@ Debug Message: - + None @@ -7135,719 +7124,722 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7855,74 +7847,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9699,55 +9691,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10441,65 +10433,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/pl.ts b/dist/languages/pl.ts index e8d926323a..1de0411aea 100644 --- a/dist/languages/pl.ts +++ b/dist/languages/pl.ts @@ -1540,7 +1540,6 @@ Jeśli emulowane oprogramowanie próbuje otworzyć aplet kontrolera, jest on nat - None Żadna (wyłączony) @@ -1605,563 +1604,553 @@ Jeśli emulowane oprogramowanie próbuje otworzyć aplet kontrolera, jest on nat 16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) Japoński (日本語) - + American English Angielski Amerykański - + French (français) Francuski (français) - + German (Deutsch) Niemiecki (Niemcy) - + Italian (italiano) Włoski (italiano) - + Spanish (español) Hiszpański (español) - + Chinese Chiński - + Korean (한국어) Koreański (한국어) - + Dutch (Nederlands) Duński (Holandia) - + Portuguese (português) Portugalski (português) - + Russian (Русский) Rosyjski (Русский) - + Taiwanese Tajwański - + British English Angielski Brytyjski - + Canadian French Fancuski (Kanada) - + Latin American Spanish Hiszpański (Latin American) - + Simplified Chinese Chiński (Uproszczony) - + Traditional Chinese (正體中文) Chiński tradycyjny (正體中文) - + Brazilian Portuguese (português do Brasil) Portugalski (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonia - + USA USA - + Europe Europa - + Australia Australia - + China Chiny - + Korea Korea - + Taiwan Tajwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Domyślne (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipt - + Eire Irlandia - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Izrael - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polska - + Portugal Portugalia - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turcja - + UCT UCT - + Universal Uniwersalny - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Domyślne) - + 6GB DRAM (Unsafe) 6GB DRAM (NIebezpieczne) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (NIebezpieczne) - + 12GB DRAM (Unsafe) 12GB DRAM (NIebezpieczne) - + Docked Zadokowany - + Handheld Przenośnie - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Zawsze pytaj (Domyślne) - + Only if game specifies not to stop Tylko jeśli gra określa, aby nie zatrzymywać - + Never ask Nie pytaj więcej - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Średnie (256) - + High (512) Wysokie (512) - + Disabled Wyłączone - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6923,7 +6912,7 @@ Komunikat debugowania: - + &Pause &Pauza @@ -7079,7 +7068,7 @@ Komunikat debugowania: - + &Start &Start @@ -7090,7 +7079,7 @@ Komunikat debugowania: - + R&ecord &Nagraj @@ -7181,7 +7170,7 @@ Komunikat debugowania: - + None Żadna (wyłączony) @@ -7202,398 +7191,401 @@ Komunikat debugowania: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected Wykryto uszkodzoną instalację Vulkan - + Vulkan initialization failed during boot. Inicjalizacja Vulkana nie powiodła się podczas uruchamiania. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Gra uruchomiona - + Loading Web Applet... Ładowanie apletu internetowego... - - + + Disable Web Applet Wyłącz Aplet sieciowy - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Wyłączenie apletu sieciowego może prowadzić do nieprzewidywalnego działania i powinno być używane wyłącznie z Super Mario 3D All-Stars. Na pewno chcesz wyłączyć aplet sieciowy? (Tę opcję można ponownie włączyć w ustawieniach debugowania). - + The amount of shaders currently being built Liczba shaderów aktualnie budowanych - + The current selected resolution scaling multiplier. Aktualnie wybrany mnożnik skalowania rozdzielczości. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Bieżąca prędkość emulacji. Wartości wyższe lub niższe niż 100% oznaczają, że emulacja działa odpowiednio szybciej lub wolniej niż na Switchu. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Liczba klatek na sekundę aktualnie wyświetlanych przez grę. Wartość ta zależy od gry oraz od konkretnej sceny. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Czas potrzebny na emulację jednej klatki Switcha, bez uwzględniania ogranicznika klatek i synchronizacji pionowej. Dla emulacji z pełną prędkością powinno to być maksymalnie 16,67 ms. - + Unmute Wyłącz wyciszenie - + Mute Wycisz - + Reset Volume Zresetuj głośność - + &Clear Recent Files &Usuń Ostatnie pliki - + &Continue &Kontynuuj - + Warning: Outdated Game Format Ostrzeżenie: Nieaktualny format gry - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Używasz dla tej gry formatu katalogu zdekonstruowanego ROM-u, który jest przestarzały i został zastąpiony innymi formatami, takimi jak NCA, NAX, XCI czy NSP. Katalogi takich ROM-ów nie zawierają ikon, metadanych ani nie obsługują aktualizacji.<br>Aby uzyskać wyjaśnienie dotyczące różnych formatów Switcha obsługiwanych przez Eden, zajrzyj do naszego podręcznika użytkownika. Ten komunikat nie zostanie wyświetlony ponownie. - - + + Error while loading ROM! Błąd podczas wczytywania ROMu! - + The ROM format is not supported. Ten format ROMu nie jest wspierany. - + An error occurred initializing the video core. Wystąpił błąd podczas inicjowania rdzenia wideo. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. Podczas uruchamiania rdzenia wideo wystąpił błąd. Zazwyczaj jest to spowodowane nieaktualnymi sterownikami GPU, w tym sterownikami zintegrowanymi. Więcej szczegółów można znaleźć w logu. Więcej informacji na temat dostępu do logu można znaleźć na następującej stronie: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>Jak przesłać Log</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Błąd podczas wczytywania ROMu! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Proszę ponownie zrzucić pliki lub poprosić o pomoc na Discordzie/Stoat. - + An unknown error occurred. Please see the log for more details. Wystąpił nieznany błąd. Więcej informacji można znaleźć w pliku log. - + + (64-bit) (64-bit) - + + (32-bit) (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Zamykanie aplikacji... - + Save Data Zapis danych - + Mod Data Dane modów - + Error Opening %1 Folder Błąd podczas otwierania folderu %1 - - + + Folder does not exist! Folder nie istnieje! - + Remove Installed Game Contents? Usunąć zainstalowaną zawartość gry? - + Remove Installed Game Update? Usunąć zainstalowaną aktualizację gry? - + Remove Installed Game DLC? Usunąć zainstalowane DLC gry? - + Remove Entry Usuń wpis - + Delete OpenGL Transferable Shader Cache? Usunąć przenośną pamięć podręczną shaderów OpenGL? - + Delete Vulkan Transferable Shader Cache? Usunąć przenośną pamięć podręczną shaderów Vulkan? - + Delete All Transferable Shader Caches? Usunąć wszystkie przenośne pamięci podręczne shaderów? - + Remove Custom Game Configuration? Usunąć niestandardową konfigurację gry? - + Remove Cache Storage? Usunąć pamięć podręczną? - + Remove File Usuń plik - + Remove Play Time Data Usuń dane czasu gry - + Reset play time? Zresetować czas gry? - - + + RomFS Extraction Failed! Wyodrębnianie RomFS nie powiodło się! - + There was an error copying the RomFS files or the user cancelled the operation. Wystąpił błąd podczas kopiowania plików RomFS lub użytkownik przerwał operację. - + Full Pełny - + Skeleton Szkielet - + Select RomFS Dump Mode Wybierz tryb zrzutu RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Wybierz sposób wykonania zrzutu RomFS. <br>Tryb „Pełny” skopiuje wszystkie pliki do nowego katalogu, <br>natomiast „Szkielet” utworzy jedynie strukturę katalogów. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Nie ma wystarczająco miejsca w %1 aby wyodrębnić RomFS. Zwolnij trochę miejsca, albo zmień ścieżkę zrzutu RomFs w Emulacja > Konfiguruj > System > System Plików > Źródło Zrzutu - + Extracting RomFS... Wypakowywanie RomFS... - - + + Cancel Anuluj - + RomFS Extraction Succeeded! Wypakowanie RomFS zakończone pomyślnie! - + The operation completed successfully. Operacja zakończona pomyślnie. - + Error Opening %1 Błąd podczas otwierania %1 - + Select Directory Wybierz folder - + Properties Właściwości - + The game properties could not be loaded. Właściwości tej gry nie mogły zostać załadowane. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Plik wykonywalny Switcha (%1);;Wszystkie pliki (*.*) - + Load File Załaduj plik - + Open Extracted ROM Directory Otwórz folder wypakowanego ROMu - + Invalid Directory Selected Wybrano niewłaściwy folder - + The directory you have selected does not contain a 'main' file. Wybrany folder nie zawiera 'głównego' pliku. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Instalacyjne pliki Switch'a (*.nca *.nsp *.xci);;Archiwum zawartości Nintendo (*.nca);;Pakiet poddany Nintendo (*.nsp);;Obraz z kartridża NX (*.xci) - + Install Files Zainstaluj pliki - + %n file(s) remaining Pozostał %n plikPozostały %n plikiPozostało %n plikówPozostało %n plików - + Installing file "%1"... Instalowanie pliku "%1"... - - + + Install Results Wynik instalacji - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Aby uniknąć ewentualnych konfliktów, odradzamy użytkownikom instalowanie gier na NAND. Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + %n file(s) were newly installed %n plik został nowo zainstalowany @@ -7603,7 +7595,7 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + %n file(s) were overwritten %n plik został nadpisany @@ -7613,7 +7605,7 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + %n file(s) failed to install Nie udało się zainstalować %n pliku @@ -7623,314 +7615,314 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + System Application Aplikacja systemowa - + System Archive Archiwum systemu - + System Application Update Aktualizacja aplikacji systemowej - + Firmware Package (Type A) Paczka systemowa (Typ A) - + Firmware Package (Type B) Paczka systemowa (Typ B) - + Game Gra - + Game Update Aktualizacja gry - + Game DLC Dodatek do gry - + Delta Title Tytuł Delta - + Select NCA Install Type... Wybierz typ instalacji NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Wybierz typ tytułu, do którego chcesz zainstalować ten NCA, jako: (W większości przypadków domyślna "gra" jest w porządku.) - + Failed to Install Instalacja nieudana - + The title type you selected for the NCA is invalid. Typ tytułu wybrany dla NCA jest nieprawidłowy. - + File not found Nie znaleziono pliku - + File "%1" not found Nie znaleziono pliku "%1" - + OK OK - + Function Disabled Funkcja wyłączona - + Compatibility list reporting is currently disabled. Check back later! Zgłaszanie do listy kompatybilności jest obecnie wyłączone. Spróbuj ponownie później! - + Error opening URL Błąd otwierania adresu URL - + Unable to open the URL "%1". Nie można otworzyć adresu URL "%1". - + TAS Recording Nagrywanie TAS - + Overwrite file of player 1? Nadpisać plik gracza 1? - + Invalid config detected Wykryto nieprawidłową konfigurację - + Handheld controller can't be used on docked mode. Pro controller will be selected. Nie można używać kontrolera handheld w trybie zadokowanym. Zostanie wybrany kontroler Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Amiibo zostało "zdjęte" - + Error Błąd - - + + The current game is not looking for amiibos Ta gra nie szuka amiibo - + Amiibo File (%1);; All Files (*.*) Plik Amiibo (%1);;Wszyskie pliki (*.*) - + Load Amiibo Zamontuj Amiibo - + Error loading Amiibo data Błąd podczas ładowania danych Amiibo - + The selected file is not a valid amiibo Wybrany plik nie jest poprawnym amiibo - + The selected file is already on use Wybrany plik jest już w użyciu - + An unknown error occurred Wystąpił nieznany błąd - + No firmware available Brak dostępnego firmware'u - + Firmware Corrupted Uszkodzony Firmware - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot Zrób zrzut ekranu - + PNG Image (*.png) Obrazek PNG (*.png) - + TAS state: Running %1/%2 Status TAS: Działa %1%2 - + TAS state: Recording %1 Status TAS: Nagrywa %1 - + TAS state: Idle %1/%2 Status TAS: Bezczynny %1%2 - + TAS State: Invalid Status TAS: Niepoprawny - + &Stop Running &Wyłącz - + Stop R&ecording Przestań &Nagrywać - + Building: %n shader(s) Budowanie: %n shaderBudowanie: %n shaderyBudowanie: %n shaderówBudowanie: %n shaderów - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Prędkość: %1% / %2% - + Speed: %1% Prędkość: %1% - + Game: %1 FPS Gra: %1 FPS - + Frame: %1 ms Klatka: %1 ms - + NO AA BEZ AA - + VOLUME: MUTE Głośność: Wyciszony - + VOLUME: %1% Volume percentage (e.g. 50%) Głośność: %1% - + Derivation Components Missing Brak komponentów wyprowadzania - + Decryption keys are missing. Install them now? - + Wayland Detected! Wykryto Waylanda! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7940,74 +7932,74 @@ Zaleca się zamiast tego używać X11. Czy chcesz wymusić jego użycie przy przyszłych uruchomieniach? - + Use X11 Używaj X11 - + Continue with Wayland Kontynuuj z Waylandem - + Don't show again Nie pokazuj ponownie - + Restart Required Wymagane ponowne uruchomienie - + Restart Eden to apply the X11 backend. Uruchom ponownie Edena, aby zastosować backend X11. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target Wybierz cel zrzutu RomFS - + Please select which RomFS you would like to dump. Proszę wybrać RomFS, jakie chcesz zrzucić. - + Are you sure you want to close Eden? Czy na pewno chcesz zamknąć Edena? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Czy na pewno chcesz zatrzymać emulację? Wszystkie niezapisane postępy zostaną utracone. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9805,55 +9797,55 @@ Czy chcesz ręcznie wybrać folder przenośny do użycia? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10554,65 +10546,65 @@ Wybierając „Z Eden”, dotychczasowe dane zapisu przechowywane w Ryujinx zost - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index 7a483b3a20..d7dfe6bf1a 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -1547,7 +1547,6 @@ Quando um programa tenta abrir o applet, ele é imediatamente fechado. - None Nenhum @@ -1612,563 +1611,553 @@ Quando um programa tenta abrir o applet, ele é imediatamente fechado.16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) Polonês (polska) - + Thai (แบบไทย) Tailandês (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egito - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irã - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polônia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Ancorado - + Handheld Portátil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - + Very Small (16 MB) Muito Pequeno (16 MB) - + Small (32 MB) Pequeno (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muito Grande (512 MB) - + Very Low (4 MB) Muito Baixo (4 MB) - + Low (8 MB) Baixo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Médio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muito Baixo (32) - + Low (64) Baixo (64) - + Normal (128) Normal (128) - + Medium (256) Médio (256) - + High (512) Alto (512) - + Disabled Desativado - + ExtendedDynamicState 1 Estado Dinâmico Estendido 1 - + ExtendedDynamicState 2 Estado Dinâmico Estendido 2 - + ExtendedDynamicState 3 Estado Dinâmico Estendido 3 - + Tree View Visualização em Árvore - + Grid View Visualização em Grade @@ -6930,7 +6919,7 @@ Mensagem de Depuração: - + &Pause &Pausa @@ -7086,7 +7075,7 @@ Mensagem de Depuração: - + &Start &Começar @@ -7097,7 +7086,7 @@ Mensagem de Depuração: - + R&ecord G&ravar @@ -7188,7 +7177,7 @@ Mensagem de Depuração: - + None Nenhum @@ -7209,720 +7198,723 @@ Mensagem de Depuração: - + Small (32x32) Pequeno (32x32) - + Standard (64x64) Padrão (64x64) - + Large (128x128) Grande (128x128) - + Full Size (256x256) Tamanho completo (256x256) - + Broken Vulkan Installation Detected Detectada Instalação Defeituosa do Vulkan - + Vulkan initialization failed during boot. Inicialização do Vulkan falhou durante o boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Rodando um jogo - + Loading Web Applet... Carregando Applet Web... - - + + Disable Web Applet Desativar Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Desativar o Applet Web pode problemas indefinidos e deverá apenas ser usando com o Super Mario 3D All-Stars. Você tem certeza que quer desativar o Applet Web? (Isso pode ser reativado nas Configurações de Depuração.) - + The amount of shaders currently being built A Quantidade total de Shaders está sendo atualmente construída - + The current selected resolution scaling multiplier. A atual multiplicação de escala de resolução selecionada. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocidade atual da emulação. Valores altos ou mais baixo que 100% indicam que o emulador está rodando mais rápido ou mais lento que um Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Quantos quadros por segundo o jogo está mostrando atualmente. Isto varia de jogo para jogo e de cena a cena. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory Selecionar Diretório - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory Abrir o Diretório da ROM extraída - + Invalid Directory Selected Diretório selecionado inválido - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed O Amiibo atual foi removido - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7930,74 +7922,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9778,55 +9770,55 @@ Gostaria de selecionar manualmente uma pasta portátil para usar? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 Falha ao criar um diretório temporário %1 - + Zip file %1 is empty @@ -10522,65 +10514,65 @@ Ao selecionar "Do Eden", os dados salvos anteriores armazenados no Ryu - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/pt_PT.ts b/dist/languages/pt_PT.ts index 142eab538e..19cffca27d 100644 --- a/dist/languages/pt_PT.ts +++ b/dist/languages/pt_PT.ts @@ -1499,7 +1499,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Nenhum @@ -1564,563 +1563,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - - - - - 64x - - - - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irão - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polónia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Ancorado - + Handheld Portátil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6861,7 +6850,7 @@ Debug Message: - + &Pause &Pausa @@ -7017,7 +7006,7 @@ Debug Message: - + &Start &Começar @@ -7028,7 +7017,7 @@ Debug Message: - + R&ecord G&ravar @@ -7119,7 +7108,7 @@ Debug Message: - + None @@ -7140,719 +7129,722 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7860,74 +7852,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9704,55 +9696,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10446,65 +10438,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 1f417a3177..3c80f8ee9d 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -1556,7 +1556,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Никакой @@ -1621,563 +1620,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) Японский (日本語) - + American English Американский английский - + French (français) Французский (français) - + German (Deutsch) Немецкий (Deutsch) - + Italian (italiano) Итальянский (italiano) - + Spanish (español) Испанский (español) - + Chinese Китайский - + Korean (한국어) Корейский (한국어) - + Dutch (Nederlands) Голландский (Nederlands) - + Portuguese (português) Португальский (português) - + Russian (Русский) Русский - + Taiwanese Тайваньский - + British English Британский английский - + Canadian French Канадский французский - + Latin American Spanish Латиноамериканский испанский - + Simplified Chinese Упрощённый китайский - + Traditional Chinese (正體中文) Традиционный китайский (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильский португальский (português do Brasil) - + Polish (polska) Польский (polska) - + Thai (แบบไทย) Тайский (แบบไทย) - - + + Japan Япония - + USA США - + Europe Европа - + Australia Австралия - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Авто (%1) - + Default (%1) Default time zone По умолчанию (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Египет - + Eire Эйре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Эйре - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвич - + Hongkong Гонконг - + HST HST - + Iceland Исландия - + Iran Иран - + Israel Израиль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Ливия - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польша - + Portugal Португалия - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сингапур - + Turkey Турция - + UCT UCT - + Universal Универсальный - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулу - + Mono Моно - + Stereo Стерео - + Surround Объемный звук - + 4GB DRAM (Default) 4 ГБ ОЗУ (По умолчанию) - + 6GB DRAM (Unsafe) 6 ГБ ОЗУ (Небезопасно) - + 8GB DRAM 8 ГБ ОЗУ - + 10GB DRAM (Unsafe) 10 ГБ ОЗУ (Небезопасно) - + 12GB DRAM (Unsafe) 12 ГБ ОЗУ (Небезопасно) - + Docked В док-станции - + Handheld Портативный - - + + Normal Нормальная - - + + Boost Ускоренная - - + + Overclock Разгон - + Always ask (Default) Всегда спрашивать (По умолчанию) - + Only if game specifies not to stop Только если игра указывает не останавливать - + Never ask Никогда не спрашивать - + Very Small (16 MB) Очень маленький (16 МБ) - + Small (32 MB) Маленький (32 МБ) - + Normal (128 MB) Нормальный (128 МБ) - + Large (256 MB) Большой (256 МБ) - + Very Large (512 MB) Очень большой (512 МБ) - + Very Low (4 MB) Очень низкий (4 МБ) - + Low (8 MB) Низкий (8 МБ) - + Normal (16 MB) Нормальный (16 МБ) - + Medium (32 MB) Средний (32 МБ) - + High (64 MB) Высокий (64 МБ) - + Very Low (32) Очень низкий (32) - + Low (64) Низкий (64) - + Normal (128) Нормальный (128) - + Medium (256) Средний (256) - + High (512) Высокий (512) - + Disabled Отключено - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View Древовидный - + Grid View Сетчатый @@ -6947,7 +6936,7 @@ Debug Message: - + &Pause &Пауза @@ -7103,7 +7092,7 @@ Debug Message: - + &Start &Запустить @@ -7114,7 +7103,7 @@ Debug Message: - + R&ecord З&апись @@ -7205,7 +7194,7 @@ Debug Message: - + None Никакой @@ -7226,397 +7215,400 @@ Debug Message: &В Виде Карусели - + Small (32x32) Маленький (32х32) - + Standard (64x64) Стандартный (64х64) - + Large (128x128) Большой (128х128) - + Full Size (256x256) Полноразмерный (256х256) - + Broken Vulkan Installation Detected Обнаружена поврежденная установка Vulkan - + Vulkan initialization failed during boot. Не удалось выполнить инициализацию Vulkan во время загрузки. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Запущена игра - + Loading Web Applet... Загрузка веб-апплета... - - + + Disable Web Applet Отключить веб-апплет - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Отключение веб-апплета может привести к неожиданному поведению и должно использоваться только, если вы хотите запустить Super Mario 3D All-Stars. Вы уверены, что хотите отключить веб-апплет? (Его можно снова включить в настройках отладки.) - + The amount of shaders currently being built Количество создаваемых шейдеров на данный момент - + The current selected resolution scaling multiplier. Текущий выбранный множитель масштабирования разрешения. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Текущая скорость эмуляции. Значения выше или ниже 100% указывают на то, что эмуляция идет быстрее или медленнее, чем на Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Количество кадров в секунду в данный момент. Значение будет различаться между играми и сценами. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Время, которое нужно для эмуляции одного кадра Switch, не принимая во внимание ограничение FPS или вертикальную синхронизацию. Для эмуляции в полной скорости значение должно быть не больше 16,67 мс. - + Unmute Включить звук - + Mute Выключить звук - + Reset Volume Сбросить громкость - + &Clear Recent Files &Очистить недавние файлы - + &Continue &Продолжить - + Warning: Outdated Game Format Предупреждение: устаревший формат игры - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Для этой игры вы используете разархивированный формат ROM'а, который является устаревшим и был заменен другими, такими как NCA, NAX, XCI или NSP. В разархивированных каталогах ROM'а отсутствуют иконки, метаданные и поддержка обновлений.<br><br>Для получения информации о различных форматах Switch, поддерживаемых Eden, ознакомьтесь с руководством пользователя. Это сообщение больше не будет отображаться. - - + + Error while loading ROM! Ошибка при загрузке ROM'а! - + The ROM format is not supported. Формат ROM'а не поддерживается. - + An error occurred initializing the video core. Произошла ошибка при инициализации видеоядра. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. Eden столкнулся с ошибкой при работе видеоядра. Обычно это вызвано устаревшими драйверами GPU, включая интегрированные. Проверьте журнал для получения подробностей. Информацию о том, как получить доступ к журналу, см. на странице: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>Как загрузить файл журнала</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Ошибка при загрузке ROM'а! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Пожалуйста, пересоздайте дампы ваших файлов или обратитесь за помощью в Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Произошла неизвестная ошибка. Пожалуйста, проверьте журнал для подробностей. - + + (64-bit) (64-bit) - + + (32-bit) (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Закрываем программу... - + Save Data Сохранения - + Mod Data Данные модов - + Error Opening %1 Folder Ошибка при открытии папки %1 - - + + Folder does not exist! Папка не существует! - + Remove Installed Game Contents? Удалить установленное содержимое игр? - + Remove Installed Game Update? Удалить установленное обновление игры? - + Remove Installed Game DLC? Удалить установленные DLC игры? - + Remove Entry Удалить запись - + Delete OpenGL Transferable Shader Cache? Удалить переносной кэш шейдеров OpenGL? - + Delete Vulkan Transferable Shader Cache? Удалить переносной кэш шейдеров Vulkan? - + Delete All Transferable Shader Caches? Удалить весь переносной кэш шейдеров? - + Remove Custom Game Configuration? Удалить пользовательскую настройку игры? - + Remove Cache Storage? Удалить кэш-хранилище? - + Remove File Удалить файл - + Remove Play Time Data Удалить данные игрового времени - + Reset play time? Сбросить время игры? - - + + RomFS Extraction Failed! Не удалось извлечь RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Произошла ошибка при копировании файлов RomFS или пользователь отменил операцию. - + Full Полный - + Skeleton Скелет - + Select RomFS Dump Mode Выберите режим дампа RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Пожалуйста, выберите, как вы хотите выполнить дамп RomFS. <br>Полный скопирует все файлы в новую папку, в то время как <br>скелет создаст только структуру папок. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root В %1 недостаточно свободного места для извлечения RomFS. Пожалуйста, освободите место или выберите другую папку для дампа в Эмуляция > Параметры > Система > Файловая система > Корень дампа - + Extracting RomFS... Извлечение RomFS... - - + + Cancel Отмена - + RomFS Extraction Succeeded! Извлечение RomFS прошло успешно! - + The operation completed successfully. Операция выполнена успешно. - + Error Opening %1 Ошибка при открытии %1 - + Select Directory Выбрать папку - + Properties Свойства - + The game properties could not be loaded. Не удалось загрузить свойства игры. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Исполняемый файл Switch (%1);;Все файлы (*.*) - + Load File Загрузить файл - + Open Extracted ROM Directory Открыть папку извлеченного ROM'а - + Invalid Directory Selected Выбрана недопустимая папка - + The directory you have selected does not contain a 'main' file. Папка, которую вы выбрали, не содержит файла 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Устанавливаемый файл Switch (*.nca *.nsp *.xci);;Архив контента Nintendo (*.nca);;Пакет подачи Nintendo (*.nsp);;Образ картриджа NX (*.xci) - + Install Files Установить файлы - + %n file(s) remaining %n файл(ов) осталось%n файл(ов) осталось%n файл(ов) осталось%n файл(ов) осталось - + Installing file "%1"... Установка "%1"... - - + + Install Results Результаты - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Чтобы избежать возможных конфликтов, мы не рекомендуем пользователям устанавливать игры в NAND. Пожалуйста, используйте эту функцию только для установки обновлений и DLC. - + %n file(s) were newly installed %n файл(ов) были установлены недавно @@ -7626,7 +7618,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten %n файл(ов) были перезаписаны @@ -7636,7 +7628,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install %n файл(ов) не удалось установить @@ -7646,314 +7638,314 @@ Please, only use this feature to install updates and DLC. - + System Application Системное приложение - + System Archive Системный архив - + System Application Update Обновление системного приложения - + Firmware Package (Type A) Пакет прошивки (Тип А) - + Firmware Package (Type B) Пакет прошивки (Тип Б) - + Game Игра - + Game Update Обновление игры - + Game DLC DLC игры - + Delta Title Дельта-титул - + Select NCA Install Type... Выберите тип установки NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Пожалуйста, выберите тип приложения, который вы хотите установить для этого NCA: (В большинстве случаев, подходит стандартный выбор «Игра».) - + Failed to Install Ошибка установки - + The title type you selected for the NCA is invalid. Тип приложения, который вы выбрали для NCA, недействителен. - + File not found Файл не найден - + File "%1" not found Файл "%1" не найден - + OK ОК - + Function Disabled Функция отключена - + Compatibility list reporting is currently disabled. Check back later! Отправка отчетов о совместимости временно отключена. Доступ будет восстановлен позднее! - + Error opening URL Ошибка при открытии URL - + Unable to open the URL "%1". Не удалось открыть URL: "%1". - + TAS Recording Запись TAS - + Overwrite file of player 1? Перезаписать файл игрока 1? - + Invalid config detected Обнаружена недопустимая конфигурация - + Handheld controller can't be used on docked mode. Pro controller will be selected. Портативный контроллер не может быть использован в режиме док-станции. Будет выбран контроллер Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Текущий amiibo был удален - + Error Ошибка - - + + The current game is not looking for amiibos Текущая игра не ищет amiibo - + Amiibo File (%1);; All Files (*.*) Файл Amiibo (%1);; Все Файлы (*.*) - + Load Amiibo Загрузить Amiibo - + Error loading Amiibo data Ошибка загрузки данных Amiibo - + The selected file is not a valid amiibo Выбранный файл не является допустимым amiibo - + The selected file is already on use Выбранный файл уже используется - + An unknown error occurred Произошла неизвестная ошибка - + No firmware available Прошивка недоступна - + Firmware Corrupted Прошивка повреждена - + Unknown applet Неизвестный апплет - + Applet doesn't map to a known value. Апплет не соответствует ни одному известному значению. - + Record not found Запись не найдена - + Applet not found. Please reinstall firmware. Апплет не найден. Пожалуйста, переустановите прошивку. - + Capture Screenshot Сделать скриншот - + PNG Image (*.png) Изображение PNG (*.png) - + TAS state: Running %1/%2 Состояние TAS: Выполняется %1/%2 - + TAS state: Recording %1 Состояние TAS: Записывается %1 - + TAS state: Idle %1/%2 Состояние TAS: Простой %1/%2 - + TAS State: Invalid Состояние TAS: Неверное - + &Stop Running &Остановка - + Stop R&ecording &Закончить запись - + Building: %n shader(s) Компиляция %n шейдер(ов)Компиляция %n шейдер(ов)Компиляция %n шейдер(ов)Компиляция %n шейдер(ов) - + Scale: %1x %1 is the resolution scaling factor Масштаб: %1x - + Speed: %1% / %2% Скорость: %1% / %2% - + Speed: %1% Скорость: %1% - + Game: %1 FPS Игра: %1 FPS - + Frame: %1 ms Кадр: %1 мс - + NO AA БЕЗ СГЛАЖИВАНИЯ - + VOLUME: MUTE ГРОМКОСТЬ: ЗАГЛУШЕНА - + VOLUME: %1% Volume percentage (e.g. 50%) ГРОМКОСТЬ: %1% - + Derivation Components Missing Отсутствуют необходимые компоненты - + Decryption keys are missing. Install them now? Ключи дешифрования отсутствуют. Хотите установить их? - + Wayland Detected! Обнаружен Wayland! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7964,74 +7956,74 @@ Would you like to force it for future launches? Хотите включить X11 для последующих запусков? - + Use X11 Использовать X11 - + Continue with Wayland Продолжить с Wayland - + Don't show again Больше не показывать - + Restart Required Требуется перезапуск - + Restart Eden to apply the X11 backend. Перезапустите Eden, чтобы применить X11. - + Slow Замедлено - + Turbo Турбо - + Unlocked Разблокировано - + Select RomFS Dump Target Выбор цели для дампа RomFS - + Please select which RomFS you would like to dump. Выберите RomFS, который вы хотите извлечь. - + Are you sure you want to close Eden? Вы уверены, что хотите закрыть Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Вы уверены, что хотите остановить эмуляцию? Любой несохраненный прогресс будет потерян. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9833,37 +9825,37 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name Название мода - + What should this mod be called? Как назвать этот мод? - + RomFS RomFS - + ExeFS/Patch ExeFS/Patch - + Cheat Чит - + Mod Type Тип мода - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. @@ -9872,18 +9864,18 @@ Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed Ошибка извлечения мода - + Failed to create temporary directory %1 Не удалось создать временную папку %1 - + Zip file %1 is empty ZIP-файл %1 пуст @@ -10585,66 +10577,66 @@ By selecting "From Eden", previous save data stored in Ryujinx will be %1 доступна для загрузки. - + New Version Location Местоположение новой версии - + All Files (*.*) Все файлы (*.*) - - - + + + Failed to save file Не удалось сохранить файл - + Could not open file %1 for writing. Не удалось открыть файл %1 для записи. - + Downloading... Загрузка... - + Cancel Отмена - + Could not write to file %1. Не удалось записать в файл %1. - + Could not commit to file %1. Не удалось сохранить файл %1. - + Failed to download file Не удалось загрузить файл - + Could not download from %1%2 Error code: %3 Не удалось загрузить из %1%2 Код ошибки: %3 - + Download Complete Загрузка завершена - + Successfully downloaded %1. Would you like to open it? %1 был успешно загружен. Хотите открыть? diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index ddbd8f9888..089601486d 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -429,13 +429,14 @@ Kan bidra till att minska hackande vid lägre bildfrekvenser. CPU Clocks - + CPU-klockfrekvenser Raises the clock the emulated CPU reports, which removes some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. - + Höjer den klockfrekvens som den emulerade processorn rapporterar, vilket tar bort vissa FPS-begränsare. +Svagare processorer kan få sämre prestanda, och vissa spel kan fungera felaktigt. @@ -576,7 +577,7 @@ Alternativ lägre än 1X kan orsaka artefakter. Determines how sharpened the image will look using FSR's or SGSR's dynamic contrast. - + Avgör hur skarp bilden ser ut med FSR:s eller SGSR:s dynamiska kontrast. @@ -797,7 +798,9 @@ Säker att ställa in på 16x på de flesta GPU:er. Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + Styr GPU-emuleringsläget. +De flesta spel återges bra med Snabb, men Exakt krävs fortfarande för vissa. +Partiklar återges ofta korrekt endast i läget Exakt. @@ -809,12 +812,14 @@ Particles tend to only render correctly with Accurate mode. Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + Styr DMA-läget för läsning. +Osäker är snabbare, medan Säker är stabilare och kan lösa problem i vissa spel. +Standard följer inställningen för GPU-noggrannhet. GPU Fence Behavior: - + Beteende för GPU-staket: @@ -824,18 +829,24 @@ Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. Strict is the slowest option, but can fix issues that require stricter synchronization. Default follows the GPU Accuracy setting. - + Styr synkroniseringsbeteendet för GPU-staket. +Omedelbar är det snabbaste alternativet, men kan orsaka vissa problem. +Balanserad ger bättre kompatibilitet och kan lösa problem i vissa spel. +Exakt förbättrar kompatibiliteten ytterligare på bekostnad av viss prestanda. +Strikt är långsammast, men kan lösa problem som kräver striktare synkronisering. +Standard följer inställningen för GPU-noggrannhet. Enable GPU buffer readback - + Aktivera återläsning av GPU-buffert Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Bevarar data som ändrats av GPU:n genom att läsa tillbaka dem före uppladdning. +Vissa spel kräver detta för att vissa effekter ska återges korrekt. @@ -850,12 +861,12 @@ Some games require this to render certain effects properly. GPU Clocks - + GPU-klockfrekvenser Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + Får spelet att tro att GPU-arbetet avslutas snabbare än det gör, så att det slutar sänka upplösning och ritaravstånd för att passa Switch-klockfrekvenserna. @@ -1056,12 +1067,12 @@ Används främst för speedrunning. Homebrew Args - + Homebrew-argument Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Kommandoradsargument som skickas till homebrew vid start (t.ex. -noglsl). @@ -1351,7 +1362,7 @@ När ett program försöker öppna kontrollerappletten stängs den omedelbart. Immediate - + Omedelbar @@ -1361,7 +1372,7 @@ När ett program försöker öppna kontrollerappletten stängs den omedelbart. Strict - + Strikt @@ -1546,16 +1557,15 @@ När ett program försöker öppna kontrollerappletten stängs den omedelbart. Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution EdgeDir - + Snapdragon Game Super Resolution EdgeDir - None Ingen @@ -1620,563 +1630,553 @@ När ett program försöker öppna kontrollerappletten stängs den omedelbart.16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) Japanska (日本語) - + American English Amerikansk engelska - + French (français) Franska (français) - + German (Deutsch) Tyska (Deutsch) - + Italian (italiano) Italienska (italiano) - + Spanish (español) Spanska (español) - + Chinese Kinesiska - + Korean (한국어) Koreanska (한국어) - + Dutch (Nederlands) Nederländska (Nederlands) - + Portuguese (português) Portugisiska (português) - + Russian (Русский) Ryska (Русский) - + Taiwanese Taiwanesiska - + British English Brittisk engelska - + Canadian French Kanadensisk franska - + Latin American Spanish Latinamerikansk spanska - + Simplified Chinese Förenklad kinesiska - + Traditional Chinese (正體中文) Traditionell kinesiska (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisiska (português do Brasil) - + Polish (polska) Polska (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egypten - + Eire Irland - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irland - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkiet - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET VÅT - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (osäker) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (osäker) - + 12GB DRAM (Unsafe) 12 GB DRAM (osäker) - + Docked Dockad - + Handheld Handhållen - - + + Normal - + Normal - - + + Boost - + Förstärk - - + + Overclock - + Överklocka - + Always ask (Default) Fråga alltid (standard) - + Only if game specifies not to stop Endast om spelet anger att det inte ska stoppas - + Never ask Fråga aldrig - + Very Small (16 MB) Mycket liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Mycket stor (512 MB) - + Very Low (4 MB) Mycket låg (4 MB) - + Low (8 MB) Låg (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medium (32 MB) - + High (64 MB) Hög (64 MB) - + Very Low (32) Mycket låg (32) - + Low (64) Låg (64) - + Normal (128) Normal (128) - + Medium (256) Medium (256) - + High (512) Hög (512) - + Disabled Inaktiverad - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View Trädvy - + Grid View Rutnätsvy @@ -2538,37 +2538,37 @@ När ett program försöker öppna kontrollerappletten stängs den omedelbart. GPU Logging/Level - + GPU-loggning/-nivå Detail level for GPU logs. Off disables logging entirely. - + Detaljnivå för GPU-loggar. Av stänger av loggningen helt. Off - + Av Errors - + Fel Standard - + Standard Verbose - + Utförlig All - + Alla @@ -2638,12 +2638,12 @@ När ett program försöker öppna kontrollerappletten stängs den omedelbart. When checked, it will dump original Maxwell guest shader bytecode (the input to the recompiler) as .ash files under DumpDir/shaders/. Useful for inspection with nvdisasm. - + När detta är markerat dumpas den ursprungliga Maxwell-gästshaderns bytekod (indata till omkompilatorn) som .ash-filer under DumpDir/shaders/. Användbart för granskning med nvdisasm. Dump Guest (Maxwell) Shaders - + Dumpa gästshaders (Maxwell) @@ -2703,12 +2703,12 @@ När ett program försöker öppna kontrollerappletten stängs den omedelbart. When checked, it will dump the recompiler's output SPIR-V binaries (.spv) under LogDir/shaders/. Inspect via SPIRV-Tools (spirv-dis / spirv-cross / spirv-val) or RenderDoc. - + När detta är markerat dumpas omkompilatorns SPIR-V-binärer (.spv) under LogDir/shaders/. Granska dem med SPIRV-Tools (spirv-dis / spirv-cross / spirv-val) eller RenderDoc. Dump SPIR-V Shaders - + Dumpa SPIR-V-shaders @@ -2768,7 +2768,7 @@ När ett program försöker öppna kontrollerappletten stängs den omedelbart. Debug Knobs: - + Felsökningsreglage: @@ -3291,7 +3291,7 @@ Vill du ta bort gammalt sparat data? % FSR/SGSR sharpening percentage (e.g. 50%) - + % @@ -3838,12 +3838,12 @@ Vill du ta bort gammalt sparat data? Aimed to disable SDL GUIDE button hack: synthetic GUIDE(HOME) event when SELECT(MINUS) + START(PLUS) pressed. May impact Win related trigger/rumble/etc stuff - + Avsedd att stänga av SDL:s GUIDE-knappshack: syntetisk GUIDE(HOME)-händelse när SELECT(MINUS) + START(PLUS) trycks ned. Kan påverka Windows-relaterade avtryckare, vibrationer med mera. Disable SDL WGI/XInput (Requires restart) - + Inaktivera SDL WGI/XInput (kräver omstart) @@ -5764,12 +5764,12 @@ Dra punkterna för att ändra position, eller dubbelklicka på tabellcellerna f User NAND - + Användar-NAND System NAND - + System-NAND @@ -6064,7 +6064,7 @@ Gå till Konfigurera -> System -> Nätverk och gör ett val. This build doesn't have OpenGL support. - + Den här versionen saknar stöd för OpenGL. @@ -6309,27 +6309,27 @@ Gå till Konfigurera -> System -> Nätverk och gör ett val. Name - + Namn Add-ons - + Tillägg File type - + Filtyp Size - + Storlek Play time - + Speltid @@ -6945,7 +6945,7 @@ Felsökningsmeddelande: - + &Pause &Paus @@ -7101,7 +7101,7 @@ Felsökningsmeddelande: - + &Start &Starta @@ -7112,7 +7112,7 @@ Felsökningsmeddelande: - + R&ecord Spela &in @@ -7203,7 +7203,7 @@ Felsökningsmeddelande: - + None Ingen @@ -7221,400 +7221,403 @@ Felsökningsmeddelande: &Carousel View - + &Karusellvy - + Small (32x32) Liten (32x32) - + Standard (64x64) Standard (64x64) - + Large (128x128) Stor (128x128) - + Full Size (256x256) Full storlek (256x256) - + Broken Vulkan Installation Detected Felaktig Vulkan-installation upptäcktes - + Vulkan initialization failed during boot. Vulkan-initialiseringen misslyckades under uppstarten. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Kör ett spel - + Loading Web Applet... Läser in webbapplet... - - + + Disable Web Applet Inaktivera webbapplet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Att inaktivera webbappletten kan leda till odefinierat beteende och bör endast användas med Super Mario 3D All-Stars. Är du säker på att du vill inaktivera webbappletten? (Detta kan återaktiveras i felsökningsinställningarna.) - + The amount of shaders currently being built Antalet shaders som för närvarande byggs - + The current selected resolution scaling multiplier. Den aktuella valda multiplikatorn för upplösningsskalning. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Aktuell emuleringshastighet. Värden högre eller lägre än 100% indikerar att emuleringen körs snabbare eller långsammare än en Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Hur många bildrutor per sekund spelet för närvarande visar. Detta varierar från spel till spel och från scen till scen. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tid som krävs för att emulera en Switch-bildruta, exklusive bildbegränsning eller v-synkronisering. För emulering i full hastighet bör detta vara högst 16,67 ms. - + Unmute Aktivera ljud - + Mute Tyst - + Reset Volume Återställ volym - + &Clear Recent Files &Töm tidigare filer - + &Continue &Fortsätt - + Warning: Outdated Game Format Varning: Föråldrat spelformat - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Du använder det dekonstruerade ROM-katalogformatet för detta spel, vilket är ett föråldrat format som har ersatts av andra format såsom NCA, NAX, XCI eller NSP. Dekonstruerade ROM-kataloger saknar ikoner, metadata och uppdateringsstöd.<br> För en förklaring av de olika Switch-format som Eden har stöd för, se vår användarhandbok. Detta meddelande kommer inte att visas igen. - - + + Error while loading ROM! Fel vid inläsning av ROM! - + The ROM format is not supported. ROM-formatet stöds inte. - + An error occurred initializing the video core. Ett fel uppstod vid initialiseringen av videokärnan. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. Eden har stött på ett fel vid körning av videokärnan. Detta orsakas vanligtvis av föråldrade GPU-drivrutiner, inklusive integrerade sådana. Se loggen för mer information. För mer information om hur du kommer åt loggen, se följande sida: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>Hur man laddar upp loggfilen</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Fel vid inläsning av ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Dumpa dina filer igen eller fråga på Discord/Stoat för hjälp. - + An unknown error occurred. Please see the log for more details. Ett okänt fel har uppstått. Se loggen för mer information. - + + (64-bit) (64-bitar) - + + (32-bit) (32-bitar) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Stänger programvara... - + Save Data Sparat data - + Mod Data Mod-data - + Error Opening %1 Folder Fel vid öppning av mappen %1 - - + + Folder does not exist! Mappen finns inte! - + Remove Installed Game Contents? Ta bort installerat spelinnehåll? - + Remove Installed Game Update? Ta bort installerad speluppdatering? - + Remove Installed Game DLC? Ta bort installerat spel-DLC? - + Remove Entry Ta bort post - + Delete OpenGL Transferable Shader Cache? Ta bort OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? Ta bort Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? Ta bort alla Transferable Shader Caches? - + Remove Custom Game Configuration? Ta bort anpassad spelkonfiguration? - + Remove Cache Storage? Ta bort cachelagring? - + Remove File Ta bort fil - + Remove Play Time Data Ta bort data om speltid - + Reset play time? Nollställ speltid? - - + + RomFS Extraction Failed! Extrahering av RomFS misslyckades! - + There was an error copying the RomFS files or the user cancelled the operation. Det uppstod ett fel vid kopieringen av RomFS-filerna eller så avbröt användaren åtgärden. - + Full Fullständigt - + Skeleton Skelett - + Select RomFS Dump Mode Välj dumpläge för RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Välj hur du vill att RomFS ska dumpas. <br>Fullständigt kopierar alla filer till den nya katalogen, medan <br>skelett endast skapar katalogstrukturen. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Det finns inte tillräckligt med ledigt utrymme på %1 för att extrahera RomFS. Frigör utrymme eller välj en annan dumpkatalog under Emulering > Konfigurera > System > Filsystem > Dumprot. - + Extracting RomFS... Extraherar RomFS... - - + + Cancel Avbryt - + RomFS Extraction Succeeded! Extrahering av RomFS lyckades! - + The operation completed successfully. Operationen slutfördes. - + Error Opening %1 Fel vid öppning av %1 - + Select Directory Välj katalog - + Properties Egenskaper - + The game properties could not be loaded. Spelegenskaperna kunde inte läsas in. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Körbar Switch-fil (%1);;Alla filer (*.*) - + Load File Läs in fil - + Open Extracted ROM Directory Öppna katalog för extraherad ROM - + Invalid Directory Selected Ogiltig katalog valdes - + The directory you have selected does not contain a 'main' file. Den katalog du har valt innehåller ingen ”main”-fil. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installerbar Switch-fil (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Installera filer - + %n file(s) remaining %n fil återstår%n filer återstår - + Installing file "%1"... Installerar filen "%1"... - - + + Install Results Installationsresultat - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. För att undvika eventuella konflikter avråder vi användare från att installera basspel på NAND. Använd endast denna funktion för att installera uppdateringar och DLC. - + %n file(s) were newly installed %n ny fil installerades @@ -7622,7 +7625,7 @@ Använd endast denna funktion för att installera uppdateringar och DLC. - + %n file(s) were overwritten %n fil skrevs över @@ -7630,7 +7633,7 @@ Använd endast denna funktion för att installera uppdateringar och DLC. - + %n file(s) failed to install %n fil gick inte att installera @@ -7638,314 +7641,314 @@ Använd endast denna funktion för att installera uppdateringar och DLC. - + System Application Systemapplikation - + System Archive Systemarkiv - + System Application Update Uppdatering för systemapplikation - + Firmware Package (Type A) Firmware-paket (Type A) - + Firmware Package (Type B) Firmware-paket (Type B) - + Game Spel - + Game Update Speluppdatering - + Game DLC DLC för spel - + Delta Title Deltatitel - + Select NCA Install Type... Välj NCA-installationstyp... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Välj vilken typ av titel du vill installera denna NCA som: (I de flesta fall är standardinställningen ”Spel” tillräcklig.) - + Failed to Install Misslyckades med att installera - + The title type you selected for the NCA is invalid. Den titeltypen du valt för NCA är ogiltig. - + File not found Filen hittades inte - + File "%1" not found Filen "%1" hittades inte - + OK Ok - + Function Disabled Funktion inaktiverad - + Compatibility list reporting is currently disabled. Check back later! Rapportering till kompatibilitetslistan är för närvarande inaktiverad. Kom tillbaka senare! - + Error opening URL Fel vid öppning av URL - + Unable to open the URL "%1". Det går inte att öppna URL:en ”%1”. - + TAS Recording TAS-inspelning - + Overwrite file of player 1? Skriv över fil för spelare 1? - + Invalid config detected Ogiltig konfiguration upptäcktes - + Handheld controller can't be used on docked mode. Pro controller will be selected. Handhållen kontroller kan inte användas i dockat läge. Pro-kontrollern kommer att väljas. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Den aktuella amiibo har tagits bort. - + Error Fel - - + + The current game is not looking for amiibos Det aktuella spelet letar inte efter amiibos - + Amiibo File (%1);; All Files (*.*) Amiibo-fil (%1);; Alla filer (*.*) - + Load Amiibo Läs in Amiibo - + Error loading Amiibo data Fel vid läsning av Amiibo-data - + The selected file is not a valid amiibo Den valda filen är inte en giltig amiibo. - + The selected file is already on use Den valda filen används redan - + An unknown error occurred Ett okänt fel uppstod - + No firmware available Ingen firmware tillgänglig - + Firmware Corrupted Firmware är skadat - + Unknown applet Okänd applet - + Applet doesn't map to a known value. Appleten mappar inte till ett känt värde. - + Record not found Posten hittades inte - + Applet not found. Please reinstall firmware. Appleten hittades inte. Installera om fast programvara. - + Capture Screenshot Ta skärmbild - + PNG Image (*.png) PNG-bild (*.png) - + TAS state: Running %1/%2 TAS-tillstånd: Kör %1/%2 - + TAS state: Recording %1 TAS-tillstånd: Spelar in %1 - + TAS state: Idle %1/%2 TAS-tillstånd: Overksam %1/%2 - + TAS State: Invalid TAS-tillstånd: Ogiltig - + &Stop Running &Stoppa körning - + Stop R&ecording Stoppa i&nspelning - + Building: %n shader(s) Bygger: %n shaderBygger: %n shaders - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Hastighet: %1% / %2% - + Speed: %1% Hastighet: %1% - + Game: %1 FPS Spel: %1 bilder/s - + Frame: %1 ms Bildruta: %1 ms - + NO AA NO AA - + VOLUME: MUTE VOLYM: TYST - + VOLUME: %1% Volume percentage (e.g. 50%) VOLYM: %1% - + Derivation Components Missing Deriveringskomponenter saknas - + Decryption keys are missing. Install them now? Avkrypteringsnycklar saknas. Installera dem nu? - + Wayland Detected! Wayland upptäcktes! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7956,74 +7959,74 @@ Det rekommenderas att använda X11 istället. Vill du tvinga det för framtida starter? - + Use X11 Använd X11 - + Continue with Wayland Fortsätt med Wayland - + Don't show again Visa inte igen - + Restart Required Omstart krävs - + Restart Eden to apply the X11 backend. Starta om Eden för att tillämpa X11-backend. - + Slow Långsam - + Turbo Turbo - + Unlocked Upplåst - + Select RomFS Dump Target Välj RomFS-dumpmål - + Please select which RomFS you would like to dump. Välj vilken RomFS du vill dumpa. - + Are you sure you want to close Eden? Är du säker på att du vill stänga Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Är du säker på att du vill stoppa emuleringen? Alla osparade framsteg kommer att gå förlorade. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -8109,12 +8112,12 @@ Vill du kringgå detta och stänga ändå? SGSR - + SGSR SGSR EdgeDir - + SGSR EdgeDir @@ -8210,7 +8213,7 @@ Om du vill rensa upp bland de filer som låg kvar på den gamla dataplatsen kan Import Mods - + Importera moddar @@ -9473,34 +9476,36 @@ Gör detta endast om du är 100% säker på att du vill radera dessa data. Keys not installed - + Nycklar är inte installerade Install decryption keys and restart Eden before attempting to install firmware. - + Installera dekrypteringsnycklar och starta om Eden innan du försöker installera fast programvara. Select Dumped Firmware Source Location - + Välj platsen för den dumpade fasta programvaran Select Dumped Firmware ZIP - + Välj ZIP-fil med dumpad fast programvara Firmware cleanup failed - + Rensning av fast programvara misslyckades Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 - + Kunde inte rensa cacheminnet för extraherad fast programvara. +Kontrollera skrivbehörigheten i systemets tillfälliga katalog och försök igen. +Operativsystemet rapporterade fel: %1 @@ -9823,37 +9828,37 @@ Vill du manuellt välja en portabel mapp att använda? QtCommon::Mod - + Mod Name Modnamn - + What should this mod be called? Vad ska denna mod heta? - + RomFS RomFS - + ExeFS/Patch ExeFS/Patch - + Cheat Fusk - + Mod Type Modtyp - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. @@ -9862,18 +9867,18 @@ Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed Mod-extrahering misslyckades - + Failed to create temporary directory %1 Det gick inte att skapa den tillfälliga katalogen %1 - + Zip file %1 is empty Zip-filen %1 är tom @@ -10575,67 +10580,68 @@ Om du väljer ”Från Eden” tas tidigare sparade data bort som lagrats i Ryuj %1 finns tillgänglig för hämtning. - + New Version Location - + Plats för ny version - + All Files (*.*) Alla filer (*.*) - - - + + + Failed to save file Misslyckades med att spara filen - + Could not open file %1 for writing. Kunde inte öppna filen %1 för skrivning. - + Downloading... Hämtar ner... - + Cancel Avbryt - + Could not write to file %1. - + Kunde inte skriva till filen %1. - + Could not commit to file %1. - - - - - Failed to download file - + Kunde inte verkställa ändringar i filen %1. - Could not download from %1%2 -Error code: %3 - + Failed to download file + Kunde inte hämta filen - - Download Complete - + + Could not download from %1%2 +Error code: %3 + Kunde inte hämta från %1%2 +Felkod: %3 + Download Complete + Hämtningen är klar + + + Successfully downloaded %1. Would you like to open it? - + %1 har hämtats. Vill du öppna den? \ No newline at end of file diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index faf5cb9283..4cfb643668 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -1508,7 +1508,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Yok @@ -1573,563 +1572,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) Japonca (日本語) - + American English Amerikan İngilizcesi - + French (français) Fransızca (français) - + German (Deutsch) Almanca (Deutsch) - + Italian (italiano) İtalyanca (italiano) - + Spanish (español) İspanyolca (español) - + Chinese Çince - + Korean (한국어) Korece (한국어) - + Dutch (Nederlands) Flemenkçe (Nederlands) - + Portuguese (português) Portekizce (português) - + Russian (Русский) Rusça (Русский) - + Taiwanese Tayvanca - + British English İngiliz İngilizcesi - + Canadian French Kanada Fransızcası - + Latin American Spanish Latin Amerika İspanyolcası - + Simplified Chinese Basitleştirilmiş Çince - + Traditional Chinese (正體中文) Geleneksel Çince (正體中文) - + Brazilian Portuguese (português do Brasil) Brezilya Portekizcesi (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonya - + USA ABD - + Europe Avrupa - + Australia Avustralya - + China Çin - + Korea Kore - + Taiwan Tayvan - + Auto (%1) Auto select time zone Otomatik (%1) - + Default (%1) Default time zone Varsayılan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Küba - + EET EET - + Egypt Mısır - + Eire İrlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-İrlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 MT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland İzlanda - + Iran İran - + Israel İsrail - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navaho - + NZ Yeni Zelanda - + NZ-CHAT Chatham Adaları - + Poland Polonya - + Portugal Portekiz - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkiye - + UCT UCT - + Universal Evrensel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Varsayılan) - + 6GB DRAM (Unsafe) 6GB DRAM (Güvenli Değil) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Güvenli Değil) - + 12GB DRAM (Unsafe) 12GB DRAM (Güvenli Değil) - + Docked Dock Modu Aktif - + Handheld Taşınabilir - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Her zaman sor (Varsayılan) - + Only if game specifies not to stop Sadece oyun durdurulmamasını belirtirse - + Never ask Asla sorma - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Orta (256) - + High (512) Yüksek (512) - + Disabled Devre Dışı - + ExtendedDynamicState 1 Genişletilmiş Dinamik Durum 1 - + ExtendedDynamicState 2 Genişletilmiş Dinamik Durum 2 - + ExtendedDynamicState 3 Genişletilmiş Dinamik Durum 3 - + Tree View - + Grid View @@ -6888,7 +6877,7 @@ Debug Message: - + &Pause &Duraklat @@ -7044,7 +7033,7 @@ Debug Message: - + &Start B&aşlat @@ -7055,7 +7044,7 @@ Debug Message: - + R&ecord K&aydet @@ -7146,7 +7135,7 @@ Debug Message: - + None @@ -7167,719 +7156,722 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected Bozuk Vulkan Kurulumu Algılandı - + Vulkan initialization failed during boot. Açılış sırasında Vulkan başlatma işlemi başarısız oldu. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Bir oyun çalıştırılıyor - + Loading Web Applet... Web Uygulaması Yükleniyor... - - + + Disable Web Applet Web Uygulamasını Devre Dışı Bırak - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Sesi aç - + Mute Sessize al - + Reset Volume Sesi Sıfırla - + &Clear Recent Files &Son Dosyaları Temizle - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL URL açılırken hata oluştu - + Unable to open the URL "%1". - + TAS Recording TAS İşlemi Kaydı - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Mevcut Amiibo kaldırıldı - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted Donanım Yazılımı/Firmware Bozuk - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 TAS durumu: %1/%2 Çalışıyor - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Ölçek: %1x - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7887,74 +7879,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9731,55 +9723,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10473,65 +10465,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/uk.ts b/dist/languages/uk.ts index e51e19bb9d..b1df1267f4 100644 --- a/dist/languages/uk.ts +++ b/dist/languages/uk.ts @@ -1552,7 +1552,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Немає @@ -1617,563 +1616,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) Японська (日本語) - + American English Американська англійська - + French (français) Французька (français) - + German (Deutsch) Німецька (Deutsch) - + Italian (italiano) Італійська (italiano) - + Spanish (español) Іспанська (español) - + Chinese Китайська - + Korean (한국어) Корейська (한국어) - + Dutch (Nederlands) Нідерландська (Nederlands) - + Portuguese (português) Португальська (português) - + Russian (Русский) Російська (Русский) - + Taiwanese Тайванська - + British English Британська англійська - + Canadian French Канадська французька - + Latin American Spanish Латиноамериканська іспанська - + Simplified Chinese Спрощена китайська - + Traditional Chinese (正體中文) Традиційна китайська (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильська португальська (português do Brasil) - + Polish (polska) Польська (polska) - + Thai (แบบไทย) Тайська (แบบไทย) - - + + Japan Японія - + USA США - + Europe Європа - + Australia Австралія - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Автоматично (%1) - + Default (%1) Default time zone Стандартно (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Єгипет - + Eire Ейре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвіч - + Hongkong Гонконг - + HST HST - + Iceland Ісландія - + Iran Іран - + Israel Ізраїль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Лівія - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польща - + Portugal Португалія - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сінгапур - + Turkey Туреччина - + UCT UCT - + Universal Універсальний - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулу - + Mono Моно - + Stereo Стерео - + Surround Об’ємний - + 4GB DRAM (Default) 4GB DRAM (стандартно) - + 6GB DRAM (Unsafe) 6GB DRAM (небезпечно) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (небезпечно) - + 12GB DRAM (Unsafe) 12GB DRAM (небезпечно) - + Docked У докстанції - + Handheld Портативний - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Завжди запитувати (стандартно) - + Only if game specifies not to stop Лише якщо гра вказує не зупиняти - + Never ask Ніколи не запитувати - + Very Small (16 MB) Дуже малий (16 МБ) - + Small (32 MB) Малий (32 МБ) - + Normal (128 MB) Нормальний (128 МБ) - + Large (256 MB) Великий (256 МБ) - + Very Large (512 MB) Дуже великий (512 МБ) - + Very Low (4 MB) Дуже низький (4 МБ) - + Low (8 MB) Низький (8 МБ) - + Normal (16 MB) Нормальний (16 МБ) - + Medium (32 MB) Середній (32 МБ) - + High (64 MB) Високий (64 МБ) - + Very Low (32) Дуже низький (32) - + Low (64) Низький (64) - + Normal (128) Нормальний (128) - + Medium (256) Середньо (256) - + High (512) Високо (512) - + Disabled Вимкнено - + ExtendedDynamicState 1 Розширений динамічний стан 1 - + ExtendedDynamicState 2 Розширений динамічний стан 2 - + ExtendedDynamicState 3 Розширений динамічний стан 3 - + Tree View Дерево вибору - + Grid View Таблиця @@ -6942,7 +6931,7 @@ Debug Message: - + &Pause [&P] Призупинити @@ -7098,7 +7087,7 @@ Debug Message: - + &Start [&S] Запустити @@ -7109,7 +7098,7 @@ Debug Message: - + R&ecord [&E] Запис @@ -7200,7 +7189,7 @@ Debug Message: - + None Жодного @@ -7221,397 +7210,400 @@ Debug Message: - + Small (32x32) Маленький (32х32) - + Standard (64x64) Стандартний (64х64) - + Large (128x128) Великий (128х128) - + Full Size (256x256) Повнорозмірний (256х256) - + Broken Vulkan Installation Detected Виявлено пошкоджене встановлення Vulkan - + Vulkan initialization failed during boot. Не вдалося ініціалізувати Vulkan під час запуску. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Запущено гру - + Loading Web Applet... Завантаження вебаплета... - - + + Disable Web Applet Вимкнути вебаплет - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Вимкнення вебапплета може призвести до несподіваної поведінки, і це слід робити лише для Super Mario 3D All-Stars. Ви впевнені, що хочете вимкнути вебапплет? (Його можна знову увімкнути в налаштуваннях зневадження.) - + The amount of shaders currently being built Кількість наразі створених шейдерів - + The current selected resolution scaling multiplier. Наразі вибраний множник масштабування роздільності. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Поточна швидкість емуляції. Значення вище або нижче 100% вказують на те, що емуляція йде швидше або повільніше, ніж на Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Частота кадрів, яку наразі показує гра. Значення змінюватиметься залежно від гри та з кожною сценою. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Час, потрібний для емуляції 1 кадру Switch, не враховуючи обмеження частоти кадрів або вертикальну синхронізацію. Для повношвидкісної емуляції значення повинно бути не вище 16,67 мс. - + Unmute Увімкнути звук - + Mute Вимкнути звук - + Reset Volume Скинути гучність - + &Clear Recent Files [&C] Очистити нещодавні файли - + &Continue [&C] Продовжити - + Warning: Outdated Game Format Увага: Застарілий формат гри - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Для цієї гри ви використовуєте формат теки з деконструйованим ROM, який є застарілим форматом, заміненим на інші, як-от NCA, NAX, XCI, або NSP. У тек із деконструйованими ROM немає значків, метаданих, а також вони не підтримують оновлення.<br>Для подробиць стосовно різноманітних форматів Switch, які підтримує Eden, ознайомтеся з нашим посібником користувача. Це повідомлення не буде показано знову. - - + + Error while loading ROM! Помилка під час завантаження ROM! - + The ROM format is not supported. Непідтримуваний формат ROM. - + An error occurred initializing the video core. Сталася помилка під час ініціалізації відеоядра. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. В Eden сталася помилка під час роботи відеоядра. Зазвичай це відбувається через застарілі драйвери ГП, зокрема інтегрованих. Для подробиць перегляньте журнал. Для додаткової інформації стосовно доступу до журналу перегляньте таку сторінку: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>Як відвантажити файл журналу</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Помилка під час завантаження ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Створіть новий дамп файлів або зверніться по допомогу в Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Сталася невідома помилка. Ознайомтеся з журналом, щоб дізнатися подробиці. - + + (64-bit) (64-бітовий) - + + (32-bit) (32-бітовий) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Закриття програмного засобу... - + Save Data Дані збережень - + Mod Data Дані модів - + Error Opening %1 Folder Помилка під час відкриття теки «%1» - - + + Folder does not exist! Теки не існує! - + Remove Installed Game Contents? Вилучити встановлений вміст гри? - + Remove Installed Game Update? Вилучити встановлені оновлення гри? - + Remove Installed Game DLC? Вилучити встановлені доповнення гри? - + Remove Entry Вилучити запис - + Delete OpenGL Transferable Shader Cache? Видалити переміщуваний кеш шейдерів OpenGL? - + Delete Vulkan Transferable Shader Cache? Видалити переміщуваний кеш шейдерів Vulkan? - + Delete All Transferable Shader Caches? Видалити весь переміщуваний кеш шейдерів? - + Remove Custom Game Configuration? Вилучити користувацькі налаштування гри? - + Remove Cache Storage? Вилучити сховище кешу? - + Remove File Вилучити файл - + Remove Play Time Data Вилучити дані награного часу - + Reset play time? Скинути награний час? - - + + RomFS Extraction Failed! Не вдалося видобути RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Під час копіювання файлів RomFS сталася помилка або користувач скасував операцію. - + Full Повний - + Skeleton Скелет - + Select RomFS Dump Mode Виберіть режим створення дампу RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Виберіть, як ви хочете виконати дамп RomFS <br>Повний скопіює всі файли до нової теки, тоді як <br>скелет створить лише структуру тек. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root За адресою «%1» недостатньо вільного місця для видобування RomFS. Звільніть місце або виберіть іншу теку для створення дампу в «Емуляція» → «Налаштувати» → «Система» → «Файлова система» → «Коренева тека дампів». - + Extracting RomFS... Видобування RomFS... - - + + Cancel Скасувати - + RomFS Extraction Succeeded! RomFS видобуто успішно! - + The operation completed successfully. Операцію успішно виконано. - + Error Opening %1 Помилка під час відкриття «%1» - + Select Directory Вибрати теку - + Properties Властивості - + The game properties could not be loaded. Неможливо завантажити властивості гри. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Виконуваний файл Switch (%1);;Усі файли (*.*) - + Load File Завантажити файл - + Open Extracted ROM Directory Відкрити теку видобутого ROM - + Invalid Directory Selected Вибрано неправильну теку - + The directory you have selected does not contain a 'main' file. Вибрана тека не містить файлу «main». - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Встановлюваний файл Switch (*.nca, *.nsp, *.xci);;Архів вмісту Nintendo (*.nca);;Пакет подання Nintendo (*.nsp);;Образ картриджа NX (*.xci) - + Install Files Встановити файли - + %n file(s) remaining Лишився 1 файлЛишилося %n файлиЛишилося %n файлівЛишилося %n файлів - + Installing file "%1"... Встановлення файлу «%1»... - - + + Install Results Результати встановлення - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Щоб уникнути можливих конфліктів, ми не радимо користувачам встановлювати ігри в NAND. Користуйтеся цією функцією лише для встановлення оновлень і доповнень. - + %n file(s) were newly installed Щойно встановлено %n файл @@ -7621,7 +7613,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten Перезаписано %n файл @@ -7631,7 +7623,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install Не вдалося встановити %n файл @@ -7641,314 +7633,314 @@ Please, only use this feature to install updates and DLC. - + System Application Системний застосунок - + System Archive Системний архів - + System Application Update Оновлення системного застосунку - + Firmware Package (Type A) Пакет прошивки (Тип А) - + Firmware Package (Type B) Пакет прошивки (Тип Б) - + Game Гра - + Game Update Оновлення гри - + Game DLC Доповнення гри - + Delta Title Проєкт «Дельта» - + Select NCA Install Type... Виберіть тип встановлення NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Виберіть тип проєкту, який ви хочете встановити для цього NCA: (У більшості випадків підходить стандартний вибір «Гра».) - + Failed to Install Не вдалося встановити - + The title type you selected for the NCA is invalid. Тип проєкту, який ви вибрали для NCA, неправильний. - + File not found Файл не виявлено - + File "%1" not found Файл «%1» не виявлено - + OK Гаразд - + Function Disabled Функцію вимкнену - + Compatibility list reporting is currently disabled. Check back later! Звітування для переліку сумісності наразі вимкнено. Зазирніть пізніше! - + Error opening URL Помилка під час відкриття URL - + Unable to open the URL "%1". Не вдалося відкрити URL: «%1». - + TAS Recording Записування TAS - + Overwrite file of player 1? Перезаписати файл гравця 1? - + Invalid config detected Виявлено неправильне налаштування - + Handheld controller can't be used on docked mode. Pro controller will be selected. Портативний контролер неможливо використовувати в режимі докстанції. Буде вибрано контролер Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Поточний amiibo вилучено - + Error Помилка - - + + The current game is not looking for amiibos Поточна гра не очікує amiibo - + Amiibo File (%1);; All Files (*.*) Файл amiibo (%1);; Усі файли (*.*) - + Load Amiibo Завантажити amiibo - + Error loading Amiibo data Помилка під час завантаження даних amiibo - + The selected file is not a valid amiibo Вибраний файл не є дійсним amiibo - + The selected file is already on use Вибраний файл уже використовується - + An unknown error occurred Сталася невідома помилка - + No firmware available Немає доступних прошивок - + Firmware Corrupted Прошивка пошкоджена - + Unknown applet Невідомий аплет - + Applet doesn't map to a known value. Аплет не призначено до відомого значення. - + Record not found Запис не виявлено - + Applet not found. Please reinstall firmware. Аплет не виявлено. Перевстановіть прошивку. - + Capture Screenshot Зробити знімок екрана - + PNG Image (*.png) Зображення PNG (*.png) - + TAS state: Running %1/%2 Стан TAS: Працює %1/%2 - + TAS state: Recording %1 Стан TAS: Триває запис %1 - + TAS state: Idle %1/%2 Стан TAS: Бездіяльність %1/%2 - + TAS State: Invalid Стан TAS: Неправильний - + &Stop Running [&S] Зупинити - + Stop R&ecording [&E] Зупинити запис - + Building: %n shader(s) Компіляція: %n шейдерКомпіляція: %n шейдериКомпіляція: %n шейдерівКомпіляція: %n шейдерів - + Scale: %1x %1 is the resolution scaling factor Масштаб: %1x - + Speed: %1% / %2% Швидкість: %1% / %2% - + Speed: %1% Швидкість: %1% - + Game: %1 FPS Гра: %1 к/с - + Frame: %1 ms Кадр: %1 мс - + NO AA БЕЗ ЗГЛАДЖУВАННЯ - + VOLUME: MUTE ГУЧНІСТЬ: ВИМКНЕНО - + VOLUME: %1% Volume percentage (e.g. 50%) ГУЧНІСТЬ: %1% - + Derivation Components Missing Відсутні компоненти виведення - + Decryption keys are missing. Install them now? Відсутні ключі шифрування. Встановити їх зараз? - + Wayland Detected! Виявлено Wayland! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7959,74 +7951,74 @@ Would you like to force it for future launches? Хочете примусово увімкнути його для наступних запусків? - + Use X11 Використовувати X11 - + Continue with Wayland Продовжити з Wayland - + Don't show again Не показувати знову - + Restart Required Потрібен перезапуск - + Restart Eden to apply the X11 backend. Перезапуск Eden для застосування бекенду X11. - + Slow Сповільнення - + Turbo Прискорення - + Unlocked Розблоковано - + Select RomFS Dump Target Виберіть розташування для створення дампу RomFS - + Please select which RomFS you would like to dump. Виберіть, який дамп RomFS ви хочете створити. - + Are you sure you want to close Eden? Ви впевнені, що хочете закрити Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Ви впевнені, що хочете зупинити емуляцію? Увесь незбережений поступ буде втрачено. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9828,37 +9820,37 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name Назва мода - + What should this mod be called? Як повинен називатися цей мод? - + RomFS RomFS - + ExeFS/Patch ExeFS/патч - + Cheat Чит - + Mod Type Тип мода - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. @@ -9867,18 +9859,18 @@ Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed Не вдалося видобути мод - + Failed to create temporary directory %1 Не вдалося створити тимчасову теку %1 - + Zip file %1 is empty Zip-файл %1 порожній @@ -10579,66 +10571,66 @@ By selecting "From Eden", previous save data stored in Ryujinx will be %1 доступно для завантаження. - + New Version Location Розташування нової версії - + All Files (*.*) Усі файли (*.*) - - - + + + Failed to save file Не вдалося зберегти файл - + Could not open file %1 for writing. Не вдалося відкрити файл «%1» для запису. - + Downloading... Завантаження... - + Cancel Скасувати - + Could not write to file %1. Не вдалося записати до файлу «%1». - + Could not commit to file %1. Не вдалося вкласти до файлу «%1». - + Failed to download file Не вдалося завантажити файл - + Could not download from %1%2 Error code: %3 Не вдалося завантажити з %1%2 Код помилки: %3 - + Download Complete Завантажено - + Successfully downloaded %1. Would you like to open it? %1 успішно завантажено. Хочете відкрити? diff --git a/dist/languages/vi.ts b/dist/languages/vi.ts index a58d201f26..8821619815 100644 --- a/dist/languages/vi.ts +++ b/dist/languages/vi.ts @@ -1491,7 +1491,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Không có @@ -1556,563 +1555,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - - - - - 64x - - - - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Español) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Nederlands) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh Anh - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Tây Ban Nha Mỹ Latinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha Brasil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6861,7 +6850,7 @@ Debug Message: - + &Pause &Tạm dừng @@ -7017,7 +7006,7 @@ Debug Message: - + &Start &Bắt đầu @@ -7028,7 +7017,7 @@ Debug Message: - + R&ecord G&hi lại @@ -7119,7 +7108,7 @@ Debug Message: - + None @@ -7140,719 +7129,722 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7860,74 +7852,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9704,55 +9696,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10446,65 +10438,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index 6df1ce29d1..fe2cd1d2c7 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -1491,7 +1491,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None Trống @@ -1556,563 +1555,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - - - - - 64x - - - - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Spanish) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Dutch) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh UK (British English) - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Mỹ La-tinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha của người Brazil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Châu Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Chế độ cắm TV - + Handheld Cầm tay - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6861,7 +6850,7 @@ Debug Message: - + &Pause &Tạm dừng @@ -7017,7 +7006,7 @@ Debug Message: - + &Start &Bắt đầu @@ -7028,7 +7017,7 @@ Debug Message: - + R&ecord G&hi @@ -7119,7 +7108,7 @@ Debug Message: - + None @@ -7140,719 +7129,722 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7860,74 +7852,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9704,55 +9696,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10446,65 +10438,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index e1e9a00112..ea35dae1ba 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -1560,7 +1560,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None 无 @@ -1625,563 +1624,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - 32x - - - - 64x - 64x - - - + Japanese (日本語) 日语 (日本語) - + American English 美式英语 - + French (français) 法语 (français) - + German (Deutsch) 德语 (Deutsch) - + Italian (italiano) 意大利语 (italiano) - + Spanish (español) 西班牙语 (español) - + Chinese 中文 - + Korean (한국어) 韩语 (한국어) - + Dutch (Nederlands) 荷兰语 (Nederlands) - + Portuguese (português) 葡萄牙语 (português) - + Russian (Русский) 俄语 (Русский) - + Taiwanese 台湾中文 - + British English 英式英语 - + Canadian French 加拿大法语 - + Latin American Spanish 拉美西班牙语 - + Simplified Chinese 简体中文 - + Traditional Chinese (正體中文) 繁体中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙语 (português do Brasil) - + Polish (polska) 波兰语(波兰语) - + Thai (แบบไทย) 泰语 - - + + Japan 日本 - + USA 美国 - + Europe 欧洲 - + Australia 澳大利亚 - + China 中国 - + Korea 韩国 - + Taiwan 台湾地区 - + Auto (%1) Auto select time zone 自动 (%1) - + Default (%1) Default time zone 默认 (%1) - + CET 欧洲中部时间 - + CST6CDT 古巴标准时间&古巴夏令时 - + Cuba 古巴 - + EET 东欧时间 - + Egypt 埃及 - + Eire 爱尔兰 - + EST 东部标准时间 - + EST5EDT 东部标准时间&东部夏令时 - + GB 英国 - + GB-Eire 英国-爱尔兰时间 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 美国夏威夷时间 - + Iceland 冰岛 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙买加 - + Kwajalein 夸贾林环礁 - + Libya 利比亚 - + MET 中欧时间 - + MST 山区标准时间 (北美) - + MST7MDT 山区标准时间&山区夏令时 (北美) - + Navajo 纳瓦霍 - + NZ 新西兰时间 - + NZ-CHAT NZ-CHAT - + Poland 波兰 - + Portugal 葡萄牙 - + PRC 中国标准时间 - + PST8PDT 太平洋标准时间&太平洋夏令时 - + ROC 台湾时间 - + ROK 韩国时间 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界时间 - + UTC 协调世界时 - + W-SU 欧洲-莫斯科时间 - + WET 西欧时间 - + Zulu 祖鲁 - + Mono 单声道 - + Stereo 立体声 - + Surround 环绕声 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (不安全) - + 12GB DRAM (Unsafe) 12GB DRAM (不安全) - + Docked 主机模式 - + Handheld 掌机模式 - - + + Normal 正常 - - + + Boost 升频 - - + + Overclock 超频 - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - + Very Small (16 MB) 很小 (16 MB) - + Small (32 MB) 较小 (32 MB) - + Normal (128 MB) 正常 (128 MB) - + Large (256 MB) 较大 (256 MB) - + Very Large (512 MB) 很大 (512 MB) - + Very Low (4 MB) 很低 (4 MB) - + Low (8 MB) 低 (8 MB) - + Normal (16 MB) 正常 (16 MB) - + Medium (32 MB) 中 (32 MB) - + High (64 MB) 高 (64 MB) - + Very Low (32) 很低 (32) - + Low (64) 低 (64) - + Normal (128) 正常 (128) - + Medium (256) 中(256) - + High (512) 高(512) - + Disabled 禁用 - + ExtendedDynamicState 1 扩展动态状态 1 - + ExtendedDynamicState 2 扩展动态状态 2 - + ExtendedDynamicState 3 扩展动态状态 3 - + Tree View 树景视图 - + Grid View 网格视图 @@ -6935,7 +6924,7 @@ Debug Message: - + &Pause 暂停 (&P) @@ -7091,7 +7080,7 @@ Debug Message: - + &Start 开始 (&S) @@ -7102,7 +7091,7 @@ Debug Message: - + R&ecord 录制 (&E) @@ -7193,7 +7182,7 @@ Debug Message: - + None 无 @@ -7214,724 +7203,727 @@ Debug Message: 轮播视图(&C) - + Small (32x32) 小 (32x32) - + Standard (64x64) 标准 (64x64) - + Large (128x128) 大 (128x128) - + Full Size (256x256) 最大 (256x256) - + Broken Vulkan Installation Detected 检测到损坏的 Vulkan 安装 - + Vulkan initialization failed during boot. 在启动时初始化 Vulkan 失败。 - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping 运行游戏 - + Loading Web Applet... 正在加载 Web 小程序... - - + + Disable Web Applet 禁用 Web 小程序 - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) 禁用网页小程序可能会导致未定义的行为并且应仅在 超级马里奥 3D 全明星中使用。您确定要禁用网页小程序吗? (这可以在调试设置中重新启用。) - + The amount of shaders currently being built 当前正在构建的着色器数量 - + The current selected resolution scaling multiplier. 当前选择的分辨率缩放倍数。 - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. 当前模拟速度。高于或低于 100% 的数值表示模拟运行比 Switch 快或慢。 - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. 游戏当前显示的每秒帧数。这个数值会因游戏和场景的不同而有所变化。 - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 模拟 Switch 一帧所需的时间,不包括帧限制或垂直同步。为了全速模拟这个时间最多应为 16.67 毫秒。 - + Unmute 取消静音 - + Mute 静音 - + Reset Volume 重置音量 - + &Clear Recent Files 清除最近的文件(&C) - + &Continue 继续(&C) - + Warning: Outdated Game Format 警告: 游戏格式过时 - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. 您正在为此游戏使用解包 ROM 目录格式,这是一种已过时的格式,它已被 NCA、NAX、XCI 或 NSP 等其他格式取代。解包 ROM 目录缺少图标、元数据和更新支持。<br>有关 Eden 支持的各种 Switch 格式的说明请查阅我们的用户手册。此消息将不再显示。 - - + + Error while loading ROM! 加载 ROM 时出错! - + The ROM format is not supported. 不支持该 ROM 格式。 - + An error occurred initializing the video core. 初始化视频核心时发生错误。 - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. Eden 在运行视频核心时遇到了错误。通常这是由于 GPU 驱动程序过时引起的,包括集成显卡驱动程序。有关详细信息,请查看日志。有关如何访问日志的更多信息,请参阅以下页面:<a href="https://yuzu-mirror.github.io/help/reference/log-files/">如何上传日志文件</a>。 - + Error while loading ROM! %1 %1 signifies a numeric error code. 加载 ROM 时出错! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>请重新导出您的文件,或在 Discord/Stoat 上寻求帮助。 - + An unknown error occurred. Please see the log for more details. 发生未知错误。请查看日志以获取更多详情。 - + + (64-bit) (64 位) - + + (32-bit) (32 位) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... 正在关闭软件... - + Save Data 存档数据 - + Mod Data Mod 数据 - + Error Opening %1 Folder 打开 %1 文件夹出错 - - + + Folder does not exist! 文件夹不存在! - + Remove Installed Game Contents? 是否移除已安装的游戏内容? - + Remove Installed Game Update? 是否移除已安装的游戏更新? - + Remove Installed Game DLC? 是否移除已安装的游戏 DLC? - + Remove Entry 删除条目 - + Delete OpenGL Transferable Shader Cache? 要删除 OpenGL 可传输着色器缓存吗? - + Delete Vulkan Transferable Shader Cache? 要删除 Vulkan 可传输着色器缓存吗? - + Delete All Transferable Shader Caches? 删除所有可传输的着色器缓存? - + Remove Custom Game Configuration? 是否移除自定义游戏配置? - + Remove Cache Storage? 要清除缓存存储吗? - + Remove File 删除文件 - + Remove Play Time Data 删除游戏时间数据 - + Reset play time? 要重置播放时间吗? - - + + RomFS Extraction Failed! RomFS 提取失败! - + There was an error copying the RomFS files or the user cancelled the operation. 复制 RomFS 文件时出错或用户取消了操作。 - + Full 完整 - + Skeleton 结构 - + Select RomFS Dump Mode 选择 RomFS 转储模式 - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. 请选择您希望如何导出 RomFS。<br>&quot;完整&quot; 将把所有文件复制到新的目录中,而<br>&quot;结构&quot; 仅会创建目录结构。</br></br> - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root %1 的可用空间不足,无法提取 RomFS。请释放空间或在模拟 > 配置 > 系统 > 文件系统 > 转储根目录,中选择其它目录 - + Extracting RomFS... 正在提取 RomFS... - - + + Cancel 取消 - + RomFS Extraction Succeeded! RomFS 提取成功! - + The operation completed successfully. 操作已成功完成。 - + Error Opening %1 打开 %1 时出错 - + Select Directory 选择目录 - + Properties 属性 - + The game properties could not be loaded. 无法加载游戏属性。 - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch 可执行文件 (%1);;所有文件 (*.*) - + Load File 加载文件 - + Open Extracted ROM Directory 打开已提取的 ROM 目录 - + Invalid Directory Selected 选择的目录无效 - + The directory you have selected does not contain a 'main' file. 您选择的目录不包含 'main' 文件。 - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) 可安装的 Switch 文件 (*.nca *.nsp *.xci);;任天堂内容档案 (*.nca);;任天堂提交包 (*.nsp);;NX 卡带镜像 (*.xci) - + Install Files 安装文件 - + %n file(s) remaining 剩余 %n 个文件 - + Installing file "%1"... 正在安装文件 "%1"... - - + + Install Results 安装结果 - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. 为了避免可能的冲突,我们不鼓励用户将基础游戏安装到 NAND。 请仅使用此功能来安装更新和 DLC。 - + %n file(s) were newly installed 已新安装 %n 个文件 - + %n file(s) were overwritten 已覆盖了 %n 个文件 - + %n file(s) failed to install %n 个文件安装失败 - + System Application 系统应用 - + System Archive 系统档案 - + System Application Update 系统应用更新 - + Firmware Package (Type A) 固件包 (类型 A) - + Firmware Package (Type B) 固件包 (类型 B) - + Game 游戏 - + Game Update 游戏更新 - + Game DLC 游戏可下载内容 - + Delta Title Delta 标题 - + Select NCA Install Type... 选择 NCA 安装类型... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) 请选择您希望将此 NCA 安装为的标题类型: (在大多数情况下,默认的 '游戏' 就可以。) - + Failed to Install 安装失败 - + The title type you selected for the NCA is invalid. 您为 NCA 选择的标题类型无效。 - + File not found 找不到文件 - + File "%1" not found 未找到文件 "%1" - + OK 确定 - + Function Disabled 功能已被关闭 - + Compatibility list reporting is currently disabled. Check back later! 兼容性列表报告目前已被禁用。请稍后再查看! - + Error opening URL 打开网址出错 - + Unable to open the URL "%1". 无法打开 URL "%1"。 - + TAS Recording TAS 录像 - + Overwrite file of player 1? 要覆盖玩家 1 的文件吗? - + Invalid config detected 检测到无效配置 - + Handheld controller can't be used on docked mode. Pro controller will be selected. 手柄在主机模式下无法使用。将选择 Pro 手柄。 - - + + Amiibo Amiibo - - + + The current amiibo has been removed 当前的 amiibo 已被移除 - + Error 错误 - - + + The current game is not looking for amiibos 当前游戏不支持寻找 amiibo - + Amiibo File (%1);; All Files (*.*) Amiibo 文件 (%1);; 所有文件 (*.*) - + Load Amiibo 读取 Amiibo - + Error loading Amiibo data 加载 Amiibo 数据出错 - + The selected file is not a valid amiibo 所选文件不是有效的 amiibo - + The selected file is already on use 所选文件正在使用中 - + An unknown error occurred 发生未知错误 - + No firmware available 没有可用的固件 - + Firmware Corrupted 固件已损坏 - + Unknown applet 未知小程序 - + Applet doesn't map to a known value. 无法识别该小程序对应的值。 - + Record not found 找不到记录程序 - + Applet not found. Please reinstall firmware. 找不到小程序。请重新安装固件。 - + Capture Screenshot 截取屏幕截图 - + PNG Image (*.png) PNG 图像 (*.png) - + TAS state: Running %1/%2 TAS 状态: 正在运行 %1/%2 - + TAS state: Recording %1 TAS 状态: 正在录制 %1 - + TAS state: Idle %1/%2 TAS 状态: 空闲 %1/%2 - + TAS State: Invalid TAS 状态: 无效 - + &Stop Running 停止运行(&S) - + Stop R&ecording 停止录制(&A) - + Building: %n shader(s) 正在编译:%n 个着色器 - + Scale: %1x %1 is the resolution scaling factor 缩放: %1x - + Speed: %1% / %2% 速度: %1% / %2% - + Speed: %1% 速度: %1% - + Game: %1 FPS 游戏: %1 FPS - + Frame: %1 ms 帧: %1 ms - + NO AA 无 AA - + VOLUME: MUTE 音量: 静音 - + VOLUME: %1% Volume percentage (e.g. 50%) 音量: %1% - + Derivation Components Missing 缺少派生组件 - + Decryption keys are missing. Install them now? 缺少解密密钥。现在安装吗? - + Wayland Detected! 检测到 Wayland! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7942,74 +7934,74 @@ Would you like to force it for future launches? 您想要在未来的启动中强制执行吗? - + Use X11 使用 X11 - + Continue with Wayland 继续使用 Wayland - + Don't show again 不再显示 - + Restart Required 需要重新启动 - + Restart Eden to apply the X11 backend. 重新启动 Eden 以应用 X11 后端。 - + Slow 慢速 - + Turbo 加速 - + Unlocked 解锁 - + Select RomFS Dump Target 选择 RomFS 转储目标 - + Please select which RomFS you would like to dump. 请选择您想要转储的 RomFS。 - + Are you sure you want to close Eden? 您确实要关闭 Eden 吗? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. 您确定要停止模拟吗?任何未保存的进度将会丢失。 - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9809,37 +9801,37 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name 模组名称 - + What should this mod be called? 这个模组应该叫什么名字? - + RomFS RomFS - + ExeFS/Patch ExeFS/Patch - + Cheat 作弊 - + Mod Type 模组类型 - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. @@ -9848,18 +9840,18 @@ Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed 模组提取失败 - + Failed to create temporary directory %1 未能创建临时 %1 目录 - + Zip file %1 is empty 压缩文件 %1 是空的。 @@ -10561,66 +10553,66 @@ By selecting "From Eden", previous save data stored in Ryujinx will be %1 可用于下载。 - + New Version Location 新版本位置 - + All Files (*.*) 所有文件 (*.*) - - - + + + Failed to save file 保存文件失败 - + Could not open file %1 for writing. 无法打开要写入的 %1 文件。 - + Downloading... 正在下载... - + Cancel 取消 - + Could not write to file %1. 无法写入到文件 %1。 - + Could not commit to file %1. 无法提交到文件 %1。 - + Failed to download file 下载文件失败 - + Could not download from %1%2 Error code: %3 无法从 %1%2 下载 错误代码: %3 - + Download Complete 下载完成 - + Successfully downloaded %1. Would you like to open it? 已成功下载 %1。您要打开它吗? diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index 72a4341a02..34190d4db8 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -1518,7 +1518,6 @@ When a program attempts to open the controller applet, it is immediately closed. - None 無 @@ -1583,563 +1582,553 @@ When a program attempts to open the controller applet, it is immediately closed. 16x - - 32x - - - - - 64x - - - - + Japanese (日本語) 日文 (日本語) - + American English 美式英语 - + French (français) 法文 (français) - + German (Deutsch) 德文 (Deutsch) - + Italian (italiano) 義大利文 (italiano) - + Spanish (español) 西班牙文 (español) - + Chinese 中文 - + Korean (한국어) 韓文 (한국어) - + Dutch (Nederlands) 荷蘭文 (Nederlands) - + Portuguese (português) 葡萄牙文 (português) - + Russian (Русский) 俄文 (Русский) - + Taiwanese 台灣中文 - + British English 英式英文 - + Canadian French 加拿大法文 - + Latin American Spanish 拉丁美洲西班牙文 - + Simplified Chinese 簡體中文 - + Traditional Chinese (正體中文) 正體中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA 美國 - + Europe 歐洲 - + Australia 澳洲 - + China 中國 - + Korea 南韓 - + Taiwan 台灣 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 預設 (%1) - + CET 中歐 - + CST6CDT CST6CDT - + Cuba 古巴 - + EET EET - + Egypt 埃及 - + Eire 愛爾蘭 - + EST 北美東部 - + EST5EDT EST5EDT - + GB GB - + GB-Eire 英國-愛爾蘭 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 夏威夷 - + Iceland 冰島 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙買加 - + Kwajalein 瓜加林環礁 - + Libya 利比亞 - + MET 中歐 - + MST 北美山區 - + MST7MDT MST7MDT - + Navajo 納瓦霍 - + NZ 紐西蘭 - + NZ-CHAT 紐西蘭-查塔姆群島 - + Poland 波蘭 - + Portugal 葡萄牙 - + PRC 中國 - + PST8PDT 太平洋 - + ROC 臺灣 - + ROK 韓國 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界 - + UTC UTC - + W-SU 莫斯科 - + WET 西歐 - + Zulu 協調世界時 - + Mono 單聲道 - + Stereo 立體聲 - + Surround 環繞音效 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked TV - + Handheld 掌機模式 - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6886,7 +6875,7 @@ Debug Message: - + &Pause 暫停(&P) @@ -7042,7 +7031,7 @@ Debug Message: - + &Start 開始(&S) @@ -7053,7 +7042,7 @@ Debug Message: - + R&ecord 錄製 (&E) @@ -7144,7 +7133,7 @@ Debug Message: - + None @@ -7165,719 +7154,722 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - + + (64-bit) - + + (32-bit) - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7885,74 +7877,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9729,55 +9721,55 @@ Would you like to manually select a portable folder to use? QtCommon::Mod - + Mod Name - + What should this mod be called? - + RomFS - + ExeFS/Patch - + Cheat - + Mod Type - + Could not detect mod type automatically. Please manually specify the type of mod you downloaded. Most mods are RomFS mods, but patches (.pchtxt) are typically ExeFS mods. - - + + Mod Extract Failed - + Failed to create temporary directory %1 - + Zip file %1 is empty @@ -10471,65 +10463,65 @@ By selecting "From Eden", previous save data stored in Ryujinx will be - + New Version Location - + All Files (*.*) - - - + + + Failed to save file - + Could not open file %1 for writing. - + Downloading... - + Cancel - + Could not write to file %1. - + Could not commit to file %1. - + Failed to download file - + Could not download from %1%2 Error code: %3 - + Download Complete - + Successfully downloaded %1. Would you like to open it? diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 0840919428..a3d7b2b515 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -106,7 +106,7 @@ محاكاة NVDEC - حدد كيفية التعامل مع فك تشفير الفيديو (NVDEC) خلال المشاهد التمهيدية والمقدمة. + قم بتغيير المعالج المركزي في حالة حدوث عطل أثناء المشاهد السينمائية. لا شيء @@ -292,7 +292,7 @@ إدارة برامج تشغيل وحدة معالجة الرسومات تثبيت برامج تشغيل بديلة لأداء أو دقة أفضل توليد الإطار - تكوين إعدادات إنشاء الإطارات لهذه اللعبة + ضبط إعدادات إنشاء الإطارات لهذه اللعبة قم بإدراج الإطارات المُستكملة بين الإطارات المُعالجة باستخدام تقنية التحجيم بدون فقدان الجودة. يُفرض هذا الخيار عرض الإطارات وفقًا لترتيب FIFO عند تفعيله. مضاعف الإطارات عدد الإطارات المطلوب عرضها لكل إطار مُعالَج. تتطلب القيم الأعلى وقت معالجة رسوميات أكبر. طلب عدد إطارات يفوق قدرة الشاشة على عرضه سيؤدي إلى إبطاء المحاكاة. @@ -300,6 +300,7 @@ 3x 4x معدل الإطارات المستهدف + اختر المعدل الذي يمكن لشاشتك عرضه فعليًّا. عندئذٍ يرتفع المضاعف أو ينخفض تلقائيًّا للحفاظ على هذا المعدل، ويقوم بالتراجع عن أي خطوة تؤدي إلى إبطاء سير اللعبة نفسها. استخدم مضاعفًا ثابتًا 60 إطارًا في الثانية 90 إطارًا في الثانية @@ -307,6 +308,50 @@ 144 إطارًا في الثانية 165 إطارًا في الثانية هدف قائمة انتظار الإطارات + كم عدد الإطارات المكتملة التي قد تنتظر قبل عرضها؟ تعمل قوائم الانتظار الأكبر حجمًا على امتصاص الارتفاعات المفاجئة في حمل وحدة معالجة الرسومات على حساب زمن انتقال الإدخال. + أقل زمن انتقال (بدون تخزين مؤقت) + متوازن (1 إطار) + الأكثر سلاسة (2 إطارات) + تكييف تقدير الحركة مع اللعبة + قم بتقدير الحركة بناءً على الدقة التي تعرضها اللعبة فعليًّا، بدلاً من الإخراج الذي تم رفع دقته. ولا يؤثر ذلك على الدقة بأي شكل، لأن رفع الدقة لا يضيف أي تفاصيل تتعلق بالحركة. + دقة تقدير الحركة + دقة مسار التدفق البصري، كجزء من الناتج. ويُعد خفض هذه القيمة أرخص طريقة لاستعادة الأداء. + مُظلِّلات نصف الدقة + استخدم نسخة التظليل 16 بت. يتم التراجع تلقائيًا إلى الخيار البديل في حالة عدم توفرها في برنامج التشغيل أو الملف. + إفراغ الإطار الذي تم إنشاؤه + قم بكتابة مستويات MIP للتدفق البصري والإطار المُستكمل إلى مجلد lossless/debug مرة واحدة، لغرض استكشاف الأخطاء وإصلاحها + توليد الإطار غير متاح + لا يدعم برنامج تشغيل وحدة معالجة الرسومات هذا نموذج ذاكرة Vulkan، الذي تتطلبه برامج التظليل الخاصة بـ«Lossless Scaling». + اختياري. قم بتوفير ملف Lossless.dll الخاص بك لتمكين إنشاء الإطارات لاحقًا + تثبيت ملف Lossless.dll + يتطلب إنشاء الإطارات أن تكون لديك نسخة قانونية خاصة بك من ملف Lossless.dll المأخوذ من برنامج Lossless Scaling + اختر نسخة أخرى من ملف Lossless.dll + توليد الإطارات + مدعوم + غير مدعوم (لا يتوفر نموذج ذاكرة Vulkan) + Lossless Scaling + قم بتوفير نسختك الخاصة من ملف Lossless.dll لتمكين توليد الإطارات + مثبت + غير مثبت + استبدل + إزالة + احذف ملف Lossless.dll المثبت ووحدات التظليل المعدة له + سيتوقف توليد الإطارات عن العمل إلى أن تقوم بتثبيت ملف Lossless.dll مرة أخرى. ولن يتأثر ملفك الأصلي بذلك. + ملف Lossless.dll غير مثبت + قم بتثبيته من الإعدادات › Lossless Scaling لاستخدام ميزة توليد الإطارات. + أغلق اللعبة أولاً + لا يمكن تعديل ملف Lossless.dll أثناء تشغيل اللعبة. + لا يوجد شيء يجب إزالته + لم يتم تثبيت ملف Lossless.dll بعد. + جاري التحضير لإنشاء مظلّلات الإطارات… + تم تثبيت ملف Lossless.dll بنجاح + تعذر تثبيت ملف Lossless.dll + تعذر نسخ الملف المحدد. + تعذر قراءة الملف المحدد. + الملف المحدد ليس مكتبة Windows. حدد ملف Lossless.dll من تثبيت برنامج Lossless Scaling. + لا تحتوي هذه النسخة من ملف Lossless.dll على برامج التظليل الخاصة بتوليد الإطارات. قم بتحديث ميزة «Lossless Scaling» وحاول مرة أخرى. + تعذر ترجمة برامج التظليل الخاصة بتوليد الإطارات. هذا الإصدار من «Lossless Scaling» غير مدعوم حتى الآن. + تعذر كتابة برامج التظليل المترجمة إلى وحدة التخزين. تأكد من توفر مساحة خالية. الإعدادات المتقدمة ضبط إعدادات المحاكي تم تشغيلها مؤخرًا @@ -585,6 +630,10 @@ السجلات تفريغ سجلات التصحيح حسب السطر يفرغ سجلات التصحيح عند كتابة كل سطر، مما يجعل التصحيح أسهل في حالات التوقف أو التجميد. + تفعيل التسجيل الموسع + يزيد الحد الأقصى لحجم ملف السجل من 100 ميجابايت إلى 1 جيجابايت. + مرشح السجلات + يتحكم في فئات سجلات Eden. مثال: *:Info Service.LM:Debug تسجيل وحدة معالجة الرسومات @@ -661,10 +710,10 @@ ذراع تحكم GameCube عكس المحور عكس الزر - زر تشغيل/إيقاف + زر تفعيل/تعطيل زر التوربو تعيين الحد الفاصل - تشغيل/إيقاف المحور + تفعيل/تعطيل المحور متصل استخدم هزاز النظام طبقة الإدخال @@ -803,7 +852,7 @@ الإصدار نسخ التفاصيل الإضافات - التعديلات، التحديثات، المحتوى القابل للتنزيل + تفعيل/تعطيل التعديلات، التحديثات، المحتوى القابل للتنزيل زمن اللعب: مسح زمن اللعب إعادة تعيين زمن اللعب للعبة الحالية إلى 0 ثانية @@ -908,13 +957,13 @@ خروج من المحاكاة إنهاء - تشغيل/إيقاف أزرار التحكم + تفعيل/تعطيل أزرار التحكم مركز العصا النسبي انزلاق الأسهم الاهتزازات الديناميكية عرض ذراع التحكم إخفاء ذراع التحكم - تشغيل/إيقاف الكل + تفعيل/تعطيل الكل ضبط الطبقة الحجم الشفافية @@ -1079,7 +1128,7 @@ حول إعدادات Freedreno قم بإعداد خيارات برنامج تشغيل Freedreno/Turnip لوحدة معالجة الرسومات لأغراض التصحيح، والتحليل، وتحسين الأداء. يتم حفظ التغييرات تلقائيًا. راجع https://docs.mesa3d.org/drivers/freedreno.html للحصول على الوثائق التفصيلية. إعدادات Freedreno - قم بضبط إعدادات برنامج تشغيل وحدة معالجة الرسومات لهذه اللعبة + ضبط إعدادات برنامج تشغيل وحدة معالجة الرسومات لهذه اللعبة تم حفظ إعدادات Freedreno @@ -1107,7 +1156,6 @@ فاتح داكن - خلفيات سوداء عند استخدام السمة الداكنة، قم بتطبيق خلفيات سوداء. diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml index 66a59bea65..eb0c586695 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -62,7 +62,6 @@ ئەم باشکردنە خێرایی دەستکەوتنی بیرگە لەلایەن پرۆگرامی میوانەکە زیاد دەکات. چالاککردنی وای لێدەکات کە خوێندنەوە/نووسینەکانی بیرگەی میوانەکە ڕاستەوخۆ لە بیرگە ئەنجام بدرێت و میمیکردنی MMU میواندە بەکاربهێنێت. ناچالاککردنی ئەمە هەموو دەستکەوتنەکانی بیرگە ڕەت دەکاتەوە لە بەکارهێنانی میمیکردنی MMU نەرمەکاڵا. ئیمولەیشنی NVDEC - هەڵبژاردنی ڕێگای دیکۆدکردنی ڤیدیۆ هیچ @@ -379,7 +378,6 @@ تۆمارکردن خاوکردنەوەی تۆمارەکانی دیباگ بە هێڵ تۆمارەکانی دیباگ لە هەر هێڵێکدا دەنوسرێت خاو دەکاتەوە، ئەمە وا دەکات دیباگکردن ئاسانتر بێت لە کاتی کرشکردن یان پێکەنین. - بزوێنری دەرچوونی دەنگ دەنگ diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml index dd5076bda8..9a914959e5 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -97,7 +97,6 @@ Emulace NVDEC - Určuje, jakým způsobem se zpracovává dekódování videa (NVDEC). Žádné @@ -496,7 +495,6 @@ Protokolování Vypisovat ladicí záznamy po řádcích Vypisuje ladicí záznamy po každém napsaném řádku, což usnadňuje ladění v případě pádu nebo zamrznutí. - Výstupní engine Hlasitost diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index 2e4fe728d8..fe190325f6 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -64,8 +64,8 @@ Batterietemperatur-Einheiten Batterieinfo anzeigen Aktuellen Stromverbrauch und verbleibende Kapazität der Batterie anzeigen - Schattierer-Erstellung anzeigen - Aktuelle Anzahl der erstellten Schattierer anzeigen + Shader-Erstellung anzeigen + Aktuelle Anzahl der erstellten Shader anzeigen Lege die Anzahl der Kerne fest, die für die Erstellung von Vulkan-Rohrleitungen verwendet werden sollen. Ein höherer Wert verbessert die Kompilierungsleistung der Rohrleitung, führt jedoch auch zu einem Anstieg der Temperaturen. Überlagerungs-Position Wähle aus, wo die Überlagerung auf dem Bildschirm angezeigt wird @@ -105,7 +105,7 @@ NVDEC-Emulation - Wähle aus, wie die Videodekodierung (NVDEC) während Zwischensequenzen und Intros gehandhabt wird. + Wechsle auf CPU, falls ein Absturz bei einem Cinematic auftritt. Keine @@ -290,6 +290,38 @@ GPU-Treiber-Hersteller GPU-Treiber Verwaltung Alternative Treiber für eventuell bessere Leistung oder Genauigkeit installieren + Frame-Generation + Konfiguriere Frame-Generation für dieses Spiel + Füge zwischen den gerenderten Bildern interpolierte Bilder mithilfe von Lossless Scaling ein. + Frame-Multiplikator + Wie viele Bilder für jedes gerenderte angezeigt werden soll. Höhere Werte kosten proportional mehr GPU-Zeit. Nach mehr zu fragen, als dein Bildschirm darstellen kann, wird die Emulation verlangsamen. + 2x + 3x + 4x + Ziel-Bildrate + Wähle die Rate aus die dein Bildschirm tatsächlich darstellen kann. Der Multiplikator steigt oder fällt dann alleine um sie zu halten, und rollt jeden Schritt zurück, der das Spiel selber langsamer macht. + Nutze einen fixierten Multiplikator + 60 FPS + 90 FPS + 120 FPS + 144 FPS + 165 FPS + Ausbalanciert (1 Bild) + Flüssigste (2 Bilder) + Frame-Generation nicht verfügbar + Dieser GPU-Treiber unterstützt das Vulkan-Memory-Model nicht, welches Lossless Scaling-Shader benötigen. + Optional. Stelle deine eigene Lossless.dll zur Verfügung, um Frame-Generation später zu aktivieren. + Installiere Lossless.dll + Wähle eine andere Kopie von Lossless.dll + Unterstützt + Nicht unterstützt (kein Vulkan-Memory-Model) + Lossless Scaling + Installiert + Nicht installiert + Ersetzen + Entfernen + Schließe zuerst das Spiel + Nichts zum Entfernen Erweiterte Einstellungen Emulatoreinstellungen konfigurieren Kürzlich gespielt @@ -394,6 +426,7 @@ Wirklich fortfahren? In die Zwischenablage kopiert Ein quelloffener Switch-Emulator Beitragende + Personen, die Eden für Android möglich gemacht haben Projekte, die Eden für Android möglich machen Build Nutzerdaten @@ -429,6 +462,8 @@ Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die Ermöglicht Ihnen, eine benutzerdefinierte Echtzeituhr unabhängig von Ihrer aktuellen Systemzeit einzustellen. Legen Sie eine benutzerdefinierte Echtzeituhr fest + + CPU-Takte Benutzerdefinierte CPU-Ticks Legen Sie einen benutzerdefinierten Wert für CPU-Ticks fest. Höhere Werte können die Leistung steigern, aber auch zum Einfrieren des Spiels führen. Ein Bereich von 77–21000 wird empfohlen. Ticks @@ -473,10 +508,14 @@ Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die Verbessert die Genauigkeit in einigen Spielen. Hacks + GPU-Takte CPU-interne Invalidierung überspringen Überspringt bestimmte Cache-Invalidierungen auf CPU-Seite während Speicherupdates, reduziert die CPU-Auslastung und verbessert die Leistung. Kann in einigen Spielen zu Fehlern oder Abstürzen führen. Asynchrone Shader Kompiliert Shader asynchron. Dies kann Ruckler reduzieren, aber auch Grafikfehler verursachen. + Standard + + Erweiterungen Erweiterter dynamischer Status @@ -498,6 +537,7 @@ Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die CPU + Takte Auto-Stub verwenden Ergänzt automatisch fehlende Dienste und Funktionen. Kann die Kompatibilität verbessern, aber auch zu Abstürzen und Stabilitätsproblemen führen. @@ -512,7 +552,6 @@ Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die Protokollierung Debug-Protokolle zeilenweise leeren Leert Debug-Protokolle bei jeder geschriebenen Zeile, was das Debuggen bei Abstürzen oder Einfrieren erleichtert. - Allgemein @@ -753,6 +792,7 @@ Wirklich fortfahren? Bestätigen Sie die Deinstallation Möchten Sie dieses Add-on wirklich deinstallieren\? Integrität prüfen + Verifiziere... Integritätsüberprüfung erfolgreich! Integritätsüberprüfung fehlgeschlagen! Der Dateiinhalt ist möglicherweise beschädigt @@ -874,6 +914,16 @@ Wirklich fortfahren? 6 GB (Unsicher) 8 GB (Unsicher) + + Normal + Beschleunigung + Übertaktung + + + Normal + Beschleunigung + Übertaktung + Sehr klein (16 MB) Klein (32 MB) @@ -919,6 +969,13 @@ Wirklich fortfahren? Unsicher Sicher + + Standard + Direkt + Ausgewogen + Genau + Strikt + Konservativ Aggressiv @@ -985,27 +1042,32 @@ Wirklich fortfahren? Material You App-Einstellungen Theme und Farben + Vollbild-Modus Design System folgen Hell Dunkel - Schwarze Hintergründe Bei Verwendung des dunklen Designs, schwarze Hintergründe verwenden. + + Ordner + QLaunch App-Sprache Sprache der App-Oberfläche ändern System folgen Designfarbe + Eden Violett Blau Cyan Rot + Grün Gelb Orange Rosa @@ -1037,6 +1099,10 @@ Wirklich fortfahren? Applet-Overlay aktivieren Aktiviert Horizons eingebautes Overlay-Applet. Halte die Home-Taste eine Sekunde lang gedrückt, um es anzuzeigen. + + Nutzerverwaltung + Fehler + Lizenzen Hochwertiges Upscaling von AMD diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index 418e2869b2..460ea1f0da 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -106,7 +106,6 @@ Emulación NVDEC - Seleccione cómo se maneja la decodificación de vídeo (NVDEC) durante las escenas y las introducciones. Ninguno @@ -292,22 +291,41 @@ Gestor de controladores de la GPU Instale los controladores alternativos para obtener un posible mejor rendimiento o precisión Generación de fotograma + Configurar la generación de fotogramas para este juego Multiplicador de fotograma 2x 3x 4x + Objetivo de tasa de fotogramas + Usar un multiplicador fijo 60 FPS 90 FPS 120 FPS 144 FPS 165 FPS + Latencia más baja (Sin búfer) Equilibrado (1 fotograma) + Más suave (2 fotogramas) + Sombreadores de media precisión + Generación de fotogramas no disponbile + Instalar Lossless.dll + Seleccionar una copia diferente de Lossless.dll Generación de fotograma Soportado + No soportado (sin modelo de memoria de Vulkan) Escalado sin pérdidas Instalado No instalado + Reemplazar + Borrar + Borrar Lossless.dll instalado y sus sombreadores preparados Lossless.dll no instalado + Primero cierra el juego + Nada que borrar + Lossless.dll instalado correctamente + No se pudo instalar Lossless.dll + No se pudo copiar el archivo seleccionado. + No se pudo leer el archivo seleccionado. Ajustes avanzados Configurar los ajustes del emulador Jugado recientemente @@ -454,6 +472,8 @@ Le permite tener un reloj personalizado en tiempo real diferente de la hora de su sistema. Configurar RTC personalizado + + Relojes de la CPU Ticks de CPU personalizados Establezca un valor personalizado de los ciclos de la CPU. Los valores más altos pueden aumentar el rendimiento, pero también pueden hacer que el juego se congele. Se recomienda un rango de 77–21000. Ciclos @@ -512,6 +532,7 @@ Hacks + Relojes de la GPU Omitir invalidación interna de la CPU Omite ciertas invalidaciones de caché de la CPU durante las actualizaciones de memoria, lo que reduce el uso de la CPU y mejora su rendimiento. Esto puede causar fallos o bloqueos en algunos juegos. Arreglar los efectos de resplandor @@ -558,6 +579,7 @@ CPU + Relojes Usar Auto Stub Rellena automáticamente servicios y funciones ausentes. Puede mejorar la compatibilidad pero puede causar cierres inesperados. @@ -572,6 +594,8 @@ Registro Vaciar los registros de depuración por línea Vacía los registros de depuración en cada línea escrita, facilitando la depuración en casos de bloqueos o congelamientos. + Filtro de registros + Controla las categorias de registros de Eden. Por ejemplo: *:Info Service.LM:Debug Registros de la GPU @@ -959,10 +983,12 @@ Normal + Impulso Overclock Normal + Impulso Overclock @@ -1092,7 +1118,6 @@ Claro Oscuro - Fondos oscuros Cuando se usa el modo oscuro, aplicar fondos de pantalla negros. diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index 7408cc43a9..582fc33535 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -104,7 +104,6 @@ Émulation NVDEC - Sélectionnez la manière dont le décodage vidéo (NVDEC) est géré pendant les cinématiques et les intros. Aucun @@ -518,7 +517,6 @@ Journalisation Vider les journaux de débogage ligne par ligne Vide les journaux de débogage à chaque ligne écrite, facilitant le débogage en cas de plantage ou de gel. - Journalisation GPU Niveau de journalisation @@ -1004,7 +1002,6 @@ Lumineux Sombre - Arrière-plan noir Lorsque vous utilisez le thème sombre, appliquer un arrière-plan noir. diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml index a56cb83e20..9c42d8cbd9 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -67,7 +67,6 @@ לשימוש בפיתוח בלבד. אמולציית NVDEC - בחר כיצד לטפל בפענוח וידאו ללא @@ -408,7 +407,6 @@ רישום רוקן יומני ניפוי שגיאות לפי שורה מרוקן יומני ניפוי שגיאות בכל שורה שנכתבת, מה שמקל על ניפוי שגיאות במקרים של קריסה או קיפאון. - מנוע פלט עוצמת שמע diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml index d36b297f92..c281e18dea 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -62,7 +62,6 @@ Ez az optimalizáció gyorsítja a vendégprogram memória-hozzáférését. Engedélyezése esetén a vendég memóriaolvasási/írási műveletei közvetlenül a memóriában történnek, és kihasználják a gazda MMU-ját. Letiltás esetén minden memória-hozzáférés a szoftveres MMU emulációt használja. NVDEC emuláció - Videódekódolás kezelése Nincs @@ -396,7 +395,6 @@ Naplózás Hibakeresési naplók soronkénti kiürítése Kiüríti a hibakeresési naplókat minden írt sor után, megkönnyítve a hibakeresést összeomlás vagy fagyás esetén. - Kimeneti motor Hangerő diff --git a/src/android/app/src/main/res/values-id/strings.xml b/src/android/app/src/main/res/values-id/strings.xml index 3a14efe42a..c507b727fb 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -81,7 +81,6 @@ Optimasi ini mempercepat akses memori oleh program tamu. Mengaktifkannya menyebabkan pembacaan/penulisan memori tamu dilakukan langsung ke memori dan memanfaatkan MMU Host. Menonaktifkan ini memaksa semua akses memori menggunakan Emulasi MMU Perangkat Lunak. Emulasi NVDEC - Pilih cara decoding video (NVDEC) ditangani selama cutscene dan intro. Tidak Ada @@ -430,7 +429,6 @@ Pencatatan Buang log debug per baris Membuang log debug pada setiap baris yang ditulis, memudahkan debugging dalam kasus crash atau freeze. - Output audio Volume diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index b40ed58e7e..18b4faddfc 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -79,7 +79,6 @@ Questa ottimizzazione accelera gli accessi alla memoria da parte del programma guest. Abilitandola, le letture/scritture della memoria guest vengono eseguite direttamente in memoria e sfruttano la MMU host. Disabilitandola, tutti gli accessi alla memoria sono costretti a utilizzare l\'emulazione software della MMU. Emulazione NVDEC - Scegli come gestire la decodifica video Nessuna @@ -437,7 +436,6 @@ Registrazione Svuota i log di debug per riga Svuota i log di debug su ogni riga scritta, facilitando il debug in caso di crash o blocco. - Motore di Output Volume diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml index dd9eda944c..516cf4cb07 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -62,7 +62,6 @@ この最適化により、ゲストプログラムによるメモリアクセスが高速化されます。有効にすると、ゲストのメモリ読み書きが直接メモリ内で実行され、ホストのMMUを利用します。無効にすると、すべてのメモリアクセスでソフトウェアMMUエミュレーションが使用されます。 NVDECエミュレーション - ビデオデコード方法 無効 @@ -398,7 +397,6 @@ ロギング デバッグログを行ごとにフラッシュ デバッグログを行ごとにフラッシュし、クラッシュやフリーズ時のデバッグを容易にします。 - 出力エンジン 音量 diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml index adfae0905a..7bd0b38fee 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -62,7 +62,6 @@ 이 최적화는 게스트 프로그램의 메모리 접근 속도를 높입니다. 활성화하면 게스트의 메모리 읽기/쓰기가 메모리에서 직접 수행되고 호스트의 MMU를 활용합니다. 비활성화하면 모든 메모리 접근에 소프트웨어 MMU 에뮬레이션을 사용하게 됩니다. NVDEC 에뮬레이션 - 비디오 디코딩 처리 방식 선택 없음 @@ -398,7 +397,6 @@ 로깅 디버그 로그를 줄별로 플러시 디버그 로그를 각 줄마다 플러시하여 충돌 또는 정지 시 디버깅을 용이하게 합니다. - 출력 엔진 볼륨 diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index 7d3185fefd..700ef6106a 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -62,7 +62,6 @@ Denne optimaliseringen fremskynder minnetilgang av gjesteprogrammet. Hvis aktivert, utføres gjestens minnelesing/skriving direkte i minnet og bruker vertens MMU. Deaktivering tvinger alle minnetilganger til å bruke programvarebasert MMU-emulering. NVDEC-emulering - Velg hvordan videodekoding håndteres Ingen @@ -379,7 +378,6 @@ Logging Tøm feilsøkingslogger per linje Tømmer feilsøkingslogger for hver linje som skrives, noe som gjør feilsøking enklere ved krasj eller frysing. - Lydmotor Volum diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml index e68f1567e4..f7129fe560 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -97,7 +97,6 @@ Emulacja NVDEC - Wybierz metodę dekodowania wideo (NVDEC). Brak @@ -500,7 +499,6 @@ Rejestrowanie Opróżniaj dzienniki debugowania linia po linii Opróżnia dzienniki debugowania po każdej napisanej linii, ułatwiając debugowanie w przypadku awarii lub zawieszenia. - Ogólne @@ -935,7 +933,6 @@ Jasny Ciemny - Czarne tła Kiedy używany ciemny motyw, tła zostają zastąpione czernią. diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml index 415cb020ae..335178f90c 100644 --- a/src/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml @@ -91,7 +91,6 @@ Decodificação de Vídeo (NVDEC) - Selecione como a decodificação de vídeo é realizada durante cutscenes e intros. Nenhum @@ -483,7 +482,6 @@ Registro Liberar logs de depuração por linha Libera logs de depuração em cada linha escrita, facilitando a depuração em casos de travamento ou congelamento. - Geral @@ -891,7 +889,6 @@ Claro Escuro - Planos de fundo pretos Quando usar o tema escuro, aplicar fundos pretos diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml index ac0e4df7f1..7ccaed721d 100644 --- a/src/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml @@ -62,7 +62,6 @@ Esta otimização acelera os acessos à memória pelo programa convidado. Ativar faz com que as leituras/escritas de memória do convidado sejam efetuadas diretamente na memória e utilizem a MMU do Anfitrião. Desativar força todos os acessos à memória a usar a Emulação de MMU por Software. Emulação NVDEC - Método de decodificação de vídeo. Nenhum @@ -402,7 +401,6 @@ Registo Libertar registos de depuração por linha Liberta registos de depuração em cada linha escrita, facilitando a depuração em casos de falha ou congelamento. - Motor de saída Volume diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 4386bc680d..630f61ffa4 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -106,7 +106,7 @@ Эмуляция NVDEC - Обработка видео (ролики, интро) + Переключите на CPU, если происходит вылет на кат-сценах. Отключено @@ -291,6 +291,58 @@ Получение драйверов ГПУ Менеджер драйверов ГПУ Установите альтернативные драйверы для потенциально лучшей производительности и/или точности + Генерация кадров + Настройка генерации кадров для данной игры + Вставляет промежуточные кадры между отрендеренными с помощью Lossless Scaling. При включении принудительно устанавливает режим вывода FIFO. + Множитель кадров + Количество кадров, отображаемых на каждый отрисованный кадр. Повышение значения пропорционально увеличивает затраты ресурсов ГПУ. Если запрашивать больше, чем может отобразить ваш экран, эмуляция будет замедляться. + Целевая частота кадров + Выберите значение под ваш дисплей. Множитель подстроится сам, чтобы его держать, и откатит изменения, если игра начнёт тормозить. + Использовать фиксированный множитель + Целевой размер очереди кадров + Сколько готовых кадров может ожидать перед выводом на экран. Более длинные очереди сглаживают скачки ГПУ ценой задержки ввода. + Минимальная задержка (Без буферизации) + Сбалансированный (1 кадр) + Наиболее плавный (2 кадра) + Подстроить оценку движения под игру + Оценивать движение в разрешении, которое игра действительно рендерит, вместо масштабированного вывода. Ничего не стоит в точности, так как масштабирование не добавляет деталей движения. + Разрешение оценки движения + Разрешение прохода оптического потока в долях от выходного разрешения. Его понижение — самый дешёвый способ вернуть производительность. + Шейдеры половинной точности + Использовать 16-битную версию шейдеров. Автоматически переключается на обычную, если драйвер или файл не поддерживают её. + Сохранить сгенерированный кадр + Однократно записать уровни мип-карт оптического потока и интерполированный кадр в папку lossless/debug для диагностики. + Генерация кадров недоступна + Драйвер ГПУ не поддерживает модель памяти Vulkan, требуемую шейдерами Lossless Scaling. + Опционально. Укажите свой Lossless.dll для включения генерации кадров позже. + Установить Lossless.dll + Для генерации кадров требуется ваша собственная легальная копия Lossless.dll из Lossless Scaling + Выбрать другой файл Lossless.dll + Генерация кадров + Поддерживается + Не поддерживается (нет модели памяти Vulkan) + Предоставьте свою копию Lossless.dll для включения генерации кадров + Установлена + Не установлена + Заменить + Удалить + Удалить установленный Lossless.dll и его подготовленные шейдеры + Генерация кадров перестанет работать, пока вы снова не установите Lossless.dll. Ваш исходный файл не пострадает. + Lossless.dll не установлен + Установите его через Настройки › Lossless Scaling для использования генерации кадров. + Сначала закройте игру + Lossless.dll нельзя изменить, пока запущена игра. + Нечего удалять. + Lossless.dll ещё не установлен. + Подготовка шейдеров генерации кадров… + Lossless.dll успешно установлен + Не удалось установить Lossless.dll + Не удалось скопировать выбранный файл. + Не удалось прочитать выбранный файл. + Выбранный файл не является библиотекой Windows. Выберите Lossless.dll из установки Lossless Scaling. + Эта копия Lossless.dll не содержит шейдеров генерации кадров. Обновите Lossless Scaling и попробуйте снова. + Не удалось транслировать шейдеры генерации кадров. Эта версия Lossless Scaling пока не поддерживается. + Не удалось записать транслированные шейдеры в хранилище. Проверьте, есть ли свободное место. Расширенные настройки Настройка параметров эмулятора Недавно сыгранные @@ -439,6 +491,9 @@ Позволяет установить пользовательские часы реального времени отдельно от текущего системного времени. Установить пользовательский RTC + + Тактовая частота ЦП + Повышает тактовую частоту, которую сообщает эмулируемый процессор, что убирает некоторые ограничители FPS. На более слабых процессорах производительность может снизиться, а в некоторых играх возможно некорректное поведение. Пользовательские такты ЦП Установите пользовательское значение тактов ЦП. Более высокие значения могут увеличить производительность, но также могут вызвать зависание игры. Рекомендуется диапазон 77–21000. Такты @@ -499,6 +554,8 @@ Хаки + Тактовая частота ГПУ + Заставляет игру думать, что работа ГПУ завершается быстрее, чем на самом деле, поэтому она перестаёт снижать разрешение и дистанцию прорисовки, чтобы подстраиваться под тактовые частоты Switch. Пропустить внутреннюю инвалидацию ЦП Пропускает некоторые инвалидации кэша на стороне ЦП при обновлениях памяти, уменьшая нагрузку на процессор и повышая производительность. Может вызывать сбои в некоторых играх. Исправить эффекты размытия @@ -545,6 +602,7 @@ ЦП + Тактовая частота Использовать Auto Stub Автоматически заглушает отсутствующие сервисы и функции. Может улучшить совместимость, но вызывать сбои и проблемы стабильности. @@ -559,7 +617,6 @@ Логирование Сбрасывать логи отладки построчно Сбрасывает логи отладки после каждой написанной строки, упрощая отладку в случае сбоев или зависаний. - Ведение журнала ГПУ Уровень журналирования @@ -944,6 +1001,16 @@ 6 ГБ (Небезопасно) 8 ГБ (Небезопасно) + + Обычная + Турбо + Разгон + + + Обычная + Турбо + Разгон + Очень малый (16 МБ) Малый (32 МБ) @@ -1071,7 +1138,6 @@ Светлая Темная - Чёрный фон При использовании темной темы применяйте черный фон. diff --git a/src/android/app/src/main/res/values-sr/strings.xml b/src/android/app/src/main/res/values-sr/strings.xml index 71f7d600c0..b5d6476e1b 100644 --- a/src/android/app/src/main/res/values-sr/strings.xml +++ b/src/android/app/src/main/res/values-sr/strings.xml @@ -60,7 +60,6 @@ Ова оптимизација убрзава приступ меморији од стране гостујућег програма. Укључивање изазива да се читања/уписа меморије госта обављају директно у меморији и користе MMU домаћина. Искључивање присиљава све приступе меморији да користе софтверску емулацију MMU. НВДЕЦ Емулација - Изаберите како се видео декодирање (НВДЕЦ) обрађује током секс и увозних интросија. Ниједан @@ -401,7 +400,6 @@ Сечеља Записници за уклањање погрешака по линији Испушта ознаке за уклањање погрешака на сваком писменом линијском линији, олакшавање уклањања погрешака у случајевима пада или замрзавања. - Излазни мотор Запремина diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index e725c991cd..54ce8dfa72 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -106,7 +106,6 @@ Емуляція NVDEC - Обробка відео під час катсцен Вимкнено @@ -554,7 +553,6 @@ Журналювання Скидати логи налагодження по рядках Скидає логи налагодження після кожного написаного рядка, полегшуючи налагодження у випадках збоїв або зависань. - Журналювання ГП Рівень журналювання @@ -1053,7 +1051,6 @@ Світла Темна - Чорний фон Використовувати чорний фон у темній темі. diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml index 793318af78..d08d87c64a 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -62,7 +62,6 @@ Tối ưu hóa này tăng tốc độ truy cập bộ nhớ của chương trình khách. Bật nó lên khiến các thao tác đọc/ghi bộ nhớ khách được thực hiện trực tiếp vào bộ nhớ và sử dụng MMU của Máy chủ. Tắt tính năng này buộc tất cả quyền truy cập bộ nhớ phải sử dụng Giả lập MMU Phần mềm. Giả lập NVDEC - Chọn cách xử lý giải mã video Tắt @@ -373,7 +372,6 @@ Ghi nhật ký Xả nhật ký gỡ lỗi theo dòng Xả nhật ký gỡ lỗi trên mỗi dòng được viết, giúp gỡ lỗi dễ dàng hơn trong trường hợp bị treo hoặc sập. - Công cụ xuất âm thanh Âm lượng diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index a1971c6b9b..930058b42d 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -106,7 +106,7 @@ NVDEC模拟 - 播放过场与开场动画期间的视频解码处理方式(NVDEC)。 + 如果在过场动画中出现崩溃就切换为 CPU。 禁用 @@ -291,6 +291,67 @@ GPU驱动获取器 GPU 驱动管理器 安装替代的驱动程序以获得更好的性能和精度 + 帧生成 + 配置针对此游戏的帧生成设定 + 设定要在使用无损缩放渲染的帧之间应用的插帧。启用后强制采用FIFO呈现模式 。 + 多帧生成 + 对于每个渲染帧,设定应显示的帧。数值越高,所消耗的 GPU 时间就越会成倍增多。如果设定超过显示器能力的帧数,将会降低模拟速度。 + 2x + 3x + 4x + 目标帧率 + 选取一个符合显示器实际能能力的帧率。增幅会自动调整以保持设定的帧率不变,并回调任何会导致游戏运行变慢的设定。 + 使用固定增幅 + 60 FPS + 90 FPS + 120 FPS + 144 FPS + 165 FPS + 帧队列目标 + 在显示之前有多少已完成渲染的帧正在等待。较大的队列可以缓解 GPU 突发的压力,但会增加输入延迟。 + 最低延迟 (无缓冲) + 平衡 (1 帧) + 最平滑 (2 帧) + 将运动预估与游戏匹配 + 在游戏实际渲染的分辨率下估算运动,而不是在放大后的输出上。不会影响精确性,因为放大并不会增加运动细节。 + 运动预估分辨率 + 光流通道的分辨率,以输出的比例表示。降低它是提升性能最经济的做法。 + 半精度着色器 + 使用 16 位着色器变体。如果驱动或文件不支持会自动回退。 + 转储已生成的帧 + 为了排查问题,把光流 mip 级别和插值帧写入 lossless/debug 文件夹一次 + 帧生成不可用 + 这个 GPU 驱动不支持无损缩放着色器所需的 Vulkan 内存模型。 + 作为可选项。请提供您自己的 Lossless.dll 以便在之后可以启用帧生成。 + 安装 Lossless.dll + 帧生成需要您自己从 Lossless Scaling 获得合法的 Lossless.dll 副本 + 选择其它 Lossless.dll 副本 + 帧生成 + 支持 + 不支持 (无 Vulkan 内存模型) + 无损缩放 + 提供您自己的 Lossless.dll 文件以启用帧生成 + 已安装 + 未安装 + 替换 + 移除 + 删除已安装的 Lossless.dll 及其准备好的着色器 + 帧生成将停止工作,直到您重新安装 Lossless.dll。您的原始文件不会受到影响。 + 未安装 Lossless.dll + 请从设置 › 无损缩放安装它以使用帧生成。 + 请先关闭游戏 + 无法在游戏运行时更改 Lossless.dll。 + 没有可以移除的项目 + 尚未安装 Lossless.dll。 + 正在准备帧生成着色器... + 已成功安装 Lossless.dll + 无法安装 Lossless.dll  + 无法复制选定的文件。 + 无法读取选定的文件。 + 选定的文件不是一个 Windows 动态链接库。请从您的 Lossless Scaling 安装目录中选择 Lossless.dll。 + 此副本的 Lossless.dll 中尚未包含帧生成着色器。请更新 Lossless Scaling 然后重试。 + 无法翻译帧生成着色器。尚未支持此版本的 Lossless Scaling。 + 已翻译的着色器无法写入到存储中。请确认其是否拥有足够的可用空间。 高级设置 更改模拟器设置 最近游玩 @@ -559,7 +620,6 @@ 日志记录 按行刷新调试日志 在每行写入时刷新调试日志,使在崩溃或冻结时调试更容易。 - GPU 日志 日志等级 @@ -1081,7 +1141,6 @@ 浅色 深色 - 使用黑色背景 使用深色主题时,套用黑色背景。 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index b529d42437..28d0e93b4e 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -106,7 +106,7 @@ NVDEC模擬 - 選擇影片解碼(NVDEC)的方式 + 若在過場動畫中當機請切換成 CPU 無 @@ -182,7 +182,7 @@ 隱藏空房間 點擊重新整理以重試 搜尋房間… - 首選遊戲 + 遊戲 大廳類型 長度需為3-20個字元 必填 @@ -237,11 +237,11 @@ 更新安裝失敗:%1$s 搜尋 設定 - 找不到檔案,或者尚未選取遊戲目錄。 + 找不到檔案,或者尚未選取遊戲目錄 管理遊戲資料夾 允許 Eden 尋找您的遊戲檔案 跳過選擇遊戲資料夾? - 如果未選擇遊戲資料夾,遊戲將不會顯示在遊戲清單。 + 如果未選擇遊戲資料夾,遊戲將不會顯示在遊戲清單 https://yuzu-mirror.github.io/help/quickstart/#dumping-games 搜尋遊戲 搜尋設定 @@ -291,6 +291,38 @@ GPU驅動程式下載器 GPU 驅動程式管理員 安裝替代驅動程式以取得潛在的更佳效能或準確度 + 影格生成 + 調整此遊戲的影格生成設定 + 使用 Lossless Scaling 在已渲染的影格之間插入補間影格。啟用此功能時,會強制採用 FIFO 垂直同步 + 影格倍率 + 設定在每個已渲染的影格中要顯示的影格數。數值越高所需的 GPU 運算時間也會按比例增加。若要求的影格數超過裝置顯示器能呈現的數量將會降低模擬速度 + 2x + 3x + 4x + 目標影格率 + 選擇裝置顯示器能實際呈現的影格率。之後倍率器會自動升高或降低以維持影格率。如果某個調整導致遊戲本身運作變慢,則會自動復原該設定 + 使用固定倍率 + 60 FPS + 90 FPS + 120 FPS + 144 FPS + 165 FPS + 影格佇列目標 + 最多允許多少個已完成的影格在顯示器前等待,較大的佇列可以吸收 GPU 突發負載,但會增加輸入延遲 + 最低延遲(無緩衝) + 平衡(1影格) + 最流暢(2影格) + 配合遊戲調整運動預測 + 以遊戲實際渲染的解析度而非升頻後的輸出進行運動預測。由於升頻後不會增加任何動態細節,因此不會影響準確度 + 運動預測解析度 + 光流處理的解析度,以輸出解析度的比例表示。降低此設定值是減少效能負載最有效的方法 + 半準確著色器 + 使用16位元著色器。如果驅動程式或著色器檔案不支援則會自動切換成其它版本 + 傾印生成的著色器 + 將光流的 MIP 層級與補間影格寫入 Eden 資料夾中的 lossless\debug 資料夾以便進行疑難排解 + 無法使用影格生成 + Lossless Scaling 的著色器需要 Vulkan 記憶體模型,所選的驅動程式不支援該功能 + 可選擇安裝自己擁有的 Lossless.dll 以在之後啟用影格生成功能 進階設定 進行模擬器設定 最近遊玩 @@ -559,7 +591,6 @@ 日誌 按行寫入偵錯日誌 在每行寫入時重新整理偵錯日誌,讓程式在當機或閃退時更容易偵錯。 - GPU 日誌 記錄層級 @@ -695,7 +726,7 @@ 導入完成 使用全域設定 操作已成功完成 - 下載 + 確認 載入 儲存 @@ -868,7 +899,7 @@ 需要GPU驅動程式 這個遊戲的設定需要 \"%s\"驅動程式,而它並沒有安裝在您的裝置上\n\n要下載並安裝此驅動程式嗎? 驅動程式下載已取消。沒有所需的驅動程式無法啟動遊戲。 - 遷移 + 下載 結束模擬 @@ -1006,7 +1037,6 @@ 淺色 深色 - 黑色背景 使用深色主題時,套用黑色背景。 From ecb2ae4076817178ec8013f18d5291e3451da193 Mon Sep 17 00:00:00 2001 From: xbzk Date: Tue, 8 Sep 2026 20:05:56 +0200 Subject: [PATCH 007/128] [settings] move program_args and debug_knobs back to debugging category and make them pergameable (#4378) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- I have moved debug_knobs and program_args to System category, to make them pergameable without hassle. But the hassle came: They were automatically readded to Qt's System tab, doubling them. If it were to face hassle either way, the right thing is to move them back to Debugging category, then make them exceptionally pergameable. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4378 Reviewed-by: lizzie Reviewed-by: CamilleLaVey --- src/common/settings.h | 4 ++-- src/frontend_common/config.cpp | 32 +++++++++++++++++++++----------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/common/settings.h b/src/common/settings.h index 60cf874306..d45f0b7bbc 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -858,7 +858,7 @@ struct Values { SwitchableSetting program_args{linkage, std::string(), "program_args", - Category::System, + Category::Debugging, Specialization::Default, true, // save_ - persist in config file false}; // runtime_modifiable_ - startup-only @@ -904,7 +904,7 @@ struct Values { 0, 65535, "debug_knobs", - Category::System, + Category::Debugging, Specialization::Countable, true, true}; diff --git a/src/frontend_common/config.cpp b/src/frontend_common/config.cpp index b44a146b38..f61192dfae 100644 --- a/src/frontend_common/config.cpp +++ b/src/frontend_common/config.cpp @@ -299,12 +299,17 @@ void Config::ReadDataStorageValues() { void Config::ReadDebuggingValues() { BeginGroup(Settings::TranslateCategory(Settings::Category::Debugging)); - // Intentionally not using the QT default setting as this is intended to be changed in the ini - Settings::values.record_frame_times = - ReadBooleanSetting(std::string("record_frame_times"), std::make_optional(false)); + if (global) { + // Intentionally not using the QT default setting as this is intended to be changed in the ini + Settings::values.record_frame_times = + ReadBooleanSetting(std::string("record_frame_times"), std::make_optional(false)); - ReadCategory(Settings::Category::Debugging); - ReadCategory(Settings::Category::DebuggingGraphics); + ReadCategory(Settings::Category::Debugging); + ReadCategory(Settings::Category::DebuggingGraphics); + } else { + ReadSettingGeneric(&Settings::values.program_args); + ReadSettingGeneric(&Settings::values.debug_knobs); + } EndGroup(); } @@ -415,12 +420,12 @@ void Config::ReadLibraryAppletValues() { void Config::ReadValues() { if (global) { ReadDataStorageValues(); - ReadDebuggingValues(); ReadDisabledAddOnValues(); ReadServiceValues(); ReadWebServiceValues(); ReadMiscellaneousValues(); } + ReadDebuggingValues(); ReadLibraryAppletValues(); ReadNetworkValues(); ReadControlValues(); @@ -511,13 +516,13 @@ void Config::SaveValues() { if (global) { LOG_DEBUG(Config, "Saving global generic configuration values"); SaveDataStorageValues(); - SaveDebuggingValues(); SaveDisabledAddOnValues(); SaveWebServiceValues(); SaveMiscellaneousValues(); } else { LOG_DEBUG(Config, "Saving only generic configuration values"); } + SaveDebuggingValues(); SaveLibraryAppletValues(); SaveNetworkValues(); SaveControlValues(); @@ -600,11 +605,16 @@ void Config::SaveDataStorageValues() { void Config::SaveDebuggingValues() { BeginGroup(Settings::TranslateCategory(Settings::Category::Debugging)); - // Intentionally not using the QT default setting as this is intended to be changed in the ini - WriteBooleanSetting(std::string("record_frame_times"), Settings::values.record_frame_times); + if (global) { + // Intentionally not using the QT default setting as this is intended to be changed in the ini + WriteBooleanSetting(std::string("record_frame_times"), Settings::values.record_frame_times); - WriteCategory(Settings::Category::Debugging); - WriteCategory(Settings::Category::DebuggingGraphics); + WriteCategory(Settings::Category::Debugging); + WriteCategory(Settings::Category::DebuggingGraphics); + } else { + WriteSettingGeneric(&Settings::values.program_args); + WriteSettingGeneric(&Settings::values.debug_knobs); + } EndGroup(); } From e27650cf4232c89303fdea9aae205b63c8dbec17 Mon Sep 17 00:00:00 2001 From: xbzk Date: Tue, 8 Sep 2026 20:10:41 +0200 Subject: [PATCH 008/128] [nce] avoid cyrilic utf8 strings being interpreted as exclusive store instructions (#4369) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Problem: In cyrilic idioms, Absolum won't past beyond 1st area (intro miniboss). From the user panic i`ve extracted these strings: > GlobalState.request_next() > save_state_to_saveGame(...) > platform.ProcessSave() > bin_serialize_to_file(...) > StandaloneTypeModel.Write(SaveGame, ...) > Write(SaveGame.AdventureSaveSlot, ...) > Write(PlayerState, ...) > ProtoBuf.ProtoWriter.WriteString(...) + 0xcc > ProtoBuf.Helpers.DebugAssert(...) > Debug.Fail(...) By debugging ProtoBuf.ProtoWriter.WriteString(...) argument it was found that the string Отлично! (Great! expression for combos between 6 and 30 iirc) was reaching a size comparison of different values and causing an assert in guest side.. It seems the game tries to save highest combo level. I've managed to skip this bug by doing a perfect combo for entire level, so that the problematic word never was generated or attempted to be saved. After further research, the issue chain was identified: Game maths literal string size via two ways and compare, and one of them was getting replaced by a wrong value due to Eden letting the literal string be interpreted as a real instruction. Logic added: const bool pair = decltype(l)::ExtractValue(raw) & 1; const bool fixed_rt2 = decltype(rt2)::ExtractValue(raw) == 0b11111; return pair || fixed_rt2; - pair checks bit 21 (L & 1): register-pair instructions actually use Rt2, so they remain accepted. - For single-register forms, require Rt2 == 31. The table word fails this check, so NCE leaves it intact. Sources https://www.scs.stanford.edu/~zyedidia/arm64/stxrb.html https://www.scs.stanford.edu/~zyedidia/arm64/stxp.html https://github.com/qemu/qemu/blob/master/target/arm/tcg/a64.decode#L344 Altough the solution is a case specific guard, it is data agnostic: This is a true fix to avoid a specific case in which a literal may be interpreted as a valid instruction, without interfering with other true instruction cases. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4369 Reviewed-by: lizzie Reviewed-by: CamilleLaVey --- src/core/arm/nce/instructions.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/arm/nce/instructions.h b/src/core/arm/nce/instructions.h index 451778df65..6c71b6acf2 100644 --- a/src/core/arm/nce/instructions.h +++ b/src/core/arm/nce/instructions.h @@ -121,7 +121,10 @@ union Exclusive { constexpr explicit Exclusive(u32 raw_) : raw{raw_} {} constexpr bool Verify() { - return this->GetSig() == 0x10; + if (this->GetSig() != 0x10) return false; + const bool pair = decltype(l)::ExtractValue(raw) & 1; + const bool fixed_rt2 = decltype(rt2)::ExtractValue(raw) == 0b11111; + return pair || fixed_rt2; } constexpr u32 GetSig() { From 1036982d2f70af9d72e9827ffab73d4349508bbb Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Tue, 8 Sep 2026 20:39:08 +0200 Subject: [PATCH 009/128] partial revert 54cd5fb8eb (#4355) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- It fixes display issues when the overlay applet is enabled, thanks Bruno. Fixes freezes when enabling real applet keyboard in qlaunch. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4355 Reviewed-by: CamilleLaVey Reviewed-by: lizzie Reviewed-by: Maufeat --- .../hle/service/am/display_layer_manager.cpp | 17 +++++--------- .../hle/service/vi/shared_buffer_manager.cpp | 23 ------------------- 2 files changed, 6 insertions(+), 34 deletions(-) diff --git a/src/core/hle/service/am/display_layer_manager.cpp b/src/core/hle/service/am/display_layer_manager.cpp index 4f26794831..494e8a132b 100644 --- a/src/core/hle/service/am/display_layer_manager.cpp +++ b/src/core/hle/service/am/display_layer_manager.cpp @@ -73,20 +73,16 @@ Result DisplayLayerManager::CreateManagedDisplayLayer(u64* out_layer_id) { R_TRY(m_manager_display_service->CreateManagedLayer( out_layer_id, 0, display_id, Service::AppletResourceUserId{m_process->GetProcessId()})); - m_manager_display_service->SetLayerVisibility(m_visible, *out_layer_id); - (void)m_display_service->GetContainer()->SetLayerStackMask(*out_layer_id, - this->GetLayerStackMask()); - if (m_applet_id != AppletId::Application) { (void)m_manager_display_service->SetLayerBlending(m_blending_enabled, *out_layer_id); if (m_applet_id == AppletId::OverlayDisplay) { - (void)m_manager_display_service->SetLayerZIndex(Overlay, *out_layer_id); + (void)m_manager_display_service->SetLayerZIndex(-1, *out_layer_id); (void)m_display_service->GetContainer()->SetLayerIsOverlay(*out_layer_id, true); } else { - (void)m_manager_display_service->SetLayerZIndex(Foreground, *out_layer_id); + (void)m_manager_display_service->SetLayerZIndex(1, *out_layer_id); } } - + (void)m_display_service->GetContainer()->SetLayerZIndex(*out_layer_id, true); m_managed_display_layers.emplace(*out_layer_id); R_SUCCEED(); @@ -126,12 +122,11 @@ Result DisplayLayerManager::IsSystemBufferSharingEnabled() { // Ensure the overlay layer is visible m_manager_display_service->SetLayerVisibility(m_visible, m_system_shared_layer_id); - (void)m_display_service->GetContainer()->SetLayerStackMask(m_system_shared_layer_id, - this->GetLayerStackMask()); m_manager_display_service->SetLayerBlending(m_blending_enabled, m_system_shared_layer_id); - s32 initial_z = Foreground; + s32 initial_z = 1; + (void)m_display_service->GetContainer()->SetLayerZIndex(m_system_shared_layer_id, true); if (m_applet_id == AppletId::OverlayDisplay) { - initial_z = Overlay; + initial_z = -1; (void)m_display_service->GetContainer()->SetLayerIsOverlay(m_system_shared_layer_id, true); } m_manager_display_service->SetLayerZIndex(initial_z, m_system_shared_layer_id); diff --git a/src/core/hle/service/vi/shared_buffer_manager.cpp b/src/core/hle/service/vi/shared_buffer_manager.cpp index 483c1f71ba..2380e15d93 100644 --- a/src/core/hle/service/vi/shared_buffer_manager.cpp +++ b/src/core/hle/service/vi/shared_buffer_manager.cpp @@ -300,28 +300,6 @@ Result SharedBufferManager::CreateSession(Kernel::KProcess* owner_process, u64* } } - // Claim a presentation slot range. - u32 slot_base = 0; - - std::array in_use{}; - for (const auto& [existing_aruid, existing] : m_sessions) { - const u32 index = existing.presentation_slot_base / SharedBufferSlotsPerSession; - - if (index < in_use.size()) - in_use[index] = true; - } - - u32 index = 0; - while (index < in_use.size() && in_use[index]) - index++; - - if (index >= in_use.size()) { - LOG_ERROR(Service_VI, "Out of shared buffer presentation slots ({} sessions)", SharedBufferMaxSessions); - R_THROW(VI::ResultOperationFailed); - } - - slot_base = index * SharedBufferSlotsPerSession; - // Map into process. Common::ProcessAddress map_address{}; R_TRY(MapSharedBufferIntoProcessAddressSpace(std::addressof(map_address), m_buffer_page_group, @@ -330,7 +308,6 @@ Result SharedBufferManager::CreateSession(Kernel::KProcess* owner_process, u64* // Create new session. auto [it, was_emplaced] = m_sessions.emplace(aruid, SharedBufferSession{}); auto& session = it->second; - session.presentation_slot_base = slot_base; auto& container = m_nvdrv->GetContainer(); session.session_id = container.OpenSession(owner_process); From fdd8d4252c60b055cac2d792b414ba15046d484d Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 8 Sep 2026 20:39:39 +0200 Subject: [PATCH 010/128] [common] remove unused vector_math.h fluff (#4333) Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- We don't use half of this file for anything -- it's dead code also the NEON intrinsic replacements suck -- we are not beating GLM (plus we use registers for decomposition instead of using vec regs like everyone else does, so the "optimizations" dont matter) Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4333 Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- src/common/CMakeLists.txt | 1 - src/common/quaternion.h | 79 -- src/common/vector_math.h | 802 ++---------------- .../set/setting_formats/device_settings.h | 9 +- .../set/setting_formats/system_settings.h | 8 +- src/hid_core/frontend/emulated_console.cpp | 4 +- src/hid_core/frontend/emulated_console.h | 13 +- src/hid_core/frontend/emulated_controller.cpp | 4 +- src/hid_core/frontend/emulated_controller.h | 10 +- src/hid_core/frontend/motion_input.cpp | 180 ++-- src/hid_core/frontend/motion_input.h | 44 +- src/hid_core/hid_types.h | 8 +- src/hid_core/resources/shared_memory_format.h | 4 +- .../resources/six_axis/seven_six_axis.cpp | 11 +- .../resources/six_axis/seven_six_axis.h | 8 +- src/hid_core/resources/six_axis/six_axis.cpp | 9 +- src/input_common/drivers/mouse.cpp | 79 +- src/input_common/drivers/mouse.h | 10 +- .../configure_input_player_widget.cpp | 42 +- .../configure_input_player_widget.h | 4 +- 20 files changed, 315 insertions(+), 1014 deletions(-) delete mode 100644 src/common/quaternion.h diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index d90190e6a0..3a6d2acf8a 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -89,7 +89,6 @@ add_library( param_package.h parent_of_member.h point.h - quaternion.h range_map.h range_mutex.h range_sets.h diff --git a/src/common/quaternion.h b/src/common/quaternion.h deleted file mode 100644 index 5bb5f2af08..0000000000 --- a/src/common/quaternion.h +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-FileCopyrightText: 2016 Citra Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "common/vector_math.h" - -namespace Common { - -template -class Quaternion { -public: - Vec3 xyz; - T w{}; - - [[nodiscard]] Quaternion Inverse() const { - return {-xyz, w}; - } - - [[nodiscard]] Quaternion operator+(const Quaternion& other) const { - return {xyz + other.xyz, w + other.w}; - } - - [[nodiscard]] Quaternion operator-(const Quaternion& other) const { - return {xyz - other.xyz, w - other.w}; - } - - [[nodiscard]] Quaternion operator*( - const Quaternion& other) const { - return {xyz * other.w + other.xyz * w + Cross(xyz, other.xyz), - w * other.w - Dot(xyz, other.xyz)}; - } - - [[nodiscard]] Quaternion Normalized() const { - T length = std::sqrt(xyz.Length2() + w * w); - return {xyz / length, w / length}; - } - - [[nodiscard]] std::array ToMatrix() const { - const T x2 = xyz[0] * xyz[0]; - const T y2 = xyz[1] * xyz[1]; - const T z2 = xyz[2] * xyz[2]; - - const T xy = xyz[0] * xyz[1]; - const T wz = w * xyz[2]; - const T xz = xyz[0] * xyz[2]; - const T wy = w * xyz[1]; - const T yz = xyz[1] * xyz[2]; - const T wx = w * xyz[0]; - - return {1.0f - 2.0f * (y2 + z2), - 2.0f * (xy + wz), - 2.0f * (xz - wy), - 0.0f, - 2.0f * (xy - wz), - 1.0f - 2.0f * (x2 + z2), - 2.0f * (yz + wx), - 0.0f, - 2.0f * (xz + wy), - 2.0f * (yz - wx), - 1.0f - 2.0f * (x2 + y2), - 0.0f, - 0.0f, - 0.0f, - 0.0f, - 1.0f}; - } -}; - -template -[[nodiscard]] auto QuaternionRotate(const Quaternion& q, const Vec3& v) { - return v + 2 * Cross(q.xyz, Cross(q.xyz, v) + v * q.w); -} - -[[nodiscard]] inline Quaternion MakeQuaternion(const Vec3& axis, float angle) { - return {axis * std::sin(angle / 2), std::cos(angle / 2)}; -} - -} // namespace Common diff --git a/src/common/vector_math.h b/src/common/vector_math.h index 829a79ce5a..f99fdcb01e 100644 --- a/src/common/vector_math.h +++ b/src/common/vector_math.h @@ -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-FileCopyrightText: 2014 Tony Wasserka @@ -7,752 +7,128 @@ #pragma once -#ifdef __ARM_NEON -#include -#endif - #include #include namespace Common { -template -class Vec2; -template -class Vec3; -template -class Vec4; - -template -class Vec2 { +template +class Vec { public: - T x{}; - T y{}; + std::array elems{}; - constexpr Vec2() = default; - constexpr Vec2(const T& x_, const T& y_) : x(x_), y(y_) {} + constexpr Vec() = default; + constexpr Vec(T e0) noexcept : elems{e0} {} + constexpr Vec(T e0, T e1) noexcept : elems{e0, e1} {} + constexpr Vec(T e0, T e1, T e2) noexcept : elems{e0, e1, e2} {} + constexpr Vec(T e0, T e1, T e2, T e4) noexcept : elems{e0, e1, e2, e4} {} + //explicit constexpr Vec(const std::initializer_list elems_) noexcept : elems{elems_} {} - template - [[nodiscard]] constexpr Vec2 Cast() const { - return Vec2(static_cast(x), static_cast(y)); + [[nodiscard]] constexpr Vec operator+(const Vec o) const noexcept { + Vec r{}; + for (size_t i = 0; i < N; ++i) + r.elems[i] = elems[i] + o.elems[i]; + return r; } + constexpr Vec operator+=(const Vec o) noexcept { return *this = *this + o; } - [[nodiscard]] static constexpr Vec2 AssignToAll(const T& f) { - return Vec2{f, f}; - } - - [[nodiscard]] constexpr Vec2 operator+(const Vec2& other) const { - return {x + other.x, y + other.y}; - } - constexpr Vec2& operator+=(const Vec2& other) { - x += other.x; - y += other.y; - return *this; - } - [[nodiscard]] constexpr Vec2 operator-(const Vec2& other) const { - return {x - other.x, y - other.y}; - } - constexpr Vec2& operator-=(const Vec2& other) { - x -= other.x; - y -= other.y; - return *this; + [[nodiscard]] constexpr Vec operator-(const Vec o) const noexcept { + Vec r{}; + for (size_t i = 0; i < N; ++i) + r.elems[i] = elems[i] - o.elems[i]; + return r; } + constexpr Vec operator-=(const Vec o) noexcept { return *this = *this - o; } template - [[nodiscard]] constexpr Vec2, U>> operator-() const { - return {-x, -y}; - } - [[nodiscard]] constexpr Vec2 operator*(const Vec2& other) const { - return {x * other.x, y * other.y}; + [[nodiscard]] constexpr Vec, U>, N> operator-() const noexcept { + Vec r{}; + for (size_t i = 0; i < N; ++i) + r.elems[i] = -elems[i]; + return r; } + [[nodiscard]] constexpr Vec operator*(const Vec o) const noexcept { + Vec r{}; + for (size_t i = 0; i < N; ++i) + r.elems[i] = elems[i] * o.elems[i]; + return r; + } template - [[nodiscard]] constexpr Vec2 operator*(const V& f) const { + [[nodiscard]] constexpr Vec operator*(const V f) const noexcept { using TV = decltype(T{} * V{}); using C = std::common_type_t; - - return { - static_cast(static_cast(x) * static_cast(f)), - static_cast(static_cast(y) * static_cast(f)), - }; + Vec r{}; + for (size_t i = 0; i < N; ++i) + r.elems[i] = TV(C(elems[i]) * C(f)); + return r; } + template + constexpr Vec operator*=(const V f) noexcept { return *this = *this * f; } template - constexpr Vec2& operator*=(const V& f) { - *this = *this * f; - return *this; - } - - template - [[nodiscard]] constexpr Vec2 operator/(const V& f) const { + [[nodiscard]] constexpr Vec operator/(const V f) const noexcept { using TV = decltype(T{} / V{}); using C = std::common_type_t; - - return { - static_cast(static_cast(x) / static_cast(f)), - static_cast(static_cast(y) / static_cast(f)), - }; + Vec r{}; + for (size_t i = 0; i < N; ++i) + r.elems[i] = TV(C(elems[i]) / C(f)); + return r; } - template - constexpr Vec2& operator/=(const V& f) { - *this = *this / f; - return *this; - } + constexpr Vec operator/=(const V f) noexcept { return *this = *this / f; } - [[nodiscard]] constexpr T Length2() const { - return x * x + y * y; + [[nodiscard]] constexpr T Length2() const noexcept { + T r{}; + for (size_t i = 0; i < N; ++i) + r += elems[i] * elems[i]; + return r; } - // Only implemented for T=float - [[nodiscard]] float Length() const; - [[nodiscard]] float Normalize(); // returns the previous length, which is often useful + [[nodiscard]] T Length() const { return T(std::sqrt(float(Length2()))); } + [[nodiscard]] Vec Normalized() const { return *this / Length(); } + [[nodiscard]] constexpr T& operator[](std::size_t i) noexcept { return elems[i]; } + [[nodiscard]] constexpr const T& operator[](std::size_t i) const noexcept { return elems[i]; } - [[nodiscard]] constexpr T& operator[](std::size_t i) { - return *((&x) + i); - } - [[nodiscard]] constexpr const T& operator[](std::size_t i) const { - return *((&x) + i); - } + [[nodiscard]] std::array ToMatrix() const { + const T x2 = elems[0] * elems[0]; + const T y2 = elems[1] * elems[1]; + const T z2 = elems[2] * elems[2]; - constexpr void SetZero() { - x = 0; - y = 0; - } - - // Common aliases: UV (texel coordinates), ST (texture coordinates) - [[nodiscard]] constexpr T& u() { - return x; - } - [[nodiscard]] constexpr T& v() { - return y; - } - [[nodiscard]] constexpr T& s() { - return x; - } - [[nodiscard]] constexpr T& t() { - return y; - } - - [[nodiscard]] constexpr const T& u() const { - return x; - } - [[nodiscard]] constexpr const T& v() const { - return y; - } - [[nodiscard]] constexpr const T& s() const { - return x; - } - [[nodiscard]] constexpr const T& t() const { - return y; - } - - // swizzlers - create a subvector of specific components - [[nodiscard]] constexpr Vec2 yx() const { - return Vec2(y, x); - } - [[nodiscard]] constexpr Vec2 vu() const { - return Vec2(y, x); - } - [[nodiscard]] constexpr Vec2 ts() const { - return Vec2(y, x); + const T xy = elems[0] * elems[1]; + const T wz = elems[3] * elems[2]; + const T xz = elems[0] * elems[2]; + const T wy = elems[3] * elems[1]; + const T yz = elems[1] * elems[2]; + const T wx = elems[3] * elems[0]; + return { + 1.0f - 2.0f * (y2 + z2), + 2.0f * (xy + wz), + 2.0f * (xz - wy), + 0.0f, + 2.0f * (xy - wz), + 1.0f - 2.0f * (x2 + z2), + 2.0f * (yz + wx), + 0.0f, + 2.0f * (xz + wy), + 2.0f * (yz - wx), + 1.0f - 2.0f * (x2 + y2), + 0.0f, + 0.0f, + 0.0f, + 0.0f, + 1.0f + }; } }; -template -[[nodiscard]] constexpr Vec2 operator*(const V& f, const Vec2& vec) { +template +[[nodiscard]] constexpr Vec operator*(const V f, const Vec v) noexcept { using C = std::common_type_t; - - return Vec2(static_cast(static_cast(f) * static_cast(vec.x)), - static_cast(static_cast(f) * static_cast(vec.y))); -} - -using Vec2f = Vec2; - -template <> -inline float Vec2::Length() const { - return std::sqrt(x * x + y * y); -} - -template <> -inline float Vec2::Normalize() { - float length = Length(); - *this /= length; - return length; -} - -template -class Vec3 { -public: - T x{}; - T y{}; - T z{}; - - constexpr Vec3() = default; - constexpr Vec3(const T& x_, const T& y_, const T& z_) : x(x_), y(y_), z(z_) {} - - template - [[nodiscard]] constexpr Vec3 Cast() const { - return Vec3(static_cast(x), static_cast(y), static_cast(z)); - } - - [[nodiscard]] static constexpr Vec3 AssignToAll(const T& f) { - return Vec3(f, f, f); - } - - [[nodiscard]] constexpr Vec3 operator+(const Vec3& other) const { - return {x + other.x, y + other.y, z + other.z}; - } - - constexpr Vec3& operator+=(const Vec3& other) { - x += other.x; - y += other.y; - z += other.z; - return *this; - } - - [[nodiscard]] constexpr Vec3 operator-(const Vec3& other) const { - return {x - other.x, y - other.y, z - other.z}; - } - - constexpr Vec3& operator-=(const Vec3& other) { - x -= other.x; - y -= other.y; - z -= other.z; - return *this; - } - - template - [[nodiscard]] constexpr Vec3, U>> operator-() const { - return {-x, -y, -z}; - } - - [[nodiscard]] constexpr Vec3 operator*(const Vec3& other) const { - return {x * other.x, y * other.y, z * other.z}; - } - - template - [[nodiscard]] constexpr Vec3 operator*(const V& f) const { - using TV = decltype(T{} * V{}); - using C = std::common_type_t; - - return { - static_cast(static_cast(x) * static_cast(f)), - static_cast(static_cast(y) * static_cast(f)), - static_cast(static_cast(z) * static_cast(f)), - }; - } - - template - constexpr Vec3& operator*=(const V& f) { - *this = *this * f; - return *this; - } - template - [[nodiscard]] constexpr Vec3 operator/(const V& f) const { - using TV = decltype(T{} / V{}); - using C = std::common_type_t; - - return { - static_cast(static_cast(x) / static_cast(f)), - static_cast(static_cast(y) / static_cast(f)), - static_cast(static_cast(z) / static_cast(f)), - }; - } - - template - constexpr Vec3& operator/=(const V& f) { - *this = *this / f; - return *this; - } - - void RotateFromOrigin(float roll, float pitch, float yaw) { - float temp = y; - y = std::cos(roll) * y - std::sin(roll) * z; - z = std::sin(roll) * temp + std::cos(roll) * z; - - temp = x; - x = std::cos(pitch) * x + std::sin(pitch) * z; - z = -std::sin(pitch) * temp + std::cos(pitch) * z; - - temp = x; - x = std::cos(yaw) * x - std::sin(yaw) * y; - y = std::sin(yaw) * temp + std::cos(yaw) * y; - } - - [[nodiscard]] constexpr T Length2() const { - return x * x + y * y + z * z; - } - - // Only implemented for T=float - [[nodiscard]] float Length() const; - [[nodiscard]] Vec3 Normalized() const; - [[nodiscard]] float Normalize(); // returns the previous length, which is often useful - - [[nodiscard]] constexpr T& operator[](std::size_t i) { - return *((&x) + i); - } - - [[nodiscard]] constexpr const T& operator[](std::size_t i) const { - return *((&x) + i); - } - - constexpr void SetZero() { - x = 0; - y = 0; - z = 0; - } - - // Common aliases: UVW (texel coordinates), RGB (colors), STQ (texture coordinates) - [[nodiscard]] constexpr T& u() { - return x; - } - [[nodiscard]] constexpr T& v() { - return y; - } - [[nodiscard]] constexpr T& w() { - return z; - } - - [[nodiscard]] constexpr T& r() { - return x; - } - [[nodiscard]] constexpr T& g() { - return y; - } - [[nodiscard]] constexpr T& b() { - return z; - } - - [[nodiscard]] constexpr T& s() { - return x; - } - [[nodiscard]] constexpr T& t() { - return y; - } - [[nodiscard]] constexpr T& q() { - return z; - } - - [[nodiscard]] constexpr const T& u() const { - return x; - } - [[nodiscard]] constexpr const T& v() const { - return y; - } - [[nodiscard]] constexpr const T& w() const { - return z; - } - - [[nodiscard]] constexpr const T& r() const { - return x; - } - [[nodiscard]] constexpr const T& g() const { - return y; - } - [[nodiscard]] constexpr const T& b() const { - return z; - } - - [[nodiscard]] constexpr const T& s() const { - return x; - } - [[nodiscard]] constexpr const T& t() const { - return y; - } - [[nodiscard]] constexpr const T& q() const { - return z; - } - -// swizzlers - create a subvector of specific components -// e.g. Vec2 uv() { return Vec2(x,y); } -// _DEFINE_SWIZZLER2 defines a single such function, DEFINE_SWIZZLER2 defines all of them for all -// component names (x<->r) and permutations (xy<->yx) -#define _DEFINE_SWIZZLER2(a, b, name) \ - [[nodiscard]] constexpr Vec2 name() const { return Vec2(a, b); } -#define DEFINE_SWIZZLER2(a, b, a2, b2, a3, b3, a4, b4) \ - _DEFINE_SWIZZLER2(a, b, a##b); \ - _DEFINE_SWIZZLER2(a, b, a2##b2); \ - _DEFINE_SWIZZLER2(a, b, a3##b3); \ - _DEFINE_SWIZZLER2(a, b, a4##b4); \ - _DEFINE_SWIZZLER2(b, a, b##a); \ - _DEFINE_SWIZZLER2(b, a, b2##a2); \ - _DEFINE_SWIZZLER2(b, a, b3##a3); \ - _DEFINE_SWIZZLER2(b, a, b4##a4) - - DEFINE_SWIZZLER2(x, y, r, g, u, v, s, t); - DEFINE_SWIZZLER2(x, z, r, b, u, w, s, q); - DEFINE_SWIZZLER2(y, z, g, b, v, w, t, q); -#undef DEFINE_SWIZZLER2 -#undef _DEFINE_SWIZZLER2 -}; - -template -[[nodiscard]] constexpr Vec3 operator*(const V& f, const Vec3& vec) { - using C = std::common_type_t; - - return Vec3(static_cast(static_cast(f) * static_cast(vec.x)), - static_cast(static_cast(f) * static_cast(vec.y)), - static_cast(static_cast(f) * static_cast(vec.z))); -} - -template <> -inline float Vec3::Length() const { - return std::sqrt(x * x + y * y + z * z); -} - -template <> -inline Vec3 Vec3::Normalized() const { - return *this / Length(); -} - -template <> -inline float Vec3::Normalize() { - float length = Length(); - *this /= length; - return length; -} - -using Vec3f = Vec3; - -template -class Vec4 { -public: - T x{}; - T y{}; - T z{}; - T w{}; - - constexpr Vec4() = default; - constexpr Vec4(const T& x_, const T& y_, const T& z_, const T& w_) - : x(x_), y(y_), z(z_), w(w_) {} - - template - [[nodiscard]] constexpr Vec4 Cast() const { - return Vec4(static_cast(x), static_cast(y), static_cast(z), - static_cast(w)); - } - - [[nodiscard]] static constexpr Vec4 AssignToAll(const T& f) { - return Vec4(f, f, f, f); - } - - [[nodiscard]] constexpr Vec4 operator+(const Vec4& other) const { - return {x + other.x, y + other.y, z + other.z, w + other.w}; - } - - constexpr Vec4& operator+=(const Vec4& other) { - x += other.x; - y += other.y; - z += other.z; - w += other.w; - return *this; - } - - [[nodiscard]] constexpr Vec4 operator-(const Vec4& other) const { - return {x - other.x, y - other.y, z - other.z, w - other.w}; - } - - constexpr Vec4& operator-=(const Vec4& other) { - x -= other.x; - y -= other.y; - z -= other.z; - w -= other.w; - return *this; - } - - template - [[nodiscard]] constexpr Vec4, U>> operator-() const { - return {-x, -y, -z, -w}; - } - - [[nodiscard]] constexpr Vec4 operator*(const Vec4& other) const { - return {x * other.x, y * other.y, z * other.z, w * other.w}; - } - - template - [[nodiscard]] constexpr Vec4 operator*(const V& f) const { - using TV = decltype(T{} * V{}); - using C = std::common_type_t; - - return { - static_cast(static_cast(x) * static_cast(f)), - static_cast(static_cast(y) * static_cast(f)), - static_cast(static_cast(z) * static_cast(f)), - static_cast(static_cast(w) * static_cast(f)), - }; - } - - template - constexpr Vec4& operator*=(const V& f) { - *this = *this * f; - return *this; - } - - template - [[nodiscard]] constexpr Vec4 operator/(const V& f) const { - using TV = decltype(T{} / V{}); - using C = std::common_type_t; - - return { - static_cast(static_cast(x) / static_cast(f)), - static_cast(static_cast(y) / static_cast(f)), - static_cast(static_cast(z) / static_cast(f)), - static_cast(static_cast(w) / static_cast(f)), - }; - } - - template - constexpr Vec4& operator/=(const V& f) { - *this = *this / f; - return *this; - } - - [[nodiscard]] constexpr T Length2() const { - return x * x + y * y + z * z + w * w; - } - - [[nodiscard]] constexpr T& operator[](std::size_t i) { - return *((&x) + i); - } - - [[nodiscard]] constexpr const T& operator[](std::size_t i) const { - return *((&x) + i); - } - - constexpr void SetZero() { - x = 0; - y = 0; - z = 0; - w = 0; - } - - // Common alias: RGBA (colors) - [[nodiscard]] constexpr T& r() { - return x; - } - [[nodiscard]] constexpr T& g() { - return y; - } - [[nodiscard]] constexpr T& b() { - return z; - } - [[nodiscard]] constexpr T& a() { - return w; - } - - [[nodiscard]] constexpr const T& r() const { - return x; - } - [[nodiscard]] constexpr const T& g() const { - return y; - } - [[nodiscard]] constexpr const T& b() const { - return z; - } - [[nodiscard]] constexpr const T& a() const { - return w; - } - -// Swizzlers - Create a subvector of specific components -// e.g. Vec2 uv() { return Vec2(x,y); } - -// _DEFINE_SWIZZLER2 defines a single such function -// DEFINE_SWIZZLER2_COMP1 defines one-component functions for all component names (x<->r) -// DEFINE_SWIZZLER2_COMP2 defines two component functions for all component names (x<->r) and -// permutations (xy<->yx) -#define _DEFINE_SWIZZLER2(a, b, name) \ - [[nodiscard]] constexpr Vec2 name() const { return Vec2(a, b); } -#define DEFINE_SWIZZLER2_COMP1(a, a2) \ - _DEFINE_SWIZZLER2(a, a, a##a); \ - _DEFINE_SWIZZLER2(a, a, a2##a2) -#define DEFINE_SWIZZLER2_COMP2(a, b, a2, b2) \ - _DEFINE_SWIZZLER2(a, b, a##b); \ - _DEFINE_SWIZZLER2(a, b, a2##b2); \ - _DEFINE_SWIZZLER2(b, a, b##a); \ - _DEFINE_SWIZZLER2(b, a, b2##a2) - - DEFINE_SWIZZLER2_COMP2(x, y, r, g); - DEFINE_SWIZZLER2_COMP2(x, z, r, b); - DEFINE_SWIZZLER2_COMP2(x, w, r, a); - DEFINE_SWIZZLER2_COMP2(y, z, g, b); - DEFINE_SWIZZLER2_COMP2(y, w, g, a); - DEFINE_SWIZZLER2_COMP2(z, w, b, a); - DEFINE_SWIZZLER2_COMP1(x, r); - DEFINE_SWIZZLER2_COMP1(y, g); - DEFINE_SWIZZLER2_COMP1(z, b); - DEFINE_SWIZZLER2_COMP1(w, a); -#undef DEFINE_SWIZZLER2_COMP1 -#undef DEFINE_SWIZZLER2_COMP2 -#undef _DEFINE_SWIZZLER2 - -#define _DEFINE_SWIZZLER3(a, b, c, name) \ - [[nodiscard]] constexpr Vec3 name() const { return Vec3(a, b, c); } -#define DEFINE_SWIZZLER3_COMP1(a, a2) \ - _DEFINE_SWIZZLER3(a, a, a, a##a##a); \ - _DEFINE_SWIZZLER3(a, a, a, a2##a2##a2) -#define DEFINE_SWIZZLER3_COMP3(a, b, c, a2, b2, c2) \ - _DEFINE_SWIZZLER3(a, b, c, a##b##c); \ - _DEFINE_SWIZZLER3(a, c, b, a##c##b); \ - _DEFINE_SWIZZLER3(b, a, c, b##a##c); \ - _DEFINE_SWIZZLER3(b, c, a, b##c##a); \ - _DEFINE_SWIZZLER3(c, a, b, c##a##b); \ - _DEFINE_SWIZZLER3(c, b, a, c##b##a); \ - _DEFINE_SWIZZLER3(a, b, c, a2##b2##c2); \ - _DEFINE_SWIZZLER3(a, c, b, a2##c2##b2); \ - _DEFINE_SWIZZLER3(b, a, c, b2##a2##c2); \ - _DEFINE_SWIZZLER3(b, c, a, b2##c2##a2); \ - _DEFINE_SWIZZLER3(c, a, b, c2##a2##b2); \ - _DEFINE_SWIZZLER3(c, b, a, c2##b2##a2) - - DEFINE_SWIZZLER3_COMP3(x, y, z, r, g, b); - DEFINE_SWIZZLER3_COMP3(x, y, w, r, g, a); - DEFINE_SWIZZLER3_COMP3(x, z, w, r, b, a); - DEFINE_SWIZZLER3_COMP3(y, z, w, g, b, a); - DEFINE_SWIZZLER3_COMP1(x, r); - DEFINE_SWIZZLER3_COMP1(y, g); - DEFINE_SWIZZLER3_COMP1(z, b); - DEFINE_SWIZZLER3_COMP1(w, a); -#undef DEFINE_SWIZZLER3_COMP1 -#undef DEFINE_SWIZZLER3_COMP3 -#undef _DEFINE_SWIZZLER3 -}; - -template -[[nodiscard]] constexpr Vec4 operator*(const V& f, const Vec4& vec) { - using TV = decltype(V{} * T{}); - using C = std::common_type_t; - - return { - static_cast(static_cast(f) * static_cast(vec.x)), - static_cast(static_cast(f) * static_cast(vec.y)), - static_cast(static_cast(f) * static_cast(vec.z)), - static_cast(static_cast(f) * static_cast(vec.w)), - }; -} - -using Vec4f = Vec4; - -template -constexpr decltype(T{} * T{} + T{} * T{}) Dot(const Vec2& a, const Vec2& b) { - return a.x * b.x + a.y * b.y; -} - -template -[[nodiscard]] constexpr decltype(T{} * T{} + T{} * T{}) Dot(const Vec3& a, const Vec3& b) { - return a.x * b.x + a.y * b.y + a.z * b.z; -} - -template -[[nodiscard]] constexpr decltype(T{} * T{} + T{} * T{}) Dot(const Vec4& a, const Vec4& b) { - return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w; -} - -template <> -[[nodiscard]] inline float Dot(const Vec4& a, const Vec4& b) { -#ifdef __ARM_NEON - float32x4_t va = vld1q_f32(&a.x); - float32x4_t vb = vld1q_f32(&b.x); - float32x4_t result = vmulq_f32(va, vb); -#if defined(__aarch64__) // Use vaddvq_f32 in ARMv8 architectures - return vaddvq_f32(result); -#else // Use manual addition for older architectures - float32x2_t sum2 = vadd_f32(vget_high_f32(result), vget_low_f32(result)); - return vget_lane_f32(vpadd_f32(sum2, sum2), 0); -#endif -#else - return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w; -#endif -} - -template -[[nodiscard]] constexpr Vec3 Cross(const Vec3& a, - const Vec3& b) { - return {a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x}; -} - -// linear interpolation via float: 0.0=begin, 1.0=end -template -[[nodiscard]] constexpr decltype(X{} * float{} + X{} * float{}) Lerp(const X& begin, const X& end, - const float t) { - return begin * (1.f - t) + end * t; -} - -// linear interpolation via int: 0=begin, base=end -template -[[nodiscard]] constexpr decltype((X{} * int{} + X{} * int{}) / base) LerpInt(const X& begin, - const X& end, - const int t) { - return (begin * (base - t) + end * t) / base; -} - -// bilinear interpolation. s is for interpolating x00-x01 and x10-x11, and t is for the second -// interpolation. -template -[[nodiscard]] constexpr auto BilinearInterp(const X& x00, const X& x01, const X& x10, const X& x11, - const float s, const float t) { - auto y0 = Lerp(x00, x01, s); - auto y1 = Lerp(x10, x11, s); - return Lerp(y0, y1, t); -} - -// Utility vector factories -template -[[nodiscard]] constexpr Vec2 MakeVec(const T& x, const T& y) { - return Vec2{x, y}; -} - -template -[[nodiscard]] constexpr Vec3 MakeVec(const T& x, const T& y, const T& z) { - return Vec3{x, y, z}; -} - -template -[[nodiscard]] constexpr Vec4 MakeVec(const T& x, const T& y, const Vec2& zw) { - return MakeVec(x, y, zw[0], zw[1]); -} - -template -[[nodiscard]] constexpr Vec3 MakeVec(const Vec2& xy, const T& z) { - return MakeVec(xy[0], xy[1], z); -} - -template -[[nodiscard]] constexpr Vec3 MakeVec(const T& x, const Vec2& yz) { - return MakeVec(x, yz[0], yz[1]); -} - -template -[[nodiscard]] constexpr Vec4 MakeVec(const T& x, const T& y, const T& z, const T& w) { - return Vec4{x, y, z, w}; -} - -template -[[nodiscard]] constexpr Vec4 MakeVec(const Vec2& xy, const T& z, const T& w) { - return MakeVec(xy[0], xy[1], z, w); -} - -template -[[nodiscard]] constexpr Vec4 MakeVec(const T& x, const Vec2& yz, const T& w) { - return MakeVec(x, yz[0], yz[1], w); -} - -// NOTE: This has priority over "Vec2> MakeVec(const Vec2& x, const Vec2& y)". -// Even if someone wanted to use an odd object like Vec2>, the compiler would error -// out soon enough due to misuse of the returned structure. -template -[[nodiscard]] constexpr Vec4 MakeVec(const Vec2& xy, const Vec2& zw) { - return MakeVec(xy[0], xy[1], zw[0], zw[1]); -} - -template -[[nodiscard]] constexpr Vec4 MakeVec(const Vec3& xyz, const T& w) { - return MakeVec(xyz[0], xyz[1], xyz[2], w); -} - -template -[[nodiscard]] constexpr Vec4 MakeVec(const T& x, const Vec3& yzw) { - return MakeVec(x, yzw[0], yzw[1], yzw[2]); + Vec r{}; + for (size_t i = 0; i < N; ++i) + r.elems[i] = T(C(f) * C(v.elems[i])); + return r; } } // namespace Common diff --git a/src/core/hle/service/set/setting_formats/device_settings.h b/src/core/hle/service/set/setting_formats/device_settings.h index 2827756f6a..8dcfcd7cef 100644 --- a/src/core/hle/service/set/setting_formats/device_settings.h +++ b/src/core/hle/service/set/setting_formats/device_settings.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -30,15 +33,15 @@ struct DeviceSettings { INSERT_PADDING_BYTES(0x20); // Reserved // nn::settings::system::ConsoleSixAxisSensorAccelerationBias - Common::Vec3 console_six_axis_sensor_acceleration_bias; + Common::Vec console_six_axis_sensor_acceleration_bias; // nn::settings::system::ConsoleSixAxisSensorAngularVelocityBias - Common::Vec3 console_six_axis_sensor_angular_velocity_bias; + Common::Vec console_six_axis_sensor_angular_velocity_bias; // nn::settings::system::ConsoleSixAxisSensorAccelerationGain std::array console_six_axis_sensor_acceleration_gain; // nn::settings::system::ConsoleSixAxisSensorAngularVelocityGain std::array console_six_axis_sensor_angular_velocity_gain; // nn::settings::system::ConsoleSixAxisSensorAngularVelocityTimeBias - Common::Vec3 console_six_axis_sensor_angular_velocity_time_bias; + Common::Vec console_six_axis_sensor_angular_velocity_time_bias; // nn::settings::system::ConsoleSixAxisSensorAngularAcceleration std::array console_six_axis_sensor_angular_acceleration; }; diff --git a/src/core/hle/service/set/setting_formats/system_settings.h b/src/core/hle/service/set/setting_formats/system_settings.h index 75deb1a93f..206c81a7dd 100644 --- a/src/core/hle/service/set/setting_formats/system_settings.h +++ b/src/core/hle/service/set/setting_formats/system_settings.h @@ -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-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -153,15 +153,15 @@ struct SystemSettings { INSERT_PADDING_BYTES(0x7FF8); // Reserved // nn::settings::system::ConsoleSixAxisSensorAccelerationBias - Common::Vec3 console_six_axis_sensor_acceleration_bias; + Common::Vec console_six_axis_sensor_acceleration_bias; // nn::settings::system::ConsoleSixAxisSensorAngularVelocityBias - Common::Vec3 console_six_axis_sensor_angular_velocity_bias; + Common::Vec console_six_axis_sensor_angular_velocity_bias; // nn::settings::system::ConsoleSixAxisSensorAccelerationGain std::array console_six_axis_sensor_acceleration_gain; // nn::settings::system::ConsoleSixAxisSensorAngularVelocityGain std::array console_six_axis_sensor_angular_velocity_gain; // nn::settings::system::ConsoleSixAxisSensorAngularVelocityTimeBias - Common::Vec3 console_six_axis_sensor_angular_velocity_time_bias; + Common::Vec console_six_axis_sensor_angular_velocity_time_bias; // nn::settings::system::ConsoleSixAxisSensorAngularAcceleration std::array console_six_axis_sensor_angular_velocity_acceleration; INSERT_PADDING_BYTES(0x70); // Reserved diff --git a/src/hid_core/frontend/emulated_console.cpp b/src/hid_core/frontend/emulated_console.cpp index 92e99a1f54..fd34233122 100644 --- a/src/hid_core/frontend/emulated_console.cpp +++ b/src/hid_core/frontend/emulated_console.cpp @@ -170,12 +170,12 @@ void EmulatedConsole::SetMotion(const Common::Input::CallbackStatus& callback) { auto& emulated = console.motion_values.emulated; raw_status = TransformToMotion(callback); - emulated.SetAcceleration(Common::Vec3f{ + emulated.SetAcceleration(Common::Vec{ raw_status.accel.x.value, raw_status.accel.y.value, raw_status.accel.z.value, }); - emulated.SetGyroscope(Common::Vec3f{ + emulated.SetGyroscope(Common::Vec{ raw_status.gyro.x.value, raw_status.gyro.y.value, raw_status.gyro.z.value, diff --git a/src/hid_core/frontend/emulated_console.h b/src/hid_core/frontend/emulated_console.h index ca7d7dd8fc..9e2f7e2c1b 100644 --- a/src/hid_core/frontend/emulated_console.h +++ b/src/hid_core/frontend/emulated_console.h @@ -18,7 +18,6 @@ #include "common/input.h" #include "common/param_package.h" #include "common/point.h" -#include "common/quaternion.h" #include "common/vector_math.h" #include "hid_core/frontend/motion_input.h" #include "hid_core/hid_types.h" @@ -43,12 +42,12 @@ using TouchValues = std::array; // Contains all motion related data that is used on the services struct ConsoleMotion { - Common::Vec3f accel{}; - Common::Vec3f gyro{}; - Common::Vec3f rotation{}; - std::array orientation{}; - Common::Quaternion quaternion{}; - Common::Vec3f gyro_bias{}; + Common::Vec accel{}; + Common::Vec gyro{}; + Common::Vec rotation{}; + std::array, 3> orientation{}; + Common::Vec quaternion{}; + Common::Vec gyro_bias{}; f32 verticalization_error{}; bool is_at_rest{}; }; diff --git a/src/hid_core/frontend/emulated_controller.cpp b/src/hid_core/frontend/emulated_controller.cpp index 36c9a0f02f..1092970ee8 100644 --- a/src/hid_core/frontend/emulated_controller.cpp +++ b/src/hid_core/frontend/emulated_controller.cpp @@ -1051,12 +1051,12 @@ void EmulatedController::SetMotion(const Common::Input::CallbackStatus& callback auto& emulated = controller.motion_values[index].emulated; raw_status = TransformToMotion(callback); - emulated.SetAcceleration(Common::Vec3f{ + emulated.SetAcceleration(Common::Vec{ raw_status.accel.x.value, raw_status.accel.y.value, raw_status.accel.z.value, }); - emulated.SetGyroscope(Common::Vec3f{ + emulated.SetGyroscope(Common::Vec{ raw_status.gyro.x.value, raw_status.gyro.y.value, raw_status.gyro.z.value, diff --git a/src/hid_core/frontend/emulated_controller.h b/src/hid_core/frontend/emulated_controller.h index d98ed3df3c..7a2291b8a4 100644 --- a/src/hid_core/frontend/emulated_controller.h +++ b/src/hid_core/frontend/emulated_controller.h @@ -107,11 +107,11 @@ struct RingSensorForce { using NfcState = Common::Input::NfcStatus; struct ControllerMotion { - Common::Vec3f accel{}; - Common::Vec3f gyro{}; - Common::Vec3f rotation{}; - Common::Vec3f euler{}; - std::array orientation{}; + Common::Vec accel{}; + Common::Vec gyro{}; + Common::Vec rotation{}; + Common::Vec euler{}; + std::array, 3> orientation{}; bool is_at_rest{}; }; diff --git a/src/hid_core/frontend/motion_input.cpp b/src/hid_core/frontend/motion_input.cpp index a1e09e3ce9..1dcb910a50 100644 --- a/src/hid_core/frontend/motion_input.cpp +++ b/src/hid_core/frontend/motion_input.cpp @@ -26,20 +26,19 @@ void MotionInput::SetPID(f32 new_kp, f32 new_ki, f32 new_kd) { kd = new_kd; } -void MotionInput::SetAcceleration(const Common::Vec3f& acceleration) { +void MotionInput::SetAcceleration(const Common::Vec& acceleration) { accel = acceleration; - - accel.x = std::clamp(accel.x, -AccelMaxValue, AccelMaxValue); - accel.y = std::clamp(accel.y, -AccelMaxValue, AccelMaxValue); - accel.z = std::clamp(accel.z, -AccelMaxValue, AccelMaxValue); + accel[0] = std::clamp(accel[0], -AccelMaxValue, AccelMaxValue); + accel[1] = std::clamp(accel[1], -AccelMaxValue, AccelMaxValue); + accel[2] = std::clamp(accel[2], -AccelMaxValue, AccelMaxValue); } -void MotionInput::SetGyroscope(const Common::Vec3f& gyroscope) { +void MotionInput::SetGyroscope(const Common::Vec& gyroscope) { gyro = gyroscope - gyro_bias; - gyro.x = std::clamp(gyro.x, -GyroMaxValue, GyroMaxValue); - gyro.y = std::clamp(gyro.y, -GyroMaxValue, GyroMaxValue); - gyro.z = std::clamp(gyro.z, -GyroMaxValue, GyroMaxValue); + gyro[0] = std::clamp(gyro[0], -GyroMaxValue, GyroMaxValue); + gyro[1] = std::clamp(gyro[1], -GyroMaxValue, GyroMaxValue); + gyro[2] = std::clamp(gyro[2], -GyroMaxValue, GyroMaxValue); // Auto adjust gyro_bias to minimize drift if (!IsMoving(IsAtRestRelaxed)) { @@ -59,25 +58,25 @@ void MotionInput::SetGyroscope(const Common::Vec3f& gyroscope) { } } -void MotionInput::SetQuaternion(const Common::Quaternion& quaternion) { +void MotionInput::SetQuaternion(const Common::Vec& quaternion) { quat = quaternion; } -void MotionInput::SetEulerAngles(const Common::Vec3f& euler_angles) { - const float cr = std::cos(euler_angles.x * 0.5f); - const float sr = std::sin(euler_angles.x * 0.5f); - const float cp = std::cos(euler_angles.y * 0.5f); - const float sp = std::sin(euler_angles.y * 0.5f); - const float cy = std::cos(euler_angles.z * 0.5f); - const float sy = std::sin(euler_angles.z * 0.5f); +void MotionInput::SetEulerAngles(const Common::Vec& euler_angles) { + const float cr = std::cos(euler_angles[0] * 0.5f); + const float sr = std::sin(euler_angles[0] * 0.5f); + const float cp = std::cos(euler_angles[1] * 0.5f); + const float sp = std::sin(euler_angles[1] * 0.5f); + const float cy = std::cos(euler_angles[2] * 0.5f); + const float sy = std::sin(euler_angles[2] * 0.5f); - quat.w = cr * cp * cy + sr * sp * sy; - quat.xyz.x = sr * cp * cy - cr * sp * sy; - quat.xyz.y = cr * sp * cy + sr * cp * sy; - quat.xyz.z = cr * cp * sy - sr * sp * cy; + quat[3] = cr * cp * cy + sr * sp * sy; + quat[0] = sr * cp * cy - cr * sp * sy; + quat[1] = cr * sp * cy + sr * cp * sy; + quat[2] = cr * cp * sy - sr * sp * cy; } -void MotionInput::SetGyroBias(const Common::Vec3f& bias) { +void MotionInput::SetGyroBias(const Common::Vec& bias) { gyro_bias = bias; } @@ -98,7 +97,7 @@ void MotionInput::ResetRotations() { } void MotionInput::ResetQuaternion() { - quat = {{0.0f, 0.0f, -1.0f}, 0.0f}; + quat = Common::Vec{0.0f, 0.0f, -1.0f, 0.0f}; } bool MotionInput::IsMoving(f32 sensitivity) const { @@ -137,10 +136,10 @@ void MotionInput::UpdateOrientation(u64 elapsed_time) { ResetOrientation(); } // Short name local variable for readability - f32 q1 = quat.w; - f32 q2 = quat.xyz[0]; - f32 q3 = quat.xyz[1]; - f32 q4 = quat.xyz[2]; + f32 q1 = quat[3]; + f32 q2 = quat[0]; + f32 q3 = quat[1]; + f32 q4 = quat[2]; const auto sample_period = static_cast(elapsed_time) / 1000000.0f; // Ignore invalid elapsed time @@ -150,23 +149,23 @@ void MotionInput::UpdateOrientation(u64 elapsed_time) { const auto normal_accel = accel.Normalized(); auto rad_gyro = gyro * std::numbers::pi_v * 2.f; - const f32 swap = rad_gyro.x; - rad_gyro.x = rad_gyro.y; - rad_gyro.y = -swap; - rad_gyro.z = -rad_gyro.z; + const f32 swap = rad_gyro[0]; + rad_gyro[0] = rad_gyro[1]; + rad_gyro[1] = -swap; + rad_gyro[2] = -rad_gyro[2]; // Clear gyro values if there is no gyro present if (only_accelerometer) { - rad_gyro.x = 0; - rad_gyro.y = 0; - rad_gyro.z = 0; + rad_gyro[0] = 0; + rad_gyro[1] = 0; + rad_gyro[2] = 0; } // Ignore drift correction if acceleration is not reliable if (accel.Length() >= 0.75f && accel.Length() <= 1.25f) { - const f32 ax = -normal_accel.x; - const f32 ay = normal_accel.y; - const f32 az = -normal_accel.z; + const f32 ax = -normal_accel[0]; + const f32 ay = normal_accel[1]; + const f32 az = -normal_accel[2]; // Estimated direction of gravity const f32 vx = 2.0f * (q2 * q4 - q1 * q3); @@ -174,7 +173,7 @@ void MotionInput::UpdateOrientation(u64 elapsed_time) { const f32 vz = q1 * q1 - q2 * q2 - q3 * q3 + q4 * q4; // Error is cross product between estimated direction and measured direction of gravity - const Common::Vec3f new_real_error = { + const Common::Vec new_real_error{ az * vx - ax * vz, ay * vz - az * vy, ax * vy - ay * vx, @@ -202,16 +201,16 @@ void MotionInput::UpdateOrientation(u64 elapsed_time) { rad_gyro += 10.0f * kd * derivative_error; // Emulate gyro values for games that need them - gyro.x = -rad_gyro.y; - gyro.y = rad_gyro.x; - gyro.z = -rad_gyro.z; + gyro[0] = -rad_gyro[1]; + gyro[1] = rad_gyro[0]; + gyro[2] = -rad_gyro[2]; UpdateRotation(elapsed_time); } } - const f32 gx = rad_gyro.y; - const f32 gy = rad_gyro.x; - const f32 gz = rad_gyro.z; + const f32 gx = rad_gyro[1]; + const f32 gy = rad_gyro[0]; + const f32 gz = rad_gyro[2]; // Integrate rate of change of quaternion const f32 pa = q2; @@ -222,57 +221,58 @@ void MotionInput::UpdateOrientation(u64 elapsed_time) { q3 = pb + (q1 * gy - pa * gz + pc * gx) * (0.5f * sample_period); q4 = pc + (q1 * gz + pa * gy - pb * gx) * (0.5f * sample_period); - quat.w = q1; - quat.xyz[0] = q2; - quat.xyz[1] = q3; - quat.xyz[2] = q4; + quat[3] = q1; + quat[0] = q2; + quat[1] = q3; + quat[2] = q4; quat = quat.Normalized(); } -std::array MotionInput::GetOrientation() const { - const Common::Quaternion quad{ - .xyz = {-quat.xyz[1], -quat.xyz[0], -quat.w}, - .w = -quat.xyz[2], +std::array, 3> MotionInput::GetOrientation() const { + const Common::Vec quad{ + -quat[1], + -quat[0], + -quat[3], + -quat[2], }; - const std::array matrix4x4 = quad.ToMatrix(); - - return {Common::Vec3f(matrix4x4[0], matrix4x4[1], -matrix4x4[2]), - Common::Vec3f(matrix4x4[4], matrix4x4[5], -matrix4x4[6]), - Common::Vec3f(-matrix4x4[8], -matrix4x4[9], matrix4x4[10])}; + const std::array matrix4x4 = quad.ToMatrix(); + return {Common::Vec(matrix4x4[0], matrix4x4[1], -matrix4x4[2]), + Common::Vec(matrix4x4[4], matrix4x4[5], -matrix4x4[6]), + Common::Vec(-matrix4x4[8], -matrix4x4[9], matrix4x4[10])}; } -Common::Vec3f MotionInput::GetAcceleration() const { +Common::Vec MotionInput::GetAcceleration() const { return accel; } -Common::Vec3f MotionInput::GetGyroscope() const { +Common::Vec MotionInput::GetGyroscope() const { return gyro; } -Common::Vec3f MotionInput::GetGyroBias() const { +Common::Vec MotionInput::GetGyroBias() const { return gyro_bias; } -Common::Quaternion MotionInput::GetQuaternion() const { +Common::Vec MotionInput::GetQuaternion() const { return quat; } -Common::Vec3f MotionInput::GetRotations() const { +Common::Vec MotionInput::GetRotations() const { return rotations; } -Common::Vec3f MotionInput::GetEulerAngles() const { +Common::Vec MotionInput::GetEulerAngles() const { // roll (x-axis rotation) - const float sinr_cosp = 2 * (quat.w * quat.xyz.x + quat.xyz.y * quat.xyz.z); - const float cosr_cosp = 1 - 2 * (quat.xyz.x * quat.xyz.x + quat.xyz.y * quat.xyz.y); + const float sinr_cosp = 2 * (quat[3] * quat[0] + quat[1] * quat[2]); + const float cosr_cosp = 1 - 2 * (quat[0] * quat[0] + quat[1] * quat[1]); // pitch (y-axis rotation) - const float sinp = std::sqrt(1 + 2 * (quat.w * quat.xyz.y - quat.xyz.x * quat.xyz.z)); - const float cosp = std::sqrt(1 - 2 * (quat.w * quat.xyz.y - quat.xyz.x * quat.xyz.z)); + const float sinp = std::sqrt(1 + 2 * (quat[3] * quat[1] - quat[0] * quat[2])); + const float cosp = std::sqrt(1 - 2 * (quat[3] * quat[1] - quat[0] * quat[2])); // yaw (z-axis rotation) - const float siny_cosp = 2 * (quat.w * quat.xyz.z + quat.xyz.x * quat.xyz.y); - const float cosy_cosp = 1 - 2 * (quat.xyz.y * quat.xyz.y + quat.xyz.z * quat.xyz.z); + const float siny_cosp = 2 * (quat[3] * quat[2] + quat[0] * quat[1]); + const float cosy_cosp = 1 - 2 * (quat[1] * quat[1] + quat[2] * quat[2]); return { std::atan2(sinr_cosp, cosr_cosp), @@ -285,13 +285,13 @@ void MotionInput::ResetOrientation() { if (!reset_enabled || only_accelerometer) { return; } - if (!IsMoving(IsAtRestRelaxed) && accel.z <= -0.9f) { + if (!IsMoving(IsAtRestRelaxed) && accel[2] <= -0.9f) { ++reset_counter; if (reset_counter > 900) { - quat.w = 0; - quat.xyz[0] = 0; - quat.xyz[1] = 0; - quat.xyz[2] = -1; + quat[3] = 0; + quat[0] = 0; + quat[1] = 0; + quat[2] = -1; SetOrientationFromAccelerometer(); integral_error = {}; reset_counter = 0; @@ -309,15 +309,15 @@ void MotionInput::SetOrientationFromAccelerometer() { while (!IsCalibrated(0.01f) && ++iterations < 100) { // Short name local variable for readability - f32 q1 = quat.w; - f32 q2 = quat.xyz[0]; - f32 q3 = quat.xyz[1]; - f32 q4 = quat.xyz[2]; + f32 q1 = quat[3]; + f32 q2 = quat[0]; + f32 q3 = quat[1]; + f32 q4 = quat[2]; - Common::Vec3f rad_gyro; - const f32 ax = -normal_accel.x; - const f32 ay = normal_accel.y; - const f32 az = -normal_accel.z; + Common::Vec rad_gyro; + const f32 ax = -normal_accel[0]; + const f32 ay = normal_accel[1]; + const f32 az = -normal_accel[2]; // Estimated direction of gravity const f32 vx = 2.0f * (q2 * q4 - q1 * q3); @@ -325,7 +325,7 @@ void MotionInput::SetOrientationFromAccelerometer() { const f32 vz = q1 * q1 - q2 * q2 - q3 * q3 + q4 * q4; // Error is cross product between estimated direction and measured direction of gravity - const Common::Vec3f new_real_error = { + const Common::Vec new_real_error = { az * vx - ax * vz, ay * vz - az * vy, ax * vy - ay * vx, @@ -338,9 +338,9 @@ void MotionInput::SetOrientationFromAccelerometer() { rad_gyro += 5.0f * ki * integral_error; rad_gyro += 10.0f * kd * derivative_error; - const f32 gx = rad_gyro.y; - const f32 gy = rad_gyro.x; - const f32 gz = rad_gyro.z; + const f32 gx = rad_gyro[1]; + const f32 gy = rad_gyro[0]; + const f32 gz = rad_gyro[2]; // Integrate rate of change of quaternion const f32 pa = q2; @@ -351,10 +351,10 @@ void MotionInput::SetOrientationFromAccelerometer() { q3 = pb + (q1 * gy - pa * gz + pc * gx) * (0.5f * sample_period); q4 = pc + (q1 * gz + pa * gy - pb * gx) * (0.5f * sample_period); - quat.w = q1; - quat.xyz[0] = q2; - quat.xyz[1] = q3; - quat.xyz[2] = q4; + quat[3] = q1; + quat[0] = q2; + quat[1] = q3; + quat[2] = q4; quat = quat.Normalized(); } } diff --git a/src/hid_core/frontend/motion_input.h b/src/hid_core/frontend/motion_input.h index c902a3a6e5..09dbb706d7 100644 --- a/src/hid_core/frontend/motion_input.h +++ b/src/hid_core/frontend/motion_input.h @@ -1,10 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include "common/common_types.h" -#include "common/quaternion.h" #include "common/vector_math.h" namespace Core::HID { @@ -34,11 +36,11 @@ public: MotionInput& operator=(MotionInput&&) = default; void SetPID(f32 new_kp, f32 new_ki, f32 new_kd); - void SetAcceleration(const Common::Vec3f& acceleration); - void SetGyroscope(const Common::Vec3f& gyroscope); - void SetQuaternion(const Common::Quaternion& quaternion); - void SetEulerAngles(const Common::Vec3f& euler_angles); - void SetGyroBias(const Common::Vec3f& bias); + void SetAcceleration(const Common::Vec& acceleration); + void SetGyroscope(const Common::Vec& gyroscope); + void SetQuaternion(const Common::Vec& quaternion); + void SetEulerAngles(const Common::Vec& euler_angles); + void SetGyroBias(const Common::Vec& bias); void SetGyroThreshold(f32 threshold); /// Applies a modifier on top of the normal gyro threshold @@ -53,13 +55,13 @@ public: void Calibrate(); - [[nodiscard]] std::array GetOrientation() const; - [[nodiscard]] Common::Vec3f GetAcceleration() const; - [[nodiscard]] Common::Vec3f GetGyroscope() const; - [[nodiscard]] Common::Vec3f GetGyroBias() const; - [[nodiscard]] Common::Vec3f GetRotations() const; - [[nodiscard]] Common::Quaternion GetQuaternion() const; - [[nodiscard]] Common::Vec3f GetEulerAngles() const; + [[nodiscard]] std::array, 3> GetOrientation() const; + [[nodiscard]] Common::Vec GetAcceleration() const; + [[nodiscard]] Common::Vec GetGyroscope() const; + [[nodiscard]] Common::Vec GetGyroBias() const; + [[nodiscard]] Common::Vec GetRotations() const; + [[nodiscard]] Common::Vec GetQuaternion() const; + [[nodiscard]] Common::Vec GetEulerAngles() const; [[nodiscard]] bool IsMoving(f32 sensitivity) const; [[nodiscard]] bool IsCalibrated(f32 sensitivity) const; @@ -75,24 +77,24 @@ private: f32 kd; // PID errors - Common::Vec3f real_error; - Common::Vec3f integral_error; - Common::Vec3f derivative_error; + Common::Vec real_error; + Common::Vec integral_error; + Common::Vec derivative_error; // Quaternion containing the device orientation - Common::Quaternion quat; + Common::Vec quat; // Number of full rotations in each axis - Common::Vec3f rotations; + Common::Vec rotations; // Acceleration vector measurement in G force - Common::Vec3f accel; + Common::Vec accel; // Gyroscope vector measurement in radians/s. - Common::Vec3f gyro; + Common::Vec gyro; // Vector to be subtracted from gyro measurements - Common::Vec3f gyro_bias; + Common::Vec gyro_bias; // Minimum gyro amplitude to detect if the device is moving f32 gyro_threshold = 0.0f; diff --git a/src/hid_core/hid_types.h b/src/hid_core/hid_types.h index 66d661c80b..ae12059a92 100644 --- a/src/hid_core/hid_types.h +++ b/src/hid_core/hid_types.h @@ -609,10 +609,10 @@ static_assert(sizeof(SixAxisSensorAttribute) == 4, "SixAxisSensorAttribute is an struct SixAxisSensorState { s64 delta_time{}; s64 sampling_number{}; - Common::Vec3f accel{}; - Common::Vec3f gyro{}; - Common::Vec3f rotation{}; - std::array orientation{}; + Common::Vec accel{}; + Common::Vec gyro{}; + Common::Vec rotation{}; + std::array, 3> orientation{}; SixAxisSensorAttribute attribute{}; INSERT_PADDING_BYTES(4); // Reserved }; diff --git a/src/hid_core/resources/shared_memory_format.h b/src/hid_core/resources/shared_memory_format.h index b9deeec302..0d74689869 100644 --- a/src/hid_core/resources/shared_memory_format.h +++ b/src/hid_core/resources/shared_memory_format.h @@ -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-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -196,7 +196,7 @@ struct ConsoleSixAxisSensorSharedMemoryFormat { bool is_seven_six_axis_sensor_at_rest{}; INSERT_PADDING_BYTES(3); // padding f32 verticalization_error{}; - Common::Vec3f gyro_bias{}; + Common::Vec gyro_bias{}; INSERT_PADDING_BYTES(4); // padding }; static_assert(sizeof(ConsoleSixAxisSensorSharedMemoryFormat) == 0x20, diff --git a/src/hid_core/resources/six_axis/seven_six_axis.cpp b/src/hid_core/resources/six_axis/seven_six_axis.cpp index 584e6d6505..13dd5f943a 100644 --- a/src/hid_core/resources/six_axis/seven_six_axis.cpp +++ b/src/hid_core/resources/six_axis/seven_six_axis.cpp @@ -46,14 +46,11 @@ void SevenSixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing) { next_seven_sixaxis_state.accel = motion_status.accel; next_seven_sixaxis_state.gyro = motion_status.gyro; next_seven_sixaxis_state.quaternion = { - { - motion_status.quaternion.xyz.y, - motion_status.quaternion.xyz.x, - -motion_status.quaternion.w, - }, - -motion_status.quaternion.xyz.z, + motion_status.quaternion[1], + motion_status.quaternion[0], + -motion_status.quaternion[3], + -motion_status.quaternion[2], }; - seven_sixaxis_lifo.WriteNextEntry(next_seven_sixaxis_state); transfer_memory_owner->GetMemory().WriteBlock(transfer_memory, &seven_sixaxis_lifo, sizeof(seven_sixaxis_lifo)); diff --git a/src/hid_core/resources/six_axis/seven_six_axis.h b/src/hid_core/resources/six_axis/seven_six_axis.h index 00afb8c00b..a59d697356 100644 --- a/src/hid_core/resources/six_axis/seven_six_axis.h +++ b/src/hid_core/resources/six_axis/seven_six_axis.h @@ -7,7 +7,7 @@ #pragma once #include "common/common_types.h" -#include "common/quaternion.h" +#include "common/vector_math.h" #include "common/typed_address.h" #include "hid_core/resources/controller_base.h" #include "hid_core/resources/ring_lifo.h" @@ -51,9 +51,9 @@ private: u64 timestamp{}; u64 sampling_number{}; u64 unknown{}; - Common::Vec3f accel{}; - Common::Vec3f gyro{}; - Common::Quaternion quaternion{}; + Common::Vec accel{}; + Common::Vec gyro{}; + Common::Vec quaternion{}; }; static_assert(sizeof(SevenSixAxisState) == 0x48, "SevenSixAxisState is an invalid size"); diff --git a/src/hid_core/resources/six_axis/six_axis.cpp b/src/hid_core/resources/six_axis/six_axis.cpp index b407a5c76e..53a56d2661 100644 --- a/src/hid_core/resources/six_axis/six_axis.cpp +++ b/src/hid_core/resources/six_axis/six_axis.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -93,9 +96,9 @@ void SixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing) { .accel = {0, 0, -1.0f}, .orientation = { - Common::Vec3f{1.0f, 0, 0}, - Common::Vec3f{0, 1.0f, 0}, - Common::Vec3f{0, 0, 1.0f}, + Common::Vec{1.0f, 0, 0}, + Common::Vec{0, 1.0f, 0}, + Common::Vec{0, 0, 1.0f}, }, .attribute = {1}, }; diff --git a/src/input_common/drivers/mouse.cpp b/src/input_common/drivers/mouse.cpp index 00b7220c1e..4444f0ac3b 100644 --- a/src/input_common/drivers/mouse.cpp +++ b/src/input_common/drivers/mouse.cpp @@ -88,8 +88,8 @@ void Mouse::UpdateStickInput() { last_mouse_change *= maximum_stick_range; } - SetAxis(identifier, mouse_axis_x, last_mouse_change.x); - SetAxis(identifier, mouse_axis_y, -last_mouse_change.y); + SetAxis(identifier, mouse_axis_x, last_mouse_change[0]); + SetAxis(identifier, mouse_axis_y, -last_mouse_change[1]); // Decay input over time const float clamped_length = (std::min)(1.0f, length); @@ -104,20 +104,20 @@ void Mouse::UpdateMotionInput() { const float sensitivity = IsMousePanningEnabled() ? default_motion_panning_sensitivity : default_motion_sensitivity; - const float rotation_velocity = std::sqrt(last_motion_change.x * last_motion_change.x + - last_motion_change.y * last_motion_change.y); + const float rotation_velocity = std::sqrt(last_motion_change[0] * last_motion_change[0] + + last_motion_change[1] * last_motion_change[1]); // Clamp rotation speed if (rotation_velocity > maximum_rotation_speed / sensitivity) { const float multiplier = maximum_rotation_speed / rotation_velocity / sensitivity; - last_motion_change.x = last_motion_change.x * multiplier; - last_motion_change.y = last_motion_change.y * multiplier; + last_motion_change[0] = last_motion_change[0] * multiplier; + last_motion_change[1] = last_motion_change[1] * multiplier; } const BasicMotion motion_data{ - .gyro_x = last_motion_change.x * sensitivity, - .gyro_y = last_motion_change.y * sensitivity, - .gyro_z = last_motion_change.z * sensitivity, + .gyro_x = last_motion_change[0] * sensitivity, + .gyro_y = last_motion_change[1] * sensitivity, + .gyro_z = last_motion_change[2] * sensitivity, .accel_x = 0, .accel_y = 0, .accel_z = 0, @@ -125,53 +125,46 @@ void Mouse::UpdateMotionInput() { }; if (IsMousePanningEnabled()) { - last_motion_change.x = 0; - last_motion_change.y = 0; + last_motion_change[0] = 0; + last_motion_change[1] = 0; } - last_motion_change.z = 0; + last_motion_change[2] = 0; SetMotion(motion_identifier, 0, motion_data); } void Mouse::Move(int x, int y, int center_x, int center_y) { if (IsMousePanningEnabled()) { - const auto mouse_change = - (Common::MakeVec(x, y) - Common::MakeVec(center_x, center_y)).Cast(); - const float x_sensitivity = - Settings::values.mouse_panning_x_sensitivity.GetValue() * default_panning_sensitivity; - const float y_sensitivity = - Settings::values.mouse_panning_y_sensitivity.GetValue() * default_panning_sensitivity; - const float deadzone_counterweight = - Settings::values.mouse_panning_deadzone_counterweight.GetValue() * - default_deadzone_counterweight; - - last_motion_change += {-mouse_change.y * x_sensitivity, -mouse_change.x * y_sensitivity, 0}; - last_mouse_change.x += mouse_change.x * x_sensitivity; - last_mouse_change.y += mouse_change.y * y_sensitivity; - - // Bind the mouse change to [0 <= deadzone_counterweight <= 1.0] + auto const mouse_change_int = Common::Vec(x, y) - Common::Vec(center_x, center_y); + auto const mouse_change = Common::Vec(float(mouse_change_int[0]), float(mouse_change_int[1])); + auto const x_sensitivity = Settings::values.mouse_panning_x_sensitivity.GetValue() * default_panning_sensitivity; + auto const y_sensitivity = Settings::values.mouse_panning_y_sensitivity.GetValue() * default_panning_sensitivity; + auto const deadzone_cw = Settings::values.mouse_panning_deadzone_counterweight.GetValue() * default_deadzone_counterweight; + last_motion_change += {-mouse_change[1] * x_sensitivity, -mouse_change[0] * y_sensitivity, 0}; + last_mouse_change[0] += mouse_change[0] * x_sensitivity; + last_mouse_change[1] += mouse_change[1] * y_sensitivity; + // Bind the mouse change to [0 <= deadzone_cw <= 1.0] const float length = last_mouse_change.Length(); - if (length < deadzone_counterweight && length != 0.0f) { + if (length < deadzone_cw && length != 0.0f) { last_mouse_change /= length; - last_mouse_change *= deadzone_counterweight; + last_mouse_change *= deadzone_cw; } - return; } if (button_pressed) { - const auto mouse_move = Common::MakeVec(x, y) - mouse_origin; + const auto mouse_move = Common::Vec(x, y) - mouse_origin; const float x_sensitivity = Settings::values.mouse_panning_x_sensitivity.GetValue() * default_stick_sensitivity; const float y_sensitivity = Settings::values.mouse_panning_y_sensitivity.GetValue() * default_stick_sensitivity; - SetAxis(identifier, mouse_axis_x, static_cast(mouse_move.x) * x_sensitivity); - SetAxis(identifier, mouse_axis_y, static_cast(-mouse_move.y) * y_sensitivity); + SetAxis(identifier, mouse_axis_x, float(mouse_move[0]) * x_sensitivity); + SetAxis(identifier, mouse_axis_y, float(-mouse_move[1]) * y_sensitivity); last_motion_change = { - static_cast(-mouse_move.y) * x_sensitivity, - static_cast(-mouse_move.x) * y_sensitivity, - last_motion_change.z, + float(-mouse_move[1]) * x_sensitivity, + float(-mouse_move[0]) * y_sensitivity, + last_motion_change[2], }; } } @@ -220,18 +213,18 @@ void Mouse::ReleaseButton(MouseButton button) { SetAxis(identifier, mouse_axis_y, 0); } - last_motion_change.x = 0; - last_motion_change.y = 0; + last_motion_change[0] = 0; + last_motion_change[1] = 0; button_pressed = false; } void Mouse::MouseWheelChange(int x, int y) { - wheel_position.x += x; - wheel_position.y += y; - last_motion_change.z += static_cast(y); - SetAxis(identifier, wheel_axis_x, static_cast(wheel_position.x)); - SetAxis(identifier, wheel_axis_y, static_cast(wheel_position.y)); + wheel_position[0] += x; + wheel_position[1] += y; + last_motion_change[2] += static_cast(y); + SetAxis(identifier, wheel_axis_x, static_cast(wheel_position[0])); + SetAxis(identifier, wheel_axis_y, static_cast(wheel_position[1])); } void Mouse::ReleaseAllButtons() { diff --git a/src/input_common/drivers/mouse.h b/src/input_common/drivers/mouse.h index 166168c824..25f75109b9 100644 --- a/src/input_common/drivers/mouse.h +++ b/src/input_common/drivers/mouse.h @@ -107,11 +107,11 @@ private: Common::Input::ButtonNames GetUIButtonName(const Common::ParamPackage& params) const; - Common::Vec2 mouse_origin; - Common::Vec2 last_mouse_position; - Common::Vec2 last_mouse_change; - Common::Vec3 last_motion_change; - Common::Vec2 wheel_position; + Common::Vec mouse_origin; + Common::Vec last_mouse_position; + Common::Vec last_mouse_change; + Common::Vec last_motion_change; + Common::Vec wheel_position; bool button_pressed = false; }; diff --git a/src/yuzu/configuration/configure_input_player_widget.cpp b/src/yuzu/configuration/configure_input_player_widget.cpp index a6be2a1dd4..faf4e021ec 100644 --- a/src/yuzu/configuration/configure_input_player_widget.cpp +++ b/src/yuzu/configuration/configure_input_player_widget.cpp @@ -2936,10 +2936,10 @@ void PlayerControlPreview::DrawArrow(QPainter& p, const QPointF center, const Di } // Draw motion functions -void PlayerControlPreview::Draw3dCube(QPainter& p, QPointF center, const Common::Vec3f& euler, +void PlayerControlPreview::Draw3dCube(QPainter& p, QPointF center, const Common::Vec& euler, float size) { - std::array cube{ - Common::Vec3f{-0.7f, -1, -0.5f}, + std::array, 8> cube{ + Common::Vec{-0.7f, -1, -0.5f}, {-0.7f, 1, -0.5f}, {0.7f, 1, -0.5f}, {0.7f, -1, -0.5f}, @@ -2949,30 +2949,38 @@ void PlayerControlPreview::Draw3dCube(QPainter& p, QPointF center, const Common: {0.7f, -1, 0.5f}, }; - for (Common::Vec3f& point : cube) { - point.RotateFromOrigin(euler.x, euler.y, euler.z); + for (Common::Vec& point : cube) { + float temp = point[1]; + point[1] = std::cos(euler[0]) * point[1] - std::sin(euler[0]) * point[2]; + point[2] = std::sin(euler[0]) * temp + std::cos(euler[0]) * point[2]; + temp = point[0]; + point[0] = std::cos(euler[1]) * point[0] + std::sin(euler[1]) * point[2]; + point[2] = -std::sin(euler[1]) * temp + std::cos(euler[1]) * point[2]; + temp = point[0]; + point[0] = std::cos(euler[2]) * point[0] - std::sin(euler[2]) * point[1]; + point[1] = std::sin(euler[2]) * temp + std::cos(euler[2]) * point[1]; point *= size; } const std::array front_face{ - center + QPointF{cube[0].x, cube[0].y}, - center + QPointF{cube[1].x, cube[1].y}, - center + QPointF{cube[2].x, cube[2].y}, - center + QPointF{cube[3].x, cube[3].y}, + center + QPointF{cube[0][0], cube[0][1]}, + center + QPointF{cube[1][0], cube[1][1]}, + center + QPointF{cube[2][0], cube[2][1]}, + center + QPointF{cube[3][0], cube[3][1]}, }; const std::array back_face{ - center + QPointF{cube[4].x, cube[4].y}, - center + QPointF{cube[5].x, cube[5].y}, - center + QPointF{cube[6].x, cube[6].y}, - center + QPointF{cube[7].x, cube[7].y}, + center + QPointF{cube[4][0], cube[4][1]}, + center + QPointF{cube[5][0], cube[5][1]}, + center + QPointF{cube[6][0], cube[6][1]}, + center + QPointF{cube[7][0], cube[7][1]}, }; DrawPolygon(p, front_face); DrawPolygon(p, back_face); - p.drawLine(center + QPointF{cube[0].x, cube[0].y}, center + QPointF{cube[4].x, cube[4].y}); - p.drawLine(center + QPointF{cube[1].x, cube[1].y}, center + QPointF{cube[5].x, cube[5].y}); - p.drawLine(center + QPointF{cube[2].x, cube[2].y}, center + QPointF{cube[6].x, cube[6].y}); - p.drawLine(center + QPointF{cube[3].x, cube[3].y}, center + QPointF{cube[7].x, cube[7].y}); + p.drawLine(center + QPointF{cube[0][0], cube[0][1]}, center + QPointF{cube[4][0], cube[4][1]}); + p.drawLine(center + QPointF{cube[1][0], cube[1][1]}, center + QPointF{cube[5][0], cube[5][1]}); + p.drawLine(center + QPointF{cube[2][0], cube[2][1]}, center + QPointF{cube[6][0], cube[6][1]}); + p.drawLine(center + QPointF{cube[3][0], cube[3][1]}, center + QPointF{cube[7][0], cube[7][1]}); } template diff --git a/src/yuzu/configuration/configure_input_player_widget.h b/src/yuzu/configuration/configure_input_player_widget.h index d7ec943240..d439c718fb 100644 --- a/src/yuzu/configuration/configure_input_player_widget.h +++ b/src/yuzu/configuration/configure_input_player_widget.h @@ -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-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -198,7 +198,7 @@ private: void DrawArrow(QPainter& p, QPointF center, Direction direction, float size); // Draw motion functions - void Draw3dCube(QPainter& p, QPointF center, const Common::Vec3f& euler, float size); + void Draw3dCube(QPainter& p, QPointF center, const Common::Vec& euler, float size); // Draw primitive types template From 87e5d0b6e490d56fbbe4e770a80e2fbd31aff2ae Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 8 Sep 2026 20:39:55 +0200 Subject: [PATCH 011/128] [hle] VirtualBoy classics fixes, QLaunch IPC fixes, implement extra ams SVCInfo (#4343) Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- `OpenSystemApplicationProxy` `OpenSystemApplicationProxy` ALSO yes those cmds DO NOT take an attribute Implemented SVC infos to match Atmosphere's values Implement more stub I2C session cmds stub CMD2103 for rhythm groove better error handling on svc get info to match ams (see ams svc info) Virtual Boy classic fix adept from https://git.ryujinx.app/projects/Kenji-NX/commit/2288084b531b185f5840a696b23265014f07e2f2 by @Mythrax acc:u1 was missing the *Deprecated cmd Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4343 Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- src/core/hle/kernel/svc/svc_info.cpp | 128 ++++++++---------- src/core/hle/service/acc/acc.cpp | 3 +- src/core/hle/service/am/am_types.h | 1 + src/core/hle/service/am/applet.h | 1 + .../all_system_applet_proxies_service.cpp | 8 +- .../all_system_applet_proxies_service.h | 8 +- .../am/service/common_state_getter.cpp | 75 ++++++++-- .../service/am/service/common_state_getter.h | 12 +- src/core/hle/service/i2c/i2c.cpp | 32 ++++- .../vi/application_display_service.cpp | 7 + .../service/vi/application_display_service.h | 1 + 11 files changed, 177 insertions(+), 99 deletions(-) diff --git a/src/core/hle/kernel/svc/svc_info.cpp b/src/core/hle/kernel/svc/svc_info.cpp index 4487fa5cfd..e6190ac33a 100644 --- a/src/core/hle/kernel/svc/svc_info.cpp +++ b/src/core/hle/kernel/svc/svc_info.cpp @@ -10,17 +10,15 @@ #include "core/hle/kernel/k_process.h" #include "core/hle/kernel/k_resource_limit.h" #include "core/hle/kernel/svc.h" +#include "core/hle/kernel/svc_results.h" +#include "core/hle/kernel/svc_version.h" namespace Kernel::Svc { /// Gets system/memory information for the current process -Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle handle, - u64 info_sub_id) { - LOG_TRACE(Kernel_SVC, "called info_id={:#x}, info_sub_id={:#x}, handle={:#08x}", - info_id_type, info_sub_id, handle); - - u32 info_id = static_cast(info_id_type); - +Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle handle, u64 info_sub_id) { + LOG_TRACE(Kernel_SVC, "called info_id={:#x}, info_sub_id={:#x}, handle={:#08x}", info_id_type, info_sub_id, handle); + u32 info_id = u32(info_id_type); switch (info_id_type) { case InfoType::CoreMask: case InfoType::PriorityMask: @@ -53,152 +51,123 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle case InfoType::CoreMask: *result = process->GetCoreMask(); R_SUCCEED(); - case InfoType::PriorityMask: *result = process->GetPriorityMask(); R_SUCCEED(); - case InfoType::AliasRegionAddress: *result = GetInteger(process->GetPageTable().GetAliasRegionStart()); R_SUCCEED(); - case InfoType::AliasRegionSize: *result = process->GetPageTable().GetAliasRegionSize(); R_SUCCEED(); case InfoType::HeapRegionAddress: *result = GetInteger(process->GetPageTable().GetHeapRegionStart()); R_SUCCEED(); - case InfoType::HeapRegionSize: *result = process->GetPageTable().GetHeapRegionSize(); R_SUCCEED(); - case InfoType::AslrRegionAddress: *result = GetInteger(process->GetPageTable().GetAliasCodeRegionStart()); R_SUCCEED(); - case InfoType::AslrRegionSize: *result = process->GetPageTable().GetAliasCodeRegionSize(); R_SUCCEED(); - case InfoType::StackRegionAddress: *result = GetInteger(process->GetPageTable().GetStackRegionStart()); R_SUCCEED(); - case InfoType::StackRegionSize: *result = process->GetPageTable().GetStackRegionSize(); R_SUCCEED(); - case InfoType::TotalMemorySize: *result = process->GetTotalUserPhysicalMemorySize(system.Kernel()); R_SUCCEED(); - case InfoType::UsedMemorySize: *result = process->GetUsedUserPhysicalMemorySize(system.Kernel()); R_SUCCEED(); - case InfoType::SystemResourceSizeTotal: *result = process->GetTotalSystemResourceSize(); R_SUCCEED(); - case InfoType::SystemResourceSizeUsed: *result = process->GetUsedSystemResourceSize(); R_SUCCEED(); - case InfoType::ProgramId: *result = process->GetProgramId(); R_SUCCEED(); - case InfoType::UserExceptionContextAddress: *result = GetInteger(process->GetProcessLocalRegionAddress()); R_SUCCEED(); - case InfoType::TotalNonSystemMemorySize: *result = process->GetTotalNonSystemUserPhysicalMemorySize(system.Kernel()); R_SUCCEED(); - case InfoType::UsedNonSystemMemorySize: *result = process->GetUsedNonSystemUserPhysicalMemorySize(system.Kernel()); R_SUCCEED(); - case InfoType::IsApplication: *result = process->IsApplication(); R_SUCCEED(); - case InfoType::FreeThreadCount: if (KResourceLimit* resource_limit = process->GetResourceLimit(); resource_limit != nullptr) { - const auto current_value = - resource_limit->GetCurrentValue(Svc::LimitableResource::ThreadCountMax); - const auto limit_value = - resource_limit->GetLimitValue(Svc::LimitableResource::ThreadCountMax); + const auto current_value = resource_limit->GetCurrentValue(Svc::LimitableResource::ThreadCountMax); + const auto limit_value = resource_limit->GetLimitValue(Svc::LimitableResource::ThreadCountMax); *result = limit_value - current_value; } else { *result = 0; } R_SUCCEED(); - case InfoType::AliasRegionExtraSize: { - if (info_sub_id != 0) { - return ResultInvalidCombination; - } - + R_UNLESS(info_sub_id == 0, ResultInvalidCombination); KProcess* current_process = GetCurrentProcessPointer(system.Kernel()); *result = current_process->GetPageTable().GetAliasRegionExtraSize(); - R_SUCCEED(); } - default: break; } - LOG_ERROR(Kernel_SVC, "Unimplemented svcGetInfo id={:#016x}", info_id); R_THROW(ResultInvalidEnumValue); } - case InfoType::DebuggerAttached: *result = 0; R_SUCCEED(); - case InfoType::ResourceLimit: { R_UNLESS(handle == 0, ResultInvalidHandle); R_UNLESS(info_sub_id == 0, ResultInvalidCombination); - KProcess* const current_process = GetCurrentProcessPointer(system.Kernel()); KHandleTable& handle_table = current_process->GetHandleTable(); - const auto resource_limit = current_process->GetResourceLimit(); - if (!resource_limit) { + if (auto const resource_limit = current_process->GetResourceLimit(); resource_limit) { + Handle resource_handle{}; + R_TRY(handle_table.Add(system.Kernel(), std::addressof(resource_handle), resource_limit)); + *result = resource_handle; + } else { *result = Svc::InvalidHandle; - // Yes, the kernel considers this a successful operation. - R_SUCCEED(); } - - Handle resource_handle{}; - R_TRY(handle_table.Add(system.Kernel(), std::addressof(resource_handle), resource_limit)); - - *result = resource_handle; + // Yes, the kernel considers this a successful operation either way. R_SUCCEED(); } - case InfoType::RandomEntropy: R_UNLESS(handle == 0, ResultInvalidHandle); R_UNLESS(info_sub_id < 4, ResultInvalidCombination); - *result = GetCurrentProcess(system.Kernel()).GetRandomEntropy(info_sub_id); R_SUCCEED(); - - case InfoType::InitialProcessIdRange: - LOG_WARNING(Kernel_SVC, - "(STUBBED) Attempted to query privileged process id bounds, returned 0"); - *result = 0; - R_SUCCEED(); - + case InfoType::InitialProcessIdRange: { + LOG_WARNING(Kernel_SVC, "(STUBBED) Attempted to query privileged process id bounds, returned 0/64"); + R_UNLESS(handle == InvalidHandle, ResultInvalidHandle); + switch (InitialProcessIdRangeInfo(info_sub_id)) { + case InitialProcessIdRangeInfo::Minimum: + *result = 0; //todo + R_SUCCEED(); + case InitialProcessIdRangeInfo::Maximum: + *result = 64; //todo + R_SUCCEED(); + default: + R_THROW(ResultInvalidCombination); + } + } case InfoType::ThreadTickCount: { constexpr u64 num_cpus = 4; if (info_sub_id != 0xFFFFFFFFFFFFFFFF && info_sub_id >= num_cpus) { - LOG_ERROR(Kernel_SVC, "Core count is out of range, expected {} but got {}", num_cpus, - info_sub_id); + LOG_ERROR(Kernel_SVC, "Core count is out of range, expected {} but got {}", num_cpus, info_sub_id); R_THROW(ResultInvalidCombination); } @@ -206,8 +175,7 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle .GetHandleTable() .GetObject(system.Kernel(), Handle(handle)); if (thread.IsNull()) { - LOG_ERROR(Kernel_SVC, "Thread handle does not exist, handle={:#08x}", - static_cast(handle)); + LOG_ERROR(Kernel_SVC, "Thread handle does not exist, handle={:#08x}", Handle(handle)); R_THROW(ResultInvalidHandle); } @@ -220,7 +188,6 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle u64 out_ticks = 0; if (same_thread && info_sub_id == 0xFFFFFFFFFFFFFFFF) { const u64 thread_ticks = current_thread->GetCpuTime(); - out_ticks = thread_ticks + (core_timing.GetClockTicks() - prev_ctx_ticks); } else if (same_thread && info_sub_id == system.Kernel().CurrentPhysicalCoreIndex()) { out_ticks = core_timing.GetClockTicks() - prev_ctx_ticks; @@ -230,19 +197,40 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle R_SUCCEED(); } case InfoType::IdleTickCount: { - // Verify the input handle is invalid. - R_UNLESS(handle == InvalidHandle, ResultInvalidHandle); - // Verify the requested core is valid. const bool core_valid = - (info_sub_id == 0xFFFFFFFFFFFFFFFF) || - (info_sub_id == static_cast(system.Kernel().CurrentPhysicalCoreIndex())); + (info_sub_id == 0xFFFFFFFFFFFFFFFF) + || (info_sub_id == u64(system.Kernel().CurrentPhysicalCoreIndex())); R_UNLESS(core_valid, ResultInvalidCombination); + // Verify the input handle is invalid. + R_UNLESS(handle == InvalidHandle, ResultInvalidHandle); + // Get the idle tick count. *result = system.Kernel().CurrentScheduler()->GetIdleThread()->GetCpuTime(); R_SUCCEED(); } + case InfoType::MesosphereMeta: { + enum MesosphereMetaInfo : u64 { + KernelVersion = 0, + IsKTraceEnabled = 1, + IsSingleStepEnabled = 2, + }; + R_UNLESS(handle == InvalidHandle, ResultInvalidHandle); + switch (MesosphereMetaInfo(info_sub_id)) { + case MesosphereMetaInfo::KernelVersion: + *result = Kernel::Svc::SupportedKernelVersion; + R_SUCCEED(); + case MesosphereMetaInfo::IsKTraceEnabled: + *result = 0; + R_SUCCEED(); + case MesosphereMetaInfo::IsSingleStepEnabled: + *result = 0; + R_SUCCEED(); + default: + R_THROW(ResultInvalidCombination); + } + } case InfoType::MesosphereCurrentProcess: { // Verify the input handle is invalid. R_UNLESS(handle == InvalidHandle, ResultInvalidHandle); @@ -255,13 +243,11 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle KHandleTable& handle_table = current_process->GetHandleTable(); // Get a new handle for the current process. - Handle tmp; + Handle tmp{}; R_TRY(handle_table.Add(system.Kernel(), std::addressof(tmp), current_process)); // Set the output. *result = tmp; - - // We succeeded. R_SUCCEED(); } default: diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index 37826b0752..d68b6bde0d 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -1387,7 +1387,8 @@ public: {5, &ACC_U1::GetProfile, "GetProfile"}, {6, nullptr, "GetProfileDigest"}, {50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, - {51, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, + {51, &ACC_U1::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, + {52, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, {60, &ACC_U1::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, {99, nullptr, "DebugActivateOpenContextRetention"}, {100, nullptr, "GetUserRegistrationNotifier"}, diff --git a/src/core/hle/service/am/am_types.h b/src/core/hle/service/am/am_types.h index f88f91ae47..6b7cbbc12a 100644 --- a/src/core/hle/service/am/am_types.h +++ b/src/core/hle/service/am/am_types.h @@ -154,6 +154,7 @@ enum class AppletMessage : u32 { DetectLongPressingCaptureButton = 91, AlbumScreenShotTaken = 92, AlbumRecordingSaved = 93, + StartupLogoDisappeared = 95, }; enum class LibraryAppletMode : u32 { diff --git a/src/core/hle/service/am/applet.h b/src/core/hle/service/am/applet.h index 73303b2e66..571fa65219 100644 --- a/src/core/hle/service/am/applet.h +++ b/src/core/hle/service/am/applet.h @@ -91,6 +91,7 @@ struct Applet { // Common state bool sleep_lock_enabled{}; bool vr_mode_enabled{}; + bool vr_mode_enabled_3d{}; bool lcd_backlight_off_enabled{}; APM::CpuBoostMode boost_mode{}; bool request_exit_to_library_applet_at_execute_next_program_enabled{}; diff --git a/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp b/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp index 562d95f001..437032c2f4 100644 --- a/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp +++ b/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp @@ -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-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -73,8 +73,7 @@ Result IAllSystemAppletProxiesService::OpenLibraryAppletProxy( Result IAllSystemAppletProxiesService::OpenOverlayAppletProxy( Out> out_overlay_applet_proxy, ClientProcessId pid, - InCopyHandle process_handle, - InLargeData attribute) { + InCopyHandle process_handle) { LOG_WARNING(Service_AM, "called"); if (const auto applet = this->GetAppletFromProcessId(pid); applet) { @@ -89,8 +88,7 @@ Result IAllSystemAppletProxiesService::OpenOverlayAppletProxy( Result IAllSystemAppletProxiesService::OpenSystemApplicationProxy( Out> out_system_application_proxy, ClientProcessId pid, - InCopyHandle process_handle, - InLargeData attribute) { + InCopyHandle process_handle) { LOG_DEBUG(Service_AM, "called"); if (const auto applet = this->GetAppletFromProcessId(pid); applet) { diff --git a/src/core/hle/service/am/service/all_system_applet_proxies_service.h b/src/core/hle/service/am/service/all_system_applet_proxies_service.h index eccd92a376..73cb8a09ac 100644 --- a/src/core/hle/service/am/service/all_system_applet_proxies_service.h +++ b/src/core/hle/service/am/service/all_system_applet_proxies_service.h @@ -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-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -36,15 +36,13 @@ private: InCopyHandle process_handle, InLargeData attribute); Result OpenOverlayAppletProxy(Out> out_overlay_applet_proxy, - ClientProcessId pid, InCopyHandle process_handle, - InLargeData attribute); + ClientProcessId pid, InCopyHandle process_handle); Result OpenLibraryAppletProxyOld( Out> out_library_applet_proxy, ClientProcessId pid, InCopyHandle process_handle); Result OpenSystemApplicationProxy( Out> out_system_application_proxy, ClientProcessId pid, - InCopyHandle process_handle, - InLargeData attribute); + InCopyHandle process_handle); Result GetSystemProcessCommonFunctions(); Result GetAppletAlternativeFunctions(); diff --git a/src/core/hle/service/am/service/common_state_getter.cpp b/src/core/hle/service/am/service/common_state_getter.cpp index 23f67dcf17..044929e434 100644 --- a/src/core/hle/service/am/service/common_state_getter.cpp +++ b/src/core/hle/service/am/service/common_state_getter.cpp @@ -39,7 +39,7 @@ ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr, "PushToGeneralChannel"}, - {30, nullptr, "GetHomeButtonReaderLockAccessor"}, + {30, D<&ICommonStateGetter::GetHomeButtonReaderLockAccessor>, "GetHomeButtonReaderLockAccessor"}, {31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx"}, //2.0.0+ {32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx"}, //7.0.0+ {40, nullptr, "GetCradleFwVersion"}, //2.0.0+ @@ -65,7 +65,7 @@ ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr, "SetHandlingHomeButtonShortPressedEnabled"}, {110, nullptr, "OpenMyGpuErrorHandler"}, {120, D<&ICommonStateGetter::GetAppletLaunchedHistory>, "GetAppletLaunchedHistory"}, //13.0.0+ - {130, nullptr, "Unknown130"}, //21.0.0+ + {130, D<&ICommonStateGetter::EnableStartupLogoDisappearedMessage>, "EnableStartupLogoDisappearedMessage"}, //21.0.0+ {200, D<&ICommonStateGetter::GetOperationModeSystemInfo>, "GetOperationModeSystemInfo"}, {300, D<&ICommonStateGetter::GetSettingsPlatformRegion>, "GetSettingsPlatformRegion"}, {400, nullptr, "ActivateMigrationService"}, @@ -74,14 +74,17 @@ ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr, "Unknown610"}, //21.0.0+ {611, D<&ICommonStateGetter::Unknown611>, "Unknown611"}, //22.0.0+ {900, D<&ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled>, "SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled"}, //11.0.0+ {910, nullptr, "GetLaunchRequiredTick"}, //17.0.0+ - {1000, nullptr, "BeginVrMode3d"}, //19.0.0+ - {1001, nullptr, "EndVrMode3d"}, //19.0.0+ - {1002, nullptr, "IsVrModeEnabled3d"}, //19.0.0+ + {1000, D<&ICommonStateGetter::BeginVrMode3d>, "BeginVrMode3d"}, //19.0.0+ + {1001, D<&ICommonStateGetter::EndVrMode3d>, "EndVrMode3d"}, //19.0.0+ + {1002, D<&ICommonStateGetter::IsVrModeEnabled3d>, "IsVrModeEnabled3d"}, //19.0.0+ + {1003, D<&ICommonStateGetter::GetVrLaboGoggleViewport>, "GetVrLaboGoggleViewport"}, //21.0.0+ + {1004, D<&ICommonStateGetter::GetPanelPhysicalSizeForSpecificTitle>, "GetPanelPhysicalSizeForSpecificTitle"}, //21.0.0+ + {1005, D<&ICommonStateGetter::GetPanelResolutionForSpecificTitle>, "GetPanelResolutionForSpecificTitle"}, //21.0.0+ }; // clang-format on @@ -311,6 +314,12 @@ Result ICommonStateGetter::PerformSystemButtonPressingIfInFocus(SystemButtonType R_SUCCEED(); } +Result ICommonStateGetter::EnableStartupLogoDisappearedMessage() { + LOG_WARNING(Service_AM, "(STUBBED) called"); + m_applet->lifecycle_manager.PushUnorderedMessage(system.Kernel(), AppletMessage::StartupLogoDisappeared); + R_SUCCEED(); +} + Result ICommonStateGetter::GetOperationModeSystemInfo(Out out_operation_mode_system_info) { LOG_WARNING(Service_AM, "(STUBBED) called"); *out_operation_mode_system_info = 0; @@ -355,6 +364,12 @@ Result ICommonStateGetter::PushToGeneralChannel(SharedPointer storage) R_SUCCEED(); } +Result ICommonStateGetter::GetHomeButtonReaderLockAccessor(Out> out_lock_accessor) { + LOG_DEBUG(Service_AM, "called"); + *out_lock_accessor = std::make_shared(system); + R_SUCCEED(); +} + Result ICommonStateGetter::SetHandlingHomeButtonShortPressedEnabled(bool enabled) { LOG_DEBUG(Service_AM, "called, enabled={} applet_id={}", enabled, m_applet->applet_id); @@ -363,14 +378,58 @@ Result ICommonStateGetter::SetHandlingHomeButtonShortPressedEnabled(bool enabled R_SUCCEED(); } -Result ICommonStateGetter::Unknown610() { +Result ICommonStateGetter::Unknown610(u64 unk) { LOG_WARNING(Service_AM, "(STUBBED) called"); R_SUCCEED(); } -Result ICommonStateGetter::Unknown611() { +Result ICommonStateGetter::Unknown611(u8 unk) { LOG_WARNING(Service_AM, "(STUBBED) called"); R_SUCCEED(); } +Result ICommonStateGetter::BeginVrMode3d() { + std::scoped_lock lk{m_applet->lock}; + m_applet->vr_mode_enabled_3d = true; + LOG_WARNING(Service_AM, "VR Mode is {}", m_applet->vr_mode_enabled_3d ? "on" : "off"); + R_SUCCEED(); +} + +Result ICommonStateGetter::EndVrMode3d() { + std::scoped_lock lk{m_applet->lock}; + m_applet->vr_mode_enabled_3d = false; + LOG_WARNING(Service_AM, "VR Mode is {}", m_applet->vr_mode_enabled_3d ? "on" : "off"); + R_SUCCEED(); +} + +Result ICommonStateGetter::IsVrModeEnabled3d(Out out_is_vr_mode_enabled_3d) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + std::scoped_lock lk{m_applet->lock}; + *out_is_vr_mode_enabled_3d = m_applet->vr_mode_enabled_3d; + R_SUCCEED(); +} + +Result ICommonStateGetter::GetVrLaboGoggleViewport(Out out_x, Out out_y, Out out_width, Out out_height) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_x = 0; + *out_y = 0; + *out_width = 1280; + *out_height = 720; + R_SUCCEED(); +} + +Result ICommonStateGetter::GetPanelPhysicalSizeForSpecificTitle(Out out_width, Out out_height) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_width = 137250.0f / 1000.0f; + *out_height = 77200.0f / 1000.0f; + R_SUCCEED(); +} + +Result ICommonStateGetter::GetPanelResolutionForSpecificTitle(Out out_width, Out out_height) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_width = 1280; + *out_height = 720; + R_SUCCEED(); +} + } // namespace Service::AM diff --git a/src/core/hle/service/am/service/common_state_getter.h b/src/core/hle/service/am/service/common_state_getter.h index c1bec4f2a2..da86b5d079 100644 --- a/src/core/hle/service/am/service/common_state_getter.h +++ b/src/core/hle/service/am/service/common_state_getter.h @@ -56,15 +56,23 @@ private: Result GetDefaultDisplayResolution(Out out_width, Out out_height); Result GetBuiltInDisplayType(Out out_display_type); Result PerformSystemButtonPressingIfInFocus(SystemButtonType type); + Result EnableStartupLogoDisappearedMessage(); Result GetOperationModeSystemInfo(Out out_operation_mode_system_info); Result GetAppletLaunchedHistory(Out out_count, OutArray out_applet_ids); Result GetSettingsPlatformRegion(Out out_settings_platform_region); Result SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled(); Result PushToGeneralChannel(SharedPointer storage); // cmd 20 + Result GetHomeButtonReaderLockAccessor(Out> out_lock_accessor); Result SetHandlingHomeButtonShortPressedEnabled(bool enabled); - Result Unknown610(); - Result Unknown611(); + Result Unknown610(u64 unk); + Result Unknown611(u8 unk); + Result BeginVrMode3d(); + Result EndVrMode3d(); + Result IsVrModeEnabled3d(Out out_is_vr_mode_enabled_3d); + Result GetVrLaboGoggleViewport(Out out_x, Out out_y, Out out_width, Out out_height); + Result GetPanelPhysicalSizeForSpecificTitle(Out out_width, Out out_height); + Result GetPanelResolutionForSpecificTitle(Out out_width, Out out_height); void SetCpuBoostMode(HLERequestContext& ctx); diff --git a/src/core/hle/service/i2c/i2c.cpp b/src/core/hle/service/i2c/i2c.cpp index d000487246..0b242768c2 100644 --- a/src/core/hle/service/i2c/i2c.cpp +++ b/src/core/hle/service/i2c/i2c.cpp @@ -32,7 +32,6 @@ public: RegisterHandlers(functions); } ~I2CSession() override = default; - Result Send(InBuffer in_data, u32 transaction_option) { LOG_WARNING(Service, "(stubbed) topt={}", transaction_option); R_THROW(ResultUnknown); @@ -50,21 +49,40 @@ public: : ServiceFramework{system_, "i2c"} { static const FunctionInfo functions[] = { - {0, nullptr, "OpenSessionForDev"}, + {0, C<&I2C::OpenSessionForDev>, "OpenSessionForDev"}, {1, C<&I2C::OpenSession>, "OpenSession"}, - {2, nullptr, "HasDevice"}, - {3, nullptr, "HasDeviceForDev"}, - {4, nullptr, "OpenSession2"}, + {2, C<&I2C::HasDevice>, "HasDevice"}, + {3, C<&I2C::HasDeviceForDev>, "HasDeviceForDev"}, + {4, C<&I2C::OpenSession2>, "OpenSession2"}, }; RegisterHandlers(functions); } ~I2C() override = default; - - Result OpenSession(I2CDevice device, OutInterface out_session) { + Result OpenSessionForDev(OutInterface out_session, s32 bus_idx, u32 slave_address, u32 addressing_mode, u32 speed_mode) { LOG_DEBUG(Service, "(stubbed)"); *out_session = std::make_shared(system); R_SUCCEED(); } + Result OpenSession(OutInterface out_session, I2CDevice device) { + LOG_DEBUG(Service, "(stubbed)"); + *out_session = std::make_shared(system); + R_SUCCEED(); + } + Result HasDevice(Out out_has_device, I2CDevice device) { + LOG_DEBUG(Service, "(stubbed)"); + *out_has_device = false; + R_SUCCEED(); + } + Result HasDeviceForDev(Out out_has_device, I2CDevice device) { + LOG_DEBUG(Service, "(stubbed)"); + *out_has_device = false; + R_SUCCEED(); + } + Result OpenSession2(OutInterface out_session, u32 device_code) { + LOG_DEBUG(Service, "(stubbed) device_code={}", device_code); + *out_session = std::make_shared(system); + R_SUCCEED(); + } }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/vi/application_display_service.cpp b/src/core/hle/service/vi/application_display_service.cpp index d842c9dd42..f179ba676a 100644 --- a/src/core/hle/service/vi/application_display_service.cpp +++ b/src/core/hle/service/vi/application_display_service.cpp @@ -13,6 +13,7 @@ #include "core/hle/service/vi/manager_display_service.h" #include "core/hle/service/vi/system_display_service.h" #include "core/hle/service/vi/vi_results.h" +#include "service_creator.h" namespace Service::VI { @@ -38,6 +39,7 @@ IApplicationDisplayService::IApplicationDisplayService(Core::System& system_, {2031, C<&IApplicationDisplayService::DestroyStrayLayer>, "DestroyStrayLayer"}, {2101, C<&IApplicationDisplayService::SetLayerScalingMode>, "SetLayerScalingMode"}, {2102, C<&IApplicationDisplayService::ConvertScalingMode>, "ConvertScalingMode"}, + {2103, C<&IApplicationDisplayService::Cmd2103>, "Cmd2103"}, {2450, C<&IApplicationDisplayService::GetIndirectLayerImageMap>, "GetIndirectLayerImageMap"}, {2451, nullptr, "GetIndirectLayerImageCropMap"}, {2460, C<&IApplicationDisplayService::GetIndirectLayerImageRequiredMemoryInfo>, "GetIndirectLayerImageRequiredMemoryInfo"}, @@ -289,6 +291,11 @@ Result IApplicationDisplayService::ConvertScalingMode(Out ou } } +Result IApplicationDisplayService::Cmd2103(Out> out_unk18) { + LOG_WARNING(Service_VI, "(stubbed)"); + R_SUCCEED(); +} + Result IApplicationDisplayService::GetIndirectLayerImageMap( Out out_size, Out out_stride, OutBuffer out_buffer, diff --git a/src/core/hle/service/vi/application_display_service.h b/src/core/hle/service/vi/application_display_service.h index a2eeb4c70c..d2db391efd 100644 --- a/src/core/hle/service/vi/application_display_service.h +++ b/src/core/hle/service/vi/application_display_service.h @@ -64,6 +64,7 @@ public: Result GetDisplayVsyncEvent(OutCopyHandle out_vsync_event, u64 display_id); Result ConvertScalingMode(Out out_scaling_mode, NintendoScaleMode mode); + Result Cmd2103(Out> out_unk18); Result GetIndirectLayerImageMap( Out out_size, Out out_stride, OutBuffer out_buffer, From ce202292cfb668bcf45e64172cd40c8972eff7f5 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 8 Sep 2026 20:40:19 +0200 Subject: [PATCH 012/128] [gpu] Destroy GPU thread after all non-trivial members had been destroyed (#4368) Should help fix any game hangs after closing the emulator, or sporadic hangs when restarting. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4368 Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- src/video_core/gpu.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index ff7dafb222..a2e87b260a 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -55,11 +55,11 @@ constexpr u64 GpuClockMultiplier(Settings::GpuClock clock) { struct GPU::Impl { explicit Impl(Core::System& system_, bool is_async_, bool use_nvdec_) - : system{system_} + : gpu_thread{system_} + , system{system_} , use_nvdec{use_nvdec_} , shader_notify() , is_async{is_async_} - , gpu_thread{system_} {} ~Impl() = default; @@ -301,6 +301,10 @@ struct GPU::Impl { return out; } + // Destruction of thread must be done before all (non trivial) + // previous members has been destroyed + VideoCommon::GPUThread::ThreadManager gpu_thread; + Core::System& system; std::unique_ptr renderer; @@ -329,7 +333,6 @@ struct GPU::Impl { const bool is_async; - VideoCommon::GPUThread::ThreadManager gpu_thread; std::unique_ptr cpu_context; Tegra::Control::Scheduler scheduler; From a538cd9aff1158a1d0f71020518d8984f31bb0e1 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Tue, 8 Sep 2026 20:42:20 +0200 Subject: [PATCH 013/128] [shader_recompiler, vulkan] Virtual buffer pages with multi-range + sparse buffers binding (#4362) Storage buffers can span GPU pages that aren't contiguous in host memory, but the buffer cache assumed one contiguous buffer per binding, so anything crossing a mapping boundary read the wrong bytes. Multi-range binding resolves the real segments and presents them to the shader as one buffer, aliasing their memory into a sparse VkBuffer or gathering them into a copy, all of this was mostly fixed by making a path to use sparse on buffers (the same way as texture cache has it) and retrieve properly the mapping ranges to the virtual pages, including the actual structure on the use of binding sparse. Meanwhile this fixes Monster Hunter Sunbreak z-fighting, bad performance and mostly vertex explosions (coming from the contiguous buffer read from the shader's game) it's only the basis for a further investigation towards how are we gonna treat phi calculations, optimized them and mostly eradicate the currently excess of exposure on the textures where the lightning trace should not being reflected. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4362 Reviewed-by: lizzie Reviewed-by: Maufeat --- src/video_core/CMakeLists.txt | 3 + src/video_core/buffer_cache/buffer_cache.h | 160 +++++++-- .../buffer_cache/buffer_cache_base.h | 26 +- .../buffer_cache/virtual_range_cache.h | 173 +++++++++ .../renderer_opengl/gl_buffer_cache.cpp | 2 +- .../renderer_opengl/gl_buffer_cache.h | 3 +- .../renderer_vulkan/vk_buffer_cache.cpp | 48 ++- .../renderer_vulkan/vk_buffer_cache.h | 61 +++- .../renderer_vulkan/vk_multi_range_buffer.cpp | 338 ++++++++++++++++++ .../renderer_vulkan/vk_multi_range_buffer.h | 105 ++++++ .../renderer_vulkan/vk_rasterizer.cpp | 1 + .../vulkan_common/vulkan_device.cpp | 2 + src/video_core/vulkan_common/vulkan_device.h | 5 + .../vulkan_common/vulkan_memory_allocator.cpp | 60 +++- .../vulkan_common/vulkan_memory_allocator.h | 5 +- .../vulkan_common/vulkan_wrapper.cpp | 1 + src/video_core/vulkan_common/vulkan_wrapper.h | 25 +- 17 files changed, 975 insertions(+), 43 deletions(-) create mode 100644 src/video_core/buffer_cache/virtual_range_cache.h create mode 100644 src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp create mode 100644 src/video_core/renderer_vulkan/vk_multi_range_buffer.h diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index c86849837b..14bd13b8af 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -20,6 +20,7 @@ add_library(video_core STATIC buffer_cache/buffer_cache.h buffer_cache/memory_tracker_base.h buffer_cache/usage_tracker.h + buffer_cache/virtual_range_cache.h buffer_cache/word_manager.h cache_types.h capture.h @@ -166,6 +167,8 @@ add_library(video_core STATIC renderer_vulkan/vk_fence_manager.h renderer_vulkan/vk_graphics_pipeline.cpp renderer_vulkan/vk_graphics_pipeline.h + renderer_vulkan/vk_multi_range_buffer.cpp + renderer_vulkan/vk_multi_range_buffer.h renderer_vulkan/vk_master_semaphore.cpp renderer_vulkan/vk_master_semaphore.h renderer_vulkan/vk_pipeline_cache.cpp diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index e40aad1fb5..4c345dd213 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -112,6 +112,13 @@ void BufferCache

::TickFrame() { async_buffers_death_ring.clear(); } +template +void BufferCache

::UnmapGPUMemory(size_t as_id, GPUVAddr gpu_addr, size_t size) { + if constexpr (requires { runtime.BindMultiRangeStorageBuffer(u64{}, bool{}); }) { + virtual_ranges.Unmap(as_id, gpu_addr, size); + } +} + template void BufferCache

::WriteMemory(DAddr device_addr, u64 size) { if (memory_tracker.IsRegionGpuModified(device_addr, size)) { @@ -208,8 +215,8 @@ bool BufferCache

::DMACopy(GPUVAddr src_address, GPUVAddr dest_address, u64 am BufferId buffer_b; do { channel_state->has_deleted_buffers = false; - buffer_a = FindBuffer(*cpu_src_address, static_cast(amount)); - buffer_b = FindBuffer(*cpu_dest_address, static_cast(amount)); + buffer_a = FindBuffer(*cpu_src_address, static_cast(amount), false); + buffer_b = FindBuffer(*cpu_dest_address, static_cast(amount), false); } while (channel_state->has_deleted_buffers); auto& src_buffer = slot_buffers[buffer_a]; auto& dest_buffer = slot_buffers[buffer_b]; @@ -265,7 +272,7 @@ bool BufferCache

::DMAClear(GPUVAddr dst_address, u64 amount, u32 value) { ClearDownload(*cpu_dst_address, size); gpu_modified_ranges.Subtract(*cpu_dst_address, size); - const BufferId buffer = FindBuffer(*cpu_dst_address, static_cast(size)); + const BufferId buffer = FindBuffer(*cpu_dst_address, static_cast(size), false); Buffer& dest_buffer = slot_buffers[buffer]; const u32 offset = dest_buffer.Offset(*cpu_dst_address); runtime.ClearBuffer(dest_buffer, offset, size, value); @@ -287,7 +294,7 @@ std::pair BufferCache

::ObtainBuffer(GPUVAddr gpu_ad template std::pair BufferCache

::ObtainCPUBuffer( DAddr device_addr, u32 size, ObtainBufferSynchronize sync_info, ObtainBufferOperation post_op) { - const BufferId buffer_id = FindBuffer(device_addr, size); + const BufferId buffer_id = FindBuffer(device_addr, size, false); Buffer& buffer = slot_buffers[buffer_id]; // synchronize op @@ -998,11 +1005,85 @@ void BufferCache

::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32 channel_state->fast_bound_uniform_buffers[stage] &= ~(1u << binding_index); } +template +void BufferCache

::ResolveMultiRangeStorage(Binding& binding, bool is_written, + std::vector& pool) { + binding.segment_first = 0; + binding.segment_count = 0; + if constexpr (requires { runtime.BindMultiRangeStorageBuffer(u64{}, bool{}); }) { + if (binding.gpu_addr == 0 || binding.size == 0) { + return; + } + if (is_written && !runtime.PrefersSparseSources()) { + return; + } + const VirtualSegments* found = + virtual_ranges.Query(*gpu_memory, binding.gpu_addr, binding.size); + if (!found || found->size() < 2) { + return; + } + const VirtualSegments segments = *found; + const u32 first = static_cast(pool.size()); + const bool prefer_sparse = runtime.PrefersSparseSources(); + for (const VirtualSegment& segment : segments) { + const BufferId buffer_id = + FindBuffer(segment.device_addr, segment.size, prefer_sparse); + if (!buffer_id) { + pool.resize(first); + return; + } + pool.push_back(MultiRangeSegment{ + .buffer_id = buffer_id, + .device_addr = segment.device_addr, + .size = segment.size, + }); + } + binding.segment_first = first; + binding.segment_count = static_cast(segments.size()); + } +} + +template +bool BufferCache

::BindMultiRangeStorage(const Binding& binding, bool is_written, + std::span pool) { + if constexpr (requires { runtime.BindMultiRangeStorageBuffer(u64{}, bool{}); }) { + if (binding.segment_count < 2) { + return false; + } + if (binding.segment_first + binding.segment_count > pool.size()) { + return false; + } + const u64 key = (static_cast(gpu_memory->GetID()) << 48) ^ binding.gpu_addr; + runtime.ResetMultiRange(); + for (u32 index = 0; index < binding.segment_count; ++index) { + const MultiRangeSegment& segment = pool[binding.segment_first + index]; + Buffer& buffer = slot_buffers[segment.buffer_id]; + TouchBuffer(buffer, segment.buffer_id); + if (SynchronizeBuffer(buffer, segment.device_addr, segment.size)) { + runtime.InvalidateMultiRange(key); + } + const u32 offset = buffer.Offset(segment.device_addr); + buffer.MarkUsage(offset, segment.size); + if (is_written) { + MarkWrittenBuffer(segment.buffer_id, segment.device_addr, segment.size); + } + runtime.PushMultiRangeSource(buffer, offset, segment.size); + } + return runtime.BindMultiRangeStorageBuffer(key, is_written); + } else { + return false; + } +} + template void BufferCache

::BindHostGraphicsStorageBuffers(size_t stage) { u32 binding_index = 0; ForEachEnabledBit(channel_state->enabled_storage_buffers[stage], [&](u32 index) { const Binding& binding = channel_state->storage_buffers[stage][index]; + const bool is_written = ((channel_state->written_storage_buffers[stage] >> index) & 1) != 0; + if (BindMultiRangeStorage(binding, is_written, graphics_segments)) { + return; + } Buffer& buffer = slot_buffers[binding.buffer_id]; TouchBuffer(buffer, binding.buffer_id); const u32 size = binding.size; @@ -1010,7 +1091,6 @@ void BufferCache

::BindHostGraphicsStorageBuffers(size_t stage) { const u32 offset = buffer.Offset(binding.device_addr); buffer.MarkUsage(offset, size); - const bool is_written = ((channel_state->written_storage_buffers[stage] >> index) & 1) != 0; if (is_written) { MarkWrittenBuffer(binding.buffer_id, binding.device_addr, size); @@ -1139,6 +1219,11 @@ void BufferCache

::BindHostComputeStorageBuffers() { u32 binding_index = 0; ForEachEnabledBit(channel_state->enabled_compute_storage_buffers, [&](u32 index) { const Binding& binding = channel_state->compute_storage_buffers[index]; + const bool is_written = + ((channel_state->written_compute_storage_buffers >> index) & 1) != 0; + if (BindMultiRangeStorage(binding, is_written, compute_segments)) { + return; + } Buffer& buffer = slot_buffers[binding.buffer_id]; TouchBuffer(buffer, binding.buffer_id); const u32 size = binding.size; @@ -1146,8 +1231,6 @@ void BufferCache

::BindHostComputeStorageBuffers() { const u32 offset = buffer.Offset(binding.device_addr); buffer.MarkUsage(offset, size); - const bool is_written = - ((channel_state->written_compute_storage_buffers >> index) & 1) != 0; if (is_written) { MarkWrittenBuffer(binding.buffer_id, binding.device_addr, size); @@ -1193,6 +1276,7 @@ void BufferCache

::BindHostComputeTextureBuffers() { template void BufferCache

::DoUpdateGraphicsBuffers(bool is_indexed) { + graphics_segments.clear(); BufferOperations([&]() { if (is_indexed) { UpdateIndexBuffer(); @@ -1212,6 +1296,7 @@ void BufferCache

::DoUpdateGraphicsBuffers(bool is_indexed) { template void BufferCache

::DoUpdateComputeBuffers() { + compute_segments.clear(); BufferOperations([&]() { UpdateComputeUniformBuffers(); UpdateComputeStorageBuffers(); @@ -1234,11 +1319,11 @@ void BufferCache

::UpdateIndexBuffer() { auto inline_index_size = static_cast(draw_state.inline_index_draw_indexes.size()); u32 buffer_size = Common::AlignUp(inline_index_size, CACHING_PAGESIZE); if (inline_buffer_id == NULL_BUFFER_ID) [[unlikely]] { - inline_buffer_id = CreateBuffer(0, buffer_size); + inline_buffer_id = CreateBuffer(0, buffer_size, false); } if (slot_buffers[inline_buffer_id].SizeBytes() < buffer_size) [[unlikely]] { slot_buffers.erase(inline_buffer_id); - inline_buffer_id = CreateBuffer(0, buffer_size); + inline_buffer_id = CreateBuffer(0, buffer_size, false); } channel_state->index_buffer = Binding{ .device_addr = 0, @@ -1261,7 +1346,7 @@ void BufferCache

::UpdateIndexBuffer() { channel_state->index_buffer = Binding{ .device_addr = *device_addr, .size = size, - .buffer_id = FindBuffer(*device_addr, size), + .buffer_id = FindBuffer(*device_addr, size, false), }; } @@ -1298,7 +1383,7 @@ void BufferCache

::UpdateVertexBuffer(u32 index) { if (!gpu_memory->IsWithinGPUAddressRange(gpu_addr_end) || size >= 64_MiB) { size = static_cast(gpu_memory->MaxContinuousRange(gpu_addr_begin, size)); } - const BufferId buffer_id = FindBuffer(*device_addr, size); + const BufferId buffer_id = FindBuffer(*device_addr, size, false); const Binding binding{ .device_addr = *device_addr, .size = size, @@ -1319,7 +1404,7 @@ void BufferCache

::UpdateDrawIndirect() { binding = Binding{ .device_addr = *device_addr, .size = static_cast(size), - .buffer_id = FindBuffer(*device_addr, static_cast(size)), + .buffer_id = FindBuffer(*device_addr, static_cast(size), false), }; }; if (current_draw_indirect->include_count) { @@ -1343,7 +1428,7 @@ void BufferCache

::UpdateUniformBuffers(size_t stage) { channel_state->dirty_uniform_buffers[stage] |= 1U << index; } // Resolve buffer - binding.buffer_id = FindBuffer(binding.device_addr, binding.size); + binding.buffer_id = FindBuffer(binding.device_addr, binding.size, false); }); } @@ -1352,8 +1437,10 @@ void BufferCache

::UpdateStorageBuffers(size_t stage) { ForEachEnabledBit(channel_state->enabled_storage_buffers[stage], [&](u32 index) { // Resolve buffer Binding& binding = channel_state->storage_buffers[stage][index]; - const BufferId buffer_id = FindBuffer(binding.device_addr, binding.size); + const BufferId buffer_id = FindBuffer(binding.device_addr, binding.size, false); binding.buffer_id = buffer_id; + const bool is_written = ((channel_state->written_storage_buffers[stage] >> index) & 1) != 0; + ResolveMultiRangeStorage(binding, is_written, graphics_segments); }); } @@ -1361,7 +1448,7 @@ template void BufferCache

::UpdateTextureBuffers(size_t stage) { ForEachEnabledBit(channel_state->enabled_texture_buffers[stage], [&](u32 index) { Binding& binding = channel_state->texture_buffers[stage][index]; - binding.buffer_id = FindBuffer(binding.device_addr, binding.size); + binding.buffer_id = FindBuffer(binding.device_addr, binding.size, false); }); } @@ -1385,7 +1472,7 @@ void BufferCache

::UpdateTransformFeedbackBuffer(u32 index) { channel_state->transform_feedback_buffers[index] = NULL_BINDING; return; } - const BufferId buffer_id = FindBuffer(*device_addr, size); + const BufferId buffer_id = FindBuffer(*device_addr, size, false); channel_state->transform_feedback_buffers[index] = Binding{ .device_addr = *device_addr, .size = size, @@ -1407,7 +1494,7 @@ void BufferCache

::UpdateComputeUniformBuffers() { binding.size = cbuf.size; } } - binding.buffer_id = FindBuffer(binding.device_addr, binding.size); + binding.buffer_id = FindBuffer(binding.device_addr, binding.size, false); }); } @@ -1416,7 +1503,10 @@ void BufferCache

::UpdateComputeStorageBuffers() { ForEachEnabledBit(channel_state->enabled_compute_storage_buffers, [&](u32 index) { // Resolve buffer Binding& binding = channel_state->compute_storage_buffers[index]; - binding.buffer_id = FindBuffer(binding.device_addr, binding.size); + binding.buffer_id = FindBuffer(binding.device_addr, binding.size, false); + const bool is_written = + ((channel_state->written_compute_storage_buffers >> index) & 1) != 0; + ResolveMultiRangeStorage(binding, is_written, compute_segments); }); } @@ -1424,7 +1514,7 @@ template void BufferCache

::UpdateComputeTextureBuffers() { ForEachEnabledBit(channel_state->enabled_compute_texture_buffers, [&](u32 index) { Binding& binding = channel_state->compute_texture_buffers[index]; - binding.buffer_id = FindBuffer(binding.device_addr, binding.size); + binding.buffer_id = FindBuffer(binding.device_addr, binding.size, false); }); } @@ -1440,7 +1530,7 @@ void BufferCache

::MarkWrittenBuffer(BufferId buffer_id, DAddr device_addr, u3 } template -BufferId BufferCache

::FindBuffer(DAddr device_addr, u32 size) { +BufferId BufferCache

::FindBuffer(DAddr device_addr, u32 size, bool sparse_compatible) { if (device_addr == 0) { return NULL_BUFFER_ID; } @@ -1450,10 +1540,18 @@ BufferId BufferCache

::FindBuffer(DAddr device_addr, u32 size) { Buffer& buffer = slot_buffers[buffer_id]; WaitForGpuFenceIfNeeded(buffer); if (buffer.IsInBounds(device_addr, size)) { - return buffer_id; + bool usable = true; + if constexpr (requires { buffer.IsSparseCompatible(); }) { + if (sparse_compatible && !buffer.IsSparseCompatible()) { + usable = false; + } + } + if (usable) { + return buffer_id; + } } } - return CreateBuffer(device_addr, size); + return CreateBuffer(device_addr, size, sparse_compatible); } template @@ -1575,13 +1673,15 @@ void BufferCache

::JoinOverlap(BufferId new_buffer_id, BufferId overlap_id, } template -BufferId BufferCache

::CreateBuffer(DAddr device_addr, u32 wanted_size) { +BufferId BufferCache

::CreateBuffer(DAddr device_addr, u32 wanted_size, + bool sparse_compatible) { DAddr device_addr_end = Common::AlignUp(device_addr + wanted_size, CACHING_PAGESIZE); device_addr = Common::AlignDown(device_addr, CACHING_PAGESIZE); wanted_size = static_cast(device_addr_end - device_addr); const OverlapResult overlap = ResolveOverlaps(device_addr, wanted_size); const u32 size = static_cast(overlap.end - overlap.begin); - const BufferId new_buffer_id = slot_buffers.insert(runtime, overlap.begin, size); + const BufferId new_buffer_id = + slot_buffers.insert(runtime, overlap.begin, size, sparse_compatible); auto& new_buffer = slot_buffers[new_buffer_id]; const size_t size_bytes = new_buffer.SizeBytes(); runtime.ClearBuffer(new_buffer, 0, size_bytes, 0); @@ -1745,7 +1845,7 @@ void BufferCache

::InlineMemoryImplementation(DAddr dest_address, size_t copy_ ClearDownload(dest_address, copy_size); gpu_modified_ranges.Subtract(dest_address, copy_size); - BufferId buffer_id = FindBuffer(dest_address, static_cast(copy_size)); + BufferId buffer_id = FindBuffer(dest_address, static_cast(copy_size), false); auto& buffer = slot_buffers[buffer_id]; SynchronizeBuffer(buffer, dest_address, static_cast(copy_size)); @@ -1831,6 +1931,9 @@ void BufferCache

::DownloadBufferMemory(Buffer& buffer, DAddr device_addr, u64 template void BufferCache

::DeleteBuffer(BufferId buffer_id, bool do_not_mark) { + if constexpr (requires { runtime.OnBufferDeleted(slot_buffers[buffer_id]); }) { + runtime.OnBufferDeleted(slot_buffers[buffer_id]); + } bool dirty_index{false}; boost::container::small_vector dirty_vertex_buffers; const auto scalar_replace = [buffer_id](Binding& binding) { @@ -1934,9 +2037,14 @@ Binding BufferCache

::StorageBufferBinding(GPUVAddr ssbo_addr, u32 cbuf_index, // The end address used for size calculation does not need to be aligned const DAddr cpu_end = Common::AlignUp(*device_addr + size, Core::DEVICE_PAGESIZE); + u32 binding_size = static_cast(cpu_end - *aligned_device_addr); + if (is_written) { + binding_size = aligned_size; + } const Binding binding{ .device_addr = *aligned_device_addr, - .size = is_written ? aligned_size : static_cast(cpu_end - *aligned_device_addr), + .gpu_addr = aligned_gpu_addr, + .size = binding_size, .buffer_id = BufferId{}, }; return binding; diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h index 0a521192c6..0dbb368c47 100644 --- a/src/video_core/buffer_cache/buffer_cache_base.h +++ b/src/video_core/buffer_cache/buffer_cache_base.h @@ -29,6 +29,7 @@ #include "common/settings.h" #include "common/slot_vector.h" #include "video_core/buffer_cache/buffer_base.h" +#include "video_core/buffer_cache/virtual_range_cache.h" #include "video_core/control/channel_state_cache.h" #include "video_core/delayed_destruction_ring.h" #include "video_core/dirty_flags.h" @@ -81,8 +82,17 @@ static constexpr u32 DEFAULT_SKIP_CACHE_SIZE = static_cast(4_KiB); struct Binding { DAddr device_addr{}; + GPUVAddr gpu_addr{}; u32 size{}; BufferId buffer_id; + u32 segment_first{}; + u32 segment_count{}; +}; + +struct MultiRangeSegment { + BufferId buffer_id; + DAddr device_addr{}; + u32 size{}; }; struct TextureBufferBinding : Binding { @@ -215,6 +225,14 @@ public: void TickFrame(); + bool BindMultiRangeStorage(const Binding& binding, bool is_written, + std::span pool); + + void ResolveMultiRangeStorage(Binding& binding, bool is_written, + std::vector& pool); + + void UnmapGPUMemory(size_t as_id, GPUVAddr gpu_addr, size_t size); + void WriteMemory(DAddr device_addr, u64 size); void CachedWriteMemory(DAddr device_addr, u64 size); @@ -414,7 +432,7 @@ private: void MarkWrittenBuffer(BufferId buffer_id, DAddr device_addr, u32 size); - [[nodiscard]] BufferId FindBuffer(DAddr device_addr, u32 size); + [[nodiscard]] BufferId FindBuffer(DAddr device_addr, u32 size, bool sparse_compatible); void WaitForGpuFenceIfNeeded(Buffer& buffer); @@ -422,7 +440,8 @@ private: void JoinOverlap(BufferId new_buffer_id, BufferId overlap_id, bool accumulate_stream_score); - [[nodiscard]] BufferId CreateBuffer(DAddr device_addr, u32 wanted_size); + [[nodiscard]] BufferId CreateBuffer(DAddr device_addr, u32 wanted_size, + bool sparse_compatible); void Register(BufferId buffer_id); @@ -513,6 +532,9 @@ private: using TickType = u64; }; Common::LeastRecentlyUsedCache lru_cache; + VirtualRangeCache virtual_ranges; + std::vector graphics_segments; + std::vector compute_segments; u64 frame_tick = 0; u64 total_used_memory = 0; u64 minimum_memory = 0; diff --git a/src/video_core/buffer_cache/virtual_range_cache.h b/src/video_core/buffer_cache/virtual_range_cache.h new file mode 100644 index 0000000000..f4284d6abb --- /dev/null +++ b/src/video_core/buffer_cache/virtual_range_cache.h @@ -0,0 +1,173 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include +#include +#include +#include + +#include + +#include "common/common_types.h" +#include "common/container/unordered_map.h" +#include "video_core/memory_manager.h" + +namespace VideoCommon { + +struct VirtualSegment { + GPUVAddr gpu_addr; + DAddr device_addr; + u32 size; +}; + +using VirtualSegments = boost::container::small_vector; + +class VirtualRangeCache { +public: + static constexpr size_t MAX_ENTRIES = 8192; + static constexpr size_t MAX_DEFERRED = 4096; + + const VirtualSegments* Query(Tegra::MemoryManager& memory, GPUVAddr gpu_addr, u32 size) { + if (has_deferred.load(std::memory_order_acquire)) { + ApplyDeferred(); + } + if (entries.size() > MAX_ENTRIES) { + entries.clear(); + } + const size_t as_id = memory.GetID(); + const u64 key = MakeKey(as_id, gpu_addr); + const auto it = entries.find(key); + if (it != entries.end() && it->second.as_id == as_id && + it->second.gpu_addr == gpu_addr && it->second.size == size) { + return &it->second.segments; + } + Entry entry{}; + entry.as_id = as_id; + entry.gpu_addr = gpu_addr; + entry.size = size; + const auto ranges = memory.GetSubmappedRange(gpu_addr, size); + GPUVAddr expected = gpu_addr; + bool contiguous = true; + for (const auto& [range_addr, range_size] : ranges) { + if (range_addr != expected || range_size == 0) { + contiguous = false; + break; + } + const std::optional device_addr = memory.GpuToCpuAddress(range_addr); + if (!device_addr || *device_addr == 0) { + contiguous = false; + break; + } + if (range_size > static_cast((std::numeric_limits::max)())) { + contiguous = false; + break; + } + entry.segments.push_back(VirtualSegment{ + .gpu_addr = range_addr, + .device_addr = *device_addr, + .size = static_cast(range_size), + }); + expected += range_size; + } + if (!contiguous || expected != gpu_addr + size) { + entry.segments.clear(); + } + const auto result = entries.insert_or_assign(key, std::move(entry)); + return &result.first->second.segments; + } + + void Unmap(size_t as_id, GPUVAddr gpu_addr, u64 size) { + if (size == 0) { + return; + } + { + std::scoped_lock lock{deferred_mutex}; + if (!deferred.empty()) { + DeferredUnmap& last = deferred.back(); + if (last.as_id == as_id && last.gpu_addr + last.size == gpu_addr) { + last.size += size; + has_deferred.store(true, std::memory_order_release); + return; + } + } + if (deferred.size() >= MAX_DEFERRED) { + deferred.clear(); + deferred_overflow = true; + } else { + deferred.push_back(DeferredUnmap{ + .as_id = as_id, + .gpu_addr = gpu_addr, + .size = size, + }); + } + } + has_deferred.store(true, std::memory_order_release); + } + +private: + struct Entry { + VirtualSegments segments; + size_t as_id{}; + GPUVAddr gpu_addr{}; + u32 size{}; + }; + + struct DeferredUnmap { + size_t as_id; + GPUVAddr gpu_addr; + u64 size; + }; + + static u64 MakeKey(size_t as_id, GPUVAddr gpu_addr) { + return (static_cast(as_id) << 48) ^ gpu_addr; + } + + void ApplyDeferred() { + std::vector pending; + bool overflow = false; + { + std::scoped_lock lock{deferred_mutex}; + has_deferred.store(false, std::memory_order_release); + pending.swap(deferred); + overflow = deferred_overflow; + deferred_overflow = false; + } + if (overflow) { + entries.clear(); + return; + } + if (pending.empty() || entries.empty()) { + return; + } + for (auto it = entries.begin(); it != entries.end();) { + const Entry& entry = it->second; + const GPUVAddr entry_end = entry.gpu_addr + entry.size; + bool overlaps = false; + for (const DeferredUnmap& unmap : pending) { + if (unmap.as_id != entry.as_id) { + continue; + } + if (entry.gpu_addr < unmap.gpu_addr + unmap.size && unmap.gpu_addr < entry_end) { + overlaps = true; + break; + } + } + if (overlaps) { + it = entries.erase(it); + } else { + ++it; + } + } + } + + ::Common::unordered_map entries; + std::vector deferred; + std::mutex deferred_mutex; + std::atomic has_deferred{false}; + bool deferred_overflow{}; +}; + +} // namespace VideoCommon diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.cpp b/src/video_core/renderer_opengl/gl_buffer_cache.cpp index daff57bd00..fb65a132d0 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_buffer_cache.cpp @@ -52,7 +52,7 @@ constexpr std::array PROGRAM_LUT{ Buffer::Buffer(BufferCacheRuntime&, VideoCommon::NullBufferParams null_params) : VideoCommon::BufferBase(null_params) {} -Buffer::Buffer(BufferCacheRuntime& runtime, DAddr cpu_addr_, u64 size_bytes_) +Buffer::Buffer(BufferCacheRuntime& runtime, DAddr cpu_addr_, u64 size_bytes_, bool) : VideoCommon::BufferBase(cpu_addr_, size_bytes_) { buffer.Create(); if (runtime.device.HasDebuggingToolAttached()) { diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.h b/src/video_core/renderer_opengl/gl_buffer_cache.h index 09fa3a59af..6fee58a0eb 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.h +++ b/src/video_core/renderer_opengl/gl_buffer_cache.h @@ -23,7 +23,8 @@ class BufferCacheRuntime; class Buffer : public VideoCommon::BufferBase { public: - explicit Buffer(BufferCacheRuntime&, DAddr cpu_addr, u64 size_bytes); + explicit Buffer(BufferCacheRuntime&, DAddr cpu_addr, u64 size_bytes, + bool sparse_compatible); explicit Buffer(BufferCacheRuntime&, VideoCommon::NullBufferParams); void ImmediateUpload(size_t offset, std::span data) noexcept; diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index a734bd049c..958f3b2a2e 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp @@ -56,7 +56,8 @@ size_t BytesPerIndex(VkIndexType index_type) { } } -vk::Buffer CreateBuffer(const Device& device, const MemoryAllocator& memory_allocator, u64 size) { +vk::Buffer CreateBuffer(const Device& device, const MemoryAllocator& memory_allocator, u64 size, + VkDeviceSize sparse_alignment) { VkBufferUsageFlags flags = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | @@ -82,6 +83,9 @@ vk::Buffer CreateBuffer(const Device& device, const MemoryAllocator& memory_allo .queueFamilyIndexCount = 0, .pQueueFamilyIndices = nullptr, }; + if (sparse_alignment > 1) { + return memory_allocator.CreateBuffer(buffer_ci, MemoryUsage::DeviceLocal, sparse_alignment); + } return memory_allocator.CreateBuffer(buffer_ci, MemoryUsage::DeviceLocal); } } // Anonymous namespace @@ -99,10 +103,14 @@ Buffer::Buffer(BufferCacheRuntime& runtime, VideoCommon::NullBufferParams null_p } } -Buffer::Buffer(BufferCacheRuntime& runtime, DAddr cpu_addr_, u64 size_bytes_) +Buffer::Buffer(BufferCacheRuntime& runtime, DAddr cpu_addr_, u64 size_bytes_, + bool sparse_compatible_) : VideoCommon::BufferBase(cpu_addr_, size_bytes_), device{&runtime.device}, scheduler{&runtime.scheduler}, - buffer{CreateBuffer(*device, runtime.memory_allocator, SizeBytes())}, tracker{SizeBytes()} { + buffer{CreateBuffer(*device, runtime.memory_allocator, SizeBytes(), + runtime.SparseAlignmentFor(sparse_compatible_))}, + tracker{SizeBytes()} { + sparse_compatible = sparse_compatible_; if (runtime.device.HasDebuggingToolAttached()) { buffer.SetObjectNameEXT(fmt::format("Buffer {:#x}", CpuAddr()).c_str()); } @@ -348,7 +356,8 @@ BufferCacheRuntime::BufferCacheRuntime(const Device& device_, MemoryAllocator& m : device{device_}, memory_allocator{memory_allocator_}, scheduler{scheduler_}, staging_pool{staging_pool_}, guest_descriptor_queue{guest_descriptor_queue_}, quad_index_pass(device, scheduler, descriptor_pool, staging_pool, - compute_pass_descriptor_queue) { + compute_pass_descriptor_queue), + multi_range_buffers(device_) { const VkDriverIdKHR driver_id = device.GetDriverID(); limit_dynamic_storage_buffers = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY || driver_id == VK_DRIVER_ID_ARM_PROPRIETARY; @@ -536,6 +545,37 @@ void BufferCacheRuntime::ClearBuffer(VkBuffer dest_buffer, u32 offset, size_t si }); } +bool BufferCacheRuntime::BindMultiRangeStorageBuffer(u64 key, bool is_written) { + if (multi_range_sources.empty() || multi_range_total == 0) { + return false; + } + const MultiRangeRef ref = multi_range_buffers.Get(device, scheduler, memory_allocator, key, + multi_range_sources, multi_range_total); + if (ref.handle == VK_NULL_HANDLE) { + return false; + } + if (is_written && !ref.sparse) { + return false; + } + if (ref.needs_gather) { + PreCopyBarrier(); + VkDeviceSize dst_offset = 0; + for (const MultiRangeSource& source : multi_range_sources) { + const std::array copy{VideoCommon::BufferCopy{ + .src_offset = u64(source.offset), + .dst_offset = u64(dst_offset), + .size = size_t(source.size), + }}; + CopyBuffer(ref.handle, source.handle, copy, false); + dst_offset += source.size; + } + PostCopyBarrier(); + multi_range_buffers.MarkGathered(key); + } + guest_descriptor_queue.AddBuffer(ref.handle, ref.address, 0, ref.size); + return true; +} + void BufferCacheRuntime::BindIndexBuffer(PrimitiveTopology topology, IndexFormat index_format, u32 base_vertex, u32 num_indices, VkBuffer buffer, u32 offset, [[maybe_unused]] u32 size) { diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index 9b3dd50eaa..fbd8c2e753 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h @@ -8,11 +8,14 @@ #include +#include + #include "video_core/buffer_cache/buffer_cache_base.h" #include "video_core/buffer_cache/memory_tracker_base.h" #include "video_core/buffer_cache/usage_tracker.h" #include "video_core/engines/maxwell_3d.h" #include "video_core/renderer_vulkan/vk_compute_pass.h" +#include "video_core/renderer_vulkan/vk_multi_range_buffer.h" #include "video_core/renderer_vulkan/vk_staging_buffer_pool.h" #include "video_core/renderer_vulkan/vk_update_descriptor.h" #include "video_core/surface.h" @@ -31,7 +34,8 @@ class BufferCacheRuntime; class Buffer : public VideoCommon::BufferBase { public: explicit Buffer(BufferCacheRuntime&, VideoCommon::NullBufferParams null_params); - explicit Buffer(BufferCacheRuntime& runtime, VAddr cpu_addr_, u64 size_bytes_); + explicit Buffer(BufferCacheRuntime& runtime, VAddr cpu_addr_, u64 size_bytes_, + bool sparse_compatible_); [[nodiscard]] VkBufferView View(u32 offset, u32 size, VideoCore::Surface::PixelFormat format); @@ -43,6 +47,14 @@ public: return device_address; } + [[nodiscard]] bool IsSparseCompatible() const noexcept { + return sparse_compatible; + } + + [[nodiscard]] vk::MemoryLocation Location() const noexcept { + return buffer.Location(); + } + [[nodiscard]] bool IsRegionUsed(u64 offset, u64 size) const noexcept { return tracker.IsUsed(offset, size); } @@ -77,6 +89,7 @@ private: VkDeviceAddress device_address{}; u64 last_usage_tick{}; bool is_null{}; + bool sparse_compatible{}; }; class QuadArrayIndexBuffer; @@ -125,7 +138,7 @@ public: void PreCopyBarrier(); - void CopyBuffer(VkBuffer src_buffer, VkBuffer dst_buffer, + void CopyBuffer(VkBuffer dst_buffer, VkBuffer src_buffer, std::span copies, bool barrier, bool can_reorder_upload = false); @@ -155,6 +168,46 @@ public: return ref.mapped_span; } + [[nodiscard]] VkDeviceSize SparseAlignmentFor(bool sparse_compatible) const noexcept { + if (!sparse_compatible || !multi_range_buffers.use_sparse) { + return 0; + } + return multi_range_buffers.block_size; + } + + [[nodiscard]] bool PrefersSparseSources() const noexcept { + return multi_range_buffers.use_sparse; + } + + void ResetMultiRange() noexcept { + multi_range_sources.clear(); + multi_range_total = 0; + } + + void PushMultiRangeSource(const Buffer& buffer, u32 offset, u32 size) { + const vk::MemoryLocation location = buffer.Location(); + multi_range_sources.push_back(MultiRangeSource{ + .handle = buffer.Handle(), + .memory = location.memory, + .memory_offset = location.offset, + .offset = offset, + .size = size, + .write_tick = buffer.getWriteTick(), + .memory_type = location.memory_type, + }); + multi_range_total += size; + } + + bool BindMultiRangeStorageBuffer(u64 key, bool is_written); + + void InvalidateMultiRange(u64 key) { + multi_range_buffers.Invalidate(key); + } + + void OnBufferDeleted(const Buffer& buffer) { + multi_range_buffers.DropOwner(scheduler, buffer.Handle()); + } + void BindUniformBuffer(const Buffer& buffer, u32 offset, u32 size) { BindBuffer(buffer, offset, size); } @@ -208,6 +261,10 @@ private: std::unique_ptr uint8_pass; QuadIndexedPass quad_index_pass; + MultiRangeBufferCache multi_range_buffers; + boost::container::small_vector multi_range_sources; + VkDeviceSize multi_range_total{}; + bool limit_dynamic_storage_buffers = false; u32 max_dynamic_storage_buffers = (std::numeric_limits::max)(); }; diff --git a/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp b/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp new file mode 100644 index 0000000000..4d84390002 --- /dev/null +++ b/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp @@ -0,0 +1,338 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include + +#include "video_core/renderer_vulkan/vk_multi_range_buffer.h" +#include "video_core/renderer_vulkan/vk_scheduler.h" +#include "video_core/vulkan_common/vulkan_device.h" + +namespace Vulkan { + +MultiRangeBufferCache::MultiRangeBufferCache(const Device& device) { + sparse_usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; + if (device.IsBufferDeviceAddressSupported()) { + sparse_usage |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT; + } + if (!device.IsSparseBindingSupported()) { + return; + } + u32 memory_type_bits = 0; + const VkDeviceSize queried = QueryBlockSize(device, memory_type_bits); + if (queried == 0 || memory_type_bits == 0) { + return; + } + block_size = queried; + sparse_memory_type_bits = memory_type_bits; + use_sparse = true; +} + +VkDeviceSize MultiRangeBufferCache::QueryBlockSize(const Device& device, + u32& memory_type_bits) const { + const VkDevice logical = *device.GetLogical(); + const auto& dld = device.GetDispatchLoader(); + const VkBufferCreateInfo probe_ci{ + .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .pNext = nullptr, + .flags = VK_BUFFER_CREATE_SPARSE_BINDING_BIT | VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, + .size = DEFAULT_BLOCK_SIZE, + .usage = sparse_usage, + .sharingMode = VK_SHARING_MODE_EXCLUSIVE, + .queueFamilyIndexCount = 0, + .pQueueFamilyIndices = nullptr, + }; + VkBuffer probe{}; + if (dld.vkCreateBuffer(logical, &probe_ci, nullptr, &probe) != VK_SUCCESS) { + return 0; + } + const SparseBuffer owned{probe, logical, dld}; + const VkBufferMemoryRequirementsInfo2 reqs_info{ + .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2, + .pNext = nullptr, + .buffer = probe, + }; + VkMemoryRequirements2 reqs2{ + .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, + .pNext = nullptr, + .memoryRequirements = {}, + }; + dld.vkGetBufferMemoryRequirements2(logical, &reqs_info, &reqs2); + memory_type_bits = reqs2.memoryRequirements.memoryTypeBits; + return reqs2.memoryRequirements.alignment; +} + +u64 MultiRangeBufferCache::HashSources(std::span sources) const { + u64 hash = 0xcbf29ce484222325ULL; + const auto mix = [&hash](u64 value) { + hash ^= value; + hash *= 0x100000001b3ULL; + }; + for (const MultiRangeSource& source : sources) { + mix(u64(source.handle)); + mix(u64(source.offset)); + mix(u64(source.size)); + } + return hash; +} + +u64 MultiRangeBufferCache::HashContent(std::span sources) const { + u64 hash = 0xcbf29ce484222325ULL; + for (const MultiRangeSource& source : sources) { + hash ^= source.write_tick; + hash *= 0x100000001b3ULL; + } + return hash; +} + +bool MultiRangeBufferCache::CanBindSparse(std::span sources) const { + return use_sparse && + std::none_of(sources.begin(), sources.end(), + [block = block_size, bits = sparse_memory_type_bits](auto const& e) { + const VkDeviceSize memory_offset = e.memory_offset + e.offset; + return e.memory == VK_NULL_HANDLE || e.memory_type >= 32 || + ((bits >> e.memory_type) & 1) == 0 || + (memory_offset % block) != 0 || (e.size % block) != 0; + }); +} + +SparseBuffer MultiRangeBufferCache::CreateSparse(const Device& device, Scheduler& scheduler, + std::span sources, + VkDeviceSize total) { + const VkDevice logical = *device.GetLogical(); + const auto& dld = device.GetDispatchLoader(); + const VkBufferCreateInfo buffer_ci{ + .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .pNext = nullptr, + .flags = VK_BUFFER_CREATE_SPARSE_BINDING_BIT | VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, + .size = total, + .usage = sparse_usage, + .sharingMode = VK_SHARING_MODE_EXCLUSIVE, + .queueFamilyIndexCount = 0, + .pQueueFamilyIndices = nullptr, + }; + VkBuffer raw{}; + if (dld.vkCreateBuffer(logical, &buffer_ci, nullptr, &raw) != VK_SUCCESS) { + return SparseBuffer{}; + } + SparseBuffer handle{raw, logical, dld}; + std::vector binds; + binds.reserve(sources.size()); + VkDeviceSize resource_offset = 0; + for (const MultiRangeSource& source : sources) { + binds.push_back(VkSparseMemoryBind{ + .resourceOffset = resource_offset, + .size = source.size, + .memory = source.memory, + .memoryOffset = source.memory_offset + source.offset, + .flags = 0, + }); + resource_offset += source.size; + } + const VkSparseBufferMemoryBindInfo buffer_bind{ + .buffer = raw, + .bindCount = static_cast(binds.size()), + .pBinds = binds.data(), + }; + const VkBindSparseInfo bind_info{ + .sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO, + .pNext = nullptr, + .waitSemaphoreCount = 0, + .pWaitSemaphores = nullptr, + .bufferBindCount = 1, + .pBufferBinds = &buffer_bind, + .imageOpaqueBindCount = 0, + .pImageOpaqueBinds = nullptr, + .imageBindCount = 0, + .pImageBinds = nullptr, + .signalSemaphoreCount = 0, + .pSignalSemaphores = nullptr, + }; + const VkFenceCreateInfo fence_ci{ + .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + }; + vk::Fence fence = device.GetLogical().CreateFence(fence_ci); + VkResult bind_result = VK_ERROR_UNKNOWN; + { + std::scoped_lock lock{scheduler.submit_mutex}; + bind_result = device.GetGraphicsQueue().BindSparse(bind_info, *fence); + } + if (bind_result != VK_SUCCESS) { + return SparseBuffer{}; + } + fence.Wait(); + return handle; +} + +void MultiRangeBufferCache::RetireEntry(Scheduler& scheduler, Entry& entry) { + if (!entry.sparse_handle && !entry.gathered) { + return; + } + if (retired.size() == retired.capacity()) { + DrainRetired(scheduler); + } + if (retired.size() == retired.capacity()) { + u64 oldest = retired.front().tick; + for (const Retired& item : retired) { + if (item.tick < oldest) { + oldest = item.tick; + } + } + scheduler.Wait(oldest); + DrainRetired(scheduler); + } + retired.push_back(Retired{ + .handle = std::move(entry.sparse_handle), + .gathered = std::move(entry.gathered), + .tick = scheduler.CurrentTick(), + }); +} + +void MultiRangeBufferCache::DrainRetired(Scheduler& scheduler) { + size_t index = 0; + while (index < retired.size()) { + if (scheduler.IsFree(retired[index].tick)) { + if (index + 1 != retired.size()) { + retired[index] = std::move(retired.back()); + } + retired.pop_back(); + } else { + ++index; + } + } +} + +MultiRangeRef MultiRangeBufferCache::Get(const Device& device, Scheduler& scheduler, + MemoryAllocator& memory_allocator, u64 key, + std::span sources, + VkDeviceSize total) { + if (sources.empty() || total == 0) { + return MultiRangeRef{}; + } + if (!retired.empty()) { + DrainRetired(scheduler); + } + const u64 geometry = HashSources(sources); + const u64 content = HashContent(sources); + const auto it = entries.find(key); + if (it != entries.end() && it->second.geometry == geometry && it->second.size == total) { + Entry& entry = it->second; + if (entry.content != content) { + entry.content = content; + entry.dirty = true; + } + MultiRangeRef ref{ + .handle = *entry.sparse_handle, + .address = entry.address, + .size = entry.size, + .sparse = true, + .needs_gather = false, + }; + if (!entry.sparse_handle) { + ref.handle = *entry.gathered; + ref.sparse = false; + ref.needs_gather = entry.dirty; + } + return ref; + } + if (it != entries.end()) { + RetireEntry(scheduler, it->second); + entries.erase(it); + } + + Entry entry{}; + entry.geometry = geometry; + entry.content = content; + entry.size = total; + if (CanBindSparse(sources)) { + entry.sparse_handle = CreateSparse(device, scheduler, sources, total); + if (entry.sparse_handle) { + entry.owners.reserve(sources.size()); + for (const MultiRangeSource& source : sources) { + entry.owners.push_back(source.handle); + } + } + } + if (!entry.sparse_handle) { + VkBufferUsageFlags flags = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | + VK_BUFFER_USAGE_TRANSFER_DST_BIT | + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; + if (device.IsBufferDeviceAddressSupported()) { + flags |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT; + } + const VkBufferCreateInfo gather_ci{ + .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .size = total, + .usage = flags, + .sharingMode = VK_SHARING_MODE_EXCLUSIVE, + .queueFamilyIndexCount = 0, + .pQueueFamilyIndices = nullptr, + }; + entry.gathered = memory_allocator.CreateBuffer(gather_ci, MemoryUsage::DeviceLocal); + entry.dirty = true; + } + if (device.IsBufferDeviceAddressSupported()) { + VkBuffer address_handle = *entry.sparse_handle; + if (!entry.sparse_handle) { + address_handle = *entry.gathered; + } + entry.address = device.GetLogical().GetBufferDeviceAddress(address_handle); + } + + MultiRangeRef ref{ + .handle = *entry.sparse_handle, + .address = entry.address, + .size = entry.size, + .sparse = true, + .needs_gather = false, + }; + if (!entry.sparse_handle) { + ref.handle = *entry.gathered; + ref.sparse = false; + ref.needs_gather = true; + } + entries.emplace(key, std::move(entry)); + return ref; +} + +void MultiRangeBufferCache::MarkGathered(u64 key) { + if (auto const it = entries.find(key); it != entries.end()) { + it->second.dirty = false; + } +} + +void MultiRangeBufferCache::DropOwner(Scheduler& scheduler, VkBuffer owner) { + if (owner == VK_NULL_HANDLE) { + return; + } + for (auto it = entries.begin(); it != entries.end();) { + Entry& entry = it->second; + bool owned = false; + for (const VkBuffer handle : entry.owners) { + if (handle == owner) { + owned = true; + break; + } + } + if (!owned) { + ++it; + continue; + } + RetireEntry(scheduler, entry); + it = entries.erase(it); + } +} + +void MultiRangeBufferCache::Invalidate(u64 key) { + if (auto const it = entries.find(key); it != entries.end()) { + it->second.dirty = true; + } +} + +} // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_multi_range_buffer.h b/src/video_core/renderer_vulkan/vk_multi_range_buffer.h new file mode 100644 index 0000000000..f40d3aa1f8 --- /dev/null +++ b/src/video_core/renderer_vulkan/vk_multi_range_buffer.h @@ -0,0 +1,105 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include + +#include + +#include "common/common_funcs.h" +#include "common/common_types.h" +#include "common/container/unordered_map.h" +#include "video_core/vulkan_common/vulkan_memory_allocator.h" +#include "video_core/vulkan_common/vulkan_wrapper.h" + +namespace Vulkan { + +using SparseBuffer = vk::Handle; + +class Device; +class Scheduler; + +struct MultiRangeSource { + VkBuffer handle{}; + VkDeviceMemory memory{}; + VkDeviceSize memory_offset{}; + VkDeviceSize offset{}; + VkDeviceSize size{}; + u64 write_tick{}; + u32 memory_type{}; +}; + +struct MultiRangeRef { + VkBuffer handle{}; + VkDeviceAddress address{}; + VkDeviceSize size{}; + bool sparse{}; + bool needs_gather{}; +}; + +class MultiRangeBufferCache final { +public: + static constexpr VkDeviceSize DEFAULT_BLOCK_SIZE = 64 * 1024; + static constexpr size_t MAX_RETIRED = 256; + + explicit MultiRangeBufferCache(const Device& device); + + YUZU_NON_COPYABLE(MultiRangeBufferCache); + + [[nodiscard]] MultiRangeRef Get(const Device& device, Scheduler& scheduler, + MemoryAllocator& memory_allocator, u64 key, + std::span sources, + VkDeviceSize total); + + void MarkGathered(u64 key); + + void Invalidate(u64 key); + + void DropOwner(Scheduler& scheduler, VkBuffer owner); + + VkDeviceSize block_size{DEFAULT_BLOCK_SIZE}; + bool use_sparse{}; + +private: + struct Retired { + SparseBuffer handle; + vk::Buffer gathered; + u64 tick{}; + }; + + struct Entry { + vk::Buffer gathered; + SparseBuffer sparse_handle; + std::vector owners; + VkDeviceAddress address{}; + VkDeviceSize size{}; + u64 geometry{}; + u64 content{}; + bool dirty{true}; + }; + + [[nodiscard]] u64 HashSources(std::span sources) const; + + [[nodiscard]] u64 HashContent(std::span sources) const; + + [[nodiscard]] bool CanBindSparse(std::span sources) const; + + [[nodiscard]] SparseBuffer CreateSparse(const Device& device, Scheduler& scheduler, + std::span sources, + VkDeviceSize total); + + [[nodiscard]] VkDeviceSize QueryBlockSize(const Device& device, u32& memory_type_bits) const; + + void RetireEntry(Scheduler& scheduler, Entry& entry); + + void DrainRetired(Scheduler& scheduler); + + ::Common::unordered_map entries; + boost::container::static_vector retired; + u32 sparse_memory_type_bits{}; + VkBufferUsageFlags sparse_usage{}; +}; + +} // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 3b0fea2fec..f43bea1220 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -819,6 +819,7 @@ void RasterizerVulkan::ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) { std::scoped_lock lock{texture_cache.mutex}; texture_cache.UnmapGPUMemory(as_id, addr, size); } + buffer_cache.UnmapGPUMemory(as_id, addr, size); } void RasterizerVulkan::SignalFence(std::function&& func) { diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index fb3a9c4e7a..be09bca8d3 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -1570,6 +1570,8 @@ void Device::SetupFamilies(VkSurfaceKHR surface) { } if (graphics) { graphics_family = *graphics; + graphics_family_sparse_binding = + (queue_family_properties[*graphics].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) != 0; } if (present) { present_family = *present; diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index c53bd6443e..077b1c3e23 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -317,6 +317,10 @@ public: return properties.driver.driverID; } + bool IsSparseBindingSupported() const { + return features.features.sparseBinding && graphics_family_sparse_binding; + } + /// Returns true for tile-based deferred renderers. bool IsTiler() const { switch (GetDriverID()) { @@ -1147,6 +1151,7 @@ private: u32 instance_version{}; ///< Vulkan instance version. u32 graphics_family{}; ///< Main graphics queue family index. u32 present_family{}; ///< Main present queue family index. + bool graphics_family_sparse_binding{}; struct Extensions { #define EXTENSION(prefix, macro_name, var_name) bool var_name{}; diff --git a/src/video_core/vulkan_common/vulkan_memory_allocator.cpp b/src/video_core/vulkan_common/vulkan_memory_allocator.cpp index 20b6b55ef7..f4721543ae 100644 --- a/src/video_core/vulkan_common/vulkan_memory_allocator.cpp +++ b/src/video_core/vulkan_common/vulkan_memory_allocator.cpp @@ -275,9 +275,63 @@ vk::Buffer MemoryAllocator::CreateBuffer(const VkBufferCreateInfo &ci, MemoryUsa const std::span mapped_data = data ? std::span{data, ci.size} : std::span{}; const bool is_coherent = (property_flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0; - return vk::Buffer(handle, *device.GetLogical(), allocator, allocation, mapped_data, - is_coherent, - device.GetDispatchLoader()); + const vk::MemoryLocation location{ + .memory = alloc_info.deviceMemory, + .offset = alloc_info.offset, + .memory_type = alloc_info.memoryType, + }; + return vk::Buffer(handle, *device.GetLogical(), allocator, allocation, mapped_data, is_coherent, + location, device.GetDispatchLoader()); +} + +vk::Buffer MemoryAllocator::CreateBuffer(const VkBufferCreateInfo &ci, MemoryUsage usage, + VkDeviceSize min_alignment) const { + if (min_alignment <= 1) { + return CreateBuffer(ci, usage); + } + VkMemoryPropertyFlags anv_flags = 0; + if (usage == MemoryUsage::Stream && + device.GetDriverID() == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA) { + anv_flags = VK_MEMORY_PROPERTY_HOST_CACHED_BIT; + } + u32 memory_type_bits = valid_memory_types; + if (usage == MemoryUsage::Stream) { + memory_type_bits = 0u; + } + const VmaAllocationCreateInfo alloc_ci = { + .flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT | MemoryUsageVmaFlags(usage), + .usage = MemoryUsageVma(usage), + .requiredFlags = 0, + .preferredFlags = MemoryUsagePreferredVmaFlags(usage) | anv_flags, + .memoryTypeBits = memory_type_bits, + .pool = VK_NULL_HANDLE, + .pUserData = nullptr, + .priority = 0.f, + }; + + VkBuffer handle{}; + VmaAllocationInfo alloc_info{}; + VmaAllocation allocation{}; + VkMemoryPropertyFlags property_flags{}; + + vk::Check(vmaCreateBufferWithAlignment(allocator, &ci, &alloc_ci, min_alignment, &handle, + &allocation, &alloc_info)); + vmaGetAllocationMemoryProperties(allocator, allocation, &property_flags); + + u8 *data = reinterpret_cast(alloc_info.pMappedData); + std::span mapped_data{}; + if (data) { + mapped_data = std::span{data, ci.size}; + } + const bool is_coherent = (property_flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0; + + const vk::MemoryLocation location{ + .memory = alloc_info.deviceMemory, + .offset = alloc_info.offset, + .memory_type = alloc_info.memoryType, + }; + return vk::Buffer(handle, *device.GetLogical(), allocator, allocation, mapped_data, is_coherent, + location, device.GetDispatchLoader()); } MemoryCommit MemoryAllocator::Commit(const VkMemoryRequirements &reqs, MemoryUsage usage) diff --git a/src/video_core/vulkan_common/vulkan_memory_allocator.h b/src/video_core/vulkan_common/vulkan_memory_allocator.h index 581f2e66d2..a0f9081fc0 100644 --- a/src/video_core/vulkan_common/vulkan_memory_allocator.h +++ b/src/video_core/vulkan_common/vulkan_memory_allocator.h @@ -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-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -107,6 +107,9 @@ namespace Vulkan { vk::Buffer CreateBuffer(const VkBufferCreateInfo &ci, MemoryUsage usage) const; + vk::Buffer CreateBuffer(const VkBufferCreateInfo &ci, MemoryUsage usage, + VkDeviceSize min_alignment) const; + /** * Commits a memory with the specified requirements. * diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 09fcf2eaa0..f04f137da5 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -229,6 +229,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { X(vkGetPipelineExecutableStatisticsKHR); X(vkGetSemaphoreCounterValue); X(vkMapMemory); + X(vkQueueBindSparse); X(vkQueueSubmit); X(vkQueueSubmit2); X(vkResetFences); diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index dd9a3a21d5..97d2ba3700 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h @@ -345,6 +345,7 @@ struct DeviceDispatch : InstanceDispatch { PFN_vkGetQueryPoolResults vkGetQueryPoolResults{}; PFN_vkGetSemaphoreCounterValue vkGetSemaphoreCounterValue{}; PFN_vkMapMemory vkMapMemory{}; + PFN_vkQueueBindSparse vkQueueBindSparse{}; PFN_vkQueueSubmit vkQueueSubmit{}; PFN_vkQueueSubmit2 vkQueueSubmit2{}; PFN_vkResetFences vkResetFences{}; @@ -740,13 +741,20 @@ private: const DeviceDispatch* dld = nullptr; }; +struct MemoryLocation { + VkDeviceMemory memory{}; + VkDeviceSize offset{}; + u32 memory_type{}; +}; + class Buffer { public: explicit Buffer(VkBuffer handle_, VkDevice owner_, VmaAllocator allocator_, VmaAllocation allocation_, std::span mapped_, bool is_coherent_, - const DeviceDispatch& dld_) noexcept + MemoryLocation location_, const DeviceDispatch& dld_) noexcept : handle{handle_}, owner{owner_}, allocator{allocator_}, - allocation{allocation_}, mapped{mapped_}, is_coherent{is_coherent_}, dld{&dld_} {} + allocation{allocation_}, mapped{mapped_}, location{location_}, + is_coherent{is_coherent_}, dld{&dld_} {} Buffer() = default; Buffer(const Buffer&) = delete; @@ -754,7 +762,7 @@ public: Buffer(Buffer&& rhs) noexcept : handle{std::exchange(rhs.handle, VkBuffer{})}, owner{rhs.owner}, allocator{rhs.allocator}, - allocation{rhs.allocation}, mapped{rhs.mapped}, + allocation{rhs.allocation}, mapped{rhs.mapped}, location{rhs.location}, is_coherent{rhs.is_coherent}, dld{rhs.dld} {} Buffer& operator=(Buffer&& rhs) noexcept { @@ -764,6 +772,7 @@ public: allocator = rhs.allocator; allocation = rhs.allocation; mapped = rhs.mapped; + location = rhs.location; is_coherent = rhs.is_coherent; dld = rhs.dld; return *this; @@ -811,6 +820,10 @@ public: void SetObjectNameEXT(const char* name) const; + MemoryLocation Location() const noexcept { + return location; + } + private: void Release() const noexcept; @@ -819,6 +832,7 @@ private: VmaAllocator allocator = nullptr; VmaAllocation allocation = nullptr; std::span mapped = {}; + MemoryLocation location{}; bool is_coherent = false; const DeviceDispatch* dld = nullptr; }; @@ -843,6 +857,11 @@ public: return dld->vkQueueSubmit2(queue, submit_infos.size(), submit_infos.data(), fence); } + VkResult BindSparse(Span bind_infos, + VkFence fence = VK_NULL_HANDLE) const noexcept { + return dld->vkQueueBindSparse(queue, bind_infos.size(), bind_infos.data(), fence); + } + VkResult Present(const VkPresentInfoKHR& present_info) const noexcept { return dld->vkQueuePresentKHR(queue, &present_info); } From 8a10109e240e033cdd21be20c9bb4af9bd2a7bed Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 8 Sep 2026 21:04:08 +0200 Subject: [PATCH 014/128] [vulkan] Masquerade VkInfo as PUBGMobile + UE (#4320) Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- PR I was talking about with @CamilleLaVey , please tell me if this is a stupid idea OR has a chance to work applicationname is a wild guess Co-authored-by: CamilleLaVey Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4320 Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- src/video_core/vulkan_common/vulkan_wrapper.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index f04f137da5..5044881598 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -460,8 +460,20 @@ Instance Instance::Create(u32 version, Span layers, Span gloom + yellow line glitch appears +#ifdef __ANDROID__ + const VkApplicationInfo application_info{ + .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, + .pNext = nullptr, + .pApplicationName = "PUBGMobile", + .applicationVersion = VK_MAKE_VERSION(1, 7, 0), + .pEngineName = "UnrealEngine", + .engineVersion = VK_MAKE_VERSION(4, 23, 0), + .apiVersion = VK_API_VERSION_1_3, + }; +#else const VkApplicationInfo application_info{ .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, .pNext = nullptr, @@ -471,6 +483,7 @@ Instance Instance::Create(u32 version, Span layers, Span Date: Tue, 8 Sep 2026 21:17:19 +0200 Subject: [PATCH 015/128] [hle] Fix fsp-pr not being found (#4379) Should be `fsp-pr`, not `fsp:pr` Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4379 Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- src/core/hle/service/filesystem/filesystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index 20e050c8a8..306e8701c3 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp @@ -798,7 +798,7 @@ void LoopProcess(Core::System& system) { const auto FileSystemProxyFactory = [&] { return std::make_shared(system); }; server_manager->RegisterNamedService("fsp-ldr", std::make_shared(system)); - server_manager->RegisterNamedService("fsp:pr", std::make_shared(system)); + server_manager->RegisterNamedService("fsp-pr", std::make_shared(system)); server_manager->RegisterNamedService("fsp-srv", std::move(FileSystemProxyFactory)); ServerManager::RunServer(std::move(server_manager)); } From 23585820bc6fc781a06c19a677c5f3ba652fd646 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 9 Sep 2026 11:13:42 +0200 Subject: [PATCH 016/128] [hle] correct IClientProcess::RegisterClient, impl cmd 3100,3102 for ns:vm (#4376) ldn had wrong signature ns:vm had missing function stubs that would make some games assert on missing impl Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4376 Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- src/core/CMakeLists.txt | 6 --- ...rchical_integrity_verification_storage.cpp | 4 ++ src/core/hle/service/am/service/storage.cpp | 10 ++--- .../service/ldn/client_process_monitor.cpp | 27 ------------ .../hle/service/ldn/client_process_monitor.h | 25 ----------- src/core/hle/service/ldn/ldn.cpp | 24 +++++++++-- src/core/hle/service/ns/ns.cpp | 41 ++++++++++++++++++- .../ns/vulnerability_manager_interface.cpp | 31 -------------- .../ns/vulnerability_manager_interface.h | 21 ---------- src/core/hle/service/spl/csrng.cpp | 18 -------- src/core/hle/service/spl/csrng.h | 20 --------- src/core/hle/service/spl/spl_module.cpp | 13 +++++- 12 files changed, 82 insertions(+), 158 deletions(-) delete mode 100644 src/core/hle/service/ldn/client_process_monitor.cpp delete mode 100644 src/core/hle/service/ldn/client_process_monitor.h delete mode 100644 src/core/hle/service/ns/vulnerability_manager_interface.cpp delete mode 100644 src/core/hle/service/ns/vulnerability_manager_interface.h delete mode 100644 src/core/hle/service/spl/csrng.cpp delete mode 100644 src/core/hle/service/spl/csrng.h diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index e04b3dde26..508ace3501 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -711,8 +711,6 @@ add_library(core STATIC hle/service/kernel_helpers.h hle/service/lbl/lbl.cpp hle/service/lbl/lbl.h - hle/service/ldn/client_process_monitor.cpp - hle/service/ldn/client_process_monitor.h hle/service/ldn/lan_discovery.cpp hle/service/ldn/lan_discovery.h hle/service/ldn/ldn.cpp @@ -832,8 +830,6 @@ add_library(core STATIC hle/service/ns/system_update_control.h hle/service/ns/system_update_interface.cpp hle/service/ns/system_update_interface.h - hle/service/ns/vulnerability_manager_interface.cpp - hle/service/ns/vulnerability_manager_interface.h hle/service/nvdrv/core/container.cpp hle/service/nvdrv/core/container.h hle/service/nvdrv/core/heap_mapper.cpp @@ -1067,8 +1063,6 @@ add_library(core STATIC hle/service/sockets/sockets.h hle/service/sockets/sockets_translate.cpp hle/service/sockets/sockets_translate.h - hle/service/spl/csrng.cpp - hle/service/spl/csrng.h hle/service/spl/spl.cpp hle/service/spl/spl.h hle/service/spl/spl_module.cpp diff --git a/src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.cpp b/src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.cpp index 39bb7b8086..f4ec53ad40 100644 --- a/src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.cpp +++ b/src/core/file_sys/fssystem/fssystem_hierarchical_integrity_verification_storage.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 @@ -121,6 +124,7 @@ size_t HierarchicalIntegrityVerificationStorage::Read(u8* buffer, size_t size, } size_t HierarchicalIntegrityVerificationStorage::GetSize() const { + ASSERT(m_data_size >= 0); return m_data_size; } diff --git a/src/core/hle/service/am/service/storage.cpp b/src/core/hle/service/am/service/storage.cpp index 25ee0afbdb..5fe191bf2f 100644 --- a/src/core/hle/service/am/service/storage.cpp +++ b/src/core/hle/service/am/service/storage.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -26,17 +29,14 @@ IStorage::~IStorage() = default; Result IStorage::Open(Out> out_storage_accessor) { LOG_DEBUG(Service_AM, "called"); - R_UNLESS(m_impl->GetHandle() == nullptr, AM::ResultInvalidStorageType); - *out_storage_accessor = std::make_shared(system, m_impl); R_SUCCEED(); } -Result IStorage::OpenTransferStorage( - Out> out_transfer_storage_accessor) { +Result IStorage::OpenTransferStorage(Out> out_transfer_storage_accessor) { + LOG_DEBUG(Service_AM, "called"); R_UNLESS(m_impl->GetHandle() != nullptr, AM::ResultInvalidStorageType); - *out_transfer_storage_accessor = std::make_shared(system, m_impl); R_SUCCEED(); } diff --git a/src/core/hle/service/ldn/client_process_monitor.cpp b/src/core/hle/service/ldn/client_process_monitor.cpp deleted file mode 100644 index 0c1963a4ca..0000000000 --- a/src/core/hle/service/ldn/client_process_monitor.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/ldn/ldn_results.h" -#include "core/hle/service/ldn/client_process_monitor.h" -#include "core/hle/service/ipc_helpers.h" - -namespace Service::LDN { - -IClientProcessMonitor::IClientProcessMonitor(Core::System& system_) - : ServiceFramework{system_, "IClientProcessMonitor"} { - static const FunctionInfo functions[] = { - {0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"}, - }; - RegisterHandlers(functions); -} - -IClientProcessMonitor::~IClientProcessMonitor() = default; - -Result IClientProcessMonitor::RegisterClient() { - LOG_WARNING(Service_LDN, "(STUBBED) called"); - - R_SUCCEED(); -} - -} // namespace Service::LDN diff --git a/src/core/hle/service/ldn/client_process_monitor.h b/src/core/hle/service/ldn/client_process_monitor.h deleted file mode 100644 index 9caa337795..0000000000 --- a/src/core/hle/service/ldn/client_process_monitor.h +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Core { -class System; -} - -namespace Service::LDN { - -class IClientProcessMonitor final - : public ServiceFramework { -public: - explicit IClientProcessMonitor(Core::System& system_); - ~IClientProcessMonitor() override; - -private: - Result RegisterClient(); -}; - -} // namespace Service::LDN diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp index c77ae2911e..1a0165fd2e 100644 --- a/src/core/hle/service/ldn/ldn.cpp +++ b/src/core/hle/service/ldn/ldn.cpp @@ -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-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -7,7 +7,6 @@ #include "core/core.h" #include "core/hle/service/cmif_serialization.h" #include "core/hle/service/ldn/ldn.h" -#include "core/hle/service/ldn/client_process_monitor.h" #include "core/hle/service/ldn/monitor_service.h" #include "core/hle/service/ldn/sf_monitor_service.h" #include "core/hle/service/ldn/sf_service.h" @@ -17,6 +16,26 @@ namespace Service::LDN { +class IClientProcessMonitor final + : public ServiceFramework { +public: + explicit IClientProcessMonitor(Core::System& system_) + : ServiceFramework{system_, "IClientProcessMonitor"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"}, + }; + // clang-format on + RegisterHandlers(functions); + } + ~IClientProcessMonitor() override = default; +private: + Result RegisterClient(ClientProcessId pid) { + LOG_WARNING(Service_LDN, "(STUBBED) called"); + R_SUCCEED(); + } +}; + class IMonitorServiceCreator final : public ServiceFramework { public: explicit IMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:m"} { @@ -25,7 +44,6 @@ public: {0, C<&IMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"} }; // clang-format on - RegisterHandlers(functions); } diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp index 4d6154404e..4e3915f684 100644 --- a/src/core/hle/service/ns/ns.cpp +++ b/src/core/hle/service/ns/ns.cpp @@ -10,7 +10,9 @@ #include "core/hle/service/ns/query_service.h" #include "core/hle/service/ns/service_getter_interface.h" #include "core/hle/service/ns/system_update_interface.h" -#include "core/hle/service/ns/vulnerability_manager_interface.h" +#include "core/hle/service/ipc_helpers.h" +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/cmif_types.h" #include "core/hle/service/server_manager.h" namespace Service::NS { @@ -39,6 +41,43 @@ public: } }; +class IVulnerabilityManagerInterface final + : public ServiceFramework { +public: + explicit IVulnerabilityManagerInterface(Core::System& system_) + : ServiceFramework{system_, "ns:vm"} { + // clang-format off + static const FunctionInfo functions[] = { + {1200, D<&IVulnerabilityManagerInterface::NeedsUpdateVulnerability>, "NeedsUpdateVulnerability"}, + {1201, nullptr, "UpdateSafeSystemVersionForDebug"}, + {1202, nullptr, "GetSafeSystemVersion"}, + {3100, D<&IVulnerabilityManagerInterface::GetSafeSystemVersionCheckInfo>, "GetSafeSystemVersionCheckInfo"}, + {3101, nullptr, "RequestUpdateSafeSystemVersionCheckInfo"}, + {3102, D<&IVulnerabilityManagerInterface::ResetSafeSystemVersionCheckInfo>, "ResetSafeSystemVersionCheckInfo"}, + }; + // clang-format on + RegisterHandlers(functions); + } + ~IVulnerabilityManagerInterface() override = default; + + Result NeedsUpdateVulnerability(Out out_needs_update_vulnerability) { + LOG_WARNING(Service_NS, "(STUBBED)"); + *out_needs_update_vulnerability = false; + R_SUCCEED(); + } + + Result GetSafeSystemVersionCheckInfo(Out> out_system_version_check_info) { + LOG_WARNING(Service_NS, "(STUBBED)"); + *out_system_version_check_info = {}; + R_SUCCEED(); + } + + Result ResetSafeSystemVersionCheckInfo() { + LOG_WARNING(Service_NS, "(STUBBED)"); + R_SUCCEED(); + } +}; + void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); diff --git a/src/core/hle/service/ns/vulnerability_manager_interface.cpp b/src/core/hle/service/ns/vulnerability_manager_interface.cpp deleted file mode 100644 index 69c21fb894..0000000000 --- a/src/core/hle/service/ns/vulnerability_manager_interface.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/ns/vulnerability_manager_interface.h" - -namespace Service::NS { - -IVulnerabilityManagerInterface::IVulnerabilityManagerInterface(Core::System& system_) - : ServiceFramework{system_, "ns:vm"} { - // clang-format off - static const FunctionInfo functions[] = { - {1200, D<&IVulnerabilityManagerInterface::NeedsUpdateVulnerability>, "NeedsUpdateVulnerability"}, - {1201, nullptr, "UpdateSafeSystemVersionForDebug"}, - {1202, nullptr, "GetSafeSystemVersion"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -IVulnerabilityManagerInterface::~IVulnerabilityManagerInterface() = default; - -Result IVulnerabilityManagerInterface::NeedsUpdateVulnerability( - Out out_needs_update_vulnerability) { - LOG_WARNING(Service_NS, "(STUBBED) called"); - *out_needs_update_vulnerability = false; - R_SUCCEED(); -} - -} // namespace Service::NS diff --git a/src/core/hle/service/ns/vulnerability_manager_interface.h b/src/core/hle/service/ns/vulnerability_manager_interface.h deleted file mode 100644 index c689cf7ece..0000000000 --- a/src/core/hle/service/ns/vulnerability_manager_interface.h +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Service::NS { - -class IVulnerabilityManagerInterface final - : public ServiceFramework { -public: - explicit IVulnerabilityManagerInterface(Core::System& system_); - ~IVulnerabilityManagerInterface() override; - -private: - Result NeedsUpdateVulnerability(Out out_needs_update_vulnerability); -}; - -} // namespace Service::NS diff --git a/src/core/hle/service/spl/csrng.cpp b/src/core/hle/service/spl/csrng.cpp deleted file mode 100644 index ca121fb054..0000000000 --- a/src/core/hle/service/spl/csrng.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/spl/csrng.h" - -namespace Service::SPL { - -CSRNG::CSRNG(Core::System& system_, std::shared_ptr module_) - : Interface(system_, std::move(module_), "csrng") { - static const FunctionInfo functions[] = { - {0, &CSRNG::GenerateRandomBytes, "GenerateRandomBytes"}, - }; - RegisterHandlers(functions); -} - -CSRNG::~CSRNG() = default; - -} // namespace Service::SPL diff --git a/src/core/hle/service/spl/csrng.h b/src/core/hle/service/spl/csrng.h deleted file mode 100644 index b337a82816..0000000000 --- a/src/core/hle/service/spl/csrng.h +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/spl/spl_module.h" - -namespace Core { -class System; -} - -namespace Service::SPL { - -class CSRNG final : public Module::Interface { -public: - explicit CSRNG(Core::System& system_, std::shared_ptr module_); - ~CSRNG() override; -}; - -} // namespace Service::SPL diff --git a/src/core/hle/service/spl/spl_module.cpp b/src/core/hle/service/spl/spl_module.cpp index d62cecf9a2..520cb1860b 100644 --- a/src/core/hle/service/spl/spl_module.cpp +++ b/src/core/hle/service/spl/spl_module.cpp @@ -13,7 +13,6 @@ #include "core/hle/api_version.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/server_manager.h" -#include "core/hle/service/spl/csrng.h" #include "core/hle/service/spl/spl.h" #include "core/hle/service/spl/spl_module.h" @@ -203,6 +202,18 @@ Result Module::Interface::GetConfigImpl(u64* out_config, ConfigItem config_item) } } +class CSRNG final : public Module::Interface { +public: + explicit CSRNG(Core::System& system_, std::shared_ptr module_) + : Interface(system_, std::move(module_), "csrng") { + static const FunctionInfo functions[] = { + {0, &CSRNG::GenerateRandomBytes, "GenerateRandomBytes"}, + }; + RegisterHandlers(functions); + } + ~CSRNG() override = default; +}; + void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); auto module = std::make_shared(); From 2f787ddb8cc18b1ac50c3078b7d03dee6ab89d44 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 9 Sep 2026 11:14:03 +0200 Subject: [PATCH 017/128] [dynarmic] Fix broken tests and SIGABRT with f16 inst gen (#4366) F16 instructions aren't supported yet, thus disable them. Also compilation/build errors. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4366 Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- src/dynarmic/tests/A32/fuzz_arm.cpp | 2 - src/dynarmic/tests/A64/fuzz_with_unicorn.cpp | 2 - src/dynarmic/tests/print_info.cpp | 14 ++--- src/dynarmic/tests/test_generator.cpp | 64 ++++++++++++-------- src/dynarmic/tests/test_reader.cpp | 2 - 5 files changed, 44 insertions(+), 40 deletions(-) diff --git a/src/dynarmic/tests/A32/fuzz_arm.cpp b/src/dynarmic/tests/A32/fuzz_arm.cpp index e8f3011799..abb9830372 100644 --- a/src/dynarmic/tests/A32/fuzz_arm.cpp +++ b/src/dynarmic/tests/A32/fuzz_arm.cpp @@ -321,8 +321,6 @@ static void RunTestInstance(Dynarmic::A32::Jit& jit, uni_env.PadCodeMem(); jit_env.modified_memory.clear(); uni_env.modified_memory.clear(); - jit_env.interrupts.clear(); - uni_env.interrupts.clear(); jit.Regs() = regs; jit.ExtRegs() = vecs; diff --git a/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp b/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp index 90df625143..ea5b5302f8 100644 --- a/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp +++ b/src/dynarmic/tests/A64/fuzz_with_unicorn.cpp @@ -176,8 +176,6 @@ static void RunTestInstance(Dynarmic::A64::Jit& jit, A64Unicorn& uni, A64TestEnv uni_env.code_mem_start_address = instructions_start; jit_env.modified_memory.clear(); uni_env.modified_memory.clear(); - jit_env.interrupts.clear(); - uni_env.interrupts.clear(); const u64 initial_sp = RandInt(0x30'0000'0000, 0x40'0000'0000) * 4; diff --git a/src/dynarmic/tests/print_info.cpp b/src/dynarmic/tests/print_info.cpp index 8901ea167d..5b1c5cfe63 100644 --- a/src/dynarmic/tests/print_info.cpp +++ b/src/dynarmic/tests/print_info.cpp @@ -282,20 +282,17 @@ int main(int argc, char** argv) { return 1; } - const char* const hex_instruction = [argv] { - if (strlen(argv[2]) > 2 && argv[2][0] == '0' && argv[2][1] == 'x') { - return argv[2] + 2; - } - return argv[2]; + const char* const hex_instruction = [s = argv[2]] { + if (strlen(s) > 2 && s[0] == '0' && s[1] == 'x') + return s + 2; + return s; }(); - if (strlen(hex_instruction) > 8) { fmt::print("hex string too long\n"); return 1; } const u32 instruction = strtol(hex_instruction, nullptr, 16); - if (strcmp(argv[1], "a32") == 0) { PrintA32Instruction(instruction); } else if (strcmp(argv[1], "a64") == 0) { @@ -306,13 +303,11 @@ int main(int argc, char** argv) { fmt::print("Invalid mode: {}\nValid values: a32, a64, thumb\n", argv[1]); return 1; } - if (argc == 4) { if (strcmp(argv[3], "-exec") != 0) { fmt::print("Invalid option {}\n", argv[3]); return 1; } - if (strcmp(argv[1], "a32") == 0) { ExecuteA32Instruction(instruction); } else { @@ -320,6 +315,5 @@ int main(int argc, char** argv) { return 1; } } - return 0; } diff --git a/src/dynarmic/tests/test_generator.cpp b/src/dynarmic/tests/test_generator.cpp index dacb8a6004..35163fffcf 100644 --- a/src/dynarmic/tests/test_generator.cpp +++ b/src/dynarmic/tests/test_generator.cpp @@ -354,6 +354,8 @@ u32 GenRandomA64Inst(u64 pc, bool is_last_inst) { "MSR_reg", "MSR_imm", "MRS", + // generates F16 + "FCADD_vec", }; for (const auto& [fn, bitstring] : list) { @@ -440,7 +442,6 @@ void RunTestInstance(Dynarmic::A32::Jit& jit, std::copy(instructions.begin(), instructions.end(), jit_env.code_mem.begin() + num_words); jit_env.PadCodeMem(); jit_env.modified_memory.clear(); - jit_env.interrupts.clear(); jit.Regs() = regs; jit.ExtRegs() = vecs; @@ -510,7 +511,6 @@ void RunTestInstance(Dynarmic::A64::Jit& jit, jit_env.code_mem.emplace_back(0x14000000); // B . jit_env.code_mem_start_address = start_address; jit_env.modified_memory.clear(); - jit_env.interrupts.clear(); jit.SetRegisters(regs); jit.SetVectors(vecs); @@ -536,36 +536,52 @@ void RunTestInstance(Dynarmic::A64::Jit& jit, fmt::print("initial_regs:"); for (u64 i : regs) fmt::print(" {:016x}", i); - fmt::print("\n"); - fmt::print("initial_vecs:"); + fmt::print( + "\n" + "initial_vecs:" + ); for (auto i : vecs) fmt::print(" {:016x}:{:016x}", i[0], i[1]); - fmt::print("\n"); - fmt::print("initial_sp: {:016x}\n", initial_sp); - fmt::print("initial_pstate: {:08x}\n", pstate); - fmt::print("initial_fpcr: {:08x}\n", fpcr); - fmt::print("final_regs:"); + fmt::print( + "\n" + "initial_sp: {:016x}\n" + "initial_pstate: {:08x}\n" + "initial_fpcr: {:08x}\n" + "final_regs:" + , initial_sp + , pstate + , fpcr + ); for (u64 i : jit.GetRegisters()) fmt::print(" {:016x}", i); - fmt::print("\n"); - fmt::print("final_vecs:"); + fmt::print( + "\n" + "final_vecs:" + ); for (auto i : jit.GetVectors()) fmt::print(" {:016x}:{:016x}", i[0], i[1]); - fmt::print("\n"); - fmt::print("final_sp: {:016x}\n", jit.GetSP()); - fmt::print("final_pc: {:016x}\n", jit.GetPC()); - fmt::print("final_pstate: {:08x}\n", jit.GetPstate()); - fmt::print("final_fpcr: {:08x}\n", jit.GetFpcr()); - fmt::print("final_qc : {}\n", FP::FPSR{jit.GetFpsr()}.QC()); - fmt::print("mod_mem:"); + fmt::print( + "\n" + "final_sp: {:016x}\n" + "final_pc: {:016x}\n" + "final_pstate: {:08x}\n" + "final_fpcr: {:08x}\n" + "final_qc : {}\n" + "mod_mem:" + , jit.GetSP() + , jit.GetPC() + , jit.GetPstate() + , jit.GetFpcr() + , FP::FPSR{jit.GetFpsr()}.QC() + ); for (auto [addr, value] : jit_env.modified_memory) fmt::print(" {:08x}:{:02x}", addr, value); - fmt::print("\n"); - fmt::print("interrupts:\n"); - for (const auto& i : jit_env.interrupts) - std::puts(i.c_str()); - fmt::print("===\n"); - fmt::print("{}", jit.Disassemble()); + fmt::print( + "\n" + "===\n" + "{}" + , jit.Disassemble() + ); } } diff --git a/src/dynarmic/tests/test_reader.cpp b/src/dynarmic/tests/test_reader.cpp index 1c2cba1c44..d44e698c27 100644 --- a/src/dynarmic/tests/test_reader.cpp +++ b/src/dynarmic/tests/test_reader.cpp @@ -99,7 +99,6 @@ void RunTestInstance(Dynarmic::A32::Jit& jit, std::copy(instructions.begin(), instructions.end(), jit_env.code_mem.begin() + num_words); jit_env.PadCodeMem(); jit_env.modified_memory.clear(); - jit_env.interrupts.clear(); jit.Regs() = regs; jit.ExtRegs() = vecs; @@ -192,7 +191,6 @@ void RunTestInstance(A64::Jit& jit, jit_env.code_mem.emplace_back(0x14000000); // B . jit_env.code_mem_start_address = start_address; jit_env.modified_memory.clear(); - jit_env.interrupts.clear(); jit.SetRegisters(regs); jit.SetVectors(vecs); From 6f6a8f6d6795234e1da5425a12ca31c2e2959ba8 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 9 Sep 2026 11:14:22 +0200 Subject: [PATCH 018/128] [svc] don't truncate 64-bit SVC args on trace logs (#4374) Small inconvenience with args Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4374 Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- src/core/hle/kernel/svc.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index faf6a6432d..3542d5a3b6 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -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-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-late @@ -2501,14 +2501,15 @@ void Call(Core::System& system, u32 imm) { auto& process = GetCurrentProcess(kernel); std::array args; kernel.CurrentPhysicalCore().SaveSvcArguments(process, args); - LOG_TRACE(Kernel_SVC, "{} [0]={:#x} [1]={:#x} [2]={:#x} [3]={:#x} [4]={:#x} [5]={:#x} [6]={:#x}", - imm, GetArg32(args, 0), GetArg32(args, 1), GetArg32(args, 2), - GetArg32(args, 3), GetArg32(args, 4), GetArg32(args, 5), GetArg32(args, 6)); //kernel.EnterSVCProfile(); - if (process.Is64Bit()) + LOG_TRACE(Kernel_SVC, "{} [0]={:#x} [1]={:#x} [2]={:#x} [3]={:#x} [4]={:#x} [5]={:#x} [6]={:#x}", + imm, GetArg64(args, 0), GetArg64(args, 1), GetArg64(args, 2), + GetArg64(args, 3), GetArg64(args, 4), GetArg64(args, 5), GetArg64(args, 6)); + if (process.Is64Bit()) { Call64(system, imm, args); - else + } else { Call32(system, imm, args); + } //kernel.ExitSVCProfile(); kernel.CurrentPhysicalCore().LoadSvcArguments(process, args); } From 20f9aa4cfecf6b17735e0c8d7faa21e5d9388cfd Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 9 Sep 2026 11:57:40 +0200 Subject: [PATCH 019/128] [qt] Update FAQ links (#3710) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3710 Reviewed-by: MaranBr Reviewed-by: Ghost <> Reviewed-by: crueter Reviewed-by: CamilleLaVey --- .../app/src/main/res/values/strings.xml | 4 ++-- src/qt_common/util/content.cpp | 5 ++--- src/yuzu/main.ui | 12 +++-------- src/yuzu/main_window.cpp | 21 +++++++------------ src/yuzu/main_window.h | 3 +-- 5 files changed, 15 insertions(+), 30 deletions(-) diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 68e9570671..f073000380 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -3,7 +3,7 @@ Eden - This software will run games for the Nintendo Switch game console. No game titles or keys are included.<br /><br />Before you begin, please locate your prod.keys ]]> file on your device storage.<br /><br />Learn more]]> + This software will run games for the Nintendo Switch game console. No game titles or keys are included.<br /><br />Before you begin, please locate your prod.keys ]]> file on your device storage.<br /><br />Learn more]]> Notices and errors noticesAndErrors Shows notifications when something goes wrong. @@ -933,7 +933,7 @@ ROM file does not exist Game Requires Firmware - dump and install firmware, or press \"OK\" to launch anyways.]]> + Searching for game... diff --git a/src/qt_common/util/content.cpp b/src/qt_common/util/content.cpp index f22242e7f7..2838cd854e 100644 --- a/src/qt_common/util/content.cpp +++ b/src/qt_common/util/content.cpp @@ -28,9 +28,8 @@ bool CheckGameFirmware(u64 program_id) { !FirmwareManager::CheckFirmwarePresence(*system)) { auto result = QtCommon::Frontend::Warning( tr("Game Requires Firmware"), - tr("The game you are trying to launch requires firmware to boot or to get past the " - "opening menu. Please " - "dump and install firmware, or press \"OK\" to launch anyways."), + tr("This game may require firmware to function properly, and you don't have any installed. " + "Please install firmware before launching, or press \"OK\" to launch anyways."), QtCommon::Frontend::Ok | QtCommon::Frontend::Cancel); return result == QtCommon::Frontend::Ok; diff --git a/src/yuzu/main.ui b/src/yuzu/main.ui index c858be3cb3..13ded52cc0 100644 --- a/src/yuzu/main.ui +++ b/src/yuzu/main.ui @@ -233,8 +233,7 @@ - - + @@ -407,14 +406,9 @@ Open &Mods Page - + - Open &Quickstart Guide - - - - - &FAQ + &User Handbook diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 3f7feb83b2..9a167e18f7 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -1506,8 +1506,7 @@ void MainWindow::ConnectMenuEvents() { connect_menu(ui->action_Pause, &MainWindow::OnPauseContinueGame); connect_menu(ui->action_Stop, &MainWindow::OnStopGame); connect_menu(ui->action_Open_Mods_Page, &MainWindow::OnOpenModsPage); - connect_menu(ui->action_Open_Quickstart_Guide, &MainWindow::OnOpenQuickstartGuide); - connect_menu(ui->action_Open_FAQ, &MainWindow::OnOpenFAQ); + connect_menu(ui->action_Open_UserHandbook, &MainWindow::OnOpenUserHandbook); connect_menu(ui->action_Restart, &MainWindow::OnRestartGame); connect_menu(ui->action_Configure, &MainWindow::OnConfigure); connect_menu(ui->action_Configure_Current_Game, &MainWindow::OnConfigurePerGame); @@ -1843,12 +1842,10 @@ bool MainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPar case Core::SystemResultStatus::ErrorVideoCore: QMessageBox::critical( this, tr("An error occurred initializing the video core."), - tr("Eden has encountered an error while running the video core. " - "This is usually caused by outdated GPU drivers, including integrated ones. " - "Please see the log for more details. " - "For more information on accessing the log, please see the following page: " - "" - "How to Upload the Log File. ")); + tr("This is usually caused by outdated GPU drivers. " + "Please see the log for more details. See: " + "" + "How to access log files.")); break; default: if (result > Core::SystemResultStatus::ErrorLoader) { @@ -3199,12 +3196,8 @@ void MainWindow::OnOpenModsPage() { OpenURL(QUrl(QStringLiteral("https://github.com/eden-emulator/yuzu-mod-archive"))); } -void MainWindow::OnOpenQuickstartGuide() { - OpenURL(QUrl(QStringLiteral("https://yuzu-mirror.github.io/help/quickstart/"))); -} - -void MainWindow::OnOpenFAQ() { - OpenURL(QUrl(QStringLiteral("https://yuzu-mirror.github.io/help"))); +void MainWindow::OnOpenUserHandbook() { + OpenURL(QUrl(QStringLiteral("https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/README.md"))); } void MainWindow::ToggleFullscreen() { diff --git a/src/yuzu/main_window.h b/src/yuzu/main_window.h index 3fe7ec620f..693f16b598 100644 --- a/src/yuzu/main_window.h +++ b/src/yuzu/main_window.h @@ -336,8 +336,7 @@ private slots: void OnPrepareForSleep(bool prepare_sleep); void OnMenuReportCompatibility(); void OnOpenModsPage(); - void OnOpenQuickstartGuide(); - void OnOpenFAQ(); + void OnOpenUserHandbook(); /// Called whenever a user selects a game in the game list widget. void OnGameListLoadFile(QString game_path, u64 program_id); From ed57836903804f05a0b2c9e84f1eaabb59503bed Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 9 Sep 2026 13:01:40 +0200 Subject: [PATCH 020/128] [ips_layer] remove trailing whitespace to fix hex parsing on TLTD mods (#4336) Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- ...another edge case, this time with `00297f24 34008052 // 60FPS` would get parsed as `34008052 ` which isn't quite correct Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4336 Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- src/core/file_sys/ips_layer.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/core/file_sys/ips_layer.cpp b/src/core/file_sys/ips_layer.cpp index 1df2f9dadd..9d46549bf0 100644 --- a/src/core/file_sys/ips_layer.cpp +++ b/src/core/file_sys/ips_layer.cpp @@ -120,7 +120,7 @@ std::array IPSwitchCompiler::GetBuildID() const { static IPSwitchRecord EscapeStringSequences(std::string_view sv) { IPSwitchRecord r{}; - for (auto it = sv.cbegin(); it != sv.cend(); ) { + for (auto it = sv.cbegin(); it < sv.cend(); ) { if (*it == '\\' && it + 1 < sv.cend()) { switch (it[1]) { case 'a': r.data[r.count] = '\a'; break; @@ -198,6 +198,8 @@ void IPSwitchCompiler::Parse(std::span bytes) { LOG_WARNING(Loader, "Unknown flag {}", line); break; } + } else if (patches.empty()) { + LOG_WARNING(Loader, "Invalid line not in a patch {}", line); } else { size_t offset = size_t(std::strtoul(line.data(), nullptr, 16)); offset += size_t(offset_shift); @@ -253,25 +255,30 @@ void IPSwitchCompiler::Parse(std::span bytes) { // now make a nominal preprocessed line: remove comments char quote = '\0'; auto const sline_start = p; + auto last_char = p; for (; p < sline.cend(); ) { // we dont check for "//", IPS checks for '/' only... - if ((!quote && p[0] == '/') + if (std::isspace(*p)) { + ++p; + } else if ((!quote && p[0] == '/') || (!quote && p[0] == '#')) { break; } else if (p[0] == '\"' || p[0] == '\'') { quote = (p[0] == quote) ? '\0' : p[0]; ++p; + last_char = p; } else if (p + 1 < sline.cend() && p[0] == '\\') { p += 2; + last_char = p; } else { ++p; + last_char = p; } } // now we have the preprocessed string ;) - std::string_view pp_str(sline_start, p); - if (pp_str.size() > 0 && !parse_line(pp_str)) { + std::string_view const pp_str(sline_start, last_char); + if (pp_str.size() > 0 && !parse_line(pp_str)) break; - } } } } From dcbcdf16ad4dd680823ee3ef65646a3537fc32df Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 9 Sep 2026 13:02:02 +0200 Subject: [PATCH 021/128] [hle/ns] implement IReadOnlyApplicationControlDataInterface::ListApplicationIcon (#3770) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3770 Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- .../ns/application_manager_interface.cpp | 7 +- .../ns/application_manager_interface.h | 1 + ...nly_application_control_data_interface.cpp | 175 +++++++++--------- ..._only_application_control_data_interface.h | 1 + ...read_only_application_record_interface.cpp | 8 +- 5 files changed, 102 insertions(+), 90 deletions(-) diff --git a/src/core/hle/service/ns/application_manager_interface.cpp b/src/core/hle/service/ns/application_manager_interface.cpp index 75c41e1680..c3b2aee8a8 100644 --- a/src/core/hle/service/ns/application_manager_interface.cpp +++ b/src/core/hle/service/ns/application_manager_interface.cpp @@ -139,7 +139,7 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_ {405, nullptr, "ListApplicationControlCacheEntryInfo"}, {406, nullptr, "GetApplicationControlProperty"}, {407, &IApplicationManagerInterface::ListApplicationTitle, "ListApplicationTitle"}, - {408, nullptr, "ListApplicationIcon"}, + {408, &IApplicationManagerInterface::ListApplicationIcon, "ListApplicationIcon"}, {411, nullptr, "Unknown411"}, //19.0.0+ {412, nullptr, "Unknown412"}, //19.0.0+ {413, nullptr, "Unknown413"}, //19.0.0+ @@ -894,4 +894,9 @@ void IApplicationManagerInterface::ListApplicationTitle(HLERequestContext& ctx) IReadOnlyApplicationControlDataInterface(system).ListApplicationTitle(ctx); } +void IApplicationManagerInterface::ListApplicationIcon(HLERequestContext& ctx) { + LOG_DEBUG(Service_NS, "called"); + IReadOnlyApplicationControlDataInterface(system).ListApplicationIcon(ctx); +} + } // namespace Service::NS diff --git a/src/core/hle/service/ns/application_manager_interface.h b/src/core/hle/service/ns/application_manager_interface.h index a02e487416..f09ccf7b81 100644 --- a/src/core/hle/service/ns/application_manager_interface.h +++ b/src/core/hle/service/ns/application_manager_interface.h @@ -78,6 +78,7 @@ public: void PushApplicationRecord(HLERequestContext& ctx); void ListApplicationTitle(HLERequestContext& ctx); + void ListApplicationIcon(HLERequestContext& ctx); private: KernelHelpers::ServiceContext service_context; diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp index e8776d64b1..c7606a83bf 100644 --- a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp +++ b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp @@ -10,13 +10,17 @@ #include #include "common/stb.h" +#include "common/logging.h" #include "common/settings.h" #include "core/file_sys/control_metadata.h" #include "core/file_sys/patch_manager.h" #include "core/file_sys/vfs/vfs.h" #include "core/hle/kernel/k_process.h" #include "core/hle/kernel/k_transfer_memory.h" +#include "core/hle/result.h" #include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/hle_ipc.h" #include "core/hle/service/ns/language.h" #include "core/hle/service/ns/ns_types.h" #include "core/hle/service/ns/ns_results.h" @@ -72,24 +76,26 @@ void SanitizeJPEGImageSize(std::vector& image) { // IAsyncValue implementation for ListApplicationTitle // https://switchbrew.org/wiki/NS_services#ListApplicationTitle -class IAsyncValueForListApplicationTitle final : public ServiceFramework { +class IAsyncValue final : public ServiceFramework { public: - explicit IAsyncValueForListApplicationTitle(Core::System& system_, s32 offset, s32 size) - : ServiceFramework{system_, "IAsyncValue"}, service_context{system_, "IAsyncValue"}, - data_offset{offset}, data_size{size} { + explicit IAsyncValue(Core::System& system_, s32 offset, s32 size) + : ServiceFramework{system_, "IAsyncValue"} + , service_context{system_, "IAsyncValue"} + , data_offset{offset} + , data_size{size} + { static const FunctionInfo functions[] = { - {0, &IAsyncValueForListApplicationTitle::GetSize, "GetSize"}, - {1, &IAsyncValueForListApplicationTitle::Get, "Get"}, - {2, &IAsyncValueForListApplicationTitle::Cancel, "Cancel"}, - {3, &IAsyncValueForListApplicationTitle::GetErrorContext, "GetErrorContext"}, + {0, D<&IAsyncValue::GetSize>, "GetSize"}, + {1, D<&IAsyncValue::Get>, "Get"}, + {2, D<&IAsyncValue::Cancel>, "Cancel"}, + {3, D<&IAsyncValue::GetErrorContext>, "GetErrorContext"}, }; RegisterHandlers(functions); - completion_event = service_context.CreateEvent("IAsyncValue:Completion"); completion_event->GetReadableEvent().Signal(system.Kernel()); } - ~IAsyncValueForListApplicationTitle() override { + ~IAsyncValue() override { service_context.CloseEvent(completion_event); } @@ -98,35 +104,24 @@ public: } private: - void GetSize(HLERequestContext& ctx) { + Result GetSize(Out out_data_size) { LOG_DEBUG(Service_NS, "called"); - IPC::ResponseBuilder rb{ctx, 4}; - rb.Push(ResultSuccess); - rb.Push(data_size); + *out_data_size = data_size; + R_SUCCEED(); } - - void Get(HLERequestContext& ctx) { + Result Get(OutBuffer out_data_offset) { LOG_DEBUG(Service_NS, "called"); - std::vector buffer(sizeof(s32)); - std::memcpy(buffer.data(), &data_offset, sizeof(s32)); - ctx.WriteBuffer(buffer); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); + std::memcpy(out_data_offset.data(), &data_offset, sizeof(s32)); + R_SUCCEED(); } - - void Cancel(HLERequestContext& ctx) { + Result Cancel() { LOG_DEBUG(Service_NS, "called"); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); + R_SUCCEED(); } - - void GetErrorContext(HLERequestContext& ctx) { + Result GetErrorContext() { LOG_DEBUG(Service_NS, "called"); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); + R_SUCCEED(); } - KernelHelpers::ServiceContext service_context; Kernel::KEvent* completion_event{}; s32 data_offset; @@ -144,6 +139,7 @@ IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterfa {3, nullptr, "ConvertLanguageCodeToApplicationLanguage"}, {4, nullptr, "SelectApplicationDesiredLanguage"}, {5, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData2>, "GetApplicationControlData"}, + {10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"}, {13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"}, {19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, }; @@ -160,8 +156,7 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData( LOG_INFO(Service_NS, "called with control_source={}, application_id={:016X}", application_control_source, application_id); - const FileSys::PatchManager pm{application_id, system.GetFileSystemController(), - system.GetContentProvider()}; + const FileSys::PatchManager pm{application_id, system.GetFileSystemController(), system.GetContentProvider()}; const auto control = pm.GetControlMetadata(); const auto size = out_buffer.size(); @@ -169,8 +164,7 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData( const auto total_size = sizeof(FileSys::RawNACP) + icon_size; if (size < total_size) { - LOG_ERROR(Service_NS, "output buffer is too small! (actual={:016X}, expected_min=0x4000)", - size); + LOG_ERROR(Service_NS, "output buffer is too small! (actual={:016X}, expected_min=0x4000)", size); R_THROW(ResultUnknown); } @@ -178,8 +172,7 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData( const auto bytes = control.first->GetRawBytes(); std::memcpy(out_buffer.data(), bytes.data(), bytes.size()); } else { - LOG_WARNING(Service_NS, "missing NACP data for application_id={:016X}, defaulting to zero", - application_id); + LOG_WARNING(Service_NS, "missing NACP data for application_id={:016X}, defaulting to zero", application_id); std::memset(out_buffer.data(), 0, sizeof(FileSys::RawNACP)); } @@ -204,15 +197,12 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage( // Convert to application language, get priority list const auto application_language = ConvertToApplicationLanguage(language_code); if (application_language == std::nullopt) { - LOG_ERROR(Service_NS, "Could not convert application language! language_code={}", - language_code); + LOG_ERROR(Service_NS, "Could not convert application language! language_code={}", language_code); R_THROW(Service::NS::ResultApplicationLanguageNotFound); } const auto priority_list = GetApplicationLanguagePriorityList(*application_language); if (!priority_list) { - LOG_ERROR(Service_NS, - "Could not find application language priorities! application_language={}", - *application_language); + LOG_ERROR(Service_NS, "Could not find application language priorities! application_language={}", *application_language); R_THROW(Service::NS::ResultApplicationLanguageNotFound); } @@ -256,8 +246,7 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData2( const auto nacp_size = sizeof(FileSys::RawNACP); if (size < nacp_size) { - LOG_ERROR(Service_NS, "output buffer is too small! (actual={:016X}, expected_min={:08X})", - size, nacp_size); + LOG_ERROR(Service_NS, "output buffer is too small! (actual={:016X}, expected_min={:08X})", size, nacp_size); R_THROW(ResultUnknown); } @@ -308,63 +297,81 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData2( R_SUCCEED(); } - -void IReadOnlyApplicationControlDataInterface::ListApplicationTitle(HLERequestContext& ctx) { - /* - IPC::RequestParser rp{ctx}; - auto control_source = rp.PopRaw(); - rp.Skip(7, false); - auto transfer_memory_size = rp.Pop(); - */ - +void IReadOnlyApplicationControlDataInterface::ListApplicationIcon(HLERequestContext& ctx) { + LOG_WARNING(Service_NS, "(stubbed)"); const auto app_ids_buffer = ctx.ReadBuffer(); - const size_t app_count = app_ids_buffer.size() / sizeof(u64); - - std::vector application_ids(app_count); - if (app_count > 0) { - std::memcpy(application_ids.data(), app_ids_buffer.data(), app_count * sizeof(u64)); - } - + const u64 app_count = app_ids_buffer.size() / sizeof(u64); auto t_mem_obj = ctx.GetObjectFromHandle(ctx.GetCopyHandle(0)); auto* t_mem = t_mem_obj.GetPointerUnsafe(); - - constexpr size_t title_entry_size = sizeof(FileSys::LanguageEntry); - const size_t total_data_size = app_count * title_entry_size; - - constexpr s32 data_offset = 0; - + size_t out_length = 0; if (t_mem != nullptr && t_mem->GetOwner() != nullptr && app_count > 0) { auto& memory = t_mem->GetOwner()->GetMemory(); const auto t_mem_address = t_mem->GetSourceAddress(); - + // u64 - app count + memory.WriteBlock(t_mem_address + out_length, &app_count, sizeof(u64)); + out_length += sizeof(u64); + // [list of u64] - size of icons for (size_t i = 0; i < app_count; ++i) { - const u64 app_id = application_ids[i]; - const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), - system.GetContentProvider()}; + const u64 app_id = app_ids_buffer[i]; + const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()}; const auto control = pm.GetControlMetadata(); - - FileSys::LanguageEntry entry{}; - if (control.first != nullptr) { - entry = control.first->GetLanguageEntry(); + u64 full_size = control.second->GetSize(); + memory.WriteBlock(t_mem_address + out_length, &full_size, sizeof(u64)); + out_length += sizeof(u64); + } + // [list of raw icon data] + std::vector full_icon_data; + for (size_t i = 0; i < app_count; ++i) { + const u64 app_id = app_ids_buffer[i]; + const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()}; + const auto control = pm.GetControlMetadata(); + auto const full_size = control.second->GetSize(); + if (full_size > 0) { + full_icon_data.resize(full_size); + control.second->Read(full_icon_data.data(), full_size, 0); + memory.WriteBlock(t_mem_address + out_length, full_icon_data.data(), full_size); + out_length += full_size; } - - const size_t offset = i * title_entry_size; - memory.WriteBlock(t_mem_address + offset, &entry, title_entry_size); } } - - auto async_value = std::make_shared( - system, data_offset, static_cast(total_data_size)); - + auto async_value = std::make_shared(system, 0, s32(out_length)); IPC::ResponseBuilder rb{ctx, 2, 1, 1}; rb.Push(ResultSuccess); rb.PushCopyObjects(ctx, async_value->ReadableEvent()); rb.PushIpcInterface(ctx, std::move(async_value)); } -Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData3( - OutBuffer out_buffer, Out out_flags_a, Out out_flags_b, - Out out_actual_size, ApplicationControlSource application_control_source, u8 flag1, u8 flag2, u64 application_id) { +void IReadOnlyApplicationControlDataInterface::ListApplicationTitle(HLERequestContext& ctx) { + const auto app_ids_buffer = ctx.ReadBuffer(); + const size_t app_count = app_ids_buffer.size() / sizeof(u64); + auto t_mem_obj = ctx.GetObjectFromHandle(ctx.GetCopyHandle(0)); + auto* t_mem = t_mem_obj.GetPointerUnsafe(); + constexpr size_t title_entry_size = sizeof(FileSys::LanguageEntry); + const size_t total_data_size = app_count * title_entry_size; + constexpr s32 data_offset = 0; + if (t_mem != nullptr && app_count > 0) { + auto& memory = system.ApplicationMemory(); + const auto t_mem_address = t_mem->GetSourceAddress(); + for (size_t i = 0; i < app_count; ++i) { + const u64 app_id = app_ids_buffer[i]; + const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()}; + const auto control = pm.GetControlMetadata(); + FileSys::LanguageEntry entry{}; + if (control.first != nullptr) { + entry = control.first->GetLanguageEntry(); + } + const size_t offset = i * title_entry_size; + memory.WriteBlock(t_mem_address + offset, &entry, title_entry_size); + } + } + auto async_value = std::make_shared(system, data_offset, s32(total_data_size)); + IPC::ResponseBuilder rb{ctx, 2, 1, 1}; + rb.Push(ResultSuccess); + rb.PushCopyObjects(ctx, async_value->ReadableEvent()); + rb.PushIpcInterface(ctx, std::move(async_value)); +} + +Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData3(OutBuffer out_buffer, Out out_flags_a, Out out_flags_b, Out out_actual_size, ApplicationControlSource application_control_source, u8 flag1, u8 flag2, u64 application_id) { LOG_INFO(Service_NS, "called with control_source={}, flags=({:02X},{:02X}), application_id={:016X}", application_control_source, flag1, flag2, application_id); diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.h b/src/core/hle/service/ns/read_only_application_control_data_interface.h index 441408b651..a4a285151a 100644 --- a/src/core/hle/service/ns/read_only_application_control_data_interface.h +++ b/src/core/hle/service/ns/read_only_application_control_data_interface.h @@ -34,6 +34,7 @@ public: u8 flag1, u8 flag2, u64 application_id); + void ListApplicationIcon(HLERequestContext& ctx); void ListApplicationTitle(HLERequestContext& ctx); Result GetApplicationControlData3( OutBuffer out_buffer, diff --git a/src/core/hle/service/ns/read_only_application_record_interface.cpp b/src/core/hle/service/ns/read_only_application_record_interface.cpp index 18f9e41d8c..8ce7851ae2 100644 --- a/src/core/hle/service/ns/read_only_application_record_interface.cpp +++ b/src/core/hle/service/ns/read_only_application_record_interface.cpp @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -16,10 +16,8 @@ IReadOnlyApplicationRecordInterface::IReadOnlyApplicationRecordInterface(Core::S static const FunctionInfo functions[] = { {0, D<&IReadOnlyApplicationRecordInterface::HasApplicationRecord>, "HasApplicationRecord"}, {1, nullptr, "NotifyApplicationFailure"}, - {2, D<&IReadOnlyApplicationRecordInterface::IsDataCorruptedResult>, - "IsDataCorruptedResult"}, - {3, D<&IReadOnlyApplicationRecordInterface::ListApplicationRecord>, - "ListApplicationRecord"}, + {2, D<&IReadOnlyApplicationRecordInterface::IsDataCorruptedResult>, "IsDataCorruptedResult"}, + {3, D<&IReadOnlyApplicationRecordInterface::ListApplicationRecord>, "ListApplicationRecord"}, }; // clang-format on From c5f6f1ca5eaf16ff84aee7987c0c8d37a1d9d2b2 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 9 Sep 2026 13:18:43 +0200 Subject: [PATCH 022/128] [common/host_memory] Remove throw on benign path (#4359) The caller of GetFuncAddress already handles the case gracefully. Fixes crashes when the symbol aint present Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4359 Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- src/common/host_memory.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index fa30b2c047..dd0780a283 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -117,7 +117,6 @@ template static void GetFuncAddress(Common::DynamicLibrary& dll, const char* name, T& pfn) { if (!dll.GetSymbol(name, &pfn)) { LOG_CRITICAL(HW_Memory, "Failed to load {}", name); - throw std::bad_alloc{}; } } From 5f142c7926d0c7fcbbd0ce30794d72f638a43b2a Mon Sep 17 00:00:00 2001 From: Exverge Date: Wed, 9 Sep 2026 21:35:49 +0200 Subject: [PATCH 023/128] [common/core/dynarmic] Optimize page table allocations (#4219) Reduces the page entries from 32 bytes to 8 and rewrites `VirtualBuffer` to be more efficient in memory usage and specifically for large zero regions. The page table will now only reserve 1GiB instead of 4GiB and of this memory it should only use at most ~8MiB. This PR has the side effect of using Eden on Windows on low memory systems much more plausible since it would previously require ~10GiB of committable memory at front (despite using ~5-6 at most, inadvertently stalling other processes) where as now it should only require around the amount that it'll actually use. Co-authored-by: Lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4219 Reviewed-by: Maufeat Reviewed-by: lizzie Reviewed-by: CamilleLaVey --- src/common/CMakeLists.txt | 4 +- src/common/fiber.cpp | 1 - src/common/host_memory.cpp | 52 +++-- src/common/host_memory.h | 3 +- src/common/page_table.cpp | 38 +--- src/common/page_table.h | 120 ++++++----- src/common/sparse_large_vector.cpp | 143 +++++++++++++ src/common/sparse_large_vector.h | 194 ++++++++++++++++++ src/common/virtual_buffer.cpp | 44 ---- src/common/virtual_buffer.h | 84 -------- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 18 +- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 19 +- src/core/device_memory.h | 10 +- src/core/device_memory_manager.h | 10 +- src/core/device_memory_manager.inc | 49 ++--- src/core/hle/kernel/k_page_table_base.cpp | 110 ++++++---- src/core/hle/kernel/k_page_table_base.h | 13 +- src/core/memory.cpp | 81 ++++---- .../backend/arm64/a32_address_space.cpp | 4 +- .../backend/arm64/a64_address_space.cpp | 4 +- .../src/dynarmic/backend/arm64/emit_arm64.h | 4 +- .../backend/arm64/emit_arm64_memory.cpp | 15 +- .../dynarmic/backend/x64/emit_x64_memory.h | 57 +++-- .../src/dynarmic/interface/A32/config.h | 19 +- .../src/dynarmic/interface/A64/config.h | 19 +- src/video_core/memory_manager.cpp | 4 +- src/video_core/memory_manager.h | 4 +- 27 files changed, 730 insertions(+), 393 deletions(-) create mode 100644 src/common/sparse_large_vector.cpp create mode 100644 src/common/sparse_large_vector.h delete mode 100644 src/common/virtual_buffer.cpp delete mode 100644 src/common/virtual_buffer.h diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 3a6d2acf8a..61e0e64aa8 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -108,6 +108,8 @@ add_library( settings_setting.h slot_vector.h socket_types.h + sparse_large_vector.cpp + sparse_large_vector.h spin_lock.h stb.cpp stb.h @@ -137,8 +139,6 @@ add_library( uuid.cpp uuid.h vector_math.h - virtual_buffer.cpp - virtual_buffer.h zstd_compression.cpp zstd_compression.h fs/ryujinx_compat.h fs/ryujinx_compat.cpp diff --git a/src/common/fiber.cpp b/src/common/fiber.cpp index 69eca732eb..0e7f28c5b9 100644 --- a/src/common/fiber.cpp +++ b/src/common/fiber.cpp @@ -9,7 +9,6 @@ #include "common/assert.h" #include "common/fiber.h" -#include "common/virtual_buffer.h" #include diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index dd0780a283..75a9da80e9 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -178,6 +178,14 @@ public: Release(); } + void* Allocate(size_t size) { + auto* ptr = VirtualAlloc(nullptr, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); + if (ptr == nullptr) { + LOG_CRITICAL(HW_Memory, "Failed to allocate fallback buffer with size {:#x}, error {}", size, GetLastError()); + } + return ptr; + } + void Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perms) { std::unique_lock lock{placeholder_mutex}; if (!IsNiechePlaceholder(virtual_offset, length)) { @@ -398,6 +406,10 @@ private: // For managarm: see https://github.com/managarm/managarm/issues/1370 #else // ^^^ Windows ^^^ vvv POSIX vvv +#ifndef MAP_NOCORE +#define MAP_NOCORE 0 +#endif + #ifdef ARCHITECTURE_arm64 static void* ChooseVirtualBase(size_t virtual_size) { @@ -422,7 +434,7 @@ static void* ChooseVirtualBase(size_t virtual_size) { // Note: we may be able to take advantage of MAP_FIXED_NOREPLACE here. void* map_pointer = mmap(reinterpret_cast(hint_address), virtual_size, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); + MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_NOCORE, -1, 0); // If we successfully mapped, we're done. if (reinterpret_cast(map_pointer) == hint_address) { @@ -442,11 +454,11 @@ static void* ChooseVirtualBase(size_t virtual_size) { static void* ChooseVirtualBase(size_t virtual_size) { #if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__managarm__) || defined(__AIX__) - void* virtual_base = mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_ALIGNED_SUPER, -1, 0); + void* virtual_base = mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_ALIGNED_SUPER | MAP_NOCORE, -1, 0); if (virtual_base != MAP_FAILED) return virtual_base; #endif - return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); + return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_NOCORE, -1, 0); } #endif @@ -540,13 +552,13 @@ public: } if (use_anon) { LOG_WARNING(Common_Memory, "Using private mappings instead of shared ones"); - backing_base = static_cast(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)); + backing_base = static_cast(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_NOCORE, -1, 0)); if (fd > 0) { fd = -1; close(fd); } } else { - backing_base = static_cast(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)); + backing_base = static_cast(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_NOCORE, fd, 0)); } if (backing_base == MAP_FAILED) { LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno)); @@ -570,6 +582,14 @@ public: Release(); } + void* Allocate(size_t size) { + auto* ptr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); + if (ptr == MAP_FAILED) { + LOG_CRITICAL(HW_Memory, "Failed to allocate fallback buffer with size {:#x}, {}", size, strerror(errno)); + } + return ptr; + } + void Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perms) { // Intersect the range with our address space. AdjustMap(&virtual_offset, &length); @@ -690,12 +710,10 @@ HostMemory::HostMemory(size_t backing_size_, size_t virtual_size_) { #if defined(__OPENORBIS__) || defined(__managarm__) LOG_WARNING(HW_Memory, "Platform doesn't support fastmem"); - fallback_buffer.emplace(backing_size); - backing_base = fallback_buffer->data(); + backing_base = static_cast(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); virtual_base = nullptr; #else // Try to allocate a fastmem arena. - // The implementation will fail with std::bad_alloc on errors. impl = std::make_unique(AlignUp(backing_size, PageAlignment), AlignUp(virtual_size, PageAlignment) + HugePageSize); if (impl->Init()) { backing_base = impl->backing_base; @@ -706,16 +724,26 @@ HostMemory::HostMemory(size_t backing_size_, size_t virtual_size_) virtual_base_offset = virtual_base - impl->virtual_base; } } else { - impl.reset(); LOG_WARNING(HW_Memory, "Platform can support fastmem, but can't create it"); - fallback_buffer.emplace(backing_size); - backing_base = fallback_buffer->data(); + fallback_buffer = true; + backing_base = static_cast(impl->Allocate(backing_size)); virtual_base = nullptr; + impl.reset(); } #endif } -HostMemory::~HostMemory() = default; +HostMemory::~HostMemory() { +#ifdef _WIN32 + if (fallback_buffer) { + VirtualFree(backing_base, backing_size, MEM_RELEASE); + } +#else + if (fallback_buffer) { + munmap(backing_base, backing_size); + } +#endif +} HostMemory::HostMemory(HostMemory&&) noexcept = default; diff --git a/src/common/host_memory.h b/src/common/host_memory.h index 24f4670732..a7fd0532b7 100644 --- a/src/common/host_memory.h +++ b/src/common/host_memory.h @@ -10,7 +10,6 @@ #include #include "common/common_funcs.h" #include "common/common_types.h" -#include "common/virtual_buffer.h" namespace Common { @@ -86,7 +85,7 @@ private: u8* virtual_base{}; size_t virtual_base_offset{}; // Windows requires it for kernels whom lack proper support for some functions! - std::optional> fallback_buffer; + bool fallback_buffer{false}; }; } // namespace Common diff --git a/src/common/page_table.cpp b/src/common/page_table.cpp index d34ba89993..73278cfc59 100644 --- a/src/common/page_table.cpp +++ b/src/common/page_table.cpp @@ -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-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -13,39 +13,11 @@ PageTable::PageTable() = default; PageTable::~PageTable() noexcept = default; -bool PageTable::BeginTraversal(TraversalEntry* out_entry, TraversalContext* out_context, - Common::ProcessAddress address) const { - out_context->next_offset = GetInteger(address); - out_context->next_page = address / page_size; - - return this->ContinueTraversal(out_entry, out_context); -} - -bool PageTable::ContinueTraversal(TraversalEntry* out_entry, TraversalContext* context) const { - // Setup invalid defaults. - out_entry->phys_addr = 0; - out_entry->block_size = page_size; - // Validate that we can read the actual entry. - if (auto const page = context->next_page; page < entries.size()) { - // Validate that the entry is mapped. - if (auto const paddr = entries[page].addr; paddr != 0) { - // Populate the results. - out_entry->phys_addr = paddr + context->next_offset; - context->next_page += 1; - context->next_offset += page_size; - return true; - } - } - context->next_page += 1; - context->next_offset += page_size; - return false; -} - -void PageTable::Resize(std::size_t address_space_width_in_bits, std::size_t page_size_in_bits) { - auto const num_page_table_entries = 1ULL << (address_space_width_in_bits - page_size_in_bits); - entries.resize(num_page_table_entries); +void PageTable::Resize(std::size_t address_space_width_in_bits, std::size_t page_bits) { + auto const num_page_table_entries = 1ULL << (address_space_width_in_bits - page_bits); + entries.ResizeAndClear(num_page_table_entries); current_address_space_width_in_bits = address_space_width_in_bits; - page_size = 1ULL << page_size_in_bits; + current_page_bits = page_bits; } } // namespace Common diff --git a/src/common/page_table.h b/src/common/page_table.h index 0dfd152331..1588eca616 100644 --- a/src/common/page_table.h +++ b/src/common/page_table.h @@ -9,22 +9,22 @@ #include #include "common/common_types.h" +#include "common/sparse_large_vector.h" #include "common/typed_address.h" -#include "common/virtual_buffer.h" namespace Common { enum class PageType : u8 { /// Page is unmapped and should cause an access error. - Unmapped, + Unmapped = 0b00, /// Page is mapped to regular memory. This is the only type you can get pointers to. - Memory, + Memory = 0b01, /// Page is mapped to regular memory, but inaccessible from CPU fastmem and must use /// the callbacks. - DebugMemory, + DebugMemory = 0b10, /// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and /// invalidation - RasterizerCachedMemory, + RasterizerCachedMemory = 0b11, }; /** @@ -42,57 +42,86 @@ struct PageTable { u64 next_offset{}; }; - /// Number of bits reserved for attribute tagging. - /// This can be at most the guaranteed alignment of the pointers in the page table. - static constexpr int ATTRIBUTE_BITS = 2; + /// Masks out bits reserved for attribute tagging. + static constexpr u64 ATTRIBUTE_MASK = ((1ULL << 44) - 1) << 12; + + /// Specifies sign bit for page table entries. + static constexpr u64 SIGN_BIT = 45 + 12; // 44 bits of data + page offset /** - * Pair of host pointer and page type attribute. - * This uses the lower bits of a given pointer to store the attribute tag. + * Atomic tuple of host pointer, page type, and block id. + * This uses the lower bits of a given pointer to store the attributes. * Writing and reading the pointer attribute pair is guaranteed to be atomic for the same method * call. In other words, they are guaranteed to be synchronized at all times. */ - class PageInfo { + class PageEntryData { public: + struct Data { + Data(bool marked_, PageType type_, u16 block_, u64 page_) + : marked(static_cast(marked_) & 0b1) + , type(static_cast(type_) & ((1ULL << 2) - 1)) + , block(static_cast(block_) & ((1ULL << 9) - 1)) + , page((page_ >> 12) & ((1ULL << 45) - 1)) + , block2((static_cast(block_) >> 9) & ((1ULL << 7) - 1)) {} + u64 marked : 1; + u64 type : 2; + u64 block : 9; + u64 page : 45; // 44 bits of actual data (64 - page offset (12) - reserved (8)) + a sign bit + u64 block2 : 7; + }; + + [[nodiscard]] Data Raw() const noexcept { + return std::bit_cast(data_raw.load(std::memory_order_relaxed)); + } + /// Returns the page pointer - [[nodiscard]] uintptr_t Pointer() const noexcept { - return ExtractPointer(raw.load(std::memory_order_relaxed)); + [[nodiscard]] uintptr_t Pointer(bool ignored_marked = false) const noexcept { + return ExtractPointer(std::bit_cast(data_raw.load(std::memory_order_relaxed)), ignored_marked); } /// Returns the page type attribute [[nodiscard]] PageType Type() const noexcept { - return ExtractType(raw.load(std::memory_order_relaxed)); + return static_cast(std::bit_cast(data_raw.load(std::memory_order_relaxed)).type); + } + + /// Returns the block identifier. + [[nodiscard]] u16 Block() const noexcept { + return ExtractBlock(std::bit_cast(data_raw.load(std::memory_order_relaxed))); } /// Returns the page pointer and attribute pair, extracted from the same atomic read - [[nodiscard]] std::pair PointerType() const noexcept { - const uintptr_t non_atomic_raw = raw.load(std::memory_order_relaxed); - return {ExtractPointer(non_atomic_raw), ExtractType(non_atomic_raw)}; + [[nodiscard]] std::tuple PointerTypeBlock(bool ignore_marked = false) const noexcept { + const auto non_atomic_raw = std::bit_cast(data_raw.load(std::memory_order_relaxed)); + return {ExtractPointer(non_atomic_raw, ignore_marked), static_cast(non_atomic_raw.type), ExtractBlock(non_atomic_raw)}; } - /// Returns the raw representation of the page information. - /// Use ExtractPointer and ExtractType to unpack the value. - [[nodiscard]] uintptr_t Raw() const noexcept { - return raw.load(std::memory_order_relaxed); + /// Write page info atomically + constexpr void Store(bool marked, PageType type, u16 block, uintptr_t pointer) noexcept { + data_raw.store(std::bit_cast(Data{marked, type, block, pointer})); } - /// Write a page pointer and type pair atomically - void Store(uintptr_t pointer, PageType type) noexcept { - raw.store(pointer | uintptr_t(type)); + constexpr void MarkRasterizerCached() noexcept { + data_raw.fetch_or(0b111); + } + + constexpr void MarkDebug(u64 ptr, u16 block) noexcept { + Store(true, PageType::DebugMemory, block, ptr); } /// Unpack a pointer from a page info raw representation - [[nodiscard]] static uintptr_t ExtractPointer(uintptr_t raw) noexcept { - return raw & (~uintptr_t{0} << ATTRIBUTE_BITS); + [[nodiscard]] static uintptr_t ExtractPointer(Data raw, bool ignore_marked = false) noexcept { + return raw.marked && !ignore_marked ? 0 + // shift raw.page's fake sign bit to the actual sign bit, then sign extend + : ((s64)(raw.page << (64 - 44))) >> (64 - 44 - 12); } - /// Unpack a page type from a page info raw representation - [[nodiscard]] static PageType ExtractType(uintptr_t raw) noexcept { - return static_cast(raw & ((uintptr_t{1} << ATTRIBUTE_BITS) - 1)); + [[nodiscard]] static u16 ExtractBlock(Data raw) noexcept { + return static_cast(raw.block | (raw.block2 << 9)); } private: - std::atomic raw; + std::atomic data_raw; + static_assert(sizeof(Data) == sizeof(std::atomic)); }; PageTable(); @@ -100,13 +129,8 @@ struct PageTable { PageTable(const PageTable&) = delete; PageTable& operator=(const PageTable&) = delete; - - PageTable(PageTable&&) noexcept = default; - PageTable& operator=(PageTable&&) noexcept = default; - - bool BeginTraversal(TraversalEntry* out_entry, TraversalContext* out_context, - Common::ProcessAddress address) const; - bool ContinueTraversal(TraversalEntry* out_entry, TraversalContext* context) const; + PageTable(PageTable&&) noexcept = delete; + PageTable& operator=(PageTable&&) noexcept = delete; /** * Resizes the page table to be able to accommodate enough pages within @@ -121,30 +145,14 @@ struct PageTable { return current_address_space_width_in_bits; } - bool GetPhysicalAddress(Common::PhysicalAddress* out_phys_addr, - Common::ProcessAddress virt_addr) const { - if (virt_addr > (1ULL << this->GetAddressSpaceBits())) { - return false; - } - - *out_phys_addr = entries[virt_addr / page_size].addr + GetInteger(virt_addr); - return true; - } - /// Vector of memory pointers backing each page. An entry can only be non-null if the /// corresponding attribute element is of type `Memory`. - struct PageEntryData { - PageInfo ptr; - u64 block; - u64 addr; - u64 padding; - }; - VirtualBuffer entries; - static_assert(sizeof(PageEntryData) == 32); + SparseLargeVector entries; + static_assert(sizeof(PageEntryData) == 8); u8* fastmem_arena{}; std::size_t current_address_space_width_in_bits{}; - std::size_t page_size{}; + std::size_t current_page_bits{}; }; } // namespace Common diff --git a/src/common/sparse_large_vector.cpp b/src/common/sparse_large_vector.cpp new file mode 100644 index 0000000000..ce6455a235 --- /dev/null +++ b/src/common/sparse_large_vector.cpp @@ -0,0 +1,143 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +/* virtual_buffer.cpp */ +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifdef _WIN32 +#include +#include +#else +#include +#endif + +#include "common/alignment.h" +#include "common/assert.h" +#include "common/sparse_large_vector.h" + +namespace Common { + +#ifdef _WIN32 +static std::vector> vector_regions {}; + +// Workaround for handling non-commited memory accessed by Dynarmic; usually result of an error +static LONG WINAPI FakePageFaultHandler(PEXCEPTION_POINTERS info) { + DWORD code = info->ExceptionRecord->ExceptionCode; + u64 exception_addr = reinterpret_cast(info->ExceptionRecord->ExceptionAddress); + + if (code != EXCEPTION_ACCESS_VIOLATION) { + // Not our problem + return EXCEPTION_CONTINUE_SEARCH; + } + + u64 addr = 0, addr2 = 0; + + for (auto region: vector_regions) { + auto addr_shifted = exception_addr >> HostPageBits; + if (region.first <= addr_shifted && addr_shifted <= region.second) { + addr = addr_shifted; + } + + // Page-boundary accesses + if (auto addr_ = (exception_addr + 0x40) >> HostPageBits; addr_ != addr_shifted && region.first <= addr_ && addr_ <= region.second) { + addr2 = addr_; + } + + if (addr != 0 || addr2 != 0) { + break; + } + } + + if (addr == 0 && addr2 == 0) { + // Not our problem + return EXCEPTION_CONTINUE_SEARCH; + } + + LOG_ERROR(HW_Memory, "Accessing an unallocated region of a SparseLargeVector at {:#x}; this shouldn't happen and is likely a Dynarmic error!", exception_addr); + + // Commit this region + if (addr != 0) { + if (!CommitVectorPage(addr << HostPageBits, false)) { + return EXCEPTION_CONTINUE_SEARCH; + } + } + // Commit next region if needed + if (addr2 != 0) { + if (!CommitVectorPage(addr2 << HostPageBits, false)) { + return EXCEPTION_CONTINUE_SEARCH; + } + } + + return EXCEPTION_CONTINUE_EXECUTION; +} + +bool CommitVectorPage(uintptr_t addr, bool write) noexcept { + MEMORY_BASIC_INFORMATION info {}; + auto res = VirtualQuery(reinterpret_cast(addr), &info, sizeof(info)); + if (res == 0) { + LOG_CRITICAL(HW_Memory, "Failed to query large buffer region at {:#x} with error {}, will try committing anyway", addr, GetLastError()); + } else if (info.State != MEM_RESERVE) { + LOG_ERROR(HW_Memory, "Tried to commit an unreserved large buffer region at {:#x} that is not mapped or is already committed (state {:#x})", addr, info.State); + return false; + } + + auto perm = write ? PAGE_READWRITE : PAGE_READONLY; + void* res2 = VirtualAlloc(reinterpret_cast(addr), HostPageSize, MEM_COMMIT, perm); + if (res2 == nullptr) { + LOG_ERROR(HW_Memory, "Failed to commit large buffer region at {:#x}, error {}", addr, GetLastError()); + return false; + } + + return true; +} +#endif + +#ifndef MAP_NOCORE +#define MAP_NOCORE 0 +#endif + +void* AllocateMemoryPages(std::size_t size) noexcept { + if (auto page = HostPageSize; size % page != 0) { + LOG_WARNING(HW_Memory, "Allocating unaligned large vector with size {:#x}; aligning to {} page size", size, page); + size = AlignUp(size, page); + } + +#ifdef _WIN32 + // We will never use this memory entirely so instead of committing it up front let's just reserve it and commit each page individually + void* base = VirtualAlloc(nullptr, size, MEM_RESERVE, PAGE_READWRITE); + + if (base != nullptr) { + vector_regions.emplace_back(reinterpret_cast(base), reinterpret_cast(base) + size); + + static std::once_flag flag; + std::call_once(flag, []() { AddVectoredExceptionHandler(1, FakePageFaultHandler); }); + } else { + // Try committing everything instead?? + LOG_WARNING(HW_Memory, "Failed to reserve large vector region with error {}, trying to commit instead..", GetLastError()); + base = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); + } + ASSERT_MSG(base, "Failed to reserve {:#x} sized region with error {}", size, GetLastError()); +#else + void* base = mmap(nullptr, size, PROT_READ, MAP_ANON | MAP_PRIVATE | MAP_NOCORE, -1, 0); + if (base == MAP_FAILED) + base = nullptr; + ASSERT_MSG(base, "Failed to allocate {:#x} sized region with error {}", size, strerror(errno)); +#endif + return base; +} + +void FreeMemoryPages(void* base, [[maybe_unused]] std::size_t size) noexcept { + if (auto page = HostPageSize; size % page != 0) { + size = AlignUp(size, page); + } + if (!base) + return; +#ifdef _WIN32 + ASSERT(VirtualFree(base, 0, MEM_RELEASE)); +#else + ASSERT(munmap(base, size) == 0); +#endif +} + +} // namespace Common diff --git a/src/common/sparse_large_vector.h b/src/common/sparse_large_vector.h new file mode 100644 index 0000000000..827944fb08 --- /dev/null +++ b/src/common/sparse_large_vector.h @@ -0,0 +1,194 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +/* virtual_buffer.h */ +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include +#include + +#ifndef _WIN32 +#include +#include +#endif + +#include "common/alignment.h" +#include "common/assert.h" + +namespace Common { + +#ifdef _WIN32 +constexpr u64 HostPageSize = 0x1000; +constexpr u64 HostPageBits = 12; +constexpr u64 HostPageMask = ~(HostPageSize - 1); +bool CommitVectorPage(uintptr_t addr, bool write) noexcept; +#else +const u64 HostPageSize = sysconf(_SC_PAGESIZE); +const u64 HostPageBits = std::countr_zero(HostPageSize); +const u64 HostPageMask = ~(HostPageSize - 1); +#endif + +void* AllocateMemoryPages(std::size_t size) noexcept; +void FreeMemoryPages(void* base, std::size_t size) noexcept; + +/// A large page-aligned buffer that has optimized memory usage for zero-writes. +template +requires std::is_trivially_copyable_v +class SparseLargeVector final { +public: + constexpr SparseLargeVector() = default; + + explicit SparseLargeVector(std::size_t count) noexcept + : alloc_size{count * sizeof(T)} + { + base_ptr = static_cast(AllocateMemoryPages(alloc_size)); + + // each item in vector holds information for 64 pages + auto denom = HostPageSize * 64; + committed_pages = std::vector>((alloc_size + denom - 1) / denom); + } + + ~SparseLargeVector() noexcept { + FreeMemoryPages(base_ptr, alloc_size); + } + + SparseLargeVector(const SparseLargeVector&) = delete; + SparseLargeVector& operator=(const SparseLargeVector&) = delete; + SparseLargeVector(SparseLargeVector&& other) = delete; + SparseLargeVector& operator=(SparseLargeVector&& other) = delete; + + void ResizeAndClear(std::size_t count) noexcept { + if (auto const new_size = count * sizeof(T); new_size != alloc_size) { + FreeMemoryPages(base_ptr, alloc_size); + alloc_size = new_size; + base_ptr = static_cast(AllocateMemoryPages(alloc_size)); + + auto denom = HostPageSize * 64; + committed_pages = std::vector>((alloc_size + denom - 1) / denom); + } + } + + /// Returns a reference to the value of the requested index and allocates memory if needed. + T& GetAndFault(std::size_t index) noexcept { + if (index > alloc_size / sizeof(T)) { + UNREACHABLE_MSG("Out of bounds RW access on SparseLargeVector @ {}", index); + } + + if (!IsCommittedPage(index)) { + CommitPage(index); + } + return base_ptr[index]; + } + + /// Returns a reference to the value of the requested index if initialized, or will otherwise return a zero-initialized object. + const T& GetOrDefault(std::size_t index) const { +#ifdef _WIN32 + if (!IsCommittedPage(index)) { + return *reinterpret_cast(&default_val); + } +#endif + // On non-Windows, OS page table should optimize this by pointing to a zero page if unallocated. + return base_ptr[index]; + } + + void Set(std::size_t index, const T& value) noexcept { + if (index > alloc_size / sizeof(T)) { + LOG_CRITICAL(Common_Memory, "Out of bounds write on SparseLargeVector @ {}", index); + return; + } + if (!IsCommittedPage(index)) + CommitPage(index); + base_ptr[index] = value; + } + + void ZeroRegion(std::size_t start, std::size_t end_) noexcept { + u64 base = reinterpret_cast(&base_ptr[start]); + const u64 end = reinterpret_cast(&base_ptr[end_]); + + const u64 end_page = AlignUp(base, HostPageSize); + const u64 first_size = (std::min)(end_page, end) - base; + + if (IsCommittedPage(start / sizeof(T))) { + std::memset(reinterpret_cast(base), 0, first_size); + } + + if (end <= end_page) + return; + + base = end_page; + + for (u64 page = base; page < end; page += HostPageSize) { + if (!IsCommittedPage((page - reinterpret_cast(base_ptr)) / sizeof(T))) { + continue; + } + + std::memset(reinterpret_cast(page), 0, (std::min)( HostPageSize, end - page)); + } + } + + constexpr void CommitRegion(size_t index, size_t end_) { + const u64 base = static_cast(index) * sizeof(T); + const u64 end = static_cast(end_) * sizeof(T); + + for (u64 page = AlignDown(base, HostPageSize); page < end; page += HostPageSize) { + if (!IsCommittedPage(page / sizeof(T))) { + CommitPage(page / sizeof(T)); + } + } + } + + constexpr T& GetUnchecked(size_t index) { + return base_ptr[index]; + } + + [[nodiscard]] constexpr const T& operator[](std::size_t index) const noexcept { + return GetOrDefault(index); + } + + [[nodiscard]] constexpr const T* data() const noexcept { + return base_ptr; + } + + [[nodiscard]] constexpr std::size_t size() const noexcept { + return alloc_size / sizeof(T); + } + +private: + [[nodiscard]] constexpr bool IsCommittedPage(std::size_t index) const noexcept { + if (index > alloc_size / sizeof(T)) { + LOG_CRITICAL(Common_Memory, "Out of bounds access on large vector @ {}", index); + return false; + } + + auto page = (index * sizeof(T)) >> HostPageBits; + auto val = committed_pages[page >> 6].load(std::memory_order_acquire); + return (val >> (page & 63)) & 1; + } + + constexpr void CommitPage(std::size_t index) noexcept { + auto page_index = (index * sizeof(T)) >> HostPageBits; + auto page = reinterpret_cast(base_ptr + index) & HostPageMask; +#if defined(_WIN32) + CommitVectorPage(page, true); +#else + mprotect(reinterpret_cast(page), HostPageSize, PROT_READ | PROT_WRITE); +#endif + + committed_pages[page_index >> 6].fetch_or(1ULL << (page_index & 63), std::memory_order_release); + } + + std::size_t alloc_size{}; + T* base_ptr{}; + + std::vector> committed_pages{}; +#ifdef _WIN32 + const std::array default_val{}; +#endif +}; + +} // namespace Common diff --git a/src/common/virtual_buffer.cpp b/src/common/virtual_buffer.cpp deleted file mode 100644 index 8a4265e3e6..0000000000 --- a/src/common/virtual_buffer.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#ifdef _WIN32 -#include -#else -#include -#endif - -#include "common/assert.h" -#include "common/virtual_buffer.h" - -namespace Common { - -void* AllocateMemoryPages(std::size_t size) noexcept { -#ifdef _WIN32 - void* base = VirtualAlloc(nullptr, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); - if (base == nullptr) { - // Probably failing to reserve is less likely than failing to commit - base = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); - } -#else - void* base = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); - if (base == MAP_FAILED) - base = nullptr; -#endif - ASSERT(base); - return base; -} - -void FreeMemoryPages(void* base, [[maybe_unused]] std::size_t size) noexcept { - if (!base) - return; -#ifdef _WIN32 - ASSERT(VirtualFree(base, 0, MEM_RELEASE)); -#else - ASSERT(munmap(base, size) == 0); -#endif -} - -} // namespace Common diff --git a/src/common/virtual_buffer.h b/src/common/virtual_buffer.h deleted file mode 100644 index d6386e2a4d..0000000000 --- a/src/common/virtual_buffer.h +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include - -namespace Common { - -void* AllocateMemoryPages(std::size_t size) noexcept; -void FreeMemoryPages(void* base, std::size_t size) noexcept; - -template -class VirtualBuffer final { -public: - // TODO: Uncomment this and change Common::PageTable::PageInfo to be trivially constructible - // using std::atomic_ref once libc++ has support for it - // static_assert( - // std::is_trivially_constructible_v, - // "T must be trivially constructible, as non-trivial constructors will not be executed " - // "with the current allocator"); - - constexpr VirtualBuffer() = default; - explicit VirtualBuffer(std::size_t count) noexcept - : alloc_size{count * sizeof(T)} - { - base_ptr = reinterpret_cast(AllocateMemoryPages(alloc_size)); - } - - ~VirtualBuffer() noexcept { - FreeMemoryPages(base_ptr, alloc_size); - } - - VirtualBuffer(const VirtualBuffer&) = delete; - VirtualBuffer& operator=(const VirtualBuffer&) = delete; - - VirtualBuffer(VirtualBuffer&& other) noexcept - : alloc_size{std::exchange(other.alloc_size, 0)} - , base_ptr{std::exchange(other.base_ptr, nullptr)} - {} - - VirtualBuffer& operator=(VirtualBuffer&& other) noexcept { - alloc_size = std::exchange(other.alloc_size, 0); - base_ptr = std::exchange(other.base_ptr, nullptr); - return *this; - } - - void resize(std::size_t count) noexcept { - if (auto const new_size = count * sizeof(T); new_size != alloc_size) { - FreeMemoryPages(base_ptr, alloc_size); - alloc_size = new_size; - base_ptr = reinterpret_cast(AllocateMemoryPages(alloc_size)); - } - } - - [[nodiscard]] constexpr const T& operator[](std::size_t index) const noexcept { - return base_ptr[index]; - } - - [[nodiscard]] constexpr T& operator[](std::size_t index) noexcept { - return base_ptr[index]; - } - - [[nodiscard]] constexpr T* data() noexcept { - return base_ptr; - } - - [[nodiscard]] constexpr const T* data() const noexcept { - return base_ptr; - } - - [[nodiscard]] constexpr std::size_t size() const noexcept { - return alloc_size / sizeof(T); - } - -private: - std::size_t alloc_size{}; - T* base_ptr{}; -}; - -} // namespace Common diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 97284efa4c..80e2b2dca9 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -172,12 +172,12 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { if (page_table) { constexpr size_t PageBits = 12; constexpr size_t NumPageTableEntries = 1 << (32 - PageBits); - constexpr size_t PageLog2Stride = 5; - static_assert(1 << PageLog2Stride == sizeof(Common::PageTable::PageEntryData)); - config.page_table = reinterpret_cast*>(page_table->entries.data()); - config.page_table_pointer_mask_bits = Common::PageTable::ATTRIBUTE_BITS; - config.page_table_log2_stride = PageLog2Stride; + // Dynarmic will not write to the page table, const_cast is safe here + config.page_table = reinterpret_cast*>( + const_cast(page_table->entries.data())); + config.page_table_pointer_mask = Common::PageTable::ATTRIBUTE_MASK; + config.page_table_marked_bit = 0; config.absolute_offset_page_table = true; config.detect_misaligned_access_via_page_table = 16 | 32 | 64 | 128; config.only_detect_misalignment_via_page_table_on_page_boundary = true; @@ -188,6 +188,13 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { config.fastmem_exclusive_access = config.fastmem_pointer != std::nullopt; config.recompile_on_exclusive_fastmem_failure = true; + + if (reinterpret_cast(m_system.DeviceMemory().buffer.BackingBasePointer() + + Kernel::Board::Nintendo::Nx::KSystemControl::Init::GetIntendedMemorySize()) < (1ULL << 39)) { + // Systems like FreeBSD allocate memory really low by default, and since we pack our page table entries, + // we have to manually sign extend when our actual pointer is negative. + config.page_table_sign_extension = Common::PageTable::SIGN_BIT; + } } // Multi-process state @@ -420,6 +427,7 @@ void ArmDynarmic32::SignalInterrupt(Kernel::KThread* thread) { } void ArmDynarmic32::ClearInstructionCache() { + m_cb->last_code_addr = u64(-1); m_jit->ClearCache(); } diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 0b7f6874a7..9662bf1712 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -211,13 +211,12 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s // Memory if (page_table) { - constexpr size_t PageLog2Stride = 5; - static_assert(1 << PageLog2Stride == sizeof(Common::PageTable::PageEntryData)); - - config.page_table = reinterpret_cast(page_table->entries.data()); + // Dynarmic will not write to the page table, const_cast is safe here + config.page_table = reinterpret_cast( + const_cast(page_table->entries.data())); config.page_table_address_space_bits = std::uint32_t(address_space_bits); - config.page_table_pointer_mask_bits = Common::PageTable::ATTRIBUTE_BITS; - config.page_table_log2_stride = PageLog2Stride; + config.page_table_pointer_mask = Common::PageTable::ATTRIBUTE_MASK; + config.page_table_marked_bit = 0; config.silently_mirror_page_table = false; config.absolute_offset_page_table = true; config.detect_misaligned_access_via_page_table = 16 | 32 | 64 | 128; @@ -231,6 +230,13 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s config.fastmem_exclusive_access = config.fastmem_pointer != std::nullopt; config.recompile_on_exclusive_fastmem_failure = true; + + if (reinterpret_cast(m_system.DeviceMemory().buffer.BackingBasePointer() + + Kernel::Board::Nintendo::Nx::KSystemControl::Init::GetIntendedMemorySize()) < (1ULL << 39)) { + // Systems like FreeBSD allocate memory really low by default, and since we pack our page table entries, + // we have to manually sign extend when our actual pointer is negative. + config.page_table_sign_extension = Common::PageTable::SIGN_BIT; + } } // Multi-process state @@ -447,6 +453,7 @@ void ArmDynarmic64::SignalInterrupt(Kernel::KThread* thread) { } void ArmDynarmic64::ClearInstructionCache() { + m_cb->last_code_addr = u64(-1); m_jit->ClearCache(); } diff --git a/src/core/device_memory.h b/src/core/device_memory.h index 11bf0e3268..b5103e23bc 100644 --- a/src/core/device_memory.h +++ b/src/core/device_memory.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -26,8 +29,11 @@ public: template Common::PhysicalAddress GetPhysicalAddr(const T* ptr) const { - return (reinterpret_cast(ptr) - - reinterpret_cast(buffer.BackingBasePointer())) + + return GetPhysicalAddr(reinterpret_cast(ptr)); + } + + Common::PhysicalAddress GetPhysicalAddr(uintptr_t ptr) const { + return (ptr - reinterpret_cast(buffer.BackingBasePointer())) + DramMemoryMap::Base; } diff --git a/src/core/device_memory_manager.h b/src/core/device_memory_manager.h index 3d97fdcc5c..b4b3b46088 100644 --- a/src/core/device_memory_manager.h +++ b/src/core/device_memory_manager.h @@ -18,7 +18,7 @@ #include "common/common_types.h" #include "common/range_mutex.h" #include "common/scratch_buffer.h" -#include "common/virtual_buffer.h" +#include "common/sparse_large_vector.h" namespace Core { @@ -178,8 +178,8 @@ private: u32 continuity_tracker; u32 compressed_physical_ptr; }; - Common::VirtualBuffer compressed_device_addr; - Common::VirtualBuffer tracked_entries; + Common::SparseLargeVector compressed_device_addr; + Common::SparseLargeVector tracked_entries; // Process memory interfaces @@ -200,8 +200,8 @@ private: return std::make_pair(asid, address); } - void InsertCPUBacking(size_t page_index, VAddr address, Asid asid) { - tracked_entries[page_index].cpu_backing_address = address | (asid.id << asid_start_bit); + constexpr void InsertCPUBacking(size_t page_index, VAddr address, Asid asid) { + tracked_entries.GetUnchecked(page_index).cpu_backing_address = address | (asid.id << asid_start_bit); } std::array t_slot{}; diff --git a/src/core/device_memory_manager.inc b/src/core/device_memory_manager.inc index 9866f3a4f7..97c2706abb 100644 --- a/src/core/device_memory_manager.inc +++ b/src/core/device_memory_manager.inc @@ -177,17 +177,6 @@ DeviceMemoryManager::DeviceMemoryManager(const DeviceMemory& device_memo { impl = std::make_unique>(); cached_pages = std::make_unique(); - - const size_t total_virtual = device_as_size >> Memory::YUZU_PAGEBITS; - for (size_t i = 0; i < total_virtual; i++) { - tracked_entries[i].compressed_physical_ptr = 0; - tracked_entries[i].continuity_tracker = 1; - tracked_entries[i].cpu_backing_address = 0; - } - const size_t total_phys = 1ULL << ((Settings::values.memory_layout_mode.GetValue() == Settings::MemoryLayout::Memory_4Gb ? physical_min_bits : physical_max_bits) - Memory::YUZU_PAGEBITS); - for (size_t i = 0; i < total_phys; i++) { - compressed_device_addr[i] = 0; - } } template @@ -220,26 +209,28 @@ void DeviceMemoryManager::Map(DAddr address, VAddr virtual_address, size size_t start_page_d = address >> Memory::YUZU_PAGEBITS; size_t num_pages = Common::AlignUp(size, Memory::YUZU_PAGESIZE) >> Memory::YUZU_PAGEBITS; std::scoped_lock lk(mapping_guard); + + tracked_entries.CommitRegion(start_page_d, start_page_d + num_pages); for (size_t i = 0; i < num_pages; i++) { const VAddr new_vaddress = virtual_address + i * Memory::YUZU_PAGESIZE; auto* ptr = process_memory->GetPointerSilent(Common::ProcessAddress(new_vaddress)); if (ptr == nullptr) [[unlikely]] { - tracked_entries[start_page_d + i].compressed_physical_ptr = 0; + tracked_entries.GetUnchecked(start_page_d + i).compressed_physical_ptr = 0; continue; } auto phys_addr = static_cast(GetRawPhysicalAddr(ptr) >> Memory::YUZU_PAGEBITS) + 1U; - tracked_entries[start_page_d + i].compressed_physical_ptr = phys_addr; + tracked_entries.GetUnchecked(start_page_d + i).compressed_physical_ptr = phys_addr; InsertCPUBacking(start_page_d + i, new_vaddress, asid); const u32 base_dev = compressed_device_addr[phys_addr - 1U]; const u32 new_dev = static_cast(start_page_d + i); if (base_dev == 0) [[likely]] { - compressed_device_addr[phys_addr - 1U] = new_dev; + compressed_device_addr.GetAndFault(phys_addr - 1U) = new_dev; continue; } u32 start_id = base_dev & MULTI_MASK; if ((base_dev >> MULTI_FLAG_BITS) == 0) { start_id = impl->multi_dev_address.Register(base_dev); - compressed_device_addr[phys_addr - 1U] = MULTI_FLAG | start_id; + compressed_device_addr.GetAndFault(phys_addr - 1U) = MULTI_FLAG | start_id; } impl->multi_dev_address.Register(new_dev, start_id); } @@ -255,24 +246,26 @@ void DeviceMemoryManager::Unmap(DAddr address, size_t size) { size_t num_pages = Common::AlignUp(size, Memory::YUZU_PAGESIZE) >> Memory::YUZU_PAGEBITS; device_inter->InvalidateRegion(address, size); std::scoped_lock lk(mapping_guard); + + tracked_entries.CommitRegion(start_page_d, start_page_d + num_pages); // should already be committed, but just in case for (size_t i = 0; i < num_pages; i++) { - auto phys_addr = tracked_entries[start_page_d + i].compressed_physical_ptr; - tracked_entries[start_page_d + i].compressed_physical_ptr = 0; - tracked_entries[start_page_d + i].cpu_backing_address = 0; + auto& entry = tracked_entries.GetUnchecked(start_page_d + i); + auto phys_addr = entry.compressed_physical_ptr; + entry.compressed_physical_ptr = 0; + entry.cpu_backing_address = 0; if (phys_addr != 0) [[likely]] { - const u32 base_dev = compressed_device_addr[phys_addr - 1U]; + u32& base_dev = compressed_device_addr.GetAndFault(phys_addr - 1U); if ((base_dev >> MULTI_FLAG_BITS) == 0) [[likely]] { - compressed_device_addr[phys_addr - 1] = 0; + base_dev = 0; continue; } const auto [more_entries, new_start] = impl->multi_dev_address.Unregister( static_cast(start_page_d + i), base_dev & MULTI_MASK); if (!more_entries) { - compressed_device_addr[phys_addr - 1] = - impl->multi_dev_address.ReleaseEntry(new_start); + base_dev = impl->multi_dev_address.ReleaseEntry(new_start); continue; } - compressed_device_addr[phys_addr - 1] = new_start | MULTI_FLAG; + base_dev = new_start | MULTI_FLAG; } } t_slot = {}; @@ -285,6 +278,8 @@ void DeviceMemoryManager::TrackContinuityImpl(DAddr address, VAddr virtu size_t num_pages = Common::AlignUp(size, Memory::YUZU_PAGESIZE) >> Memory::YUZU_PAGEBITS; uintptr_t last_ptr = 0; size_t page_count = 1; + + tracked_entries.CommitRegion(start_page_d, start_page_d + num_pages); for (size_t i = num_pages; i > 0; i--) { size_t index = i - 1; const VAddr new_vaddress = virtual_address + index * Memory::YUZU_PAGESIZE; @@ -296,14 +291,14 @@ void DeviceMemoryManager::TrackContinuityImpl(DAddr address, VAddr virtu page_count = 1; } last_ptr = new_ptr; - tracked_entries[start_page_d + index].continuity_tracker = static_cast(page_count); + tracked_entries.GetUnchecked(start_page_d + index).continuity_tracker = static_cast(page_count) - 1; } } template u8* DeviceMemoryManager::GetSpan(const DAddr src_addr, const std::size_t size) { size_t page_index = src_addr >> page_bits; size_t subbits = src_addr & page_mask; - if ((static_cast(tracked_entries[page_index].continuity_tracker) << page_bits) >= size + subbits) { + if ((static_cast(tracked_entries[page_index].continuity_tracker+1) << page_bits) >= size + subbits) { return GetPointer(src_addr); } return nullptr; @@ -313,7 +308,7 @@ template const u8* DeviceMemoryManager::GetSpan(const DAddr src_addr, const std::size_t size) const { size_t page_index = src_addr >> page_bits; size_t subbits = src_addr & page_mask; - if ((static_cast(tracked_entries[page_index].continuity_tracker) << page_bits) >= size + subbits) { + if ((static_cast(tracked_entries[page_index].continuity_tracker+1) << page_bits) >= size + subbits) { return GetPointer(src_addr); } return nullptr; @@ -383,7 +378,7 @@ void DeviceMemoryManager::WalkBlock(DAddr addr, std::size_t size, auto o std::size_t page_index = addr >> Memory::YUZU_PAGEBITS; std::size_t page_offset = addr & Memory::YUZU_PAGEMASK; while (remaining_size) { - const size_t next_pages = std::size_t(tracked_entries[page_index].continuity_tracker); + const size_t next_pages = std::size_t(tracked_entries[page_index].continuity_tracker+1); const std::size_t copy_amount = (std::min)((next_pages << Memory::YUZU_PAGEBITS) - page_offset, remaining_size); const auto current_vaddr = u64((page_index << Memory::YUZU_PAGEBITS) + page_offset); SCOPE_EXIT{ diff --git a/src/core/hle/kernel/k_page_table_base.cpp b/src/core/hle/kernel/k_page_table_base.cpp index a727355a9f..2a0a7d49d5 100644 --- a/src/core/hle/kernel/k_page_table_base.cpp +++ b/src/core/hle/kernel/k_page_table_base.cpp @@ -635,6 +635,36 @@ Result KPageTableBase::CheckMemoryState(const KMemoryInfo& info, KMemoryState st R_SUCCEED(); } +bool KPageTableBase::BeginTraversal(const Common::PageTable &impl, TraversalEntry *out_entry, TraversalContext *out_context, + Common::ProcessAddress address) const { + out_context->next_offset = GetInteger(address); + out_context->next_page = GetInteger(address) >> PageBits; + + return ContinueTraversal(impl, out_entry, out_context); +} + +bool KPageTableBase::ContinueTraversal(const Common::PageTable &impl, TraversalEntry *out_entry, + TraversalContext *context) const { + // Setup invalid defaults. + out_entry->phys_addr = 0; + out_entry->block_size = PageSize; + // Validate that we can read the actual entry. + if (auto const page = context->next_page; page < impl.entries.size()) { + // Validate that the entry is mapped. + if (auto const paddr = impl.entries[page].Pointer(true); paddr != 0) { + // Populate the results and return true + out_entry->phys_addr = GetInteger(m_system.DeviceMemory().GetPhysicalAddr(paddr + context->next_offset)); + context->next_page += 1; + context->next_offset += PageSize; + return true; + } + } + context->next_page += 1; + context->next_offset += PageSize; + // Otherwise return false + return false; +} + Result KPageTableBase::CheckMemoryStateContiguous(size_t* out_blocks_needed, KProcessAddress addr, size_t size, KMemoryState state_mask, KMemoryState state, KMemoryPermission perm_mask, @@ -940,7 +970,7 @@ Result KPageTableBase::QueryMappingImpl(KProcessAddress* out, KPhysicalAddress a size_t tot_size = 0; next_valid = - impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), region_start); + BeginTraversal(impl, std::addressof(next_entry), std::addressof(context), region_start); next_entry.block_size = (next_entry.block_size - (GetInteger(region_start) & (next_entry.block_size - 1))); @@ -976,7 +1006,7 @@ Result KPageTableBase::QueryMappingImpl(KProcessAddress* out, KPhysicalAddress a break; } - next_valid = impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)); + next_valid = ContinueTraversal(impl, std::addressof(next_entry), std::addressof(context)); } // Check the last entry. @@ -1754,7 +1784,7 @@ Result KPageTableBase::MakePageGroup(KPageGroup& pg, KProcessAddress addr, size_ // Begin traversal. TraversalContext context; TraversalEntry next_entry; - R_UNLESS(impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), addr), + R_UNLESS(BeginTraversal(impl, std::addressof(next_entry), std::addressof(context), addr), ResultInvalidCurrentMemory); // Prepare tracking variables. @@ -1764,7 +1794,7 @@ Result KPageTableBase::MakePageGroup(KPageGroup& pg, KProcessAddress addr, size_ // Iterate, adding to group as we go. while (tot_size < size) { - R_UNLESS(impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)), + R_UNLESS(ContinueTraversal(impl, std::addressof(next_entry), std::addressof(context)), ResultInvalidCurrentMemory); if (next_entry.phys_addr != (cur_addr + cur_size)) { @@ -1828,7 +1858,7 @@ bool KPageTableBase::IsValidPageGroup(const KPageGroup& pg, KProcessAddress addr // Begin traversal. TraversalContext context; TraversalEntry next_entry; - if (!impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), addr)) { + if (!BeginTraversal(impl, std::addressof(next_entry), std::addressof(context), addr)) { return false; } @@ -1839,7 +1869,7 @@ bool KPageTableBase::IsValidPageGroup(const KPageGroup& pg, KProcessAddress addr // Iterate, comparing expected to actual. while (tot_size < size) { - if (!impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context))) { + if (!ContinueTraversal(impl, std::addressof(next_entry), std::addressof(context))) { return false; } @@ -1896,7 +1926,7 @@ Result KPageTableBase::GetContiguousMemoryRangeWithState( // Begin a traversal. TraversalContext context; TraversalEntry cur_entry = {.phys_addr = 0, .block_size = 0}; - R_UNLESS(impl.BeginTraversal(std::addressof(cur_entry), std::addressof(context), address), + R_UNLESS(BeginTraversal(impl, std::addressof(cur_entry), std::addressof(context), address), ResultInvalidCurrentMemory); // Traverse until we have enough size or we aren't contiguous any more. @@ -1905,7 +1935,7 @@ Result KPageTableBase::GetContiguousMemoryRangeWithState( for (contig_size = cur_entry.block_size - (GetInteger(phys_address) & (cur_entry.block_size - 1)); contig_size < size; contig_size += cur_entry.block_size) { - if (!impl.ContinueTraversal(std::addressof(cur_entry), std::addressof(context))) { + if (!ContinueTraversal(impl, std::addressof(cur_entry), std::addressof(context))) { break; } if (cur_entry.phys_addr != phys_address + contig_size) { @@ -2334,7 +2364,7 @@ Result KPageTableBase::QueryPhysicalAddress(Svc::lp64::PhysicalMemoryInfo* out, TraversalContext context; TraversalEntry next_entry; bool traverse_valid = - m_impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), virt_addr); + BeginTraversal(m_impl, std::addressof(next_entry), std::addressof(context), virt_addr); R_UNLESS(traverse_valid, ResultInvalidCurrentMemory); // Set tracking variables. @@ -2345,7 +2375,7 @@ Result KPageTableBase::QueryPhysicalAddress(Svc::lp64::PhysicalMemoryInfo* out, while (true) { // Continue the traversal. traverse_valid = - m_impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)); + ContinueTraversal(m_impl, std::addressof(next_entry), std::addressof(context)); if (!traverse_valid) { break; } @@ -2567,7 +2597,7 @@ Result KPageTableBase::UnmapIoRegion(KProcessAddress dst_address, KPhysicalAddre TraversalContext context; TraversalEntry next_entry; ASSERT( - impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), dst_address)); + BeginTraversal(impl, std::addressof(next_entry), std::addressof(context), dst_address)); // Check that the physical region matches. R_UNLESS(next_entry.phys_addr == phys_addr, ResultInvalidMemoryRegion); @@ -2577,7 +2607,7 @@ Result KPageTableBase::UnmapIoRegion(KProcessAddress dst_address, KPhysicalAddre next_entry.block_size - (GetInteger(phys_addr) & (next_entry.block_size - 1)); checked_size < size; checked_size += next_entry.block_size) { // Continue the traversal. - ASSERT(impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context))); + ASSERT(ContinueTraversal(impl, std::addressof(next_entry), std::addressof(context))); // Check that the physical region matches. R_UNLESS(next_entry.phys_addr == phys_addr + checked_size, ResultInvalidMemoryRegion); @@ -3029,7 +3059,7 @@ Result KPageTableBase::InvalidateProcessDataCache(KProcessAddress address, size_ TraversalContext context; TraversalEntry next_entry; bool traverse_valid = - impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), address); + BeginTraversal(impl, std::addressof(next_entry), std::addressof(context), address); R_UNLESS(traverse_valid, ResultInvalidCurrentMemory); // Prepare tracking variables. @@ -3041,7 +3071,7 @@ Result KPageTableBase::InvalidateProcessDataCache(KProcessAddress address, size_ while (tot_size < size) { // Continue the traversal. traverse_valid = - impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)); + ContinueTraversal(impl, std::addressof(next_entry), std::addressof(context)); R_UNLESS(traverse_valid, ResultInvalidCurrentMemory); if (next_entry.phys_addr != (cur_addr + cur_size)) { @@ -3129,7 +3159,7 @@ Result KPageTableBase::ReadDebugMemory(KProcessAddress dst_address, KProcessAddr TraversalContext context; TraversalEntry next_entry; bool traverse_valid = - impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), src_address); + BeginTraversal(impl, std::addressof(next_entry), std::addressof(context), src_address); R_UNLESS(traverse_valid, ResultInvalidCurrentMemory); // Prepare tracking variables. @@ -3167,7 +3197,7 @@ Result KPageTableBase::ReadDebugMemory(KProcessAddress dst_address, KProcessAddr while (tot_size < size) { // Continue the traversal. traverse_valid = - impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)); + ContinueTraversal(impl, std::addressof(next_entry), std::addressof(context)); ASSERT(traverse_valid); if (next_entry.phys_addr != (cur_addr + cur_size)) { @@ -3225,7 +3255,7 @@ Result KPageTableBase::WriteDebugMemory(KProcessAddress dst_address, KProcessAdd TraversalContext context; TraversalEntry next_entry; bool traverse_valid = - impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), dst_address); + BeginTraversal(impl, std::addressof(next_entry), std::addressof(context), dst_address); R_UNLESS(traverse_valid, ResultInvalidCurrentMemory); // Prepare tracking variables. @@ -3267,7 +3297,7 @@ Result KPageTableBase::WriteDebugMemory(KProcessAddress dst_address, KProcessAdd while (tot_size < size) { // Continue the traversal. traverse_valid = - impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)); + ContinueTraversal(impl, std::addressof(next_entry), std::addressof(context)); ASSERT(traverse_valid); if (next_entry.phys_addr != (cur_addr + cur_size)) { @@ -3728,7 +3758,7 @@ Result KPageTableBase::CopyMemoryFromLinearToUser( TraversalContext context; TraversalEntry next_entry; bool traverse_valid = - impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), src_addr); + BeginTraversal(impl, std::addressof(next_entry), std::addressof(context), src_addr); ASSERT(traverse_valid); // Prepare tracking variables. @@ -3768,7 +3798,7 @@ Result KPageTableBase::CopyMemoryFromLinearToUser( while (tot_size < size) { // Continue the traversal. traverse_valid = - impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)); + ContinueTraversal(impl, std::addressof(next_entry), std::addressof(context)); ASSERT(traverse_valid); if (next_entry.phys_addr != (cur_addr + cur_size)) { @@ -3822,7 +3852,7 @@ Result KPageTableBase::CopyMemoryFromLinearToKernel( TraversalContext context; TraversalEntry next_entry; bool traverse_valid = - impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), src_addr); + BeginTraversal(impl, std::addressof(next_entry), std::addressof(context), src_addr); ASSERT(traverse_valid); // Prepare tracking variables. @@ -3845,7 +3875,7 @@ Result KPageTableBase::CopyMemoryFromLinearToKernel( while (tot_size < size) { // Continue the traversal. traverse_valid = - impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)); + ContinueTraversal(impl, std::addressof(next_entry), std::addressof(context)); ASSERT(traverse_valid); if (next_entry.phys_addr != (cur_addr + cur_size)) { @@ -3902,7 +3932,7 @@ Result KPageTableBase::CopyMemoryFromUserToLinear( TraversalContext context; TraversalEntry next_entry; bool traverse_valid = - impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), dst_addr); + BeginTraversal(impl, std::addressof(next_entry), std::addressof(context), dst_addr); ASSERT(traverse_valid); // Prepare tracking variables. @@ -3941,7 +3971,7 @@ Result KPageTableBase::CopyMemoryFromUserToLinear( while (tot_size < size) { // Continue the traversal. traverse_valid = - impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)); + ContinueTraversal(impl, std::addressof(next_entry), std::addressof(context)); ASSERT(traverse_valid); if (next_entry.phys_addr != (cur_addr + cur_size)) { @@ -3997,7 +4027,7 @@ Result KPageTableBase::CopyMemoryFromKernelToLinear(KProcessAddress dst_addr, si TraversalContext context; TraversalEntry next_entry; bool traverse_valid = - impl.BeginTraversal(std::addressof(next_entry), std::addressof(context), dst_addr); + BeginTraversal(impl, std::addressof(next_entry), std::addressof(context), dst_addr); ASSERT(traverse_valid); // Prepare tracking variables. @@ -4020,7 +4050,7 @@ Result KPageTableBase::CopyMemoryFromKernelToLinear(KProcessAddress dst_addr, si while (tot_size < size) { // Continue the traversal. traverse_valid = - impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)); + ContinueTraversal(impl, std::addressof(next_entry), std::addressof(context)); ASSERT(traverse_valid); if (next_entry.phys_addr != (cur_addr + cur_size)) { @@ -4089,10 +4119,10 @@ Result KPageTableBase::CopyMemoryFromHeapToHeap( bool traverse_valid; // Begin traversal. - traverse_valid = src_impl.BeginTraversal(std::addressof(src_next_entry), + traverse_valid = BeginTraversal(src_impl, std::addressof(src_next_entry), std::addressof(src_context), src_addr); ASSERT(traverse_valid); - traverse_valid = dst_impl.BeginTraversal(std::addressof(dst_next_entry), + traverse_valid = BeginTraversal(dst_impl, std::addressof(dst_next_entry), std::addressof(dst_context), dst_addr); ASSERT(traverse_valid); @@ -4127,7 +4157,7 @@ Result KPageTableBase::CopyMemoryFromHeapToHeap( if (ofs + cur_copy_size != size) { if (cur_src_addr + cur_min_size == cur_src_block_addr + cur_src_size) { // Continue the src traversal. - traverse_valid = src_impl.ContinueTraversal(std::addressof(src_next_entry), + traverse_valid = ContinueTraversal(src_impl, std::addressof(src_next_entry), std::addressof(src_context)); ASSERT(traverse_valid); @@ -4138,7 +4168,7 @@ Result KPageTableBase::CopyMemoryFromHeapToHeap( if (cur_dst_addr + cur_min_size == dst_next_entry.phys_addr + dst_next_entry.block_size) { // Continue the dst traversal. - traverse_valid = dst_impl.ContinueTraversal(std::addressof(dst_next_entry), + traverse_valid = ContinueTraversal(dst_impl, std::addressof(dst_next_entry), std::addressof(dst_context)); ASSERT(traverse_valid); @@ -4223,10 +4253,10 @@ Result KPageTableBase::CopyMemoryFromHeapToHeapWithoutCheckDestination( bool traverse_valid; // Begin traversal. - traverse_valid = src_impl.BeginTraversal(std::addressof(src_next_entry), + traverse_valid = BeginTraversal(src_impl, std::addressof(src_next_entry), std::addressof(src_context), src_addr); ASSERT(traverse_valid); - traverse_valid = dst_impl.BeginTraversal(std::addressof(dst_next_entry), + traverse_valid = BeginTraversal(dst_impl, std::addressof(dst_next_entry), std::addressof(dst_context), dst_addr); ASSERT(traverse_valid); @@ -4261,7 +4291,7 @@ Result KPageTableBase::CopyMemoryFromHeapToHeapWithoutCheckDestination( if (ofs + cur_copy_size != size) { if (cur_src_addr + cur_min_size == cur_src_block_addr + cur_src_size) { // Continue the src traversal. - traverse_valid = src_impl.ContinueTraversal(std::addressof(src_next_entry), + traverse_valid = ContinueTraversal(src_impl, std::addressof(src_next_entry), std::addressof(src_context)); ASSERT(traverse_valid); @@ -4272,7 +4302,7 @@ Result KPageTableBase::CopyMemoryFromHeapToHeapWithoutCheckDestination( if (cur_dst_addr + cur_min_size == dst_next_entry.phys_addr + dst_next_entry.block_size) { // Continue the dst traversal. - traverse_valid = dst_impl.ContinueTraversal(std::addressof(dst_next_entry), + traverse_valid = ContinueTraversal(dst_impl, std::addressof(dst_next_entry), std::addressof(dst_context)); ASSERT(traverse_valid); @@ -4547,7 +4577,7 @@ Result KPageTableBase::SetupForIpcServer(KProcessAddress* out_addr, size_t size, // Begin traversal. TraversalContext context; TraversalEntry next_entry; - bool traverse_valid = src_impl.BeginTraversal(std::addressof(next_entry), + bool traverse_valid = BeginTraversal(src_impl, std::addressof(next_entry), std::addressof(context), aligned_src_start); ASSERT(traverse_valid); @@ -4597,7 +4627,7 @@ Result KPageTableBase::SetupForIpcServer(KProcessAddress* out_addr, size_t size, // If the block's size was one page, we may need to continue traversal. if (cur_block_size == 0 && aligned_src_size > PageSize) { traverse_valid = - src_impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)); + ContinueTraversal(src_impl, std::addressof(next_entry), std::addressof(context)); ASSERT(traverse_valid); cur_block_addr = next_entry.phys_addr; @@ -4610,7 +4640,7 @@ Result KPageTableBase::SetupForIpcServer(KProcessAddress* out_addr, size_t size, while (aligned_src_start + tot_block_size < mapping_src_end) { // Continue the traversal. traverse_valid = - src_impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)); + ContinueTraversal(src_impl, std::addressof(next_entry), std::addressof(context)); ASSERT(traverse_valid); // Process the block. @@ -4653,7 +4683,7 @@ Result KPageTableBase::SetupForIpcServer(KProcessAddress* out_addr, size_t size, if (mapped_block_end + cur_block_size < aligned_src_end && cur_block_size == last_block_size) { traverse_valid = - src_impl.ContinueTraversal(std::addressof(next_entry), std::addressof(context)); + ContinueTraversal(src_impl, std::addressof(next_entry), std::addressof(context)); ASSERT(traverse_valid); cur_block_addr = next_entry.phys_addr; @@ -5601,7 +5631,7 @@ Result KPageTableBase::UnmapProcessMemory(KProcessAddress dst_address, size_t si ContiguousRangeInfo(KPageTableBase& pt, KProcessAddress address, size_t size) : m_pt(pt), m_remaining_size(size) { // Begin a traversal. - ASSERT(m_pt.GetImpl().BeginTraversal(std::addressof(m_entry), + ASSERT(m_pt.BeginTraversal(m_pt.GetImpl(), std::addressof(m_entry), std::addressof(m_context), address)); // Setup tracking fields. @@ -5632,7 +5662,7 @@ Result KPageTableBase::UnmapProcessMemory(KProcessAddress dst_address, size_t si void DetermineContiguousBlockExtents() { // Continue traversing until we're not contiguous, or we have enough. while (m_cur_size < m_remaining_size) { - ASSERT(m_pt.GetImpl().ContinueTraversal(std::addressof(m_entry), + ASSERT(m_pt.ContinueTraversal(m_pt.GetImpl(), std::addressof(m_entry), std::addressof(m_context))); // If we're not contiguous, we're done. diff --git a/src/core/hle/kernel/k_page_table_base.h b/src/core/hle/kernel/k_page_table_base.h index 1d4fa85f04..0c222910fc 100644 --- a/src/core/hle/kernel/k_page_table_base.h +++ b/src/core/hle/kernel/k_page_table_base.h @@ -370,6 +370,10 @@ private: size_t num_pages, size_t alignment, size_t offset, size_t guard_pages) const; + bool BeginTraversal(const Common::PageTable& impl, TraversalEntry* out_entry, TraversalContext* out_context, + Common::ProcessAddress address) const; + bool ContinueTraversal(const Common::PageTable& impl, TraversalEntry* out_entry, TraversalContext* context) const; + Result CheckMemoryStateContiguous(size_t* out_blocks_needed, KProcessAddress addr, size_t size, KMemoryState state_mask, KMemoryState state, KMemoryPermission perm_mask, KMemoryPermission perm, @@ -474,7 +478,14 @@ private: // Validate pre-conditions. ASSERT(this->IsLockedByCurrentThread()); - return this->GetImpl().GetPhysicalAddress(out, virt_addr); + if (virt_addr > (1ULL << m_address_space_width)) { + return false; + } + + *out = m_system.DeviceMemory().GetPhysicalAddr( + this->GetImpl().entries[GetInteger(virt_addr) >> PageBits].Pointer(true) + GetInteger(virt_addr)); + + return true; } public: diff --git a/src/core/memory.cpp b/src/core/memory.cpp index a5e6b8592c..837016de1d 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -101,8 +101,10 @@ struct Memory::Impl { } u64 protect_bytes = 0, protect_begin = 0; + + current_page_table->entries.CommitRegion(vaddr >> YUZU_PAGEBITS, (vaddr + size) >> YUZU_PAGEBITS); for (u64 addr = vaddr; addr < vaddr + size; addr += YUZU_PAGESIZE) { - const Common::PageType page_type = current_page_table->entries[addr >> YUZU_PAGEBITS].ptr.Type(); + const Common::PageType page_type = current_page_table->entries.GetUnchecked(addr >> YUZU_PAGEBITS).Type(); switch (page_type) { case Common::PageType::RasterizerCachedMemory: if (protect_bytes > 0) { @@ -123,16 +125,14 @@ struct Memory::Impl { } [[nodiscard]] u8* GetPointerFromRasterizerCachedMemory(u64 vaddr) const { - Common::PhysicalAddress const paddr = current_page_table->entries[vaddr >> YUZU_PAGEBITS].addr; - if (paddr) - return system.DeviceMemory().GetPointer(paddr + vaddr); + if (u64 paddr = current_page_table->entries[vaddr >> YUZU_PAGEBITS].Pointer(true); paddr) + return reinterpret_cast(paddr) + vaddr; return {}; } [[nodiscard]] u8* GetPointerFromDebugMemory(u64 vaddr) const { - const Common::PhysicalAddress paddr = current_page_table->entries[vaddr >> YUZU_PAGEBITS].addr; - if (paddr != 0) - return system.DeviceMemory().GetPointer(paddr + vaddr); + if (u64 paddr = current_page_table->entries[vaddr >> YUZU_PAGEBITS].Pointer(true); paddr) + return reinterpret_cast(paddr) + vaddr; return {}; } @@ -243,10 +243,12 @@ struct Memory::Impl { std::size_t page_index = addr >> YUZU_PAGEBITS; std::size_t page_offset = addr & YUZU_PAGEMASK; bool user_accessible = true; + + current_page_table->entries.CommitRegion(page_index, page_index + (size >> YUZU_PAGEBITS) + 1); while (remaining_size != 0) { const std::size_t copy_amount = (std::min)(std::size_t(YUZU_PAGESIZE) - page_offset, remaining_size); const auto current_vaddr = u64((page_index << YUZU_PAGEBITS) + page_offset); - const auto [pointer, type] = current_page_table->entries[page_index].ptr.PointerType(); + const auto [pointer, type, _] = current_page_table->entries.GetUnchecked(page_index).PointerTypeBlock(); switch (type) { case Common::PageType::Unmapped: { user_accessible = false; @@ -297,10 +299,10 @@ struct Memory::Impl { } [[nodiscard]] inline const u8* GetSpan(const VAddr addr, const std::size_t size) const noexcept { - return (current_page_table->entries[addr >> YUZU_PAGEBITS].block == current_page_table->entries[(addr + size) >> YUZU_PAGEBITS].block) ? GetPointerSilent(addr) : nullptr; + return (current_page_table->entries[addr >> YUZU_PAGEBITS].Block() == current_page_table->entries[(addr + size) >> YUZU_PAGEBITS].Block()) ? GetPointerSilent(addr) : nullptr; } [[nodiscard]] inline u8* GetSpan(const VAddr addr, const std::size_t size) noexcept { - return (current_page_table->entries[addr >> YUZU_PAGEBITS].block == current_page_table->entries[(addr + size) >> YUZU_PAGEBITS].block) ? GetPointerSilent(addr) : nullptr; + return (current_page_table->entries[addr >> YUZU_PAGEBITS].Block() == current_page_table->entries[(addr + size) >> YUZU_PAGEBITS].Block()) ? GetPointerSilent(addr) : nullptr; } bool WriteBlockImpl(const Common::ProcessAddress addr, const void* buffer, const std::size_t size, bool unsafe) { @@ -404,11 +406,14 @@ struct Memory::Impl { // The region is at a granularity of CPU pages. const u64 num_pages = ((vaddr + size - 1) >> YUZU_PAGEBITS) - (vaddr >> YUZU_PAGEBITS) + 1; + + current_page_table->entries.CommitRegion(vaddr >> YUZU_PAGEBITS, (vaddr >> YUZU_PAGEBITS) + num_pages); for (u64 i = 0; i < num_pages; ++i, vaddr += YUZU_PAGESIZE) { - const Common::PageType page_type = current_page_table->entries[vaddr >> YUZU_PAGEBITS].ptr.Type(); + auto& entry = current_page_table->entries.GetUnchecked(vaddr >> YUZU_PAGEBITS); + const auto [pointer, type, block] = entry.PointerTypeBlock(true); if (debug) { // Switch page type to debug if now debug - switch (page_type) { + switch (type) { case Common::PageType::Unmapped: ASSERT(false && "Attempted to mark unmapped pages as debug"); break; @@ -417,14 +422,14 @@ struct Memory::Impl { // Page is already marked. break; case Common::PageType::Memory: - current_page_table->entries[vaddr >> YUZU_PAGEBITS].ptr.Store(0, Common::PageType::DebugMemory); + entry.MarkDebug(pointer, block); break; default: UNREACHABLE(); } } else { // Switch page type to non-debug if now non-debug - switch (page_type) { + switch (type) { case Common::PageType::Unmapped: ASSERT(false && "Attempted to mark unmapped pages as non-debug"); break; @@ -433,8 +438,7 @@ struct Memory::Impl { // Don't mess with already non-debug or rasterizer memory. break; case Common::PageType::DebugMemory: { - u8* const pointer = GetPointerFromDebugMemory(vaddr & ~YUZU_PAGEMASK); - current_page_table->entries[vaddr >> YUZU_PAGEBITS].ptr.Store(uintptr_t(pointer) - (vaddr & ~YUZU_PAGEMASK), Common::PageType::Memory); + entry.Store(false, Common::PageType::Memory, block, pointer); break; } default: @@ -466,8 +470,10 @@ struct Memory::Impl { // is different). This assumes the specified GPU address region is contiguous as well. const u64 num_pages = ((vaddr + size - 1) >> YUZU_PAGEBITS) - (vaddr >> YUZU_PAGEBITS) + 1; + current_page_table->entries.CommitRegion(vaddr >> YUZU_PAGEBITS, (vaddr >> YUZU_PAGEBITS) + num_pages); for (u64 i = 0; i < num_pages; ++i, vaddr += YUZU_PAGESIZE) { - const Common::PageType page_type= current_page_table->entries[vaddr >> YUZU_PAGEBITS].ptr.Type(); + auto& entry = current_page_table->entries.GetUnchecked(vaddr >> YUZU_PAGEBITS); + const Common::PageType page_type = entry.Type(); if (cached) { // Switch page type to cached if now cached switch (page_type) { @@ -477,7 +483,7 @@ struct Memory::Impl { break; case Common::PageType::DebugMemory: case Common::PageType::Memory: - current_page_table->entries[vaddr >> YUZU_PAGEBITS].ptr.Store(0, Common::PageType::RasterizerCachedMemory); + entry.MarkRasterizerCached(); break; case Common::PageType::RasterizerCachedMemory: // There can be more than one GPU region mapped per CPU region, so it's common @@ -499,13 +505,13 @@ struct Memory::Impl { // that this area is already unmarked as cached. break; case Common::PageType::RasterizerCachedMemory: { - if (u8* const pointer = GetPointerFromRasterizerCachedMemory(vaddr & ~YUZU_PAGEMASK); pointer == nullptr) { + if (auto [ptr, _, block] = entry.PointerTypeBlock(true); ptr == 0) { // It's possible that this function has been called while updating the // pagetable after unmapping a VMA. In that case the underlying VMA will no // longer exist, and we should just leave the pagetable entry blank. - current_page_table->entries[vaddr >> YUZU_PAGEBITS].ptr.Store(0, Common::PageType::Unmapped); + entry.Store(false, Common::PageType::Unmapped, block, 0); } else { - current_page_table->entries[vaddr >> YUZU_PAGEBITS].ptr.Store(uintptr_t(pointer) - (vaddr & ~YUZU_PAGEMASK), Common::PageType::Memory); + entry.Store(false, Common::PageType::Memory, block, ptr); } break; } @@ -539,22 +545,18 @@ struct Memory::Impl { ASSERT_MSG(type != Common::PageType::Memory, "Mapping memory page without a pointer @ {:016x}", base * YUZU_PAGESIZE); - while (base != end) { - page_table.entries[base].ptr.Store(0, type); - page_table.entries[base].addr = 0; - page_table.entries[base].block = 0; - base += 1; - } + page_table.entries.ZeroRegion(base, end); } else { - auto orig_base = base; - while (base != end) { - auto host_ptr = uintptr_t(system.DeviceMemory().GetPointer(target)) - (base << YUZU_PAGEBITS); - auto backing = GetInteger(target) - (base << YUZU_PAGEBITS); - page_table.entries[base].ptr.Store(host_ptr, type); - page_table.entries[base].addr = backing; - page_table.entries[base].block = orig_base << YUZU_PAGEBITS; + auto current_block = block_count.fetch_add(1, std::memory_order_relaxed); + ASSERT(current_block != 65535); - ASSERT_MSG(page_table.entries[base].ptr.Pointer(), + page_table.entries.CommitRegion(base, end); + while (base != end) { + auto host_ptr = reinterpret_cast(system.DeviceMemory().GetPointer(target)) - (base << YUZU_PAGEBITS);; + auto& entry = page_table.entries.GetUnchecked(base); + + entry.Store(false, type, current_block, host_ptr); + ASSERT_MSG(page_table.entries[base].Pointer(), "memory mapping base yield a nullptr within the table"); base += 1; @@ -569,11 +571,11 @@ struct Memory::Impl { vaddr &= 0xffffffffffffULL; if (AddressSpaceContains(*current_page_table, vaddr, 1)) [[likely]] { // Avoid adding any extra logic to this fast-path block - const uintptr_t raw_pointer = current_page_table->entries[vaddr >> YUZU_PAGEBITS].ptr.Raw(); - if (const uintptr_t pointer = Common::PageTable::PageInfo::ExtractPointer(raw_pointer)) [[likely]] { + const auto raw = current_page_table->entries[vaddr >> YUZU_PAGEBITS].Raw(); + if (auto pointer = Common::PageTable::PageEntryData::ExtractPointer(raw); pointer) [[likely]] { return reinterpret_cast(pointer + vaddr); } else { - switch (Common::PageTable::PageInfo::ExtractType(raw_pointer)) { + switch (static_cast(raw.type)) { case Common::PageType::Memory: ASSERT_MSG(false, "Mapped memory page without a pointer @ {:#016x}", vaddr); return nullptr; @@ -773,6 +775,7 @@ struct Memory::Impl { #else Common::HostMemory* host_buffer{}; #endif + std::atomic block_count = 0; }; Memory::Memory(Core::System& system_) : system{system_} { @@ -811,7 +814,7 @@ bool Memory::IsValidVirtualAddress(const Common::ProcessAddress vaddr) const { if (page >= page_table.entries.size()) { return false; } - const auto [pointer, type] = page_table.entries[page].ptr.PointerType(); + const auto [pointer, type, _] = page_table.entries[page].PointerTypeBlock(); return pointer != 0 || type == Common::PageType::RasterizerCachedMemory || type == Common::PageType::DebugMemory; } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp index da51220e9c..8b6ec2506e 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp @@ -371,8 +371,10 @@ EmitConfig A32AddressSpace::GetEmitConfig() { .page_table_pointer = std::bit_cast(conf.page_table), .page_table_address_space_bits = 32, - .page_table_pointer_mask_bits = conf.page_table_pointer_mask_bits, + .page_table_pointer_mask = conf.page_table_pointer_mask, .page_table_log2_stride = conf.page_table_log2_stride, + .page_table_marked_bit = conf.page_table_marked_bit, + .page_table_sign_extension = conf.page_table_sign_extension, .silently_mirror_page_table = true, .absolute_offset_page_table = conf.absolute_offset_page_table, .detect_misaligned_access_via_page_table = conf.detect_misaligned_access_via_page_table, diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp index 2c71ffe282..2dbb7d2e1d 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp @@ -545,8 +545,10 @@ EmitConfig A64AddressSpace::GetEmitConfig() { .page_table_pointer = std::bit_cast(conf.page_table), .page_table_address_space_bits = conf.page_table_address_space_bits, - .page_table_pointer_mask_bits = conf.page_table_pointer_mask_bits, + .page_table_pointer_mask = conf.page_table_pointer_mask, .page_table_log2_stride = conf.page_table_log2_stride, + .page_table_marked_bit = conf.page_table_marked_bit, + .page_table_sign_extension = conf.page_table_sign_extension, .silently_mirror_page_table = conf.silently_mirror_page_table, .absolute_offset_page_table = conf.absolute_offset_page_table, .detect_misaligned_access_via_page_table = conf.detect_misaligned_access_via_page_table, diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64.h b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64.h index f2c89bbfc0..693f71ea39 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64.h @@ -128,8 +128,10 @@ struct EmitConfig { // Page table u64 page_table_pointer; std::size_t page_table_address_space_bits; - int page_table_pointer_mask_bits; + u64 page_table_pointer_mask; std::size_t page_table_log2_stride; + std::optional page_table_marked_bit; + std::optional page_table_sign_extension; bool silently_mirror_page_table; bool absolute_offset_page_table; u8 detect_misaligned_access_via_page_table; diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp index 143244d60b..1f758a190a 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp @@ -273,9 +273,18 @@ std::pair InlinePageTableEmitVAddrLookup(oaknut::Cod // load x0 = *<(u8*)pagetable + index> code.LDR(Xscratch0, Xpagetable, Xscratch0); - if (ctx.conf.page_table_pointer_mask_bits != 0) { - const u64 mask = u64(~u64(0)) << ctx.conf.page_table_pointer_mask_bits; - code.AND(Xscratch0, Xscratch0, mask); + if (ctx.conf.page_table_marked_bit) { + // check for marked bit + code.TBNZ(Xscratch0, *ctx.conf.page_table_marked_bit, *fallback); + } + + if (ctx.conf.page_table_pointer_mask != 0) { + code.AND(Xscratch0, Xscratch0, ctx.conf.page_table_pointer_mask); + } + + // TODO: combine this with page_table_pointer_mask + if (ctx.conf.page_table_sign_extension) { + code.SBFM(Xscratch0, Xscratch0, 0, *ctx.conf.page_table_sign_extension); } code.CBZ(Xscratch0, *fallback); diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h index 3ac078f1d7..9686e4fc04 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h @@ -9,6 +9,7 @@ #pragma once #include +#include #include "dynarmic/backend/x64/xbyak.h" #include "dynarmic/backend/x64/a32_emit_x64.h" @@ -78,27 +79,40 @@ Xbyak::RegExp EmitVAddrLookup(BlockOfCode& code, EmitContext& ctx, size_t bitsiz template<> [[maybe_unused]] Xbyak::RegExp EmitVAddrLookup(BlockOfCode& code, A32EmitContext& ctx, size_t bitsize, Xbyak::Label& abort, Xbyak::Reg64 vaddr) { const Xbyak::Reg64 page = ctx.reg_alloc.ScratchGpr(code); - const Xbyak::Reg32 tmp = ctx.conf.absolute_offset_page_table ? page.cvt32() : ctx.reg_alloc.ScratchGpr(code).cvt32(); + const Xbyak::Reg64 tmp = ctx.conf.absolute_offset_page_table && ctx.conf.page_table_pointer_mask == 0 ? page : ctx.reg_alloc.ScratchGpr(code); - EmitDetectMisalignedVAddr(code, ctx, bitsize, abort, vaddr, tmp.cvt64()); + EmitDetectMisalignedVAddr(code, ctx, bitsize, abort, vaddr, tmp); - // TODO: This code assumes vaddr has been zext from 32-bits to 64-bits. - - code.mov(tmp, vaddr.cvt32()); + code.mov(tmp, vaddr); code.shr(tmp, int(page_table_const_bits)); code.shl(tmp, int(ctx.conf.page_table_log2_stride)); code.mov(page, qword[r14 + tmp.cvt64()]); - if (ctx.conf.page_table_pointer_mask_bits == 0) { + + // check for marked bit, use as unmapped if marked + if (ctx.conf.page_table_marked_bit) { + code.bt(page, *ctx.conf.page_table_marked_bit); + code.jc(abort, code.T_NEAR); + } + // mask away attributes + if (ctx.conf.page_table_pointer_mask == 0) { code.test(page, page); + } else if (std::in_range(ctx.conf.page_table_pointer_mask)) { + code.and_(page, ctx.conf.page_table_pointer_mask); } else { - code.and_(page, ~u32(0) << ctx.conf.page_table_pointer_mask_bits); + code.mov(tmp, ctx.conf.page_table_pointer_mask); + code.and_(page, tmp); } + if (ctx.conf.page_table_sign_extension) { + code.shl(page, *ctx.conf.page_table_sign_extension); + code.sar(page, *ctx.conf.page_table_sign_extension); + } + code.jz(abort, code.T_NEAR); if (ctx.conf.absolute_offset_page_table) { return page + vaddr; } - code.mov(tmp, vaddr.cvt32()); - code.and_(tmp, static_cast(page_table_const_mask)); + code.mov(tmp, vaddr); + code.and_(tmp, u32(page_table_const_mask)); return page + tmp.cvt64(); } @@ -108,7 +122,7 @@ template<> const size_t unused_top_bits = 64 - ctx.conf.page_table_address_space_bits; const Xbyak::Reg64 page = ctx.reg_alloc.ScratchGpr(code); - const Xbyak::Reg64 tmp = ctx.conf.absolute_offset_page_table ? page : ctx.reg_alloc.ScratchGpr(code); + const Xbyak::Reg64 tmp = ctx.conf.absolute_offset_page_table && ctx.conf.page_table_pointer_mask == 0 ? page : ctx.reg_alloc.ScratchGpr(code); EmitDetectMisalignedVAddr(code, ctx, bitsize, abort, vaddr, tmp); @@ -143,11 +157,26 @@ template<> code.shl(tmp, int(ctx.conf.page_table_log2_stride)); code.mov(page, qword[r14 + tmp]); - if (ctx.conf.page_table_pointer_mask_bits == 0) { - code.test(page, page); - } else { - code.and_(page, ~u32(0) << ctx.conf.page_table_pointer_mask_bits); + + // check for marked bit, use as unmapped if marked + if (ctx.conf.page_table_marked_bit) { + code.bt(page, *ctx.conf.page_table_marked_bit); + code.jc(abort, code.T_NEAR); } + // mask away attributes + if (ctx.conf.page_table_pointer_mask == 0) { + code.test(page, page); + } else if (std::in_range(ctx.conf.page_table_pointer_mask)) { + code.and_(page, ctx.conf.page_table_pointer_mask); + } else { + code.mov(tmp, ctx.conf.page_table_pointer_mask); + code.and_(page, tmp); + } + if (ctx.conf.page_table_sign_extension) { + code.shl(page, *ctx.conf.page_table_sign_extension); + code.sar(page, *ctx.conf.page_table_sign_extension); + } + code.jz(abort, code.T_NEAR); if (ctx.conf.absolute_offset_page_table) { return page + vaddr; diff --git a/src/dynarmic/src/dynarmic/interface/A32/config.h b/src/dynarmic/src/dynarmic/interface/A32/config.h index 5a97fb69f3..b93b116164 100644 --- a/src/dynarmic/src/dynarmic/interface/A32/config.h +++ b/src/dynarmic/src/dynarmic/interface/A32/config.h @@ -159,14 +159,23 @@ struct UserConfig { /// Maximum size is limited by the maximum length of a x86_64 / arm64 jump. std::uint32_t code_cache_size = 128 * 1024 * 1024; // bytes - /// Masks out the first N bits in host pointers from the page table. + /// Applies a bit mask to the bits in host pointers from the page table. /// The intention behind this is to allow users of Dynarmic to pack attributes in the /// same integer and update the pointer attribute pair atomically. - /// If the configured value is 3, all pointers will be forcefully aligned to 8 bytes. - std::int32_t page_table_pointer_mask_bits = 0; + /// If the configured value is ~(0b111ULL), all pointers will be forcefully aligned to 8 bytes. + std::uint64_t page_table_pointer_mask = 0; - // Log2 of the size per page entry, value should be either 3 or 4 - std::size_t page_table_log2_stride = 3; + /// Log2 of the size per page entry, value should be either 3 or 4 + std::uint32_t page_table_log2_stride = 3; + + /// Setting this value has Dynarmic check the specified bit of the page pointer provided by page table. + /// If the bit is set to 1, Dynarmic will treat it as unmapped. + /// This bit should be included as part of `page_table_pointer_mask_bits`. + std::optional page_table_marked_bit = std::nullopt; + + /// If this value is set, Dynarmic will sign extend the page table pointer by this bit. + /// Useful for compacting bits into the page table and should be used as part of `page_table_pointer_mask`. + std::optional page_table_sign_extension = std::nullopt; /// Select the architecture version to use. /// There are minor behavioural differences between versions. diff --git a/src/dynarmic/src/dynarmic/interface/A64/config.h b/src/dynarmic/src/dynarmic/interface/A64/config.h index 83c1593fd8..818aed73e7 100644 --- a/src/dynarmic/src/dynarmic/interface/A64/config.h +++ b/src/dynarmic/src/dynarmic/interface/A64/config.h @@ -173,14 +173,23 @@ struct UserConfig { /// This is only used if page_table is not nullptr. std::uint32_t page_table_address_space_bits = 36; - /// Masks out the first N bits in host pointers from the page table. + /// Applies a bit mask to the bits in host pointers from the page table. /// The intention behind this is to allow users of Dynarmic to pack attributes in the /// same integer and update the pointer attribute pair atomically. - /// If the configured value is 3, all pointers will be forcefully aligned to 8 bytes. - std::int32_t page_table_pointer_mask_bits = 0; + /// If the configured value is ~(0b111ULL), all pointers will be forcefully aligned to 8 bytes. + std::uint64_t page_table_pointer_mask = 0; - // Log2 of the size per page entry, value should be either 3 or 4 - std::size_t page_table_log2_stride = 3; + /// Log2 of the size per page entry, value should be either 3 or 4 + std::uint32_t page_table_log2_stride = 3; + + /// Setting this value has Dynarmic check the specified bit of the page pointer provided by page table. + /// If the bit is set to 1, Dynarmic will treat it as unmapped. + /// This bit should be included as part of `page_table_pointer_mask`. + std::optional page_table_marked_bit = std::nullopt; + + /// If this value is set, Dynarmic will sign extend the page table pointer by this bit. + /// Useful for compacting bits into the page table and should be used as part of `page_table_pointer_mask`. + std::optional page_table_sign_extension = std::nullopt; /// Counter-timer frequency register. The value of the register is not interpreted by /// dynarmic. diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index b9b136f6b8..d5838a387d 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp @@ -46,8 +46,8 @@ MemoryManager::MemoryManager(Core::System& system_, MaxwellDeviceMemoryManager& page_table_mask = page_table_size - 1; big_page_table_mask = big_page_table_size - 1; + big_page_table_dev.ResizeAndClear(big_page_table_size); big_entries.resize(big_page_table_size / 32, 0); - big_page_table_dev.resize(big_page_table_size); big_page_continuous.resize(big_page_table_size / continuous_bits, 0); entries.resize(page_table_size / 32, 0); } @@ -143,7 +143,7 @@ GPUVAddr MemoryManager::BigPageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] DAddr const DAddr current_dev_addr = dev_addr + offset; const auto index = PageEntryIndex(current_gpu_addr, true); const u32 sub_value = static_cast(current_dev_addr >> cpu_page_bits); - big_page_table_dev[index] = sub_value; + big_page_table_dev.Set(index, sub_value); const bool is_continuous = ([&] { uintptr_t base_ptr{ reinterpret_cast(memory.GetPointer(current_dev_addr))}; diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index f9fddd177a..08978567d2 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h @@ -17,7 +17,7 @@ #include "common/multi_level_page_table.h" #include "common/range_map.h" #include "common/scratch_buffer.h" -#include "common/virtual_buffer.h" +#include "common/sparse_large_vector.h" #include "video_core/invalidation_accumulator.h" #include "video_core/cache_types.h" #include "video_core/host1x/gpu_device_memory_manager.h" @@ -214,7 +214,7 @@ private: Common::MultiLevelPageTable page_table; Common::RangeMap kind_map; - Common::VirtualBuffer big_page_table_dev; + Common::SparseLargeVector big_page_table_dev; std::vector big_page_continuous; boost::container::small_vector, 32> page_stash{}; From ed566919f468e45ecb56e4e61185d98142a2cd1c Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Thu, 10 Sep 2026 15:14:02 +0200 Subject: [PATCH 024/128] [vulkan, android] Add feature of post-processing shaders on Android (#4348) Very self-explanatory; implementation of the feature for post-processing shaders for Android (at least for now); will allow users to enhance the graphic quality of video games based on the use of multiple shaders adjustable, presets and more, inspired on the PPSSPP implementation, this feature adds 22 customizable shaders (1 pass) that lives on the overlay of the screen, which means that aside of the capability to chain multiple shaders on the screen, this doesn't have depths (pixel/ depth z-buffer) so it ensures the performance with it's use. Few shaders were a faithful port from PPSSPP with their respective attribution on the shader headers for their respective owners; and there are adaptations from public references/ cinematographic (Anime4K) and the rest are my own addition. _Special Credits:_ 1.- PPSSPP Team for their contribution on the public references for shaders: Henrik Rydgard, ShadX, SimoneT, KillaMaaki and guest(r). 2.- Niklas Haas. 3.- bloc97. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4348 Reviewed-by: lizzie Reviewed-by: Maufeat --- .patch/reshade/0001-from-chars-fallback.patch | 11 + CMakeLists.txt | 2 + cpmfile.json | 8 + dist/post_presets/Anime.fxp | 3 + dist/post_presets/Cinematic.fxp | 3 + dist/post_presets/Clean.fxp | 3 + dist/post_presets/Dreamy.fxp | 3 + dist/post_presets/Retro.fxp | 3 + dist/post_presets/Vivid.fxp | 3 + dist/post_shaders/Bloom.fx | 70 ++ dist/post_shaders/Blur.fx | 87 ++ dist/post_shaders/CRT.fx | 74 ++ dist/post_shaders/Cartoon.fx | 79 ++ dist/post_shaders/CartoonSoft.fx | 100 ++ dist/post_shaders/CelShading.fx | 120 +++ dist/post_shaders/ChromaticAberration.fx | 53 ++ dist/post_shaders/ColorGrade.fx | 64 ++ dist/post_shaders/Deband.fx | 91 ++ dist/post_shaders/Denoise.fx | 83 ++ dist/post_shaders/FilmGrain.fx | 65 ++ dist/post_shaders/FilmicCurve.fx | 60 ++ dist/post_shaders/LensDistortion.fx | 53 ++ dist/post_shaders/Levels.fx | 66 ++ dist/post_shaders/MotionBlur.fx | 88 ++ dist/post_shaders/NaturalColors.fx | 60 ++ dist/post_shaders/Reflections.fx | 90 ++ dist/post_shaders/Scanlines.fx | 66 ++ dist/post_shaders/Sharpen.fx | 43 + dist/post_shaders/SplitToning.fx | 75 ++ dist/post_shaders/Vignette.fx | 52 + dist/post_shaders/WhiteBalance.fx | 76 ++ externals/CMakeLists.txt | 44 + .../yuzu/yuzu_emu/dialogs/QuickSettings.kt | 441 +++++++++ .../settings/model/FxPresetNameSetting.kt | 36 + .../settings/model/FxUniformSetting.kt | 67 ++ .../features/settings/model/Settings.kt | 1 + .../features/settings/model/StringSetting.kt | 1 + .../settings/model/view/FxButtonSetting.kt | 13 + .../settings/model/view/FxPresetSetting.kt | 14 + .../model/view/FxShaderCardSetting.kt | 19 + .../settings/model/view/FxToolbarSetting.kt | 19 + .../settings/model/view/SettingsItem.kt | 4 + .../features/settings/ui/SettingsAdapter.kt | 32 + .../settings/ui/SettingsFragmentPresenter.kt | 214 +++++ .../ui/viewholder/FxButtonViewHolder.kt | 28 + .../ui/viewholder/FxPresetViewHolder.kt | 35 + .../ui/viewholder/FxShaderCardViewHolder.kt | 100 ++ .../ui/viewholder/FxToolbarViewHolder.kt | 57 ++ .../yuzu_emu/fragments/EmulationFragment.kt | 35 + .../fragments/GamePropertiesFragment.kt | 14 + .../fragments/HomeSettingsFragment.kt | 14 + .../yuzu_emu/utils/NativePostProcessing.kt | 242 +++++ src/android/app/src/main/jni/CMakeLists.txt | 1 + .../app/src/main/jni/native_config.cpp | 14 + .../src/main/jni/native_post_processing.cpp | 350 +++++++ .../main/res/drawable/ic_post_processing.xml | 10 + .../res/drawable/shader_card_background.xml | 13 + .../res/layout/item_quick_settings_add.xml | 58 ++ .../res/layout/item_quick_settings_preset.xml | 47 + .../res/layout/item_quick_settings_shader.xml | 82 ++ .../res/layout/item_setting_fx_actions.xml | 20 + .../res/layout/item_setting_fx_slider.xml | 41 + .../layout/list_item_setting_fx_button.xml | 19 + .../layout/list_item_setting_fx_preset.xml | 65 ++ .../layout/list_item_setting_fx_shader.xml | 82 ++ .../layout/list_item_setting_fx_toolbar.xml | 64 ++ .../app/src/main/res/values/strings.xml | 19 + src/common/fs/fs_paths.h | 2 + src/common/fs/path_util.cpp | 2 + src/common/fs/path_util.h | 2 + src/common/settings.h | 24 + src/qt_common/config/shared_translation.cpp | 1 + src/video_core/CMakeLists.txt | 44 + .../GenerateBundledEffects.cmake | 50 + .../GenerateBundledPresets.cmake | 50 + src/video_core/post_processing/fx_chain.cpp | 321 +++++++ src/video_core/post_processing/fx_chain.h | 86 ++ src/video_core/post_processing/fx_compile.cpp | 105 ++ src/video_core/post_processing/fx_compile.h | 29 + src/video_core/post_processing/fx_effect.cpp | 307 ++++++ src/video_core/post_processing/fx_effect.h | 77 ++ src/video_core/post_processing/fx_preset.cpp | 261 +++++ src/video_core/post_processing/fx_preset.h | 43 + .../renderer_vulkan/present/layer.cpp | 50 + .../renderer_vulkan/present/layer.h | 12 + .../renderer_vulkan/present/post_process.cpp | 899 ++++++++++++++++++ .../renderer_vulkan/present/post_process.h | 140 +++ .../renderer_vulkan/renderer_vulkan.cpp | 7 + src/yuzu/CMakeLists.txt | 6 + .../configure_post_processing.cpp | 511 ++++++++++ .../configuration/configure_post_processing.h | 42 + src/yuzu/main.ui | 6 + src/yuzu/main_window.cpp | 24 + src/yuzu/main_window.h | 9 + 94 files changed, 7079 insertions(+) create mode 100644 .patch/reshade/0001-from-chars-fallback.patch create mode 100644 dist/post_presets/Anime.fxp create mode 100644 dist/post_presets/Cinematic.fxp create mode 100644 dist/post_presets/Clean.fxp create mode 100644 dist/post_presets/Dreamy.fxp create mode 100644 dist/post_presets/Retro.fxp create mode 100644 dist/post_presets/Vivid.fxp create mode 100644 dist/post_shaders/Bloom.fx create mode 100644 dist/post_shaders/Blur.fx create mode 100644 dist/post_shaders/CRT.fx create mode 100644 dist/post_shaders/Cartoon.fx create mode 100644 dist/post_shaders/CartoonSoft.fx create mode 100644 dist/post_shaders/CelShading.fx create mode 100644 dist/post_shaders/ChromaticAberration.fx create mode 100644 dist/post_shaders/ColorGrade.fx create mode 100644 dist/post_shaders/Deband.fx create mode 100644 dist/post_shaders/Denoise.fx create mode 100644 dist/post_shaders/FilmGrain.fx create mode 100644 dist/post_shaders/FilmicCurve.fx create mode 100644 dist/post_shaders/LensDistortion.fx create mode 100644 dist/post_shaders/Levels.fx create mode 100644 dist/post_shaders/MotionBlur.fx create mode 100644 dist/post_shaders/NaturalColors.fx create mode 100644 dist/post_shaders/Reflections.fx create mode 100644 dist/post_shaders/Scanlines.fx create mode 100644 dist/post_shaders/Sharpen.fx create mode 100644 dist/post_shaders/SplitToning.fx create mode 100644 dist/post_shaders/Vignette.fx create mode 100644 dist/post_shaders/WhiteBalance.fx create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FxPresetNameSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FxUniformSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxButtonSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxPresetSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxShaderCardSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxToolbarSetting.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxButtonViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxPresetViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxShaderCardViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxToolbarViewHolder.kt create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativePostProcessing.kt create mode 100644 src/android/app/src/main/jni/native_post_processing.cpp create mode 100644 src/android/app/src/main/res/drawable/ic_post_processing.xml create mode 100644 src/android/app/src/main/res/drawable/shader_card_background.xml create mode 100644 src/android/app/src/main/res/layout/item_quick_settings_add.xml create mode 100644 src/android/app/src/main/res/layout/item_quick_settings_preset.xml create mode 100644 src/android/app/src/main/res/layout/item_quick_settings_shader.xml create mode 100644 src/android/app/src/main/res/layout/item_setting_fx_actions.xml create mode 100644 src/android/app/src/main/res/layout/item_setting_fx_slider.xml create mode 100644 src/android/app/src/main/res/layout/list_item_setting_fx_button.xml create mode 100644 src/android/app/src/main/res/layout/list_item_setting_fx_preset.xml create mode 100644 src/android/app/src/main/res/layout/list_item_setting_fx_shader.xml create mode 100644 src/android/app/src/main/res/layout/list_item_setting_fx_toolbar.xml create mode 100644 src/video_core/post_processing/GenerateBundledEffects.cmake create mode 100644 src/video_core/post_processing/GenerateBundledPresets.cmake create mode 100644 src/video_core/post_processing/fx_chain.cpp create mode 100644 src/video_core/post_processing/fx_chain.h create mode 100644 src/video_core/post_processing/fx_compile.cpp create mode 100644 src/video_core/post_processing/fx_compile.h create mode 100644 src/video_core/post_processing/fx_effect.cpp create mode 100644 src/video_core/post_processing/fx_effect.h create mode 100644 src/video_core/post_processing/fx_preset.cpp create mode 100644 src/video_core/post_processing/fx_preset.h create mode 100644 src/video_core/renderer_vulkan/present/post_process.cpp create mode 100644 src/video_core/renderer_vulkan/present/post_process.h create mode 100644 src/yuzu/configuration/configure_post_processing.cpp create mode 100644 src/yuzu/configuration/configure_post_processing.h diff --git a/.patch/reshade/0001-from-chars-fallback.patch b/.patch/reshade/0001-from-chars-fallback.patch new file mode 100644 index 0000000000..9089b1b9d4 --- /dev/null +++ b/.patch/reshade/0001-from-chars-fallback.patch @@ -0,0 +1,11 @@ +--- a/source/effect_lexer.cpp ++++ b/source/effect_lexer.cpp +@@ -1181,7 +1181,7 @@ + } + else + { +-#if 0 ++#if !defined(__cpp_lib_to_chars) + exponent += decimal_location - mantissa_size; + + const bool exponent_negative = exponent < 0; diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b068b85b4..266331b0ac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,6 +85,8 @@ option(ENABLE_WERROR "Enable -Werror diagnostics" ON) # Lossless Scaling frame generation. Only Android. cmake_dependent_option(ENABLE_LSFG "Enable Lossless Scaling frame generation" ON "ANDROID" OFF) +option(ENABLE_RESHADE "Enable ReShade FX post-processing effects" ON) + # non-linux bundled qt are static if (YUZU_USE_BUNDLED_QT AND (APPLE OR NOT UNIX)) set(YUZU_STATIC_BUILD ON) diff --git a/cpmfile.json b/cpmfile.json index af773e0bd0..8b2099f40a 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -238,6 +238,14 @@ "repo": "stachenov/quazip", "version": "2e95c9001b" }, + "reshade": { + "hash": "6fc9b39821ca6e2d91160f05846b3a42159fec759f5d6fba91d1a57801a1bdaf6047740578c136f0b1a60a9c29ad160d87dbfe0dbfbcdf6ea879a8a078377b8c", + "patches": [ + "0001-from-chars-fallback.patch" + ], + "repo": "crosire/reshade", + "version": "v6.8.0" + }, "sdl3": { "hash": "df5a323af7ac366661a3c0e887969c72584d232f3cc211419d59b0487b620b6b2859d4549c9e8df002ee489290062e466fcfddf7edc0872a37b1f2845e81c0f3", "min_version": "3.2.10", diff --git a/dist/post_presets/Anime.fxp b/dist/post_presets/Anime.fxp new file mode 100644 index 0000000000..a0019905ce --- /dev/null +++ b/dist/post_presets/Anime.fxp @@ -0,0 +1,3 @@ +name=Anime +description=Cel shaded look: the picture is cleaned first, then the lighting is collapsed into flat bands with inked edges, finished with a small glow. +chain=Denoise.fx|Denoise|Strength=0.18,Radius=1.2;CelShading.fx|CelShading|Bands=5,BandContrast=0.35,BandEdge=0.2,Detail=0.7,OutlineStrength=0.7,OutlineThreshold=0.2,Saturation=1.3;Bloom.fx|Bloom|Radius=1.2,Amount=0.25 diff --git a/dist/post_presets/Cinematic.fxp b/dist/post_presets/Cinematic.fxp new file mode 100644 index 0000000000..582226f2da --- /dev/null +++ b/dist/post_presets/Cinematic.fxp @@ -0,0 +1,3 @@ +name=Cinematic +description=Film look: soft glow on the highlights, a filmic contrast curve, cool shadows against warm highlights, fine grain and a gentle vignette. +chain=Bloom.fx|Bloom|Radius=1.6,Amount=0.35;FilmicCurve.fx|FilmicCurve|Toe=1.35,Shoulder=1.3,Amount=0.85;SplitToning.fx|SplitToning|ShadowHue=210,ShadowStrength=0.25,HighlightHue=38,HighlightStrength=0.3;FilmGrain.fx|FilmGrain|Intensity=0.022;Vignette.fx|Vignette|Strength=0.5 diff --git a/dist/post_presets/Clean.fxp b/dist/post_presets/Clean.fxp new file mode 100644 index 0000000000..c44e519e0f --- /dev/null +++ b/dist/post_presets/Clean.fxp @@ -0,0 +1,3 @@ +name=Clean +description=Cleans up a low internal resolution: removes dithering and compression noise, smooths banded skies and brings edge detail back. The safe starting point if you are not sure what you want. +chain=Denoise.fx|Denoise|Strength=0.14,Curve=1.2;Deband.fx|Deband|;Sharpen.fx|Sharpen|Amount=0.75 diff --git a/dist/post_presets/Dreamy.fxp b/dist/post_presets/Dreamy.fxp new file mode 100644 index 0000000000..cbf56c77af --- /dev/null +++ b/dist/post_presets/Dreamy.fxp @@ -0,0 +1,3 @@ +name=Dreamy +description=Soft focus: the centre of the screen stays sharp while everything around it blurs, with a wide glow over the highlights. Good for slower games and cutscenes. +chain=Blur.fx|Blur|Radius=6,Strength=0.85,FocusSize=0.28,FocusSoftness=0.5;Bloom.fx|Bloom|Radius=2.0,Amount=0.55 diff --git a/dist/post_presets/Retro.fxp b/dist/post_presets/Retro.fxp new file mode 100644 index 0000000000..ac4059e641 --- /dev/null +++ b/dist/post_presets/Retro.fxp @@ -0,0 +1,3 @@ +name=Retro +description=Old television look: colour fringing at the edges of the screen, curved scanlines with a phosphor mask, and darkened corners. The scanline roll is switched off so it does not crawl. +chain=ChromaticAberration.fx|ChromaticAberration|Strength=1.0;CRT.fx|CRT|RollSpeed=0,Bleed=1.2;Vignette.fx|Vignette|Strength=0.7 diff --git a/dist/post_presets/Vivid.fxp b/dist/post_presets/Vivid.fxp new file mode 100644 index 0000000000..6a69a8e27f --- /dev/null +++ b/dist/post_presets/Vivid.fxp @@ -0,0 +1,3 @@ +name=Vivid +description=Punchier colour without stylising the image: warmer and more saturated, blacks and whites pushed to the ends of the range, and a light sharpen. +chain=NaturalColors.fx|NaturalColors|Luma=1.15,Chroma=1.35;Levels.fx|Levels|InputBlack=0.02,InputWhite=0.98;Sharpen.fx|Sharpen|Amount=0.5 diff --git a/dist/post_shaders/Bloom.fx b/dist/post_shaders/Bloom.fx new file mode 100644 index 0000000000..a450b21331 --- /dev/null +++ b/dist/post_shaders/Bloom.fx @@ -0,0 +1,70 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project +// SPDX-License-Identifier: GPL-2.0-or-later +// Ported from bloomnoblur.fsh in PPSSPP. + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Radius < + ui_type = "slider"; + ui_label = "Radius"; + ui_tooltip = "How far the glow spreads from bright areas."; + ui_min = 0.0; ui_max = 4.0; ui_step = 0.05; +> = 1.0; + +uniform float Amount < + ui_type = "slider"; + ui_label = "Amount"; + ui_tooltip = "Strength of the glow added on top of the image."; + ui_min = 0.0; ui_max = 2.0; ui_step = 0.05; +> = 0.6; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float Weight(float3 color) +{ + float gray = (color.r + color.g + color.b) / 3.0; + float saturation = (abs(color.r - gray) + abs(color.g - gray) + abs(color.b - gray)) / 3.0; + return gray * gray / max(saturation, 0.25); +} + +float4 PS_Bloom(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float3 color = tex2D(BackBuffer, uv).rgb; + + float gray = (color.r + color.g + color.b) / 3.0; + float saturation = (abs(color.r - gray) + abs(color.g - gray) + abs(color.b - gray)) / 3.0; + float spread = 0.002 * gray / max(saturation, 0.25) * Radius; + + float3 sum = float3(0.0, 0.0, 0.0); + [unroll] for (int x = -3; x <= 3; x += 2) + { + [unroll] for (int y = -3; y <= 3; y += 2) + { + float3 tap = tex2D(BackBuffer, uv + float2(x, y) * spread).rgb; + sum += tap * Weight(tap); + } + } + sum /= 16.0; + + return float4(saturate(color + sum * Amount), 1.0); +} + +technique Bloom < + ui_label = "Bloom"; + ui_tooltip = "Bleeds light out of the brightest areas into a soft halo, the way a camera does when pointed at something too bright."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_Bloom; + } +} diff --git a/dist/post_shaders/Blur.fx b/dist/post_shaders/Blur.fx new file mode 100644 index 0000000000..aa17d03c2e --- /dev/null +++ b/dist/post_shaders/Blur.fx @@ -0,0 +1,87 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Radius < + ui_type = "slider"; + ui_label = "Radius"; + ui_tooltip = "How far the blur reaches, in pixels."; + ui_min = 1.0; ui_max = 12.0; ui_step = 0.5; +> = 4.0; + +uniform float Strength < + ui_type = "slider"; + ui_label = "Strength"; + ui_tooltip = "Blend between the original image and the blurred one."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.05; +> = 1.0; + +uniform float FocusSize < + ui_type = "slider"; + ui_label = "Sharp Centre"; + ui_tooltip = "Size of the region left in focus at the centre of the screen. At zero the whole image is blurred evenly."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.05; +> = 0.0; + +uniform float FocusSoftness < + ui_type = "slider"; + ui_label = "Focus Falloff"; + ui_tooltip = "How gradually the sharp centre gives way to the blur."; + ui_min = 0.05; ui_max = 1.0; ui_step = 0.05; +> = 0.4; + +static const int TAPS = 17; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_Blur(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT); + float3 original = tex2D(BackBuffer, uv).rgb; + + float2 centred = (uv - 0.5) * float2(BUFFER_WIDTH * BUFFER_RCP_HEIGHT, 1.0) * 2.0; + float distance_from_centre = length(centred); + float no_focus = 1.0 - step(0.001, FocusSize); + float focus = max(smoothstep(FocusSize, FocusSize + FocusSoftness, distance_from_centre), no_focus); + float amount = Strength * focus; + + float angle = frac(sin(dot(pos.xy, float2(12.9898, 78.233))) * 43758.5453) * 6.2831853; + float2 spoke = float2(cos(angle), sin(angle)); + + const float2 turn = float2(cos(2.39996323), sin(2.39996323)); + const float decay = exp(-2.0 / float(TAPS)); + float weight = exp(-1.0 / float(TAPS)); + + float3 sum = float3(0.0, 0.0, 0.0); + float total = 0.0; + [unroll] for (int i = 0; i < TAPS; ++i) + { + float reach = sqrt((float(i) + 0.5) / float(TAPS)); + sum += tex2D(BackBuffer, uv + spoke * reach * texel * Radius).rgb * weight; + total += weight; + weight *= decay; + spoke = float2(spoke.x * turn.x - spoke.y * turn.y, + spoke.x * turn.y + spoke.y * turn.x); + } + + float3 blurred = sum / total; + return float4(lerp(original, blurred, amount), 1.0); +} + +technique Blur < + ui_label = "Blur"; + ui_tooltip = "Gaussian blur with an optional sharp centre, for softening the picture or faking depth of field."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_Blur; + } +} diff --git a/dist/post_shaders/CRT.fx b/dist/post_shaders/CRT.fx new file mode 100644 index 0000000000..51bb810e9f --- /dev/null +++ b/dist/post_shaders/CRT.fx @@ -0,0 +1,74 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project +// SPDX-License-Identifier: GPL-2.0-or-later +// Ported from crt.fsh in PPSSPP, by KillaMaaki. + + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Timer < source = "timer"; > = 0.0; + +uniform float Density < + ui_type = "slider"; + ui_label = "Line Density"; + ui_min = 60.0; ui_max = 720.0; ui_step = 10.0; +> = 272.0; + +uniform float RollSpeed < + ui_type = "slider"; + ui_label = "Roll Speed"; + ui_tooltip = "Speed of the rolling bar. Zero disables it."; + ui_min = 0.0; ui_max = 2.0; ui_step = 0.05; +> = 1.0; + +uniform float Bleed < + ui_type = "slider"; + ui_label = "Colour Bleed"; + ui_tooltip = "Horizontal separation of the red and green channels."; + ui_min = 0.0; ui_max = 4.0; ui_step = 0.1; +> = 1.0; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_CRT(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float seconds = Timer * 0.001; + float scan = floor((uv.y + seconds * RollSpeed * 0.5) * Density); + float line_intensity = frac(scan * 0.5) * 2.0; + + float2 shift = float2(line_intensity * 0.0005, 0.0); + float2 bleed = float2(BUFFER_RCP_WIDTH * Bleed, 0.0); + + float r = tex2D(BackBuffer, uv + bleed + shift).r; + float g = tex2D(BackBuffer, uv - bleed + shift).g; + float b = tex2D(BackBuffer, uv).b; + + float3 color = float3(r, g * 0.99, b) * clamp(line_intensity, 0.85, 1.0); + + if (RollSpeed > 0.0) + { + float rollbar = sin((uv.y + seconds * RollSpeed) * 4.0); + color += rollbar * 0.02; + } + + return float4(saturate(color), 1.0); +} + +technique CRT < + ui_label = "CRT"; + ui_tooltip = "Curved scanlines and the phosphor mask of a CRT television, for games that were drawn with that kind of screen in mind."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_CRT; + } +} diff --git a/dist/post_shaders/Cartoon.fx b/dist/post_shaders/Cartoon.fx new file mode 100644 index 0000000000..3dbe9d77b0 --- /dev/null +++ b/dist/post_shaders/Cartoon.fx @@ -0,0 +1,79 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project +// SPDX-FileCopyrightText: guest(r) +// SPDX-License-Identifier: GPL-2.0-or-later +// Ported from cartoon.fsh in PPSSPP, Advanced Cartoon shader I by guest(r). + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float EdgeStrength < + ui_type = "slider"; + ui_label = "Edge Strength"; + ui_tooltip = "Darkness of the ink outline drawn around detected edges."; + ui_min = 0.0; ui_max = 2.0; ui_step = 0.05; +> = 0.5; + +uniform float Levels < + ui_type = "slider"; + ui_label = "Colour Levels"; + ui_tooltip = "How many bands the colours are quantised into."; + ui_min = 2.0; ui_max = 16.0; ui_step = 1.0; +> = 4.0; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_Cartoon(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT); + + float3 c00 = tex2D(BackBuffer, uv + texel * float2(-1.0, -1.0)).rgb; + float3 c10 = tex2D(BackBuffer, uv + texel * float2( 0.0, -1.0)).rgb; + float3 c20 = tex2D(BackBuffer, uv + texel * float2( 1.0, -1.0)).rgb; + float3 c01 = tex2D(BackBuffer, uv + texel * float2(-1.0, 0.0)).rgb; + float3 c11 = tex2D(BackBuffer, uv).rgb; + float3 c21 = tex2D(BackBuffer, uv + texel * float2( 1.0, 0.0)).rgb; + float3 c02 = tex2D(BackBuffer, uv + texel * float2(-1.0, 1.0)).rgb; + float3 c12 = tex2D(BackBuffer, uv + texel * float2( 0.0, 1.0)).rgb; + float3 c22 = tex2D(BackBuffer, uv + texel * float2( 1.0, 1.0)).rgb; + + const float3 dt = float3(1.0, 1.0, 1.0); + + float d1 = dot(abs(c00 - c22), dt); + float d2 = dot(abs(c20 - c02), dt); + float hl = dot(abs(c01 - c21), dt); + float vl = dot(abs(c10 - c12), dt); + float edge = EdgeStrength * (d1 + d2 + hl + vl) / (dot(c11, dt) + 0.15); + + float lc = Levels * length(c11); + float f = frac(lc); + f *= f; + lc = (floor(lc) + f * f) / Levels + 0.05; + + float3 unit = normalize(max(c11, 0.0001)); + float3 quant = Levels * unit; + float3 frct = frac(quant); + frct *= frct; + quant = floor(quant) + 0.05 * dt + frct * frct; + + float3 color = lc * (1.1 - edge * sqrt(edge)) * quant / Levels; + return float4(saturate(color), 1.0); +} + +technique Cartoon < + ui_label = "Cartoon"; + ui_tooltip = "Ink outlines and flat colour bands. Faithful port of the PPSSPP shader; the outline gets heavy in dark scenes, so try Cartoon Soft or Cel Shading if the blacks smear."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_Cartoon; + } +} diff --git a/dist/post_shaders/CartoonSoft.fx b/dist/post_shaders/CartoonSoft.fx new file mode 100644 index 0000000000..bee08d8b43 --- /dev/null +++ b/dist/post_shaders/CartoonSoft.fx @@ -0,0 +1,100 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project +// SPDX-FileCopyrightText: guest(r) +// SPDX-License-Identifier: GPL-2.0-or-later + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float EdgeStrength < + ui_type = "slider"; + ui_label = "Edge Strength"; + ui_tooltip = "Darkness of the ink outline drawn around detected edges."; + ui_min = 0.0; ui_max = 2.0; ui_step = 0.05; +> = 0.45; + +uniform float ShadowGuard < + ui_type = "slider"; + ui_label = "Shadow Guard"; + ui_tooltip = "Holds the outline back in dark areas. Raise it if shadows turn into black blobs."; + ui_min = 0.1; ui_max = 2.0; ui_step = 0.05; +> = 0.8; + +uniform float Levels < + ui_type = "slider"; + ui_label = "Colour Levels"; + ui_tooltip = "How many bands the colours are quantised into."; + ui_min = 2.0; ui_max = 16.0; ui_step = 1.0; +> = 6.0; + +uniform float Smoothing < + ui_type = "slider"; + ui_label = "Banding"; + ui_tooltip = "How far the picture is pushed towards flat bands."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.05; +> = 0.75; + +uniform float Saturation < + ui_type = "slider"; + ui_label = "Saturation"; + ui_min = 0.0; ui_max = 2.0; ui_step = 0.05; +> = 1.15; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_CartoonSoft(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT); + + float3 c00 = tex2D(BackBuffer, uv + texel * float2(-1.0, -1.0)).rgb; + float3 c10 = tex2D(BackBuffer, uv + texel * float2( 0.0, -1.0)).rgb; + float3 c20 = tex2D(BackBuffer, uv + texel * float2( 1.0, -1.0)).rgb; + float3 c01 = tex2D(BackBuffer, uv + texel * float2(-1.0, 0.0)).rgb; + float3 c11 = tex2D(BackBuffer, uv).rgb; + float3 c21 = tex2D(BackBuffer, uv + texel * float2( 1.0, 0.0)).rgb; + float3 c02 = tex2D(BackBuffer, uv + texel * float2(-1.0, 1.0)).rgb; + float3 c12 = tex2D(BackBuffer, uv + texel * float2( 0.0, 1.0)).rgb; + float3 c22 = tex2D(BackBuffer, uv + texel * float2( 1.0, 1.0)).rgb; + + const float3 dt = float3(1.0, 1.0, 1.0); + const float3 luma_weights = float3(0.299, 0.587, 0.114); + + float d1 = dot(abs(c00 - c22), dt); + float d2 = dot(abs(c20 - c02), dt); + float hl = dot(abs(c01 - c21), dt); + float vl = dot(abs(c10 - c12), dt); + + float luma = dot(c11, luma_weights); + float response = (d1 + d2 + hl + vl) / (luma * 2.0 + ShadowGuard); + float ink = 1.0 - saturate(response * EdgeStrength); + + float scaled = luma * Levels; + float step_position = frac(scaled); + float eased = step_position * step_position * (3.0 - 2.0 * step_position); + float banded = (floor(scaled) + eased) / Levels; + float target = lerp(luma, banded, Smoothing); + + float3 tinted = c11 * (target / max(luma, 0.001)); + float3 grey = dot(tinted, luma_weights); + float3 color = lerp(grey, tinted, Saturation) * ink; + + return float4(saturate(color), 1.0); +} + +technique CartoonSoft < + ui_label = "Cartoon Soft"; + ui_tooltip = "Ink outlines and flat colour bands, with the outline held back in the shadows so dark scenes do not turn into black blobs."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_CartoonSoft; + } +} diff --git a/dist/post_shaders/CelShading.fx b/dist/post_shaders/CelShading.fx new file mode 100644 index 0000000000..fa1cae452c --- /dev/null +++ b/dist/post_shaders/CelShading.fx @@ -0,0 +1,120 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Bands < + ui_type = "slider"; + ui_label = "Shading Bands"; + ui_tooltip = "How many flat steps the lighting is collapsed into. Three or four gives the classic look."; + ui_min = 2.0; ui_max = 8.0; ui_step = 1.0; +> = 4.0; + +uniform float BandContrast < + ui_type = "slider"; + ui_label = "Band Contrast"; + ui_tooltip = "Spreads the bands towards pure black and white. Lower it if the shadows crush."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.05; +> = 0.5; + +uniform float BandEdge < + ui_type = "slider"; + ui_label = "Band Edge"; + ui_tooltip = "Width of the transition between bands. Low values give hard cel steps."; + ui_min = 0.02; ui_max = 1.0; ui_step = 0.02; +> = 0.15; + +uniform float Detail < + ui_type = "slider"; + ui_label = "Texture Detail"; + ui_tooltip = "How much surface texture survives the flattening. At zero the bands are completely flat."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.05; +> = 0.6; + +uniform float OutlineStrength < + ui_type = "slider"; + ui_label = "Outline Strength"; + ui_tooltip = "Opacity of the ink line drawn along detected edges."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.05; +> = 0.8; + +uniform float OutlineThreshold < + ui_type = "slider"; + ui_label = "Outline Threshold"; + ui_tooltip = "How strong an edge has to be before it is inked. Raise it to keep ink off textures and specular highlights."; + ui_min = 0.01; ui_max = 0.4; ui_step = 0.01; +> = 0.18; + +uniform float Saturation < + ui_type = "slider"; + ui_label = "Saturation"; + ui_tooltip = "Colour intensity of the flat regions."; + ui_min = 0.0; ui_max = 2.0; ui_step = 0.05; +> = 1.25; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_CelShading(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + const float3 luma_weights = float3(0.2126, 0.7152, 0.0722); + float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT); + + float3 centre = tex2D(BackBuffer, uv).rgb; + float luma = dot(centre, luma_weights); + + float2 near = texel * 1.5; + float2 far = texel * 3.5; + + float a00 = dot(tex2D(BackBuffer, uv + near * float2(-1.0, -1.0)).rgb, luma_weights); + float a20 = dot(tex2D(BackBuffer, uv + near * float2( 1.0, -1.0)).rgb, luma_weights); + float a02 = dot(tex2D(BackBuffer, uv + near * float2(-1.0, 1.0)).rgb, luma_weights); + float a22 = dot(tex2D(BackBuffer, uv + near * float2( 1.0, 1.0)).rgb, luma_weights); + + float b00 = dot(tex2D(BackBuffer, uv + far * float2(-1.0, -1.0)).rgb, luma_weights); + float b20 = dot(tex2D(BackBuffer, uv + far * float2( 1.0, -1.0)).rgb, luma_weights); + float b02 = dot(tex2D(BackBuffer, uv + far * float2(-1.0, 1.0)).rgb, luma_weights); + float b22 = dot(tex2D(BackBuffer, uv + far * float2( 1.0, 1.0)).rgb, luma_weights); + + float gx = (a00 + a02) - (a20 + a22); + float gy = (a00 + a20) - (a02 + a22); + float gradient = sqrt(gx * gx + gy * gy); + float ink = smoothstep(OutlineThreshold, OutlineThreshold + 0.04, gradient); + + float lighting = (a00 + a20 + a02 + a22 + b00 + b20 + b02 + b22) * 0.125; + float detail = luma - lighting; + + float softness = max(BandEdge, 0.001); + float coord = lighting * Bands - softness * 0.5; + float index = floor(coord) + smoothstep(1.0 - softness, 1.0, frac(coord)); + + float centred = (index + 0.5) / Bands; + float stretched = index / max(Bands - 1.0, 1.0); + float banded = saturate(lerp(centred, stretched, BandContrast)); + + float target = saturate(banded + detail * Detail); + + float gain = min(target / max(luma, 0.001), 4.0); + float3 shaded = centre * gain; + float3 grey = dot(shaded, luma_weights); + float3 color = lerp(grey, shaded, Saturation); + color *= 1.0 - ink * OutlineStrength; + + return float4(saturate(color), 1.0); +} + +technique CelShading < + ui_label = "Cel Shading"; + ui_tooltip = "Collapses the lighting into a few hard steps and inks the edges, keeping texture detail and hue intact."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_CelShading; + } +} diff --git a/dist/post_shaders/ChromaticAberration.fx b/dist/post_shaders/ChromaticAberration.fx new file mode 100644 index 0000000000..e051a038ef --- /dev/null +++ b/dist/post_shaders/ChromaticAberration.fx @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Strength < + ui_type = "slider"; + ui_label = "Strength"; + ui_tooltip = "Channel separation in pixels, measured at the edge of the screen."; + ui_min = 0.0; ui_max = 8.0; ui_step = 0.1; +> = 1.5; + +uniform float Falloff < + ui_type = "slider"; + ui_label = "Falloff"; + ui_tooltip = "How fast the separation grows away from the centre. Higher keeps the middle clean."; + ui_min = 1.0; ui_max = 4.0; ui_step = 0.1; +> = 2.0; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_ChromaticAberration(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT); + + float2 direction = uv - float2(0.5, 0.5); + float radius = length(direction); + float2 unit = direction / max(radius, 0.0001); + float2 offset = unit * Strength * pow(radius * 2.0, Falloff) * texel; + + float red = tex2D(BackBuffer, uv + offset).r; + float green = tex2D(BackBuffer, uv).g; + float blue = tex2D(BackBuffer, uv - offset).b; + + return float4(red, green, blue, 1.0); +} + +technique ChromaticAberration < + ui_label = "Chromatic Aberration"; + ui_tooltip = "Splits the colour channels apart towards the edges of the screen, the way a cheap lens fails to focus every colour on the same spot."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_ChromaticAberration; + } +} diff --git a/dist/post_shaders/ColorGrade.fx b/dist/post_shaders/ColorGrade.fx new file mode 100644 index 0000000000..cf1f10ecad --- /dev/null +++ b/dist/post_shaders/ColorGrade.fx @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project +// SPDX-License-Identifier: GPL-2.0-or-later +// Based on colorcorrection.fsh in PPSSPP. + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Saturation < + ui_type = "slider"; + ui_label = "Saturation"; + ui_min = 0.0; ui_max = 2.0; ui_step = 0.01; +> = 1.0; + +uniform float Brightness < + ui_type = "slider"; + ui_label = "Brightness"; + ui_min = 0.0; ui_max = 2.0; ui_step = 0.01; +> = 1.0; + +uniform float Contrast < + ui_type = "slider"; + ui_label = "Contrast"; + ui_min = 0.0; ui_max = 2.0; ui_step = 0.01; +> = 1.0; + +uniform float Gamma < + ui_type = "slider"; + ui_label = "Gamma"; + ui_min = 0.5; ui_max = 2.0; ui_step = 0.01; +> = 1.0; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_ColorGrade(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float3 rgb = tex2D(BackBuffer, uv).rgb; + + float luma = dot(rgb, float3(0.2126, 0.7152, 0.0722)); + rgb = lerp(float3(luma, luma, luma), rgb, Saturation); + rgb *= Brightness; + rgb = (rgb - 0.5) * Contrast + 0.5; + rgb = pow(max(rgb, 0.0), 1.0 / max(Gamma, 0.0001)); + + return float4(saturate(rgb), 1.0); +} + +technique ColorGrade < + ui_label = "Colour Grade"; + ui_tooltip = "The four basic colour controls in one pass: saturation, brightness, contrast and gamma. Reach for this before anything more specialised."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_ColorGrade; + } +} diff --git a/dist/post_shaders/Deband.fx b/dist/post_shaders/Deband.fx new file mode 100644 index 0000000000..96086a9c6c --- /dev/null +++ b/dist/post_shaders/Deband.fx @@ -0,0 +1,91 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2015 Niklas Haas +// SPDX-License-Identifier: MIT + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Threshold < + ui_type = "slider"; + ui_label = "Threshold"; + ui_tooltip = "How flat a neighbourhood must be before it gets smoothed. Raise it to catch wider bands, lower it to keep more detail."; + ui_min = 0.002; ui_max = 0.05; ui_step = 0.001; +> = 0.012; + +uniform float Radius < + ui_type = "slider"; + ui_label = "Radius"; + ui_tooltip = "How far the sampling reaches, in pixels. Wider gradients need a larger radius."; + ui_min = 1.0; ui_max = 32.0; ui_step = 1.0; +> = 8.0; + +uniform float Grain < + ui_type = "slider"; + ui_label = "Dither"; + ui_tooltip = "Noise added to break up whatever banding survives the smoothing."; + ui_min = 0.0; ui_max = 0.02; ui_step = 0.001; +> = 0.004; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float Hash(float2 p) +{ + float3 scattered = frac(float3(p.x, p.y, p.x) * 0.1031); + scattered += dot(scattered, scattered.yzx + 33.33); + return frac((scattered.x + scattered.y) * scattered.z); +} + +float4 PS_Deband(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT); + + float3 centre = tex2D(BackBuffer, uv).rgb; + float base = Hash(pos.xy) * 6.2831853; + + float3 total = float3(0.0, 0.0, 0.0); + float3 deviation = float3(0.0, 0.0, 0.0); + + [unroll] for (int ring = 1; ring <= 2; ++ring) + { + float angle = base + float(ring) * 2.3999632; + float reach = Radius * float(ring) * 0.5; + float2 along = float2(cos(angle), sin(angle)) * reach; + float2 across = float2(-along.y, along.x); + + float3 s0 = tex2D(BackBuffer, uv + along * texel).rgb; + float3 s1 = tex2D(BackBuffer, uv - along * texel).rgb; + float3 s2 = tex2D(BackBuffer, uv + across * texel).rgb; + float3 s3 = tex2D(BackBuffer, uv - across * texel).rgb; + + total += s0 + s1 + s2 + s3; + deviation = max(deviation, max(max(abs(s0 - centre), abs(s1 - centre)), + max(abs(s2 - centre), abs(s3 - centre)))); + } + + float3 average = total * 0.125; + float3 flatness = float3(1.0, 1.0, 1.0) - + smoothstep(Threshold * 0.5, Threshold, deviation); + float3 result = lerp(centre, average, flatness); + + float dither = (Hash(pos.xy + float2(71.3, 41.7)) - 0.5) * Grain; + + return float4(saturate(result + dither), 1.0); +} + +technique Deband < + ui_label = "Deband"; + ui_tooltip = "Smooths the visible steps in gradients such as skies, then dithers whatever survives. Worth adding whenever large flat areas show rings."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_Deband; + } +} diff --git a/dist/post_shaders/Denoise.fx b/dist/post_shaders/Denoise.fx new file mode 100644 index 0000000000..c87e33a446 --- /dev/null +++ b/dist/post_shaders/Denoise.fx @@ -0,0 +1,83 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2019-2021 bloc97 +// SPDX-License-Identifier: MIT + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Strength < + ui_type = "slider"; + ui_label = "Strength"; + ui_min = 0.01; ui_max = 0.5; ui_step = 0.01; +> = 0.1; + +uniform float Radius < + ui_type = "slider"; + ui_label = "Radius"; + ui_min = 0.3; ui_max = 2.0; ui_step = 0.05; +> = 1.0; + +uniform float Curve < + ui_type = "slider"; + ui_label = "Shadow Bias"; + ui_min = 0.0; ui_max = 2.0; ui_step = 0.05; +> = 1.0; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float3 IntensityWeight(float3 value, float3 sigma, float3 centre) +{ + float3 scaled = (value - centre) / sigma; + return exp(-0.5 * scaled * scaled); +} + +float SpatialWeight(float distance, float sigma) +{ + float scaled = distance / sigma; + return exp(-0.5 * scaled * scaled); +} + +float4 PS_Denoise(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT); + + float3 centre = tex2D(BackBuffer, uv).rgb; + float3 intensity_sigma = max(pow(centre + 0.0001, Curve) * Strength, 0.0001); + float spatial_sigma = max(Radius, 0.05); + + float3 sum = float3(0.0, 0.0, 0.0); + float3 total = float3(0.0, 0.0, 0.0); + + [unroll] for (int y = -2; y <= 2; ++y) + { + [unroll] for (int x = -2; x <= 2; ++x) + { + float2 offset = float2(x, y); + float3 tap = tex2D(BackBuffer, uv + offset * texel).rgb; + float3 weight = IntensityWeight(tap, intensity_sigma, centre) * + SpatialWeight(length(offset), spatial_sigma); + sum += weight * tap; + total += weight; + } + } + + return float4(sum / total, 1.0); +} + +technique Denoise < + ui_label = "Denoise"; + ui_tooltip = "Edge preserving blur that clears dithering and compression noise while leaving outlines sharp. Ported from Anime4K."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_Denoise; + } +} diff --git a/dist/post_shaders/FilmGrain.fx b/dist/post_shaders/FilmGrain.fx new file mode 100644 index 0000000000..4e21c18b20 --- /dev/null +++ b/dist/post_shaders/FilmGrain.fx @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Intensity < + ui_type = "slider"; + ui_label = "Intensity"; + ui_min = 0.0; ui_max = 0.2; ui_step = 0.005; +> = 0.03; + +uniform float Size < + ui_type = "slider"; + ui_label = "Size"; + ui_tooltip = "Grain cell size in pixels."; + ui_min = 1.0; ui_max = 4.0; ui_step = 1.0; +> = 1.0; + +uniform float Colored < + ui_type = "slider"; + ui_label = "Colour"; + ui_tooltip = "Zero gives monochrome grain, one gives independent noise per channel."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.01; +> = 0.0; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float Hash(float2 p) +{ + float3 scattered = frac(float3(p.x, p.y, p.x) * 0.1031); + scattered += dot(scattered, scattered.yzx + 33.33); + return frac((scattered.x + scattered.y) * scattered.z); +} + +float4 PS_FilmGrain(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float3 rgb = tex2D(BackBuffer, uv).rgb; + + float2 cell = floor(pos.xy / max(Size, 1.0)); + float mono = Hash(cell) - 0.5; + float3 chroma = float3(Hash(cell + 11.7), Hash(cell + 23.1), Hash(cell + 37.5)) - 0.5; + float3 noise = lerp(float3(mono, mono, mono), chroma, Colored); + + float luma = dot(rgb, float3(0.2126, 0.7152, 0.0722)); + float response = 1.0 - abs(luma * 2.0 - 1.0); + + return float4(saturate(rgb + noise * Intensity * response), 1.0); +} + +technique FilmGrain < + ui_label = "Film Grain"; + ui_tooltip = "Adds photographic grain, strongest in the midtones and fading out in blacks and whites."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_FilmGrain; + } +} diff --git a/dist/post_shaders/FilmicCurve.fx b/dist/post_shaders/FilmicCurve.fx new file mode 100644 index 0000000000..2b1b1e0773 --- /dev/null +++ b/dist/post_shaders/FilmicCurve.fx @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Exposure < + ui_type = "slider"; + ui_label = "Exposure"; + ui_min = 0.5; ui_max = 2.0; ui_step = 0.01; +> = 1.0; + +uniform float Toe < + ui_type = "slider"; + ui_label = "Toe"; + ui_tooltip = "Above 1.0 deepens the shadows, below 1.0 lifts them."; + ui_min = 0.5; ui_max = 2.0; ui_step = 0.01; +> = 1.2; + +uniform float Shoulder < + ui_type = "slider"; + ui_label = "Shoulder"; + ui_tooltip = "Above 1.0 opens up the highlights, below 1.0 compresses them."; + ui_min = 0.5; ui_max = 2.0; ui_step = 0.01; +> = 1.2; + +uniform float Amount < + ui_type = "slider"; + ui_label = "Amount"; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.01; +> = 0.7; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_FilmicCurve(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float3 rgb = tex2D(BackBuffer, uv).rgb; + + float3 curved = saturate(rgb * Exposure); + curved = pow(max(curved, 0.0), Toe); + curved = 1.0 - pow(max(1.0 - curved, 0.0), Shoulder); + + return float4(saturate(lerp(rgb, curved, Amount)), 1.0); +} + +technique FilmicCurve < + ui_label = "Filmic Curve"; + ui_tooltip = "Filmic contrast curve. Deepens the shadows and opens the highlights without clipping either end."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_FilmicCurve; + } +} diff --git a/dist/post_shaders/LensDistortion.fx b/dist/post_shaders/LensDistortion.fx new file mode 100644 index 0000000000..8e0649bfe7 --- /dev/null +++ b/dist/post_shaders/LensDistortion.fx @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Distortion < + ui_type = "slider"; + ui_label = "Distortion"; + ui_tooltip = "Positive bulges the picture outwards, negative pinches it inwards."; + ui_min = -0.5; ui_max = 0.5; ui_step = 0.01; +> = 0.1; + +uniform float Zoom < + ui_type = "slider"; + ui_label = "Zoom"; + ui_tooltip = "Scales the picture to hide the edges the warp pulls in."; + ui_min = 0.5; ui_max = 1.5; ui_step = 0.01; +> = 1.0; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_LensDistortion(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float aspect = BUFFER_WIDTH * BUFFER_RCP_HEIGHT; + float2 half_size = float2(aspect, 1.0); + float2 unit = half_size / length(half_size); + + float2 centred = (uv - 0.5) * 2.0 * unit; + float r2 = dot(centred, centred); + centred *= 1.0 + Distortion * r2; + centred /= max(Zoom, 0.001); + + float2 source = centred / (2.0 * unit) + 0.5; + + return float4(tex2D(BackBuffer, source).rgb, 1.0); +} + +technique LensDistortion < + ui_label = "Lens Distortion"; + ui_tooltip = "Barrel or pincushion warp, like looking through a wide angle lens."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_LensDistortion; + } +} diff --git a/dist/post_shaders/Levels.fx b/dist/post_shaders/Levels.fx new file mode 100644 index 0000000000..510fd3d070 --- /dev/null +++ b/dist/post_shaders/Levels.fx @@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float InputBlack < + ui_type = "slider"; + ui_label = "Input Black"; + ui_tooltip = "Input level mapped to black. Raise it to deepen washed out shadows."; + ui_min = 0.0; ui_max = 0.5; ui_step = 0.005; +> = 0.0; + +uniform float InputWhite < + ui_type = "slider"; + ui_label = "Input White"; + ui_min = 0.5; ui_max = 1.0; ui_step = 0.005; +> = 1.0; + +uniform float Gamma < + ui_type = "slider"; + ui_label = "Gamma"; + ui_min = 0.2; ui_max = 3.0; ui_step = 0.01; +> = 1.0; + +uniform float OutputBlack < + ui_type = "slider"; + ui_label = "Output Black"; + ui_tooltip = "Lifts crushed shadows so detail stops collapsing into one flat black."; + ui_min = 0.0; ui_max = 0.5; ui_step = 0.005; +> = 0.0; + +uniform float OutputWhite < + ui_type = "slider"; + ui_label = "Output White"; + ui_min = 0.5; ui_max = 1.0; ui_step = 0.005; +> = 1.0; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_Levels(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float3 rgb = tex2D(BackBuffer, uv).rgb; + + rgb = saturate((rgb - InputBlack) / max(InputWhite - InputBlack, 0.001)); + rgb = pow(max(rgb, 0.0), 1.0 / max(Gamma, 0.001)); + rgb = lerp(OutputBlack, OutputWhite, rgb); + + return float4(saturate(rgb), 1.0); +} + +technique Levels < + ui_label = "Levels"; + ui_tooltip = "Black point, white point, gamma and output range. Use it to fix crushed or washed out shadows."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_Levels; + } +} diff --git a/dist/post_shaders/MotionBlur.fx b/dist/post_shaders/MotionBlur.fx new file mode 100644 index 0000000000..d541b5db9d --- /dev/null +++ b/dist/post_shaders/MotionBlur.fx @@ -0,0 +1,88 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Length < + ui_type = "slider"; + ui_label = "Length"; + ui_tooltip = "How far the streaks reach, as a percentage of screen height."; + ui_min = 0.0; ui_max = 20.0; ui_step = 0.5; +> = 5.0; + +uniform float Zoom < + ui_type = "slider"; + ui_label = "Zoom"; + ui_tooltip = "Streaks running out from the centre of the screen, as if rushing forward. The centre stays sharp."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.05; +> = 1.0; + +uniform float Pan < + ui_type = "slider"; + ui_label = "Pan"; + ui_tooltip = "Streaks running in one fixed direction, as if the camera were sweeping across."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.05; +> = 0.0; + +uniform float Angle < + ui_type = "slider"; + ui_label = "Pan Angle"; + ui_tooltip = "Direction of the sweep, in degrees."; + ui_min = 0.0; ui_max = 360.0; ui_step = 5.0; +> = 0.0; + +uniform float Spin < + ui_type = "slider"; + ui_label = "Spin"; + ui_tooltip = "Streaks curling around the centre, as if the camera were rolling. Negative turns the other way."; + ui_min = -1.0; ui_max = 1.0; ui_step = 0.05; +> = 0.0; + +static const int TAPS = 24; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_MotionBlur(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float aspect = BUFFER_WIDTH * BUFFER_RCP_HEIGHT; + float2 to_screen = float2(aspect, 1.0); + + float2 centred = (uv - 0.5) * to_screen * 2.0; + float2 outward = centred; + float2 around = float2(-centred.y, centred.x); + + float radians_angle = Angle * 0.01745329; + float2 sweep = float2(cos(radians_angle), sin(radians_angle)); + + float2 velocity = sweep * Pan + outward * Zoom + around * Spin; + velocity *= Length * 0.01; + velocity /= to_screen; + + float jitter = frac(sin(dot(pos.xy, float2(12.9898, 78.233))) * 43758.5453); + + float3 sum = float3(0.0, 0.0, 0.0); + [unroll] for (int i = 0; i < TAPS; ++i) + { + float t = (float(i) + jitter) / float(TAPS) - 0.5; + sum += tex2D(BackBuffer, uv + velocity * t).rgb; + } + + return float4(sum / float(TAPS), 1.0); +} + +technique MotionBlur < + ui_label = "Motion Blur"; + ui_tooltip = "Camera style motion blur: streaks the picture outwards, sideways or around, without touching still detail at the centre."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_MotionBlur; + } +} diff --git a/dist/post_shaders/NaturalColors.fx b/dist/post_shaders/NaturalColors.fx new file mode 100644 index 0000000000..0a35ad4ff2 --- /dev/null +++ b/dist/post_shaders/NaturalColors.fx @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project +// SPDX-License-Identifier: GPL-2.0-or-later +// Ported from naturalA.fsh in PPSSPP, by ShadX, modified by SimoneT. + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Luma < + ui_type = "slider"; + ui_label = "Luma Curve"; + ui_tooltip = "Gamma applied to the luminance channel in YIQ space."; + ui_min = 0.5; ui_max = 2.0; ui_step = 0.01; +> = 1.2; + +uniform float Chroma < + ui_type = "slider"; + ui_label = "Chroma Gain"; + ui_tooltip = "Boost applied to the two colour difference channels."; + ui_min = 0.0; ui_max = 2.0; ui_step = 0.01; +> = 1.2; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_Natural(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + const float3x3 RGBtoYIQ = float3x3(0.299, 0.587, 0.114, + 0.596, -0.275, -0.321, + 0.212, -0.523, 0.311); + + const float3x3 YIQtoRGB = float3x3(1.0, 0.95568806, 0.61985809, + 1.0, -0.27158180, -0.64687382, + 1.0, -1.10817733, 1.70506456); + + float3 rgb = tex2D(BackBuffer, uv).rgb; + float3 yiq = mul(RGBtoYIQ, rgb); + + yiq.x = pow(max(yiq.x, 0.0), Luma); + yiq.yz *= Chroma; + + return float4(saturate(mul(YIQtoRGB, yiq)), 1.0); +} + +technique NaturalColors < + ui_label = "Natural Colours"; + ui_tooltip = "Warms the picture and lifts saturation for a less washed out look. Ported from the PPSSPP shader."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_Natural; + } +} diff --git a/dist/post_shaders/Reflections.fx b/dist/post_shaders/Reflections.fx new file mode 100644 index 0000000000..1ab193481e --- /dev/null +++ b/dist/post_shaders/Reflections.fx @@ -0,0 +1,90 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Timer < source = "timer"; > = 0.0; + +uniform float Horizon < + ui_type = "slider"; + ui_label = "Reflection Line"; + ui_tooltip = "Height on screen where the reflective floor begins. Everything above it is left untouched."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.01; +> = 0.55; + +uniform float Amount < + ui_type = "slider"; + ui_label = "Amount"; + ui_tooltip = "How strongly the reflection shows through the floor."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.05; +> = 0.35; + +uniform float Falloff < + ui_type = "slider"; + ui_label = "Falloff"; + ui_tooltip = "How quickly the reflection fades as the floor comes towards the viewer. At zero it stays even."; + ui_min = 0.0; ui_max = 4.0; ui_step = 0.1; +> = 1.2; + +uniform float Perspective < + ui_type = "slider"; + ui_label = "Perspective"; + ui_tooltip = "Stretches or squashes the mirrored image. One is a true mirror, higher values pull it towards the line."; + ui_min = 0.2; ui_max = 2.0; ui_step = 0.05; +> = 1.0; + +uniform float Ripple < + ui_type = "slider"; + ui_label = "Ripple"; + ui_tooltip = "Amplitude of the waves disturbing the reflection. At zero the mirror is perfectly still."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.05; +> = 0.0; + +uniform float RippleSpeed < + ui_type = "slider"; + ui_label = "Ripple Speed"; + ui_tooltip = "How fast the waves travel."; + ui_min = 0.0; ui_max = 4.0; ui_step = 0.1; +> = 1.0; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_Reflections(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float3 color = tex2D(BackBuffer, uv).rgb; + + float depth = uv.y - Horizon; + float on_floor = step(0.0, depth); + float span = max(1.0 - Horizon, 0.001); + float distance_down = saturate(depth / span); + + float seconds = Timer * 0.001; + float wave = sin(uv.x * 38.0 + seconds * RippleSpeed * 2.0) * + sin(uv.y * 21.0 - seconds * RippleSpeed * 1.3); + float2 disturbance = float2(wave * 0.004, wave * 0.002) * Ripple * distance_down; + + float2 mirrored = float2(uv.x, Horizon - depth * Perspective) + disturbance; + float3 reflection = tex2D(BackBuffer, saturate(mirrored)).rgb; + + float fade = pow(max(1.0 - distance_down, 0.0001), Falloff); + float strength = Amount * fade * on_floor; + + return float4(lerp(color, reflection, strength), 1.0); +} + +technique Reflections < + ui_label = "Reflections"; + ui_tooltip = "Mirrors the picture into a reflective floor below a line you choose, with optional water ripples."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_Reflections; + } +} diff --git a/dist/post_shaders/Scanlines.fx b/dist/post_shaders/Scanlines.fx new file mode 100644 index 0000000000..2f24dc5ed5 --- /dev/null +++ b/dist/post_shaders/Scanlines.fx @@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project +// SPDX-License-Identifier: GPL-2.0-or-later +// Ported from scanlines.fsh in PPSSPP. + + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Density < + ui_type = "slider"; + ui_label = "Line Density"; + ui_tooltip = "Number of scanline pairs across the screen."; + ui_min = 60.0; ui_max = 720.0; ui_step = 10.0; +> = 340.0; + +uniform float Intensity < + ui_type = "slider"; + ui_label = "Intensity"; + ui_tooltip = "How dark the gaps between lines become."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.05; +> = 0.5; + +uniform float Tint < + ui_type = "slider"; + ui_label = "Phosphor Tint"; + ui_tooltip = "Strength of the green-warm phosphor cast."; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.05; +> = 1.0; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_Scanlines(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float line_pos = uv.y * Density * 0.5; + float gate = cos((frac(line_pos) - 0.5) * 3.1415926 * Intensity) * 1.5; + + float3 rgb = tex2D(BackBuffer, uv).rgb; + float3 color = rgb * 0.5 + 0.5 * rgb * rgb * 1.2; + + float3 phosphor = lerp(float3(1.0, 1.0, 1.0), float3(0.9, 1.0, 0.7), Tint); + color *= phosphor; + + float2 diff = uv - 0.5; + color *= 1.1 - 0.6 * (dot(diff, diff) * 2.0); + + return float4(saturate(color * saturate(gate)), 1.0); +} + +technique Scanlines < + ui_label = "Scanlines"; + ui_tooltip = "Darkens alternating rows of pixels to imitate the horizontal scanlines of a CRT. Cheaper than the full CRT effect when you only want the lines."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_Scanlines; + } +} diff --git a/dist/post_shaders/Sharpen.fx b/dist/post_shaders/Sharpen.fx new file mode 100644 index 0000000000..36850e818b --- /dev/null +++ b/dist/post_shaders/Sharpen.fx @@ -0,0 +1,43 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Amount < + ui_type = "slider"; + ui_label = "Amount"; + ui_min = 0.0; ui_max = 3.0; ui_step = 0.01; +> = 0.6; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_Sharpen(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT); + + float3 centre = tex2D(BackBuffer, uv).rgb; + float3 blur = tex2D(BackBuffer, uv + float2(-texel.x, 0.0)).rgb; + blur += tex2D(BackBuffer, uv + float2(texel.x, 0.0)).rgb; + blur += tex2D(BackBuffer, uv + float2(0.0, -texel.y)).rgb; + blur += tex2D(BackBuffer, uv + float2(0.0, texel.y)).rgb; + blur *= 0.25; + + return float4(centre + (centre - blur) * Amount, 1.0); +} + +technique Sharpen < + ui_label = "Sharpen"; + ui_tooltip = "Unsharp mask that brings back edge detail lost to scaling. Most useful after upscaling a low internal resolution."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_Sharpen; + } +} diff --git a/dist/post_shaders/SplitToning.fx b/dist/post_shaders/SplitToning.fx new file mode 100644 index 0000000000..682ee5cf69 --- /dev/null +++ b/dist/post_shaders/SplitToning.fx @@ -0,0 +1,75 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float ShadowHue < + ui_type = "slider"; + ui_label = "Shadow Hue"; + ui_min = 0.0; ui_max = 360.0; ui_step = 1.0; +> = 210.0; + +uniform float ShadowStrength < + ui_type = "slider"; + ui_label = "Shadow Strength"; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.01; +> = 0.0; + +uniform float HighlightHue < + ui_type = "slider"; + ui_label = "Highlight Hue"; + ui_min = 0.0; ui_max = 360.0; ui_step = 1.0; +> = 45.0; + +uniform float HighlightStrength < + ui_type = "slider"; + ui_label = "Highlight Strength"; + ui_min = 0.0; ui_max = 1.0; ui_step = 0.01; +> = 0.0; + +uniform float Balance < + ui_type = "slider"; + ui_label = "Balance"; + ui_tooltip = "Moves the split between what counts as shadow and what counts as highlight."; + ui_min = -0.5; ui_max = 0.5; ui_step = 0.01; +> = 0.0; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float3 HueToRGB(float hue) +{ + float h = frac(hue / 360.0) * 6.0; + return saturate(float3(abs(h - 3.0) - 1.0, 2.0 - abs(h - 2.0), 2.0 - abs(h - 4.0))); +} + +float4 PS_SplitToning(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float3 rgb = tex2D(BackBuffer, uv).rgb; + + float luma = saturate(dot(rgb, float3(0.2126, 0.7152, 0.0722)) + Balance); + + float3 shadow_tint = HueToRGB(ShadowHue) - 0.5; + float3 highlight_tint = HueToRGB(HighlightHue) - 0.5; + + rgb += shadow_tint * ShadowStrength * 0.25 * (1.0 - luma); + rgb += highlight_tint * HighlightStrength * 0.25 * luma; + + return float4(saturate(rgb), 1.0); +} + +technique SplitToning < + ui_label = "Split Toning"; + ui_tooltip = "Tints the shadows and the highlights towards two different hues."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_SplitToning; + } +} diff --git a/dist/post_shaders/Vignette.fx b/dist/post_shaders/Vignette.fx new file mode 100644 index 0000000000..351990a43e --- /dev/null +++ b/dist/post_shaders/Vignette.fx @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project +// SPDX-License-Identifier: GPL-2.0-or-later +// Ported from vignette.fsh in PPSSPP, by Henrik Rydgard. + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Strength < + ui_type = "slider"; + ui_label = "Strength"; + ui_tooltip = "How dark the corners become."; + ui_min = 0.0; ui_max = 2.0; ui_step = 0.01; +> = 0.6; + +uniform float Aspect < + ui_type = "slider"; + ui_label = "Aspect"; + ui_min = 0.5; ui_max = 2.0; ui_step = 0.01; +> = 1.0; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float4 PS_Vignette(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float2 diff = uv - 0.5; + diff.x *= Aspect; + diff.y /= max(Aspect, 0.0001); + + float falloff = 1.0 - min(1.0, Strength * dot(diff, diff) * 2.0); + float3 rgb = tex2D(BackBuffer, uv).rgb; + + return float4(rgb * falloff, 1.0); +} + +technique Vignette < + ui_label = "Vignette"; + ui_tooltip = "Darkens the corners of the screen to pull the eye towards the middle, the way a camera lens falls off at its edges."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_Vignette; + } +} diff --git a/dist/post_shaders/WhiteBalance.fx b/dist/post_shaders/WhiteBalance.fx new file mode 100644 index 0000000000..29aea52fc2 --- /dev/null +++ b/dist/post_shaders/WhiteBalance.fx @@ -0,0 +1,76 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +texture BackBufferTex : COLOR; +sampler BackBuffer { Texture = BackBufferTex; }; + +uniform float Temperature < + ui_type = "slider"; + ui_label = "Temperature"; + ui_tooltip = "Negative cools the picture towards blue, positive warms it towards orange."; + ui_min = -100.0; ui_max = 100.0; ui_step = 1.0; +> = 0.0; + +uniform float Tint < + ui_type = "slider"; + ui_label = "Tint"; + ui_tooltip = "Negative shifts towards green, positive towards magenta."; + ui_min = -100.0; ui_max = 100.0; ui_step = 1.0; +> = 0.0; + +void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD) +{ + uv = float2(float(id & 2), float((id & 1) << 1)); + pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0); +} + +float3 WhitePointLMS(float t1, float t2) +{ + float shift = 0.05; + if (t1 < 0.0) + { + shift = 0.10; + } + float x = 0.31271 - t1 * shift; + float y = 2.87 * x - 3.0 * x * x - 0.27509507 + t2 * 0.05; + + float big_y = 1.0; + float big_x = big_y * x / y; + float big_z = big_y * (1.0 - x - y) / y; + + return float3( 0.7328 * big_x + 0.4296 * big_y - 0.1624 * big_z, + -0.7036 * big_x + 1.6975 * big_y + 0.0061 * big_z, + 0.0030 * big_x + 0.0136 * big_y + 0.9834 * big_z); +} + +float4 PS_WhiteBalance(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target +{ + float3 rgb = pow(max(tex2D(BackBuffer, uv).rgb, 0.0), 2.2); + + float3 balance = float3(0.949237, 1.03542, 1.08728) / + WhitePointLMS(Temperature / 65.0, Tint / 65.0); + + const float3x3 rgb_to_lms = float3x3(0.390405, 0.549941, 0.008926, + 0.070841, 0.963172, 0.001358, + 0.023108, 0.128021, 0.936245); + const float3x3 lms_to_rgb = float3x3( 2.858470, -1.628790, -0.024891, + -0.210182, 1.158200, 0.000324, + -0.041812, -0.118169, 1.068670); + + float3 lms = mul(rgb_to_lms, rgb) * balance; + rgb = mul(lms_to_rgb, lms); + + return float4(saturate(pow(max(rgb, 0.0), 1.0 / 2.2)), 1.0); +} + +technique WhiteBalance < + ui_label = "White Balance"; + ui_tooltip = "Corrects a picture that looks too cool, too warm or tinted."; +> +{ + pass + { + VertexShader = VS_PostProcess; + PixelShader = PS_WhiteBalance; + } +} diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 0682f643e2..a211b7f013 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -195,6 +195,50 @@ else() endif() endif() +# reshadefx +if (ENABLE_RESHADE) + AddJsonPackage(NAME reshade DOWNLOAD_ONLY) + + set(RESHADEFX_SHIM_DIR ${CMAKE_CURRENT_BINARY_DIR}/reshadefx_shim) + file(WRITE ${RESHADEFX_SHIM_DIR}/spirv.hpp "#include \n") + file(WRITE ${RESHADEFX_SHIM_DIR}/GLSL.std.450.h "#include \n") + if (APPLE) + file(WRITE ${RESHADEFX_SHIM_DIR}/malloc.h "#include \n#include \n") + endif() + + add_library(reshadefx STATIC + ${reshade_SOURCE_DIR}/source/effect_codegen_spirv.cpp + ${reshade_SOURCE_DIR}/source/effect_expression.cpp + ${reshade_SOURCE_DIR}/source/effect_lexer.cpp + ${reshade_SOURCE_DIR}/source/effect_parser_exp.cpp + ${reshade_SOURCE_DIR}/source/effect_parser_stmt.cpp + ${reshade_SOURCE_DIR}/source/effect_preprocessor.cpp + ${reshade_SOURCE_DIR}/source/effect_symbol_table.cpp + ) + + target_include_directories(reshadefx SYSTEM PUBLIC ${reshade_SOURCE_DIR}/source) + target_include_directories(reshadefx PRIVATE ${RESHADEFX_SHIM_DIR}) + target_link_libraries(reshadefx PUBLIC SPIRV-Headers::SPIRV-Headers) + + if (NOT MSVC) + target_compile_options(reshadefx PRIVATE -w -fno-char8_t) + else() + target_compile_options(reshadefx PRIVATE /w /Zc:char8_t-) + endif() + + if (WIN32) + if (NOT MSVC) + target_compile_options(reshadefx PRIVATE -include share.h) + else() + target_compile_options(reshadefx PRIVATE /FIshare.h) + endif() + endif() + + if (NOT TARGET reshadefx::reshadefx) + add_library(reshadefx::reshadefx ALIAS reshadefx) + endif() +endif() + # Catch2 if (YUZU_TESTS OR DYNARMIC_TESTS) AddJsonPackage(catch2) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt index 7ba7772bd7..1136923fd0 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt @@ -3,6 +3,8 @@ package org.yuzu.yuzu_emu.dialogs +import android.content.res.ColorStateList +import android.graphics.Rect import android.view.LayoutInflater import android.view.MotionEvent import android.view.View @@ -18,11 +20,28 @@ import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting import org.yuzu.yuzu_emu.features.settings.model.IntSetting import org.yuzu.yuzu_emu.fragments.EmulationFragment import org.yuzu.yuzu_emu.utils.NativeConfig +import org.yuzu.yuzu_emu.utils.NativePostProcessing import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting import org.yuzu.yuzu_emu.features.settings.model.AbstractShortSetting import org.yuzu.yuzu_emu.features.settings.model.AbstractIntSetting class QuickSettings(val emulationFragment: EmulationFragment) { + private val expandedShaders = mutableSetOf() + + private fun forgetShaderSlot(index: Int) { + val shifted = mutableSetOf() + for (slot in expandedShaders) { + if (slot < index) { + shifted.add(slot) + } + if (slot > index) { + shifted.add(slot - 1) + } + } + expandedShaders.clear() + expandedShaders.addAll(shifted) + } + private fun saveSettings() { if (emulationFragment.shouldUseCustom) { NativeConfig.savePerGameConfig() @@ -232,6 +251,428 @@ class QuickSettings(val emulationFragment: EmulationFragment) { container.addView(itemView) } + fun addChoice( + title: String, + container: ViewGroup, + choices: List, + selectedIndex: Int, + onSelected: (Int) -> Unit + ) { + val inflater = LayoutInflater.from(emulationFragment.requireContext()) + val itemView = inflater.inflate(R.layout.item_quick_settings_menu, container, false) + val headerView = itemView.findViewById(R.id.setting_header) + val titleView = itemView.findViewById(R.id.setting_title) + val valueView = itemView.findViewById(R.id.setting_value) + val expandIcon = itemView.findViewById(R.id.expand_icon) + val radioGroup = itemView.findViewById(R.id.radio_group) + + titleView.text = title + + var current = "" + if (selectedIndex in choices.indices) { + current = choices[selectedIndex] + } + valueView.text = current + headerView.visibility = View.VISIBLE + + var isExpanded = false + choices.forEachIndexed { index, name -> + val radioButton = com.google.android.material.radiobutton.MaterialRadioButton( + emulationFragment.requireContext() + ) + radioButton.text = name + radioButton.id = View.generateViewId() + radioButton.isChecked = index == selectedIndex + radioButton.setPadding(16, 8, 16, 8) + + radioButton.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + valueView.text = name + onSelected(index) + } + } + radioGroup.addView(radioButton) + } + + headerView.setOnClickListener { + isExpanded = !isExpanded + if (isExpanded) { + radioGroup.visibility = View.VISIBLE + expandIcon.animate().rotation(180f).setDuration(200).start() + } else { + radioGroup.visibility = View.GONE + expandIcon.animate().rotation(0f).setDuration(200).start() + } + } + + container.addView(itemView) + } + + fun addStepSlider( + title: String, + container: ViewGroup, + steps: Int, + selectedStep: Int, + describe: (Int) -> String, + onCommitted: (Int) -> Unit, + onChanged: (Int) -> Unit + ) { + val inflater = LayoutInflater.from(emulationFragment.requireContext()) + val itemView = inflater.inflate(R.layout.item_quick_settings_menu, container, false) + + val sliderContainer = itemView.findViewById(R.id.slider_container) + val titleView = itemView.findViewById(R.id.slider_title) + val valueDisplay = itemView.findViewById(R.id.slider_value_display) + val slider = itemView.findViewById( + R.id.setting_slider + ) + + titleView.text = title + sliderContainer.visibility = View.VISIBLE + + slider.valueFrom = 0f + slider.valueTo = steps.toFloat() + slider.stepSize = 1f + slider.value = selectedStep.toFloat().coerceIn(0f, steps.toFloat()) + valueDisplay.text = describe(slider.value.toInt()) + + slider.addOnChangeListener { _, value, fromUser -> + if (fromUser) { + val step = value.toInt() + onChanged(step) + valueDisplay.text = describe(step) + } + } + + var pressedValue = slider.value + + slider.setOnTouchListener { _, event -> + val drawer = emulationFragment.view?.findViewById(R.id.drawer_layout) + when (event.action) { + MotionEvent.ACTION_DOWN -> { + drawer?.requestDisallowInterceptTouchEvent(true) + pressedValue = slider.value + } + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { + drawer?.requestDisallowInterceptTouchEvent(false) + if (slider.value != pressedValue) { + onCommitted(slider.value.toInt()) + } + } + } + false + } + + container.addView(itemView) + } + + fun addShaderCard( + index: Int, + title: String, + summary: String, + container: ViewGroup, + onRemove: () -> Unit + ): ViewGroup { + val inflater = LayoutInflater.from(emulationFragment.requireContext()) + val itemView = inflater.inflate(R.layout.item_quick_settings_shader, container, false) + + val headerView = itemView.findViewById(R.id.shader_header) + val titleView = itemView.findViewById(R.id.shader_title) + val summaryView = itemView.findViewById(R.id.shader_summary) + val removeView = itemView.findViewById(R.id.shader_remove) + val expandIcon = itemView.findViewById(R.id.shader_expand) + val bodyView = itemView.findViewById(R.id.shader_body) + + titleView.text = title + if (summary.isEmpty()) { + summaryView.visibility = View.GONE + } else { + summaryView.text = summary + } + + var isExpanded = expandedShaders.contains(index) + if (isExpanded) { + bodyView.visibility = View.VISIBLE + expandIcon.rotation = 180f + } + + headerView.setOnClickListener { + isExpanded = !isExpanded + if (isExpanded) { + expandedShaders.add(index) + bodyView.visibility = View.VISIBLE + expandIcon.animate().rotation(180f).setDuration(200).start() + } else { + expandedShaders.remove(index) + bodyView.visibility = View.GONE + expandIcon.animate().rotation(0f).setDuration(200).start() + } + } + + removeView.setOnClickListener { + onRemove() + } + + container.addView(itemView) + return bodyView + } + + fun addEffectPicker( + container: ViewGroup, + choices: List, + hasEffects: Boolean, + onRemoveAll: () -> Unit, + onPicked: (Int) -> Unit + ) { + val context = emulationFragment.requireContext() + val inflater = LayoutInflater.from(context) + val itemView = inflater.inflate(R.layout.item_quick_settings_add, container, false) + + val button = itemView.findViewById( + R.id.add_button + ) + val removeButton = + itemView.findViewById( + R.id.remove_all_button + ) + val choiceGroup = itemView.findViewById(R.id.add_choices) + + choices.forEachIndexed { index, name -> + val radioButton = com.google.android.material.radiobutton.MaterialRadioButton(context) + radioButton.text = name + radioButton.id = View.generateViewId() + radioButton.setPadding(16, 8, 16, 8) + radioButton.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + onPicked(index) + } + } + choiceGroup.addView(radioButton) + } + + var closedLabel = R.string.post_processing_add + if (hasEffects) { + closedLabel = R.string.post_processing_open_list + removeButton.visibility = View.VISIBLE + } + button.setText(closedLabel) + + val removeBackground = MaterialColors.getColor( + removeButton, + com.google.android.material.R.attr.colorErrorContainer + ) + val removeForeground = MaterialColors.getColor( + removeButton, + com.google.android.material.R.attr.colorOnErrorContainer + ) + removeButton.backgroundTintList = ColorStateList.valueOf(removeBackground) + removeButton.setTextColor(removeForeground) + removeButton.iconTint = ColorStateList.valueOf(removeForeground) + removeButton.setOnClickListener { + onRemoveAll() + } + + val slide = context.resources.displayMetrics.density * 24.0f + + var isOpen = false + button.setOnClickListener { + isOpen = !isOpen + if (isOpen) { + choiceGroup.alpha = 0.0f + choiceGroup.translationY = slide + choiceGroup.visibility = View.VISIBLE + choiceGroup.animate() + .alpha(1.0f) + .translationY(0.0f) + .setDuration(220) + .withEndAction { + choiceGroup.requestRectangleOnScreen( + Rect(0, 0, choiceGroup.width, choiceGroup.height), + false + ) + } + .start() + + button.setText(R.string.post_processing_close_list) + button.setIconResource(R.drawable.ic_clear) + } else { + choiceGroup.animate() + .alpha(0.0f) + .translationY(slide) + .setDuration(160) + .withEndAction { + choiceGroup.visibility = View.GONE + } + .start() + + button.setText(closedLabel) + button.setIconResource(R.drawable.ic_add) + } + } + + container.addView(itemView) + } + + fun addPresetBand(container: ViewGroup, name: String, summary: String) { + val inflater = LayoutInflater.from(emulationFragment.requireContext()) + val itemView = inflater.inflate(R.layout.item_quick_settings_preset, container, false) + + val titleView = itemView.findViewById(R.id.preset_title) + val summaryView = itemView.findViewById(R.id.preset_summary) + val switchView = itemView.findViewById(R.id.preset_switch) + + titleView.text = name + if (summary.isEmpty()) { + summaryView.visibility = View.GONE + } else { + summaryView.text = summary + } + + switchView.isChecked = NativePostProcessing.isEnabled() + switchView.setOnCheckedChangeListener { _, checked -> + emulationFragment.editPostProcessing { + NativePostProcessing.setEnabled(checked) + } + } + + container.addView(itemView) + } + + fun addPostProcessing(container: ViewGroup, onStructureChanged: () -> Unit) { + val usable = NativePostProcessing.catalog().filter { it.valid } + if (usable.isEmpty()) { + return + } + + val preset = NativePostProcessing.getActivePreset() + if (preset.isNotEmpty()) { + addDivider(container) + + var summary = "" + val described = NativePostProcessing.presets().firstOrNull { it.name == preset } + if (described != null) { + summary = described.description + } + if (summary.isEmpty()) { + summary = + YuzuApplication.appContext.getString(R.string.post_processing_preset_locked) + } + if (NativePostProcessing.isPresetModified()) { + summary = summary + "\n" + + YuzuApplication.appContext.getString(R.string.post_processing_preset_modified) + } + + addPresetBand(container, preset, summary) + return + } + + val labels = mutableListOf() + val files = mutableListOf() + val techniques = mutableListOf() + + for (effect in usable) { + for (technique in effect.techniques) { + var label = effect.label + if (effect.techniques.size > 1) { + label = effect.label + " \u00b7 " + technique + } + labels.add(label) + files.add(effect.file) + techniques.add(technique) + } + } + + addDivider(container) + + val chain = NativePostProcessing.chain() + chain.forEachIndexed { index, entry -> + val effect = usable.firstOrNull { it.file == entry.file } + + var title = entry.file + var summary = "" + if (effect != null) { + title = effect.label + if (effect.techniques.size > 1) { + title = effect.label + " \u00b7 " + entry.technique + } + summary = effect.description + } + + val body = addShaderCard(index, title, summary, container) { + emulationFragment.editPostProcessing { + NativePostProcessing.remove(index) + } + forgetShaderSlot(index) + onStructureChanged() + } + + if (effect != null) { + for (uniform in effect.uniforms) { + addUniformSliders(body, index, uniform) + } + } + } + + addEffectPicker( + container, + labels, + chain.isNotEmpty(), + { + emulationFragment.editPostProcessing { + NativePostProcessing.clearChain() + } + expandedShaders.clear() + onStructureChanged() + } + ) { picked -> + emulationFragment.editPostProcessing { + NativePostProcessing.append(files[picked], techniques[picked]) + } + onStructureChanged() + } + } + + private fun addUniformSliders( + container: ViewGroup, + index: Int, + uniform: NativePostProcessing.Uniform + ) { + if (uniform.uiType == NativePostProcessing.UI_HIDDEN) { + return + } + + for (component in 0 until uniform.components) { + var title = uniform.label + if (uniform.components > 1) { + title = uniform.label + " [" + component + "]" + } + + var value = uniform.defaultAt(component) + if (NativePostProcessing.hasValue(index, uniform.name)) { + value = NativePostProcessing.getValue(index, uniform.name, component) + } + + val steps = uniform.steps + val step = Math.round((value - uniform.min) / uniform.step) + + addStepSlider( + title, + container, + steps, + step, + { position -> uniform.describe(position) }, + { emulationFragment.persistPostProcessing() } + ) { position -> + NativePostProcessing.setValue( + index, + uniform.name, + component, + uniform.min + position * uniform.step + ) + } + } + } + fun addDivider(container: ViewGroup) { val inflater = LayoutInflater.from(emulationFragment.requireContext()) val dividerView = inflater.inflate(R.layout.item_quick_settings_divider, container, false) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FxPresetNameSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FxPresetNameSetting.kt new file mode 100644 index 0000000000..496cb5390a --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FxPresetNameSetting.kt @@ -0,0 +1,36 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.features.settings.model + +class FxPresetNameSetting(private val onNamed: (String) -> Unit) : AbstractStringSetting { + override val key: String + get() = "fx_preset_name" + + override val defaultValue: Any + get() = "" + + override val isRuntimeModifiable: Boolean + get() = true + + override val pairedSettingKey: String + get() = "" + + override val isSwitchable: Boolean + get() = false + + override val isSaveable: Boolean + get() = true + + override var global: Boolean + get() = true + set(_) {} + + override fun getString(needsGlobal: Boolean): String = "" + + override fun setString(value: String) = onNamed(value) + + override fun getValueAsString(needsGlobal: Boolean): String = "" + + override fun reset() {} +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FxUniformSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FxUniformSetting.kt new file mode 100644 index 0000000000..23c7837e12 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/FxUniformSetting.kt @@ -0,0 +1,67 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.features.settings.model + +import org.yuzu.yuzu_emu.utils.NativePostProcessing +import kotlin.math.roundToInt + +abstract class FxUniformSetting( + protected val index: Int, + protected val uniform: NativePostProcessing.Uniform, + protected val component: Int +) : AbstractSetting { + override val key: String + get() = "fx_${index}_${uniform.name}_$component" + + override val isRuntimeModifiable: Boolean + get() = true + + override val pairedSettingKey: String + get() = "" + + override val isSwitchable: Boolean + get() = false + + override val isSaveable: Boolean + get() = true + + override var global: Boolean + get() = true + set(_) {} + + protected fun currentValue(): Float { + if (NativePostProcessing.hasValue(index, uniform.name)) { + return NativePostProcessing.getValue(index, uniform.name, component) + } + return uniform.defaultAt(component) + } + + protected fun commit(value: Float) { + NativePostProcessing.setValue(index, uniform.name, component, value) + NativePostProcessing.store() + } + + override fun reset() = commit(uniform.defaultAt(component)) +} + +class FxUniformSliderSetting( + index: Int, + uniform: NativePostProcessing.Uniform, + component: Int +) : FxUniformSetting(index, uniform, component), AbstractIntSetting { + override val defaultValue: Any + get() = ((uniform.defaultAt(component) - uniform.min) / uniform.step).roundToInt() + + override fun getInt(needsGlobal: Boolean): Int = + ((currentValue() - uniform.min) / uniform.step).roundToInt() + + override fun setInt(value: Int) = commit(uniform.min + value * uniform.step) + + override fun getValueAsString(needsGlobal: Boolean): String { + if (uniform.kind == NativePostProcessing.KIND_FLOAT) { + return String.format("%.3f", currentValue()) + } + return currentValue().roundToInt().toString() + } +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt index fc4df4952d..23c5ceb88b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt @@ -12,6 +12,7 @@ object Settings { SECTION_SYSTEM(R.string.preferences_system), SECTION_RENDERER(R.string.preferences_graphics), SECTION_FRAME_GEN(R.string.frame_gen), + SECTION_POST_PROCESSING(R.string.post_processing), SECTION_PERFORMANCE_STATS(R.string.stats_overlay_options), SECTION_INPUT_OVERLAY(R.string.input_overlay_options), SECTION_SOC_OVERLAY(R.string.soc_overlay_options), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt index 43fb1fe0fe..e3ccf9e998 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/StringSetting.kt @@ -13,6 +13,7 @@ enum class StringSetting(override val key: String) : AbstractStringSetting { DEVICE_NAME("device_name"), LOG_FILTER("log_filter"), PROGRAM_ARGS("program_args"), + POST_SHADER_CHAIN("post_shader_chain"), WEB_TOKEN("eden_token"), WEB_USERNAME("eden_username") diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxButtonSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxButtonSetting.kt new file mode 100644 index 0000000000..3fc999e267 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxButtonSetting.kt @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.features.settings.model.view + +import androidx.annotation.StringRes + +class FxButtonSetting( + @StringRes titleId: Int, + val onClick: () -> Unit +) : SettingsItem(emptySetting, titleId, "", 0, "") { + override val type = TYPE_FX_BUTTON +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxPresetSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxPresetSetting.kt new file mode 100644 index 0000000000..9873b1c396 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxPresetSetting.kt @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.features.settings.model.view + +class FxPresetSetting( + titleString: String, + descriptionString: String = "", + val deletable: Boolean = false, + val onApply: () -> Unit, + val onDelete: () -> Unit = {} +) : SettingsItem(emptySetting, 0, titleString, 0, descriptionString) { + override val type = TYPE_FX_PRESET +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxShaderCardSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxShaderCardSetting.kt new file mode 100644 index 0000000000..e54ac3b5a0 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxShaderCardSetting.kt @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.features.settings.model.view + +import org.yuzu.yuzu_emu.utils.NativePostProcessing + +class FxShaderCardSetting( + titleString: String, + descriptionString: String, + val index: Int, + val expanded: Boolean, + val uniforms: List, + val onToggle: () -> Unit, + val onRemove: () -> Unit, + val onReset: () -> Unit +) : SettingsItem(emptySetting, 0, titleString, 0, descriptionString) { + override val type = TYPE_FX_SHADER +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxToolbarSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxToolbarSetting.kt new file mode 100644 index 0000000000..e62b0b914b --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/FxToolbarSetting.kt @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.features.settings.model.view + +import androidx.annotation.StringRes + +class FxToolbarSetting( + @StringRes val addLabelId: Int, + val listOpen: Boolean, + val presetLabel: String, + val hasEffects: Boolean, + val createPreset: StringInputSetting, + val onAdd: () -> Unit, + val onPresets: () -> Unit, + val onRemoveAll: () -> Unit +) : SettingsItem(emptySetting, 0, "", 0, "") { + override val type = TYPE_FX_TOOLBAR +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 30d784267a..ab2ac7eb42 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -144,6 +144,10 @@ abstract class SettingsItem( const val TYPE_LAUNCHABLE = 13 const val TYPE_PATH = 14 const val TYPE_GPU_UNSWIZZLE = 15 + const val TYPE_FX_TOOLBAR = 16 + const val TYPE_FX_PRESET = 17 + const val TYPE_FX_SHADER = 18 + const val TYPE_FX_BUTTON = 19 const val FASTMEM_COMBINED = "fastmem_combined" const val GPU_UNSWIZZLE_COMBINED = "gpu_unswizzle_combined" diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt index d7311eded5..8d47db94e0 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt @@ -23,6 +23,10 @@ import com.google.android.material.timepicker.TimeFormat import org.yuzu.yuzu_emu.R import org.yuzu.yuzu_emu.SettingsNavigationDirections import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding +import org.yuzu.yuzu_emu.databinding.ListItemSettingFxButtonBinding +import org.yuzu.yuzu_emu.databinding.ListItemSettingFxPresetBinding +import org.yuzu.yuzu_emu.databinding.ListItemSettingFxShaderBinding +import org.yuzu.yuzu_emu.databinding.ListItemSettingFxToolbarBinding import org.yuzu.yuzu_emu.databinding.ListItemSettingInputBinding import org.yuzu.yuzu_emu.databinding.ListItemSettingSwitchBinding import org.yuzu.yuzu_emu.databinding.ListItemSettingsHeaderBinding @@ -106,6 +110,34 @@ class SettingsAdapter( GpuUnswizzleViewHolder(ListItemSettingBinding.inflate(inflater), this) } + SettingsItem.TYPE_FX_TOOLBAR -> { + FxToolbarViewHolder( + ListItemSettingFxToolbarBinding.inflate(inflater, parent, false), + this + ) + } + + SettingsItem.TYPE_FX_PRESET -> { + FxPresetViewHolder( + ListItemSettingFxPresetBinding.inflate(inflater, parent, false), + this + ) + } + + SettingsItem.TYPE_FX_SHADER -> { + FxShaderCardViewHolder( + ListItemSettingFxShaderBinding.inflate(inflater, parent, false), + this + ) + } + + SettingsItem.TYPE_FX_BUTTON -> { + FxButtonViewHolder( + ListItemSettingFxButtonBinding.inflate(inflater, parent, false), + this + ) + } + else -> { HeaderViewHolder(ListItemSettingsHeaderBinding.inflate(inflater), this) } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index bdb10c3146..89e0084df0 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -18,6 +18,7 @@ import org.yuzu.yuzu_emu.features.input.model.NpadStyleIndex import org.yuzu.yuzu_emu.features.settings.model.AbstractBooleanSetting import org.yuzu.yuzu_emu.features.settings.model.AbstractIntSetting import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting +import org.yuzu.yuzu_emu.features.settings.model.FxPresetNameSetting import org.yuzu.yuzu_emu.features.settings.model.ByteSetting import org.yuzu.yuzu_emu.features.settings.model.IntSetting import org.yuzu.yuzu_emu.features.settings.model.LongSetting @@ -30,6 +31,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.* import org.yuzu.yuzu_emu.utils.InputHandler import org.yuzu.yuzu_emu.utils.LosslessScalingHelper import org.yuzu.yuzu_emu.utils.NativeConfig +import org.yuzu.yuzu_emu.utils.NativePostProcessing import org.yuzu.yuzu_emu.utils.DirectoryInitialization import org.yuzu.yuzu_emu.utils.FullscreenHelper import androidx.core.content.edit @@ -44,6 +46,14 @@ class SettingsFragmentPresenter( ) { private var settingsList = ArrayList() + private val expandedShaderSlots = mutableSetOf() + + private var shaderPickerOpen = false + + private var presetPickerOpen = false + + private var postProcessingSynced = false + private val context get() = YuzuApplication.appContext // Extension for altering settings list based on each setting's properties @@ -163,6 +173,7 @@ class SettingsFragmentPresenter( MenuTag.SECTION_SYSTEM -> addSystemSettings(sl) MenuTag.SECTION_RENDERER -> addGraphicsSettings(sl) MenuTag.SECTION_FRAME_GEN -> addFrameGenSettings(sl) + MenuTag.SECTION_POST_PROCESSING -> addPostProcessingSettings(sl) MenuTag.SECTION_PERFORMANCE_STATS -> addPerformanceOverlaySettings(sl) MenuTag.SECTION_SOC_OVERLAY -> addSocOverlaySettings(sl) MenuTag.SECTION_INPUT_OVERLAY -> addInputOverlaySettings(sl) @@ -190,6 +201,209 @@ class SettingsFragmentPresenter( } } + private fun addPostProcessingSettings(sl: ArrayList) { + if (!postProcessingSynced) { + postProcessingSynced = true + NativePostProcessing.reload() + } + + val usable = NativePostProcessing.catalog().filter { it.valid } + + sl.apply { + if (usable.isEmpty()) { + add( + RunnableSetting( + titleId = R.string.post_processing_empty, + descriptionString = NativePostProcessing.getShaderDirectory(), + isRunnable = false + ) {} + ) + return@apply + } + + val labels = mutableListOf() + val summaries = mutableListOf() + val files = mutableListOf() + val techniques = mutableListOf() + for (effect in usable) { + for (technique in effect.techniques) { + if (effect.techniques.size == 1) { + labels.add(effect.label) + } else { + labels.add(effect.label + " \u00b7 " + technique) + } + summaries.add(effect.description) + files.add(effect.file) + techniques.add(technique) + } + } + + val chain = NativePostProcessing.chain() + val active = NativePostProcessing.getActivePreset() + + var addLabel = R.string.post_processing_add + if (chain.isNotEmpty()) { + addLabel = R.string.post_processing_open_list + } + if (shaderPickerOpen) { + addLabel = R.string.post_processing_close_list + } + + var presetLabel = context.getString(R.string.post_processing_presets) + if (active.isNotEmpty()) { + presetLabel = active + } + + val createPreset = StringInputSetting( + setting = FxPresetNameSetting { name -> + NativePostProcessing.savePreset(name, "") + settingsViewModel.setReloadListAndNotifyDataset(true) + }, + titleId = R.string.post_processing_preset_new, + descriptionId = R.string.post_processing_preset_new_description, + validator = { it != null && it.isNotBlank() && !it.contains('=') }, + errorId = R.string.post_processing_preset_name_invalid + ) + + add( + FxToolbarSetting( + addLabelId = addLabel, + listOpen = shaderPickerOpen, + presetLabel = presetLabel, + hasEffects = chain.isNotEmpty(), + createPreset = createPreset, + onAdd = { + shaderPickerOpen = !shaderPickerOpen + presetPickerOpen = false + settingsViewModel.setReloadListAndNotifyDataset(true) + }, + onPresets = { + presetPickerOpen = !presetPickerOpen + shaderPickerOpen = false + settingsViewModel.setReloadListAndNotifyDataset(true) + }, + onRemoveAll = { + NativePostProcessing.clearChain() + NativePostProcessing.clearPreset() + NativePostProcessing.store() + expandedShaderSlots.clear() + shaderPickerOpen = false + settingsViewModel.setReloadListAndNotifyDataset(true) + } + ) + ) + + if (shaderPickerOpen) { + for (choice in labels.indices) { + add( + RunnableSetting( + titleString = labels[choice], + descriptionString = summaries[choice], + isRunnable = true + ) { + NativePostProcessing.append(files[choice], techniques[choice]) + NativePostProcessing.store() + shaderPickerOpen = false + settingsViewModel.setReloadListAndNotifyDataset(true) + } + ) + } + } + + if (presetPickerOpen) { + add( + FxPresetSetting( + titleString = context.getString(R.string.post_processing_preset_none), + onApply = { + NativePostProcessing.clearPreset() + presetPickerOpen = false + settingsViewModel.setReloadListAndNotifyDataset(true) + } + ) + ) + for (preset in NativePostProcessing.presets()) { + add( + FxPresetSetting( + titleString = preset.name, + descriptionString = preset.description, + deletable = !preset.bundled, + onApply = { + NativePostProcessing.applyPreset(preset.name) + NativePostProcessing.store() + presetPickerOpen = false + expandedShaderSlots.clear() + settingsViewModel.setReloadListAndNotifyDataset(true) + }, + onDelete = { + NativePostProcessing.deletePreset(preset.name) + settingsViewModel.setReloadListAndNotifyDataset(true) + } + ) + ) + } + } + + if (active.isNotEmpty()) { + add( + FxButtonSetting(titleId = R.string.post_processing_preset_reset) { + NativePostProcessing.applyPreset(active) + NativePostProcessing.store() + expandedShaderSlots.clear() + settingsViewModel.setReloadListAndNotifyDataset(true) + } + ) + } + + for (index in chain.indices) { + val entry = chain[index] + val effect = usable.firstOrNull { it.file == entry.file } + + var header = entry.file + var summary = "" + var uniforms = emptyList() + if (effect != null) { + header = effect.label + if (effect.techniques.size > 1) { + header = effect.label + " \u00b7 " + entry.technique + } + summary = effect.description + uniforms = effect.uniforms + } + + val isOpen = expandedShaderSlots.contains(index) + + add( + FxShaderCardSetting( + titleString = header, + descriptionString = summary, + index = index, + expanded = isOpen, + uniforms = uniforms, + onToggle = { + if (isOpen) { + expandedShaderSlots.remove(index) + } else { + expandedShaderSlots.add(index) + } + settingsViewModel.setReloadListAndNotifyDataset(true) + }, + onRemove = { + NativePostProcessing.remove(index) + NativePostProcessing.store() + expandedShaderSlots.clear() + settingsViewModel.setReloadListAndNotifyDataset(true) + }, + onReset = { + NativePostProcessing.resetValues(index) + NativePostProcessing.store() + settingsViewModel.setReloadListAndNotifyDataset(true) + } + ) + ) + } + } + } + private fun addConfigSettings(sl: ArrayList) { sl.apply { add( diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxButtonViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxButtonViewHolder.kt new file mode 100644 index 0000000000..914f96085a --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxButtonViewHolder.kt @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.features.settings.ui.viewholder + +import android.view.View +import org.yuzu.yuzu_emu.databinding.ListItemSettingFxButtonBinding +import org.yuzu.yuzu_emu.features.settings.model.view.FxButtonSetting +import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem +import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter + +class FxButtonViewHolder( + val binding: ListItemSettingFxButtonBinding, + adapter: SettingsAdapter +) : SettingViewHolder(binding.root, adapter) { + private lateinit var setting: FxButtonSetting + + override fun bind(item: SettingsItem) { + setting = item as FxButtonSetting + + binding.fxButton.text = item.title + binding.fxButton.setOnClickListener { setting.onClick.invoke() } + } + + override fun onClick(clicked: View) {} + + override fun onLongClick(clicked: View): Boolean = true +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxPresetViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxPresetViewHolder.kt new file mode 100644 index 0000000000..d8634c1002 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxPresetViewHolder.kt @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.features.settings.ui.viewholder + +import android.view.View +import org.yuzu.yuzu_emu.databinding.ListItemSettingFxPresetBinding +import org.yuzu.yuzu_emu.features.settings.model.view.FxPresetSetting +import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem +import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter +import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible + +class FxPresetViewHolder( + val binding: ListItemSettingFxPresetBinding, + adapter: SettingsAdapter +) : SettingViewHolder(binding.root, adapter) { + private lateinit var setting: FxPresetSetting + + override fun bind(item: SettingsItem) { + setting = item as FxPresetSetting + + binding.presetName.text = item.title + binding.presetDescription.text = item.description + binding.presetDescription.setVisible(item.description.isNotEmpty()) + + binding.presetRow.setOnClickListener { setting.onApply.invoke() } + + binding.presetDelete.setVisible(setting.deletable) + binding.presetDelete.setOnClickListener { setting.onDelete.invoke() } + } + + override fun onClick(clicked: View) {} + + override fun onLongClick(clicked: View): Boolean = true +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxShaderCardViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxShaderCardViewHolder.kt new file mode 100644 index 0000000000..fc72f04225 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxShaderCardViewHolder.kt @@ -0,0 +1,100 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.features.settings.ui.viewholder + +import android.view.LayoutInflater +import android.view.View +import org.yuzu.yuzu_emu.databinding.ItemSettingFxActionsBinding +import org.yuzu.yuzu_emu.databinding.ItemSettingFxSliderBinding +import org.yuzu.yuzu_emu.databinding.ListItemSettingFxShaderBinding +import org.yuzu.yuzu_emu.features.settings.model.FxUniformSliderSetting +import org.yuzu.yuzu_emu.features.settings.model.view.FxShaderCardSetting +import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem +import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter +import org.yuzu.yuzu_emu.utils.NativePostProcessing +import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible + +class FxShaderCardViewHolder( + val binding: ListItemSettingFxShaderBinding, + adapter: SettingsAdapter +) : SettingViewHolder(binding.root, adapter) { + private lateinit var setting: FxShaderCardSetting + + override fun bind(item: SettingsItem) { + setting = item as FxShaderCardSetting + + binding.shaderTitle.text = item.title + binding.shaderSummary.text = item.description + binding.shaderSummary.setVisible(item.description.isNotEmpty()) + + var rotation = 0f + if (setting.expanded) { + rotation = 180f + } + binding.shaderExpand.rotation = rotation + + binding.shaderHeader.setOnClickListener { setting.onToggle.invoke() } + binding.shaderRemove.setOnClickListener { setting.onRemove.invoke() } + + binding.shaderBody.removeAllViews() + binding.shaderBody.setVisible(setting.expanded) + if (!setting.expanded) { + return + } + + val inflater = LayoutInflater.from(binding.root.context) + for (uniform in setting.uniforms) { + if (uniform.uiType == NativePostProcessing.UI_HIDDEN) { + continue + } + for (component in 0 until uniform.components) { + addSlider(inflater, uniform, component) + } + } + addActions(inflater) + } + + private fun addSlider( + inflater: LayoutInflater, + uniform: NativePostProcessing.Uniform, + component: Int + ) { + val row = ItemSettingFxSliderBinding.inflate(inflater, binding.shaderBody, false) + val value = FxUniformSliderSetting(setting.index, uniform, component) + + var title = uniform.label + if (uniform.components > 1) { + title = uniform.label + " [" + component + "]" + } + row.fxSliderTitle.text = title + + val steps = uniform.steps.toFloat() + row.fxSlider.valueFrom = 0f + row.fxSlider.valueTo = steps + row.fxSlider.stepSize = 1f + row.fxSlider.value = value.getInt(false).toFloat().coerceIn(0f, steps) + row.fxSliderValue.text = uniform.describe(row.fxSlider.value.toInt()) + + row.fxSlider.addOnChangeListener { _, position, fromUser -> + if (fromUser) { + value.setInt(position.toInt()) + row.fxSliderValue.text = uniform.describe(position.toInt()) + } + } + + binding.shaderBody.addView(row.root) + } + + private fun addActions(inflater: LayoutInflater) { + val row = ItemSettingFxActionsBinding.inflate(inflater, binding.shaderBody, false) + + row.fxReset.setOnClickListener { setting.onReset.invoke() } + + binding.shaderBody.addView(row.root) + } + + override fun onClick(clicked: View) {} + + override fun onLongClick(clicked: View): Boolean = true +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxToolbarViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxToolbarViewHolder.kt new file mode 100644 index 0000000000..21bad70040 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/FxToolbarViewHolder.kt @@ -0,0 +1,57 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.features.settings.ui.viewholder + +import android.content.res.ColorStateList +import android.view.View +import com.google.android.material.color.MaterialColors +import org.yuzu.yuzu_emu.R +import org.yuzu.yuzu_emu.databinding.ListItemSettingFxToolbarBinding +import org.yuzu.yuzu_emu.features.settings.model.view.FxToolbarSetting +import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem +import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter + +class FxToolbarViewHolder( + val binding: ListItemSettingFxToolbarBinding, + adapter: SettingsAdapter +) : SettingViewHolder(binding.root, adapter) { + private lateinit var setting: FxToolbarSetting + + override fun bind(item: SettingsItem) { + setting = item as FxToolbarSetting + + binding.fxAdd.setText(setting.addLabelId) + var addIcon = R.drawable.ic_add + if (setting.listOpen) { + addIcon = R.drawable.ic_clear + } + binding.fxAdd.setIconResource(addIcon) + binding.fxAdd.setOnClickListener { setting.onAdd.invoke() } + + binding.fxPresets.text = setting.presetLabel + binding.fxPresets.setOnClickListener { setting.onPresets.invoke() } + + binding.fxCreatePreset.isEnabled = setting.hasEffects + binding.fxCreatePreset.setOnClickListener { + adapter.onStringInputClick(setting.createPreset, bindingAdapterPosition) + } + + val removeBackground = MaterialColors.getColor( + binding.fxRemoveAll, + com.google.android.material.R.attr.colorErrorContainer + ) + val removeForeground = MaterialColors.getColor( + binding.fxRemoveAll, + com.google.android.material.R.attr.colorOnErrorContainer + ) + binding.fxRemoveAll.backgroundTintList = ColorStateList.valueOf(removeBackground) + binding.fxRemoveAll.iconTint = ColorStateList.valueOf(removeForeground) + binding.fxRemoveAll.isEnabled = setting.hasEffects + binding.fxRemoveAll.setOnClickListener { setting.onRemoveAll.invoke() } + } + + override fun onClick(clicked: View) {} + + override fun onLongClick(clicked: View): Boolean = true +} diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt index 016ac57356..3f1f3da2ba 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt @@ -94,6 +94,7 @@ import org.yuzu.yuzu_emu.utils.InputHandler import org.yuzu.yuzu_emu.utils.Log import org.yuzu.yuzu_emu.utils.NativeConfig import org.yuzu.yuzu_emu.utils.NativeFreedrenoConfig +import org.yuzu.yuzu_emu.utils.NativePostProcessing import org.yuzu.yuzu_emu.utils.ViewUtils import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible import org.yuzu.yuzu_emu.utils.collect @@ -883,6 +884,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { if (shouldUseCustom) { SettingsFile.loadCustomConfig(game!!) } + refreshPostProcessing() + addQuickSettings() } } @@ -1087,6 +1090,34 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } } + private fun withPerGameConfig(create: Boolean, action: () -> Unit) { + val target = game + var owned = false + if (target != null && !NativeConfig.isPerGameConfigLoaded()) { + if (create || SettingsFile.getCustomSettingsFile(target).exists()) { + SettingsFile.loadCustomConfig(target) + owned = true + } + } + action() + if (owned) { + NativeConfig.unloadPerGameConfig() + } + } + + fun refreshPostProcessing() = withPerGameConfig(false) { + NativePostProcessing.reload() + } + + fun persistPostProcessing() = withPerGameConfig(true) { + NativePostProcessing.persist() + } + + fun editPostProcessing(action: () -> Unit) = withPerGameConfig(true) { + action() + NativePostProcessing.persist() + } + private fun addQuickSettings() { binding.quickSettingsSheet.apply { val container = binding.quickSettingsSheet.findViewById(R.id.quick_settings_container) @@ -1194,6 +1225,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { R.array.rendererAntiAliasingNames, R.array.rendererAntiAliasingValues ) + + quickSettings.addPostProcessing(container) { + addQuickSettings() + } } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt index a2d6563e50..d2505c5f61 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/GamePropertiesFragment.kt @@ -383,6 +383,20 @@ class GamePropertiesFragment : Fragment() { } ) ) + add( + SubmenuProperty( + R.string.post_processing, + R.string.post_processing_per_game_description, + R.drawable.ic_post_processing, + action = { + val action = HomeNavigationDirections.actionGlobalSettingsActivity( + args.game, + Settings.MenuTag.SECTION_POST_PROCESSING + ) + binding.root.findNavController().navigate(action) + } + ) + ) if (GpuDriverHelper.isAdrenoGpu()) { add( diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt index bd4d8465f3..2b4cfc5ca8 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/HomeSettingsFragment.kt @@ -171,6 +171,20 @@ class HomeSettingsFragment : Fragment() { ) ) } + add( + HomeSetting( + R.string.post_processing, + R.string.post_processing_description, + R.drawable.ic_post_processing, + { + val action = HomeNavigationDirections.actionGlobalSettingsActivity( + null, + Settings.MenuTag.SECTION_POST_PROCESSING + ) + binding.root.findNavController().navigate(action) + } + ) + ) add( HomeSetting( R.string.lossless_scaling, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativePostProcessing.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativePostProcessing.kt new file mode 100644 index 0000000000..2c04900064 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativePostProcessing.kt @@ -0,0 +1,242 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +package org.yuzu.yuzu_emu.utils + +import org.json.JSONArray +import org.json.JSONObject + +object NativePostProcessing { + const val KIND_BOOL = 0 + const val KIND_INT = 1 + const val KIND_FLOAT = 2 + + const val UI_HIDDEN = 0 + const val UI_SLIDER = 1 + const val UI_DRAG = 2 + const val UI_COMBO = 3 + const val UI_RADIO = 4 + const val UI_CHECKBOX = 5 + const val UI_COLOR = 6 + const val UI_INPUT_BOX = 7 + + external fun getCatalogJson(): String + + external fun getChainJson(): String + + external fun append(file: String, technique: String) + + external fun replace(index: Int, file: String, technique: String) + + external fun remove(index: Int) + + external fun move(index: Int, delta: Int) + + external fun resetValues(index: Int) + + external fun getValue(index: Int, uniform: String, component: Int): Float + + external fun hasValue(index: Int, uniform: String): Boolean + + external fun setValue(index: Int, uniform: String, component: Int, value: Float) + + external fun store() + + external fun reload() + + external fun clearChain() + + external fun getPresetsJson(): String + + external fun getActivePreset(): String + + external fun isPresetModified(): Boolean + + external fun applyPreset(name: String): Boolean + + external fun savePreset(name: String, description: String): Boolean + + external fun deletePreset(name: String): Boolean + + external fun clearPreset() + + external fun isEnabled(): Boolean + + external fun setEnabled(enabled: Boolean) + + external fun getPresetDirectory(): String + + fun persist() { + val perGame = NativeConfig.isPerGameConfigLoaded() + store() + if (perGame) { + NativeConfig.savePerGameConfig() + } else { + NativeConfig.saveGlobalConfig() + } + } + + + external fun getShaderDirectory(): String + + data class Uniform( + val name: String, + val label: String, + val tooltip: String, + val category: String, + val kind: Int, + val uiType: Int, + val components: Int, + val min: Float, + val max: Float, + val step: Float, + val items: List, + val defaults: List + ) { + val steps: Int + get() { + val span = max - min + if (step <= 0f) { + return 1 + } + val count = Math.round(span / step) + if (count < 1) { + return 1 + } + return count + } + + fun describe(position: Int): String { + val value = min + position * step + if (kind == NativePostProcessing.KIND_FLOAT) { + return String.format("%.3f", value) + } + return Math.round(value).toString() + } + + fun defaultAt(component: Int): Float { + if (component < defaults.size) { + return defaults[component] + } + return 0f + } + } + + data class Effect( + val file: String, + val name: String, + val label: String, + val description: String, + val error: String, + val techniques: List, + val uniforms: List + ) { + val valid: Boolean + get() = error.isEmpty() && techniques.isNotEmpty() + } + + data class ChainEntry(val file: String, val technique: String) + + data class Preset( + val name: String, + val description: String, + val bundled: Boolean + ) + + fun presets(): List { + val out = mutableListOf() + val array = JSONArray(getPresetsJson()) + for (i in 0 until array.length()) { + val obj = array.getJSONObject(i) + out.add( + Preset( + name = obj.optString("name"), + description = obj.optString("description"), + bundled = obj.optBoolean("bundled") + ) + ) + } + return out + } + + fun catalog(): List { + val out = mutableListOf() + val array = JSONArray(getCatalogJson()) + for (i in 0 until array.length()) { + val obj = array.getJSONObject(i) + out.add( + Effect( + file = obj.optString("file"), + name = obj.optString("name"), + label = obj.optString("label"), + description = obj.optString("description"), + error = obj.optString("error"), + techniques = obj.optJSONArray("techniques").toStringList(), + uniforms = obj.optJSONArray("uniforms").toUniformList() + ) + ) + } + return out + } + + fun chain(): List { + val out = mutableListOf() + val array = JSONArray(getChainJson()) + for (i in 0 until array.length()) { + val obj = array.getJSONObject(i) + out.add(ChainEntry(obj.optString("file"), obj.optString("technique"))) + } + return out + } + + fun findEffect(file: String): Effect? = catalog().firstOrNull { it.file == file } + + private fun JSONArray?.toStringList(): List { + if (this == null) { + return emptyList() + } + val out = mutableListOf() + for (i in 0 until length()) { + out.add(optString(i)) + } + return out + } + + private fun JSONArray?.toFloatList(): List { + if (this == null) { + return emptyList() + } + val out = mutableListOf() + for (i in 0 until length()) { + out.add(optDouble(i, 0.0).toFloat()) + } + return out + } + + private fun JSONArray?.toUniformList(): List { + if (this == null) { + return emptyList() + } + val out = mutableListOf() + for (i in 0 until length()) { + val obj: JSONObject = optJSONObject(i) ?: continue + out.add( + Uniform( + name = obj.optString("name"), + label = obj.optString("label"), + tooltip = obj.optString("tooltip"), + category = obj.optString("category"), + kind = obj.optInt("kind", KIND_FLOAT), + uiType = obj.optInt("uiType", UI_HIDDEN), + components = obj.optInt("components", 1), + min = obj.optDouble("min", 0.0).toFloat(), + max = obj.optDouble("max", 1.0).toFloat(), + step = obj.optDouble("step", 0.01).toFloat(), + items = obj.optJSONArray("items").toStringList(), + defaults = obj.optJSONArray("defaults").toFloatList() + ) + ) + } + return out + } +} diff --git a/src/android/app/src/main/jni/CMakeLists.txt b/src/android/app/src/main/jni/CMakeLists.txt index 86c05d7c0d..337d9fea1b 100644 --- a/src/android/app/src/main/jni/CMakeLists.txt +++ b/src/android/app/src/main/jni/CMakeLists.txt @@ -17,6 +17,7 @@ add_library(yuzu-android SHARED android_config.cpp android_config.h native_input.cpp + native_post_processing.cpp ) set_property(TARGET yuzu-android PROPERTY IMPORTED_LOCATION ${FFmpeg_LIBRARY_DIR}) diff --git a/src/android/app/src/main/jni/native_config.cpp b/src/android/app/src/main/jni/native_config.cpp index 09a79ce4d7..1b8e343986 100644 --- a/src/android/app/src/main/jni/native_config.cpp +++ b/src/android/app/src/main/jni/native_config.cpp @@ -15,10 +15,22 @@ #include "frontend_common/config.h" #include "frontend_common/settings_generator.h" #include "native.h" +#ifdef HAS_RESHADE +#include "video_core/post_processing/fx_chain.h" +#endif std::unique_ptr global_config; std::unique_ptr per_game_config; +#ifdef HAS_RESHADE +static void ResetFxChainToGlobal() { + VideoCore::UseGlobalFxSettings(); + VideoCore::FxChain::Instance().LoadFromSettings(); +} +#else +static void ResetFxChainToGlobal() {} +#endif + template Settings::Setting* getSetting(JNIEnv* env, jstring jkey) { auto key = Common::Android::GetJString(env, jkey); @@ -39,6 +51,7 @@ extern "C" { void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_initializeGlobalConfig(JNIEnv* env, jobject obj) { global_config = std::make_unique(); FrontendCommon::GenerateSettings(); + ResetFxChainToGlobal(); } void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_unloadGlobalConfig(JNIEnv* env, jobject obj) { @@ -47,6 +60,7 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_unloadGlobalConfig(JNIEnv* env, void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_reloadGlobalConfig(JNIEnv* env, jobject obj) { global_config->AndroidConfig::ReloadAllValues(); + ResetFxChainToGlobal(); } void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_saveGlobalConfig(JNIEnv* env, jobject obj) { diff --git a/src/android/app/src/main/jni/native_post_processing.cpp b/src/android/app/src/main/jni/native_post_processing.cpp new file mode 100644 index 0000000000..7fb04e7f9f --- /dev/null +++ b/src/android/app/src/main/jni/native_post_processing.cpp @@ -0,0 +1,350 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include + +#include +#include + +#include "common/android/android_common.h" +#ifdef HAS_RESHADE +#include "android_config.h" +#include "video_core/post_processing/fx_chain.h" +#include "common/settings.h" +#include "video_core/post_processing/fx_effect.h" +#include "video_core/post_processing/fx_preset.h" + +extern std::unique_ptr per_game_config; +#endif + +namespace { + +#ifdef HAS_RESHADE +bool EditingPerGame() { + return per_game_config != nullptr; +} + +void BeginFxEdit() { + if (!EditingPerGame()) { + return; + } + VideoCore::UsePerGameFxSettings(); +} + +nlohmann::json SerializeUniform(const VideoCore::FxUniformDesc& uniform) { + nlohmann::json out; + out["name"] = uniform.name; + out["label"] = uniform.label; + out["tooltip"] = uniform.tooltip; + out["category"] = uniform.category; + out["kind"] = static_cast(uniform.kind); + out["uiType"] = static_cast(uniform.ui_type); + out["components"] = uniform.components; + out["min"] = uniform.ui_min; + out["max"] = uniform.ui_max; + out["step"] = uniform.ui_step; + out["items"] = uniform.items; + + nlohmann::json defaults = nlohmann::json::array(); + for (u32 i = 0; i < uniform.components; ++i) { + defaults.push_back(uniform.default_value[i]); + } + out["defaults"] = defaults; + + return out; +} + +std::array DefaultValueOf(size_t index, const std::string& uniform) { + const auto entries = VideoCore::FxChain::Instance().Entries(); + if (index >= entries.size()) { + return {}; + } + const VideoCore::FxEffectDesc* effect = VideoCore::FindFxEffect(entries[index].file); + if (effect == nullptr) { + return {}; + } + const VideoCore::FxUniformDesc* desc = VideoCore::FindFxUniform(*effect, uniform); + if (desc == nullptr) { + return {}; + } + return desc->default_value; +} +#endif + +} // Anonymous namespace + +extern "C" { + +jstring Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_getCatalogJson(JNIEnv* env, + jobject obj) { + nlohmann::json out = nlohmann::json::array(); + +#ifdef HAS_RESHADE + VideoCore::FxChain::Instance().DropUnknownEntries(); + + for (const auto& effect : VideoCore::GetFxCatalog()) { + nlohmann::json entry; + entry["file"] = effect.file; + entry["name"] = effect.name; + entry["label"] = effect.label; + entry["description"] = effect.description; + entry["error"] = effect.error; + entry["techniques"] = effect.techniques; + + nlohmann::json uniforms = nlohmann::json::array(); + for (const auto& uniform : effect.uniforms) { + uniforms.push_back(SerializeUniform(uniform)); + } + entry["uniforms"] = uniforms; + + out.push_back(entry); + } +#endif + + return Common::Android::ToJString(env, out.dump()); +} + +jstring Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_getChainJson(JNIEnv* env, jobject obj) { + nlohmann::json out = nlohmann::json::array(); + +#ifdef HAS_RESHADE + for (const auto& entry : VideoCore::FxChain::Instance().Entries()) { + nlohmann::json item; + item["file"] = entry.file; + item["technique"] = entry.technique; + + nlohmann::json values = nlohmann::json::object(); + for (const auto& [name, value] : entry.values) { + values[name] = {value[0], value[1], value[2], value[3]}; + } + item["values"] = values; + + out.push_back(item); + } +#endif + + return Common::Android::ToJString(env, out.dump()); +} + +void Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_append(JNIEnv* env, jobject obj, + jstring jfile, jstring jtechnique) { +#ifdef HAS_RESHADE + VideoCore::FxChain::Instance().Append(Common::Android::GetJString(env, jfile), + Common::Android::GetJString(env, jtechnique)); +#endif +} + +void Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_replace(JNIEnv* env, jobject obj, + jint index, jstring jfile, + jstring jtechnique) { +#ifdef HAS_RESHADE + VideoCore::FxChain::Instance().Replace(static_cast(index), + Common::Android::GetJString(env, jfile), + Common::Android::GetJString(env, jtechnique)); +#endif +} + +void Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_remove(JNIEnv* env, jobject obj, + jint index) { +#ifdef HAS_RESHADE + VideoCore::FxChain::Instance().Remove(static_cast(index)); +#endif +} + +void Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_move(JNIEnv* env, jobject obj, jint index, + jint delta) { +#ifdef HAS_RESHADE + VideoCore::FxChain::Instance().Move(static_cast(index), delta); +#endif +} + +void Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_resetValues(JNIEnv* env, jobject obj, + jint index) { +#ifdef HAS_RESHADE + VideoCore::FxChain::Instance().ResetValues(static_cast(index)); +#endif +} + +jfloat Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_getValue(JNIEnv* env, jobject obj, + jint index, jstring juniform, + jint component) { +#ifdef HAS_RESHADE + if (component < 0 || component >= 4) { + return 0.0f; + } + const auto value = VideoCore::FxChain::Instance().GetValue( + static_cast(index), Common::Android::GetJString(env, juniform)); + return value[static_cast(component)]; +#else + return 0.0f; +#endif +} + +jboolean Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_hasValue(JNIEnv* env, jobject obj, + jint index, + jstring juniform) { +#ifdef HAS_RESHADE + return static_cast(VideoCore::FxChain::Instance().HasValue( + static_cast(index), Common::Android::GetJString(env, juniform))); +#else + return static_cast(false); +#endif +} + +void Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_setValue(JNIEnv* env, jobject obj, + jint index, jstring juniform, + jint component, jfloat value) { +#ifdef HAS_RESHADE + if (component < 0 || component >= 4) { + return; + } + const std::string uniform = Common::Android::GetJString(env, juniform); + auto& chain = VideoCore::FxChain::Instance(); + const auto slot = static_cast(index); + + auto current = chain.GetValue(slot, uniform); + if (!chain.HasValue(slot, uniform)) { + current = DefaultValueOf(slot, uniform); + } + + current[static_cast(component)] = value; + chain.SetValue(slot, uniform, current); +#endif +} + +void Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_store(JNIEnv* env, jobject obj) { +#ifdef HAS_RESHADE + BeginFxEdit(); + VideoCore::FxChain::Instance().StoreToSettings(); +#endif +} + +void Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_reload(JNIEnv* env, jobject obj) { +#ifdef HAS_RESHADE + if (!EditingPerGame()) { + VideoCore::UseGlobalFxSettings(); + } + VideoCore::FxChain::Instance().LoadFromSettings(); +#endif +} + +void Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_clearChain(JNIEnv* env, jobject obj) { +#ifdef HAS_RESHADE + VideoCore::FxChain::Instance().Clear(); +#endif +} + +jstring Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_getShaderDirectory(JNIEnv* env, + jobject obj) { +#ifdef HAS_RESHADE + return Common::Android::ToJString(env, VideoCore::GetFxRootDirectory().string()); +#else + return Common::Android::ToJString(env, ""); +#endif +} + +jstring Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_getPresetsJson(JNIEnv* env, + jobject obj) { + nlohmann::json out = nlohmann::json::array(); +#ifdef HAS_RESHADE + VideoCore::ReloadFxPresetCatalog(); + + for (const auto& preset : VideoCore::GetFxPresetCatalog()) { + nlohmann::json entry; + entry["name"] = preset.name; + entry["description"] = preset.description; + entry["bundled"] = preset.bundled; + out.push_back(entry); + } +#endif + return Common::Android::ToJString(env, out.dump()); +} + +jstring Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_getActivePreset(JNIEnv* env, + jobject obj) { +#ifdef HAS_RESHADE + return Common::Android::ToJString(env, VideoCore::GetActiveFxPreset()); +#else + return Common::Android::ToJString(env, ""); +#endif +} + +jboolean Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_isPresetModified(JNIEnv* env, + jobject obj) { +#ifdef HAS_RESHADE + return static_cast(VideoCore::IsActiveFxPresetModified()); +#else + return static_cast(false); +#endif +} + +jboolean Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_applyPreset(JNIEnv* env, jobject obj, + jstring jname) { +#ifdef HAS_RESHADE + BeginFxEdit(); + return static_cast( + VideoCore::ApplyFxPreset(Common::Android::GetJString(env, jname))); +#else + return static_cast(false); +#endif +} + +jboolean Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_savePreset(JNIEnv* env, jobject obj, + jstring jname, + jstring jdescription) { +#ifdef HAS_RESHADE + BeginFxEdit(); + return static_cast( + VideoCore::SaveFxPreset(Common::Android::GetJString(env, jname), + Common::Android::GetJString(env, jdescription))); +#else + return static_cast(false); +#endif +} + +jboolean Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_deletePreset(JNIEnv* env, jobject obj, + jstring jname) { +#ifdef HAS_RESHADE + BeginFxEdit(); + return static_cast( + VideoCore::DeleteFxPreset(Common::Android::GetJString(env, jname))); +#else + return static_cast(false); +#endif +} + +void Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_clearPreset(JNIEnv* env, jobject obj) { +#ifdef HAS_RESHADE + BeginFxEdit(); + VideoCore::SetActiveFxPreset(std::string_view()); +#endif +} + +jboolean Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_isEnabled(JNIEnv* env, jobject obj) { +#ifdef HAS_RESHADE + return static_cast(Settings::values.post_shader_enabled.GetValue()); +#else + return static_cast(false); +#endif +} + +void Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_setEnabled(JNIEnv* env, jobject obj, + jboolean enabled) { +#ifdef HAS_RESHADE + BeginFxEdit(); + Settings::values.post_shader_enabled.SetValue(enabled != JNI_FALSE); +#endif +} + +jstring Java_org_yuzu_yuzu_1emu_utils_NativePostProcessing_getPresetDirectory(JNIEnv* env, + jobject obj) { +#ifdef HAS_RESHADE + return Common::Android::ToJString(env, VideoCore::GetFxPresetDirectory().string()); +#else + return Common::Android::ToJString(env, ""); +#endif +} + +} // extern "C" diff --git a/src/android/app/src/main/res/drawable/ic_post_processing.xml b/src/android/app/src/main/res/drawable/ic_post_processing.xml new file mode 100644 index 0000000000..06ce58d40e --- /dev/null +++ b/src/android/app/src/main/res/drawable/ic_post_processing.xml @@ -0,0 +1,10 @@ + + + diff --git a/src/android/app/src/main/res/drawable/shader_card_background.xml b/src/android/app/src/main/res/drawable/shader_card_background.xml new file mode 100644 index 0000000000..40e840695a --- /dev/null +++ b/src/android/app/src/main/res/drawable/shader_card_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/src/android/app/src/main/res/layout/item_quick_settings_add.xml b/src/android/app/src/main/res/layout/item_quick_settings_add.xml new file mode 100644 index 0000000000..1af62f917b --- /dev/null +++ b/src/android/app/src/main/res/layout/item_quick_settings_add.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/layout/item_quick_settings_preset.xml b/src/android/app/src/main/res/layout/item_quick_settings_preset.xml new file mode 100644 index 0000000000..935ce4d45d --- /dev/null +++ b/src/android/app/src/main/res/layout/item_quick_settings_preset.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/layout/item_quick_settings_shader.xml b/src/android/app/src/main/res/layout/item_quick_settings_shader.xml new file mode 100644 index 0000000000..dac3bb4de8 --- /dev/null +++ b/src/android/app/src/main/res/layout/item_quick_settings_shader.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/layout/item_setting_fx_actions.xml b/src/android/app/src/main/res/layout/item_setting_fx_actions.xml new file mode 100644 index 0000000000..c7df946416 --- /dev/null +++ b/src/android/app/src/main/res/layout/item_setting_fx_actions.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/src/android/app/src/main/res/layout/item_setting_fx_slider.xml b/src/android/app/src/main/res/layout/item_setting_fx_slider.xml new file mode 100644 index 0000000000..1e2989195f --- /dev/null +++ b/src/android/app/src/main/res/layout/item_setting_fx_slider.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/layout/list_item_setting_fx_button.xml b/src/android/app/src/main/res/layout/list_item_setting_fx_button.xml new file mode 100644 index 0000000000..8d207888cb --- /dev/null +++ b/src/android/app/src/main/res/layout/list_item_setting_fx_button.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/src/android/app/src/main/res/layout/list_item_setting_fx_preset.xml b/src/android/app/src/main/res/layout/list_item_setting_fx_preset.xml new file mode 100644 index 0000000000..a212f67f4b --- /dev/null +++ b/src/android/app/src/main/res/layout/list_item_setting_fx_preset.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/layout/list_item_setting_fx_shader.xml b/src/android/app/src/main/res/layout/list_item_setting_fx_shader.xml new file mode 100644 index 0000000000..e6f7b12eb4 --- /dev/null +++ b/src/android/app/src/main/res/layout/list_item_setting_fx_shader.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/layout/list_item_setting_fx_toolbar.xml b/src/android/app/src/main/res/layout/list_item_setting_fx_toolbar.xml new file mode 100644 index 0000000000..074c5a0662 --- /dev/null +++ b/src/android/app/src/main/res/layout/list_item_setting_fx_toolbar.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index f073000380..a9200bbca9 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -298,6 +298,25 @@ GPU driver fetcher GPU driver manager Install alternative drivers for potentially better performance or accuracy + Post-Processing Effects + ReShade FX effects applied after rendering + Configure the effect chain for this game + Add effect + Remove + Open list + Close list + Remove effects + Preset active. Edit it in Post-Processing Effects before starting a game. + Values changed from the original preset. + Presets + New preset + Saves the effects you have loaded, with their current values, as a preset you can pick later. + Give the preset a name without an equals sign. + No preset + Delete preset + Reset preset values + Reset to default + No effects found. Place .fx files in this folder: Frame generation Configure frame generation for this game Insert interpolated frames between rendered ones using Lossless Scaling. Forces FIFO presentation while enabled. diff --git a/src/common/fs/fs_paths.h b/src/common/fs/fs_paths.h index a31e609bda..ae25846fc2 100644 --- a/src/common/fs/fs_paths.h +++ b/src/common/fs/fs_paths.h @@ -23,6 +23,8 @@ #define LOSSLESS_DIR "lossless" #define NAND_DIR "nand" #define PLAY_TIME_DIR "play_time" +#define POST_PRESET_DIR "post_presets" +#define POST_SHADER_DIR "post_shaders" #define SCREENSHOTS_DIR "screenshots" #define SDMC_DIR "sdmc" #define SHADER_DIR "shader" diff --git a/src/common/fs/path_util.cpp b/src/common/fs/path_util.cpp index b4c7eae343..b895aac54c 100644 --- a/src/common/fs/path_util.cpp +++ b/src/common/fs/path_util.cpp @@ -160,6 +160,8 @@ public: GenerateEdenPath(EdenPath::LosslessDir, eden_path / LOSSLESS_DIR); GenerateEdenPath(EdenPath::NANDDir, eden_path / NAND_DIR); GenerateEdenPath(EdenPath::PlayTimeDir, eden_path / PLAY_TIME_DIR); + GenerateEdenPath(EdenPath::PostPresetDir, eden_path / POST_PRESET_DIR); + GenerateEdenPath(EdenPath::PostShaderDir, eden_path / POST_SHADER_DIR); GenerateEdenPath(EdenPath::SaveDir, eden_path / NAND_DIR); GenerateEdenPath(EdenPath::ScreenshotsDir, eden_path / SCREENSHOTS_DIR); GenerateEdenPath(EdenPath::SDMCDir, eden_path / SDMC_DIR); diff --git a/src/common/fs/path_util.h b/src/common/fs/path_util.h index febed9c388..983e4917e8 100644 --- a/src/common/fs/path_util.h +++ b/src/common/fs/path_util.h @@ -26,6 +26,8 @@ enum class EdenPath { LosslessDir, // Where the user-supplied Lossless Scaling library is stored. NANDDir, // Where the emulated NAND is stored. PlayTimeDir, // Where play time data is stored. + PostPresetDir, + PostShaderDir, // Where user post-processing shaders are stored. SaveDir, // Where save data is stored. ScreenshotsDir, // Where yuzu screenshots are stored. SDMCDir, // Where the emulated SDMC is stored. diff --git a/src/common/settings.h b/src/common/settings.h index d45f0b7bbc..6b60d633a5 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -388,6 +388,30 @@ struct Values { true, true}; + SwitchableSetting post_shader_chain{linkage, + std::string(), + "post_shader_chain", + Category::Renderer, + Specialization::Default, + true, + true}; + + SwitchableSetting post_shader_preset{linkage, + std::string(), + "post_shader_preset", + Category::Renderer, + Specialization::Default, + true, + true}; + + SwitchableSetting post_shader_enabled{linkage, + true, + "post_shader_enabled", + Category::Renderer, + Specialization::Default, + true, + true}; + SwitchableSetting frame_gen{linkage, false, "frame_gen", Category::Renderer, Specialization::Default, true, false}; diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index 7fd55ce038..be2f986eaf 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -150,6 +150,7 @@ std::unique_ptr InitializeTranslations(QObject* parent) { INSERT(Settings, anti_aliasing, tr("Anti-Aliasing Method:"), tr("The anti-aliasing method to use.\nSMAA offers the best quality.\nFXAA " "can produce a more stable picture in lower resolutions.")); + INSERT(Settings, post_shader_chain, QString(), QString()); INSERT(Settings, fullscreen_mode, tr("Fullscreen Mode:"), tr("The method used to render the window in fullscreen.\nBorderless offers the best " "compatibility with the on-screen keyboard that some games request for " diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 14bd13b8af..64d14ab2a6 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -302,6 +302,50 @@ if (ENABLE_LSFG) target_compile_definitions(video_core PUBLIC HAS_LSFG) endif() +if (ENABLE_RESHADE) + set(BUNDLED_FX_DIR ${CMAKE_SOURCE_DIR}/dist/post_shaders) + set(BUNDLED_FX_HEADER ${CMAKE_CURRENT_BINARY_DIR}/bundled_fx_effects.h) + file(GLOB BUNDLED_FX_FILES ${BUNDLED_FX_DIR}/*.fx) + + add_custom_command( + OUTPUT ${BUNDLED_FX_HEADER} + COMMAND ${CMAKE_COMMAND} -P + ${CMAKE_CURRENT_SOURCE_DIR}/post_processing/GenerateBundledEffects.cmake + ${BUNDLED_FX_DIR} ${BUNDLED_FX_HEADER} + DEPENDS ${BUNDLED_FX_FILES} + ) + + set(BUNDLED_PRESET_DIR ${CMAKE_SOURCE_DIR}/dist/post_presets) + set(BUNDLED_PRESET_HEADER ${CMAKE_CURRENT_BINARY_DIR}/bundled_fx_presets.h) + file(GLOB BUNDLED_PRESET_FILES ${BUNDLED_PRESET_DIR}/*.fxp) + + add_custom_command( + OUTPUT ${BUNDLED_PRESET_HEADER} + COMMAND ${CMAKE_COMMAND} -P + ${CMAKE_CURRENT_SOURCE_DIR}/post_processing/GenerateBundledPresets.cmake + ${BUNDLED_PRESET_DIR} ${BUNDLED_PRESET_HEADER} + DEPENDS ${BUNDLED_PRESET_FILES} + ) + + target_sources(video_core PRIVATE + post_processing/fx_chain.cpp + post_processing/fx_chain.h + post_processing/fx_compile.cpp + post_processing/fx_compile.h + post_processing/fx_effect.cpp + post_processing/fx_effect.h + post_processing/fx_preset.cpp + post_processing/fx_preset.h + renderer_vulkan/present/post_process.cpp + renderer_vulkan/present/post_process.h + ${BUNDLED_FX_HEADER} + ${BUNDLED_PRESET_HEADER} + ) + target_include_directories(video_core PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + target_link_libraries(video_core PRIVATE reshadefx::reshadefx) + target_compile_definitions(video_core PUBLIC HAS_RESHADE) +endif() + if (ENABLE_OPENGL) target_sources(video_core PRIVATE renderer_opengl/present/filters.cpp diff --git a/src/video_core/post_processing/GenerateBundledEffects.cmake b/src/video_core/post_processing/GenerateBundledEffects.cmake new file mode 100644 index 0000000000..d3aca02571 --- /dev/null +++ b/src/video_core/post_processing/GenerateBundledEffects.cmake @@ -0,0 +1,50 @@ +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +set(EFFECT_DIR ${CMAKE_ARGV3}) +set(HEADER_FILE ${CMAKE_ARGV4}) + +file(GLOB EFFECT_FILES ${EFFECT_DIR}/*.fx) +list(SORT EFFECT_FILES) + +set(ENTRIES "") +foreach(EFFECT_FILE IN LISTS EFFECT_FILES) + get_filename_component(EFFECT_NAME ${EFFECT_FILE} NAME) + file(READ ${EFFECT_FILE} EFFECT_BODY) + + string(REGEX REPLACE ";" "{{SEMICOLON}}" EFFECT_BODY "${EFFECT_BODY}") + string(REGEX REPLACE "\n" ";" EFFECT_BODY "${EFFECT_BODY}") + + set(EFFECT_TEXT "") + foreach(LINE IN LISTS EFFECT_BODY) + string(CONCAT EFFECT_TEXT "${EFFECT_TEXT}" " R\"(${LINE}\n)\"\n") + endforeach() + string(REGEX REPLACE "{{SEMICOLON}}" ";" EFFECT_TEXT "${EFFECT_TEXT}") + + string(CONCAT ENTRIES "${ENTRIES}" + " {\n \"${EFFECT_NAME}\",\n${EFFECT_TEXT} },\n") +endforeach() + +get_filename_component(OUTPUT_DIR ${HEADER_FILE} DIRECTORY) +make_directory(${OUTPUT_DIR}) + +file(WRITE ${HEADER_FILE} +"// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include + +namespace VideoCore { + +struct BundledFxEffect { + std::string_view name; + std::string_view source; +}; + +constexpr BundledFxEffect BUNDLED_FX_EFFECTS[]{ +${ENTRIES}}; + +} // namespace VideoCore +") diff --git a/src/video_core/post_processing/GenerateBundledPresets.cmake b/src/video_core/post_processing/GenerateBundledPresets.cmake new file mode 100644 index 0000000000..369a46748d --- /dev/null +++ b/src/video_core/post_processing/GenerateBundledPresets.cmake @@ -0,0 +1,50 @@ +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +set(PRESET_DIR ${CMAKE_ARGV3}) +set(HEADER_FILE ${CMAKE_ARGV4}) + +file(GLOB PRESET_FILES ${PRESET_DIR}/*.fxp) +list(SORT PRESET_FILES) + +set(ENTRIES "") +foreach(PRESET_FILE IN LISTS PRESET_FILES) + get_filename_component(PRESET_NAME ${PRESET_FILE} NAME) + file(READ ${PRESET_FILE} PRESET_BODY) + + string(REGEX REPLACE ";" "{{SEMICOLON}}" PRESET_BODY "${PRESET_BODY}") + string(REGEX REPLACE "\n" ";" PRESET_BODY "${PRESET_BODY}") + + set(PRESET_TEXT "") + foreach(LINE IN LISTS PRESET_BODY) + string(CONCAT PRESET_TEXT "${PRESET_TEXT}" " R\"(${LINE}\n)\"\n") + endforeach() + string(REGEX REPLACE "{{SEMICOLON}}" ";" PRESET_TEXT "${PRESET_TEXT}") + + string(CONCAT ENTRIES "${ENTRIES}" + " {\n \"${PRESET_NAME}\",\n${PRESET_TEXT} },\n") +endforeach() + +get_filename_component(OUTPUT_DIR ${HEADER_FILE} DIRECTORY) +make_directory(${OUTPUT_DIR}) + +file(WRITE ${HEADER_FILE} +"// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include + +namespace VideoCore { + +struct BundledFxPreset { + std::string_view name; + std::string_view source; +}; + +constexpr BundledFxPreset BUNDLED_FX_PRESETS[]{ +${ENTRIES}}; + +} // namespace VideoCore +") diff --git a/src/video_core/post_processing/fx_chain.cpp b/src/video_core/post_processing/fx_chain.cpp new file mode 100644 index 0000000000..882fdaf726 --- /dev/null +++ b/src/video_core/post_processing/fx_chain.cpp @@ -0,0 +1,321 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include + +#include + +#include "common/settings.h" +#include "video_core/post_processing/fx_chain.h" +#include "video_core/post_processing/fx_effect.h" + +namespace VideoCore { + +namespace { + +std::vector Split(std::string_view value, char separator) { + std::vector out; + size_t start = 0; + while (start <= value.size()) { + size_t end = value.find(separator, start); + if (end == std::string_view::npos) { + end = value.size(); + } + out.push_back(value.substr(start, end - start)); + start = end + 1; + } + return out; +} + +bool IsSerializableName(std::string_view value) { + return value.find_first_of(";|,=") == std::string_view::npos; +} + +} // Anonymous namespace + +std::vector ParseFxChain(std::string_view value) { + std::vector parsed; + + for (const std::string_view record : Split(value, ';')) { + if (record.empty()) { + continue; + } + + const auto fields = Split(record, '|'); + if (fields.size() < 2 || fields[0].empty() || fields[1].empty()) { + continue; + } + + FxChainEntry entry; + entry.file = std::string(fields[0]); + entry.technique = std::string(fields[1]); + + if (fields.size() >= 3) { + for (const std::string_view assignment : Split(fields[2], ',')) { + const size_t equals = assignment.find('='); + if (equals == std::string_view::npos) { + continue; + } + const std::string name(assignment.substr(0, equals)); + if (name.empty()) { + continue; + } + + std::array components{}; + size_t index = 0; + for (const std::string_view piece : Split(assignment.substr(equals + 1), '/')) { + if (index >= components.size()) { + break; + } + const std::string text(piece); + if (!text.empty()) { + components[index] = std::strtof(text.c_str(), nullptr); + } + ++index; + } + entry.values.emplace(name, components); + } + } + + parsed.push_back(std::move(entry)); + } + + return parsed; +} + +std::string SerializeFxChain(std::span entries) { + std::string out; + + for (const auto& entry : entries) { + if (!IsSerializableName(entry.file) || !IsSerializableName(entry.technique)) { + continue; + } + if (!out.empty()) { + out += ';'; + } + out += fmt::format("{}|{}|", entry.file, entry.technique); + + bool first = true; + for (const auto& [name, value] : entry.values) { + if (!IsSerializableName(name)) { + continue; + } + if (!first) { + out += ','; + } + first = false; + out += name; + out += '='; + for (size_t i = 0; i < value.size(); ++i) { + if (i > 0) { + out += '/'; + } + out += fmt::format("{}", value[i]); + } + } + } + + return out; +} + +void UseGlobalFxSettings() { + Settings::values.post_shader_chain.SetGlobal(true); + Settings::values.post_shader_preset.SetGlobal(true); + Settings::values.post_shader_enabled.SetGlobal(true); +} + +void UsePerGameFxSettings() { + const std::string chain = Settings::values.post_shader_chain.GetValue(); + const std::string preset = Settings::values.post_shader_preset.GetValue(); + const bool enabled = Settings::values.post_shader_enabled.GetValue(); + + Settings::values.post_shader_chain.SetGlobal(false); + Settings::values.post_shader_preset.SetGlobal(false); + Settings::values.post_shader_enabled.SetGlobal(false); + + Settings::values.post_shader_chain.SetValue(chain); + Settings::values.post_shader_preset.SetValue(preset); + Settings::values.post_shader_enabled.SetValue(enabled); +} + +FxChain& FxChain::Instance() { + static FxChain instance; + return instance; +} + +FxChainSnapshot FxChain::Snapshot() const { + std::scoped_lock lock{mutex}; + return FxChainSnapshot{ + .entries = entries, + .generation = generation.load(std::memory_order_relaxed), + }; +} + +std::vector FxChain::Entries() const { + std::scoped_lock lock{mutex}; + return entries; +} + +size_t FxChain::Size() const { + std::scoped_lock lock{mutex}; + return entries.size(); +} + +void FxChain::Append(std::string_view file, std::string_view technique) { + { + std::scoped_lock lock{mutex}; + FxChainEntry entry; + entry.file = std::string(file); + entry.technique = std::string(technique); + entries.push_back(std::move(entry)); + } + generation.fetch_add(1, std::memory_order_relaxed); +} + +void FxChain::Replace(size_t index, std::string_view file, std::string_view technique) { + { + std::scoped_lock lock{mutex}; + if (index >= entries.size()) { + return; + } + if (entries[index].file == file && entries[index].technique == technique) { + return; + } + FxChainEntry entry; + entry.file = std::string(file); + entry.technique = std::string(technique); + entries[index] = std::move(entry); + } + generation.fetch_add(1, std::memory_order_relaxed); +} + +void FxChain::Remove(size_t index) { + { + std::scoped_lock lock{mutex}; + if (index >= entries.size()) { + return; + } + entries.erase(entries.begin() + static_cast(index)); + } + generation.fetch_add(1, std::memory_order_relaxed); +} + +void FxChain::Move(size_t index, int delta) { + { + std::scoped_lock lock{mutex}; + if (index >= entries.size()) { + return; + } + const std::ptrdiff_t target = static_cast(index) + delta; + if (target < 0 || target >= static_cast(entries.size())) { + return; + } + std::swap(entries[index], entries[static_cast(target)]); + } + generation.fetch_add(1, std::memory_order_relaxed); +} + +void FxChain::Clear() { + { + std::scoped_lock lock{mutex}; + entries.clear(); + } + generation.fetch_add(1, std::memory_order_relaxed); +} + +void FxChain::SetEntries(std::vector next) { + { + std::scoped_lock lock{mutex}; + entries = std::move(next); + } + generation.fetch_add(1, std::memory_order_relaxed); +} + +void FxChain::SetValue(size_t index, std::string_view uniform, const std::array& value) { + std::scoped_lock lock{mutex}; + if (index >= entries.size()) { + return; + } + entries[index].values[std::string(uniform)] = value; +} + +std::array FxChain::GetValue(size_t index, std::string_view uniform) const { + std::scoped_lock lock{mutex}; + if (index >= entries.size()) { + return {}; + } + const auto it = entries[index].values.find(std::string(uniform)); + if (it == entries[index].values.end()) { + return {}; + } + return it->second; +} + +std::map> FxChain::EntryValues(size_t index) const { + std::scoped_lock lock{mutex}; + if (index >= entries.size()) { + return {}; + } + return entries[index].values; +} + +bool FxChain::HasValue(size_t index, std::string_view uniform) const { + std::scoped_lock lock{mutex}; + if (index >= entries.size()) { + return false; + } + return entries[index].values.contains(std::string(uniform)); +} + +void FxChain::ResetValues(size_t index) { + std::scoped_lock lock{mutex}; + if (index >= entries.size()) { + return; + } + entries[index].values.clear(); +} + +void FxChain::LoadFromSettings() { + auto parsed = ParseFxChain(Settings::values.post_shader_chain.GetValue()); + + std::scoped_lock lock{mutex}; + if (entries == parsed) { + return; + } + entries = std::move(parsed); + generation.fetch_add(1, std::memory_order_relaxed); +} + +void FxChain::StoreToSettings() const { + std::string serialized; + { + std::scoped_lock lock{mutex}; + serialized = SerializeFxChain(entries); + } + Settings::values.post_shader_chain.SetValue(serialized); +} + +void FxChain::DropUnknownEntries() { + bool changed = false; + { + std::scoped_lock lock{mutex}; + const auto removed = std::remove_if(entries.begin(), entries.end(), [](const FxChainEntry& entry) { + const FxEffectDesc* effect = FindFxEffect(entry.file); + if (effect == nullptr || !effect->Valid()) { + return true; + } + return std::find(effect->techniques.begin(), effect->techniques.end(), + entry.technique) == effect->techniques.end(); + }); + if (removed != entries.end()) { + entries.erase(removed, entries.end()); + changed = true; + } + } + if (changed) { + generation.fetch_add(1, std::memory_order_relaxed); + } +} + +} // namespace VideoCore diff --git a/src/video_core/post_processing/fx_chain.h b/src/video_core/post_processing/fx_chain.h new file mode 100644 index 0000000000..066f7e428d --- /dev/null +++ b/src/video_core/post_processing/fx_chain.h @@ -0,0 +1,86 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common/common_types.h" + +namespace VideoCore { + +struct FxChainEntry { + std::string file; + std::string technique; + std::map> values; + + bool operator==(const FxChainEntry&) const = default; +}; + +struct FxChainSnapshot { + std::vector entries; + u64 generation{}; +}; + +std::vector ParseFxChain(std::string_view value); + +std::string SerializeFxChain(std::span entries); + +void UseGlobalFxSettings(); + +void UsePerGameFxSettings(); + +class FxChain { +public: + static FxChain& Instance(); + + FxChainSnapshot Snapshot() const; + + std::vector Entries() const; + + size_t Size() const; + + void Append(std::string_view file, std::string_view technique); + + void Replace(size_t index, std::string_view file, std::string_view technique); + + void Remove(size_t index); + + void Move(size_t index, int delta); + + void Clear(); + + void SetEntries(std::vector next); + + void SetValue(size_t index, std::string_view uniform, const std::array& value); + + std::array GetValue(size_t index, std::string_view uniform) const; + + std::map> EntryValues(size_t index) const; + + bool HasValue(size_t index, std::string_view uniform) const; + + void ResetValues(size_t index); + + void LoadFromSettings(); + + void StoreToSettings() const; + + void DropUnknownEntries(); + +private: + FxChain() = default; + + mutable std::mutex mutex; + std::vector entries; + std::atomic generation{1}; +}; + +} // namespace VideoCore diff --git a/src/video_core/post_processing/fx_compile.cpp b/src/video_core/post_processing/fx_compile.cpp new file mode 100644 index 0000000000..5ee11e9187 --- /dev/null +++ b/src/video_core/post_processing/fx_compile.cpp @@ -0,0 +1,105 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include + +#include "effect_codegen.hpp" +#include "effect_parser.hpp" +#include "effect_preprocessor.hpp" + +#include "common/fs/fs.h" +#include "common/fs/fs_util.h" +#include "video_core/post_processing/fx_compile.h" +#include "video_core/post_processing/fx_effect.h" + +namespace VideoCore { + +FxCompileResult CompileFxEffect(const std::filesystem::path& path, u32 width, u32 height, + u32 color_bit_depth) { + FxCompileResult result; + + if (!Common::FS::Exists(path)) { + result.error = "Effect file not found: " + Common::FS::PathToUTF8String(path); + return result; + } + + reshadefx::preprocessor preprocessor; + preprocessor.add_macro_definition("__RESHADE__", "60800"); + preprocessor.add_macro_definition("__RESHADE_PERFORMANCE_MODE__", "1"); + preprocessor.add_macro_definition("__RENDERER__", "0x20000"); + preprocessor.add_macro_definition("__VENDOR__", "0"); + preprocessor.add_macro_definition("__DEVICE__", "0"); + preprocessor.add_macro_definition("__APPLICATION__", "0"); + preprocessor.add_macro_definition("BUFFER_WIDTH", std::to_string(width)); + preprocessor.add_macro_definition("BUFFER_HEIGHT", std::to_string(height)); + preprocessor.add_macro_definition("BUFFER_RCP_WIDTH", "(1.0 / BUFFER_WIDTH)"); + preprocessor.add_macro_definition("BUFFER_RCP_HEIGHT", "(1.0 / BUFFER_HEIGHT)"); + preprocessor.add_macro_definition("BUFFER_COLOR_DEPTH", std::to_string(color_bit_depth)); + preprocessor.add_macro_definition("BUFFER_COLOR_BIT_DEPTH", std::to_string(color_bit_depth)); + + for (const auto& include : GetFxIncludePaths(path)) { + preprocessor.add_include_path(include); + } + + if (!preprocessor.append_file(path)) { + result.error = preprocessor.errors(); + if (result.error.empty()) { + result.error = "Failed to preprocess " + Common::FS::PathToUTF8String(path); + } + return result; + } + + std::unique_ptr backend( + reshadefx::create_codegen_spirv(true, false, false, false, true)); + + reshadefx::parser parser; + if (!parser.parse(preprocessor.output(), backend.get())) { + result.error = parser.errors(); + if (result.error.empty()) { + result.error = "Failed to parse " + Common::FS::PathToUTF8String(path); + } + return result; + } + + result.module = backend->module(); + + std::set wanted; + for (const auto& technique : result.module.techniques) { + for (const auto& pass : technique.passes) { + if (!pass.vs_entry_point.empty()) { + wanted.insert(pass.vs_entry_point); + } + if (!pass.ps_entry_point.empty()) { + wanted.insert(pass.ps_entry_point); + } + } + } + + for (const auto& name : wanted) { + std::string binary; + std::string assembly; + std::string errors; + if (!backend->assemble_code_for_entry_point(name, binary, assembly, errors)) { + result.error = "Failed to assemble entry point '" + name + "': " + errors; + return result; + } + if (binary.size() % sizeof(u32) != 0) { + result.error = "Entry point '" + name + "' produced a malformed SPIR-V module"; + return result; + } + + std::vector words(binary.size() / sizeof(u32)); + std::memcpy(words.data(), binary.data(), binary.size()); + result.entry_points.emplace(name, std::move(words)); + } + + if (result.entry_points.empty()) { + result.error = "Effect declares no usable entry points"; + } + + return result; +} + +} // namespace VideoCore diff --git a/src/video_core/post_processing/fx_compile.h b/src/video_core/post_processing/fx_compile.h new file mode 100644 index 0000000000..f4b70f3a2c --- /dev/null +++ b/src/video_core/post_processing/fx_compile.h @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include +#include +#include + +#include "common/common_types.h" +#include "effect_module.hpp" + +namespace VideoCore { + +struct FxCompileResult { + reshadefx::effect_module module; + std::map> entry_points; + std::string error; + + bool Succeeded() const { + return error.empty() && !entry_points.empty(); + } +}; + +FxCompileResult CompileFxEffect(const std::filesystem::path& path, u32 width, u32 height, + u32 color_bit_depth); + +} // namespace VideoCore diff --git a/src/video_core/post_processing/fx_effect.cpp b/src/video_core/post_processing/fx_effect.cpp new file mode 100644 index 0000000000..7bb36b0467 --- /dev/null +++ b/src/video_core/post_processing/fx_effect.cpp @@ -0,0 +1,307 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include + +#include "bundled_fx_effects.h" +#include "common/fs/file.h" +#include "common/fs/fs.h" +#include "common/fs/fs_util.h" +#include "common/fs/path_util.h" +#include "common/logging.h" +#include "video_core/post_processing/fx_compile.h" +#include "video_core/post_processing/fx_effect.h" + +namespace VideoCore { + +namespace { + +constexpr u32 CATALOG_PROBE_WIDTH = 1280; +constexpr u32 CATALOG_PROBE_HEIGHT = 720; +constexpr u32 CATALOG_PROBE_DEPTH = 8; + +std::vector catalog; +bool catalog_scanned = false; + +const reshadefx::annotation* FindAnnotation(const std::vector& annotations, + std::string_view name) { + const auto it = std::find_if(annotations.begin(), annotations.end(), + [&](const reshadefx::annotation& a) { return a.name == name; }); + if (it == annotations.end()) { + return nullptr; + } + return &*it; +} + +std::string AnnotationString(const std::vector& annotations, + std::string_view name) { + const reshadefx::annotation* a = FindAnnotation(annotations, name); + if (a == nullptr) { + return std::string(); + } + return a->value.string_data; +} + +bool AnnotationFloat(const std::vector& annotations, std::string_view name, + f32& out) { + const reshadefx::annotation* a = FindAnnotation(annotations, name); + if (a == nullptr) { + return false; + } + if (a->type.is_floating_point()) { + out = a->value.as_float[0]; + return true; + } + if (a->type.is_integral()) { + out = static_cast(a->value.as_int[0]); + return true; + } + return false; +} + +FxUiType ParseUiType(std::string_view value) { + if (value == "slider") { + return FxUiType::Slider; + } + if (value == "drag") { + return FxUiType::Drag; + } + if (value == "combo") { + return FxUiType::Combo; + } + if (value == "radio") { + return FxUiType::Radio; + } + if (value == "check" || value == "checkbox") { + return FxUiType::CheckBox; + } + if (value == "color") { + return FxUiType::Color; + } + if (value == "input") { + return FxUiType::InputBox; + } + return FxUiType::Hidden; +} + +std::vector SplitItems(const std::string& items) { + std::vector out; + std::string current; + for (const char c : items) { + if (c == '\0') { + out.push_back(current); + current.clear(); + continue; + } + current += c; + } + if (!current.empty()) { + out.push_back(current); + } + return out; +} + +FxUniformDesc DescribeUniform(const reshadefx::uniform& info) { + FxUniformDesc desc; + desc.name = info.name; + desc.components = std::min(info.type.components(), 4); + + if (info.type.is_boolean()) { + desc.kind = FxUniformKind::Boolean; + } else if (info.type.is_integral()) { + desc.kind = FxUniformKind::Integer; + } else { + desc.kind = FxUniformKind::Floating; + } + + desc.label = AnnotationString(info.annotations, "ui_label"); + if (desc.label.empty()) { + desc.label = info.name; + } + desc.tooltip = AnnotationString(info.annotations, "ui_tooltip"); + desc.category = AnnotationString(info.annotations, "ui_category"); + desc.ui_type = ParseUiType(AnnotationString(info.annotations, "ui_type")); + desc.items = SplitItems(AnnotationString(info.annotations, "ui_items")); + + if (desc.kind == FxUniformKind::Boolean) { + desc.ui_min = 0.0f; + desc.ui_max = 1.0f; + desc.ui_step = 1.0f; + } else if (desc.kind == FxUniformKind::Integer) { + desc.ui_min = 0.0f; + desc.ui_max = 100.0f; + desc.ui_step = 1.0f; + } + + void(AnnotationFloat(info.annotations, "ui_min", desc.ui_min)); + void(AnnotationFloat(info.annotations, "ui_max", desc.ui_max)); + void(AnnotationFloat(info.annotations, "ui_step", desc.ui_step)); + + if (desc.ui_step <= 0.0f) { + desc.ui_step = 0.01f; + if (desc.kind != FxUniformKind::Floating) { + desc.ui_step = 1.0f; + } + } + if (desc.ui_max < desc.ui_min) { + std::swap(desc.ui_min, desc.ui_max); + } + + if (info.has_initializer_value) { + for (u32 i = 0; i < desc.components; ++i) { + if (desc.kind == FxUniformKind::Floating) { + desc.default_value[i] = info.initializer_value.as_float[i]; + } else { + desc.default_value[i] = static_cast(info.initializer_value.as_int[i]); + } + } + } + + return desc; +} + +FxEffectDesc DescribeEffect(const std::filesystem::path& path, const std::filesystem::path& root) { + FxEffectDesc desc; + desc.file = Common::FS::PathToUTF8String(std::filesystem::relative(path, root)); + desc.name = Common::FS::PathToUTF8String(path.stem()); + + const auto compiled = + CompileFxEffect(path, CATALOG_PROBE_WIDTH, CATALOG_PROBE_HEIGHT, CATALOG_PROBE_DEPTH); + if (!compiled.Succeeded()) { + desc.error = compiled.error; + return desc; + } + + for (const auto& technique : compiled.module.techniques) { + desc.techniques.push_back(technique.name); + } + + if (!compiled.module.techniques.empty()) { + const auto& annotations = compiled.module.techniques.front().annotations; + desc.label = AnnotationString(annotations, "ui_label"); + desc.description = AnnotationString(annotations, "ui_tooltip"); + } + if (desc.label.empty()) { + desc.label = desc.name; + } + + for (const auto& uniform : compiled.module.uniforms) { + FxUniformDesc uniform_desc = DescribeUniform(uniform); + if (uniform_desc.ui_type == FxUiType::Hidden) { + continue; + } + desc.uniforms.push_back(std::move(uniform_desc)); + } + + return desc; +} + +} // Anonymous namespace + +std::filesystem::path GetFxRootDirectory() { + return Common::FS::GetEdenPath(Common::FS::EdenPath::PostShaderDir); +} + +std::vector GetFxIncludePaths(const std::filesystem::path& effect_path) { + const auto root = GetFxRootDirectory(); + std::vector paths; + paths.push_back(effect_path.parent_path()); + paths.push_back(root); + paths.push_back(root / "Shaders"); + + const auto last = std::unique(paths.begin(), paths.end()); + paths.erase(last, paths.end()); + return paths; +} + +std::filesystem::path ResolveFxTexturePath(const std::filesystem::path& effect_path, + std::string_view source) { + const auto root = GetFxRootDirectory(); + const std::filesystem::path name{source}; + + const std::array candidates{ + effect_path.parent_path() / name, + root / "Textures" / name, + root / name, + }; + + for (const auto& candidate : candidates) { + if (Common::FS::Exists(candidate)) { + return candidate; + } + } + + return std::filesystem::path(); +} + +void ReloadFxCatalog() { + catalog.clear(); + catalog_scanned = true; + + const auto root = GetFxRootDirectory(); + if (!Common::FS::Exists(root) && !Common::FS::CreateDirs(root)) { + return; + } + + for (const auto& bundled : BUNDLED_FX_EFFECTS) { + const auto path = root / bundled.name; + if (Common::FS::Exists(path)) { + continue; + } + void(Common::FS::WriteStringToFile(path, Common::FS::FileType::TextFile, bundled.source)); + } + + std::vector effect_files; + Common::FS::IterateDirEntriesRecursively( + root, + [&](const std::filesystem::directory_entry& entry) { + if (entry.path().extension() == ".fx") { + effect_files.push_back(entry.path()); + } + return true; + }, + Common::FS::DirEntryFilter::File); + + std::sort(effect_files.begin(), effect_files.end()); + + for (const auto& file : effect_files) { + FxEffectDesc desc = DescribeEffect(file, root); + if (!desc.error.empty()) { + LOG_WARNING(Render, "Post-processing effect '{}' failed to compile:\n{}", desc.file, + desc.error); + } + catalog.push_back(std::move(desc)); + } + + const size_t usable = std::count_if(catalog.begin(), catalog.end(), + [](const FxEffectDesc& d) { return d.Valid(); }); + LOG_INFO(Render, "Loaded {} post-processing effects ({} usable)", catalog.size(), usable); +} + +const std::vector& GetFxCatalog() { + if (!catalog_scanned) { + ReloadFxCatalog(); + } + return catalog; +} + +const FxEffectDesc* FindFxEffect(std::string_view file) { + const auto& effects = GetFxCatalog(); + const auto it = std::find_if(effects.begin(), effects.end(), + [&](const FxEffectDesc& d) { return d.file == file; }); + if (it == effects.end()) { + return nullptr; + } + return &*it; +} + +const FxUniformDesc* FindFxUniform(const FxEffectDesc& effect, std::string_view name) { + const auto it = std::find_if(effect.uniforms.begin(), effect.uniforms.end(), + [&](const FxUniformDesc& u) { return u.name == name; }); + if (it == effect.uniforms.end()) { + return nullptr; + } + return &*it; +} + +} // namespace VideoCore diff --git a/src/video_core/post_processing/fx_effect.h b/src/video_core/post_processing/fx_effect.h new file mode 100644 index 0000000000..bedf68809a --- /dev/null +++ b/src/video_core/post_processing/fx_effect.h @@ -0,0 +1,77 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include +#include +#include +#include + +#include "common/common_types.h" + +namespace VideoCore { + +enum class FxUniformKind { + Boolean, + Integer, + Floating, +}; + +enum class FxUiType { + Hidden, + Slider, + Drag, + Combo, + Radio, + CheckBox, + Color, + InputBox, +}; + +struct FxUniformDesc { + std::string name; + std::string label; + std::string tooltip; + std::string category; + FxUniformKind kind{FxUniformKind::Floating}; + u32 components{1}; + FxUiType ui_type{FxUiType::Hidden}; + f32 ui_min{0.0f}; + f32 ui_max{1.0f}; + f32 ui_step{0.01f}; + std::vector items; + std::array default_value{}; +}; + +struct FxEffectDesc { + std::string file; + std::string name; + std::string label; + std::string description; + std::vector techniques; + std::vector uniforms; + std::string error; + + bool Valid() const { + return error.empty() && !techniques.empty(); + } +}; + +std::filesystem::path GetFxRootDirectory(); + +std::vector GetFxIncludePaths(const std::filesystem::path& effect_path); + +std::filesystem::path ResolveFxTexturePath(const std::filesystem::path& effect_path, + std::string_view source); + +void ReloadFxCatalog(); + +const std::vector& GetFxCatalog(); + +const FxEffectDesc* FindFxEffect(std::string_view file); + +const FxUniformDesc* FindFxUniform(const FxEffectDesc& effect, std::string_view name); + +} // namespace VideoCore diff --git a/src/video_core/post_processing/fx_preset.cpp b/src/video_core/post_processing/fx_preset.cpp new file mode 100644 index 0000000000..bd66a7d807 --- /dev/null +++ b/src/video_core/post_processing/fx_preset.cpp @@ -0,0 +1,261 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include + +#include "bundled_fx_presets.h" +#include "common/fs/file.h" +#include "common/fs/fs.h" +#include "common/fs/path_util.h" +#include "common/settings.h" +#include "video_core/post_processing/fx_chain.h" +#include "video_core/post_processing/fx_preset.h" + +namespace VideoCore { + +namespace { + +std::vector preset_catalog; +bool preset_catalog_scanned = false; + +std::string Trim(std::string_view value) { + size_t begin = 0; + while (begin < value.size() && (value[begin] == ' ' || value[begin] == '\t')) { + ++begin; + } + size_t end = value.size(); + while (end > begin) { + const char c = value[end - 1]; + if (c != ' ' && c != '\t' && c != '\r' && c != '\n') { + break; + } + --end; + } + return std::string(value.substr(begin, end - begin)); +} + +FxPresetDesc ParsePreset(std::string_view text) { + FxPresetDesc desc; + + size_t start = 0; + while (start <= text.size()) { + size_t end = text.find('\n', start); + if (end == std::string_view::npos) { + end = text.size(); + } + const std::string_view line = text.substr(start, end - start); + start = end + 1; + + const size_t equals = line.find('='); + if (equals == std::string_view::npos) { + continue; + } + + const std::string key = Trim(line.substr(0, equals)); + const std::string value = Trim(line.substr(equals + 1)); + + if (key == "name") { + desc.name = value; + } else if (key == "description") { + desc.description = value; + } else if (key == "chain") { + desc.chain = value; + } + } + + return desc; +} + +std::string PresetFileName(std::string_view name) { + std::string out; + for (const char c : name) { + if (c == ' ') { + out += '_'; + continue; + } + const bool keep = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9') || c == '-' || c == '_'; + if (keep) { + out += c; + } + } + if (out.empty()) { + out = "preset"; + } + return out + ".fxp"; +} + +std::string ComposePreset(const FxPresetDesc& desc) { + std::string out; + out += "name="; + out += desc.name; + out += '\n'; + out += "description="; + out += desc.description; + out += '\n'; + out += "chain="; + out += desc.chain; + out += '\n'; + return out; +} + +} // Anonymous namespace + +std::filesystem::path GetFxPresetDirectory() { + return Common::FS::GetEdenPath(Common::FS::EdenPath::PostPresetDir); +} + +void ReloadFxPresetCatalog() { + preset_catalog.clear(); + preset_catalog_scanned = true; + + const auto root = GetFxPresetDirectory(); + if (!Common::FS::Exists(root) && !Common::FS::CreateDirs(root)) { + return; + } + + std::vector bundled_names; + for (const auto& bundled : BUNDLED_FX_PRESETS) { + const auto path = root / bundled.name; + bundled_names.emplace_back(bundled.name); + if (Common::FS::Exists(path)) { + continue; + } + void(Common::FS::WriteStringToFile(path, Common::FS::FileType::TextFile, bundled.source)); + } + + std::vector preset_files; + Common::FS::IterateDirEntriesRecursively( + root, + [&](const std::filesystem::directory_entry& entry) { + if (entry.path().extension() == ".fxp") { + preset_files.push_back(entry.path()); + } + return true; + }, + Common::FS::DirEntryFilter::File); + + std::sort(preset_files.begin(), preset_files.end()); + + for (const auto& file : preset_files) { + const std::string text = + Common::FS::ReadStringFromFile(file, Common::FS::FileType::TextFile); + + FxPresetDesc desc = ParsePreset(text); + if (desc.name.empty() || desc.chain.empty()) { + continue; + } + + desc.file = Common::FS::PathToUTF8String(file.filename()); + desc.bundled = std::find(bundled_names.begin(), bundled_names.end(), desc.file) != + bundled_names.end(); + preset_catalog.push_back(std::move(desc)); + } +} + +const std::vector& GetFxPresetCatalog() { + if (!preset_catalog_scanned) { + ReloadFxPresetCatalog(); + } + return preset_catalog; +} + +const FxPresetDesc* FindFxPreset(std::string_view name) { + const auto& presets = GetFxPresetCatalog(); + const auto it = std::find_if(presets.begin(), presets.end(), + [&](const FxPresetDesc& p) { return p.name == name; }); + if (it == presets.end()) { + return nullptr; + } + return &*it; +} + +bool ApplyFxPreset(std::string_view name) { + const FxPresetDesc* preset = FindFxPreset(name); + if (preset == nullptr) { + return false; + } + + FxChain::Instance().SetEntries(ParseFxChain(preset->chain)); + FxChain::Instance().DropUnknownEntries(); + FxChain::Instance().StoreToSettings(); + SetActiveFxPreset(preset->name); + return true; +} + +bool SaveFxPreset(std::string_view name, std::string_view description) { + if (!IsFxPresetName(name)) { + return false; + } + + const auto root = GetFxPresetDirectory(); + if (!Common::FS::Exists(root) && !Common::FS::CreateDirs(root)) { + return false; + } + + FxPresetDesc desc; + desc.name = std::string(name); + desc.description = std::string(description); + desc.chain = SerializeFxChain(FxChain::Instance().Entries()); + + const std::string body = ComposePreset(desc); + const std::string file = PresetFileName(name); + if (Common::FS::WriteStringToFile(root / file, Common::FS::FileType::TextFile, body) != + body.size()) { + return false; + } + + ReloadFxPresetCatalog(); + SetActiveFxPreset(name); + return true; +} + +bool DeleteFxPreset(std::string_view name) { + const FxPresetDesc* preset = FindFxPreset(name); + if (preset == nullptr || preset->bundled) { + return false; + } + + const auto path = GetFxPresetDirectory() / preset->file; + if (!Common::FS::RemoveFile(path)) { + return false; + } + + if (GetActiveFxPreset() == name) { + SetActiveFxPreset(std::string_view()); + } + ReloadFxPresetCatalog(); + return true; +} + +bool IsFxPresetName(std::string_view name) { + if (name.empty()) { + return false; + } + return name.find_first_of("\r\n=") == std::string_view::npos; +} + +std::string GetActiveFxPreset() { + return Settings::values.post_shader_preset.GetValue(); +} + +void SetActiveFxPreset(std::string_view name) { + Settings::values.post_shader_preset.SetValue(std::string(name)); +} + +bool IsActiveFxPresetModified() { + const std::string active = GetActiveFxPreset(); + if (active.empty()) { + return false; + } + + const FxPresetDesc* preset = FindFxPreset(active); + if (preset == nullptr) { + return true; + } + + return SerializeFxChain(FxChain::Instance().Entries()) != + SerializeFxChain(ParseFxChain(preset->chain)); +} + +} // namespace VideoCore diff --git a/src/video_core/post_processing/fx_preset.h b/src/video_core/post_processing/fx_preset.h new file mode 100644 index 0000000000..23372b9495 --- /dev/null +++ b/src/video_core/post_processing/fx_preset.h @@ -0,0 +1,43 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include +#include +#include + +namespace VideoCore { + +struct FxPresetDesc { + std::string file; + std::string name; + std::string description; + std::string chain; + bool bundled{}; +}; + +std::filesystem::path GetFxPresetDirectory(); + +void ReloadFxPresetCatalog(); + +const std::vector& GetFxPresetCatalog(); + +const FxPresetDesc* FindFxPreset(std::string_view name); + +bool ApplyFxPreset(std::string_view name); + +bool SaveFxPreset(std::string_view name, std::string_view description); + +bool DeleteFxPreset(std::string_view name); + +bool IsFxPresetName(std::string_view name); + +std::string GetActiveFxPreset(); + +void SetActiveFxPreset(std::string_view name); + +bool IsActiveFxPresetModified(); + +} // namespace VideoCore diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp index 14935f92bb..1868142f51 100644 --- a/src/video_core/renderer_vulkan/present/layer.cpp +++ b/src/video_core/renderer_vulkan/present/layer.cpp @@ -18,6 +18,10 @@ #include "video_core/renderer_vulkan/present/sgsr.h" #include "video_core/renderer_vulkan/present/fxaa.h" #include "video_core/renderer_vulkan/present/layer.h" +#ifdef HAS_RESHADE +#include "video_core/post_processing/fx_chain.h" +#include "video_core/renderer_vulkan/present/post_process.h" +#endif #include "video_core/renderer_vulkan/present/present_push_constants.h" #include "video_core/renderer_vulkan/present/smaa.h" #include "video_core/renderer_vulkan/present/util.h" @@ -93,6 +97,9 @@ void Layer::ConfigureDraw(const Device& device, PresentPushConstants* out_push_c RefreshResources(device, framebuffer); SetAntiAliasPass(device); +#ifdef HAS_RESHADE + SetPostProcessPass(device); +#endif // Finish any pending renderpass scheduler.RequestOutsideRenderPassOperationContext(); @@ -115,6 +122,12 @@ void Layer::ConfigureDraw(const Device& device, PresentPushConstants* out_push_c smaa->Draw(device, scheduler, image_index, &source_image, &source_image_view); } +#ifdef HAS_RESHADE + if (post_process.has_value()) { + post_process->Draw(device, scheduler, image_index, &source_image, &source_image_view); + } +#endif + auto crop_rect = Tegra::NormalizeCrop(framebuffer, texture_width, texture_height); const VkExtent2D render_extent{ .width = scaled_width, @@ -214,6 +227,43 @@ void Layer::SetAntiAliasPass(const Device& device) { } } +#ifdef HAS_RESHADE +void Layer::SetPostProcessPass(const Device& device) { + const VkExtent2D render_area{ + .width = Settings::values.resolution_info.ScaleUp(raw_width), + .height = Settings::values.resolution_info.ScaleUp(raw_height), + }; + + const u64 generation = VideoCore::FxChain::Instance().Snapshot().generation; + const bool enabled = Settings::values.post_shader_enabled.GetValue(); + + if (post_process_generation == generation && post_process_enabled == enabled && + post_process_extent.width == render_area.width && + post_process_extent.height == render_area.height) { + return; + } + + for (const u64 tick : resource_ticks) { + scheduler.Wait(tick); + } + + post_process_generation = generation; + post_process_enabled = enabled; + post_process_extent = render_area; + post_process.reset(); + + if (!enabled || VideoCore::FxChain::Instance().Size() == 0) { + return; + } + + post_process.emplace(device, memory_allocator, scheduler, image_count, render_area); + + if (post_process->Empty()) { + post_process.reset(); + } +} +#endif + void Layer::ReleaseRawImages() { for (const u64 tick : resource_ticks) { scheduler.Wait(tick); diff --git a/src/video_core/renderer_vulkan/present/layer.h b/src/video_core/renderer_vulkan/present/layer.h index 4d75e86ba6..f290ba5bb4 100644 --- a/src/video_core/renderer_vulkan/present/layer.h +++ b/src/video_core/renderer_vulkan/present/layer.h @@ -15,6 +15,9 @@ #include "video_core/renderer_vulkan/present/fsr.h" #include "video_core/renderer_vulkan/present/sgsr.h" #include "video_core/renderer_vulkan/present/fxaa.h" +#ifdef HAS_RESHADE +#include "video_core/renderer_vulkan/present/post_process.h" +#endif #include "video_core/renderer_vulkan/present/smaa.h" namespace Layout { @@ -66,6 +69,9 @@ private: void RefreshResources(const Device& device, const Tegra::FramebufferConfig& framebuffer); void SetAntiAliasPass(const Device& device); +#ifdef HAS_RESHADE + void SetPostProcessPass(const Device& device); +#endif void ReleaseRawImages(); u64 CalculateBufferSize(const Tegra::FramebufferConfig& framebuffer) const; @@ -95,6 +101,12 @@ private: Settings::AntiAliasing anti_alias_setting{}; std::variant anti_alias{}; std::variant sr_filter{}; +#ifdef HAS_RESHADE + std::optional post_process{}; + u64 post_process_generation{}; + bool post_process_enabled{}; + VkExtent2D post_process_extent{}; +#endif std::vector resource_ticks{}; }; diff --git a/src/video_core/renderer_vulkan/present/post_process.cpp b/src/video_core/renderer_vulkan/present/post_process.cpp new file mode 100644 index 0000000000..07d75b7025 --- /dev/null +++ b/src/video_core/renderer_vulkan/present/post_process.cpp @@ -0,0 +1,899 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include + +#include "common/fs/fs.h" +#include "common/fs/fs_util.h" +#include "common/logging.h" +#include "video_core/post_processing/fx_chain.h" +#include "video_core/post_processing/fx_compile.h" +#include "video_core/post_processing/fx_effect.h" +#include "video_core/renderer_vulkan/present/post_process.h" +#include "video_core/renderer_vulkan/present/util.h" +#include "video_core/renderer_vulkan/vk_scheduler.h" +#include "video_core/vulkan_common/vulkan_device.h" + +namespace Vulkan { + +namespace { + +constexpr VkFormat BACKBUFFER_FORMAT = VK_FORMAT_R16G16B16A16_SFLOAT; +constexpr size_t NO_TEXTURE = ~size_t{0}; + +VkFormat ToVkFormat(reshadefx::texture_format format) { + switch (format) { + case reshadefx::texture_format::r8: + return VK_FORMAT_R8_UNORM; + case reshadefx::texture_format::r16f: + return VK_FORMAT_R16_SFLOAT; + case reshadefx::texture_format::r32f: + return VK_FORMAT_R32_SFLOAT; + case reshadefx::texture_format::rg8: + return VK_FORMAT_R8G8_UNORM; + case reshadefx::texture_format::rg16: + return VK_FORMAT_R16G16_UNORM; + case reshadefx::texture_format::rg16f: + return VK_FORMAT_R16G16_SFLOAT; + case reshadefx::texture_format::rg32f: + return VK_FORMAT_R32G32_SFLOAT; + case reshadefx::texture_format::rgba8: + return VK_FORMAT_R8G8B8A8_UNORM; + case reshadefx::texture_format::rgba16: + return VK_FORMAT_R16G16B16A16_UNORM; + case reshadefx::texture_format::rgba16f: + return VK_FORMAT_R16G16B16A16_SFLOAT; + case reshadefx::texture_format::rgba32f: + return VK_FORMAT_R32G32B32A32_SFLOAT; + case reshadefx::texture_format::rgb10a2: + return VK_FORMAT_A2B10G10R10_UNORM_PACK32; + default: + return VK_FORMAT_R8G8B8A8_UNORM; + } +} + +VkSamplerAddressMode ToAddressMode(reshadefx::texture_address_mode mode) { + switch (mode) { + case reshadefx::texture_address_mode::wrap: + return VK_SAMPLER_ADDRESS_MODE_REPEAT; + case reshadefx::texture_address_mode::mirror: + return VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT; + case reshadefx::texture_address_mode::border: + return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER; + case reshadefx::texture_address_mode::clamp: + default: + return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + } +} + +VkBlendFactor ToBlendFactor(reshadefx::blend_factor func) { + switch (func) { + case reshadefx::blend_factor::zero: + return VK_BLEND_FACTOR_ZERO; + case reshadefx::blend_factor::source_color: + return VK_BLEND_FACTOR_SRC_COLOR; + case reshadefx::blend_factor::source_alpha: + return VK_BLEND_FACTOR_SRC_ALPHA; + case reshadefx::blend_factor::one_minus_source_color: + return VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR; + case reshadefx::blend_factor::one_minus_source_alpha: + return VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + case reshadefx::blend_factor::dest_color: + return VK_BLEND_FACTOR_DST_COLOR; + case reshadefx::blend_factor::dest_alpha: + return VK_BLEND_FACTOR_DST_ALPHA; + case reshadefx::blend_factor::one_minus_dest_color: + return VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR; + case reshadefx::blend_factor::one_minus_dest_alpha: + return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA; + case reshadefx::blend_factor::one: + default: + return VK_BLEND_FACTOR_ONE; + } +} + +VkBlendOp ToBlendOp(reshadefx::blend_op op) { + switch (op) { + case reshadefx::blend_op::subtract: + return VK_BLEND_OP_SUBTRACT; + case reshadefx::blend_op::reverse_subtract: + return VK_BLEND_OP_REVERSE_SUBTRACT; + case reshadefx::blend_op::min: + return VK_BLEND_OP_MIN; + case reshadefx::blend_op::max: + return VK_BLEND_OP_MAX; + case reshadefx::blend_op::add: + default: + return VK_BLEND_OP_ADD; + } +} + +VkPrimitiveTopology ToTopology(reshadefx::primitive_topology topology) { + switch (topology) { + case reshadefx::primitive_topology::point_list: + return VK_PRIMITIVE_TOPOLOGY_POINT_LIST; + case reshadefx::primitive_topology::line_list: + return VK_PRIMITIVE_TOPOLOGY_LINE_LIST; + case reshadefx::primitive_topology::line_strip: + return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP; + case reshadefx::primitive_topology::triangle_strip: + return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; + case reshadefx::primitive_topology::triangle_list: + default: + return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + } +} + +vk::RenderPass CreateFxRenderPass(const Device& device, VkFormat format, bool clear) { + VkAttachmentLoadOp load_op = VK_ATTACHMENT_LOAD_OP_LOAD; + VkImageLayout initial_layout = VK_IMAGE_LAYOUT_GENERAL; + if (clear) { + load_op = VK_ATTACHMENT_LOAD_OP_CLEAR; + initial_layout = VK_IMAGE_LAYOUT_UNDEFINED; + } + + const VkAttachmentDescription attachment{ + .flags = 0, + .format = format, + .samples = VK_SAMPLE_COUNT_1_BIT, + .loadOp = load_op, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, + .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, + .initialLayout = initial_layout, + .finalLayout = VK_IMAGE_LAYOUT_GENERAL, + }; + + const VkAttachmentReference reference{ + .attachment = 0, + .layout = VK_IMAGE_LAYOUT_GENERAL, + }; + + const VkSubpassDescription subpass{ + .flags = 0, + .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, + .inputAttachmentCount = 0, + .pInputAttachments = nullptr, + .colorAttachmentCount = 1, + .pColorAttachments = &reference, + .pResolveAttachments = nullptr, + .pDepthStencilAttachment = nullptr, + .preserveAttachmentCount = 0, + .pPreserveAttachments = nullptr, + }; + + return device.GetLogical().CreateRenderPass(VkRenderPassCreateInfo{ + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .attachmentCount = 1, + .pAttachments = &attachment, + .subpassCount = 1, + .pSubpasses = &subpass, + .dependencyCount = 0, + .pDependencies = nullptr, + }); +} + +vk::Pipeline CreateFxPipeline(const Device& device, vk::RenderPass& renderpass, + vk::PipelineLayout& layout, VkShaderModule vertex_shader, + VkShaderModule fragment_shader, + const reshadefx::pass& pass) { + const std::array stages{{ + { + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .stage = VK_SHADER_STAGE_VERTEX_BIT, + .module = vertex_shader, + .pName = pass.vs_entry_point.c_str(), + .pSpecializationInfo = nullptr, + }, + { + .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .stage = VK_SHADER_STAGE_FRAGMENT_BIT, + .module = fragment_shader, + .pName = pass.ps_entry_point.c_str(), + .pSpecializationInfo = nullptr, + }, + }}; + + constexpr VkPipelineVertexInputStateCreateInfo vertex_input{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .vertexBindingDescriptionCount = 0, + .pVertexBindingDescriptions = nullptr, + .vertexAttributeDescriptionCount = 0, + .pVertexAttributeDescriptions = nullptr, + }; + + const VkPipelineInputAssemblyStateCreateInfo input_assembly{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .topology = ToTopology(pass.topology), + .primitiveRestartEnable = VK_FALSE, + }; + + constexpr VkPipelineViewportStateCreateInfo viewport_state{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .viewportCount = 1, + .pViewports = nullptr, + .scissorCount = 1, + .pScissors = nullptr, + }; + + constexpr VkPipelineRasterizationStateCreateInfo rasterization{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .depthClampEnable = VK_FALSE, + .rasterizerDiscardEnable = VK_FALSE, + .polygonMode = VK_POLYGON_MODE_FILL, + .cullMode = VK_CULL_MODE_NONE, + .frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE, + .depthBiasEnable = VK_FALSE, + .depthBiasConstantFactor = 0.0f, + .depthBiasClamp = 0.0f, + .depthBiasSlopeFactor = 0.0f, + .lineWidth = 1.0f, + }; + + constexpr VkPipelineMultisampleStateCreateInfo multisampling{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .rasterizationSamples = VK_SAMPLE_COUNT_1_BIT, + .sampleShadingEnable = VK_FALSE, + .minSampleShading = 0.0f, + .pSampleMask = nullptr, + .alphaToCoverageEnable = VK_FALSE, + .alphaToOneEnable = VK_FALSE, + }; + + VkBool32 blend_enable = VK_FALSE; + if (pass.blend_enable[0]) { + blend_enable = VK_TRUE; + } + + const VkPipelineColorBlendAttachmentState blending{ + .blendEnable = blend_enable, + .srcColorBlendFactor = ToBlendFactor(pass.source_color_blend_factor[0]), + .dstColorBlendFactor = ToBlendFactor(pass.dest_color_blend_factor[0]), + .colorBlendOp = ToBlendOp(pass.color_blend_op[0]), + .srcAlphaBlendFactor = ToBlendFactor(pass.source_alpha_blend_factor[0]), + .dstAlphaBlendFactor = ToBlendFactor(pass.dest_alpha_blend_factor[0]), + .alphaBlendOp = ToBlendOp(pass.alpha_blend_op[0]), + .colorWriteMask = static_cast(pass.render_target_write_mask[0] & 0xF), + }; + + const VkPipelineColorBlendStateCreateInfo color_blend{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .logicOpEnable = VK_FALSE, + .logicOp = VK_LOGIC_OP_COPY, + .attachmentCount = 1, + .pAttachments = &blending, + .blendConstants = {0.0f, 0.0f, 0.0f, 0.0f}, + }; + + constexpr std::array dynamic_states{ + VK_DYNAMIC_STATE_VIEWPORT, + VK_DYNAMIC_STATE_SCISSOR, + }; + + const VkPipelineDynamicStateCreateInfo dynamic_state{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .dynamicStateCount = static_cast(dynamic_states.size()), + .pDynamicStates = dynamic_states.data(), + }; + + return device.GetLogical().CreateGraphicsPipeline(VkGraphicsPipelineCreateInfo{ + .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .stageCount = static_cast(stages.size()), + .pStages = stages.data(), + .pVertexInputState = &vertex_input, + .pInputAssemblyState = &input_assembly, + .pTessellationState = nullptr, + .pViewportState = &viewport_state, + .pRasterizationState = &rasterization, + .pMultisampleState = &multisampling, + .pDepthStencilState = nullptr, + .pColorBlendState = &color_blend, + .pDynamicState = &dynamic_state, + .layout = *layout, + .renderPass = *renderpass, + .subpass = 0, + .basePipelineHandle = nullptr, + .basePipelineIndex = 0, + }); +} + +} // Anonymous namespace + +PostProcessChain::PostProcessChain(const Device& device, MemoryAllocator& allocator, + Scheduler& scheduler, size_t image_count, VkExtent2D extent) + : m_extent(extent) + , m_image_count(u32(image_count)) +{ + m_start = std::chrono::steady_clock::now(); + m_previous = m_start; + + CreatePingPongImages(device, allocator); + + m_fallback_sampler = CreateWrappedSampler(device); + m_fallback_image = CreateWrappedImage(allocator, VkExtent2D{1, 1}, VK_FORMAT_R8G8B8A8_UNORM); + m_fallback_view = CreateWrappedImageView(device, m_fallback_image, VK_FORMAT_R8G8B8A8_UNORM); + + if (!BuildEffects(device, allocator, scheduler)) { + m_effects.clear(); + } +} + +PostProcessChain::~PostProcessChain() = default; + +bool PostProcessChain::Empty() const { + return m_effects.empty(); +} + +void PostProcessChain::CreatePingPongImages(const Device& device, MemoryAllocator& allocator) { + m_frames.resize(m_image_count); + for (auto& frame : m_frames) { + for (size_t i = 0; i < frame.images.size(); ++i) { + frame.images[i] = CreateWrappedImage(allocator, m_extent, BACKBUFFER_FORMAT); + frame.views[i] = CreateWrappedImageView(device, frame.images[i], BACKBUFFER_FORMAT); + } + } +} + +bool PostProcessChain::BuildEffects(const Device& device, MemoryAllocator& allocator, + Scheduler& scheduler) { + const auto snapshot = VideoCore::FxChain::Instance().Snapshot(); + if (snapshot.entries.empty()) { + return true; + } + + const auto root = VideoCore::GetFxRootDirectory(); + + for (size_t entry_index = 0; entry_index < snapshot.entries.size(); ++entry_index) { + const auto& entry = snapshot.entries[entry_index]; + const auto path = root / entry.file; + + const auto compiled = VideoCore::CompileFxEffect(path, m_extent.width, m_extent.height, 8); + if (!compiled.Succeeded()) { + LOG_ERROR(Render_Vulkan, "Post-processing effect '{}' failed to compile:\n{}", + entry.file, compiled.error); + continue; + } + + const auto& module = compiled.module; + + const auto technique = std::find_if( + module.techniques.begin(), module.techniques.end(), + [&](const reshadefx::technique& t) { return t.name == entry.technique; }); + if (technique == module.techniques.end()) { + LOG_ERROR(Render_Vulkan, "Effect '{}' has no technique '{}'", entry.file, + entry.technique); + continue; + } + + Effect effect; + effect.entry_index = entry_index; + effect.file = entry.file; + effect.uniform_size = module.total_uniform_size; + for (const auto& [name, words] : compiled.entry_points) { + effect.shaders.emplace(name, CreateWrappedShaderModule(device, words)); + } + + for (const auto& texture : module.textures) { + Texture out; + out.name = texture.unique_name; + out.extent = VkExtent2D{texture.width, texture.height}; + out.format = ToVkFormat(texture.format); + + if (texture.semantic == "COLOR") { + out.is_backbuffer = true; + effect.textures.push_back(std::move(out)); + continue; + } + if (texture.semantic == "DEPTH") { + effect.textures.push_back(std::move(out)); + continue; + } + + out.image = CreateWrappedImage(allocator, out.extent, out.format); + out.view = CreateWrappedImageView(device, out.image, out.format); + effect.textures.push_back(std::move(out)); + } + + for (const auto& sampler : module.samplers) { + Sampler out; + out.texture_index = NO_TEXTURE; + for (size_t i = 0; i < effect.textures.size(); ++i) { + if (effect.textures[i].name == sampler.texture_name) { + out.texture_index = i; + break; + } + } + + VkFilter mag_filter = VK_FILTER_LINEAR; + VkFilter min_filter = VK_FILTER_LINEAR; + VkSamplerMipmapMode mip_mode = VK_SAMPLER_MIPMAP_MODE_LINEAR; + const u32 filter = static_cast(sampler.filter); + if ((filter & 0x10) == 0) { + min_filter = VK_FILTER_NEAREST; + } + if ((filter & 0x04) == 0) { + mag_filter = VK_FILTER_NEAREST; + } + if ((filter & 0x01) == 0) { + mip_mode = VK_SAMPLER_MIPMAP_MODE_NEAREST; + } + + out.sampler = device.GetLogical().CreateSampler(VkSamplerCreateInfo{ + .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .magFilter = mag_filter, + .minFilter = min_filter, + .mipmapMode = mip_mode, + .addressModeU = ToAddressMode(sampler.address_u), + .addressModeV = ToAddressMode(sampler.address_v), + .addressModeW = ToAddressMode(sampler.address_w), + .mipLodBias = sampler.lod_bias, + .anisotropyEnable = VK_FALSE, + .maxAnisotropy = 1.0f, + .compareEnable = VK_FALSE, + .compareOp = VK_COMPARE_OP_NEVER, + .minLod = sampler.min_lod, + .maxLod = sampler.max_lod, + .borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, + .unnormalizedCoordinates = VK_FALSE, + }); + + effect.samplers.push_back(std::move(out)); + } + + for (const auto& uniform : module.uniforms) { + UniformWrite write; + write.name = uniform.name; + write.offset = uniform.offset; + write.components = std::min(uniform.type.components(), 4); + write.kind = UniformKind::Floating; + if (uniform.type.is_boolean()) { + write.kind = UniformKind::Boolean; + } else if (uniform.type.is_integral()) { + write.kind = UniformKind::Integer; + } + + for (const auto& annotation : uniform.annotations) { + if (annotation.name != "source") { + continue; + } + const std::string& source = annotation.value.string_data; + if (source == "frametime") { + write.source = UniformSource::FrameTime; + } else if (source == "framecount") { + write.source = UniformSource::FrameCount; + } else if (source == "timer") { + write.source = UniformSource::Timer; + } else if (source == "random") { + write.source = UniformSource::Random; + } else if (source == "pingpong") { + write.source = UniformSource::PingPong; + } + } + + if (uniform.has_initializer_value) { + for (u32 i = 0; i < write.components; ++i) { + if (write.kind == UniformKind::Floating) { + write.fallback[i] = uniform.initializer_value.as_float[i]; + } else { + write.fallback[i] = static_cast(uniform.initializer_value.as_int[i]); + } + } + } + + write.args = {0.0f, 1.0f, 1.0f, 0.0f}; + for (const auto& annotation : uniform.annotations) { + if (annotation.name == "min" && annotation.type.is_floating_point()) { + write.args[0] = annotation.value.as_float[0]; + } + if (annotation.name == "max" && annotation.type.is_floating_point()) { + write.args[1] = annotation.value.as_float[0]; + } + if (annotation.name == "step" && annotation.type.is_floating_point()) { + write.args[2] = annotation.value.as_float[0]; + } + } + write.state = write.args[0]; + + effect.uniforms.push_back(std::move(write)); + } + + effect.uniform_layout = CreateWrappedDescriptorSetLayout( + device, std::array{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER}, + VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT); + + for (const auto& pass : technique->passes) { + Pass out; + out.num_vertices = pass.num_vertices; + out.clear = pass.clear_render_targets != 0; + out.target_texture = NO_TEXTURE; + out.extent = m_extent; + + const std::string& target = pass.render_target_names[0]; + if (target.empty()) { + out.writes_backbuffer = true; + } else { + for (size_t i = 0; i < effect.textures.size(); ++i) { + if (effect.textures[i].name == target) { + out.target_texture = i; + out.extent = effect.textures[i].extent; + break; + } + } + if (out.target_texture == NO_TEXTURE) { + LOG_WARNING(Render_Vulkan, "Effect '{}' pass targets unknown texture '{}'", + entry.file, target); + out.writes_backbuffer = true; + } + } + + if (pass.viewport_width != 0 && pass.viewport_height != 0) { + out.extent = VkExtent2D{pass.viewport_width, pass.viewport_height}; + } + + VkFormat target_format = BACKBUFFER_FORMAT; + if (!out.writes_backbuffer) { + target_format = effect.textures[out.target_texture].format; + } + + u32 binding_count = 0; + for (const auto& binding : pass.sampler_bindings) { + SamplerBinding entry_binding; + entry_binding.binding = binding.entry_point_binding; + entry_binding.sampler_index = binding.index; + out.sampler_bindings.push_back(entry_binding); + binding_count = std::max(binding_count, binding.entry_point_binding + 1); + } + + const std::vector sampler_types( + std::max(binding_count, 1), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER); + out.sampler_layout = CreateWrappedDescriptorSetLayout( + device, sampler_types, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT); + + const std::array set_layouts{*effect.uniform_layout, *out.sampler_layout}; + out.pipeline_layout = + device.GetLogical().CreatePipelineLayout(VkPipelineLayoutCreateInfo{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + .pNext = nullptr, + .flags = 0, + .setLayoutCount = static_cast(set_layouts.size()), + .pSetLayouts = set_layouts.data(), + .pushConstantRangeCount = 0, + .pPushConstantRanges = nullptr, + }); + + const auto vertex_shader = effect.shaders.find(pass.vs_entry_point); + const auto fragment_shader = effect.shaders.find(pass.ps_entry_point); + if (vertex_shader == effect.shaders.end() || + fragment_shader == effect.shaders.end()) { + LOG_WARNING(Render_Vulkan, "Effect '{}' pass references a missing entry point", + entry.file); + continue; + } + + out.renderpass = CreateFxRenderPass(device, target_format, out.clear); + out.pipeline = CreateFxPipeline(device, out.renderpass, out.pipeline_layout, + *vertex_shader->second, *fragment_shader->second, pass); + + if (out.writes_backbuffer) { + out.backbuffer_slot = static_cast(effect.backbuffer_pass_count % 2); + ++effect.backbuffer_pass_count; + for (u32 image = 0; image < m_image_count; ++image) { + for (size_t slot = 0; slot < 2; ++slot) { + out.framebuffers.push_back(CreateWrappedFramebuffer( + device, out.renderpass, m_frames[image].views[slot], out.extent)); + } + } + } else { + out.framebuffers.push_back( + CreateWrappedFramebuffer(device, out.renderpass, + effect.textures[out.target_texture].view, out.extent)); + } + + effect.passes.push_back(std::move(out)); + } + + if (effect.passes.empty()) { + LOG_WARNING(Render_Vulkan, "Effect '{}' technique '{}' has no passes", entry.file, + entry.technique); + continue; + } + + const u32 buffer_size = std::max(effect.uniform_size, 4); + for (u32 i = 0; i < m_image_count; ++i) { + effect.uniform_buffers.push_back( + CreateWrappedBuffer(allocator, buffer_size, MemoryUsage::Upload)); + } + + size_t sampler_descriptor_count = 0; + size_t sampler_set_count = 0; + for (const auto& pass : effect.passes) { + sampler_descriptor_count += + m_image_count * std::max(pass.sampler_bindings.size(), 1); + sampler_set_count += m_image_count; + } + + effect.descriptor_pool = CreateWrappedDescriptorPool( + device, m_image_count + sampler_descriptor_count, m_image_count + sampler_set_count, + {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER}); + + const std::vector uniform_layouts(m_image_count, + *effect.uniform_layout); + effect.uniform_sets = CreateWrappedDescriptorSets(effect.descriptor_pool, uniform_layouts); + + for (auto& pass : effect.passes) { + const std::vector layouts(m_image_count, *pass.sampler_layout); + pass.sampler_sets = CreateWrappedDescriptorSets(effect.descriptor_pool, layouts); + } + + m_effects.push_back(std::move(effect)); + } + + return true; +} + +void PostProcessChain::PrepareImages(const Device& device, Scheduler& scheduler) { + if (m_images_ready) { + return; + } + + scheduler.Record([this](vk::CommandBuffer cmdbuf) { + ClearColorImage(cmdbuf, *m_fallback_image); + for (auto& frame : m_frames) { + for (auto& image : frame.images) { + ClearColorImage(cmdbuf, *image); + } + } + for (auto& effect : m_effects) { + for (auto& texture : effect.textures) { + if (texture.image) { + ClearColorImage(cmdbuf, *texture.image); + } + } + } + }); + scheduler.Finish(); + + m_images_ready = true; +} + +void PostProcessChain::UpdateUniforms(Effect& effect, size_t image_index, f32 delta_seconds) { + if (effect.uniform_size == 0) { + return; + } + + static thread_local std::mt19937 rng{std::random_device{}()}; + + std::vector staging(effect.uniform_size, 0); + const f32 elapsed = + std::chrono::duration(std::chrono::steady_clock::now() - m_start).count(); + const auto overrides = VideoCore::FxChain::Instance().EntryValues(effect.entry_index); + + for (auto& uniform : effect.uniforms) { + std::array value = uniform.fallback; + + const auto override = overrides.find(uniform.name); + if (override != overrides.end()) { + value = override->second; + } + + switch (uniform.source) { + case UniformSource::FrameTime: + value[0] = delta_seconds * 1000.0f; + break; + case UniformSource::FrameCount: + value[0] = static_cast(m_frame_count); + break; + case UniformSource::Timer: + value[0] = elapsed * 1000.0f; + break; + case UniformSource::Random: { + const int low = static_cast(uniform.args[0]); + int high = static_cast(uniform.args[1]); + if (high <= low) { + high = low + 1; + } + std::uniform_int_distribution dist(low, high); + value[0] = static_cast(dist(rng)); + break; + } + case UniformSource::PingPong: { + const f32 min_value = uniform.args[0]; + f32 max_value = uniform.args[1]; + if (max_value <= min_value) { + max_value = min_value + 1.0f; + } + f32 step = uniform.args[2]; + if (step == 0.0f) { + step = 1.0f; + } + uniform.state += uniform.direction * step * delta_seconds; + if (uniform.state >= max_value) { + uniform.state = max_value; + uniform.direction = -1.0f; + } + if (uniform.state <= min_value) { + uniform.state = min_value; + uniform.direction = 1.0f; + } + value[0] = uniform.state; + value[1] = uniform.direction; + break; + } + case UniformSource::Value: + default: + break; + } + + for (u32 i = 0; i < uniform.components; ++i) { + const size_t offset = uniform.offset + i * sizeof(u32); + if (offset + sizeof(u32) > staging.size()) { + break; + } + if (uniform.kind == UniformKind::Floating) { + const f32 element = value[i]; + std::memcpy(staging.data() + offset, &element, sizeof(f32)); + } else { + const s32 element = static_cast(value[i]); + std::memcpy(staging.data() + offset, &element, sizeof(s32)); + } + } + } + + const std::span mapped = effect.uniform_buffers[image_index].Mapped(); + if (mapped.size() >= staging.size()) { + std::memcpy(mapped.data(), staging.data(), staging.size()); + effect.uniform_buffers[image_index].Flush(); + } +} + +void PostProcessChain::UpdateDescriptors(const Device& device, Effect& effect, Pass& pass, + size_t image_index, VkImageView backbuffer_view) { + std::vector image_infos; + std::vector writes; + image_infos.reserve(pass.sampler_bindings.size() + 1); + + const VkDescriptorSet sampler_set = pass.sampler_sets[image_index]; + + for (const auto& binding : pass.sampler_bindings) { + VkImageView view = *m_fallback_view; + VkSampler handle = *m_fallback_sampler; + + if (binding.sampler_index < effect.samplers.size()) { + const Sampler& sampler = effect.samplers[binding.sampler_index]; + if (sampler.sampler) { + handle = *sampler.sampler; + } + if (sampler.texture_index != NO_TEXTURE) { + const Texture& texture = effect.textures[sampler.texture_index]; + if (texture.is_backbuffer) { + view = backbuffer_view; + } else if (texture.view) { + view = *texture.view; + } + } + } + + writes.push_back( + CreateWriteDescriptorSet(image_infos, handle, view, sampler_set, binding.binding)); + } + + const VkDescriptorBufferInfo buffer_info{ + .buffer = *effect.uniform_buffers[image_index], + .offset = 0, + .range = VK_WHOLE_SIZE, + }; + + writes.push_back(VkWriteDescriptorSet{ + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .pNext = nullptr, + .dstSet = effect.uniform_sets[image_index], + .dstBinding = 0, + .dstArrayElement = 0, + .descriptorCount = 1, + .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + .pImageInfo = nullptr, + .pBufferInfo = &buffer_info, + .pTexelBufferView = nullptr, + }); + + device.GetLogical().UpdateDescriptorSets(writes, {}); +} + +void PostProcessChain::Draw(const Device& device, Scheduler& scheduler, size_t image_index, + VkImage* inout_image, VkImageView* inout_image_view) { + if (m_effects.empty()) { + return; + } + + PrepareImages(device, scheduler); + + const auto now = std::chrono::steady_clock::now(); + const f32 delta_seconds = std::chrono::duration(now - m_previous).count(); + m_previous = now; + ++m_frame_count; + + FrameImages& frame = m_frames[image_index]; + VkImage current_image = *inout_image; + VkImageView current_view = *inout_image_view; + u32 slot = 0; + + for (auto& effect : m_effects) { + UpdateUniforms(effect, image_index, delta_seconds); + + for (size_t pass_index = 0; pass_index < effect.passes.size(); ++pass_index) { + Pass& pass = effect.passes[pass_index]; + + UpdateDescriptors(device, effect, pass, image_index, current_view); + + VkFramebuffer framebuffer{}; + VkImage target_image{}; + if (pass.writes_backbuffer) { + const u32 target_slot = (slot + 1) % 2; + framebuffer = *pass.framebuffers[image_index * 2 + target_slot]; + target_image = *frame.images[target_slot]; + } else { + framebuffer = *pass.framebuffers[0]; + target_image = *effect.textures[pass.target_texture].image; + } + + const VkImage source_image = current_image; + const VkRenderPass renderpass = *pass.renderpass; + const VkPipeline pipeline = *pass.pipeline; + const VkPipelineLayout layout = *pass.pipeline_layout; + const VkDescriptorSet uniform_set = effect.uniform_sets[image_index]; + const VkDescriptorSet sampler_set = pass.sampler_sets[image_index]; + const VkExtent2D extent = pass.extent; + const u32 vertices = pass.num_vertices; + + scheduler.RequestOutsideRenderPassOperationContext(); + scheduler.Record([=](vk::CommandBuffer cmdbuf) { + TransitionImageLayout(cmdbuf, source_image, VK_IMAGE_LAYOUT_GENERAL); + TransitionImageLayout(cmdbuf, target_image, VK_IMAGE_LAYOUT_GENERAL); + BeginRenderPass(cmdbuf, renderpass, framebuffer, extent); + cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); + cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, + std::array{uniform_set, sampler_set}, {}); + cmdbuf.Draw(vertices, 1, 0, 0); + cmdbuf.EndRenderPass(); + TransitionImageLayout(cmdbuf, target_image, VK_IMAGE_LAYOUT_GENERAL); + }); + + if (pass.writes_backbuffer) { + slot = (slot + 1) % 2; + current_image = *frame.images[slot]; + current_view = *frame.views[slot]; + } + } + } + + *inout_image = current_image; + *inout_image_view = current_view; +} + +} // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/present/post_process.h b/src/video_core/renderer_vulkan/present/post_process.h new file mode 100644 index 0000000000..9d42bd4751 --- /dev/null +++ b/src/video_core/renderer_vulkan/present/post_process.h @@ -0,0 +1,140 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include +#include +#include +#include + +#include "common/common_types.h" +#include "video_core/vulkan_common/vulkan_memory_allocator.h" +#include "video_core/vulkan_common/vulkan_wrapper.h" + +namespace Vulkan { + +class Device; +class Scheduler; + +class PostProcessChain { +public: + explicit PostProcessChain(const Device& device, MemoryAllocator& allocator, Scheduler& scheduler, + size_t image_count, VkExtent2D extent); + ~PostProcessChain(); + + void Draw(const Device& device, Scheduler& scheduler, size_t image_index, VkImage* inout_image, + VkImageView* inout_image_view); + + bool Empty() const; + +private: + enum class UniformKind : u32 { + Boolean, + Integer, + Floating, + }; + + enum class UniformSource : u32 { + Value, + FrameTime, + FrameCount, + Timer, + Random, + PingPong, + }; + + struct UniformWrite { + std::string name; + u32 offset{}; + u32 components{}; + UniformKind kind{UniformKind::Floating}; + UniformSource source{UniformSource::Value}; + std::array fallback{}; + std::array args{}; + f32 state{}; + f32 direction{1.0f}; + }; + + struct Texture { + std::string name; + vk::Image image{}; + vk::ImageView view{}; + VkExtent2D extent{}; + VkFormat format{}; + bool is_backbuffer{}; + }; + + struct Sampler { + vk::Sampler sampler{}; + size_t texture_index{}; + }; + + struct SamplerBinding { + u32 binding{}; + size_t sampler_index{}; + }; + + struct Pass { + vk::RenderPass renderpass{}; + vk::Pipeline pipeline{}; + vk::DescriptorSetLayout sampler_layout{}; + vk::PipelineLayout pipeline_layout{}; + vk::DescriptorSets sampler_sets{}; + std::vector sampler_bindings{}; + std::vector framebuffers{}; + size_t target_texture{}; + VkExtent2D extent{}; + u32 num_vertices{3}; + bool clear{}; + bool writes_backbuffer{}; + u32 backbuffer_slot{}; + }; + + struct Effect { + size_t entry_index{}; + std::string file{}; + std::map shaders{}; + std::vector textures{}; + std::vector samplers{}; + std::vector passes{}; + std::vector uniforms{}; + u32 uniform_size{}; + std::vector uniform_buffers{}; + vk::DescriptorSetLayout uniform_layout{}; + vk::DescriptorPool descriptor_pool{}; + vk::DescriptorSets uniform_sets{}; + size_t backbuffer_pass_count{}; + u32 backbuffer_slots{1}; + }; + + struct FrameImages { + std::array images{}; + std::array views{}; + }; + + bool BuildEffects(const Device& device, MemoryAllocator& allocator, Scheduler& scheduler); + void CreatePingPongImages(const Device& device, MemoryAllocator& allocator); + void PrepareImages(const Device& device, Scheduler& scheduler); + void UpdateUniforms(Effect& effect, size_t image_index, f32 delta_seconds); + void UpdateDescriptors(const Device& device, Effect& effect, Pass& pass, size_t image_index, + VkImageView backbuffer_view); + + const VkExtent2D m_extent; + const u32 m_image_count; + + std::vector m_effects{}; + std::vector m_frames{}; + + vk::Sampler m_fallback_sampler{}; + vk::Image m_fallback_image{}; + vk::ImageView m_fallback_view{}; + + std::chrono::steady_clock::time_point m_start{}; + std::chrono::steady_clock::time_point m_previous{}; + u64 m_frame_count{}; + bool m_images_ready{}; +}; + +} // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 6290e79d93..4fd4c0233b 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -24,6 +24,9 @@ #include "video_core/gpu.h" #include "video_core/present.h" #include "video_core/renderer_vulkan/present/util.h" +#ifdef HAS_RESHADE +#include "video_core/post_processing/fx_chain.h" +#endif #include "video_core/renderer_vulkan/renderer_vulkan.h" #include "video_core/renderer_vulkan/vk_blit_screen.h" #include "video_core/renderer_vulkan/vk_rasterizer.h" @@ -183,6 +186,10 @@ try scheduler.RegisterOnSubmit([this] { turbo_mode->QueueSubmitted(); }); } +#ifdef HAS_RESHADE + VideoCore::FxChain::Instance().LoadFromSettings(); +#endif + Report(); } catch (const vk::Exception& exception) { LOG_ERROR(Render_Vulkan, "Vulkan initialization failed with error: {}", exception.what()); diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 021ed9ee3e..b93080f2a1 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -250,6 +250,12 @@ if (YUZU_CRASH_DUMPS) target_compile_definitions(yuzu PRIVATE YUZU_CRASH_DUMPS) endif() +if (ENABLE_RESHADE) + target_sources(yuzu PRIVATE + configuration/configure_post_processing.cpp + configuration/configure_post_processing.h) +endif() + if (CXX_CLANG) target_compile_definitions(yuzu PRIVATE $<$,15>:CANNOT_EXPLICITLY_INSTANTIATE>) diff --git a/src/yuzu/configuration/configure_post_processing.cpp b/src/yuzu/configuration/configure_post_processing.cpp new file mode 100644 index 0000000000..6fe46da6c5 --- /dev/null +++ b/src/yuzu/configuration/configure_post_processing.cpp @@ -0,0 +1,511 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common/settings.h" +#include "video_core/post_processing/fx_chain.h" +#include "video_core/post_processing/fx_effect.h" +#include "video_core/post_processing/fx_preset.h" +#include "yuzu/configuration/configure_post_processing.h" + +namespace { + +std::array CurrentValue(int index, const VideoCore::FxUniformDesc& uniform) { + auto& chain = VideoCore::FxChain::Instance(); + if (chain.HasValue(static_cast(index), uniform.name)) { + return chain.GetValue(static_cast(index), uniform.name); + } + return uniform.default_value; +} + +int SliderSteps(const VideoCore::FxUniformDesc& uniform) { + const float span = uniform.ui_max - uniform.ui_min; + const int steps = static_cast(std::lround(span / uniform.ui_step)); + if (steps < 1) { + return 1; + } + return steps; +} + +QString FormatValue(const VideoCore::FxUniformDesc& uniform, float value) { + if (uniform.kind == VideoCore::FxUniformKind::Floating) { + return QString::number(value, 'f', 3); + } + return QString::number(static_cast(std::lround(value))); +} + +QString SlotLabel(const VideoCore::FxEffectDesc& effect, const std::string& technique) { + const QString name = QString::fromStdString(effect.label); + if (effect.techniques.size() == 1) { + return name; + } + return name + QStringLiteral(" · ") + QString::fromStdString(technique); +} + +} // Anonymous namespace + +ConfigurePostProcessing::ConfigurePostProcessing(QWidget* parent) : QDialog(parent) { + setWindowTitle(tr("Post-Processing Effects")); + setMinimumWidth(560); + setMinimumHeight(460); + + auto* root = new QVBoxLayout(this); + + auto* description = new QLabel( + tr("ReShade FX effects are loaded from the post_shaders folder in the Eden data " + "directory. Changes apply immediately while a game is running."), + this); + description->setWordWrap(true); + root->addWidget(description); + + enabled_box = new QCheckBox(tr("Enable post-processing"), this); + enabled_box->setChecked(Settings::values.post_shader_enabled.GetValue()); + connect(enabled_box, &QCheckBox::toggled, this, [](bool checked) { + Settings::values.post_shader_enabled.SetValue(checked); + }); + root->addWidget(enabled_box); + + auto* preset_row = new QHBoxLayout(); + preset_row->addWidget(new QLabel(tr("Preset:"), this)); + + preset_combo = new QComboBox(this); + preset_row->addWidget(preset_combo, 1); + + auto* apply_button = new QPushButton(tr("Apply"), this); + connect(apply_button, &QPushButton::clicked, this, [this]() { + const QString name = preset_combo->currentData().toString(); + if (name.isEmpty()) { + return; + } + VideoCore::ApplyFxPreset(name.toStdString()); + ApplyStructuralChange(); + }); + preset_row->addWidget(apply_button); + + auto* reset_button = new QPushButton(tr("Reset Values"), this); + reset_button->setToolTip(tr("Return every effect to the values the preset ships with.")); + connect(reset_button, &QPushButton::clicked, this, [this]() { + const std::string active = VideoCore::GetActiveFxPreset(); + if (active.empty()) { + return; + } + VideoCore::ApplyFxPreset(active); + ApplyStructuralChange(); + }); + preset_row->addWidget(reset_button); + + auto* save_button = new QPushButton(tr("Save As..."), this); + connect(save_button, &QPushButton::clicked, this, [this]() { + bool accepted = false; + const QString name = + QInputDialog::getText(this, tr("Save Preset"), tr("Preset name:"), QLineEdit::Normal, + QString(), &accepted); + if (!accepted || name.trimmed().isEmpty()) { + return; + } + VideoCore::SaveFxPreset(name.trimmed().toStdString(), std::string()); + PopulatePresetCombo(); + RefreshPresetStatus(); + }); + preset_row->addWidget(save_button); + + auto* delete_button = new QPushButton(tr("Delete"), this); + connect(delete_button, &QPushButton::clicked, this, [this]() { + const QString name = preset_combo->currentData().toString(); + if (name.isEmpty()) { + return; + } + VideoCore::DeleteFxPreset(name.toStdString()); + PopulatePresetCombo(); + RefreshPresetStatus(); + }); + preset_row->addWidget(delete_button); + + root->addLayout(preset_row); + + preset_status = new QLabel(this); + preset_status->setWordWrap(true); + root->addWidget(preset_status); + + auto* scroll = new QScrollArea(this); + scroll->setWidgetResizable(true); + slots_container = new QWidget(scroll); + slots_layout = new QVBoxLayout(slots_container); + slots_layout->setAlignment(Qt::AlignTop); + scroll->setWidget(slots_container); + root->addWidget(scroll, 1); + + auto* actions = new QHBoxLayout(); + + auto* add_button = new QPushButton(tr("Add Effect"), this); + auto* add_menu = new QMenu(add_button); + for (const auto& effect : VideoCore::GetFxCatalog()) { + if (!effect.Valid()) { + continue; + } + for (const auto& technique : effect.techniques) { + QAction* action = add_menu->addAction(SlotLabel(effect, technique)); + action->setToolTip(QString::fromStdString(effect.description)); + const std::string file = effect.file; + const std::string name = technique; + connect(action, &QAction::triggered, this, [this, file, name]() { + VideoCore::FxChain::Instance().Append(file, name); + ApplyStructuralChange(); + }); + } + } + add_button->setMenu(add_menu); + actions->addWidget(add_button); + + actions->addStretch(); + root->addLayout(actions); + + auto* buttons = new QDialogButtonBox(QDialogButtonBox::Close, this); + connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::close); + root->addWidget(buttons); + + VideoCore::ReloadFxCatalog(); + VideoCore::ReloadFxPresetCatalog(); + VideoCore::FxChain::Instance().LoadFromSettings(); + VideoCore::FxChain::Instance().DropUnknownEntries(); + PopulatePresetCombo(); + RebuildRows(); + RefreshPresetStatus(); +} + +ConfigurePostProcessing::~ConfigurePostProcessing() = default; + +void ConfigurePostProcessing::ApplyStructuralChange() { + VideoCore::FxChain::Instance().StoreToSettings(); + RebuildRows(); + RefreshPresetStatus(); +} + +void ConfigurePostProcessing::PopulatePresetCombo() { + const QString previous = preset_combo->currentData().toString(); + preset_combo->clear(); + + for (const auto& preset : VideoCore::GetFxPresetCatalog()) { + const QString name = QString::fromStdString(preset.name); + preset_combo->addItem(name, name); + preset_combo->setItemData(preset_combo->count() - 1, + QString::fromStdString(preset.description), Qt::ToolTipRole); + } + + const int restored = preset_combo->findData(previous); + if (restored >= 0) { + preset_combo->setCurrentIndex(restored); + return; + } + + const int active = preset_combo->findData(QString::fromStdString(VideoCore::GetActiveFxPreset())); + if (active >= 0) { + preset_combo->setCurrentIndex(active); + } +} + +void ConfigurePostProcessing::RefreshPresetStatus() { + const std::string active = VideoCore::GetActiveFxPreset(); + if (active.empty()) { + preset_status->setText(tr("Custom chain. Pick a preset above and press Apply to replace it.")); + return; + } + + if (VideoCore::IsActiveFxPresetModified()) { + preset_status->setText( + tr("Active preset: %1 (modified). Press Reset Values to go back to how it ships.") + .arg(QString::fromStdString(active))); + return; + } + + preset_status->setText(tr("Active preset: %1").arg(QString::fromStdString(active))); +} + +void ConfigurePostProcessing::PopulateEffectCombo(QComboBox* combo, + const VideoCore::FxChainEntry& entry) const { + combo->clear(); + int selected = -1; + + for (const auto& effect : VideoCore::GetFxCatalog()) { + if (!effect.Valid()) { + continue; + } + for (const auto& technique : effect.techniques) { + const QString key = QString::fromStdString(effect.file + "|" + technique); + combo->addItem(SlotLabel(effect, technique), key); + combo->setItemData(combo->count() - 1, QString::fromStdString(effect.description), + Qt::ToolTipRole); + if (effect.file == entry.file && technique == entry.technique) { + selected = combo->count() - 1; + } + } + } + + if (selected >= 0) { + combo->setCurrentIndex(selected); + } +} + +void ConfigurePostProcessing::BuildUniformWidget(QWidget* parent, QVBoxLayout* layout, int index, + const VideoCore::FxUniformDesc& uniform) { + const auto value = CurrentValue(index, uniform); + const QString label = QString::fromStdString(uniform.label); + + if (uniform.ui_type == VideoCore::FxUiType::CheckBox) { + auto* box = new QCheckBox(label, parent); + box->setChecked(value[0] != 0.0f); + if (!uniform.tooltip.empty()) { + box->setToolTip(QString::fromStdString(uniform.tooltip)); + } + const std::string name = uniform.name; + connect(box, &QCheckBox::toggled, this, [index, name](bool checked) { + std::array next{}; + if (checked) { + next[0] = 1.0f; + } + VideoCore::FxChain::Instance().SetValue(static_cast(index), name, next); + VideoCore::FxChain::Instance().StoreToSettings(); + }); + layout->addWidget(box); + return; + } + + if (uniform.ui_type == VideoCore::FxUiType::Combo || + uniform.ui_type == VideoCore::FxUiType::Radio) { + auto* row = new QHBoxLayout(); + row->addWidget(new QLabel(label, parent)); + auto* combo = new QComboBox(parent); + for (size_t i = 0; i < uniform.items.size(); ++i) { + combo->addItem(QString::fromStdString(uniform.items[i]), static_cast(i)); + } + if (combo->count() == 0) { + combo->addItem(tr("Enabled"), 1); + combo->addItem(tr("Disabled"), 0); + } + const int current = static_cast(std::lround(value[0])); + if (current >= 0 && current < combo->count()) { + combo->setCurrentIndex(current); + } + if (!uniform.tooltip.empty()) { + combo->setToolTip(QString::fromStdString(uniform.tooltip)); + } + const std::string name = uniform.name; + connect(combo, &QComboBox::currentIndexChanged, this, [index, name](int selected) { + std::array next{}; + next[0] = static_cast(selected); + VideoCore::FxChain::Instance().SetValue(static_cast(index), name, next); + VideoCore::FxChain::Instance().StoreToSettings(); + }); + row->addWidget(combo, 1); + layout->addLayout(row); + return; + } + + auto* grid = new QGridLayout(); + for (unsigned component = 0; component < uniform.components; ++component) { + QString component_label = label; + if (uniform.components > 1) { + component_label = label + QStringLiteral(" [%1]").arg(component); + } + + auto* name_label = new QLabel(component_label, parent); + auto* value_label = new QLabel(parent); + value_label->setMinimumWidth(64); + value_label->setAlignment(Qt::AlignRight | Qt::AlignVCenter); + value_label->setText(FormatValue(uniform, value[component])); + + auto* slider = new QSlider(Qt::Horizontal, parent); + slider->setMinimum(0); + slider->setMaximum(SliderSteps(uniform)); + slider->setValue( + static_cast(std::lround((value[component] - uniform.ui_min) / uniform.ui_step))); + if (!uniform.tooltip.empty()) { + slider->setToolTip(QString::fromStdString(uniform.tooltip)); + } + + const std::string name = uniform.name; + const auto desc = uniform; + connect(slider, &QSlider::valueChanged, this, + [index, name, desc, component, value_label](int steps) { + auto next = CurrentValue(index, desc); + next[component] = desc.ui_min + static_cast(steps) * desc.ui_step; + VideoCore::FxChain::Instance().SetValue(static_cast(index), name, next); + VideoCore::FxChain::Instance().StoreToSettings(); + value_label->setText(FormatValue(desc, next[component])); + }); + + grid->addWidget(name_label, static_cast(component), 0); + grid->addWidget(slider, static_cast(component), 1); + grid->addWidget(value_label, static_cast(component), 2); + } + layout->addLayout(grid); +} + +QWidget* ConfigurePostProcessing::BuildSlot(int index, const VideoCore::FxChainEntry& entry) { + auto* group = new QFrame(slots_container); + group->setObjectName(QStringLiteral("fxSlot")); + group->setStyleSheet(QStringLiteral( + "QFrame#fxSlot { background-color: palette(alternate-base);" + " border: 1px solid palette(mid); border-radius: 6px; }")); + auto* layout = new QVBoxLayout(group); + + auto* header = new QHBoxLayout(); + + auto* toggle = new QToolButton(group); + toggle->setArrowType(Qt::RightArrow); + toggle->setAutoRaise(true); + toggle->setCheckable(true); + header->addWidget(toggle); + + auto* combo = new QComboBox(group); + PopulateEffectCombo(combo, entry); + connect(combo, &QComboBox::currentIndexChanged, this, [this, index, combo](int) { + const QString key = combo->currentData().toString(); + const qsizetype separator = key.indexOf(QLatin1Char('|')); + if (separator < 0) { + return; + } + VideoCore::FxChain::Instance().Replace(static_cast(index), + key.left(separator).toStdString(), + key.mid(separator + 1).toStdString()); + ApplyStructuralChange(); + }); + header->addWidget(combo, 1); + + auto* up_button = new QToolButton(group); + up_button->setText(QStringLiteral("▲")); + up_button->setEnabled(index > 0); + connect(up_button, &QToolButton::clicked, this, [this, index]() { + VideoCore::FxChain::Instance().Move(static_cast(index), -1); + ApplyStructuralChange(); + }); + header->addWidget(up_button); + + auto* down_button = new QToolButton(group); + down_button->setText(QStringLiteral("▼")); + down_button->setEnabled(static_cast(index) + 1 < VideoCore::FxChain::Instance().Size()); + connect(down_button, &QToolButton::clicked, this, [this, index]() { + VideoCore::FxChain::Instance().Move(static_cast(index), 1); + ApplyStructuralChange(); + }); + header->addWidget(down_button); + + auto* reset_button = new QToolButton(group); + reset_button->setText(QStringLiteral("⟲")); + reset_button->setToolTip(tr("Reset to defaults")); + connect(reset_button, &QToolButton::clicked, this, [this, index]() { + VideoCore::FxChain::Instance().ResetValues(static_cast(index)); + ApplyStructuralChange(); + }); + header->addWidget(reset_button); + + auto* remove_button = new QToolButton(group); + remove_button->setText(QStringLiteral("✕")); + connect(remove_button, &QToolButton::clicked, this, [this, index]() { + VideoCore::FxChain::Instance().Remove(static_cast(index)); + ApplyStructuralChange(); + }); + header->addWidget(remove_button); + + layout->addLayout(header); + + auto* body = new QWidget(group); + auto* body_layout = new QVBoxLayout(body); + body_layout->setContentsMargins(0, 0, 0, 0); + body->setVisible(false); + layout->addWidget(body); + + connect(toggle, &QToolButton::toggled, this, [toggle, body](bool open) { + body->setVisible(open); + if (open) { + toggle->setArrowType(Qt::DownArrow); + } else { + toggle->setArrowType(Qt::RightArrow); + } + }); + + const VideoCore::FxEffectDesc* effect = VideoCore::FindFxEffect(entry.file); + if (effect == nullptr) { + auto* missing = + new QLabel(tr("Effect '%1' was not found.").arg(QString::fromStdString(entry.file)), + group); + missing->setWordWrap(true); + body_layout->addWidget(missing); + return group; + } + + if (!effect->error.empty()) { + auto* failed = new QLabel( + tr("Effect failed to compile:\n%1").arg(QString::fromStdString(effect->error)), group); + failed->setWordWrap(true); + body_layout->addWidget(failed); + return group; + } + + std::string current_category; + for (const auto& uniform : effect->uniforms) { + if (uniform.category != current_category) { + current_category = uniform.category; + if (!current_category.empty()) { + auto* category = new QLabel(QString::fromStdString(current_category), group); + category->setStyleSheet(QStringLiteral("font-weight: bold;")); + body_layout->addWidget(category); + } + } + BuildUniformWidget(body, body_layout, index, uniform); + } + + return group; +} + +void ConfigurePostProcessing::RebuildRows() { + QLayoutItem* item = nullptr; + while ((item = slots_layout->takeAt(0)) != nullptr) { + if (item->widget() != nullptr) { + item->widget()->deleteLater(); + } + delete item; + } + + bool has_usable = false; + for (const auto& effect : VideoCore::GetFxCatalog()) { + if (effect.Valid()) { + has_usable = true; + break; + } + } + + if (!has_usable) { + auto* empty = new QLabel( + tr("No usable ReShade FX effects were found. Place .fx files in the post_shaders " + "folder."), + slots_container); + empty->setWordWrap(true); + slots_layout->addWidget(empty); + return; + } + + const auto entries = VideoCore::FxChain::Instance().Entries(); + for (size_t i = 0; i < entries.size(); ++i) { + slots_layout->addWidget(BuildSlot(static_cast(i), entries[i])); + } +} diff --git a/src/yuzu/configuration/configure_post_processing.h b/src/yuzu/configuration/configure_post_processing.h new file mode 100644 index 0000000000..5873bbaa01 --- /dev/null +++ b/src/yuzu/configuration/configure_post_processing.h @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include + +class QCheckBox; +class QComboBox; +class QLabel; +class QVBoxLayout; +class QWidget; + +namespace VideoCore { +struct FxChainEntry; +struct FxEffectDesc; +struct FxUniformDesc; +} + +class ConfigurePostProcessing : public QDialog { + Q_OBJECT + +public: + explicit ConfigurePostProcessing(QWidget* parent = nullptr); + ~ConfigurePostProcessing() override; + +private: + void RebuildRows(); + QWidget* BuildSlot(int index, const VideoCore::FxChainEntry& entry); + void BuildUniformWidget(QWidget* parent, QVBoxLayout* layout, int index, + const VideoCore::FxUniformDesc& uniform); + void PopulateEffectCombo(QComboBox* combo, const VideoCore::FxChainEntry& entry) const; + void ApplyStructuralChange(); + void PopulatePresetCombo(); + void RefreshPresetStatus(); + + QVBoxLayout* slots_layout{}; + QWidget* slots_container{}; + QComboBox* preset_combo{}; + QLabel* preset_status{}; + QCheckBox* enabled_box{}; +}; diff --git a/src/yuzu/main.ui b/src/yuzu/main.ui index 13ded52cc0..92b725fa11 100644 --- a/src/yuzu/main.ui +++ b/src/yuzu/main.ui @@ -148,6 +148,7 @@ + @@ -604,6 +605,11 @@ Show &Performance Overlay + + + Post-Processing &Shaders... + + true diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 9a167e18f7..95b91a4f38 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -13,6 +13,9 @@ #include "common/settings_enums.h" #include "frontend_common/settings_generator.h" #include "render/performance_overlay.h" +#ifdef HAS_RESHADE +#include "configuration/configure_post_processing.h" +#endif #include "updater/update_dialog.h" #include "common/fs/ryujinx_compat.h" @@ -1517,6 +1520,11 @@ void MainWindow::ConnectMenuEvents() { connect_menu(ui->action_Show_Filter_Bar, &MainWindow::OnToggleFilterBar); connect_menu(ui->action_Show_Status_Bar, &MainWindow::OnToggleStatusBar); connect_menu(ui->action_Show_Performance_Overlay, &MainWindow::OnTogglePerfOverlay); +#ifdef HAS_RESHADE + connect_menu(ui->action_Post_Processing_Shaders, &MainWindow::OnPostProcessingShaders); +#else + ui->action_Post_Processing_Shaders->setVisible(false); +#endif connect_menu(ui->action_Reset_Window_Size_720, &MainWindow::ResetWindowSize720); connect_menu(ui->action_Reset_Window_Size_900, &MainWindow::ResetWindowSize900); @@ -3893,6 +3901,22 @@ void MainWindow::OnTogglePerfOverlay() { perf_overlay->setVisible(ui->action_Show_Performance_Overlay->isChecked()); } +#ifdef HAS_RESHADE +void MainWindow::OnPostProcessingShaders() { + if (post_processing_dialog == nullptr) { + post_processing_dialog = new ConfigurePostProcessing(this); + connect(post_processing_dialog, &QDialog::finished, post_processing_dialog, [this]() { + post_processing_dialog->deleteLater(); + post_processing_dialog = nullptr; + }); + } + + post_processing_dialog->show(); + post_processing_dialog->raise(); + post_processing_dialog->activateWindow(); +} +#endif + void MainWindow::OnGameListRefresh() { // Resets metadata cache and reloads QtCommon::Game::ResetMetadata(false); diff --git a/src/yuzu/main_window.h b/src/yuzu/main_window.h index 693f16b598..2e92df135d 100644 --- a/src/yuzu/main_window.h +++ b/src/yuzu/main_window.h @@ -56,6 +56,9 @@ class QSlider; class QHBoxLayout; class WaitTreeWidget; class PerformanceOverlay; +#ifdef HAS_RESHADE +class ConfigurePostProcessing; +#endif enum class GameListOpenTarget; enum class DumpRomFSTarget; class GameListPlaceholder; @@ -391,6 +394,9 @@ private slots: void OnToggleFilterBar(); void OnToggleStatusBar(); void OnTogglePerfOverlay(); +#ifdef HAS_RESHADE + void OnPostProcessingShaders(); +#endif void OnGameListRefresh(); void InitializeHotkeys(); void ToggleFullscreen(); @@ -495,6 +501,9 @@ private: QTimer shutdown_timer; OverlayDialog* shutdown_dialog{}; PerformanceOverlay* perf_overlay = nullptr; +#ifdef HAS_RESHADE + ConfigurePostProcessing* post_processing_dialog = nullptr; +#endif GameListPlaceholder* game_list_placeholder = nullptr; From e7a96c7907fb8cb888f21d348b66de2121fdd1ca Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 10 Sep 2026 22:28:39 +0200 Subject: [PATCH 025/128] [hle] Firmware 23.0.0 (#4390) Preparing when something inevitably requires *at least* this reporting of version/etc. Authored-by: @Maufeat Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Co-authored-by: Maufeat Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4390 Reviewed-by: Maufeat Reviewed-by: MaranBr --- .../system_archive/system_version.cpp | 12 +++++--- src/core/hle/api_version.h | 17 +++++------ src/core/hle/kernel/svc/svc_info.cpp | 7 +++++ src/core/hle/kernel/svc_types.h | 7 ++++- .../am/service/application_creator.cpp | 3 +- .../am/service/library_applet_creator.cpp | 17 ++--------- .../service/am/service/self_controller.cpp | 7 +++++ .../hle/service/am/service/self_controller.h | 1 + .../hle/service/filesystem/fsp/fsp_srv.cpp | 28 ++++++++++++++++++- src/core/hle/service/filesystem/fsp/fsp_srv.h | 1 + .../service/pctl/parental_control_service.cpp | 14 ++++++++-- .../service/pctl/parental_control_service.h | 3 +- src/core/hle/service/pctl/pctl_types.h | 23 ++++++++++++++- 13 files changed, 107 insertions(+), 33 deletions(-) diff --git a/src/core/file_sys/system_archive/system_version.cpp b/src/core/file_sys/system_archive/system_version.cpp index 2dbe4a8a01..be6cde7275 100644 --- a/src/core/file_sys/system_archive/system_version.cpp +++ b/src/core/file_sys/system_archive/system_version.cpp @@ -40,10 +40,14 @@ VirtualDir SystemVersion() { VirtualFile file = std::make_shared(file_data, "file"); // the "/digest" - std::vector digest_data(sizeof(HLE::ApiVersion::VERSION_DIGEST)); - std::memcpy(digest_data.data(), HLE::ApiVersion::VERSION_DIGEST, sizeof(HLE::ApiVersion::VERSION_DIGEST)); - VirtualFile digest_file = std::make_shared(digest_data, "digest"); - return std::make_shared(std::vector{file, digest_file}, std::vector{}, "data"); + if (HLE::ApiVersion::VERSION_DIGEST[0] == '\0') { + return std::make_shared(std::vector{file}, std::vector{}, "data"); + } else { + std::vector digest_data(sizeof(HLE::ApiVersion::VERSION_DIGEST)); + std::memcpy(digest_data.data(), HLE::ApiVersion::VERSION_DIGEST, sizeof(HLE::ApiVersion::VERSION_DIGEST)); + VirtualFile digest_file = std::make_shared(digest_data, "digest"); + return std::make_shared(std::vector{file, digest_file}, std::vector{}, "data"); + } } } // namespace FileSys::SystemArchive diff --git a/src/core/hle/api_version.h b/src/core/hle/api_version.h index 29b4f4008c..0aff969296 100644 --- a/src/core/hle/api_version.h +++ b/src/core/hle/api_version.h @@ -16,8 +16,8 @@ namespace HLE::ApiVersion { // Horizon OS version constants. -constexpr u8 HOS_VERSION_MAJOR = 22; -constexpr u8 HOS_VERSION_MINOR = 5; +constexpr u8 HOS_VERSION_MAJOR = 23; +constexpr u8 HOS_VERSION_MINOR = 0; constexpr u8 HOS_VERSION_MICRO = 0; // NintendoSDK version constants. @@ -25,15 +25,16 @@ constexpr u8 SDK_REVISION_MAJOR = 1; constexpr u8 SDK_REVISION_MINOR = 0; constexpr char PLATFORM_STRING[0x20] = "NX"; -constexpr char VERSION_HASH[0x40] = "ae93061abbc7791fcf8d2f7e7b7b2d62163af697"; -constexpr char DISPLAY_VERSION[0x18] = "22.5.0"; -constexpr char DISPLAY_TITLE[0x80] = "NintendoSDK Firmware for NX 22.5.0-1.0 "; -constexpr char VERSION_DIGEST[0x40] = "CusHY#00160500#WxlZDREksAFSi6bQJEV6nm6-cHLg2jikdYRVN3bwqyE="; +constexpr char VERSION_HASH[0x40] = "c2663accb7490a6ccfe9bc4dfd120ca215490525"; +constexpr char DISPLAY_VERSION[0x18] = "23.0.0"; +constexpr char DISPLAY_TITLE[0x80] = "NintendoSDK Firmware for NX 23.0.0-4.0"; +// Leave empty when there's no digest (N/A) +constexpr char VERSION_DIGEST[0x40] = ""; // Atmosphere version constants. constexpr u8 ATMOSPHERE_RELEASE_VERSION_MAJOR = 1; -constexpr u8 ATMOSPHERE_RELEASE_VERSION_MINOR = 11; -constexpr u8 ATMOSPHERE_RELEASE_VERSION_MICRO = 2; +constexpr u8 ATMOSPHERE_RELEASE_VERSION_MINOR = 12; +constexpr u8 ATMOSPHERE_RELEASE_VERSION_MICRO = 0; constexpr u32 AtmosphereTargetFirmwareWithRevision(u8 major, u8 minor, u8 micro, u8 rev) { return u32{major} << 24 | u32{minor} << 16 | u32{micro} << 8 | u32{rev}; diff --git a/src/core/hle/kernel/svc/svc_info.cpp b/src/core/hle/kernel/svc/svc_info.cpp index e6190ac33a..863bb58fa8 100644 --- a/src/core/hle/kernel/svc/svc_info.cpp +++ b/src/core/hle/kernel/svc/svc_info.cpp @@ -210,6 +210,13 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle *result = system.Kernel().CurrentScheduler()->GetIdleThread()->GetCpuTime(); R_SUCCEED(); } + case InfoType::Unknown37: + case InfoType::Unknown38: { + LOG_WARNING(Kernel_SVC, "(STUBBED) called, info_id={:#x}, info_sub_id={:#x}, handle={:#08x}", + info_id, info_sub_id, handle); + *result = 0; + R_SUCCEED(); + } case InfoType::MesosphereMeta: { enum MesosphereMetaInfo : u64 { KernelVersion = 0, diff --git a/src/core/hle/kernel/svc_types.h b/src/core/hle/kernel/svc_types.h index fce3dea476..b0f4796da4 100644 --- a/src/core/hle/kernel/svc_types.h +++ b/src/core/hle/kernel/svc_types.h @@ -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-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -158,6 +158,11 @@ enum class InfoType : u32 { IoRegionHint = 27, AliasRegionExtraSize = 28, + TransferMemoryHint = 34, + + Unknown37 = 37, + Unknown38 = 38, + MesosphereMeta = 65000, MesosphereCurrentProcess = 65001, }; diff --git a/src/core/hle/service/am/service/application_creator.cpp b/src/core/hle/service/am/service/application_creator.cpp index e3bb92c3a4..4eb2f29e22 100644 --- a/src/core/hle/service/am/service/application_creator.cpp +++ b/src/core/hle/service/am/service/application_creator.cpp @@ -16,6 +16,7 @@ #include "core/hle/service/cmif_serialization.h" #include "core/loader/loader.h" #include "core/launch_timestamp_cache.h" +#include "core/hle/api_version.h" namespace Service::AM { @@ -87,7 +88,7 @@ Result IApplicationCreator::CreateSystemApplication( std::vector control; std::unique_ptr loader; - auto process = CreateProcess(system, application_id, 1, 22); + auto process = CreateProcess(system, application_id, 1, HLE::ApiVersion::HOS_VERSION_MAJOR); R_UNLESS(process != nullptr, ResultUnknown); const auto applet = std::make_shared(system, std::move(process), true); diff --git a/src/core/hle/service/am/service/library_applet_creator.cpp b/src/core/hle/service/am/service/library_applet_creator.cpp index c20a77f8c4..ce80ce946f 100644 --- a/src/core/hle/service/am/service/library_applet_creator.cpp +++ b/src/core/hle/service/am/service/library_applet_creator.cpp @@ -13,6 +13,8 @@ #include "core/hle/service/am/process_creation.h" #include "core/hle/service/am/service/library_applet_accessor.h" #include "core/hle/service/am/service/library_applet_creator.h" + +#include "core/hle/api_version.h" #include "core/hle/service/am/service/storage.h" #include "core/hle/service/am/window_system.h" #include "core/hle/service/cmif_serialization.h" @@ -108,20 +110,7 @@ std::shared_ptr CreateGuestApplet(Core::System& system, return {}; } - // TODO: enable other versions of applets - enum : u8 { - Firmware1400 = 14, - Firmware1500 = 15, - Firmware1600 = 16, - Firmware1700 = 17, - Firmware1800 = 18, - Firmware1900 = 19, - Firmware2000 = 20, - Firmware2100 = 21, - Firmware2200 = 22, - }; - - auto process = CreateProcess(system, program_id, Firmware1400, Firmware2200); + auto process = CreateProcess(system, program_id, 1, HLE::ApiVersion::HOS_VERSION_MAJOR); if (process) { const auto applet = std::make_shared(system, std::move(process), false); applet->program_id = program_id; diff --git a/src/core/hle/service/am/service/self_controller.cpp b/src/core/hle/service/am/service/self_controller.cpp index 70ce7443c4..3a654b9daa 100644 --- a/src/core/hle/service/am/service/self_controller.cpp +++ b/src/core/hle/service/am/service/self_controller.cpp @@ -71,6 +71,7 @@ ISelfController::ISelfController(Core::System& system_, std::shared_ptr {120, D<&ISelfController::SaveCurrentScreenshot>, "SaveCurrentScreenshot"}, {130, D<&ISelfController::SetRecordVolumeMuted>, "SetRecordVolumeMuted"}, {230, D<&ISelfController::Unknown230>, "Unknown230"}, + {240, D<&ISelfController::Unknown240>, "Unknown240"}, {1000, nullptr, "GetDebugStorageChannel"}, }; // clang-format on @@ -422,4 +423,10 @@ Result ISelfController::Unknown230(u32 in_val, Out out_val) { R_SUCCEED(); } +Result ISelfController::Unknown240(u32 in_val) { + LOG_WARNING(Service_AM, "(STUBBED) called, in_val={}", in_val); + + R_SUCCEED(); +} + } // namespace Service::AM diff --git a/src/core/hle/service/am/service/self_controller.h b/src/core/hle/service/am/service/self_controller.h index b6403abde2..c9f480f575 100644 --- a/src/core/hle/service/am/service/self_controller.h +++ b/src/core/hle/service/am/service/self_controller.h @@ -68,6 +68,7 @@ private: Result SaveCurrentScreenshot(Capture::AlbumReportOption album_report_option); Result SetRecordVolumeMuted(bool muted); Result Unknown230(u32 in_val, Out out_val); + Result Unknown240(u32 in_val); Kernel::KProcess* const m_process; const std::shared_ptr m_applet; diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp index fdbd50ed7a..7d270b7b6f 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp @@ -54,7 +54,7 @@ FSP_SRV::FSP_SRV(Core::System& system_) static const FunctionInfo functions[] = { {0, nullptr, "OpenFileSystem"}, {1, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"}, - {2, nullptr, "OpenDataFileSystemByCurrentProcess"}, + {2, D<&FSP_SRV::OpenDataFileSystemByCurrentProcess>, "OpenDataFileSystemByCurrentProcess"}, {7, D<&FSP_SRV::OpenFileSystemWithPatch>, "OpenFileSystemWithPatch"}, {8, nullptr, "OpenFileSystemWithId"}, {9, nullptr, "OpenDataFileSystemByApplicationId"}, @@ -118,6 +118,7 @@ FSP_SRV::FSP_SRV(Core::System& system_) {204, nullptr, "OpenDataFileSystemByProgramIndex"}, {205, D<&FSP_SRV::OpenDataStorageWithProgramIndex>, "OpenDataStorageWithProgramIndex"}, {206, nullptr, "OpenDataStorageByPath"}, + {210, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"}, {400, nullptr, "OpenDeviceOperator"}, {500, nullptr, "OpenSdCardDetectionEventNotifier"}, {501, nullptr, "OpenGameCardDetectionEventNotifier"}, @@ -460,6 +461,31 @@ Result FSP_SRV::OpenSaveDataTransferProhibiter( R_SUCCEED(); } +Result FSP_SRV::OpenDataFileSystemByCurrentProcess(OutInterface out_interface) { + LOG_DEBUG(Service_FS, "called"); + + if (!romfs) { + auto current_romfs = romfs_controller->OpenRomFSCurrentProcess(); + if (!current_romfs) { + LOG_CRITICAL(Service_FS, "No file system interface available!"); + R_RETURN(ResultUnknown); + } + + romfs = current_romfs; + } + + auto extracted_romfs = FileSys::ExtractRomFS(romfs); + if (!extracted_romfs) { + LOG_CRITICAL(Service_FS, "Failed to extract RomFS for the current process!"); + R_RETURN(ResultUnknown); + } + + *out_interface = std::make_shared( + system, extracted_romfs, SizeGetter::FromStorageId(fsc, FileSys::StorageId::NandUser)); + + R_SUCCEED(); +} + Result FSP_SRV::OpenDataStorageByCurrentProcess(OutInterface out_interface) { LOG_DEBUG(Service_FS, "called"); diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.h b/src/core/hle/service/filesystem/fsp/fsp_srv.h index 0ea41903e4..156cf4e571 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_srv.h +++ b/src/core/hle/service/filesystem/fsp/fsp_srv.h @@ -51,6 +51,7 @@ public: private: Result SetCurrentProcess(ClientProcessId pid); + Result OpenDataFileSystemByCurrentProcess(OutInterface out_interface); Result OpenFileSystemWithPatch(OutInterface out_interface, FileSystemProxyType type, u64 open_program_id); Result OpenSdCardFileSystem(OutInterface out_interface); diff --git a/src/core/hle/service/pctl/parental_control_service.cpp b/src/core/hle/service/pctl/parental_control_service.cpp index 97c178799e..51953c2657 100644 --- a/src/core/hle/service/pctl/parental_control_service.cpp +++ b/src/core/hle/service/pctl/parental_control_service.cpp @@ -4,6 +4,8 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include + #include "core/core.h" #include "core/file_sys/control_metadata.h" #include "core/file_sys/patch_manager.h" @@ -94,6 +96,7 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili {1457, D<&IParentalControlService::GetPlayTimerEventToRequestSuspension>, "GetPlayTimerEventToRequestSuspension"}, {1458, D<&IParentalControlService::IsPlayTimerAlarmDisabled>, "IsPlayTimerAlarmDisabled"}, {1459, D<&IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo>, "GetPlayTimerRemainingTimeDisplayInfo"}, + {1460, D<&IParentalControlService::Unknown1460>, "Unknown1460"}, {1471, nullptr, "NotifyWrongPinCodeInputManyTimes"}, {1472, nullptr, "CancelNetworkRequest"}, {1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"}, @@ -440,8 +443,15 @@ Result IParentalControlService::IsPlayTimerAlarmDisabled(Out out_play_time R_SUCCEED(); } -Result IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo(/* Out 0x18 */) { - LOG_INFO(Service_PCTL, "called"); +Result IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo(Out out_display_info) { + LOG_DEBUG(Service_PCTL, "called"); + *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; + R_SUCCEED(); +} + +Result IParentalControlService::Unknown1460(u8 in_unk, Out out_display_info) { + LOG_DEBUG(Service_PCTL, "called, in_unk={}", in_unk); + *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; R_SUCCEED(); } diff --git a/src/core/hle/service/pctl/parental_control_service.h b/src/core/hle/service/pctl/parental_control_service.h index 92d1d38429..9dabe3d059 100644 --- a/src/core/hle/service/pctl/parental_control_service.h +++ b/src/core/hle/service/pctl/parental_control_service.h @@ -55,7 +55,8 @@ private: Result GetPlayTimerSettingsOld(Out out_play_timer_settings); Result GetPlayTimerEventToRequestSuspension(OutCopyHandle out_event); Result IsPlayTimerAlarmDisabled(Out out_play_timer_alarm_disabled); - Result GetPlayTimerRemainingTimeDisplayInfo(); + Result GetPlayTimerRemainingTimeDisplayInfo(Out out_display_info); + Result Unknown1460(u8 in_unk, Out out_display_info); Result GetUnlinkedEvent(OutCopyHandle out_event); Result GetStereoVisionRestriction(Out out_stereo_vision_restriction); Result SetStereoVisionRestriction(bool stereo_vision_restriction); diff --git a/src/core/hle/service/pctl/pctl_types.h b/src/core/hle/service/pctl/pctl_types.h index a559c5d35f..3a5a19099d 100644 --- a/src/core/hle/service/pctl/pctl_types.h +++ b/src/core/hle/service/pctl/pctl_types.h @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -49,4 +49,25 @@ struct PlayTimerSettings { }; static_assert(sizeof(PlayTimerSettings) == 0x44, "PlayTimerSettings has incorrect size."); +enum class PlayTimerDisplayState : u8 { + TimesUp = 0, + BedtimeAlarm = 1, + RemainingTime = 2, + Unknown3 = 3, + Unknown4 = 4, + Unknown5 = 5, + TimerDisabled = 6, + NotConfigured = 7, +}; + +// This is nn::pctl::PlayTimerRemainingTimeDisplayInfo +struct PlayTimerRemainingTimeDisplayInfo { + PlayTimerDisplayState state; + INSERT_PADDING_BYTES(0x7); + u64 unknown_08; + u64 remaining_time; +}; +static_assert(sizeof(PlayTimerRemainingTimeDisplayInfo) == 0x18, + "PlayTimerRemainingTimeDisplayInfo has incorrect size."); + } // namespace Service::PCTL From 00a1c392e7252eaad82b50119037e01bf6b92a73 Mon Sep 17 00:00:00 2001 From: xbzk Date: Thu, 10 Sep 2026 22:29:35 +0200 Subject: [PATCH 026/128] [opus] proper limit and error code for opus decoder instances (#4384) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- This is intended to fix Hades II save loading issue. By analyzing panic dump it was found out that the error code was 0x160A. By decoding firmware it was found that error comes from 'nn::codec::InitializeHardwareOpusDecoder'. Further decoding revealed that SDK tries to allocate multiple opus instances, up to the fw limit of 24 instances, and when it receives return error ResultOutOfOpusDecoders (385), a software fallback is gracefully used. Implementing the limitation and the limit reached error code return makes saves load properly, multiple times in a row in both windows and android. I still wonder why the game allocates too many parallel instances, but the current implementation is a real fw compliant solution, and whether the 24+ is real or some leak may be investigated later, or not. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4384 Reviewed-by: lizzie Reviewed-by: MaranBr --- src/audio_core/opus/decoder.cpp | 16 ++++++++++++++++ src/audio_core/opus/hardware_opus.cpp | 20 ++++++++++++++++++++ src/audio_core/opus/hardware_opus.h | 8 ++++++++ src/core/hle/service/audio/errors.h | 3 ++- 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/audio_core/opus/decoder.cpp b/src/audio_core/opus/decoder.cpp index e3a8fe1bfa..1c13cb60e9 100644 --- a/src/audio_core/opus/decoder.cpp +++ b/src/audio_core/opus/decoder.cpp @@ -8,6 +8,7 @@ #include "audio_core/opus/hardware_opus.h" #include "audio_core/opus/parameters.h" #include "common/alignment.h" +#include "common/scope_exit.h" #include "common/swap.h" #include "core/core.h" @@ -28,10 +29,18 @@ OpusDecoder::OpusDecoder(Core::System& system_, HardwareOpus& hardware_opus_) OpusDecoder::~OpusDecoder() { if (decode_object_initialized) { hardware_opus.ShutdownDecodeObject(shared_buffer.data(), shared_buffer.size()); + hardware_opus.UnregisterDecoder(this); } } Result OpusDecoder::Initialize(const OpusParametersEx& params, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size) { + R_TRY(hardware_opus.RegisterDecoder(this)); + SCOPE_EXIT { + if (!decode_object_initialized) { + hardware_opus.UnregisterDecoder(this); + } + }; + auto frame_size{params.use_large_frame_size ? 5760 : 1920}; shared_buffer.resize(transfer_memory_size); shared_memory_mapped = true; @@ -61,6 +70,13 @@ Result OpusDecoder::Initialize(const OpusParametersEx& params, Kernel::KTransfer } Result OpusDecoder::Initialize(const OpusMultiStreamParametersEx& params, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size) { + R_TRY(hardware_opus.RegisterDecoder(this)); + SCOPE_EXIT { + if (!decode_object_initialized) { + hardware_opus.UnregisterDecoder(this); + } + }; + auto frame_size{params.use_large_frame_size ? 5760 : 1920}; shared_buffer.resize(transfer_memory_size, 0); shared_memory_mapped = true; diff --git a/src/audio_core/opus/hardware_opus.cpp b/src/audio_core/opus/hardware_opus.cpp index 0037a3e503..04591c10b6 100644 --- a/src/audio_core/opus/hardware_opus.cpp +++ b/src/audio_core/opus/hardware_opus.cpp @@ -4,6 +4,7 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include #include "audio_core/audio_core.h" @@ -45,6 +46,25 @@ HardwareOpus::HardwareOpus(Core::System& system_) opus_decoder.SetSharedMemory(shared_memory); } +Result HardwareOpus::RegisterDecoder(OpusDecoder* decoder) { + std::scoped_lock l{mutex}; + const auto slot = std::ranges::find(decoders, nullptr); + if (slot == decoders.end()) { + R_THROW(ResultOutOfOpusDecoders); + } + *slot = decoder; + R_SUCCEED(); +} + +void HardwareOpus::UnregisterDecoder(OpusDecoder* decoder) { + std::scoped_lock l{mutex}; + const auto slot = std::ranges::find(decoders, decoder); + if (slot == decoders.end()) { + return; + } + *slot = nullptr; +} + u32 HardwareOpus::GetWorkBufferSize(u32 channel) { if (!opus_decoder.IsRunning()) { return 0; diff --git a/src/audio_core/opus/hardware_opus.h b/src/audio_core/opus/hardware_opus.h index caa7468401..b6c7fbe6c8 100644 --- a/src/audio_core/opus/hardware_opus.h +++ b/src/audio_core/opus/hardware_opus.h @@ -1,8 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 #pragma once +#include #include #include @@ -12,9 +16,12 @@ #include "core/hle/service/audio/errors.h" namespace AudioCore::OpusDecoder { +class OpusDecoder; class HardwareOpus { public: HardwareOpus(Core::System& system); + Result RegisterDecoder(OpusDecoder* decoder); + void UnregisterDecoder(OpusDecoder* decoder); u32 GetWorkBufferSize(u32 channel); u32 GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count); @@ -39,6 +46,7 @@ public: private: Core::System& system; std::mutex mutex; + std::array decoders{}; ADSP::OpusDecoder::OpusDecoder& opus_decoder; ADSP::OpusDecoder::SharedMemory shared_memory; }; diff --git a/src/core/hle/service/audio/errors.h b/src/core/hle/service/audio/errors.h index 8062820de3..553b4ee360 100644 --- a/src/core/hle/service/audio/errors.h +++ b/src/core/hle/service/audio/errors.h @@ -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-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -33,6 +33,7 @@ constexpr Result ResultLibOpusInternalError{ErrorModule::HwOpus, 4}; constexpr Result ResultBufferTooSmall{ErrorModule::HwOpus, 3}; constexpr Result ResultLibOpusBadArg{ErrorModule::HwOpus, 2}; constexpr Result ResultInvalidOpusDSPReturnCode{ErrorModule::HwOpus, 259}; +constexpr Result ResultOutOfOpusDecoders{ErrorModule::HwOpus, 385}; constexpr Result ResultInvalidOpusSampleRate{ErrorModule::HwOpus, 1001}; constexpr Result ResultInvalidOpusChannelCount{ErrorModule::HwOpus, 1002}; From f3af5d0c252feba0df73bedddcd8a40f71ebc0fa Mon Sep 17 00:00:00 2001 From: xbzk Date: Thu, 10 Sep 2026 22:30:07 +0200 Subject: [PATCH 027/128] [fs] moved temp folder cleanup upstream (per-application level) to avoid per-program retrigger (#4375) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- This issue was observed in MGS Master Collection Volume II, MGS4: Guns of the Patriots, Chapter 4: Shadow Moses That title is a bundle, and that specific chapter is a program (MGS 1st stage), launched by a program (MGS4), launched by an application (main title bundle). Upon decoding guest panic message, it was exposed that an abort was triggered after trying to create a save in nand/temp/gclvar.bak file. Further instrumentation exposed the error on that file's path, caused from a previous deletion of that folder. In the same session that folder had been already cleaned and created successfully, which evidences an undesired re-cleaning of the temp structure. The issue was the fact that the MGS4 to MGS transition also calls EnsureSaveData>...>SaveDataFactory creator, and that was destroying the previous created temp structure. After that stage, the return from MSG to MSG4 was causing the same issue again. By moving the deletion to the guest application level, the factory creation was called only once, as it should be, and the issue is gone. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4375 Reviewed-by: MaranBr Reviewed-by: lizzie --- src/core/core.cpp | 4 ++++ src/core/file_sys/savedata_factory.cpp | 6 +----- src/core/hle/service/filesystem/filesystem.cpp | 7 +++++++ src/core/hle/service/filesystem/filesystem.h | 2 ++ 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/core/core.cpp b/src/core/core.cpp index 054af8dc4a..046ee53346 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -312,6 +312,10 @@ struct System::Impl { } SystemResultStatus Load(System& system, Frontend::EmuWindow& emu_window, const std::string& filepath, Service::AM::FrontendAppletParameters& params) { + if (params.launch_type == Service::AM::LaunchType::FrontendInitiated) { + fs_controller.InitTempStorage(); + } + InitializeKernel(system); if (params.applet_type == Service::AM::AppletType::Application) { diff --git a/src/core/file_sys/savedata_factory.cpp b/src/core/file_sys/savedata_factory.cpp index 0ba839ec14..c756734a43 100644 --- a/src/core/file_sys/savedata_factory.cpp +++ b/src/core/file_sys/savedata_factory.cpp @@ -57,11 +57,7 @@ std::string GetFutureSaveDataPath(SaveDataSpaceId space_id, SaveDataType type, u SaveDataFactory::SaveDataFactory(Core::System& system_, ProgramId program_id_, VirtualDir save_directory_) - : system{system_}, program_id{program_id_}, dir{std::move(save_directory_)} { - // Delete all temporary storages - // On hardware, it is expected that temporary storage be empty at first use. - dir->DeleteSubdirectoryRecursive("temp"); -} + : system{system_}, program_id{program_id_}, dir{std::move(save_directory_)} {} SaveDataFactory::~SaveDataFactory() = default; diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index 306e8701c3..38d2f1735c 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp @@ -787,6 +787,13 @@ void FileSystemController::CreateFactories(FileSys::VfsFilesystem& vfs, bool ove } } +void FileSystemController::InitTempStorage() { + const auto save_directory = system.GetFilesystem()->OpenDirectory(Common::FS::GetEdenPathString(Common::FS::EdenPath::SaveDir), FileSys::OpenMode::ReadWrite); + if (save_directory != nullptr) { + save_directory->DeleteSubdirectoryRecursive("temp"); + } +} + void FileSystemController::Reset() { std::scoped_lock lk{registration_lock}; registrations.clear(); diff --git a/src/core/hle/service/filesystem/filesystem.h b/src/core/hle/service/filesystem/filesystem.h index ef45aec627..a77358e2ef 100644 --- a/src/core/hle/service/filesystem/filesystem.h +++ b/src/core/hle/service/filesystem/filesystem.h @@ -127,6 +127,8 @@ public: // above is called. void CreateFactories(FileSys::VfsFilesystem& vfs, bool overwrite = true); + void InitTempStorage(); + void Reset(); private: From c95ad020fb529d47f9c3106a53553bec955c1586 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 11 Sep 2026 15:29:52 +0200 Subject: [PATCH 028/128] [gpu] Fix infinite hangup/freezes at shutdown/reset (#4395) Thread may be destroyed at dtor(), but it hasn't fully shut down, so before notify shutdown, request immediate stop (effective immediately). Like the issue was that the thread didn't want to stop running, thus it would hang, it would also reference objects which were being destroyed without waiting for them to actually be destroyed So it would reference invalid data This PR tells the thread: "hey, STOP now, and DESTROY yourself" So all of that should be avoided Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4395 Reviewed-by: Maufeat Reviewed-by: MaranBr --- src/video_core/gpu.cpp | 9 +++++---- src/video_core/gpu_thread.cpp | 7 +++++++ src/video_core/gpu_thread.h | 2 ++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index a2e87b260a..9901cf4262 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -55,8 +55,8 @@ constexpr u64 GpuClockMultiplier(Settings::GpuClock clock) { struct GPU::Impl { explicit Impl(Core::System& system_, bool is_async_, bool use_nvdec_) - : gpu_thread{system_} - , system{system_} + : system{system_} + , gpu_thread{system_} , use_nvdec{use_nvdec_} , shader_notify() , is_async{is_async_} @@ -182,6 +182,7 @@ struct GPU::Impl { } void NotifyShutdown() { + gpu_thread.NotifyShutdown(); std::unique_lock lk{sync_mutex}; shutting_down.store(true, std::memory_order::relaxed); sync_cv.notify_all(); @@ -301,12 +302,12 @@ struct GPU::Impl { return out; } + Core::System& system; + // Destruction of thread must be done before all (non trivial) // previous members has been destroyed VideoCommon::GPUThread::ThreadManager gpu_thread; - Core::System& system; - std::unique_ptr renderer; const bool use_nvdec; diff --git a/src/video_core/gpu_thread.cpp b/src/video_core/gpu_thread.cpp index 2acf9ac458..a01375e7be 100644 --- a/src/video_core/gpu_thread.cpp +++ b/src/video_core/gpu_thread.cpp @@ -114,4 +114,11 @@ u64 ThreadManager::PushCommand(CommandData&& command_data, bool block, bool is_a return fence; } +void ThreadManager::NotifyShutdown() { + if (thread.joinable()) { + thread.request_stop(); + thread.join(); + } +} + } // namespace VideoCommon::GPUThread diff --git a/src/video_core/gpu_thread.h b/src/video_core/gpu_thread.h index 4c3fadce15..631a680db4 100644 --- a/src/video_core/gpu_thread.h +++ b/src/video_core/gpu_thread.h @@ -125,6 +125,8 @@ public: void TickGPU(bool is_async); + void NotifyShutdown(); + private: /// Pushes a command to be executed by the GPU thread u64 PushCommand(CommandData&& command_data, bool block, bool is_async); From 301da63a15de8cfbe752ac44784db9b58cdd2d87 Mon Sep 17 00:00:00 2001 From: xbzk Date: Fri, 11 Sep 2026 21:38:12 +0200 Subject: [PATCH 029/128] [audio] hint openslES as audio driver on android to fix mute screen recording issue (#4397) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- After audio backend migration some android devices screen captures became mute. Liz instructed to enable openSL ES via some SDL hint. Found the proper one in https://wiki.libsdl.org/SDL3/SDL_HINT_AUDIO_DRIVER. Added it restricted to android. UPDATE: Got myself wondering how things work on SDL after using that hint, and checked that one must provide a list of drivers "opensles,aaudio,..." to be attempted. Afraid of some devices failing on openSL ES, and to avoid hand providing entire list, i've added fallback logic so entire SDL's driver list can be tried just in case. Default list in https://github.com/libsdl-org/SDL/blob/release-3.4.14/src/audio/SDL_audio.c. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4397 Reviewed-by: MaranBr Reviewed-by: lizzie --- src/audio_core/sink/sdl3_sink.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/audio_core/sink/sdl3_sink.cpp b/src/audio_core/sink/sdl3_sink.cpp index 4816b17259..69558eabec 100644 --- a/src/audio_core/sink/sdl3_sink.cpp +++ b/src/audio_core/sink/sdl3_sink.cpp @@ -28,10 +28,18 @@ namespace { // // Keep in sync with cubeb_sink.cpp name. SDL_SetHint("SDL_AUDIO_DEVICE_APP_NAME", "yuzu Latency Getter"); +#ifdef __ANDROID__ + SDL_SetHintWithPriority(SDL_HINT_AUDIO_DRIVER, "openslES", SDL_HINT_OVERRIDE); if (!SDL_InitSubSystem(SDL_INIT_AUDIO)) { + LOG_WARNING(Audio_Sink, "OpenSL ES audio initialization failed: {}; retrying default drivers", SDL_GetError()); + SDL_ResetHint(SDL_HINT_AUDIO_DRIVER); + } +#endif + if (!SDL_WasInit(SDL_INIT_AUDIO) && !SDL_InitSubSystem(SDL_INIT_AUDIO)) { LOG_CRITICAL(Audio_Sink, "SDL_InitSubSystem audio failed: {}", SDL_GetError()); return false; } + LOG_INFO(Audio_Sink, "SDL audio driver: {}", SDL_GetCurrentAudioDriver()); } return true; } From 8a22f1845b8b7ec19fbb518b696513e36d42b317 Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 11 Sep 2026 21:38:52 +0200 Subject: [PATCH 030/128] [hle] Enforce max_sessions, add bpc:ams service (#4394) As per switchbrew, as per atmosphere, and some poking around. bpc:ams stubbed for now. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4394 Reviewed-by: Maufeat Reviewed-by: MaranBr --- src/audio_core/audio_render_manager.cpp | 19 +++++----- src/core/hle/service/audio/audio.cpp | 34 +++++++++--------- src/core/hle/service/bcat/bcat.cpp | 30 +++++++--------- src/core/hle/service/bpc/bpc.cpp | 24 ++++++++++--- .../hle/service/filesystem/filesystem.cpp | 6 ++-- src/core/hle/service/glue/arp.cpp | 35 ++++++++----------- src/core/hle/service/glue/glue.cpp | 4 +-- src/core/hle/service/grc/grc.cpp | 4 +-- src/core/hle/service/ldr/ldr.cpp | 9 +++-- src/core/hle/service/ngc/ngc.cpp | 6 ++-- src/core/hle/service/nifm/nifm.cpp | 9 ++--- src/core/hle/service/ns/ns.cpp | 18 +++++----- src/core/hle/service/pm/pm.cpp | 8 ++--- src/core/hle/service/ro/ro.cpp | 6 ++-- src/core/hle/service/set/settings.cpp | 14 ++++---- src/core/hle/service/sm/sm.cpp | 7 ++-- src/core/hle/service/sockets/sockets.cpp | 14 ++++---- src/core/hle/service/usb/usb.cpp | 8 ++--- src/core/hle/service/wlan/wlan.cpp | 16 ++++----- 19 files changed, 138 insertions(+), 133 deletions(-) diff --git a/src/audio_core/audio_render_manager.cpp b/src/audio_core/audio_render_manager.cpp index 3c53e3afde..8c4e74c4be 100644 --- a/src/audio_core/audio_render_manager.cpp +++ b/src/audio_core/audio_render_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 @@ -9,7 +12,9 @@ namespace AudioCore::Renderer { Manager::Manager(Core::System& system_) - : system{system_}, system_manager{std::make_unique(system)} { + : system{system_} + , system_manager{std::make_unique(system)} +{ std::iota(session_ids.begin(), session_ids.end(), 0); } @@ -38,14 +43,12 @@ Result Manager::GetWorkBufferSize(const AudioRendererParameterInternal& params, s32 Manager::GetSessionId() { std::scoped_lock l{session_lock}; - auto session_id{session_ids[session_count]}; - - if (session_id == -1) { - return -1; + ASSERT(session_count <= session_ids.size()); + auto const session_id = session_ids[session_count]; + if (session_id >= 0) { + session_ids[session_count] = -1; + session_count++; } - - session_ids[session_count] = -1; - session_count++; return session_id; } diff --git a/src/core/hle/service/audio/audio.cpp b/src/core/hle/service/audio/audio.cpp index c433283304..6caf794caa 100644 --- a/src/core/hle/service/audio/audio.cpp +++ b/src/core/hle/service/audio/audio.cpp @@ -185,26 +185,26 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("aud:a", std::make_shared(system)); - server_manager->RegisterNamedService("aud:d", std::make_shared(system)); + server_manager->RegisterNamedService("aud:a", std::make_shared(system), 30); + server_manager->RegisterNamedService("aud:d", std::make_shared(system), 30); - server_manager->RegisterNamedService("audout:d", std::make_shared(system)); - server_manager->RegisterNamedService("audin:d", std::make_shared(system)); - server_manager->RegisterNamedService("audrec:d", std::make_shared(system)); - server_manager->RegisterNamedService("audren:d", std::make_shared(system)); + server_manager->RegisterNamedService("audout:d", std::make_shared(system), 30); + server_manager->RegisterNamedService("audin:d", std::make_shared(system), 30); + server_manager->RegisterNamedService("audrec:d", std::make_shared(system), 30); + server_manager->RegisterNamedService("audren:d", std::make_shared(system), 30); - server_manager->RegisterNamedService("audin:u", std::make_shared(system)); - server_manager->RegisterNamedService("audin:a", std::make_shared(system)); - server_manager->RegisterNamedService("audout:u", std::make_shared(system)); - server_manager->RegisterNamedService("audout:a", std::make_shared(system)); - server_manager->RegisterNamedService("auddev", std::make_shared(system)); + server_manager->RegisterNamedService("audin:u", std::make_shared(system), 30); + server_manager->RegisterNamedService("audin:a", std::make_shared(system), 30); + server_manager->RegisterNamedService("audout:u", std::make_shared(system), 30); + server_manager->RegisterNamedService("audout:a", std::make_shared(system), 30); + server_manager->RegisterNamedService("auddev", std::make_shared(system), 30); // Depends on audout:u and audin:u on ctor! - server_manager->RegisterNamedService("audctl", std::make_shared(system)); - server_manager->RegisterNamedService("audrec:a", std::make_shared(system)); - server_manager->RegisterNamedService("audrec:u", std::make_shared(system)); - server_manager->RegisterNamedService("audren:u", std::make_shared(system)); - server_manager->RegisterNamedService("audren:a", std::make_shared(system)); - server_manager->RegisterNamedService("hwopus", std::make_shared(system)); + server_manager->RegisterNamedService("audctl", std::make_shared(system), 30); + server_manager->RegisterNamedService("audrec:a", std::make_shared(system), 30); + server_manager->RegisterNamedService("audrec:u", std::make_shared(system), 30); + server_manager->RegisterNamedService("audren:u", std::make_shared(system), 30); + server_manager->RegisterNamedService("audren:a", std::make_shared(system), 30); + server_manager->RegisterNamedService("hwopus", std::make_shared(system), 25); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/bcat/bcat.cpp b/src/core/hle/service/bcat/bcat.cpp index ea8b15998d..bf9e054a49 100644 --- a/src/core/hle/service/bcat/bcat.cpp +++ b/src/core/hle/service/bcat/bcat.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,25 +15,16 @@ namespace Service::BCAT { void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("bcat:a", - std::make_shared(system, "bcat:a")); - server_manager->RegisterNamedService("bcat:m", - std::make_shared(system, "bcat:m")); - server_manager->RegisterNamedService("bcat:u", - std::make_shared(system, "bcat:u")); - server_manager->RegisterNamedService("bcat:s", - std::make_shared(system, "bcat:s")); + server_manager->RegisterNamedService("bcat:a", std::make_shared(system, "bcat:a"), 32); + server_manager->RegisterNamedService("bcat:m", std::make_shared(system, "bcat:m"), 32); + server_manager->RegisterNamedService("bcat:u", std::make_shared(system, "bcat:u"), 32); + server_manager->RegisterNamedService("bcat:s", std::make_shared(system, "bcat:s"), 32); - server_manager->RegisterNamedService( - "news:a", std::make_shared(system, 0xffffffff, "news:a")); - server_manager->RegisterNamedService( - "news:p", std::make_shared(system, 0x1, "news:p")); - server_manager->RegisterNamedService( - "news:c", std::make_shared(system, 0x2, "news:c")); - server_manager->RegisterNamedService( - "news:v", std::make_shared(system, 0x4, "news:v")); - server_manager->RegisterNamedService( - "news:m", std::make_shared(system, 0xd, "news:m")); + server_manager->RegisterNamedService("news:a", std::make_shared(system, 0xffffffff, "news:a"), 32); + server_manager->RegisterNamedService("news:p", std::make_shared(system, 0x1, "news:p"), 32); + server_manager->RegisterNamedService("news:c", std::make_shared(system, 0x2, "news:c"), 32); + server_manager->RegisterNamedService("news:v", std::make_shared(system, 0x4, "news:v"), 32); + server_manager->RegisterNamedService("news:m", std::make_shared(system, 0xd, "news:m"), 32); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/bpc/bpc.cpp b/src/core/hle/service/bpc/bpc.cpp index 6fd7001821..6f2e00b22b 100644 --- a/src/core/hle/service/bpc/bpc.cpp +++ b/src/core/hle/service/bpc/bpc.cpp @@ -101,14 +101,28 @@ public: } }; +class BPC_AMS final : public ServiceFramework { +public: + explicit BPC_AMS(Core::System& system_) : ServiceFramework{system_, "bpc:ams"} { + // clang-format off + static const FunctionInfo functions[] = { + {65000, nullptr, "RebootToFatalError"}, + {65001, nullptr, "SetRebootPayload"}, + }; + // clang-format on + RegisterHandlers(functions); + } +}; + void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("bpc", std::make_shared(system)); - server_manager->RegisterNamedService("bpc:r", std::make_shared(system)); - server_manager->RegisterNamedService("bpc:c", std::make_shared(system)); - server_manager->RegisterNamedService("bpc:b", std::make_shared(system)); - server_manager->RegisterNamedService("bpc:w", std::make_shared(system)); + server_manager->RegisterNamedService("bpc", std::make_shared(system), 13); + server_manager->RegisterNamedService("bpc:r", std::make_shared(system), 13); + server_manager->RegisterNamedService("bpc:c", std::make_shared(system), 13); + server_manager->RegisterNamedService("bpc:b", std::make_shared(system), 13); + server_manager->RegisterNamedService("bpc:w", std::make_shared(system), 13); + server_manager->RegisterNamedService("bpc:ams", std::make_shared(system), 4); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index 38d2f1735c..925af7b371 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp @@ -804,9 +804,9 @@ void LoopProcess(Core::System& system) { const auto FileSystemProxyFactory = [&] { return std::make_shared(system); }; - server_manager->RegisterNamedService("fsp-ldr", std::make_shared(system)); - server_manager->RegisterNamedService("fsp-pr", std::make_shared(system)); - server_manager->RegisterNamedService("fsp-srv", std::move(FileSystemProxyFactory)); + server_manager->RegisterNamedService("fsp-ldr", std::make_shared(system), 61); + server_manager->RegisterNamedService("fsp-pr", std::make_shared(system), 61); + server_manager->RegisterNamedService("fsp-srv", std::move(FileSystemProxyFactory), 61); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/glue/arp.cpp b/src/core/hle/service/glue/arp.cpp index b5dfbe9c60..7eda57ddc3 100644 --- a/src/core/hle/service/glue/arp.cpp +++ b/src/core/hle/service/glue/arp.cpp @@ -36,18 +36,18 @@ std::optional GetTitleIDForProcessID(Core::System& system, u64 process_id) ARP_R::ARP_R(Core::System& system_, const ARPManager& manager_) : ServiceFramework{system_, "arp:r"}, manager{manager_} { // clang-format off - static const FunctionInfo functions[] = { - {0, &ARP_R::GetApplicationLaunchProperty, "GetApplicationLaunchProperty"}, - {1, &ARP_R::GetApplicationLaunchPropertyWithApplicationId, "GetApplicationLaunchPropertyWithApplicationId"}, - {2, &ARP_R::GetApplicationControlProperty, "GetApplicationControlProperty"}, - {3, &ARP_R::GetApplicationControlPropertyWithApplicationId, "GetApplicationControlPropertyWithApplicationId"}, - {4, nullptr, "GetApplicationInstanceUnregistrationNotifier"}, - {5, nullptr, "ListApplicationInstanceId"}, - {6, nullptr, "GetMicroApplicationInstanceId"}, - {7, nullptr, "GetApplicationCertificate"}, - {9998, nullptr, "GetPreomiaApplicationLaunchProperty"}, - {9999, nullptr, "GetPreomiaApplicationControlProperty"}, - }; + static const FunctionInfo functions[] = { + {0, &ARP_R::GetApplicationLaunchProperty, "GetApplicationLaunchProperty"}, + {1, &ARP_R::GetApplicationLaunchPropertyWithApplicationId, "GetApplicationLaunchPropertyWithApplicationId"}, + {2, &ARP_R::GetApplicationControlProperty, "GetApplicationControlProperty"}, + {3, &ARP_R::GetApplicationControlPropertyWithApplicationId, "GetApplicationControlPropertyWithApplicationId"}, + {4, nullptr, "GetApplicationInstanceUnregistrationNotifier"}, + {5, nullptr, "ListApplicationInstanceId"}, + {6, nullptr, "GetMicroApplicationInstanceId"}, + {7, nullptr, "GetApplicationCertificate"}, + {9998, nullptr, "GetPreomiaApplicationLaunchProperty"}, + {9999, nullptr, "GetPreomiaApplicationControlProperty"}, + }; // clang-format on RegisterHandlers(functions); @@ -191,8 +191,7 @@ private: } if (issued) { - LOG_ERROR(Service_ARP, - "Attempted to issue registrar, but registrar is already issued!"); + LOG_ERROR(Service_ARP, "Attempted to issue registrar, but registrar is already issued!"); IPC::ResponseBuilder rb{ctx, 2}; rb.Push(Glue::ResultAlreadyBound); return; @@ -209,9 +208,7 @@ private: LOG_DEBUG(Service_ARP, "called"); if (issued) { - LOG_ERROR( - Service_ARP, - "Attempted to set application launch property, but registrar is already issued!"); + LOG_ERROR(Service_ARP, "Attempted to set application launch property, but registrar is already issued!"); IPC::ResponseBuilder rb{ctx, 2}; rb.Push(Glue::ResultAlreadyBound); return; @@ -228,9 +225,7 @@ private: LOG_DEBUG(Service_ARP, "called"); if (issued) { - LOG_ERROR( - Service_ARP, - "Attempted to set application control property, but registrar is already issued!"); + LOG_ERROR(Service_ARP, "Attempted to set application control property, but registrar is already issued!"); IPC::ResponseBuilder rb{ctx, 2}; rb.Push(Glue::ResultAlreadyBound); return; diff --git a/src/core/hle/service/glue/glue.cpp b/src/core/hle/service/glue/glue.cpp index 46d078d00b..f267060ef4 100644 --- a/src/core/hle/service/glue/glue.cpp +++ b/src/core/hle/service/glue/glue.cpp @@ -22,8 +22,8 @@ void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); // ARP - server_manager->RegisterNamedService("arp:r", std::make_shared(system, system.GetARPManager())); - server_manager->RegisterNamedService("arp:w", std::make_shared(system, system.GetARPManager())); + server_manager->RegisterNamedService("arp:r", std::make_shared(system, system.GetARPManager()), 16); + server_manager->RegisterNamedService("arp:w", std::make_shared(system, system.GetARPManager()), 8); // BackGround Task Controller server_manager->RegisterNamedService("bgtc:t", std::make_shared(system)); diff --git a/src/core/hle/service/grc/grc.cpp b/src/core/hle/service/grc/grc.cpp index b3d39a6294..e8e901662d 100644 --- a/src/core/hle/service/grc/grc.cpp +++ b/src/core/hle/service/grc/grc.cpp @@ -46,8 +46,8 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("grc:c", std::make_shared(system)); - server_manager->RegisterNamedService("grc:d", std::make_shared(system)); + server_manager->RegisterNamedService("grc:c", std::make_shared(system), 4); + server_manager->RegisterNamedService("grc:d", std::make_shared(system), 4); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp index ba58b3a093..db4d51b49d 100644 --- a/src/core/hle/service/ldr/ldr.cpp +++ b/src/core/hle/service/ldr/ldr.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -56,9 +59,9 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("ldr:dmnt", std::make_shared(system)); - server_manager->RegisterNamedService("ldr:pm", std::make_shared(system)); - server_manager->RegisterNamedService("ldr:shel", std::make_shared(system)); + server_manager->RegisterNamedService("ldr:dmnt", std::make_shared(system), 3); + server_manager->RegisterNamedService("ldr:pm", std::make_shared(system), 1); + server_manager->RegisterNamedService("ldr:shel", std::make_shared(system), 3); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/ngc/ngc.cpp b/src/core/hle/service/ngc/ngc.cpp index 0af4a7bd0e..06310145e5 100644 --- a/src/core/hle/service/ngc/ngc.cpp +++ b/src/core/hle/service/ngc/ngc.cpp @@ -169,9 +169,9 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("ngct:u", std::make_shared(system)); - server_manager->RegisterNamedService("ngct:s", std::make_shared(system)); - server_manager->RegisterNamedService("ngc:u", std::make_shared(system)); + server_manager->RegisterNamedService("ngct:u", std::make_shared(system), 4); + server_manager->RegisterNamedService("ngct:s", std::make_shared(system), 4); + server_manager->RegisterNamedService("ngc:u", std::make_shared(system), 4); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index 898b9ecfb2..efada9b807 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -1144,12 +1144,9 @@ private: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("nifm:a", - std::make_shared("nifm:a", system)); - server_manager->RegisterNamedService("nifm:s", - std::make_shared("nifm:s", system)); - server_manager->RegisterNamedService("nifm:u", - std::make_shared("nifm:u", system)); + server_manager->RegisterNamedService("nifm:a", std::make_shared("nifm:a", system), 2); + server_manager->RegisterNamedService("nifm:s", std::make_shared("nifm:s", system), 16); + server_manager->RegisterNamedService("nifm:u", std::make_shared("nifm:u", system), 5); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp index 4e3915f684..fe057422ce 100644 --- a/src/core/hle/service/ns/ns.cpp +++ b/src/core/hle/service/ns/ns.cpp @@ -81,16 +81,16 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("ns:am2", std::make_shared(system, "ns:am2")); - server_manager->RegisterNamedService("ns:ec", std::make_shared(system, "ns:ec")); - server_manager->RegisterNamedService("ns:rid", std::make_shared(system, "ns:rid")); - server_manager->RegisterNamedService("ns:rt", std::make_shared(system, "ns:rt")); - server_manager->RegisterNamedService("ns:web", std::make_shared(system, "ns:web")); - server_manager->RegisterNamedService("ns:ro", std::make_shared(system, "ns:ro")); + server_manager->RegisterNamedService("ns:am2", std::make_shared(system, "ns:am2"), 5); + server_manager->RegisterNamedService("ns:ec", std::make_shared(system, "ns:ec"), 5); + server_manager->RegisterNamedService("ns:rid", std::make_shared(system, "ns:rid"), 5); + server_manager->RegisterNamedService("ns:rt", std::make_shared(system, "ns:rt"), 5); + server_manager->RegisterNamedService("ns:web", std::make_shared(system, "ns:web"), 5); + server_manager->RegisterNamedService("ns:ro", std::make_shared(system, "ns:ro"), 5); - server_manager->RegisterNamedService("ns:dev", std::make_shared(system)); - server_manager->RegisterNamedService("ns:su", std::make_shared(system)); - server_manager->RegisterNamedService("ns:vm", std::make_shared(system)); + server_manager->RegisterNamedService("ns:dev", std::make_shared(system), 5); + server_manager->RegisterNamedService("ns:su", std::make_shared(system), 5); + server_manager->RegisterNamedService("ns:vm", std::make_shared(system), 5); server_manager->RegisterNamedService("pdm:ntfy", std::make_shared(system)); server_manager->RegisterNamedService("pdm:qry", std::make_shared(system)); diff --git a/src/core/hle/service/pm/pm.cpp b/src/core/hle/service/pm/pm.cpp index 97efb1a361..ff7053b690 100644 --- a/src/core/hle/service/pm/pm.cpp +++ b/src/core/hle/service/pm/pm.cpp @@ -252,10 +252,10 @@ private: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("pm:bm", std::make_shared(system)); - server_manager->RegisterNamedService("pm:dmnt", std::make_shared(system)); - server_manager->RegisterNamedService("pm:info", std::make_shared(system)); - server_manager->RegisterNamedService("pm:shell", std::make_shared(system)); + server_manager->RegisterNamedService("pm:bm", std::make_shared(system), 4); // Nx = 4, Ams = 8 + server_manager->RegisterNamedService("pm:dmnt", std::make_shared(system), 16); + server_manager->RegisterNamedService("pm:shell", std::make_shared(system), 3); //Nx = 3, AMS = 8 + server_manager->RegisterNamedService("pm:info", std::make_shared(system), 25); //48-(4+16+3) ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/ro/ro.cpp b/src/core/hle/service/ro/ro.cpp index 922fc10440..13de9f96c8 100644 --- a/src/core/hle/service/ro/ro.cpp +++ b/src/core/hle/service/ro/ro.cpp @@ -593,9 +593,9 @@ void LoopProcess(Core::System& system) { return std::make_shared(system, "ldr:ro", ro, NrrKind::User); }; - server_manager->RegisterNamedService("ldr:ro", std::move(RoInterfaceFactoryForUser)); - server_manager->RegisterNamedService("ro:1", std::make_shared(system, "ro:1", ro, NrrKind::JitPlugin)); - server_manager->RegisterNamedService("ro:dmnt", std::make_shared(system)); + server_manager->RegisterNamedService("ldr:ro", std::move(RoInterfaceFactoryForUser), 2); + server_manager->RegisterNamedService("ro:1", std::make_shared(system, "ro:1", ro, NrrKind::JitPlugin), 2); + server_manager->RegisterNamedService("ro:dmnt", std::make_shared(system), 2); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/set/settings.cpp b/src/core/hle/service/set/settings.cpp index 73d021ff4d..407332b9b7 100644 --- a/src/core/hle/service/set/settings.cpp +++ b/src/core/hle/service/set/settings.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -13,13 +16,10 @@ namespace Service::Set { void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("set", std::make_shared(system)); - server_manager->RegisterNamedService("set:cal", - std::make_shared(system)); - server_manager->RegisterNamedService("set:fd", - std::make_shared(system)); - server_manager->RegisterNamedService("set:sys", - std::make_shared(system)); + server_manager->RegisterNamedService("set", std::make_shared(system), 60); + server_manager->RegisterNamedService("set:cal", std::make_shared(system), 60); + server_manager->RegisterNamedService("set:fd", std::make_shared(system), 60); + server_manager->RegisterNamedService("set:sys", std::make_shared(system), 60); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp index 45d2a14d62..c75c5437df 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp @@ -53,8 +53,7 @@ static Result ValidateServiceName(const std::string& name) { return ResultSuccess; } -Result ServiceManager::RegisterService(Kernel::KServerPort** out_server_port, std::string name, - u32 max_sessions, SessionRequestHandlerFactory handler) { +Result ServiceManager::RegisterService(Kernel::KServerPort** out_server_port, std::string name, u32 max_sessions, SessionRequestHandlerFactory handler) { R_TRY(ValidateServiceName(name)); std::scoped_lock lk{lock}; @@ -64,7 +63,7 @@ Result ServiceManager::RegisterService(Kernel::KServerPort** out_server_port, st } auto* port = Kernel::KPort::Create(kernel); - port->Initialize(kernel, ServerSessionCountMax, false, 0); + port->Initialize(kernel, max_sessions, false, 0); // Register the port. Kernel::KPort::Register(kernel, port); @@ -264,7 +263,7 @@ void SM::AtmosphereHasService(HLERequestContext& ctx) { } SM::SM(ServiceManager& service_manager_, Core::System& system_) - : ServiceFramework{system_, "sm:", 4} + : ServiceFramework{system_, "sm:", 64} , service_manager{service_manager_} , kernel{system_.Kernel()} { diff --git a/src/core/hle/service/sockets/sockets.cpp b/src/core/hle/service/sockets/sockets.cpp index e14617ddd8..e96d7c5638 100644 --- a/src/core/hle/service/sockets/sockets.cpp +++ b/src/core/hle/service/sockets/sockets.cpp @@ -64,17 +64,17 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("ethc:c", std::make_shared(system)); - server_manager->RegisterNamedService("ethc:i", std::make_shared(system)); - server_manager->RegisterNamedService("bsd:s", std::make_shared(system, "bsd:s", false)); - server_manager->RegisterNamedService("bsd:u", std::make_shared(system, "bsd:u", true)); - server_manager->RegisterNamedService("bsd:a", std::make_shared(system, "bsd:a", true)); - server_manager->RegisterNamedService("bsd:nu", std::make_shared(system)); + server_manager->RegisterNamedService("ethc:c", std::make_shared(system), 5); + server_manager->RegisterNamedService("ethc:i", std::make_shared(system), 5); + server_manager->RegisterNamedService("bsd:s", std::make_shared(system, "bsd:s", false), 0x7E); + server_manager->RegisterNamedService("bsd:u", std::make_shared(system, "bsd:u", true), 0x0f); + server_manager->RegisterNamedService("bsd:a", std::make_shared(system, "bsd:a", true), 0x17); + server_manager->RegisterNamedService("bsd:nu", std::make_shared(system), 4); server_manager->RegisterNamedService("bsdcfg", std::make_shared(system, "bsdcfg")); server_manager->RegisterNamedService("ifcfg", std::make_shared(system, "ifcfg")); server_manager->RegisterNamedService("nsd:a", std::make_shared(system, "nsd:a")); server_manager->RegisterNamedService("nsd:u", std::make_shared(system, "nsd:u")); - server_manager->RegisterNamedService("sfdnsres", std::make_shared(system)); + server_manager->RegisterNamedService("sfdnsres", std::make_shared(system), 30); server_manager->RegisterNamedService("dns:priv", std::make_shared(system)); server_manager->RegisterNamedService("eth:nd", std::make_shared(system)); diff --git a/src/core/hle/service/usb/usb.cpp b/src/core/hle/service/usb/usb.cpp index 179d1f7097..ff2a377172 100644 --- a/src/core/hle/service/usb/usb.cpp +++ b/src/core/hle/service/usb/usb.cpp @@ -265,17 +265,17 @@ void LoopProcess(Core::System& system) { server_manager->RegisterNamedService("usb:ds", std::make_shared(system)); server_manager->RegisterNamedService("usb:hs", std::make_shared(system)); - server_manager->RegisterNamedService("usb:pd", std::make_shared(system)); - server_manager->RegisterNamedService("usb:pd:c", std::make_shared(system)); + server_manager->RegisterNamedService("usb:pd", std::make_shared(system), 6); + server_manager->RegisterNamedService("usb:pd:c", std::make_shared(system), 4); server_manager->RegisterNamedService("usb:pd:m", std::make_shared(system)); - server_manager->RegisterNamedService("usb:pm", std::make_shared(system)); + server_manager->RegisterNamedService("usb:pm", std::make_shared(system), 5); // +7.0.0 if (FirmwareManager::GetFirmwareVersion(system).first.major >= 7) { server_manager->RegisterNamedService("usb:qdb", std::make_shared(system)); } // +8.0.0 if (FirmwareManager::GetFirmwareVersion(system).first.major >= 8) { - server_manager->RegisterNamedService("usb:obsv", std::make_shared(system)); + server_manager->RegisterNamedService("usb:obsv", std::make_shared(system), 2); } ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/wlan/wlan.cpp b/src/core/hle/service/wlan/wlan.cpp index 7f118c62ba..bcd357d57a 100644 --- a/src/core/hle/service/wlan/wlan.cpp +++ b/src/core/hle/service/wlan/wlan.cpp @@ -246,14 +246,14 @@ public: void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("wlan:lcl", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:lg", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:lga", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:sg", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:soc", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:dtc", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:p", std::make_shared(system)); - server_manager->RegisterNamedService("wlan:nd", std::make_shared(system)); + server_manager->RegisterNamedService("wlan:lcl", std::make_shared(system), 10); + server_manager->RegisterNamedService("wlan:lg", std::make_shared(system), 10); + server_manager->RegisterNamedService("wlan:lga", std::make_shared(system), 10); + server_manager->RegisterNamedService("wlan:sg", std::make_shared(system), 10); + server_manager->RegisterNamedService("wlan:soc", std::make_shared(system), 10); + server_manager->RegisterNamedService("wlan:dtc", std::make_shared(system), 4); + server_manager->RegisterNamedService("wlan:p", std::make_shared(system), 30); + server_manager->RegisterNamedService("wlan:nd", std::make_shared(system), 5); ServerManager::RunServer(std::move(server_manager)); } From ff8368c6066faf3962e2f77af7da4954e2ff6a43 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 12 Sep 2026 09:59:33 +0200 Subject: [PATCH 031/128] [audio] Replace libopus with FFmpeg (#4169) FFmpeg offers two opus decoders: - libopus, this one is fed the same data (that affects output) as the previous libopus decoder had as well - native opus decoder: this only takes Float32 samples, we then need to invoke swrescale to translate between s16 (what switch sends) and float32 (what FFmpeg expects), the process is computationally more expensive, but trades off neatly as the native opus decoder is very optimised It also relegates the handling to FFmpeg, which simplifies existing code (more concretely, by using the "fill/drain" scheme for packets/frames) Closes #2897 Signed-off-by: lizzie Co-authored-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4169 Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- .../0001-disable-clang-runtime-neon.patch | 28 - .patch/opus/0002-no-install.patch | 153 ----- CMakeLists.txt | 15 - CMakeModules/find/FindOpus.cmake | 22 - cpmfile.json | 17 +- docs/Deps.md | 19 +- shell.nix | 2 +- .../yuzu_emu/fragments/LicensesFragment.kt | 7 - .../app/src/main/res/values/strings.xml | 45 -- src/audio_core/CMakeLists.txt | 14 +- .../adsp/apps/opus/opus_decode_object.cpp | 107 ---- .../adsp/apps/opus/opus_decode_object.h | 38 -- .../adsp/apps/opus/opus_decoder.cpp | 587 +++++++++++------- src/audio_core/adsp/apps/opus/opus_decoder.h | 27 +- .../opus/opus_multistream_decode_object.cpp | 113 ---- .../opus/opus_multistream_decode_object.h | 39 -- src/audio_core/adsp/apps/opus/opus_types.h | 32 + src/audio_core/adsp/apps/opus/shared_memory.h | 4 +- src/audio_core/opus/hardware_opus.cpp | 71 +-- src/audio_core/opus/hardware_opus.h | 2 - src/core/CMakeLists.txt | 1 - src/video_core/CMakeLists.txt | 2 - 22 files changed, 441 insertions(+), 904 deletions(-) delete mode 100644 .patch/opus/0001-disable-clang-runtime-neon.patch delete mode 100644 .patch/opus/0002-no-install.patch delete mode 100644 CMakeModules/find/FindOpus.cmake delete mode 100644 src/audio_core/adsp/apps/opus/opus_decode_object.cpp delete mode 100644 src/audio_core/adsp/apps/opus/opus_decode_object.h delete mode 100644 src/audio_core/adsp/apps/opus/opus_multistream_decode_object.cpp delete mode 100644 src/audio_core/adsp/apps/opus/opus_multistream_decode_object.h create mode 100644 src/audio_core/adsp/apps/opus/opus_types.h diff --git a/.patch/opus/0001-disable-clang-runtime-neon.patch b/.patch/opus/0001-disable-clang-runtime-neon.patch deleted file mode 100644 index 27a905c366..0000000000 --- a/.patch/opus/0001-disable-clang-runtime-neon.patch +++ /dev/null @@ -1,28 +0,0 @@ -From cc15da16e533b2a801934eab2dfeaf3c3949a1dc Mon Sep 17 00:00:00 2001 -From: crueter -Date: Mon, 8 Sep 2025 12:28:55 -0400 -Subject: [PATCH] [cmake] disable NEON runtime check on clang-cl - -When enabling runtime NEON checking for clang-cl, the linker would error out with `undefined symbol: __emit`, since clang doesn't actually implement this instruction. Therefore it makes sense to disable the runtime check by default on this platform, until either this is fixed or a clang-cl compatible intrinsic check is added (I don't have enough knowledge of MSVC to do this) ---- - cmake/OpusConfig.cmake | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -diff --git a/cmake/OpusConfig.cmake b/cmake/OpusConfig.cmake -index e9319fbad..d0f459e88 100644 ---- a/cmake/OpusConfig.cmake -+++ b/cmake/OpusConfig.cmake -@@ -71,7 +71,12 @@ elseif(OPUS_CPU_ARM AND NOT OPUS_DISABLE_INTRINSICS) - opus_detect_neon(COMPILER_SUPPORT_NEON) - if(COMPILER_SUPPORT_NEON) - option(OPUS_USE_NEON "Option to enable NEON" ON) -- option(OPUS_MAY_HAVE_NEON "Does runtime check for neon support" ON) -+ if (MSVC AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang") -+ set(NEON_RUNTIME_CHECK_DEFAULT OFF) -+ else() -+ set(NEON_RUNTIME_CHECK_DEFAULT ON) -+ endif() -+ option(OPUS_MAY_HAVE_NEON "Does runtime check for neon support" ${NEON_RUNTIME_CHECK_DEFAULT}) - option(OPUS_PRESUME_NEON "Assume target CPU has NEON support" OFF) - if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") - set(OPUS_PRESUME_NEON ON) diff --git a/.patch/opus/0002-no-install.patch b/.patch/opus/0002-no-install.patch deleted file mode 100644 index 833a3e4178..0000000000 --- a/.patch/opus/0002-no-install.patch +++ /dev/null @@ -1,153 +0,0 @@ -From bf455b67b4eaa446ffae5d25410b141b7b1b1082 Mon Sep 17 00:00:00 2001 -From: crueter -Date: Mon, 8 Sep 2025 12:08:20 -0400 -Subject: [PATCH] [cmake] `OPUS_INSTALL` option; only default install if root - project - -Signed-off-by: crueter ---- - CMakeLists.txt | 112 ++++++++++++++++++++++++++++--------------------- - 1 file changed, 64 insertions(+), 48 deletions(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index fcf034b19..08b5e16f8 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -4,6 +4,13 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") - include(OpusPackageVersion) - get_package_version(PACKAGE_VERSION PROJECT_VERSION) - -+# root project detection -+if(DEFINED PROJECT_NAME) -+ set(root_project OFF) -+else() -+ set(root_project ON) -+endif() -+ - project(Opus LANGUAGES C VERSION ${PROJECT_VERSION}) - - include(OpusFunctions) -@@ -83,12 +90,16 @@ set(OPUS_DNN_FLOAT_DEBUG_HELP_STR "Run DNN computations as float for debugging p - option(OPUS_DNN_FLOAT_DEBUG ${OPUS_DNN_FLOAT_DEBUG_HELP_STR} OFF) - add_feature_info(OPUS_DNN_FLOAT_DEBUG OPUS_DNN_FLOAT_DEBUG ${OPUS_DNN_FLOAT_DEBUG_HELP_STR}) - -+set(OPUS_INSTALL_HELP_STR "Install Opus targets") -+option(OPUS_INSTALL ${OPUS_INSTALL_HELP_STR} ${root_project}) -+add_feature_info(OPUS_INSTALL OPUS_INSTALL ${OPUS_INSTALL_HELP_STR}) -+ - set(OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR "install pkg-config module.") --option(OPUS_INSTALL_PKG_CONFIG_MODULE ${OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR} ON) -+option(OPUS_INSTALL_PKG_CONFIG_MODULE ${OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR} ${OPUS_INSTALL}) - add_feature_info(OPUS_INSTALL_PKG_CONFIG_MODULE OPUS_INSTALL_PKG_CONFIG_MODULE ${OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR}) - - set(OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR "install CMake package config module.") --option(OPUS_INSTALL_CMAKE_CONFIG_MODULE ${OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR} ON) -+option(OPUS_INSTALL_CMAKE_CONFIG_MODULE ${OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR} ${OPUS_INSTALL}) - add_feature_info(OPUS_INSTALL_CMAKE_CONFIG_MODULE OPUS_INSTALL_CMAKE_CONFIG_MODULE ${OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR}) - - set(OPUS_DRED_HELP_STR "enable DRED.") -@@ -613,53 +624,58 @@ if(OPUS_BUILD_FRAMEWORK) - OUTPUT_NAME Opus) - endif() - --install(TARGETS opus -- EXPORT OpusTargets -- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} -- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} -- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} -- FRAMEWORK DESTINATION ${CMAKE_INSTALL_PREFIX} -- PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opus) -- --if(OPUS_INSTALL_PKG_CONFIG_MODULE) -- set(prefix ${CMAKE_INSTALL_PREFIX}) -- set(exec_prefix ${CMAKE_INSTALL_PREFIX}) -- set(libdir ${CMAKE_INSTALL_FULL_LIBDIR}) -- set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) -- set(VERSION ${PACKAGE_VERSION}) -- if(HAVE_LIBM) -- set(LIBM "-lm") -+if (OPUS_INSTALL) -+ install(TARGETS opus -+ EXPORT OpusTargets -+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} -+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} -+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} -+ FRAMEWORK DESTINATION ${CMAKE_INSTALL_PREFIX} -+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opus) -+ -+ if(OPUS_INSTALL_PKG_CONFIG_MODULE) -+ set(prefix ${CMAKE_INSTALL_PREFIX}) -+ set(exec_prefix ${CMAKE_INSTALL_PREFIX}) -+ set(libdir ${CMAKE_INSTALL_FULL_LIBDIR}) -+ set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) -+ set(VERSION ${PACKAGE_VERSION}) -+ if(HAVE_LIBM) -+ set(LIBM "-lm") -+ endif() -+ configure_file(opus.pc.in opus.pc) -+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/opus.pc -+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) -+ endif() -+ -+ if(OPUS_INSTALL_CMAKE_CONFIG_MODULE) -+ set(CPACK_GENERATOR TGZ) -+ include(CPack) -+ set(CMAKE_INSTALL_PACKAGEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) -+ install(EXPORT OpusTargets -+ NAMESPACE Opus:: -+ DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) -+ -+ include(CMakePackageConfigHelpers) -+ -+ set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}) -+ configure_package_config_file( -+ ${PROJECT_SOURCE_DIR}/cmake/OpusConfig.cmake.in -+ OpusConfig.cmake -+ INSTALL_DESTINATION -+ ${CMAKE_INSTALL_PACKAGEDIR} -+ PATH_VARS -+ INCLUDE_INSTALL_DIR -+ INSTALL_PREFIX -+ ${CMAKE_INSTALL_PREFIX}) -+ -+ write_basic_package_version_file(OpusConfigVersion.cmake -+ VERSION ${PROJECT_VERSION} -+ COMPATIBILITY SameMajorVersion) -+ -+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/OpusConfig.cmake -+ ${CMAKE_CURRENT_BINARY_DIR}/OpusConfigVersion.cmake -+ DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) - endif() -- configure_file(opus.pc.in opus.pc) -- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/opus.pc -- DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) --endif() -- --if(OPUS_INSTALL_CMAKE_CONFIG_MODULE) -- set(CPACK_GENERATOR TGZ) -- include(CPack) -- set(CMAKE_INSTALL_PACKAGEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) -- install(EXPORT OpusTargets -- NAMESPACE Opus:: -- DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) -- -- include(CMakePackageConfigHelpers) -- -- set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}) -- configure_package_config_file(${PROJECT_SOURCE_DIR}/cmake/OpusConfig.cmake.in -- OpusConfig.cmake -- INSTALL_DESTINATION -- ${CMAKE_INSTALL_PACKAGEDIR} -- PATH_VARS -- INCLUDE_INSTALL_DIR -- INSTALL_PREFIX -- ${CMAKE_INSTALL_PREFIX}) -- write_basic_package_version_file(OpusConfigVersion.cmake -- VERSION ${PROJECT_VERSION} -- COMPATIBILITY SameMajorVersion) -- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/OpusConfig.cmake -- ${CMAKE_CURRENT_BINARY_DIR}/OpusConfigVersion.cmake -- DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) - endif() - - if(OPUS_BUILD_PROGRAMS) diff --git a/CMakeLists.txt b/CMakeLists.txt index 266331b0ac..f5c360b294 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -464,21 +464,6 @@ if (NOT YUZU_STATIC_ROOM) if (ZLIB_ADDED) add_library(ZLIB::ZLIB ALIAS zlibstatic) endif() - - # Opus - AddJsonPackage(opus) - - if (Opus_ADDED) - if (MSVC AND CXX_CLANG) - target_compile_options(opus PRIVATE - $<$:-Wno-implicit-function-declaration> - ) - endif() - endif() - - if (NOT TARGET Opus::opus) - add_library(Opus::opus ALIAS opus) - endif() endif() if(NOT TARGET Boost::headers) diff --git a/CMakeModules/find/FindOpus.cmake b/CMakeModules/find/FindOpus.cmake deleted file mode 100644 index 257642682e..0000000000 --- a/CMakeModules/find/FindOpus.cmake +++ /dev/null @@ -1,22 +0,0 @@ -# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -# SPDX-License-Identifier: GPL-3.0-or-later - -# SPDX-FileCopyrightText: 2022 yuzu Emulator Project -# SPDX-License-Identifier: GPL-2.0-or-later - -find_package(PkgConfig QUIET) -pkg_search_module(OPUS QUIET IMPORTED_TARGET opus) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Opus - REQUIRED_VARS OPUS_LINK_LIBRARIES - VERSION_VAR OPUS_VERSION -) - -if (MSYS2) - FixMsysPath(PkgConfig::OPUS) -endif() - -if (Opus_FOUND AND NOT TARGET Opus::opus) - add_library(Opus::opus ALIAS PkgConfig::OPUS) -endif() diff --git a/cpmfile.json b/cpmfile.json index 8b2099f40a..419c8d2d69 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -82,7 +82,7 @@ "name": "ffmpeg", "package": "FFmpeg", "repo": "crueter-ci/FFmpeg", - "version": "9.0.1-1788120736-bf1b838f2a" + "version": "9.0.1-1788303113-bf1b838f2a" }, "fmt": { "hash": "f0da82c545b01692e9fd30fdfb613dbb8dd9716983dcd0ff19ac2a8d36f74beb5540ef38072fdecc1e34191b3682a8542ecbf3a61ef287dbba0a2679d4e023f2", @@ -210,21 +210,6 @@ "repo": "jimmy-park/openssl-cmake", "version": "3.6.2" }, - "opus": { - "find_args": "MODULE", - "hash": "9506147b0de35befda8633ff272981cc2575c860874791bd455b752f797fd7dbd1079f0ba42ccdd7bb1fe6773fa5e84b3d75667c2883dd1fb2d0e4a5fa4f8387", - "min_version": "1.3", - "options": [ - "OPUS_PRESUME_NEON ON" - ], - "package": "Opus", - "patches": [ - "0001-disable-clang-runtime-neon.patch", - "0002-no-install.patch" - ], - "repo": "xiph/opus", - "version": "a3f0ec02b3" - }, "quazip": { "hash": "609c240c7f029ac26a37d8fbab51bc16284e05e128b78b9b9c0e95d083538c36047a67d682759ac990e4adb0eeb90f04f1ea7fe2253bbda7e7e3bcce32e53dd8", "min_version": "1.3", diff --git a/docs/Deps.md b/docs/Deps.md index 2b73ecb4ac..9a781ebdcd 100644 --- a/docs/Deps.md +++ b/docs/Deps.md @@ -60,7 +60,6 @@ All other dependencies will be downloaded and built by [CPM](https://github.com/ * [ZLIB](https://www.zlib.net/) 1.2+ * [zstd](https://facebook.github.io/zstd/) 1.5+ * [enet](http://enet.bespin.org/) 1.3+ -* [Opus](https://opus-codec.org/) 1.3+ Vulkan 1.3.274+ is also needed: @@ -121,7 +120,7 @@ sudo emerge -a \ dev-libs/boost dev-libs/openssl dev-libs/discord-rpc \ dev-util/spirv-tools dev-util/spirv-headers dev-util/vulkan-headers \ dev-util/vulkan-utility-libraries dev-util/glslang \ - media-gfx/renderdoc media-libs/libva media-libs/opus media-video/ffmpeg \ + media-gfx/renderdoc media-libs/libva media-video/ffmpeg \ media-libs/VulkanMemoryAllocator media-libs/libsdl3 media-libs/cubeb \ net-libs/enet \ sys-libs/zlib \ @@ -153,7 +152,7 @@ Required USE flags: Arch Linux ```sh -sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 ninja nlohmann-json openssl opus qt6-base qt6-multimedia qt6-charts sdl3 zlib zstd zip unzip vulkan-headers vulkan-utility-libraries libusb spirv-tools spirv-headers +sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 ninja nlohmann-json openssl qt6-base qt6-multimedia qt6-charts sdl3 zlib zstd zip unzip vulkan-headers vulkan-utility-libraries libusb spirv-tools spirv-headers ``` * Building with QT Web Engine requires `qt6-webengine` as well. @@ -166,7 +165,7 @@ sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glsl Ubuntu, Debian, Mint Linux ```sh -sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev qt6-charts-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev libboost-dev libboost-fiber-dev libboost-context-dev libsdl3-dev libopus-dev libasound2t64 vulkan-utility-libraries-dev +sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev qt6-charts-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev libboost-dev libboost-fiber-dev libboost-context-dev libsdl3-dev libasound2t64 vulkan-utility-libraries-dev ``` * Ubuntu 26.04, Linux Mint 22.3, or Debian 13 or later is required. @@ -213,7 +212,7 @@ First, enable the community repository; [see here](https://wiki.alpinelinux.org/ # Enable the community repository setup-apkrepos -c # 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-charts-dev libusb-dev libtool boost-dev sdl3-dev zstd-dev vulkan-utility-libraries spirv-tools-dev openssl-dev nlohmann-json lz4-dev jq patch ``` @@ -261,7 +260,7 @@ brew install molten-vk As root run: ```sh -pkg install devel/cmake devel/sdl3 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base x11-toolkits/qt6-charts 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 graphics/vulkan-utility-libraries graphics/vulkan-headers graphics/spirv-headers quazip-qt6 +pkg install devel/cmake devel/sdl3 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base x11-toolkits/qt6-charts devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib graphics/vulkan-utility-libraries graphics/vulkan-headers graphics/spirv-headers quazip-qt6 ``` If using FreeBSD 12 or prior, use `devel/pkg-config` instead. @@ -275,7 +274,7 @@ If using FreeBSD 12 or prior, use `devel/pkg-config` instead. For NetBSD +10.1: ```sh -pkgin install git cmake boost fmtlib SDL3 catch2 libjwt spirv-headers spirv-tools ffmpeg7 libva nlohmann-json jq libopus qt6-qtbase qt6-qtcharts qt6-qtmultimedia qt6-qttools cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1 libcxx frozen +pkgin install git cmake boost fmtlib SDL3 catch2 libjwt spirv-headers spirv-tools ffmpeg7 libva nlohmann-json jq qt6-qtbase qt6-qtcharts qt6-qtmultimedia qt6-qttools cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1 libcxx frozen ``` [Caveats](./Caveats.md#netbsd). @@ -306,7 +305,7 @@ pkg install gcc14 git cmake unzip nasm autoconf bash pkgconf ffmpeg glslang gmak OpenIndiana ```sh -sudo pkg install git cmake qt6 boost glslang libzip library/lz4 libusb-1 nlohmann-json openssl opus sdl3 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt +sudo pkg install git cmake qt6 boost glslang libzip library/lz4 libusb-1 nlohmann-json openssl sdl3 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt ``` [Caveats](./Caveats.md#openindiana). @@ -330,7 +329,7 @@ sudo pkgin install git cmake autoconf build-essential libusb-1 nasm gcc13 ```sh BASE="git make autoconf libtool automake-wrapper jq patch" -MINGW="qt6-base qt6-charts qt6-tools qt6-translations qt6-svg cmake toolchain clang python-pip openssl vulkan-memory-allocator vulkan-devel glslang boost fmt lz4 nlohmann-json zlib zstd enet opus libusb openssl SDL3" +MINGW="qt6-base qt6-charts qt6-tools qt6-translations qt6-svg cmake toolchain clang python-pip openssl vulkan-memory-allocator vulkan-devel glslang boost fmt lz4 nlohmann-json zlib zstd enet libusb openssl SDL3" # Either x86_64 or clang-aarch64 (Windows on ARM) packages="$BASE" for pkg in $MINGW; do @@ -356,7 +355,7 @@ pacman -Syuu --needed --noconfirm $packages HaikuOS ```sh -pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.90_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl3_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel glslang qt6_devel qt6_charts_devel cubeb_devel simpleini quazip_qt6_devel +pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel boost1.90_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl3_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel glslang qt6_devel qt6_charts_devel cubeb_devel simpleini quazip_qt6_devel ``` [Caveats](./Caveats.md#haikuos). diff --git a/shell.nix b/shell.nix index 786b94ccb2..e4d57d7e5e 100755 --- a/shell.nix +++ b/shell.nix @@ -12,7 +12,7 @@ pkgs.mkShellNoCC { git cmake clang gnumake patch jq pkg-config # libraries openssl boost fmt nlohmann_json lz4 zlib zstd - enet libopus vulkan-headers vulkan-utility-libraries + enet vulkan-headers vulkan-utility-libraries spirv-tools spirv-headers vulkan-loader unzip glslang python3 httplib cpp-jwt ffmpeg-headless libusb1 cubeb diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt index 32b72fe38f..226edfa00c 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt @@ -79,13 +79,6 @@ class LicensesFragment : Fragment() { R.string.license_ffmpeg_copyright, R.string.license_ffmpeg_text ), - License( - R.string.license_opus, - R.string.license_opus_description, - R.string.license_opus_link, - R.string.license_opus_copyright, - R.string.license_opus_text - ), License( R.string.license_sirit, R.string.license_sirit_description, diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index a9200bbca9..ca7263ead7 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -1783,51 +1783,6 @@ RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - - Opus - Modern audio compression for the internet - https://github.com/xiph/opus - Copyright 2001–2011 Xiph.Org, Skype Limited, Octasic, Jean-Marc Valin, Timothy B. Terriberry, CSIRO, Gregory Maxwell, Mark Borgerding, Erik de Castro Lopo - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met:\n\n - -- Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer.\n\n - -- 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.\n\n - -- Neither the name of Internet Society, IETF or IETF Trust, nor the -names of specific contributors, may be used to endorse or promote -products derived from this software without specific prior written -permission.\n\n - -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.\n\n - -Opus is subject to the royalty-free patent licenses which are -specified at:\n\n - -Xiph.Org Foundation: -https://datatracker.ietf.org/ipr/1524/ \n\n - -Microsoft Corporation: -https://datatracker.ietf.org/ipr/1914/ \n\n - -Broadcom Corporation: -https://datatracker.ietf.org/ipr/1526/ Sirit A runtime SPIR-V assembler diff --git a/src/audio_core/CMakeLists.txt b/src/audio_core/CMakeLists.txt index b244d657a9..71a46a7b1e 100644 --- a/src/audio_core/CMakeLists.txt +++ b/src/audio_core/CMakeLists.txt @@ -15,10 +15,6 @@ add_library(audio_core STATIC adsp/apps/audio_renderer/command_list_processor.h adsp/apps/opus/opus_decoder.cpp adsp/apps/opus/opus_decoder.h - adsp/apps/opus/opus_decode_object.cpp - adsp/apps/opus/opus_decode_object.h - adsp/apps/opus/opus_multistream_decode_object.cpp - adsp/apps/opus/opus_multistream_decode_object.h adsp/apps/opus/shared_memory.h audio_core.cpp audio_core.h @@ -226,8 +222,14 @@ else() $<$:-Wno-sign-conversion>) endif() -target_include_directories(audio_core PRIVATE ${OPUS_INCLUDE_DIRS}) -target_link_libraries(audio_core PUBLIC common core Opus::opus) +if (YUZU_USE_EXTERNAL_FFMPEG) + add_dependencies(audio_core ffmpeg-build) +endif() +target_include_directories(audio_core PUBLIC ${FFmpeg_INCLUDE_DIR}) +target_link_libraries(audio_core PRIVATE ${FFmpeg_LIBRARIES}) +target_link_options(audio_core PRIVATE ${FFmpeg_LDFLAGS}) + +target_link_libraries(audio_core PUBLIC common core) if (ENABLE_CUBEB) target_sources(audio_core PRIVATE diff --git a/src/audio_core/adsp/apps/opus/opus_decode_object.cpp b/src/audio_core/adsp/apps/opus/opus_decode_object.cpp deleted file mode 100644 index e2b9eb566c..0000000000 --- a/src/audio_core/adsp/apps/opus/opus_decode_object.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "audio_core/adsp/apps/opus/opus_decode_object.h" -#include "common/assert.h" - -namespace AudioCore::ADSP::OpusDecoder { -namespace { -bool IsValidChannelCount(u32 channel_count) { - return channel_count == 1 || channel_count == 2; -} -} // namespace - -u32 OpusDecodeObject::GetWorkBufferSize(u32 channel_count) { - if (!IsValidChannelCount(channel_count)) { - return 0; - } - return static_cast(sizeof(OpusDecodeObject)) + opus_decoder_get_size(channel_count); -} - -OpusDecodeObject& OpusDecodeObject::Initialize(u64 buffer, u64 buffer2) { - auto* new_decoder = reinterpret_cast(buffer); - auto* comparison = reinterpret_cast(buffer2); - - if (new_decoder->magic == DecodeObjectMagic) { - if (!new_decoder->initialized || - (new_decoder->initialized && new_decoder->self == comparison)) { - new_decoder->state_valid = true; - } - } else { - new_decoder->initialized = false; - new_decoder->state_valid = true; - } - return *new_decoder; -} - -s32 OpusDecodeObject::InitializeDecoder(u32 sample_rate, u32 channel_count) { - if (!state_valid) { - return OPUS_INVALID_STATE; - } - - if (initialized) { - return OPUS_OK; - } - - // Unfortunately libopus does not expose the OpusDecoder struct publicly, so we can't include - // it in this class. Nintendo does not allocate memory, which is why we have a workbuffer - // provided. - // We could use _create and have libopus allocate it for us, but then we have to separately - // track which decoder is being used between this and multistream in order to call the correct - // destroy from the host side. - // This is a bit cringe, but is safe as these objects are only ever initialized inside the given - // workbuffer, and GetWorkBufferSize will guarantee there's enough space to follow. - decoder = (LibOpusDecoder*)(this + 1); - s32 ret = opus_decoder_init(decoder, sample_rate, channel_count); - if (ret == OPUS_OK) { - magic = DecodeObjectMagic; - initialized = true; - state_valid = true; - self = this; - final_range = 0; - } - return ret; -} - -s32 OpusDecodeObject::Shutdown() { - if (!state_valid) { - return OPUS_INVALID_STATE; - } - - if (initialized) { - magic = 0x0; - initialized = false; - state_valid = false; - self = nullptr; - final_range = 0; - decoder = nullptr; - } - return OPUS_OK; -} - -s32 OpusDecodeObject::ResetDecoder() { - return opus_decoder_ctl(decoder, OPUS_RESET_STATE); -} - -s32 OpusDecodeObject::Decode(u32& out_sample_count, u64 output_data, u64 output_data_size, - u64 input_data, u64 input_data_size) { - ASSERT(initialized); - out_sample_count = 0; - - if (!state_valid) { - return OPUS_INVALID_STATE; - } - - auto ret_code_or_samples = opus_decode( - decoder, reinterpret_cast(input_data), static_cast(input_data_size), - reinterpret_cast(output_data), static_cast(output_data_size), 0); - - if (ret_code_or_samples < OPUS_OK) { - return ret_code_or_samples; - } - - out_sample_count = ret_code_or_samples; - return opus_decoder_ctl(decoder, OPUS_GET_FINAL_RANGE_REQUEST, &final_range); -} - -} // namespace AudioCore::ADSP::OpusDecoder diff --git a/src/audio_core/adsp/apps/opus/opus_decode_object.h b/src/audio_core/adsp/apps/opus/opus_decode_object.h deleted file mode 100644 index 6425f987c6..0000000000 --- a/src/audio_core/adsp/apps/opus/opus_decode_object.h +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include - -#include "common/common_types.h" - -namespace AudioCore::ADSP::OpusDecoder { -using LibOpusDecoder = ::OpusDecoder; -static constexpr u32 DecodeObjectMagic = 0xDEADBEEF; - -class OpusDecodeObject { -public: - static u32 GetWorkBufferSize(u32 channel_count); - static OpusDecodeObject& Initialize(u64 buffer, u64 buffer2); - - s32 InitializeDecoder(u32 sample_rate, u32 channel_count); - s32 Shutdown(); - s32 ResetDecoder(); - s32 Decode(u32& out_sample_count, u64 output_data, u64 output_data_size, u64 input_data, - u64 input_data_size); - u32 GetFinalRange() const noexcept { - return final_range; - } - -private: - u32 magic; - bool initialized; - bool state_valid; - OpusDecodeObject* self; - u32 final_range; - LibOpusDecoder* decoder; -}; -static_assert(std::is_trivially_constructible_v); - -} // namespace AudioCore::ADSP::OpusDecoder diff --git a/src/audio_core/adsp/apps/opus/opus_decoder.cpp b/src/audio_core/adsp/apps/opus/opus_decoder.cpp index 8a009c04c7..0be0f774b1 100644 --- a/src/audio_core/adsp/apps/opus/opus_decoder.cpp +++ b/src/audio_core/adsp/apps/opus/opus_decoder.cpp @@ -5,55 +5,388 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include -#include -#include "audio_core/adsp/apps/opus/opus_decode_object.h" -#include "audio_core/adsp/apps/opus/opus_multistream_decode_object.h" +extern "C" { +#include +#include +#include +#include +#include +#include +#include +#include +} + #include "audio_core/adsp/apps/opus/shared_memory.h" #include "audio_core/audio_core.h" -#include "audio_core/common/common.h" #include "common/logging.h" #include "common/thread.h" #include "core/core.h" #include "core/core_timing.h" +#include "core/hle/service/audio/errors.h" namespace AudioCore::ADSP::OpusDecoder { namespace { -constexpr size_t OpusStreamCountMax = 255; +constexpr u32 OPUS_STREAM_COUNT_MAX = 255; +// https://git.ffmpeg.org/gitweb/ffmpeg.git/blob_plain/HEAD:/libavcodec/libopusdec.c +constexpr u32 OPUS_HEAD_SIZE = 19; +constexpr u32 OPUS_MAX_CHANNELS = 2; bool IsValidChannelCount(u32 channel_count) { - return channel_count == 1 || channel_count == 2; + return channel_count >= 1 || channel_count <= OPUS_MAX_CHANNELS; } -bool IsValidMultiStreamChannelCount(u32 channel_count) { - return channel_count <= OpusStreamCountMax; +bool IsValidStreamCounts(u32 total_stream_count, u32 stereo_stream_count) { + return total_stream_count > 0 && total_stream_count <= OPUS_STREAM_COUNT_MAX + && s32(stereo_stream_count) >= 0 && stereo_stream_count <= total_stream_count; } -bool IsValidMultiStreamStreamCounts(s32 total_stream_count, s32 stereo_stream_count) { - return IsValidMultiStreamChannelCount(total_stream_count) && total_stream_count > 0 && - stereo_stream_count >= 0 && stereo_stream_count <= total_stream_count; -} +class OpusGenericDecodeObject { +public: + static u32 GetWorkBufferSizeMultistream(u32 total_stream_count, u32 stereo_stream_count) { + if (IsValidStreamCounts(total_stream_count, stereo_stream_count)) + return 48 + 2556 * (total_stream_count * stereo_stream_count); + return 0; + } + + static u32 GetWorkBufferSize(u32 channel_count) { + if (channel_count == 1 || channel_count == 2) + return 48 + 16 * channel_count; + return 0; + } + + /// idempotency of initialize is guaranteed + Result InitializeDecoder(u32 sample_rate, u32 total_stream_count, u32 channel_count, u32 stereo_stream_count, u8 const* mappings) { + // prefer libopus, ffmpeg docs say to use libopus **if** available + // However, native opus can also work with swrescale: + // it uses planarfloat, we can resample to s16 + AVCodec const* codec = avcodec_find_decoder_by_name("libopus"); + bool is_libopus = codec != nullptr; + if (!codec) { + LOG_WARNING(Audio_DSP, "using ffmpeg native opus decoder"); + codec = avcodec_find_decoder(AV_CODEC_ID_OPUS); + } + if (codec) { + if ((avc = avc ? avc : avcodec_alloc_context3(codec))) { + if (is_libopus) { + const std::array mapping_arr{0, 1}; + mappings = mappings ? mappings : mapping_arr.data(); + + // freed by avcodec_context_free() + u8 *edata = reinterpret_cast(av_mallocz(OPUS_HEAD_SIZE + 2 * OPUS_MAX_CHANNELS + AV_INPUT_BUFFER_PADDING_SIZE)); + ASSERT(edata); + edata[9] = u8(channel_count); //channels + edata[10] = u8(0); //opus->pre_skip + edata[16] = u8(0); //gain_db + edata[18] = u8(0); //channel_map + edata[OPUS_HEAD_SIZE + 0] = u8(total_stream_count); + edata[OPUS_HEAD_SIZE + 1] = u8(stereo_stream_count); + if (channel_count >= 1) edata[OPUS_HEAD_SIZE + 2] = mappings[0]; + if (channel_count >= 2) edata[OPUS_HEAD_SIZE + 3] = mappings[1]; + avc->extradata = edata; + avc->extradata_size = OPUS_HEAD_SIZE + 2 * channel_count; + } + + + // FFmpeg hardcodes sample rate + avc->sample_rate = sample_rate; + avc->request_sample_fmt = AV_SAMPLE_FMT_S16; + av_channel_layout_default(&avc->ch_layout, channel_count); + if (avcodec_open2(avc, codec, nullptr) >= 0) { + avpkt = av_packet_alloc(); + frame = av_frame_alloc(); + return ResultSuccess; + } else { + avcodec_free_context(&avc); + } + } + } + return Service::Audio::ResultLibOpusInternalError; + } + + Result Shutdown() { + avcodec_free_context(&avc); + av_frame_free(&frame); + av_packet_free(&avpkt); + return ResultSuccess; + } + + Result ResetDecoder() { + if (avc) { + if (avcodec_is_open(avc)) avcodec_flush_buffers(avc); + return ResultSuccess; + } + return Service::Audio::ResultLibOpusInvalidState; + } + + Result Decode(u32& out_sample_count, u64 output_data, u64 output_data_size, u64 input_data, u64 input_data_size) { + out_sample_count = 0; + if (avc) { + int rem_output_bytes = int(output_data_size); + while (rem_output_bytes > 0) { + int r = avcodec_receive_frame(avc, frame); + if (r == AVERROR(EAGAIN)) { + av_packet_unref(avpkt); + av_new_packet(avpkt, int(input_data_size)); + std::memcpy(avpkt->data, reinterpret_cast(input_data), input_data_size); + r = avcodec_send_packet(avc, avpkt); + ASSERT(r >= 0); + } else if (r == AVERROR_EOF) { + break; + } else if (r >= 0) { + auto const bsize = av_samples_get_buffer_size(nullptr, frame->ch_layout.nb_channels, frame->nb_samples, AV_SAMPLE_FMT_S16, 1); + if (frame->format == AV_SAMPLE_FMT_S16) { + std::memcpy(reinterpret_cast(output_data) + (int(output_data_size) - rem_output_bytes), frame->data[0], size_t(bsize)); + } else { + SwrContext *swr = nullptr; + if (swr_alloc_set_opts2( + &swr, + &avc->ch_layout, + AV_SAMPLE_FMT_S16, + 48000, + &avc->ch_layout, + (enum AVSampleFormat)frame->format, + 48000, + 0, + nullptr + ) >= 0) { + if (swr_init(swr) >= 0) { + AVFrame *s16_frame = av_frame_alloc(); + s16_frame->format = AV_SAMPLE_FMT_S16; + s16_frame->sample_rate = frame->sample_rate; + av_channel_layout_copy(&s16_frame->ch_layout, &frame->ch_layout); + s16_frame->nb_samples = frame->nb_samples; + av_frame_get_buffer(s16_frame, 0); + swr_convert(swr, s16_frame->data, s16_frame->nb_samples, (const uint8_t **)frame->data, frame->nb_samples); + std::memcpy(reinterpret_cast(output_data) + (int(output_data_size) - rem_output_bytes), s16_frame->data[0], size_t(bsize)); + swr_free(&swr); + } + } + } + out_sample_count += frame->nb_samples; + rem_output_bytes -= bsize; + } else { + LOG_ERROR(Audio_DSP, "{}", r); + break; + } + } + ASSERT(rem_output_bytes == 0 && "remaining bytes!"); + return ResultSuccess; + } + return Service::Audio::ResultLibOpusInvalidState; + } + + AVCodecContext* avc = nullptr; + AVPacket* avpkt = nullptr; + AVFrame* frame = nullptr; +}; } // namespace -OpusDecoder::OpusDecoder(Core::System& system_) : system{system_} { - init_thread = std::jthread([this](std::stop_token stop_token) { Init(stop_token); }); +OpusDecoder::OpusDecoder(Core::System& system) { + dsp_thread = std::jthread([this, &system](std::stop_token stop_token) { + Common::SetCurrentThreadName("DSP_OpusDecoder"); + if (Receive(Direction::DSP, stop_token) != Message::Start) { + LOG_ERROR(Service_Audio, "DSP OpusDecoder failed to receive Start message. Opus initialization failed."); + return; + } + Send(Direction::Host, Message::StartOK); + + // Main OpusDecoder thread, responsible for processing the incoming Opus packets. + ::Common::unordered_map decode_objects; + while (!stop_token.stop_requested()) { + auto msg = Receive(Direction::DSP, stop_token); + switch (msg) { + case Shutdown: + Send(Direction::Host, Message::ShutdownOK); + return; + case GetWorkBufferSize: { + auto channel_count = s32(shared_memory->host_send_data[0]); + + ASSERT(IsValidChannelCount(channel_count)); + + shared_memory->dsp_return_data[0] = OpusGenericDecodeObject::GetWorkBufferSize(channel_count); + Send(Direction::Host, Message::GetWorkBufferSizeOK); + break; + } + case InitializeDecodeObject: { + auto buffer = shared_memory->host_send_data[0]; + auto buffer_size = shared_memory->host_send_data[1]; + auto sample_rate = s32(shared_memory->host_send_data[2]); + auto channel_count = s32(shared_memory->host_send_data[3]); + + ASSERT(sample_rate >= 0); + ASSERT(IsValidChannelCount(channel_count)); + ASSERT(buffer_size >= OpusGenericDecodeObject::GetWorkBufferSize(channel_count)); + + if (auto const it = decode_objects.find(buffer); it != decode_objects.end()) { + it->second.Shutdown(); + shared_memory->dsp_return_data[0] = it->second.InitializeDecoder(sample_rate, 1, channel_count, channel_count == 2 ? 1 : 0, nullptr).raw; + } else { + OpusGenericDecodeObject obj{}; + shared_memory->dsp_return_data[0] = obj.InitializeDecoder(sample_rate, 1, channel_count, channel_count == 2 ? 1 : 0, nullptr).raw; + decode_objects.insert_or_assign(buffer, obj); + } + Send(Direction::Host, Message::InitializeDecodeObjectOK); + break; + } + case ShutdownDecodeObject: { + auto buffer = shared_memory->host_send_data[0]; + //[[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; + if (auto const it = decode_objects.find(buffer); it != decode_objects.end()) { + shared_memory->dsp_return_data[0] = it->second.Shutdown().raw; + } else { + LOG_ERROR(Audio_DSP, "operating unregistered buffer {}", buffer); + shared_memory->dsp_return_data[0] = Service::Audio::ResultLibOpusInvalidState.raw; + } + Send(Direction::Host, Message::ShutdownDecodeObjectOK); + break; + } + case DecodeInterleaved: { + auto start_time = system.CoreTiming().GetGlobalTimeUs(); + + auto buffer = shared_memory->host_send_data[0]; + auto input_data = shared_memory->host_send_data[1]; + auto input_data_size = shared_memory->host_send_data[2]; + auto output_data = shared_memory->host_send_data[3]; + auto output_data_size = shared_memory->host_send_data[4]; + //auto final_range = static_cast(shared_memory->host_send_data[5]); + auto reset_requested = shared_memory->host_send_data[6]; + + u32 decoded_samples{0}; + + if (auto const it = decode_objects.find(buffer); it != decode_objects.end()) { + auto res = ResultSuccess; + if (reset_requested) + res = it->second.ResetDecoder(); + if (res == ResultSuccess) + res = it->second.Decode(decoded_samples, output_data, output_data_size, input_data, input_data_size); + + auto end_time = system.CoreTiming().GetGlobalTimeUs(); + shared_memory->dsp_return_data[0] = res.raw; + shared_memory->dsp_return_data[1] = decoded_samples; + shared_memory->dsp_return_data[2] = (end_time - start_time).count(); + } else { + LOG_ERROR(Audio_DSP, "operating unregistered buffer {}", buffer); + shared_memory->dsp_return_data[0] = Service::Audio::ResultLibOpusInvalidState.raw; + } + Send(Direction::Host, Message::DecodeInterleavedOK); + break; + } + case MapMemory: { + [[maybe_unused]] auto buffer = shared_memory->host_send_data[0]; + [[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; + Send(Direction::Host, Message::MapMemoryOK); + break; + } + case UnmapMemory: { + [[maybe_unused]] auto buffer = shared_memory->host_send_data[0]; + [[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; + Send(Direction::Host, Message::UnmapMemoryOK); + break; + } + case GetWorkBufferSizeForMultiStream: { + auto total_stream_count = s32(shared_memory->host_send_data[0]); + auto stereo_stream_count = s32(shared_memory->host_send_data[1]); + + ASSERT(IsValidStreamCounts(total_stream_count, stereo_stream_count)); + + shared_memory->dsp_return_data[0] = OpusGenericDecodeObject::GetWorkBufferSizeMultistream(total_stream_count, stereo_stream_count); + Send(Direction::Host, Message::GetWorkBufferSizeForMultiStreamOK); + break; + } + case InitializeMultiStreamDecodeObject: { + auto buffer = shared_memory->host_send_data[0]; + auto buffer_size = shared_memory->host_send_data[1]; + auto sample_rate = s32(shared_memory->host_send_data[2]); + auto channel_count = s32(shared_memory->host_send_data[3]); + auto total_stream_count = s32(shared_memory->host_send_data[4]); + auto stereo_stream_count = s32(shared_memory->host_send_data[5]); + // Nintendo seem to have a bug here, they try to use &host_send_data[6] for the channel + // mappings, but [6] is never set, and there is not enough room in the argument data for + // more than 40 channels, when 255 are possible. + // It also means the mapping values are undefined, though likely always 0, + // and the mappings given by the game are ignored. The mappings are copied to this + // dedicated buffer host side, so let's do as intended. + auto mappings = shared_memory->channel_mapping.data(); + + ASSERT(IsValidStreamCounts(total_stream_count, stereo_stream_count)); + ASSERT(sample_rate >= 0); + ASSERT(buffer_size >= OpusGenericDecodeObject::GetWorkBufferSizeMultistream(total_stream_count, stereo_stream_count)); + if (auto const it = decode_objects.find(buffer); it != decode_objects.end()) { + it->second.Shutdown(); + shared_memory->dsp_return_data[0] = it->second.InitializeDecoder(sample_rate, total_stream_count, channel_count, stereo_stream_count, mappings).raw; + } else { + OpusGenericDecodeObject obj{}; + shared_memory->dsp_return_data[0] = obj.InitializeDecoder(sample_rate, total_stream_count, channel_count, stereo_stream_count, mappings).raw; + decode_objects.insert_or_assign(buffer, obj); + } + Send(Direction::Host, Message::InitializeMultiStreamDecodeObjectOK); + break; + } + case ShutdownMultiStreamDecodeObject: { + auto buffer = shared_memory->host_send_data[0]; + //[[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; + if (auto const it = decode_objects.find(buffer); it != decode_objects.end()) { + shared_memory->dsp_return_data[0] = it->second.Shutdown().raw; + } else { + LOG_ERROR(Audio_DSP, "operating unregistered buffer {}", buffer); + shared_memory->dsp_return_data[0] = Service::Audio::ResultLibOpusInvalidState.raw; + } + Send(Direction::Host, Message::ShutdownMultiStreamDecodeObjectOK); + break; + } + case DecodeInterleavedForMultiStream: { + auto start_time = system.CoreTiming().GetGlobalTimeUs(); + + auto buffer = shared_memory->host_send_data[0]; + auto input_data = shared_memory->host_send_data[1]; + auto input_data_size = shared_memory->host_send_data[2]; + auto output_data = shared_memory->host_send_data[3]; + auto output_data_size = shared_memory->host_send_data[4]; + //auto final_range = static_cast(shared_memory->host_send_data[5]); + auto reset_requested = shared_memory->host_send_data[6]; + + u32 decoded_samples{0}; + + if (auto const it = decode_objects.find(buffer); it != decode_objects.end()) { + auto res = ResultSuccess; + if (reset_requested) + res = it->second.ResetDecoder(); + if (res == ResultSuccess) + res = it->second.Decode(decoded_samples, output_data, output_data_size, input_data, input_data_size); + + auto end_time = system.CoreTiming().GetGlobalTimeUs(); + shared_memory->dsp_return_data[0] = res.raw; + shared_memory->dsp_return_data[1] = decoded_samples; + shared_memory->dsp_return_data[2] = (end_time - start_time).count(); + } else { + LOG_ERROR(Audio_DSP, "operating unregistered buffer {}", buffer); + shared_memory->dsp_return_data[0] = Service::Audio::ResultLibOpusInvalidState.raw; + } + Send(Direction::Host, Message::DecodeInterleavedForMultiStreamOK); + break; + } + default: + LOG_ERROR(Audio_DSP, "Invalid OpusDecoder command {}", msg); + continue; + } + } + for (auto e : decode_objects) + e.second.Shutdown(); + }); } OpusDecoder::~OpusDecoder() { - if (!running) { - init_thread.request_stop(); - return; + if (dsp_thread.joinable()) { + // Shutdown the thread + auto const stop_token = dsp_thread.get_stop_token(); + Send(Direction::DSP, Message::Shutdown); + auto msg = Receive(Direction::Host, stop_token); + ASSERT_MSG(msg == Message::ShutdownOK, "Expected Opus shutdown code {}, got {}", Message::ShutdownOK, msg); + dsp_thread.request_stop(); + dsp_thread.join(); } - - // Shutdown the thread - Send(Direction::DSP, Message::Shutdown); - auto msg = Receive(Direction::Host); - ASSERT_MSG(msg == Message::ShutdownOK, "Expected Opus shutdown code {}, got {}", - Message::ShutdownOK, msg); - main_thread.request_stop(); - main_thread.join(); - running = false; } void OpusDecoder::Send(Direction dir, u32 message) { @@ -64,206 +397,4 @@ u32 OpusDecoder::Receive(Direction dir, std::stop_token stop_token) { return mailbox.Receive(dir, stop_token); } -void OpusDecoder::Init(std::stop_token stop_token) { - Common::SetCurrentThreadName("DSP_OpusDecoder_Init"); - - if (Receive(Direction::DSP, stop_token) != Message::Start) { - LOG_ERROR(Service_Audio, - "DSP OpusDecoder failed to receive Start message. Opus initialization failed."); - return; - } - main_thread = std::jthread([this](std::stop_token st) { Main(st); }); - running = true; - Send(Direction::Host, Message::StartOK); -} - -void OpusDecoder::Main(std::stop_token stop_token) { - Common::SetCurrentThreadName("DSP_OpusDecoder_Main"); - - while (!stop_token.stop_requested()) { - auto msg = Receive(Direction::DSP, stop_token); - switch (msg) { - case Shutdown: - Send(Direction::Host, Message::ShutdownOK); - return; - - case GetWorkBufferSize: { - auto channel_count = static_cast(shared_memory->host_send_data[0]); - - ASSERT(IsValidChannelCount(channel_count)); - - shared_memory->dsp_return_data[0] = OpusDecodeObject::GetWorkBufferSize(channel_count); - Send(Direction::Host, Message::GetWorkBufferSizeOK); - } break; - - case InitializeDecodeObject: { - auto buffer = shared_memory->host_send_data[0]; - auto buffer_size = shared_memory->host_send_data[1]; - auto sample_rate = static_cast(shared_memory->host_send_data[2]); - auto channel_count = static_cast(shared_memory->host_send_data[3]); - - ASSERT(sample_rate >= 0); - ASSERT(IsValidChannelCount(channel_count)); - ASSERT(buffer_size >= OpusDecodeObject::GetWorkBufferSize(channel_count)); - - auto& decoder_object = OpusDecodeObject::Initialize(buffer, buffer); - shared_memory->dsp_return_data[0] = - decoder_object.InitializeDecoder(sample_rate, channel_count); - - Send(Direction::Host, Message::InitializeDecodeObjectOK); - } break; - - case ShutdownDecodeObject: { - auto buffer = shared_memory->host_send_data[0]; - [[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; - - auto& decoder_object = OpusDecodeObject::Initialize(buffer, buffer); - shared_memory->dsp_return_data[0] = decoder_object.Shutdown(); - - Send(Direction::Host, Message::ShutdownDecodeObjectOK); - } break; - - case DecodeInterleaved: { - auto start_time = system.CoreTiming().GetGlobalTimeUs(); - - auto buffer = shared_memory->host_send_data[0]; - auto input_data = shared_memory->host_send_data[1]; - auto input_data_size = shared_memory->host_send_data[2]; - auto output_data = shared_memory->host_send_data[3]; - auto output_data_size = shared_memory->host_send_data[4]; - auto final_range = static_cast(shared_memory->host_send_data[5]); - auto reset_requested = shared_memory->host_send_data[6]; - - u32 decoded_samples{0}; - - auto& decoder_object = OpusDecodeObject::Initialize(buffer, buffer); - s32 error_code{OPUS_OK}; - if (reset_requested) { - error_code = decoder_object.ResetDecoder(); - } - - if (error_code == OPUS_OK) { - error_code = decoder_object.Decode(decoded_samples, output_data, output_data_size, - input_data, input_data_size); - } - - if (error_code == OPUS_OK) { - if (final_range && decoder_object.GetFinalRange() != final_range) { - error_code = OPUS_INVALID_PACKET; - } - } - - auto end_time = system.CoreTiming().GetGlobalTimeUs(); - shared_memory->dsp_return_data[0] = error_code; - shared_memory->dsp_return_data[1] = decoded_samples; - shared_memory->dsp_return_data[2] = (end_time - start_time).count(); - - Send(Direction::Host, Message::DecodeInterleavedOK); - } break; - - case MapMemory: { - [[maybe_unused]] auto buffer = shared_memory->host_send_data[0]; - [[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; - Send(Direction::Host, Message::MapMemoryOK); - } break; - - case UnmapMemory: { - [[maybe_unused]] auto buffer = shared_memory->host_send_data[0]; - [[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; - Send(Direction::Host, Message::UnmapMemoryOK); - } break; - - case GetWorkBufferSizeForMultiStream: { - auto total_stream_count = static_cast(shared_memory->host_send_data[0]); - auto stereo_stream_count = static_cast(shared_memory->host_send_data[1]); - - ASSERT(IsValidMultiStreamStreamCounts(total_stream_count, stereo_stream_count)); - - shared_memory->dsp_return_data[0] = OpusMultiStreamDecodeObject::GetWorkBufferSize( - total_stream_count, stereo_stream_count); - Send(Direction::Host, Message::GetWorkBufferSizeForMultiStreamOK); - } break; - - case InitializeMultiStreamDecodeObject: { - auto buffer = shared_memory->host_send_data[0]; - auto buffer_size = shared_memory->host_send_data[1]; - auto sample_rate = static_cast(shared_memory->host_send_data[2]); - auto channel_count = static_cast(shared_memory->host_send_data[3]); - auto total_stream_count = static_cast(shared_memory->host_send_data[4]); - auto stereo_stream_count = static_cast(shared_memory->host_send_data[5]); - // Nintendo seem to have a bug here, they try to use &host_send_data[6] for the channel - // mappings, but [6] is never set, and there is not enough room in the argument data for - // more than 40 channels, when 255 are possible. - // It also means the mapping values are undefined, though likely always 0, - // and the mappings given by the game are ignored. The mappings are copied to this - // dedicated buffer host side, so let's do as intended. - auto mappings = shared_memory->channel_mapping.data(); - - ASSERT(IsValidMultiStreamStreamCounts(total_stream_count, stereo_stream_count)); - ASSERT(sample_rate >= 0); - ASSERT(buffer_size >= OpusMultiStreamDecodeObject::GetWorkBufferSize( - total_stream_count, stereo_stream_count)); - - auto& decoder_object = OpusMultiStreamDecodeObject::Initialize(buffer, buffer); - shared_memory->dsp_return_data[0] = decoder_object.InitializeDecoder( - sample_rate, total_stream_count, channel_count, stereo_stream_count, mappings); - - Send(Direction::Host, Message::InitializeMultiStreamDecodeObjectOK); - } break; - - case ShutdownMultiStreamDecodeObject: { - auto buffer = shared_memory->host_send_data[0]; - [[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; - - auto& decoder_object = OpusMultiStreamDecodeObject::Initialize(buffer, buffer); - shared_memory->dsp_return_data[0] = decoder_object.Shutdown(); - - Send(Direction::Host, Message::ShutdownMultiStreamDecodeObjectOK); - } break; - - case DecodeInterleavedForMultiStream: { - auto start_time = system.CoreTiming().GetGlobalTimeUs(); - - auto buffer = shared_memory->host_send_data[0]; - auto input_data = shared_memory->host_send_data[1]; - auto input_data_size = shared_memory->host_send_data[2]; - auto output_data = shared_memory->host_send_data[3]; - auto output_data_size = shared_memory->host_send_data[4]; - auto final_range = static_cast(shared_memory->host_send_data[5]); - auto reset_requested = shared_memory->host_send_data[6]; - - u32 decoded_samples{0}; - - auto& decoder_object = OpusMultiStreamDecodeObject::Initialize(buffer, buffer); - s32 error_code{OPUS_OK}; - if (reset_requested) { - error_code = decoder_object.ResetDecoder(); - } - - if (error_code == OPUS_OK) { - error_code = decoder_object.Decode(decoded_samples, output_data, output_data_size, - input_data, input_data_size); - } - - if (error_code == OPUS_OK) { - if (final_range && decoder_object.GetFinalRange() != final_range) { - error_code = OPUS_INVALID_PACKET; - } - } - - auto end_time = system.CoreTiming().GetGlobalTimeUs(); - shared_memory->dsp_return_data[0] = error_code; - shared_memory->dsp_return_data[1] = decoded_samples; - shared_memory->dsp_return_data[2] = (end_time - start_time).count(); - - Send(Direction::Host, Message::DecodeInterleavedForMultiStreamOK); - } break; - - default: - LOG_ERROR(Service_Audio, "Invalid OpusDecoder command {}", msg); - continue; - } - } -} - } // namespace AudioCore::ADSP::OpusDecoder diff --git a/src/audio_core/adsp/apps/opus/opus_decoder.h b/src/audio_core/adsp/apps/opus/opus_decoder.h index 5b3f22bf4c..dd87b473d1 100644 --- a/src/audio_core/adsp/apps/opus/opus_decoder.h +++ b/src/audio_core/adsp/apps/opus/opus_decoder.h @@ -6,12 +6,13 @@ #pragma once -#include #include +#include "common/container/unordered_map.h" #include "audio_core/adsp/apps/opus/shared_memory.h" #include "audio_core/adsp/mailbox.h" #include "common/common_types.h" +#include "core/hle/result.h" namespace Core { class System; @@ -48,16 +49,14 @@ enum Message : u32 { DecodeInterleavedForMultiStreamOK = 50, }; -/** - * The AudioRenderer application running on the ADSP. - */ +/// @brief The AudioRenderer application running on the ADSP. class OpusDecoder { public: explicit OpusDecoder(Core::System& system); ~OpusDecoder(); bool IsRunning() const noexcept { - return running; + return dsp_thread.joinable(); } void Send(Direction dir, u32 message); @@ -68,28 +67,12 @@ public: } private: - /** - * Initializing thread, launched at audio_core boot to avoid blocking the main emu boot thread. - */ - void Init(std::stop_token stop_token); - /** - * Main OpusDecoder thread, responsible for processing the incoming Opus packets. - */ - void Main(std::stop_token stop_token); - - /// Core system - Core::System& system; /// Mailbox to communicate messages with the host, drives the main thread Mailbox mailbox; - /// Init thread - std::jthread init_thread{}; - /// Main thread - std::jthread main_thread{}; - /// The current state - bool running{}; /// Structure shared with the host, input data set by the host before sending a mailbox message, /// and the responses are written back by the OpusDecoder. SharedMemory* shared_memory{}; + std::jthread dsp_thread{}; }; } // namespace AudioCore::ADSP::OpusDecoder diff --git a/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.cpp b/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.cpp deleted file mode 100644 index 6fecd63309..0000000000 --- a/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.cpp +++ /dev/null @@ -1,113 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 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 - -#include "audio_core/adsp/apps/opus/opus_multistream_decode_object.h" -#include "common/assert.h" - -namespace AudioCore::ADSP::OpusDecoder { - -namespace { -constexpr u32 OpusStreamCountMax = 255; - -bool IsValidStreamCounts(u32 total_stream_count, u32 stereo_stream_count) { - return total_stream_count > 0 && total_stream_count <= OpusStreamCountMax && - static_cast(stereo_stream_count) >= 0 && - stereo_stream_count <= total_stream_count; -} -} // namespace - -u32 OpusMultiStreamDecodeObject::GetWorkBufferSize(u32 total_stream_count, - u32 stereo_stream_count) { - if (IsValidStreamCounts(total_stream_count, stereo_stream_count)) { - return static_cast(sizeof(OpusMultiStreamDecodeObject)) + - opus_multistream_decoder_get_size(total_stream_count, stereo_stream_count); - } - return 0; -} - -OpusMultiStreamDecodeObject& OpusMultiStreamDecodeObject::Initialize(u64 buffer, u64 buffer2) { - auto* new_decoder = reinterpret_cast(buffer); - auto* comparison = reinterpret_cast(buffer2); - - if (new_decoder->magic == DecodeMultiStreamObjectMagic) { - if (!new_decoder->initialized || - (new_decoder->initialized && new_decoder->self == comparison)) { - new_decoder->state_valid = true; - } - } else { - new_decoder->initialized = false; - new_decoder->state_valid = true; - } - return *new_decoder; -} - -s32 OpusMultiStreamDecodeObject::InitializeDecoder(u32 sample_rate, u32 total_stream_count, - u32 channel_count, u32 stereo_stream_count, - u8* mappings) { - if (!state_valid) { - return OPUS_INVALID_STATE; - } - - if (initialized) { - return OPUS_OK; - } - - // See OpusDecodeObject::InitializeDecoder for an explanation of this - decoder = (LibOpusMSDecoder*)(this + 1); - s32 ret = opus_multistream_decoder_init(decoder, sample_rate, channel_count, total_stream_count, - stereo_stream_count, mappings); - if (ret == OPUS_OK) { - magic = DecodeMultiStreamObjectMagic; - initialized = true; - state_valid = true; - self = this; - final_range = 0; - } - return ret; -} - -s32 OpusMultiStreamDecodeObject::Shutdown() { - if (!state_valid) { - return OPUS_INVALID_STATE; - } - - if (initialized) { - magic = 0x0; - initialized = false; - state_valid = false; - self = nullptr; - final_range = 0; - decoder = nullptr; - } - return OPUS_OK; -} - -s32 OpusMultiStreamDecodeObject::ResetDecoder() { - return opus_multistream_decoder_ctl(decoder, OPUS_RESET_STATE); -} - -s32 OpusMultiStreamDecodeObject::Decode(u32& out_sample_count, u64 output_data, - u64 output_data_size, u64 input_data, u64 input_data_size) { - ASSERT(initialized); - out_sample_count = 0; - - if (!state_valid) { - return OPUS_INVALID_STATE; - } - - auto ret_code_or_samples = opus_multistream_decode( - decoder, reinterpret_cast(input_data), static_cast(input_data_size), - reinterpret_cast(output_data), static_cast(output_data_size), 0); - - if (ret_code_or_samples < OPUS_OK) { - return ret_code_or_samples; - } - - out_sample_count = ret_code_or_samples; - return opus_multistream_decoder_ctl(decoder, OPUS_GET_FINAL_RANGE_REQUEST, &final_range); -} - -} // namespace AudioCore::ADSP::OpusDecoder diff --git a/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.h b/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.h deleted file mode 100644 index 93558ded5d..0000000000 --- a/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.h +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include - -#include "common/common_types.h" - -namespace AudioCore::ADSP::OpusDecoder { -using LibOpusMSDecoder = ::OpusMSDecoder; -static constexpr u32 DecodeMultiStreamObjectMagic = 0xDEADBEEF; - -class OpusMultiStreamDecodeObject { -public: - static u32 GetWorkBufferSize(u32 total_stream_count, u32 stereo_stream_count); - static OpusMultiStreamDecodeObject& Initialize(u64 buffer, u64 buffer2); - - s32 InitializeDecoder(u32 sample_rate, u32 total_stream_count, u32 channel_count, - u32 stereo_stream_count, u8* mappings); - s32 Shutdown(); - s32 ResetDecoder(); - s32 Decode(u32& out_sample_count, u64 output_data, u64 output_data_size, u64 input_data, - u64 input_data_size); - u32 GetFinalRange() const noexcept { - return final_range; - } - -private: - u32 magic; - bool initialized; - bool state_valid; - OpusMultiStreamDecodeObject* self; - u32 final_range; - LibOpusMSDecoder* decoder; -}; -static_assert(std::is_trivially_constructible_v); - -} // namespace AudioCore::ADSP::OpusDecoder diff --git a/src/audio_core/adsp/apps/opus/opus_types.h b/src/audio_core/adsp/apps/opus/opus_types.h new file mode 100644 index 0000000000..bacfb30338 --- /dev/null +++ b/src/audio_core/adsp/apps/opus/opus_types.h @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "common/common_types.h" + +namespace AudioCore::ADSP { + +static constexpr u32 DECODE_OBJECT_MAGIC = 0xDEADBEEF; +struct LibOpusDecoder { + u32 magic; + bool initialized; + bool state_valid; + LibOpusDecoder* self; + u32 final_range; + void* decoder; +}; +static_assert(sizeof(LibOpusDecoder) == 32); + +static constexpr u32 DECODE_MULTISTREAM_OBJECT_MAGIC = 0xDEADBEEF; +struct LibOpusMultistreamDecoder { + u32 magic; + bool initialized; + bool state_valid; + LibOpusMultistreamDecoder* self; + u32 final_range; + void* decoder; +}; +static_assert(sizeof(LibOpusMultistreamDecoder) == 32); + +} diff --git a/src/audio_core/adsp/apps/opus/shared_memory.h b/src/audio_core/adsp/apps/opus/shared_memory.h index c696731ed8..45079c6292 100644 --- a/src/audio_core/adsp/apps/opus/shared_memory.h +++ b/src/audio_core/adsp/apps/opus/shared_memory.h @@ -1,9 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 #pragma once -#include "common/common_funcs.h" #include "common/common_types.h" namespace AudioCore::ADSP::OpusDecoder { diff --git a/src/audio_core/opus/hardware_opus.cpp b/src/audio_core/opus/hardware_opus.cpp index 04591c10b6..c07a358168 100644 --- a/src/audio_core/opus/hardware_opus.cpp +++ b/src/audio_core/opus/hardware_opus.cpp @@ -10,39 +10,18 @@ #include "audio_core/audio_core.h" #include "audio_core/opus/hardware_opus.h" #include "core/core.h" +#include "core/hle/result.h" namespace AudioCore::OpusDecoder { + namespace { using namespace Service::Audio; - -static constexpr Result ResultCodeFromLibOpusErrorCode(u64 error_code) { - s32 error{static_cast(error_code)}; - ASSERT(error <= OPUS_OK); - switch (error) { - case OPUS_ALLOC_FAIL: - R_THROW(ResultLibOpusAllocFail); - case OPUS_INVALID_STATE: - R_THROW(ResultLibOpusInvalidState); - case OPUS_UNIMPLEMENTED: - R_THROW(ResultLibOpusUnimplemented); - case OPUS_INVALID_PACKET: - R_THROW(ResultLibOpusInvalidPacket); - case OPUS_INTERNAL_ERROR: - R_THROW(ResultLibOpusInternalError); - case OPUS_BUFFER_TOO_SMALL: - R_THROW(ResultBufferTooSmall); - case OPUS_BAD_ARG: - R_THROW(ResultLibOpusBadArg); - case OPUS_OK: - R_RETURN(ResultSuccess); - } - UNREACHABLE(); -} - } // namespace HardwareOpus::HardwareOpus(Core::System& system_) - : system{system_}, opus_decoder{system.AudioCore().ADSP().OpusDecoder()} { + : system{system_} + , opus_decoder{system.AudioCore().ADSP().OpusDecoder()} +{ opus_decoder.SetSharedMemory(shared_memory); } @@ -112,7 +91,7 @@ Result HardwareOpus::InitializeDecodeObject(u32 sample_rate, u32 channel_count, R_THROW(ResultInvalidOpusDSPReturnCode); } - R_RETURN(ResultCodeFromLibOpusErrorCode(shared_memory.dsp_return_data[0])); + R_RETURN(Result(u32(shared_memory.dsp_return_data[0]))); } Result HardwareOpus::InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count, @@ -140,7 +119,7 @@ Result HardwareOpus::InitializeMultiStreamDecodeObject(u32 sample_rate, u32 chan R_THROW(ResultInvalidOpusDSPReturnCode); } - R_RETURN(ResultCodeFromLibOpusErrorCode(shared_memory.dsp_return_data[0])); + R_RETURN(Result(u32(shared_memory.dsp_return_data[0]))); } Result HardwareOpus::ShutdownDecodeObject(void* buffer, u64 buffer_size) { @@ -154,7 +133,7 @@ Result HardwareOpus::ShutdownDecodeObject(void* buffer, u64 buffer_size) { "Expected Opus shutdown code {}, got {}", ADSP::OpusDecoder::Message::ShutdownDecodeObjectOK, msg); - R_RETURN(ResultCodeFromLibOpusErrorCode(shared_memory.dsp_return_data[0])); + R_RETURN(Result(u32(shared_memory.dsp_return_data[0]))); } Result HardwareOpus::ShutdownMultiStreamDecodeObject(void* buffer, u64 buffer_size) { @@ -169,7 +148,7 @@ Result HardwareOpus::ShutdownMultiStreamDecodeObject(void* buffer, u64 buffer_si "Expected Opus shutdown code {}, got {}", ADSP::OpusDecoder::Message::ShutdownMultiStreamDecodeObjectOK, msg); - R_RETURN(ResultCodeFromLibOpusErrorCode(shared_memory.dsp_return_data[0])); + R_RETURN(Result(u32(shared_memory.dsp_return_data[0]))); } Result HardwareOpus::DecodeInterleaved(u32& out_sample_count, void* output_data, @@ -193,12 +172,12 @@ Result HardwareOpus::DecodeInterleaved(u32& out_sample_count, void* output_data, R_THROW(ResultInvalidOpusDSPReturnCode); } - auto error_code{static_cast(shared_memory.dsp_return_data[0])}; - if (error_code == OPUS_OK) { - out_sample_count = static_cast(shared_memory.dsp_return_data[1]); + auto error_code = s32(shared_memory.dsp_return_data[0]); + if (error_code == ResultSuccess.raw) { + out_sample_count = u32(shared_memory.dsp_return_data[1]); out_time_taken = 1000 * shared_memory.dsp_return_data[2]; } - R_RETURN(ResultCodeFromLibOpusErrorCode(error_code)); + R_RETURN(Result(u32(error_code))); } Result HardwareOpus::DecodeInterleavedForMultiStream(u32& out_sample_count, void* output_data, @@ -207,29 +186,27 @@ Result HardwareOpus::DecodeInterleavedForMultiStream(u32& out_sample_count, void void* buffer, u64& out_time_taken, bool reset) { std::scoped_lock l{mutex}; - shared_memory.host_send_data[0] = (u64)buffer; - shared_memory.host_send_data[1] = (u64)input_data; + shared_memory.host_send_data[0] = u64(buffer); + shared_memory.host_send_data[1] = u64(input_data); shared_memory.host_send_data[2] = input_data_size; - shared_memory.host_send_data[3] = (u64)output_data; + shared_memory.host_send_data[3] = u64(output_data); shared_memory.host_send_data[4] = output_data_size; shared_memory.host_send_data[5] = 0; shared_memory.host_send_data[6] = reset; - opus_decoder.Send(ADSP::Direction::DSP, - ADSP::OpusDecoder::Message::DecodeInterleavedForMultiStream); + opus_decoder.Send(ADSP::Direction::DSP, ADSP::OpusDecoder::Message::DecodeInterleavedForMultiStream); auto msg = opus_decoder.Receive(ADSP::Direction::Host); if (msg != ADSP::OpusDecoder::Message::DecodeInterleavedForMultiStreamOK) { - LOG_ERROR(Service_Audio, "OpusDecoder returned invalid message. Expected {} got {}", - ADSP::OpusDecoder::Message::DecodeInterleavedForMultiStreamOK, msg); + LOG_ERROR(Service_Audio, "OpusDecoder returned invalid message. Expected {} got {}", ADSP::OpusDecoder::Message::DecodeInterleavedForMultiStreamOK, msg); R_THROW(ResultInvalidOpusDSPReturnCode); } - auto error_code{static_cast(shared_memory.dsp_return_data[0])}; - if (error_code == OPUS_OK) { + auto const error_code = shared_memory.dsp_return_data[0]; + if (error_code == ResultSuccess.raw) { out_sample_count = static_cast(shared_memory.dsp_return_data[1]); out_time_taken = 1000 * shared_memory.dsp_return_data[2]; } - R_RETURN(ResultCodeFromLibOpusErrorCode(error_code)); + R_RETURN(Result(u32(shared_memory.dsp_return_data[0]))); } Result HardwareOpus::MapMemory(void* buffer, u64 buffer_size) { @@ -240,8 +217,7 @@ Result HardwareOpus::MapMemory(void* buffer, u64 buffer_size) { opus_decoder.Send(ADSP::Direction::DSP, ADSP::OpusDecoder::Message::MapMemory); auto msg = opus_decoder.Receive(ADSP::Direction::Host); if (msg != ADSP::OpusDecoder::Message::MapMemoryOK) { - LOG_ERROR(Service_Audio, "OpusDecoder returned invalid message. Expected {} got {}", - ADSP::OpusDecoder::Message::MapMemoryOK, msg); + LOG_ERROR(Service_Audio, "OpusDecoder returned invalid message. Expected {} got {}", ADSP::OpusDecoder::Message::MapMemoryOK, msg); R_THROW(ResultInvalidOpusDSPReturnCode); } R_SUCCEED(); @@ -255,8 +231,7 @@ Result HardwareOpus::UnmapMemory(void* buffer, u64 buffer_size) { opus_decoder.Send(ADSP::Direction::DSP, ADSP::OpusDecoder::Message::UnmapMemory); auto msg = opus_decoder.Receive(ADSP::Direction::Host); if (msg != ADSP::OpusDecoder::Message::UnmapMemoryOK) { - LOG_ERROR(Service_Audio, "OpusDecoder returned invalid message. Expected {} got {}", - ADSP::OpusDecoder::Message::UnmapMemoryOK, msg); + LOG_ERROR(Service_Audio, "OpusDecoder returned invalid message. Expected {} got {}", ADSP::OpusDecoder::Message::UnmapMemoryOK, msg); R_THROW(ResultInvalidOpusDSPReturnCode); } R_SUCCEED(); diff --git a/src/audio_core/opus/hardware_opus.h b/src/audio_core/opus/hardware_opus.h index b6c7fbe6c8..26c96e00c0 100644 --- a/src/audio_core/opus/hardware_opus.h +++ b/src/audio_core/opus/hardware_opus.h @@ -8,8 +8,6 @@ #include #include -#include - #include "audio_core/adsp/apps/opus/opus_decoder.h" #include "audio_core/adsp/apps/opus/shared_memory.h" #include "audio_core/adsp/mailbox.h" diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 508ace3501..e72fd791b9 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -1199,7 +1199,6 @@ else() endif() endif() -target_include_directories(core PRIVATE ${OPUS_INCLUDE_DIRS}) target_link_libraries(core PUBLIC common PRIVATE audio_core hid_core network video_core nx_tzdb tz) if (BOOST_NO_HEADERS) diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 64d14ab2a6..06b77a2a8f 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -414,9 +414,7 @@ endif() if (YUZU_USE_EXTERNAL_FFMPEG) add_dependencies(video_core ffmpeg-build) endif() - target_include_directories(video_core PUBLIC ${FFmpeg_INCLUDE_DIR}) - target_link_libraries(video_core PRIVATE ${FFmpeg_LIBRARIES}) target_link_options(video_core PRIVATE ${FFmpeg_LDFLAGS}) From 5d150cac5c6624fa6a0e94266846b75d91a6a5d0 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Sun, 13 Sep 2026 02:13:06 +0200 Subject: [PATCH 032/128] [dynarmic, am, android, ns] Fixes the latest qlaunch regressions on Android and adds cmd23 for launching games on FW 23 (#4407) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- [dynarmic] use TST + B.NE instead of TBNZ for marked bit Fixes qlaunch and ac3 crashes. [am] Bruno FIX OVERLAY 2.0 Fixes incorrect load display when the overlay applet is enabled in AC3. [android] handle empty programId in Game.settingsName The ReShade post-processing change started calling SettingsFile.loadCustomConfig() on every drawer open through withPerGameConfig(), which exposed a pre-existing crash in Game.settingsName when programId was an empty string. [ns] use GetApplicationControlData3 for cmd23 in IReadOnlyApplicationControlDataInterface We can use this method for now for launching games on fw23, while we don't have all the information. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4407 Reviewed-by: lizzie Reviewed-by: CamilleLaVey --- .../main/java/org/yuzu/yuzu_emu/model/Game.kt | 6 ++--- .../hle/service/am/display_layer_manager.cpp | 22 ++++++++++++------- ...nly_application_control_data_interface.cpp | 1 + .../backend/arm64/emit_arm64_memory.cpp | 4 ++-- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt index 799708dfa7..6717894c93 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt @@ -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-FileCopyrightText: 2023 yuzu Emulator Project @@ -37,7 +37,7 @@ class Game( val settingsName: String get() { - val programIdLong = programId.toLong() + val programIdLong = programId.toLongOrNull() ?: 0L return if (programIdLong == 0L) { FileUtil.getFilename(Uri.parse(path)) } else { @@ -47,7 +47,7 @@ class Game( val programIdHex: String get() { - val programIdLong = programId.toLong() + val programIdLong = programId.toLongOrNull() ?: 0L return if (programIdLong == 0L) { "0" } else { diff --git a/src/core/hle/service/am/display_layer_manager.cpp b/src/core/hle/service/am/display_layer_manager.cpp index 494e8a132b..cd9e26e899 100644 --- a/src/core/hle/service/am/display_layer_manager.cpp +++ b/src/core/hle/service/am/display_layer_manager.cpp @@ -73,16 +73,20 @@ Result DisplayLayerManager::CreateManagedDisplayLayer(u64* out_layer_id) { R_TRY(m_manager_display_service->CreateManagedLayer( out_layer_id, 0, display_id, Service::AppletResourceUserId{m_process->GetProcessId()})); + m_manager_display_service->SetLayerVisibility(m_visible, *out_layer_id); + (void)m_display_service->GetContainer()->SetLayerStackMask(*out_layer_id, + this->GetLayerStackMask()); + if (m_applet_id != AppletId::Application) { (void)m_manager_display_service->SetLayerBlending(m_blending_enabled, *out_layer_id); if (m_applet_id == AppletId::OverlayDisplay) { - (void)m_manager_display_service->SetLayerZIndex(-1, *out_layer_id); - (void)m_display_service->GetContainer()->SetLayerIsOverlay(*out_layer_id, true); + (void)m_manager_display_service->SetLayerZIndex(Overlay, *out_layer_id); } else { - (void)m_manager_display_service->SetLayerZIndex(1, *out_layer_id); + (void)m_manager_display_service->SetLayerZIndex(Foreground, *out_layer_id); } } - (void)m_display_service->GetContainer()->SetLayerZIndex(*out_layer_id, true); + + m_display_service->GetContainer()->SetLayerZIndex(*out_layer_id, true); m_managed_display_layers.emplace(*out_layer_id); R_SUCCEED(); @@ -122,14 +126,16 @@ Result DisplayLayerManager::IsSystemBufferSharingEnabled() { // Ensure the overlay layer is visible m_manager_display_service->SetLayerVisibility(m_visible, m_system_shared_layer_id); - m_manager_display_service->SetLayerBlending(m_blending_enabled, m_system_shared_layer_id); - s32 initial_z = 1; - (void)m_display_service->GetContainer()->SetLayerZIndex(m_system_shared_layer_id, true); + (void)m_manager_display_service->SetLayerBlending(m_blending_enabled, m_system_shared_layer_id); + s32 initial_z = Foreground; if (m_applet_id == AppletId::OverlayDisplay) { - initial_z = -1; + initial_z = Overlay; + (void)m_manager_display_service->SetLayerZIndex(initial_z, m_system_shared_layer_id); (void)m_display_service->GetContainer()->SetLayerIsOverlay(m_system_shared_layer_id, true); } m_manager_display_service->SetLayerZIndex(initial_z, m_system_shared_layer_id); + m_display_service->GetContainer()->SetLayerZIndex(m_system_shared_layer_id, true); + m_managed_display_layers.emplace(m_system_shared_layer_id); R_SUCCEED(); } diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp index c7606a83bf..fb3b627585 100644 --- a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp +++ b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp @@ -142,6 +142,7 @@ IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterfa {10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"}, {13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"}, {19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, + {23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, }; // clang-format on diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp index 1f758a190a..170fcf9613 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp @@ -274,8 +274,8 @@ std::pair InlinePageTableEmitVAddrLookup(oaknut::Cod code.LDR(Xscratch0, Xpagetable, Xscratch0); if (ctx.conf.page_table_marked_bit) { - // check for marked bit - code.TBNZ(Xscratch0, *ctx.conf.page_table_marked_bit, *fallback); + code.TST(Xscratch0, 1ULL << *ctx.conf.page_table_marked_bit); + code.B(NE, *fallback); } if (ctx.conf.page_table_pointer_mask != 0) { From 9b649444803bc95423035eba335a1e11c1871793 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 14 Sep 2026 00:39:07 +0200 Subject: [PATCH 033/128] [video_core/control] Fix SIGBUS due to uninit channel_state (#4406) Some homebrew don't properly initialize the GPU but seemingly try to use it, this is meant to be benign, yet triggers a SIGBUS due to garbage data being on the pointer after ctor(), so the fix is to make it nullptr on construction. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4406 Reviewed-by: Maufeat Reviewed-by: MaranBr --- src/video_core/control/channel_state_cache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/control/channel_state_cache.h b/src/video_core/control/channel_state_cache.h index 6d70e9be55..cb7cc891f5 100644 --- a/src/video_core/control/channel_state_cache.h +++ b/src/video_core/control/channel_state_cache.h @@ -78,7 +78,7 @@ public: protected: static constexpr size_t UNSET_CHANNEL{(std::numeric_limits::max)()}; - P* channel_state; + P* channel_state = nullptr; size_t current_channel_id{UNSET_CHANNEL}; size_t current_address_space{}; Tegra::Engines::Maxwell3D* maxwell3d{}; From 93318ef697d386e9842cbb5887d5ab9b4e700a1c Mon Sep 17 00:00:00 2001 From: xbzk Date: Mon, 14 Sep 2026 02:13:49 +0200 Subject: [PATCH 034/128] [audio] persistent device volume control (#4416) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- So, upon investigating AC3 not booting when fw 20+ and overlay applet disabled, i found the leads: "LibAppletOff" and "AudioTvOutput". By further decoding instructions i've found a guest assert comparing device volume with hdmi volume. Since we implemented no proper master volume when no streams are created the assert were failing causing guest to panic (why?????????) Anyway. ac3 now works fw20+ and no overlay applet.. Maybe other games too. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4416 Reviewed-by: lizzie Reviewed-by: MaranBr --- src/audio_core/sink/cubeb_sink.cpp | 8 +++----- src/audio_core/sink/null_sink.h | 13 +++++++++++-- src/audio_core/sink/sdl3_sink.cpp | 8 +++----- src/audio_core/sink/sink.h | 5 +++++ 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/audio_core/sink/cubeb_sink.cpp b/src/audio_core/sink/cubeb_sink.cpp index ca42810345..c8c4cb2253 100644 --- a/src/audio_core/sink/cubeb_sink.cpp +++ b/src/audio_core/sink/cubeb_sink.cpp @@ -261,6 +261,7 @@ SinkStream* CubebSink::AcquireSinkStream(Core::System& system, u32 system_channe system_channels = system_channels_; SinkStreamPtr& stream = sink_streams.emplace_back(std::make_unique( ctx, device_channels, system_channels, output_device, input_device, name, type, system)); + stream->SetDeviceVolume(device_volume); return stream.get(); } @@ -280,14 +281,11 @@ void CubebSink::CloseStreams() { } f32 CubebSink::GetDeviceVolume() const { - if (sink_streams.empty()) { - return 1.0f; - } - - return sink_streams[0]->GetDeviceVolume(); + return device_volume; } void CubebSink::SetDeviceVolume(f32 volume) { + device_volume = volume; for (auto& stream : sink_streams) { stream->SetDeviceVolume(volume); } diff --git a/src/audio_core/sink/null_sink.h b/src/audio_core/sink/null_sink.h index b6b43c93e1..556456c206 100644 --- a/src/audio_core/sink/null_sink.h +++ b/src/audio_core/sink/null_sink.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -38,6 +41,7 @@ public: StreamType type) override { if (null_sink == nullptr) { null_sink = std::make_unique(system, type); + null_sink->SetDeviceVolume(device_volume); } return null_sink.get(); } @@ -45,9 +49,14 @@ public: void CloseStream(SinkStream*) override {} void CloseStreams() override {} f32 GetDeviceVolume() const override { - return 1.0f; + return device_volume; + } + void SetDeviceVolume(f32 volume) override { + device_volume = volume; + if (null_sink != nullptr) { + null_sink->SetDeviceVolume(volume); + } } - void SetDeviceVolume(f32 volume) override {} void SetSystemVolume(f32 volume) override {} private: diff --git a/src/audio_core/sink/sdl3_sink.cpp b/src/audio_core/sink/sdl3_sink.cpp index 69558eabec..02eee9bec2 100644 --- a/src/audio_core/sink/sdl3_sink.cpp +++ b/src/audio_core/sink/sdl3_sink.cpp @@ -246,6 +246,7 @@ SinkStream* SDLSink::AcquireSinkStream(Core::System& system, u32 system_channels system_channels = system_channels_; SinkStreamPtr& stream = sink_streams.emplace_back(std::make_unique( device_channels, system_channels, output_device, input_device, type, system)); + stream->SetDeviceVolume(device_volume); return stream.get(); } @@ -264,14 +265,11 @@ void SDLSink::CloseStreams() { } f32 SDLSink::GetDeviceVolume() const { - if (sink_streams.empty()) { - return 1.0f; - } - - return sink_streams[0]->GetDeviceVolume(); + return device_volume; } void SDLSink::SetDeviceVolume(f32 volume) { + device_volume = volume; for (auto& stream : sink_streams) { stream->SetDeviceVolume(volume); } diff --git a/src/audio_core/sink/sink.h b/src/audio_core/sink/sink.h index e22e8c3e56..2b7069e1a3 100644 --- a/src/audio_core/sink/sink.h +++ b/src/audio_core/sink/sink.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -96,6 +99,8 @@ public: } protected: + /// Master volume, persists stream lifetimes + f32 device_volume{1.0f}; /// Number of device channels supported by the hardware u32 device_channels{2}; /// Number of channels the game is sending From 099547b3f4578bf1fc0b39988aefbe2d54b540cc Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Mon, 14 Sep 2026 02:53:30 +0200 Subject: [PATCH 035/128] [android] Add LSFG UI to quick settings (#4393) Adds UI of LSFG to QS UI, very self-explanatory. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4393 Reviewed-by: lizzie Reviewed-by: MaranBr --- .../yuzu/yuzu_emu/dialogs/QuickSettings.kt | 162 ++++++++++++++++++ .../features/settings/model/BooleanSetting.kt | 2 - .../settings/model/view/SettingsItem.kt | 18 +- .../settings/ui/SettingsFragmentPresenter.kt | 2 - .../yuzu_emu/fragments/EmulationFragment.kt | 6 + src/android/app/src/main/jni/native.cpp | 12 +- .../main/res/color/frame_gen_cell_text.xml | 5 + .../drawable/frame_gen_cell_background.xml | 31 ++++ .../layout/item_quick_settings_frame_gen.xml | 111 ++++++++++++ .../item_quick_settings_frame_gen_cell.xml | 13 ++ .../app/src/main/res/values-ar/strings.xml | 6 - .../app/src/main/res/values-de/strings.xml | 2 - .../app/src/main/res/values-es/strings.xml | 3 - .../app/src/main/res/values-ru/strings.xml | 4 - .../src/main/res/values-zh-rCN/strings.xml | 6 - .../src/main/res/values-zh-rTW/strings.xml | 6 - .../app/src/main/res/values/arrays.xml | 10 +- .../app/src/main/res/values/strings.xml | 17 +- src/common/settings.h | 5 +- src/video_core/frame_gen/lossless_dll.cpp | 59 ++----- src/video_core/frame_gen/lossless_dll.h | 10 +- .../renderer_vulkan/present/frame_gen.cpp | 15 +- .../renderer_vulkan/present/lsfg_shaders.cpp | 10 +- .../renderer_vulkan/vk_blit_screen.cpp | 18 +- .../renderer_vulkan/vk_present_manager.cpp | 19 +- .../renderer_vulkan/vk_present_manager.h | 5 +- 26 files changed, 410 insertions(+), 147 deletions(-) create mode 100644 src/android/app/src/main/res/color/frame_gen_cell_text.xml create mode 100644 src/android/app/src/main/res/drawable/frame_gen_cell_background.xml create mode 100644 src/android/app/src/main/res/layout/item_quick_settings_frame_gen.xml create mode 100644 src/android/app/src/main/res/layout/item_quick_settings_frame_gen_cell.xml diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt index 1136923fd0..c2ef683cfd 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/dialogs/QuickSettings.kt @@ -9,6 +9,7 @@ import android.view.LayoutInflater import android.view.MotionEvent import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import android.widget.RadioGroup import android.widget.TextView import androidx.drawerlayout.widget.DrawerLayout @@ -673,6 +674,167 @@ class QuickSettings(val emulationFragment: EmulationFragment) { } } + private fun addFrameGenCell(inflater: LayoutInflater, row: ViewGroup): TextView { + val cell = inflater.inflate(R.layout.item_quick_settings_frame_gen_cell, row, false) + as TextView + row.addView(cell) + return cell + } + + fun addFrameGen(container: ViewGroup) { + val inflater = LayoutInflater.from(emulationFragment.requireContext()) + val itemView = inflater.inflate(R.layout.item_quick_settings_frame_gen, container, false) + + val multiplierRow = itemView.findViewById(R.id.frame_gen_multipliers) + val targetRow = itemView.findViewById(R.id.frame_gen_targets) + val targetSection = itemView.findViewById(R.id.frame_gen_target_section) + val flowRow = itemView.findViewById(R.id.frame_gen_flow) + val flowSection = itemView.findViewById(R.id.frame_gen_flow_section) + + val multiplierNames = + emulationFragment.resources.getStringArray(R.array.frameGenMultiplierNames) + val multiplierValues = + emulationFragment.resources.getIntArray(R.array.frameGenMultiplierValues) + val targetValues = + emulationFragment.resources.getIntArray(R.array.frameGenTargetRateValues) + val flowValues = + emulationFragment.resources.getIntArray(R.array.frameGenFlowScaleValues) + + val columns = maxOf( + multiplierValues.size + 1, + targetValues.size, + flowValues.size + 1 + ).toFloat() + multiplierRow.weightSum = columns + targetRow.weightSum = columns + flowRow.weightSum = columns + + val powerCell = addFrameGenCell(inflater, multiplierRow) + + val multiplierCells = mutableListOf() + for (name in multiplierNames) { + val cell = addFrameGenCell(inflater, multiplierRow) + cell.text = name + multiplierCells.add(cell) + } + + val targetCells = mutableListOf() + for (value in targetValues) { + val cell = addFrameGenCell(inflater, targetRow) + if (value == 0) { + cell.setText(R.string.frame_gen_fixed) + } else { + cell.text = value.toString() + } + targetCells.add(cell) + } + + val autoCell = addFrameGenCell(inflater, flowRow) + autoCell.setText(R.string.frame_gen_flow_auto) + + val flowCells = mutableListOf() + for (value in flowValues) { + val cell = addFrameGenCell(inflater, flowRow) + cell.text = "$value%" + flowCells.add(cell) + } + + val inactiveAlpha = 0.38f + + fun refresh() { + val enabled = BooleanSetting.RENDERER_FRAME_GEN.getBoolean(needsGlobal = false) + val multiplier = IntSetting.RENDERER_FRAME_GEN_MULTIPLIER.getInt(needsGlobal = false) + val target = IntSetting.RENDERER_FRAME_GEN_TARGET_RATE.getInt(needsGlobal = false) + val fixed = target == 0 + val flowAuto = + BooleanSetting.RENDERER_FRAME_GEN_FLOW_SCALE_AUTO.getBoolean(needsGlobal = false) + val flowScale = IntSetting.RENDERER_FRAME_GEN_FLOW_SCALE.getInt(needsGlobal = false) + + var powerLabel = R.string.frame_gen_off + var rowAlpha = inactiveAlpha + if (enabled) { + powerLabel = R.string.frame_gen_on + rowAlpha = 1.0f + } + + var multiplierAlpha = inactiveAlpha + if (enabled && fixed) { + multiplierAlpha = 1.0f + } + + powerCell.setText(powerLabel) + powerCell.isSelected = enabled + + multiplierCells.forEachIndexed { index, cell -> + cell.isEnabled = enabled + cell.isSelected = enabled && fixed && multiplierValues[index] == multiplier + cell.alpha = multiplierAlpha + } + + targetSection.alpha = rowAlpha + targetCells.forEachIndexed { index, cell -> + cell.isEnabled = enabled + cell.isSelected = enabled && targetValues[index] == target + } + + flowSection.alpha = rowAlpha + autoCell.isEnabled = enabled + autoCell.isSelected = enabled && flowAuto + + flowCells.forEachIndexed { index, cell -> + cell.isEnabled = enabled + cell.isSelected = enabled && !flowAuto && flowValues[index] == flowScale + } + } + + powerCell.setOnClickListener { + if (BooleanSetting.RENDERER_FRAME_GEN.getBoolean(needsGlobal = false)) { + BooleanSetting.RENDERER_FRAME_GEN.setBoolean(false) + } else { + IntSetting.RENDERER_FRAME_GEN_MULTIPLIER.setInt(multiplierValues.first()) + IntSetting.RENDERER_FRAME_GEN_TARGET_RATE.setInt(0) + BooleanSetting.RENDERER_FRAME_GEN.setBoolean(true) + } + saveSettings() + refresh() + } + + multiplierCells.forEachIndexed { index, cell -> + cell.setOnClickListener { + IntSetting.RENDERER_FRAME_GEN_MULTIPLIER.setInt(multiplierValues[index]) + IntSetting.RENDERER_FRAME_GEN_TARGET_RATE.setInt(0) + saveSettings() + refresh() + } + } + + targetCells.forEachIndexed { index, cell -> + cell.setOnClickListener { + IntSetting.RENDERER_FRAME_GEN_TARGET_RATE.setInt(targetValues[index]) + saveSettings() + refresh() + } + } + + autoCell.setOnClickListener { + BooleanSetting.RENDERER_FRAME_GEN_FLOW_SCALE_AUTO.setBoolean(true) + saveSettings() + refresh() + } + + flowCells.forEachIndexed { index, cell -> + cell.setOnClickListener { + IntSetting.RENDERER_FRAME_GEN_FLOW_SCALE.setInt(flowValues[index]) + BooleanSetting.RENDERER_FRAME_GEN_FLOW_SCALE_AUTO.setBoolean(false) + saveSettings() + refresh() + } + } + + refresh() + container.addView(itemView) + } + fun addDivider(container: ViewGroup) { val inflater = LayoutInflater.from(emulationFragment.requireContext()) val dividerView = inflater.inflate(R.layout.item_quick_settings_divider, container, false) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index 5eaaaaecac..ca3309245e 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -38,9 +38,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { RENDERER_VERTEX_INPUT_DYNAMIC_STATE("vertex_input_dynamic_state"), RENDERER_SAMPLE_SHADING("sample_shading"), RENDERER_FRAME_GEN("frame_gen"), - RENDERER_FRAME_GEN_FP16("frame_gen_fp16"), RENDERER_FRAME_GEN_FLOW_SCALE_AUTO("frame_gen_flow_scale_auto"), - RENDERER_FRAME_GEN_DUMP_FLOW("frame_gen_dump_flow"), GPU_UNSWIZZLE_ENABLED("gpu_unswizzle_enabled"), PICTURE_IN_PICTURE("picture_in_picture"), USE_CUSTOM_RTC("custom_rtc_enabled"), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index ab2ac7eb42..3f38831a17 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -123,9 +123,7 @@ abstract class SettingsItem( IntSetting.RENDERER_FRAME_GEN_TARGET_RATE.key, IntSetting.RENDERER_FRAME_GEN_QUEUE_TARGET.key, BooleanSetting.RENDERER_FRAME_GEN_FLOW_SCALE_AUTO.key, - IntSetting.RENDERER_FRAME_GEN_FLOW_SCALE.key, - BooleanSetting.RENDERER_FRAME_GEN_FP16.key, - BooleanSetting.RENDERER_FRAME_GEN_DUMP_FLOW.key + IntSetting.RENDERER_FRAME_GEN_FLOW_SCALE.key ) const val TYPE_HEADER = 0 @@ -709,20 +707,6 @@ abstract class SettingsItem( units = "%" ) ) - put( - SwitchSetting( - BooleanSetting.RENDERER_FRAME_GEN_FP16, - titleId = R.string.frame_gen_fp16, - descriptionId = R.string.frame_gen_fp16_description - ) - ) - put( - SwitchSetting( - BooleanSetting.RENDERER_FRAME_GEN_DUMP_FLOW, - titleId = R.string.frame_gen_dump_flow, - descriptionId = R.string.frame_gen_dump_flow_description - ) - ) put( SingleChoiceSetting( IntSetting.RENDERER_SCREEN_LAYOUT, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 89e0084df0..ca282ba159 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -124,7 +124,6 @@ class SettingsFragmentPresenter( ) { add(IntSetting.RENDERER_FRAME_GEN_FLOW_SCALE.key) } - add(BooleanSetting.RENDERER_FRAME_GEN_FP16.key) } } @@ -1553,7 +1552,6 @@ class SettingsFragmentPresenter( add(BooleanSetting.DUMP_GUEST_SHADERS.key) add(BooleanSetting.GPU_LOG_SHADER_DUMPS.key) add(BooleanSetting.DUMP_MACROS.key) - add(BooleanSetting.RENDERER_FRAME_GEN_DUMP_FLOW.key) add(BooleanSetting.GPU_LOG_MEMORY_TRACKING.key) add(BooleanSetting.GPU_LOG_DRIVER_DEBUG.key) add(IntSetting.GPU_LOG_RING_BUFFER_SIZE.key) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt index 3f1f3da2ba..3323b3cf9a 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt @@ -92,6 +92,7 @@ import org.yuzu.yuzu_emu.utils.GameIconUtils import org.yuzu.yuzu_emu.utils.GpuDriverHelper import org.yuzu.yuzu_emu.utils.InputHandler import org.yuzu.yuzu_emu.utils.Log +import org.yuzu.yuzu_emu.utils.LosslessScalingHelper import org.yuzu.yuzu_emu.utils.NativeConfig import org.yuzu.yuzu_emu.utils.NativeFreedrenoConfig import org.yuzu.yuzu_emu.utils.NativePostProcessing @@ -1188,6 +1189,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { quickSettings.addDivider(container) + if (LosslessScalingHelper.isInstalled() && LosslessScalingHelper.isSupportedByGpu()) { + quickSettings.addFrameGen(container) + quickSettings.addDivider(container) + } + quickSettings.addIntSetting( R.string.renderer_accuracy, container, diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 423edc2c1b..746b00ad11 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -1168,7 +1168,7 @@ VkPhysicalDeviceProperties GetVulkanDeviceProperties() { return physical_device.GetProperties(); } -bool GetVulkanMemoryModelSupport() { +bool GetFrameGenerationSupport() { Common::DynamicLibrary library; if (!library.Open("libvulkan.so")) { return false; @@ -1183,9 +1183,13 @@ bool GetVulkanMemoryModelSupport() { const Vulkan::vk::PhysicalDevice physical_device(physical_devices[0], dld); + VkPhysicalDeviceShaderFloat16Int8Features float16_int8{ + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, + .pNext = nullptr, + }; VkPhysicalDeviceVulkanMemoryModelFeatures memory_model{ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, - .pNext = nullptr, + .pNext = &float16_int8, }; VkPhysicalDeviceFeatures2 features{ .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, @@ -1193,7 +1197,7 @@ bool GetVulkanMemoryModelSupport() { }; physical_device.GetFeatures2(features); - return memory_model.vulkanMemoryModel == VK_TRUE; + return memory_model.vulkanMemoryModel == VK_TRUE && float16_int8.shaderFloat16 == VK_TRUE; } } // namespace @@ -1272,7 +1276,7 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getVulkanApiVersion(JNIEnv* env, j jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_supportsFrameGeneration(JNIEnv* env, jobject jobj) { try { - return static_cast(GetVulkanMemoryModelSupport()); + return static_cast(GetFrameGenerationSupport()); } catch (...) { return static_cast(false); } diff --git a/src/android/app/src/main/res/color/frame_gen_cell_text.xml b/src/android/app/src/main/res/color/frame_gen_cell_text.xml new file mode 100644 index 0000000000..6e671681bf --- /dev/null +++ b/src/android/app/src/main/res/color/frame_gen_cell_text.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/android/app/src/main/res/drawable/frame_gen_cell_background.xml b/src/android/app/src/main/res/drawable/frame_gen_cell_background.xml new file mode 100644 index 0000000000..6f76a37718 --- /dev/null +++ b/src/android/app/src/main/res/drawable/frame_gen_cell_background.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/layout/item_quick_settings_frame_gen.xml b/src/android/app/src/main/res/layout/item_quick_settings_frame_gen.xml new file mode 100644 index 0000000000..e5f8baa3d3 --- /dev/null +++ b/src/android/app/src/main/res/layout/item_quick_settings_frame_gen.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/res/layout/item_quick_settings_frame_gen_cell.xml b/src/android/app/src/main/res/layout/item_quick_settings_frame_gen_cell.xml new file mode 100644 index 0000000000..0d4d0af3a8 --- /dev/null +++ b/src/android/app/src/main/res/layout/item_quick_settings_frame_gen_cell.xml @@ -0,0 +1,13 @@ + + diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index a3d7b2b515..9895ec011c 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -305,8 +305,6 @@ 60 إطارًا في الثانية 90 إطارًا في الثانية 120 إطارًا في الثانية - 144 إطارًا في الثانية - 165 إطارًا في الثانية هدف قائمة انتظار الإطارات كم عدد الإطارات المكتملة التي قد تنتظر قبل عرضها؟ تعمل قوائم الانتظار الأكبر حجمًا على امتصاص الارتفاعات المفاجئة في حمل وحدة معالجة الرسومات على حساب زمن انتقال الإدخال. أقل زمن انتقال (بدون تخزين مؤقت) @@ -316,10 +314,6 @@ قم بتقدير الحركة بناءً على الدقة التي تعرضها اللعبة فعليًّا، بدلاً من الإخراج الذي تم رفع دقته. ولا يؤثر ذلك على الدقة بأي شكل، لأن رفع الدقة لا يضيف أي تفاصيل تتعلق بالحركة. دقة تقدير الحركة دقة مسار التدفق البصري، كجزء من الناتج. ويُعد خفض هذه القيمة أرخص طريقة لاستعادة الأداء. - مُظلِّلات نصف الدقة - استخدم نسخة التظليل 16 بت. يتم التراجع تلقائيًا إلى الخيار البديل في حالة عدم توفرها في برنامج التشغيل أو الملف. - إفراغ الإطار الذي تم إنشاؤه - قم بكتابة مستويات MIP للتدفق البصري والإطار المُستكمل إلى مجلد lossless/debug مرة واحدة، لغرض استكشاف الأخطاء وإصلاحها توليد الإطار غير متاح لا يدعم برنامج تشغيل وحدة معالجة الرسومات هذا نموذج ذاكرة Vulkan، الذي تتطلبه برامج التظليل الخاصة بـ«Lossless Scaling». اختياري. قم بتوفير ملف Lossless.dll الخاص بك لتمكين إنشاء الإطارات لاحقًا diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index fe190325f6..42a428143a 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -304,8 +304,6 @@ 60 FPS 90 FPS 120 FPS - 144 FPS - 165 FPS Ausbalanciert (1 Bild) Flüssigste (2 Bilder) Frame-Generation nicht verfügbar diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index 460ea1f0da..10031b7441 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -301,12 +301,9 @@ 60 FPS 90 FPS 120 FPS - 144 FPS - 165 FPS Latencia más baja (Sin búfer) Equilibrado (1 fotograma) Más suave (2 fotogramas) - Sombreadores de media precisión Generación de fotogramas no disponbile Instalar Lossless.dll Seleccionar una copia diferente de Lossless.dll diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 630f61ffa4..9a3c97de9d 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -308,10 +308,6 @@ Оценивать движение в разрешении, которое игра действительно рендерит, вместо масштабированного вывода. Ничего не стоит в точности, так как масштабирование не добавляет деталей движения. Разрешение оценки движения Разрешение прохода оптического потока в долях от выходного разрешения. Его понижение — самый дешёвый способ вернуть производительность. - Шейдеры половинной точности - Использовать 16-битную версию шейдеров. Автоматически переключается на обычную, если драйвер или файл не поддерживают её. - Сохранить сгенерированный кадр - Однократно записать уровни мип-карт оптического потока и интерполированный кадр в папку lossless/debug для диагностики. Генерация кадров недоступна Драйвер ГПУ не поддерживает модель памяти Vulkan, требуемую шейдерами Lossless Scaling. Опционально. Укажите свой Lossless.dll для включения генерации кадров позже. diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index 930058b42d..03b730f1ed 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -305,8 +305,6 @@ 60 FPS 90 FPS 120 FPS - 144 FPS - 165 FPS 帧队列目标 在显示之前有多少已完成渲染的帧正在等待。较大的队列可以缓解 GPU 突发的压力,但会增加输入延迟。 最低延迟 (无缓冲) @@ -316,10 +314,6 @@ 在游戏实际渲染的分辨率下估算运动,而不是在放大后的输出上。不会影响精确性,因为放大并不会增加运动细节。 运动预估分辨率 光流通道的分辨率,以输出的比例表示。降低它是提升性能最经济的做法。 - 半精度着色器 - 使用 16 位着色器变体。如果驱动或文件不支持会自动回退。 - 转储已生成的帧 - 为了排查问题,把光流 mip 级别和插值帧写入 lossless/debug 文件夹一次 帧生成不可用 这个 GPU 驱动不支持无损缩放着色器所需的 Vulkan 内存模型。 作为可选项。请提供您自己的 Lossless.dll 以便在之后可以启用帧生成。 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 28d0e93b4e..63eac94759 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -305,8 +305,6 @@ 60 FPS 90 FPS 120 FPS - 144 FPS - 165 FPS 影格佇列目標 最多允許多少個已完成的影格在顯示器前等待,較大的佇列可以吸收 GPU 突發負載,但會增加輸入延遲 最低延遲(無緩衝) @@ -316,10 +314,6 @@ 以遊戲實際渲染的解析度而非升頻後的輸出進行運動預測。由於升頻後不會增加任何動態細節,因此不會影響準確度 運動預測解析度 光流處理的解析度,以輸出解析度的比例表示。降低此設定值是減少效能負載最有效的方法 - 半準確著色器 - 使用16位元著色器。如果驅動程式或著色器檔案不支援則會自動切換成其它版本 - 傾印生成的著色器 - 將光流的 MIP 層級與補間影格寫入 Eden 資料夾中的 lossless\debug 資料夾以便進行疑難排解 無法使用影格生成 Lossless Scaling 的著色器需要 Vulkan 記憶體模型,所選的驅動程式不支援該功能 可選擇安裝自己擁有的 Lossless.dll 以在之後啟用影格生成功能 diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 931cf2bfa7..b3aed5758c 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -174,8 +174,6 @@ @string/frame_gen_target_rate_60 @string/frame_gen_target_rate_90 @string/frame_gen_target_rate_120 - @string/frame_gen_target_rate_144 - @string/frame_gen_target_rate_165 @@ -183,8 +181,12 @@ 60 90 120 - 144 - 165 + + + + 50 + 75 + 100 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index ca7263ead7..e712ec4338 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -331,8 +331,13 @@ 60 FPS 90 FPS 120 FPS - 144 FPS - 165 FPS + On + Off + Fixed + Auto + Turn frame generation on or off and choose the frame multiplier. + Generate frames up to a target frame rate. The multiplier adjusts on its own. + Resolution used to estimate motion between frames. Lower values save GPU time. Frame queue target How many finished frames may wait ahead of the display. Larger queues absorb GPU spikes at the cost of input latency. Lowest latency (Unbuffered) @@ -342,19 +347,15 @@ Estimate motion at the resolution the game actually renders instead of the upscaled output. Costs nothing in accuracy, since upscaling adds no motion detail. Motion estimation resolution Resolution of the optical flow pass, as a fraction of the output. Lowering it is the cheapest way to reclaim performance. - Half precision shaders - Use the 16-bit shader variant. Falls back automatically if the driver or the file lacks it. - Dump generated frame - Write the optical flow mip levels and the interpolated frame to the lossless/debug folder once, for troubleshooting Frame generation unavailable - This GPU driver does not support the Vulkan memory model, which the Lossless Scaling shaders require. + This GPU driver lacks the Vulkan memory model or half precision (float16) support that the Lossless Scaling shaders require. Optional. Provide your own Lossless.dll to enable frame generation later Install Lossless.dll Frame generation needs your own legal copy of Lossless.dll from Lossless Scaling Select a different copy of Lossless.dll Frame generation Supported - Unsupported (no Vulkan memory model) + Unsupported (no Vulkan memory model or float16) Lossless Scaling Provide your own copy of Lossless.dll to enable frame generation Installed diff --git a/src/common/settings.h b/src/common/settings.h index 6b60d633a5..c1c2d4f0df 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -459,7 +459,7 @@ struct Values { &frame_gen}; SwitchableSetting frame_gen_queue_target{linkage, - 1, + 0, 0, 2, "frame_gen_queue_target", @@ -469,9 +469,6 @@ struct Values { false, &frame_gen}; - SwitchableSetting frame_gen_fp16{linkage, true, "frame_gen_fp16", Category::Renderer, - Specialization::Default, true, false, &frame_gen}; - SwitchableSetting frame_gen_dump_flow{linkage, false, "frame_gen_dump_flow", Category::Renderer}; diff --git a/src/video_core/frame_gen/lossless_dll.cpp b/src/video_core/frame_gen/lossless_dll.cpp index 5d2d08ffb3..6be1e5530f 100644 --- a/src/video_core/frame_gen/lossless_dll.cpp +++ b/src/video_core/frame_gen/lossless_dll.cpp @@ -45,7 +45,7 @@ constexpr u32 PERFORMANCE_SHADER_ID_FIRST = 280; constexpr u32 PERFORMANCE_SHADER_ID_LAST = 302; constexpr u32 CACHE_MAGIC = 0x4746534C; -constexpr u32 CACHE_VERSION = 2; +constexpr u32 CACHE_VERSION = 3; struct CacheHeader { u32 magic; @@ -53,7 +53,6 @@ struct CacheHeader { u64 source_size; u64 source_hash; u32 module_count; - u32 variant; }; struct Section { @@ -277,41 +276,19 @@ template return std::ranges::all_of(ids, [&](u32 id) { return resources.contains(id); }); } -[[nodiscard]] u32 VariantOffset(ShaderVariant variant) { - return variant == ShaderVariant::NativeFp16 ? PerformanceShader::NATIVE_FP16_OFFSET - : PerformanceShader::NATIVE_FP32_OFFSET; -} - template -[[nodiscard]] bool HasNativeVariant(const Map& resources, ShaderVariant variant) { - const u32 offset = VariantOffset(variant); +[[nodiscard]] bool HasNativeShaders(const Map& resources) { return std::ranges::all_of(PerformanceShaderIds(), [&](u32 id) { - const auto hit = resources.find(id + offset); + const auto hit = resources.find(id + PerformanceShader::NATIVE_FP16_OFFSET); return hit != resources.end() && IsSpirvModule(hit->second); }); } -[[nodiscard]] std::optional SelectVariant(const ResourceSpans& resources, - bool allow_fp16, bool prefer_fp16) { - if (prefer_fp16 && HasNativeVariant(resources, ShaderVariant::NativeFp16)) { - return ShaderVariant::NativeFp16; - } - if (HasNativeVariant(resources, ShaderVariant::NativeFp32)) { - return ShaderVariant::NativeFp32; - } - if (allow_fp16 && HasNativeVariant(resources, ShaderVariant::NativeFp16)) { - return ShaderVariant::NativeFp16; - } - return std::nullopt; -} - [[nodiscard]] LosslessStatus TranslateAll(const ResourceSpans& resources, - ShaderModules& out_modules, - ShaderVariant variant) { - const u32 offset = VariantOffset(variant); + ShaderModules& out_modules) { out_modules.clear(); for (const u32 id : PerformanceShaderIds()) { - const auto hit = resources.find(id + offset); + const auto hit = resources.find(id + PerformanceShader::NATIVE_FP16_OFFSET); if (hit == resources.end()) { return LosslessStatus::MissingShaders; } @@ -343,7 +320,7 @@ template } [[nodiscard]] bool ReadShaderCache(const std::filesystem::path& path, u64 source_size, - u64 source_hash, u32 variant, ShaderModules& out_modules) { + u64 source_hash, ShaderModules& out_modules) { if (!Common::FS::Exists(path)) { return false; } @@ -355,8 +332,7 @@ template return false; } if (header.magic != CACHE_MAGIC || header.version != CACHE_VERSION || - header.source_size != source_size || header.source_hash != source_hash || - header.variant != variant) { + header.source_size != source_size || header.source_hash != source_hash) { return false; } @@ -433,8 +409,10 @@ template return LosslessStatus::MissingShaders; } - return HasPerformanceShaders(out_resources) ? LosslessStatus::Ok - : LosslessStatus::MissingShaders; + if (!HasNativeShaders(out_resources)) { + return LosslessStatus::MissingShaders; + } + return LosslessStatus::Ok; } } // Anonymous namespace @@ -483,7 +461,7 @@ LosslessStatus GetInstalledLosslessStatus() { return ValidateLosslessDll(GetLosslessDllPath()); } -LosslessStatus LoadShaderModules(ShaderModules& out_modules, bool allow_fp16, bool prefer_fp16) { +LosslessStatus LoadShaderModules(ShaderModules& out_modules) { std::vector image; const LosslessStatus read_status = ReadImageFile(GetLosslessDllPath(), image); if (read_status != LosslessStatus::Ok) { @@ -501,17 +479,11 @@ LosslessStatus LoadShaderModules(ShaderModules& out_modules, bool allow_fp16, bo return parse_status; } - const std::optional variant = SelectVariant(spans, allow_fp16, prefer_fp16); - if (!variant) { - return LosslessStatus::MissingShaders; - } - - if (ReadShaderCache(cache_path, source_size, source_hash, static_cast(*variant), - out_modules)) { + if (ReadShaderCache(cache_path, source_size, source_hash, out_modules)) { return LosslessStatus::Ok; } - const LosslessStatus translate_status = TranslateAll(spans, out_modules, *variant); + const LosslessStatus translate_status = TranslateAll(spans, out_modules); if (translate_status != LosslessStatus::Ok) { return translate_status; } @@ -522,7 +494,6 @@ LosslessStatus LoadShaderModules(ShaderModules& out_modules, bool allow_fp16, bo .source_size = source_size, .source_hash = source_hash, .module_count = static_cast(out_modules.size()), - .variant = static_cast(*variant), }; if (!WriteShaderCache(cache_path, header, out_modules)) { void(Common::FS::RemoveFile(cache_path)); @@ -534,7 +505,7 @@ LosslessStatus LoadShaderModules(ShaderModules& out_modules, bool allow_fp16, bo LosslessStatus BuildShaderCache() { ShaderModules modules; - return LoadShaderModules(modules, true); + return LoadShaderModules(modules); } bool RemoveInstalledLosslessDll() { diff --git a/src/video_core/frame_gen/lossless_dll.h b/src/video_core/frame_gen/lossless_dll.h index 1d583d008f..53e4974521 100644 --- a/src/video_core/frame_gen/lossless_dll.h +++ b/src/video_core/frame_gen/lossless_dll.h @@ -28,11 +28,6 @@ enum class LosslessStatus : u32 { using ShaderResources = std::map>; using ShaderModules = std::map>; -enum class ShaderVariant : u32 { - NativeFp32 = 1, - NativeFp16 = 2, -}; - namespace PerformanceShader { constexpr u32 MIPMAPS = 255; constexpr u32 GENERATE = 256; @@ -42,7 +37,6 @@ constexpr std::array GAMMA{280, 282, 283, 284, 285}; constexpr std::array DELTA{280, 286, 287, 288, 289, 281, 294, 295, 296, 297}; constexpr u32 NATIVE_FP16_OFFSET = 49; -constexpr u32 NATIVE_FP32_OFFSET = 98; } // namespace PerformanceShader [[nodiscard]] std::filesystem::path GetLosslessDllPath(); @@ -58,9 +52,7 @@ constexpr u32 NATIVE_FP32_OFFSET = 98; [[nodiscard]] LosslessStatus BuildShaderCache(); -[[nodiscard]] LosslessStatus LoadShaderModules(ShaderModules& out_modules, - bool allow_fp16 = false, - bool prefer_fp16 = false); +[[nodiscard]] LosslessStatus LoadShaderModules(ShaderModules& out_modules); bool RemoveInstalledLosslessDll(); diff --git a/src/video_core/renderer_vulkan/present/frame_gen.cpp b/src/video_core/renderer_vulkan/present/frame_gen.cpp index b0d16819e5..e6d857323b 100644 --- a/src/video_core/renderer_vulkan/present/frame_gen.cpp +++ b/src/video_core/renderer_vulkan/present/frame_gen.cpp @@ -198,6 +198,10 @@ void FrameGen::Process(const Device& device, Frame* frame, VkFormat format, VkExtent2D guest_extent) { generated = false; + if (!shaders) { + shaders.emplace(device); + } + if (unavailable || !Settings::values.frame_gen.GetValue()) { if (chain) { scheduler.Finish(); @@ -207,17 +211,14 @@ void FrameGen::Process(const Device& device, Frame* frame, VkFormat format, return; } - if (!frame->storage_view) { + if (!shaders->IsValid()) { unavailable = true; return; } - if (!shaders) { - shaders.emplace(device); - if (!shaders->IsValid()) { - unavailable = true; - return; - } + if (!frame->storage_view) { + warm_streak = 0; + return; } peak_guest_extent.width = std::max(peak_guest_extent.width, guest_extent.width); diff --git a/src/video_core/renderer_vulkan/present/lsfg_shaders.cpp b/src/video_core/renderer_vulkan/present/lsfg_shaders.cpp index aafe0d6419..51c7e4c106 100644 --- a/src/video_core/renderer_vulkan/present/lsfg_shaders.cpp +++ b/src/video_core/renderer_vulkan/present/lsfg_shaders.cpp @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "common/settings.h" #include "video_core/frame_gen/lossless_dll.h" #include "video_core/renderer_vulkan/present/lsfg_shaders.h" #include "video_core/renderer_vulkan/present/util.h" @@ -10,16 +9,13 @@ namespace Vulkan { LsfgShaders::LsfgShaders(const Device& device) { - if (!device.IsVulkanMemoryModelSupported() || !device.HasNullDescriptor()) { + if (!device.IsVulkanMemoryModelSupported() || !device.HasNullDescriptor() || + !device.IsFloat16Supported()) { return; } - const bool allow_fp16 = device.IsFloat16Supported(); - const bool prefer_fp16 = allow_fp16 && Settings::values.frame_gen_fp16.GetValue(); - VideoCore::FrameGen::ShaderModules code; - if (VideoCore::FrameGen::LoadShaderModules(code, allow_fp16, prefer_fp16) != - VideoCore::FrameGen::LosslessStatus::Ok) { + if (VideoCore::FrameGen::LoadShaderModules(code) != VideoCore::FrameGen::LosslessStatus::Ok) { return; } diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp index 96eeeb8045..205382f81a 100644 --- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp +++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp @@ -8,6 +8,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include "common/settings.h" #include "video_core/framebuffer_config.h" #include "video_core/present.h" #include "video_core/renderer_vulkan/present/filters.h" @@ -87,13 +88,18 @@ void BlitScreen::SetWindowAdaptPass(const Device& device) { void BlitScreen::PrepareFrame(const Device& device, Frame* frame, const Layout::FramebufferLayout& layout) { - if (!window_adapt || (frame->width == layout.width && frame->height == layout.height)) { + if (!window_adapt) { + return; + } + + if (frame->width != layout.width || frame->height != layout.height) { + WaitIdle(device); + } else if (!present_manager.NeedsStorage(frame, true)) { return; } - WaitIdle(device); present_manager.RecreateFrame(frame, layout.width, layout.height, swapchain_view_format, - window_adapt->GetRenderPass()); + window_adapt->GetRenderPass(), true); } void BlitScreen::DrawToFrame(const Device& device, RasterizerVulkan& rasterizer, Frame* frame, @@ -120,16 +126,20 @@ void BlitScreen::DrawToFrame(const Device& device, RasterizerVulkan& rasterizer, swapchain_view_format = current_swapchain_view_format; } + const bool storage_required = Settings::values.frame_gen.GetValue(); if (resource_update_required) { WaitIdle(device); SetWindowAdaptPass(device); if (presentation_recreate_required) { present_manager.RecreateFrame(frame, layout.width, layout.height, swapchain_view_format, - window_adapt->GetRenderPass()); + window_adapt->GetRenderPass(), storage_required); } image_index = 0; + } else if (present_manager.NeedsStorage(frame, storage_required)) { + present_manager.RecreateFrame(frame, layout.width, layout.height, swapchain_view_format, + window_adapt->GetRenderPass(), true); } const VkExtent2D window_size{ diff --git a/src/video_core/renderer_vulkan/vk_present_manager.cpp b/src/video_core/renderer_vulkan/vk_present_manager.cpp index 3491f8fb75..d173a3ba5f 100644 --- a/src/video_core/renderer_vulkan/vk_present_manager.cpp +++ b/src/video_core/renderer_vulkan/vk_present_manager.cpp @@ -29,9 +29,6 @@ static_assert(MAX_FRAMES_IN_FLIGHT <= LSFG_MAX_TARGETS); bool CanStoreToFrame(const vk::PhysicalDevice& physical_device, VkFormat format) { #ifdef HAS_LSFG - if (!Settings::values.frame_gen.GetValue()) { - return false; - } const VkFormatProperties props{physical_device.GetFormatProperties(format)}; return (props.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) != 0; #else @@ -160,6 +157,7 @@ PresentManager::PresentManager(const vk::Instance& instance_, .pNext = nullptr, .flags = VK_FENCE_CREATE_SIGNALED_BIT, }); + frame.storage_capable = storage_supported; free_queue.push_back(&frame); } @@ -205,15 +203,22 @@ size_t PresentManager::MaxExtraFrames() const { return image_count - 1; } +bool PresentManager::NeedsStorage(const Frame* frame, bool required) const { + return required && frame->storage_capable && !frame->storage_view; +} + void PresentManager::RecreateFrame(Frame* frame, u32 width, u32 height, VkFormat image_view_format, - VkRenderPass rd) { + VkRenderPass rd, bool storage) { auto& dld = device.GetLogical(); frame->width = width; frame->height = height; - const VkImageUsageFlags storage_usage = - storage_supported ? static_cast(VK_IMAGE_USAGE_STORAGE_BIT) : 0; + const bool with_storage = storage && frame->storage_capable; + VkImageUsageFlags storage_usage = 0; + if (with_storage) { + storage_usage = VK_IMAGE_USAGE_STORAGE_BIT; + } frame->image = memory_allocator.CreateImage({ .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, @@ -264,7 +269,7 @@ void PresentManager::RecreateFrame(Frame* frame, u32 width, u32 height, VkFormat }); frame->storage_view = vk::ImageView{}; - if (storage_supported) { + if (with_storage) { frame->storage_view = dld.CreateImageView({ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, .pNext = nullptr, diff --git a/src/video_core/renderer_vulkan/vk_present_manager.h b/src/video_core/renderer_vulkan/vk_present_manager.h index 577a82098a..4741c55e61 100644 --- a/src/video_core/renderer_vulkan/vk_present_manager.h +++ b/src/video_core/renderer_vulkan/vk_present_manager.h @@ -36,6 +36,7 @@ struct Frame { vk::CommandBuffer cmdbuf; vk::Semaphore render_ready; vk::Fence present_done; + bool storage_capable{}; }; class PresentManager { @@ -57,7 +58,9 @@ public: /// Recreates the present frame to match the provided parameters void RecreateFrame(Frame* frame, u32 width, u32 height, VkFormat image_view_format, - VkRenderPass rd); + VkRenderPass rd, bool storage); + + [[nodiscard]] bool NeedsStorage(const Frame* frame, bool required) const; /// Waits for the present thread to finish presenting all queued frames. void WaitPresent(); From d9159fefdd9e8850e550dd47cc59d7da999a2380 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 14 Sep 2026 03:26:22 +0200 Subject: [PATCH 036/128] [input] Fix mouse drift on Qt/SDL frontends (#4352) Fixes regression from #4229 Mouse wasn't updated periodically to prevent "infinite drift". Timer for polling is now controlled by frontend directly, this should reduce latency considerably and wasted cycles spinwaiting, it also removes an extra thread which is always welcome. - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4352 Reviewed-by: CamilleLaVey Reviewed-by: MaranBr --- src/input_common/drivers/mouse.cpp | 111 +++++++++----------- src/input_common/drivers/mouse.h | 7 +- src/yuzu/bootmanager.cpp | 33 +++--- src/yuzu/bootmanager.h | 2 + src/yuzu_cmd/emu_window/emu_window_sdl3.cpp | 6 ++ src/yuzu_cmd/emu_window/emu_window_sdl3.h | 3 + 6 files changed, 82 insertions(+), 80 deletions(-) diff --git a/src/input_common/drivers/mouse.cpp b/src/input_common/drivers/mouse.cpp index 4444f0ac3b..4ac259d03b 100644 --- a/src/input_common/drivers/mouse.cpp +++ b/src/input_common/drivers/mouse.cpp @@ -4,17 +4,16 @@ // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include +#include #include #include #include "common/param_package.h" #include "common/settings.h" -#include "common/thread.h" +#include "common/steady_clock.h" #include "input_common/drivers/mouse.h" namespace InputCommon { -constexpr int update_time = 10; constexpr float default_panning_sensitivity = 0.0010f; constexpr float default_stick_sensitivity = 0.0006f; constexpr float default_deadzone_counterweight = 0.01f; @@ -74,33 +73,31 @@ Mouse::Mouse(std::string input_engine_) : InputEngine(std::move(input_engine_)) last_motion_change = {}; } -void Mouse::UpdateStickInput() { - if (!IsMousePanningEnabled()) { - return; +void Mouse::UpdateStickInput(Common::SteadyClock::time_point timestamp) { + if (IsMousePanningEnabled()) { + const float length = last_mouse_change.Length(); + + // Prevent input from exceeding the max range (1.0f) too much, + // but allow some room to make it easier to sustain + if (length > maximum_stick_range) { + last_mouse_change /= length; + last_mouse_change *= maximum_stick_range; + } + + SetAxis(identifier, mouse_axis_x, last_mouse_change[0]); + SetAxis(identifier, mouse_axis_y, -last_mouse_change[1]); + + // Decay input over time + const float clamped_length = (std::min)(1.0f, length); + const float decay_strength = Settings::values.mouse_panning_decay_strength.GetValue(); + const float decay = 1 - clamped_length * clamped_length * decay_strength * 0.01f; + const float min_decay = Settings::values.mouse_panning_min_decay.GetValue(); + const float clamped_decay = (std::min)(1 - min_decay / 100.0f, decay); + last_mouse_change *= clamped_decay; } - - const float length = last_mouse_change.Length(); - - // Prevent input from exceeding the max range (1.0f) too much, - // but allow some room to make it easier to sustain - if (length > maximum_stick_range) { - last_mouse_change /= length; - last_mouse_change *= maximum_stick_range; - } - - SetAxis(identifier, mouse_axis_x, last_mouse_change[0]); - SetAxis(identifier, mouse_axis_y, -last_mouse_change[1]); - - // Decay input over time - const float clamped_length = (std::min)(1.0f, length); - const float decay_strength = Settings::values.mouse_panning_decay_strength.GetValue(); - const float decay = 1 - clamped_length * clamped_length * decay_strength * 0.01f; - const float min_decay = Settings::values.mouse_panning_min_decay.GetValue(); - const float clamped_decay = (std::min)(1 - min_decay / 100.0f, decay); - last_mouse_change *= clamped_decay; } -void Mouse::UpdateMotionInput() { +void Mouse::UpdateMotionInput(Common::SteadyClock::time_point timestamp) { const float sensitivity = IsMousePanningEnabled() ? default_motion_panning_sensitivity : default_motion_sensitivity; @@ -114,23 +111,21 @@ void Mouse::UpdateMotionInput() { last_motion_change[1] = last_motion_change[1] * multiplier; } - const BasicMotion motion_data{ - .gyro_x = last_motion_change[0] * sensitivity, - .gyro_y = last_motion_change[1] * sensitivity, - .gyro_z = last_motion_change[2] * sensitivity, - .accel_x = 0, - .accel_y = 0, - .accel_z = 0, - .delta_timestamp = update_time * 1000, - }; - if (IsMousePanningEnabled()) { last_motion_change[0] = 0; last_motion_change[1] = 0; } last_motion_change[2] = 0; - SetMotion(motion_identifier, 0, motion_data); + SetMotion(motion_identifier, 0, BasicMotion{ + .gyro_x = last_motion_change[0] * sensitivity, + .gyro_y = last_motion_change[1] * sensitivity, + .gyro_z = last_motion_change[2] * sensitivity, + .accel_x = 0, + .accel_y = 0, + .accel_z = 0, + .delta_timestamp = u64(std::chrono::duration_cast(timestamp - last_notify_timestamp).count()), + }); } void Mouse::Move(int x, int y, int center_x, int center_y) { @@ -149,29 +144,27 @@ void Mouse::Move(int x, int y, int center_x, int center_y) { last_mouse_change /= length; last_mouse_change *= deadzone_cw; } - return; - } - - if (button_pressed) { - const auto mouse_move = Common::Vec(x, y) - mouse_origin; - const float x_sensitivity = - Settings::values.mouse_panning_x_sensitivity.GetValue() * default_stick_sensitivity; - const float y_sensitivity = - Settings::values.mouse_panning_y_sensitivity.GetValue() * default_stick_sensitivity; - SetAxis(identifier, mouse_axis_x, float(mouse_move[0]) * x_sensitivity); - SetAxis(identifier, mouse_axis_y, float(-mouse_move[1]) * y_sensitivity); - - last_motion_change = { - float(-mouse_move[1]) * x_sensitivity, - float(-mouse_move[0]) * y_sensitivity, - last_motion_change[2], - }; + } else { + if (button_pressed) { + const auto mouse_move = Common::Vec(x, y) - mouse_origin; + const float x_sensitivity = Settings::values.mouse_panning_x_sensitivity.GetValue() * default_stick_sensitivity; + const float y_sensitivity = Settings::values.mouse_panning_y_sensitivity.GetValue() * default_stick_sensitivity; + SetAxis(identifier, mouse_axis_x, float(mouse_move[0]) * x_sensitivity); + SetAxis(identifier, mouse_axis_y, float(-mouse_move[1]) * y_sensitivity); + last_motion_change = { + float(-mouse_move[1]) * x_sensitivity, + float(-mouse_move[0]) * y_sensitivity, + last_motion_change[2], + }; + } } } void Mouse::NotifyChanged() { - UpdateStickInput(); - UpdateMotionInput(); + auto const timestamp = Common::SteadyClock::Now(); + UpdateStickInput(timestamp); + UpdateMotionInput(timestamp); + last_notify_timestamp = timestamp; } void Mouse::MouseMove(f32 touch_x, f32 touch_y) { @@ -223,8 +216,8 @@ void Mouse::MouseWheelChange(int x, int y) { wheel_position[0] += x; wheel_position[1] += y; last_motion_change[2] += static_cast(y); - SetAxis(identifier, wheel_axis_x, static_cast(wheel_position[0])); - SetAxis(identifier, wheel_axis_y, static_cast(wheel_position[1])); + SetAxis(identifier, wheel_axis_x, f32(wheel_position[0])); + SetAxis(identifier, wheel_axis_y, f32(wheel_position[1])); } void Mouse::ReleaseAllButtons() { diff --git a/src/input_common/drivers/mouse.h b/src/input_common/drivers/mouse.h index 25f75109b9..1f7cb7e966 100644 --- a/src/input_common/drivers/mouse.h +++ b/src/input_common/drivers/mouse.h @@ -7,7 +7,9 @@ #pragma once #include +#include +#include "common/steady_clock.h" #include "common/polyfill_thread.h" #include "common/vector_math.h" #include "input_common/input_engine.h" @@ -101,8 +103,8 @@ public: Common::Input::ButtonNames GetUIName(const Common::ParamPackage& params) const override; private: - void UpdateStickInput(); - void UpdateMotionInput(); + void UpdateStickInput(Common::SteadyClock::time_point timestamp); + void UpdateMotionInput(Common::SteadyClock::time_point timestamp); bool IsMousePanningEnabled(); Common::Input::ButtonNames GetUIButtonName(const Common::ParamPackage& params) const; @@ -112,6 +114,7 @@ private: Common::Vec last_mouse_change; Common::Vec last_motion_change; Common::Vec wheel_position; + Common::SteadyClock::time_point last_notify_timestamp{}; bool button_pressed = false; }; diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp index f9c0233901..308db3621b 100644 --- a/src/yuzu/bootmanager.cpp +++ b/src/yuzu/bootmanager.cpp @@ -73,6 +73,7 @@ class QPaintEngine; class QSurface; constexpr int default_mouse_constrain_timeout = 10; +constexpr int default_mouse_update_timeout = 5; class RenderWidget : public QWidget { public: @@ -138,6 +139,10 @@ GRenderWindow::GRenderWindow(MainWindow* parent, mouse_constrain_timer.setInterval(default_mouse_constrain_timeout); connect(&mouse_constrain_timer, &QTimer::timeout, this, &GRenderWindow::ConstrainMouse); + + mouse_update_timer.setInterval(default_mouse_update_timeout); + connect(&mouse_update_timer, &QTimer::timeout, this, &GRenderWindow::UpdateMouse); + mouse_update_timer.start(); } void GRenderWindow::ExecuteProgram(std::size_t program_index) { @@ -487,7 +492,6 @@ void GRenderWindow::mousePressEvent(QMouseEvent* event) { input_subsystem->GetMouse()->PressMouseButton(button); input_subsystem->GetMouse()->PressButton(pos.x(), pos.y(), button); input_subsystem->GetMouse()->PressTouchButton(touch_x, touch_y, button); - input_subsystem->GetMouse()->NotifyChanged(); emit MouseActivity(); } @@ -508,7 +512,6 @@ void GRenderWindow::mouseMoveEvent(QMouseEvent* event) { input_subsystem->GetMouse()->MouseMove(touch_x, touch_y); input_subsystem->GetMouse()->TouchMove(touch_x, touch_y); input_subsystem->GetMouse()->Move(pos.x(), pos.y(), center_x, center_y); - input_subsystem->GetMouse()->NotifyChanged(); // Center mouse for mouse panning if (Settings::values.mouse_panning && !Settings::values.mouse_enabled) { @@ -518,8 +521,7 @@ void GRenderWindow::mouseMoveEvent(QMouseEvent* event) { // Constrain mouse for mouse emulation with mouse panning if (Settings::values.mouse_panning && Settings::values.mouse_enabled) { const auto [clamped_mouse_x, clamped_mouse_y] = ClipToTouchScreen(x, y); - QCursor::setPos(mapToGlobal( - QPoint{static_cast(clamped_mouse_x), static_cast(clamped_mouse_y)})); + QCursor::setPos(mapToGlobal(QPoint{int(clamped_mouse_x), int(clamped_mouse_y)})); } mouse_constrain_timer.stop(); @@ -534,16 +536,10 @@ void GRenderWindow::mouseReleaseEvent(QMouseEvent* event) { const auto button = QtButtonToMouseButton(event->button()); input_subsystem->GetMouse()->ReleaseButton(button); - input_subsystem->GetMouse()->NotifyChanged(); } void GRenderWindow::ConstrainMouse() { - if (QtCommon::emu_thread == nullptr || !Settings::values.mouse_panning) { - mouse_constrain_timer.stop(); - return; - } - - if (!this->isActiveWindow()) { + if (QtCommon::emu_thread == nullptr || Settings::values.mouse_panning || !this->isActiveWindow()) { mouse_constrain_timer.stop(); return; } @@ -552,22 +548,22 @@ void GRenderWindow::ConstrainMouse() { const auto pos = mapFromGlobal(QCursor::pos()); const int new_pos_x = std::clamp(pos.x(), 0, width()); const int new_pos_y = std::clamp(pos.y(), 0, height()); - QCursor::setPos(mapToGlobal(QPoint{new_pos_x, new_pos_y})); - return; + } else { + const int center_x = width() / 2; + const int center_y = height() / 2; + QCursor::setPos(mapToGlobal(QPoint{center_x, center_y})); } +} - const int center_x = width() / 2; - const int center_y = height() / 2; - - QCursor::setPos(mapToGlobal(QPoint{center_x, center_y})); +void GRenderWindow::UpdateMouse() { + input_subsystem->GetMouse()->NotifyChanged(); // required to reset mouse once it's no longer moved } void GRenderWindow::wheelEvent(QWheelEvent* event) { const int x = event->angleDelta().x(); const int y = event->angleDelta().y(); input_subsystem->GetMouse()->MouseWheelChange(x, y); - input_subsystem->GetMouse()->NotifyChanged(); } void GRenderWindow::TouchBeginEvent(const QTouchEvent* event) { @@ -716,7 +712,6 @@ void GRenderWindow::focusOutEvent(QFocusEvent* event) { input_subsystem->GetKeyboard()->ReleaseAllKeys(); input_subsystem->GetTouchScreen()->ReleaseAllTouch(); input_subsystem->GetMouse()->ReleaseAllButtons(); - input_subsystem->GetMouse()->NotifyChanged(); } void GRenderWindow::resizeEvent(QResizeEvent* event) { diff --git a/src/yuzu/bootmanager.h b/src/yuzu/bootmanager.h index 1ed61a8191..bb18bbb3bb 100644 --- a/src/yuzu/bootmanager.h +++ b/src/yuzu/bootmanager.h @@ -144,6 +144,7 @@ private: void TouchUpdateEvent(const QTouchEvent* event); void TouchEndEvent(); void ConstrainMouse(); + void UpdateMouse(); void RequestCameraCapture(); void OnCameraCapture(int requestId, const QImage& img); @@ -184,6 +185,7 @@ private: #endif QTimer mouse_constrain_timer; + QTimer mouse_update_timer; protected: void showEvent(QShowEvent* event) override; diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl3.cpp b/src/yuzu_cmd/emu_window/emu_window_sdl3.cpp index cff2292bb2..950e001f81 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl3.cpp +++ b/src/yuzu_cmd/emu_window/emu_window_sdl3.cpp @@ -37,10 +37,16 @@ EmuWindow_SDL3::EmuWindow_SDL3(InputCommon::InputSubsystem* input_subsystem_, Co SDL_SetWindowTitle(this_->render_window, title.c_str()); return 2000; }, this); + mouse_timer = SDL_AddTimer(100, [](void *userdata, SDL_TimerID, Uint32) -> Uint32 { + auto* this_ = (EmuWindow_SDL3*)userdata; + this_->input_subsystem->GetMouse()->NotifyChanged(); + return 100; + }, this); } EmuWindow_SDL3::~EmuWindow_SDL3() { SDL_RemoveTimer(titlebar_timer); + SDL_RemoveTimer(mouse_timer); system.HIDCore().UnloadInputDevices(); input_subsystem->Shutdown(); SDL_Quit(); diff --git a/src/yuzu_cmd/emu_window/emu_window_sdl3.h b/src/yuzu_cmd/emu_window/emu_window_sdl3.h index bf63b65554..ffabaeb143 100644 --- a/src/yuzu_cmd/emu_window/emu_window_sdl3.h +++ b/src/yuzu_cmd/emu_window/emu_window_sdl3.h @@ -84,6 +84,9 @@ protected: /// Periodic changer of titlebar (independent of event loop) SDL_TimerID titlebar_timer; + // Mouse resetter once it + SDL_TimerID mouse_timer; + /// Is the window still open? bool is_open = true; From 2b4184dd2bb33da081702263d59c3eadb299e673 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 14 Sep 2026 14:34:24 +0200 Subject: [PATCH 037/128] Revert "[audio] Replace libopus with FFmpeg (#4169)" (#4419) This reverts commit ff8368c6066faf3962e2f77af7da4954e2ff6a43. - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4419 Reviewed-by: Maufeat Reviewed-by: MaranBr --- .../0001-disable-clang-runtime-neon.patch | 28 + .patch/opus/0002-no-install.patch | 153 +++++ CMakeLists.txt | 15 + CMakeModules/find/FindOpus.cmake | 22 + cpmfile.json | 17 +- docs/Deps.md | 19 +- shell.nix | 2 +- .../yuzu_emu/fragments/LicensesFragment.kt | 7 + .../app/src/main/res/values/strings.xml | 45 ++ src/audio_core/CMakeLists.txt | 14 +- .../adsp/apps/opus/opus_decode_object.cpp | 110 ++++ .../adsp/apps/opus/opus_decode_object.h | 41 ++ .../adsp/apps/opus/opus_decoder.cpp | 587 +++++++----------- src/audio_core/adsp/apps/opus/opus_decoder.h | 27 +- .../opus/opus_multistream_decode_object.cpp | 113 ++++ .../opus/opus_multistream_decode_object.h | 42 ++ src/audio_core/adsp/apps/opus/opus_types.h | 32 - src/audio_core/adsp/apps/opus/shared_memory.h | 1 + src/audio_core/opus/hardware_opus.cpp | 71 ++- src/audio_core/opus/hardware_opus.h | 2 + src/core/CMakeLists.txt | 1 + src/video_core/CMakeLists.txt | 2 + 22 files changed, 913 insertions(+), 438 deletions(-) create mode 100644 .patch/opus/0001-disable-clang-runtime-neon.patch create mode 100644 .patch/opus/0002-no-install.patch create mode 100644 CMakeModules/find/FindOpus.cmake create mode 100644 src/audio_core/adsp/apps/opus/opus_decode_object.cpp create mode 100644 src/audio_core/adsp/apps/opus/opus_decode_object.h create mode 100644 src/audio_core/adsp/apps/opus/opus_multistream_decode_object.cpp create mode 100644 src/audio_core/adsp/apps/opus/opus_multistream_decode_object.h delete mode 100644 src/audio_core/adsp/apps/opus/opus_types.h diff --git a/.patch/opus/0001-disable-clang-runtime-neon.patch b/.patch/opus/0001-disable-clang-runtime-neon.patch new file mode 100644 index 0000000000..27a905c366 --- /dev/null +++ b/.patch/opus/0001-disable-clang-runtime-neon.patch @@ -0,0 +1,28 @@ +From cc15da16e533b2a801934eab2dfeaf3c3949a1dc Mon Sep 17 00:00:00 2001 +From: crueter +Date: Mon, 8 Sep 2025 12:28:55 -0400 +Subject: [PATCH] [cmake] disable NEON runtime check on clang-cl + +When enabling runtime NEON checking for clang-cl, the linker would error out with `undefined symbol: __emit`, since clang doesn't actually implement this instruction. Therefore it makes sense to disable the runtime check by default on this platform, until either this is fixed or a clang-cl compatible intrinsic check is added (I don't have enough knowledge of MSVC to do this) +--- + cmake/OpusConfig.cmake | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/cmake/OpusConfig.cmake b/cmake/OpusConfig.cmake +index e9319fbad..d0f459e88 100644 +--- a/cmake/OpusConfig.cmake ++++ b/cmake/OpusConfig.cmake +@@ -71,7 +71,12 @@ elseif(OPUS_CPU_ARM AND NOT OPUS_DISABLE_INTRINSICS) + opus_detect_neon(COMPILER_SUPPORT_NEON) + if(COMPILER_SUPPORT_NEON) + option(OPUS_USE_NEON "Option to enable NEON" ON) +- option(OPUS_MAY_HAVE_NEON "Does runtime check for neon support" ON) ++ if (MSVC AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang") ++ set(NEON_RUNTIME_CHECK_DEFAULT OFF) ++ else() ++ set(NEON_RUNTIME_CHECK_DEFAULT ON) ++ endif() ++ option(OPUS_MAY_HAVE_NEON "Does runtime check for neon support" ${NEON_RUNTIME_CHECK_DEFAULT}) + option(OPUS_PRESUME_NEON "Assume target CPU has NEON support" OFF) + if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") + set(OPUS_PRESUME_NEON ON) diff --git a/.patch/opus/0002-no-install.patch b/.patch/opus/0002-no-install.patch new file mode 100644 index 0000000000..833a3e4178 --- /dev/null +++ b/.patch/opus/0002-no-install.patch @@ -0,0 +1,153 @@ +From bf455b67b4eaa446ffae5d25410b141b7b1b1082 Mon Sep 17 00:00:00 2001 +From: crueter +Date: Mon, 8 Sep 2025 12:08:20 -0400 +Subject: [PATCH] [cmake] `OPUS_INSTALL` option; only default install if root + project + +Signed-off-by: crueter +--- + CMakeLists.txt | 112 ++++++++++++++++++++++++++++--------------------- + 1 file changed, 64 insertions(+), 48 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index fcf034b19..08b5e16f8 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -4,6 +4,13 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + include(OpusPackageVersion) + get_package_version(PACKAGE_VERSION PROJECT_VERSION) + ++# root project detection ++if(DEFINED PROJECT_NAME) ++ set(root_project OFF) ++else() ++ set(root_project ON) ++endif() ++ + project(Opus LANGUAGES C VERSION ${PROJECT_VERSION}) + + include(OpusFunctions) +@@ -83,12 +90,16 @@ set(OPUS_DNN_FLOAT_DEBUG_HELP_STR "Run DNN computations as float for debugging p + option(OPUS_DNN_FLOAT_DEBUG ${OPUS_DNN_FLOAT_DEBUG_HELP_STR} OFF) + add_feature_info(OPUS_DNN_FLOAT_DEBUG OPUS_DNN_FLOAT_DEBUG ${OPUS_DNN_FLOAT_DEBUG_HELP_STR}) + ++set(OPUS_INSTALL_HELP_STR "Install Opus targets") ++option(OPUS_INSTALL ${OPUS_INSTALL_HELP_STR} ${root_project}) ++add_feature_info(OPUS_INSTALL OPUS_INSTALL ${OPUS_INSTALL_HELP_STR}) ++ + set(OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR "install pkg-config module.") +-option(OPUS_INSTALL_PKG_CONFIG_MODULE ${OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR} ON) ++option(OPUS_INSTALL_PKG_CONFIG_MODULE ${OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR} ${OPUS_INSTALL}) + add_feature_info(OPUS_INSTALL_PKG_CONFIG_MODULE OPUS_INSTALL_PKG_CONFIG_MODULE ${OPUS_INSTALL_PKG_CONFIG_MODULE_HELP_STR}) + + set(OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR "install CMake package config module.") +-option(OPUS_INSTALL_CMAKE_CONFIG_MODULE ${OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR} ON) ++option(OPUS_INSTALL_CMAKE_CONFIG_MODULE ${OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR} ${OPUS_INSTALL}) + add_feature_info(OPUS_INSTALL_CMAKE_CONFIG_MODULE OPUS_INSTALL_CMAKE_CONFIG_MODULE ${OPUS_INSTALL_CMAKE_CONFIG_MODULE_HELP_STR}) + + set(OPUS_DRED_HELP_STR "enable DRED.") +@@ -613,53 +624,58 @@ if(OPUS_BUILD_FRAMEWORK) + OUTPUT_NAME Opus) + endif() + +-install(TARGETS opus +- EXPORT OpusTargets +- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} +- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +- FRAMEWORK DESTINATION ${CMAKE_INSTALL_PREFIX} +- PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opus) +- +-if(OPUS_INSTALL_PKG_CONFIG_MODULE) +- set(prefix ${CMAKE_INSTALL_PREFIX}) +- set(exec_prefix ${CMAKE_INSTALL_PREFIX}) +- set(libdir ${CMAKE_INSTALL_FULL_LIBDIR}) +- set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) +- set(VERSION ${PACKAGE_VERSION}) +- if(HAVE_LIBM) +- set(LIBM "-lm") ++if (OPUS_INSTALL) ++ install(TARGETS opus ++ EXPORT OpusTargets ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ++ FRAMEWORK DESTINATION ${CMAKE_INSTALL_PREFIX} ++ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opus) ++ ++ if(OPUS_INSTALL_PKG_CONFIG_MODULE) ++ set(prefix ${CMAKE_INSTALL_PREFIX}) ++ set(exec_prefix ${CMAKE_INSTALL_PREFIX}) ++ set(libdir ${CMAKE_INSTALL_FULL_LIBDIR}) ++ set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) ++ set(VERSION ${PACKAGE_VERSION}) ++ if(HAVE_LIBM) ++ set(LIBM "-lm") ++ endif() ++ configure_file(opus.pc.in opus.pc) ++ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/opus.pc ++ DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) ++ endif() ++ ++ if(OPUS_INSTALL_CMAKE_CONFIG_MODULE) ++ set(CPACK_GENERATOR TGZ) ++ include(CPack) ++ set(CMAKE_INSTALL_PACKAGEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) ++ install(EXPORT OpusTargets ++ NAMESPACE Opus:: ++ DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) ++ ++ include(CMakePackageConfigHelpers) ++ ++ set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}) ++ configure_package_config_file( ++ ${PROJECT_SOURCE_DIR}/cmake/OpusConfig.cmake.in ++ OpusConfig.cmake ++ INSTALL_DESTINATION ++ ${CMAKE_INSTALL_PACKAGEDIR} ++ PATH_VARS ++ INCLUDE_INSTALL_DIR ++ INSTALL_PREFIX ++ ${CMAKE_INSTALL_PREFIX}) ++ ++ write_basic_package_version_file(OpusConfigVersion.cmake ++ VERSION ${PROJECT_VERSION} ++ COMPATIBILITY SameMajorVersion) ++ ++ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/OpusConfig.cmake ++ ${CMAKE_CURRENT_BINARY_DIR}/OpusConfigVersion.cmake ++ DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) + endif() +- configure_file(opus.pc.in opus.pc) +- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/opus.pc +- DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) +-endif() +- +-if(OPUS_INSTALL_CMAKE_CONFIG_MODULE) +- set(CPACK_GENERATOR TGZ) +- include(CPack) +- set(CMAKE_INSTALL_PACKAGEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) +- install(EXPORT OpusTargets +- NAMESPACE Opus:: +- DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) +- +- include(CMakePackageConfigHelpers) +- +- set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}) +- configure_package_config_file(${PROJECT_SOURCE_DIR}/cmake/OpusConfig.cmake.in +- OpusConfig.cmake +- INSTALL_DESTINATION +- ${CMAKE_INSTALL_PACKAGEDIR} +- PATH_VARS +- INCLUDE_INSTALL_DIR +- INSTALL_PREFIX +- ${CMAKE_INSTALL_PREFIX}) +- write_basic_package_version_file(OpusConfigVersion.cmake +- VERSION ${PROJECT_VERSION} +- COMPATIBILITY SameMajorVersion) +- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/OpusConfig.cmake +- ${CMAKE_CURRENT_BINARY_DIR}/OpusConfigVersion.cmake +- DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) + endif() + + if(OPUS_BUILD_PROGRAMS) diff --git a/CMakeLists.txt b/CMakeLists.txt index f5c360b294..266331b0ac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -464,6 +464,21 @@ if (NOT YUZU_STATIC_ROOM) if (ZLIB_ADDED) add_library(ZLIB::ZLIB ALIAS zlibstatic) endif() + + # Opus + AddJsonPackage(opus) + + if (Opus_ADDED) + if (MSVC AND CXX_CLANG) + target_compile_options(opus PRIVATE + $<$:-Wno-implicit-function-declaration> + ) + endif() + endif() + + if (NOT TARGET Opus::opus) + add_library(Opus::opus ALIAS opus) + endif() endif() if(NOT TARGET Boost::headers) diff --git a/CMakeModules/find/FindOpus.cmake b/CMakeModules/find/FindOpus.cmake new file mode 100644 index 0000000000..257642682e --- /dev/null +++ b/CMakeModules/find/FindOpus.cmake @@ -0,0 +1,22 @@ +# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +# SPDX-FileCopyrightText: 2022 yuzu Emulator Project +# SPDX-License-Identifier: GPL-2.0-or-later + +find_package(PkgConfig QUIET) +pkg_search_module(OPUS QUIET IMPORTED_TARGET opus) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Opus + REQUIRED_VARS OPUS_LINK_LIBRARIES + VERSION_VAR OPUS_VERSION +) + +if (MSYS2) + FixMsysPath(PkgConfig::OPUS) +endif() + +if (Opus_FOUND AND NOT TARGET Opus::opus) + add_library(Opus::opus ALIAS PkgConfig::OPUS) +endif() diff --git a/cpmfile.json b/cpmfile.json index 419c8d2d69..8b2099f40a 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -82,7 +82,7 @@ "name": "ffmpeg", "package": "FFmpeg", "repo": "crueter-ci/FFmpeg", - "version": "9.0.1-1788303113-bf1b838f2a" + "version": "9.0.1-1788120736-bf1b838f2a" }, "fmt": { "hash": "f0da82c545b01692e9fd30fdfb613dbb8dd9716983dcd0ff19ac2a8d36f74beb5540ef38072fdecc1e34191b3682a8542ecbf3a61ef287dbba0a2679d4e023f2", @@ -210,6 +210,21 @@ "repo": "jimmy-park/openssl-cmake", "version": "3.6.2" }, + "opus": { + "find_args": "MODULE", + "hash": "9506147b0de35befda8633ff272981cc2575c860874791bd455b752f797fd7dbd1079f0ba42ccdd7bb1fe6773fa5e84b3d75667c2883dd1fb2d0e4a5fa4f8387", + "min_version": "1.3", + "options": [ + "OPUS_PRESUME_NEON ON" + ], + "package": "Opus", + "patches": [ + "0001-disable-clang-runtime-neon.patch", + "0002-no-install.patch" + ], + "repo": "xiph/opus", + "version": "a3f0ec02b3" + }, "quazip": { "hash": "609c240c7f029ac26a37d8fbab51bc16284e05e128b78b9b9c0e95d083538c36047a67d682759ac990e4adb0eeb90f04f1ea7fe2253bbda7e7e3bcce32e53dd8", "min_version": "1.3", diff --git a/docs/Deps.md b/docs/Deps.md index 9a781ebdcd..2b73ecb4ac 100644 --- a/docs/Deps.md +++ b/docs/Deps.md @@ -60,6 +60,7 @@ All other dependencies will be downloaded and built by [CPM](https://github.com/ * [ZLIB](https://www.zlib.net/) 1.2+ * [zstd](https://facebook.github.io/zstd/) 1.5+ * [enet](http://enet.bespin.org/) 1.3+ +* [Opus](https://opus-codec.org/) 1.3+ Vulkan 1.3.274+ is also needed: @@ -120,7 +121,7 @@ sudo emerge -a \ dev-libs/boost dev-libs/openssl dev-libs/discord-rpc \ dev-util/spirv-tools dev-util/spirv-headers dev-util/vulkan-headers \ dev-util/vulkan-utility-libraries dev-util/glslang \ - media-gfx/renderdoc media-libs/libva media-video/ffmpeg \ + media-gfx/renderdoc media-libs/libva media-libs/opus media-video/ffmpeg \ media-libs/VulkanMemoryAllocator media-libs/libsdl3 media-libs/cubeb \ net-libs/enet \ sys-libs/zlib \ @@ -152,7 +153,7 @@ Required USE flags: Arch Linux ```sh -sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 ninja nlohmann-json openssl qt6-base qt6-multimedia qt6-charts sdl3 zlib zstd zip unzip vulkan-headers vulkan-utility-libraries libusb spirv-tools spirv-headers +sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 ninja nlohmann-json openssl opus qt6-base qt6-multimedia qt6-charts sdl3 zlib zstd zip unzip vulkan-headers vulkan-utility-libraries libusb spirv-tools spirv-headers ``` * Building with QT Web Engine requires `qt6-webengine` as well. @@ -165,7 +166,7 @@ sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glsl Ubuntu, Debian, Mint Linux ```sh -sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev qt6-charts-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev libboost-dev libboost-fiber-dev libboost-context-dev libsdl3-dev libasound2t64 vulkan-utility-libraries-dev +sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev qt6-charts-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev libboost-dev libboost-fiber-dev libboost-context-dev libsdl3-dev libopus-dev libasound2t64 vulkan-utility-libraries-dev ``` * Ubuntu 26.04, Linux Mint 22.3, or Debian 13 or later is required. @@ -212,7 +213,7 @@ First, enable the community repository; [see here](https://wiki.alpinelinux.org/ # Enable the community repository setup-apkrepos -c # 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 jq patch +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 ``` @@ -260,7 +261,7 @@ brew install molten-vk As root run: ```sh -pkg install devel/cmake devel/sdl3 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base x11-toolkits/qt6-charts devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib graphics/vulkan-utility-libraries graphics/vulkan-headers graphics/spirv-headers quazip-qt6 +pkg install devel/cmake devel/sdl3 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base x11-toolkits/qt6-charts 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 graphics/vulkan-utility-libraries graphics/vulkan-headers graphics/spirv-headers quazip-qt6 ``` If using FreeBSD 12 or prior, use `devel/pkg-config` instead. @@ -274,7 +275,7 @@ If using FreeBSD 12 or prior, use `devel/pkg-config` instead. For NetBSD +10.1: ```sh -pkgin install git cmake boost fmtlib SDL3 catch2 libjwt spirv-headers spirv-tools ffmpeg7 libva nlohmann-json jq qt6-qtbase qt6-qtcharts qt6-qtmultimedia qt6-qttools cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1 libcxx frozen +pkgin install git cmake boost fmtlib SDL3 catch2 libjwt spirv-headers spirv-tools ffmpeg7 libva nlohmann-json jq libopus qt6-qtbase qt6-qtcharts qt6-qtmultimedia qt6-qttools cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1 libcxx frozen ``` [Caveats](./Caveats.md#netbsd). @@ -305,7 +306,7 @@ pkg install gcc14 git cmake unzip nasm autoconf bash pkgconf ffmpeg glslang gmak OpenIndiana ```sh -sudo pkg install git cmake qt6 boost glslang libzip library/lz4 libusb-1 nlohmann-json openssl sdl3 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt +sudo pkg install git cmake qt6 boost glslang libzip library/lz4 libusb-1 nlohmann-json openssl opus sdl3 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt ``` [Caveats](./Caveats.md#openindiana). @@ -329,7 +330,7 @@ sudo pkgin install git cmake autoconf build-essential libusb-1 nasm gcc13 ```sh BASE="git make autoconf libtool automake-wrapper jq patch" -MINGW="qt6-base qt6-charts qt6-tools qt6-translations qt6-svg cmake toolchain clang python-pip openssl vulkan-memory-allocator vulkan-devel glslang boost fmt lz4 nlohmann-json zlib zstd enet libusb openssl SDL3" +MINGW="qt6-base qt6-charts qt6-tools qt6-translations qt6-svg cmake toolchain clang python-pip openssl vulkan-memory-allocator vulkan-devel glslang boost fmt lz4 nlohmann-json zlib zstd enet opus libusb openssl SDL3" # Either x86_64 or clang-aarch64 (Windows on ARM) packages="$BASE" for pkg in $MINGW; do @@ -355,7 +356,7 @@ pacman -Syuu --needed --noconfirm $packages HaikuOS ```sh -pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel boost1.90_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl3_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel glslang qt6_devel qt6_charts_devel cubeb_devel simpleini quazip_qt6_devel +pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.90_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl3_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel glslang qt6_devel qt6_charts_devel cubeb_devel simpleini quazip_qt6_devel ``` [Caveats](./Caveats.md#haikuos). diff --git a/shell.nix b/shell.nix index e4d57d7e5e..786b94ccb2 100755 --- a/shell.nix +++ b/shell.nix @@ -12,7 +12,7 @@ pkgs.mkShellNoCC { git cmake clang gnumake patch jq pkg-config # libraries openssl boost fmt nlohmann_json lz4 zlib zstd - enet vulkan-headers vulkan-utility-libraries + enet libopus vulkan-headers vulkan-utility-libraries spirv-tools spirv-headers vulkan-loader unzip glslang python3 httplib cpp-jwt ffmpeg-headless libusb1 cubeb diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt index 226edfa00c..32b72fe38f 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/LicensesFragment.kt @@ -79,6 +79,13 @@ class LicensesFragment : Fragment() { R.string.license_ffmpeg_copyright, R.string.license_ffmpeg_text ), + License( + R.string.license_opus, + R.string.license_opus_description, + R.string.license_opus_link, + R.string.license_opus_copyright, + R.string.license_opus_text + ), License( R.string.license_sirit, R.string.license_sirit_description, diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index e712ec4338..730f6bbade 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -1784,6 +1784,51 @@ RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + Opus + Modern audio compression for the internet + https://github.com/xiph/opus + Copyright 2001–2011 Xiph.Org, Skype Limited, Octasic, Jean-Marc Valin, Timothy B. Terriberry, CSIRO, Gregory Maxwell, Mark Borgerding, Erik de Castro Lopo + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met:\n\n + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer.\n\n + +- 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.\n\n + +- Neither the name of Internet Society, IETF or IETF Trust, nor the +names of specific contributors, may be used to endorse or promote +products derived from this software without specific prior written +permission.\n\n + +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.\n\n + +Opus is subject to the royalty-free patent licenses which are +specified at:\n\n + +Xiph.Org Foundation: +https://datatracker.ietf.org/ipr/1524/ \n\n + +Microsoft Corporation: +https://datatracker.ietf.org/ipr/1914/ \n\n + +Broadcom Corporation: +https://datatracker.ietf.org/ipr/1526/ Sirit A runtime SPIR-V assembler diff --git a/src/audio_core/CMakeLists.txt b/src/audio_core/CMakeLists.txt index 71a46a7b1e..b244d657a9 100644 --- a/src/audio_core/CMakeLists.txt +++ b/src/audio_core/CMakeLists.txt @@ -15,6 +15,10 @@ add_library(audio_core STATIC adsp/apps/audio_renderer/command_list_processor.h adsp/apps/opus/opus_decoder.cpp adsp/apps/opus/opus_decoder.h + adsp/apps/opus/opus_decode_object.cpp + adsp/apps/opus/opus_decode_object.h + adsp/apps/opus/opus_multistream_decode_object.cpp + adsp/apps/opus/opus_multistream_decode_object.h adsp/apps/opus/shared_memory.h audio_core.cpp audio_core.h @@ -222,14 +226,8 @@ else() $<$:-Wno-sign-conversion>) endif() -if (YUZU_USE_EXTERNAL_FFMPEG) - add_dependencies(audio_core ffmpeg-build) -endif() -target_include_directories(audio_core PUBLIC ${FFmpeg_INCLUDE_DIR}) -target_link_libraries(audio_core PRIVATE ${FFmpeg_LIBRARIES}) -target_link_options(audio_core PRIVATE ${FFmpeg_LDFLAGS}) - -target_link_libraries(audio_core PUBLIC common core) +target_include_directories(audio_core PRIVATE ${OPUS_INCLUDE_DIRS}) +target_link_libraries(audio_core PUBLIC common core Opus::opus) if (ENABLE_CUBEB) target_sources(audio_core PRIVATE diff --git a/src/audio_core/adsp/apps/opus/opus_decode_object.cpp b/src/audio_core/adsp/apps/opus/opus_decode_object.cpp new file mode 100644 index 0000000000..a47a7f8527 --- /dev/null +++ b/src/audio_core/adsp/apps/opus/opus_decode_object.cpp @@ -0,0 +1,110 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 + +#include "audio_core/adsp/apps/opus/opus_decode_object.h" +#include "common/assert.h" + +namespace AudioCore::ADSP::OpusDecoder { +namespace { +bool IsValidChannelCount(u32 channel_count) { + return channel_count == 1 || channel_count == 2; +} +} // namespace + +u32 OpusDecodeObject::GetWorkBufferSize(u32 channel_count) { + if (!IsValidChannelCount(channel_count)) { + return 0; + } + return static_cast(sizeof(OpusDecodeObject)) + opus_decoder_get_size(channel_count); +} + +OpusDecodeObject& OpusDecodeObject::Initialize(u64 buffer, u64 buffer2) { + auto* new_decoder = reinterpret_cast(buffer); + auto* comparison = reinterpret_cast(buffer2); + + if (new_decoder->magic == DecodeObjectMagic) { + if (!new_decoder->initialized || + (new_decoder->initialized && new_decoder->self == comparison)) { + new_decoder->state_valid = true; + } + } else { + new_decoder->initialized = false; + new_decoder->state_valid = true; + } + return *new_decoder; +} + +s32 OpusDecodeObject::InitializeDecoder(u32 sample_rate, u32 channel_count) { + if (!state_valid) { + return OPUS_INVALID_STATE; + } + + if (initialized) { + return OPUS_OK; + } + + // Unfortunately libopus does not expose the OpusDecoder struct publicly, so we can't include + // it in this class. Nintendo does not allocate memory, which is why we have a workbuffer + // provided. + // We could use _create and have libopus allocate it for us, but then we have to separately + // track which decoder is being used between this and multistream in order to call the correct + // destroy from the host side. + // This is a bit cringe, but is safe as these objects are only ever initialized inside the given + // workbuffer, and GetWorkBufferSize will guarantee there's enough space to follow. + decoder = (LibOpusDecoder*)(this + 1); + s32 ret = opus_decoder_init(decoder, sample_rate, channel_count); + if (ret == OPUS_OK) { + magic = DecodeObjectMagic; + initialized = true; + state_valid = true; + self = this; + final_range = 0; + } + return ret; +} + +s32 OpusDecodeObject::Shutdown() { + if (!state_valid) { + return OPUS_INVALID_STATE; + } + + if (initialized) { + magic = 0x0; + initialized = false; + state_valid = false; + self = nullptr; + final_range = 0; + decoder = nullptr; + } + return OPUS_OK; +} + +s32 OpusDecodeObject::ResetDecoder() { + return opus_decoder_ctl(decoder, OPUS_RESET_STATE); +} + +s32 OpusDecodeObject::Decode(u32& out_sample_count, u64 output_data, u64 output_data_size, + u64 input_data, u64 input_data_size) { + ASSERT(initialized); + out_sample_count = 0; + + if (!state_valid) { + return OPUS_INVALID_STATE; + } + + auto ret_code_or_samples = opus_decode( + decoder, reinterpret_cast(input_data), static_cast(input_data_size), + reinterpret_cast(output_data), static_cast(output_data_size), 0); + + if (ret_code_or_samples < OPUS_OK) { + return ret_code_or_samples; + } + + out_sample_count = ret_code_or_samples; + return opus_decoder_ctl(decoder, OPUS_GET_FINAL_RANGE_REQUEST, &final_range); +} + +} // namespace AudioCore::ADSP::OpusDecoder diff --git a/src/audio_core/adsp/apps/opus/opus_decode_object.h b/src/audio_core/adsp/apps/opus/opus_decode_object.h new file mode 100644 index 0000000000..feee9587ce --- /dev/null +++ b/src/audio_core/adsp/apps/opus/opus_decode_object.h @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 + +#pragma once + +#include + +#include "common/common_types.h" + +namespace AudioCore::ADSP::OpusDecoder { +using LibOpusDecoder = ::OpusDecoder; +static constexpr u32 DecodeObjectMagic = 0xDEADBEEF; + +class OpusDecodeObject { +public: + static u32 GetWorkBufferSize(u32 channel_count); + static OpusDecodeObject& Initialize(u64 buffer, u64 buffer2); + + s32 InitializeDecoder(u32 sample_rate, u32 channel_count); + s32 Shutdown(); + s32 ResetDecoder(); + s32 Decode(u32& out_sample_count, u64 output_data, u64 output_data_size, u64 input_data, + u64 input_data_size); + u32 GetFinalRange() const noexcept { + return final_range; + } + +private: + u32 magic; + bool initialized; + bool state_valid; + OpusDecodeObject* self; + u32 final_range; + LibOpusDecoder* decoder; +}; +static_assert(std::is_trivially_constructible_v); + +} // namespace AudioCore::ADSP::OpusDecoder diff --git a/src/audio_core/adsp/apps/opus/opus_decoder.cpp b/src/audio_core/adsp/apps/opus/opus_decoder.cpp index 0be0f774b1..8a009c04c7 100644 --- a/src/audio_core/adsp/apps/opus/opus_decoder.cpp +++ b/src/audio_core/adsp/apps/opus/opus_decoder.cpp @@ -5,388 +5,55 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include -extern "C" { -#include -#include -#include -#include -#include -#include -#include -#include -} - +#include "audio_core/adsp/apps/opus/opus_decode_object.h" +#include "audio_core/adsp/apps/opus/opus_multistream_decode_object.h" #include "audio_core/adsp/apps/opus/shared_memory.h" #include "audio_core/audio_core.h" +#include "audio_core/common/common.h" #include "common/logging.h" #include "common/thread.h" #include "core/core.h" #include "core/core_timing.h" -#include "core/hle/service/audio/errors.h" namespace AudioCore::ADSP::OpusDecoder { namespace { -constexpr u32 OPUS_STREAM_COUNT_MAX = 255; -// https://git.ffmpeg.org/gitweb/ffmpeg.git/blob_plain/HEAD:/libavcodec/libopusdec.c -constexpr u32 OPUS_HEAD_SIZE = 19; -constexpr u32 OPUS_MAX_CHANNELS = 2; +constexpr size_t OpusStreamCountMax = 255; bool IsValidChannelCount(u32 channel_count) { - return channel_count >= 1 || channel_count <= OPUS_MAX_CHANNELS; + return channel_count == 1 || channel_count == 2; } -bool IsValidStreamCounts(u32 total_stream_count, u32 stereo_stream_count) { - return total_stream_count > 0 && total_stream_count <= OPUS_STREAM_COUNT_MAX - && s32(stereo_stream_count) >= 0 && stereo_stream_count <= total_stream_count; +bool IsValidMultiStreamChannelCount(u32 channel_count) { + return channel_count <= OpusStreamCountMax; } -class OpusGenericDecodeObject { -public: - static u32 GetWorkBufferSizeMultistream(u32 total_stream_count, u32 stereo_stream_count) { - if (IsValidStreamCounts(total_stream_count, stereo_stream_count)) - return 48 + 2556 * (total_stream_count * stereo_stream_count); - return 0; - } - - static u32 GetWorkBufferSize(u32 channel_count) { - if (channel_count == 1 || channel_count == 2) - return 48 + 16 * channel_count; - return 0; - } - - /// idempotency of initialize is guaranteed - Result InitializeDecoder(u32 sample_rate, u32 total_stream_count, u32 channel_count, u32 stereo_stream_count, u8 const* mappings) { - // prefer libopus, ffmpeg docs say to use libopus **if** available - // However, native opus can also work with swrescale: - // it uses planarfloat, we can resample to s16 - AVCodec const* codec = avcodec_find_decoder_by_name("libopus"); - bool is_libopus = codec != nullptr; - if (!codec) { - LOG_WARNING(Audio_DSP, "using ffmpeg native opus decoder"); - codec = avcodec_find_decoder(AV_CODEC_ID_OPUS); - } - if (codec) { - if ((avc = avc ? avc : avcodec_alloc_context3(codec))) { - if (is_libopus) { - const std::array mapping_arr{0, 1}; - mappings = mappings ? mappings : mapping_arr.data(); - - // freed by avcodec_context_free() - u8 *edata = reinterpret_cast(av_mallocz(OPUS_HEAD_SIZE + 2 * OPUS_MAX_CHANNELS + AV_INPUT_BUFFER_PADDING_SIZE)); - ASSERT(edata); - edata[9] = u8(channel_count); //channels - edata[10] = u8(0); //opus->pre_skip - edata[16] = u8(0); //gain_db - edata[18] = u8(0); //channel_map - edata[OPUS_HEAD_SIZE + 0] = u8(total_stream_count); - edata[OPUS_HEAD_SIZE + 1] = u8(stereo_stream_count); - if (channel_count >= 1) edata[OPUS_HEAD_SIZE + 2] = mappings[0]; - if (channel_count >= 2) edata[OPUS_HEAD_SIZE + 3] = mappings[1]; - avc->extradata = edata; - avc->extradata_size = OPUS_HEAD_SIZE + 2 * channel_count; - } - - - // FFmpeg hardcodes sample rate - avc->sample_rate = sample_rate; - avc->request_sample_fmt = AV_SAMPLE_FMT_S16; - av_channel_layout_default(&avc->ch_layout, channel_count); - if (avcodec_open2(avc, codec, nullptr) >= 0) { - avpkt = av_packet_alloc(); - frame = av_frame_alloc(); - return ResultSuccess; - } else { - avcodec_free_context(&avc); - } - } - } - return Service::Audio::ResultLibOpusInternalError; - } - - Result Shutdown() { - avcodec_free_context(&avc); - av_frame_free(&frame); - av_packet_free(&avpkt); - return ResultSuccess; - } - - Result ResetDecoder() { - if (avc) { - if (avcodec_is_open(avc)) avcodec_flush_buffers(avc); - return ResultSuccess; - } - return Service::Audio::ResultLibOpusInvalidState; - } - - Result Decode(u32& out_sample_count, u64 output_data, u64 output_data_size, u64 input_data, u64 input_data_size) { - out_sample_count = 0; - if (avc) { - int rem_output_bytes = int(output_data_size); - while (rem_output_bytes > 0) { - int r = avcodec_receive_frame(avc, frame); - if (r == AVERROR(EAGAIN)) { - av_packet_unref(avpkt); - av_new_packet(avpkt, int(input_data_size)); - std::memcpy(avpkt->data, reinterpret_cast(input_data), input_data_size); - r = avcodec_send_packet(avc, avpkt); - ASSERT(r >= 0); - } else if (r == AVERROR_EOF) { - break; - } else if (r >= 0) { - auto const bsize = av_samples_get_buffer_size(nullptr, frame->ch_layout.nb_channels, frame->nb_samples, AV_SAMPLE_FMT_S16, 1); - if (frame->format == AV_SAMPLE_FMT_S16) { - std::memcpy(reinterpret_cast(output_data) + (int(output_data_size) - rem_output_bytes), frame->data[0], size_t(bsize)); - } else { - SwrContext *swr = nullptr; - if (swr_alloc_set_opts2( - &swr, - &avc->ch_layout, - AV_SAMPLE_FMT_S16, - 48000, - &avc->ch_layout, - (enum AVSampleFormat)frame->format, - 48000, - 0, - nullptr - ) >= 0) { - if (swr_init(swr) >= 0) { - AVFrame *s16_frame = av_frame_alloc(); - s16_frame->format = AV_SAMPLE_FMT_S16; - s16_frame->sample_rate = frame->sample_rate; - av_channel_layout_copy(&s16_frame->ch_layout, &frame->ch_layout); - s16_frame->nb_samples = frame->nb_samples; - av_frame_get_buffer(s16_frame, 0); - swr_convert(swr, s16_frame->data, s16_frame->nb_samples, (const uint8_t **)frame->data, frame->nb_samples); - std::memcpy(reinterpret_cast(output_data) + (int(output_data_size) - rem_output_bytes), s16_frame->data[0], size_t(bsize)); - swr_free(&swr); - } - } - } - out_sample_count += frame->nb_samples; - rem_output_bytes -= bsize; - } else { - LOG_ERROR(Audio_DSP, "{}", r); - break; - } - } - ASSERT(rem_output_bytes == 0 && "remaining bytes!"); - return ResultSuccess; - } - return Service::Audio::ResultLibOpusInvalidState; - } - - AVCodecContext* avc = nullptr; - AVPacket* avpkt = nullptr; - AVFrame* frame = nullptr; -}; +bool IsValidMultiStreamStreamCounts(s32 total_stream_count, s32 stereo_stream_count) { + return IsValidMultiStreamChannelCount(total_stream_count) && total_stream_count > 0 && + stereo_stream_count >= 0 && stereo_stream_count <= total_stream_count; +} } // namespace -OpusDecoder::OpusDecoder(Core::System& system) { - dsp_thread = std::jthread([this, &system](std::stop_token stop_token) { - Common::SetCurrentThreadName("DSP_OpusDecoder"); - if (Receive(Direction::DSP, stop_token) != Message::Start) { - LOG_ERROR(Service_Audio, "DSP OpusDecoder failed to receive Start message. Opus initialization failed."); - return; - } - Send(Direction::Host, Message::StartOK); - - // Main OpusDecoder thread, responsible for processing the incoming Opus packets. - ::Common::unordered_map decode_objects; - while (!stop_token.stop_requested()) { - auto msg = Receive(Direction::DSP, stop_token); - switch (msg) { - case Shutdown: - Send(Direction::Host, Message::ShutdownOK); - return; - case GetWorkBufferSize: { - auto channel_count = s32(shared_memory->host_send_data[0]); - - ASSERT(IsValidChannelCount(channel_count)); - - shared_memory->dsp_return_data[0] = OpusGenericDecodeObject::GetWorkBufferSize(channel_count); - Send(Direction::Host, Message::GetWorkBufferSizeOK); - break; - } - case InitializeDecodeObject: { - auto buffer = shared_memory->host_send_data[0]; - auto buffer_size = shared_memory->host_send_data[1]; - auto sample_rate = s32(shared_memory->host_send_data[2]); - auto channel_count = s32(shared_memory->host_send_data[3]); - - ASSERT(sample_rate >= 0); - ASSERT(IsValidChannelCount(channel_count)); - ASSERT(buffer_size >= OpusGenericDecodeObject::GetWorkBufferSize(channel_count)); - - if (auto const it = decode_objects.find(buffer); it != decode_objects.end()) { - it->second.Shutdown(); - shared_memory->dsp_return_data[0] = it->second.InitializeDecoder(sample_rate, 1, channel_count, channel_count == 2 ? 1 : 0, nullptr).raw; - } else { - OpusGenericDecodeObject obj{}; - shared_memory->dsp_return_data[0] = obj.InitializeDecoder(sample_rate, 1, channel_count, channel_count == 2 ? 1 : 0, nullptr).raw; - decode_objects.insert_or_assign(buffer, obj); - } - Send(Direction::Host, Message::InitializeDecodeObjectOK); - break; - } - case ShutdownDecodeObject: { - auto buffer = shared_memory->host_send_data[0]; - //[[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; - if (auto const it = decode_objects.find(buffer); it != decode_objects.end()) { - shared_memory->dsp_return_data[0] = it->second.Shutdown().raw; - } else { - LOG_ERROR(Audio_DSP, "operating unregistered buffer {}", buffer); - shared_memory->dsp_return_data[0] = Service::Audio::ResultLibOpusInvalidState.raw; - } - Send(Direction::Host, Message::ShutdownDecodeObjectOK); - break; - } - case DecodeInterleaved: { - auto start_time = system.CoreTiming().GetGlobalTimeUs(); - - auto buffer = shared_memory->host_send_data[0]; - auto input_data = shared_memory->host_send_data[1]; - auto input_data_size = shared_memory->host_send_data[2]; - auto output_data = shared_memory->host_send_data[3]; - auto output_data_size = shared_memory->host_send_data[4]; - //auto final_range = static_cast(shared_memory->host_send_data[5]); - auto reset_requested = shared_memory->host_send_data[6]; - - u32 decoded_samples{0}; - - if (auto const it = decode_objects.find(buffer); it != decode_objects.end()) { - auto res = ResultSuccess; - if (reset_requested) - res = it->second.ResetDecoder(); - if (res == ResultSuccess) - res = it->second.Decode(decoded_samples, output_data, output_data_size, input_data, input_data_size); - - auto end_time = system.CoreTiming().GetGlobalTimeUs(); - shared_memory->dsp_return_data[0] = res.raw; - shared_memory->dsp_return_data[1] = decoded_samples; - shared_memory->dsp_return_data[2] = (end_time - start_time).count(); - } else { - LOG_ERROR(Audio_DSP, "operating unregistered buffer {}", buffer); - shared_memory->dsp_return_data[0] = Service::Audio::ResultLibOpusInvalidState.raw; - } - Send(Direction::Host, Message::DecodeInterleavedOK); - break; - } - case MapMemory: { - [[maybe_unused]] auto buffer = shared_memory->host_send_data[0]; - [[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; - Send(Direction::Host, Message::MapMemoryOK); - break; - } - case UnmapMemory: { - [[maybe_unused]] auto buffer = shared_memory->host_send_data[0]; - [[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; - Send(Direction::Host, Message::UnmapMemoryOK); - break; - } - case GetWorkBufferSizeForMultiStream: { - auto total_stream_count = s32(shared_memory->host_send_data[0]); - auto stereo_stream_count = s32(shared_memory->host_send_data[1]); - - ASSERT(IsValidStreamCounts(total_stream_count, stereo_stream_count)); - - shared_memory->dsp_return_data[0] = OpusGenericDecodeObject::GetWorkBufferSizeMultistream(total_stream_count, stereo_stream_count); - Send(Direction::Host, Message::GetWorkBufferSizeForMultiStreamOK); - break; - } - case InitializeMultiStreamDecodeObject: { - auto buffer = shared_memory->host_send_data[0]; - auto buffer_size = shared_memory->host_send_data[1]; - auto sample_rate = s32(shared_memory->host_send_data[2]); - auto channel_count = s32(shared_memory->host_send_data[3]); - auto total_stream_count = s32(shared_memory->host_send_data[4]); - auto stereo_stream_count = s32(shared_memory->host_send_data[5]); - // Nintendo seem to have a bug here, they try to use &host_send_data[6] for the channel - // mappings, but [6] is never set, and there is not enough room in the argument data for - // more than 40 channels, when 255 are possible. - // It also means the mapping values are undefined, though likely always 0, - // and the mappings given by the game are ignored. The mappings are copied to this - // dedicated buffer host side, so let's do as intended. - auto mappings = shared_memory->channel_mapping.data(); - - ASSERT(IsValidStreamCounts(total_stream_count, stereo_stream_count)); - ASSERT(sample_rate >= 0); - ASSERT(buffer_size >= OpusGenericDecodeObject::GetWorkBufferSizeMultistream(total_stream_count, stereo_stream_count)); - if (auto const it = decode_objects.find(buffer); it != decode_objects.end()) { - it->second.Shutdown(); - shared_memory->dsp_return_data[0] = it->second.InitializeDecoder(sample_rate, total_stream_count, channel_count, stereo_stream_count, mappings).raw; - } else { - OpusGenericDecodeObject obj{}; - shared_memory->dsp_return_data[0] = obj.InitializeDecoder(sample_rate, total_stream_count, channel_count, stereo_stream_count, mappings).raw; - decode_objects.insert_or_assign(buffer, obj); - } - Send(Direction::Host, Message::InitializeMultiStreamDecodeObjectOK); - break; - } - case ShutdownMultiStreamDecodeObject: { - auto buffer = shared_memory->host_send_data[0]; - //[[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; - if (auto const it = decode_objects.find(buffer); it != decode_objects.end()) { - shared_memory->dsp_return_data[0] = it->second.Shutdown().raw; - } else { - LOG_ERROR(Audio_DSP, "operating unregistered buffer {}", buffer); - shared_memory->dsp_return_data[0] = Service::Audio::ResultLibOpusInvalidState.raw; - } - Send(Direction::Host, Message::ShutdownMultiStreamDecodeObjectOK); - break; - } - case DecodeInterleavedForMultiStream: { - auto start_time = system.CoreTiming().GetGlobalTimeUs(); - - auto buffer = shared_memory->host_send_data[0]; - auto input_data = shared_memory->host_send_data[1]; - auto input_data_size = shared_memory->host_send_data[2]; - auto output_data = shared_memory->host_send_data[3]; - auto output_data_size = shared_memory->host_send_data[4]; - //auto final_range = static_cast(shared_memory->host_send_data[5]); - auto reset_requested = shared_memory->host_send_data[6]; - - u32 decoded_samples{0}; - - if (auto const it = decode_objects.find(buffer); it != decode_objects.end()) { - auto res = ResultSuccess; - if (reset_requested) - res = it->second.ResetDecoder(); - if (res == ResultSuccess) - res = it->second.Decode(decoded_samples, output_data, output_data_size, input_data, input_data_size); - - auto end_time = system.CoreTiming().GetGlobalTimeUs(); - shared_memory->dsp_return_data[0] = res.raw; - shared_memory->dsp_return_data[1] = decoded_samples; - shared_memory->dsp_return_data[2] = (end_time - start_time).count(); - } else { - LOG_ERROR(Audio_DSP, "operating unregistered buffer {}", buffer); - shared_memory->dsp_return_data[0] = Service::Audio::ResultLibOpusInvalidState.raw; - } - Send(Direction::Host, Message::DecodeInterleavedForMultiStreamOK); - break; - } - default: - LOG_ERROR(Audio_DSP, "Invalid OpusDecoder command {}", msg); - continue; - } - } - for (auto e : decode_objects) - e.second.Shutdown(); - }); +OpusDecoder::OpusDecoder(Core::System& system_) : system{system_} { + init_thread = std::jthread([this](std::stop_token stop_token) { Init(stop_token); }); } OpusDecoder::~OpusDecoder() { - if (dsp_thread.joinable()) { - // Shutdown the thread - auto const stop_token = dsp_thread.get_stop_token(); - Send(Direction::DSP, Message::Shutdown); - auto msg = Receive(Direction::Host, stop_token); - ASSERT_MSG(msg == Message::ShutdownOK, "Expected Opus shutdown code {}, got {}", Message::ShutdownOK, msg); - dsp_thread.request_stop(); - dsp_thread.join(); + if (!running) { + init_thread.request_stop(); + return; } + + // Shutdown the thread + Send(Direction::DSP, Message::Shutdown); + auto msg = Receive(Direction::Host); + ASSERT_MSG(msg == Message::ShutdownOK, "Expected Opus shutdown code {}, got {}", + Message::ShutdownOK, msg); + main_thread.request_stop(); + main_thread.join(); + running = false; } void OpusDecoder::Send(Direction dir, u32 message) { @@ -397,4 +64,206 @@ u32 OpusDecoder::Receive(Direction dir, std::stop_token stop_token) { return mailbox.Receive(dir, stop_token); } +void OpusDecoder::Init(std::stop_token stop_token) { + Common::SetCurrentThreadName("DSP_OpusDecoder_Init"); + + if (Receive(Direction::DSP, stop_token) != Message::Start) { + LOG_ERROR(Service_Audio, + "DSP OpusDecoder failed to receive Start message. Opus initialization failed."); + return; + } + main_thread = std::jthread([this](std::stop_token st) { Main(st); }); + running = true; + Send(Direction::Host, Message::StartOK); +} + +void OpusDecoder::Main(std::stop_token stop_token) { + Common::SetCurrentThreadName("DSP_OpusDecoder_Main"); + + while (!stop_token.stop_requested()) { + auto msg = Receive(Direction::DSP, stop_token); + switch (msg) { + case Shutdown: + Send(Direction::Host, Message::ShutdownOK); + return; + + case GetWorkBufferSize: { + auto channel_count = static_cast(shared_memory->host_send_data[0]); + + ASSERT(IsValidChannelCount(channel_count)); + + shared_memory->dsp_return_data[0] = OpusDecodeObject::GetWorkBufferSize(channel_count); + Send(Direction::Host, Message::GetWorkBufferSizeOK); + } break; + + case InitializeDecodeObject: { + auto buffer = shared_memory->host_send_data[0]; + auto buffer_size = shared_memory->host_send_data[1]; + auto sample_rate = static_cast(shared_memory->host_send_data[2]); + auto channel_count = static_cast(shared_memory->host_send_data[3]); + + ASSERT(sample_rate >= 0); + ASSERT(IsValidChannelCount(channel_count)); + ASSERT(buffer_size >= OpusDecodeObject::GetWorkBufferSize(channel_count)); + + auto& decoder_object = OpusDecodeObject::Initialize(buffer, buffer); + shared_memory->dsp_return_data[0] = + decoder_object.InitializeDecoder(sample_rate, channel_count); + + Send(Direction::Host, Message::InitializeDecodeObjectOK); + } break; + + case ShutdownDecodeObject: { + auto buffer = shared_memory->host_send_data[0]; + [[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; + + auto& decoder_object = OpusDecodeObject::Initialize(buffer, buffer); + shared_memory->dsp_return_data[0] = decoder_object.Shutdown(); + + Send(Direction::Host, Message::ShutdownDecodeObjectOK); + } break; + + case DecodeInterleaved: { + auto start_time = system.CoreTiming().GetGlobalTimeUs(); + + auto buffer = shared_memory->host_send_data[0]; + auto input_data = shared_memory->host_send_data[1]; + auto input_data_size = shared_memory->host_send_data[2]; + auto output_data = shared_memory->host_send_data[3]; + auto output_data_size = shared_memory->host_send_data[4]; + auto final_range = static_cast(shared_memory->host_send_data[5]); + auto reset_requested = shared_memory->host_send_data[6]; + + u32 decoded_samples{0}; + + auto& decoder_object = OpusDecodeObject::Initialize(buffer, buffer); + s32 error_code{OPUS_OK}; + if (reset_requested) { + error_code = decoder_object.ResetDecoder(); + } + + if (error_code == OPUS_OK) { + error_code = decoder_object.Decode(decoded_samples, output_data, output_data_size, + input_data, input_data_size); + } + + if (error_code == OPUS_OK) { + if (final_range && decoder_object.GetFinalRange() != final_range) { + error_code = OPUS_INVALID_PACKET; + } + } + + auto end_time = system.CoreTiming().GetGlobalTimeUs(); + shared_memory->dsp_return_data[0] = error_code; + shared_memory->dsp_return_data[1] = decoded_samples; + shared_memory->dsp_return_data[2] = (end_time - start_time).count(); + + Send(Direction::Host, Message::DecodeInterleavedOK); + } break; + + case MapMemory: { + [[maybe_unused]] auto buffer = shared_memory->host_send_data[0]; + [[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; + Send(Direction::Host, Message::MapMemoryOK); + } break; + + case UnmapMemory: { + [[maybe_unused]] auto buffer = shared_memory->host_send_data[0]; + [[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; + Send(Direction::Host, Message::UnmapMemoryOK); + } break; + + case GetWorkBufferSizeForMultiStream: { + auto total_stream_count = static_cast(shared_memory->host_send_data[0]); + auto stereo_stream_count = static_cast(shared_memory->host_send_data[1]); + + ASSERT(IsValidMultiStreamStreamCounts(total_stream_count, stereo_stream_count)); + + shared_memory->dsp_return_data[0] = OpusMultiStreamDecodeObject::GetWorkBufferSize( + total_stream_count, stereo_stream_count); + Send(Direction::Host, Message::GetWorkBufferSizeForMultiStreamOK); + } break; + + case InitializeMultiStreamDecodeObject: { + auto buffer = shared_memory->host_send_data[0]; + auto buffer_size = shared_memory->host_send_data[1]; + auto sample_rate = static_cast(shared_memory->host_send_data[2]); + auto channel_count = static_cast(shared_memory->host_send_data[3]); + auto total_stream_count = static_cast(shared_memory->host_send_data[4]); + auto stereo_stream_count = static_cast(shared_memory->host_send_data[5]); + // Nintendo seem to have a bug here, they try to use &host_send_data[6] for the channel + // mappings, but [6] is never set, and there is not enough room in the argument data for + // more than 40 channels, when 255 are possible. + // It also means the mapping values are undefined, though likely always 0, + // and the mappings given by the game are ignored. The mappings are copied to this + // dedicated buffer host side, so let's do as intended. + auto mappings = shared_memory->channel_mapping.data(); + + ASSERT(IsValidMultiStreamStreamCounts(total_stream_count, stereo_stream_count)); + ASSERT(sample_rate >= 0); + ASSERT(buffer_size >= OpusMultiStreamDecodeObject::GetWorkBufferSize( + total_stream_count, stereo_stream_count)); + + auto& decoder_object = OpusMultiStreamDecodeObject::Initialize(buffer, buffer); + shared_memory->dsp_return_data[0] = decoder_object.InitializeDecoder( + sample_rate, total_stream_count, channel_count, stereo_stream_count, mappings); + + Send(Direction::Host, Message::InitializeMultiStreamDecodeObjectOK); + } break; + + case ShutdownMultiStreamDecodeObject: { + auto buffer = shared_memory->host_send_data[0]; + [[maybe_unused]] auto buffer_size = shared_memory->host_send_data[1]; + + auto& decoder_object = OpusMultiStreamDecodeObject::Initialize(buffer, buffer); + shared_memory->dsp_return_data[0] = decoder_object.Shutdown(); + + Send(Direction::Host, Message::ShutdownMultiStreamDecodeObjectOK); + } break; + + case DecodeInterleavedForMultiStream: { + auto start_time = system.CoreTiming().GetGlobalTimeUs(); + + auto buffer = shared_memory->host_send_data[0]; + auto input_data = shared_memory->host_send_data[1]; + auto input_data_size = shared_memory->host_send_data[2]; + auto output_data = shared_memory->host_send_data[3]; + auto output_data_size = shared_memory->host_send_data[4]; + auto final_range = static_cast(shared_memory->host_send_data[5]); + auto reset_requested = shared_memory->host_send_data[6]; + + u32 decoded_samples{0}; + + auto& decoder_object = OpusMultiStreamDecodeObject::Initialize(buffer, buffer); + s32 error_code{OPUS_OK}; + if (reset_requested) { + error_code = decoder_object.ResetDecoder(); + } + + if (error_code == OPUS_OK) { + error_code = decoder_object.Decode(decoded_samples, output_data, output_data_size, + input_data, input_data_size); + } + + if (error_code == OPUS_OK) { + if (final_range && decoder_object.GetFinalRange() != final_range) { + error_code = OPUS_INVALID_PACKET; + } + } + + auto end_time = system.CoreTiming().GetGlobalTimeUs(); + shared_memory->dsp_return_data[0] = error_code; + shared_memory->dsp_return_data[1] = decoded_samples; + shared_memory->dsp_return_data[2] = (end_time - start_time).count(); + + Send(Direction::Host, Message::DecodeInterleavedForMultiStreamOK); + } break; + + default: + LOG_ERROR(Service_Audio, "Invalid OpusDecoder command {}", msg); + continue; + } + } +} + } // namespace AudioCore::ADSP::OpusDecoder diff --git a/src/audio_core/adsp/apps/opus/opus_decoder.h b/src/audio_core/adsp/apps/opus/opus_decoder.h index dd87b473d1..5b3f22bf4c 100644 --- a/src/audio_core/adsp/apps/opus/opus_decoder.h +++ b/src/audio_core/adsp/apps/opus/opus_decoder.h @@ -6,13 +6,12 @@ #pragma once +#include #include -#include "common/container/unordered_map.h" #include "audio_core/adsp/apps/opus/shared_memory.h" #include "audio_core/adsp/mailbox.h" #include "common/common_types.h" -#include "core/hle/result.h" namespace Core { class System; @@ -49,14 +48,16 @@ enum Message : u32 { DecodeInterleavedForMultiStreamOK = 50, }; -/// @brief The AudioRenderer application running on the ADSP. +/** + * The AudioRenderer application running on the ADSP. + */ class OpusDecoder { public: explicit OpusDecoder(Core::System& system); ~OpusDecoder(); bool IsRunning() const noexcept { - return dsp_thread.joinable(); + return running; } void Send(Direction dir, u32 message); @@ -67,12 +68,28 @@ public: } private: + /** + * Initializing thread, launched at audio_core boot to avoid blocking the main emu boot thread. + */ + void Init(std::stop_token stop_token); + /** + * Main OpusDecoder thread, responsible for processing the incoming Opus packets. + */ + void Main(std::stop_token stop_token); + + /// Core system + Core::System& system; /// Mailbox to communicate messages with the host, drives the main thread Mailbox mailbox; + /// Init thread + std::jthread init_thread{}; + /// Main thread + std::jthread main_thread{}; + /// The current state + bool running{}; /// Structure shared with the host, input data set by the host before sending a mailbox message, /// and the responses are written back by the OpusDecoder. SharedMemory* shared_memory{}; - std::jthread dsp_thread{}; }; } // namespace AudioCore::ADSP::OpusDecoder diff --git a/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.cpp b/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.cpp new file mode 100644 index 0000000000..6fecd63309 --- /dev/null +++ b/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.cpp @@ -0,0 +1,113 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 + +#include "audio_core/adsp/apps/opus/opus_multistream_decode_object.h" +#include "common/assert.h" + +namespace AudioCore::ADSP::OpusDecoder { + +namespace { +constexpr u32 OpusStreamCountMax = 255; + +bool IsValidStreamCounts(u32 total_stream_count, u32 stereo_stream_count) { + return total_stream_count > 0 && total_stream_count <= OpusStreamCountMax && + static_cast(stereo_stream_count) >= 0 && + stereo_stream_count <= total_stream_count; +} +} // namespace + +u32 OpusMultiStreamDecodeObject::GetWorkBufferSize(u32 total_stream_count, + u32 stereo_stream_count) { + if (IsValidStreamCounts(total_stream_count, stereo_stream_count)) { + return static_cast(sizeof(OpusMultiStreamDecodeObject)) + + opus_multistream_decoder_get_size(total_stream_count, stereo_stream_count); + } + return 0; +} + +OpusMultiStreamDecodeObject& OpusMultiStreamDecodeObject::Initialize(u64 buffer, u64 buffer2) { + auto* new_decoder = reinterpret_cast(buffer); + auto* comparison = reinterpret_cast(buffer2); + + if (new_decoder->magic == DecodeMultiStreamObjectMagic) { + if (!new_decoder->initialized || + (new_decoder->initialized && new_decoder->self == comparison)) { + new_decoder->state_valid = true; + } + } else { + new_decoder->initialized = false; + new_decoder->state_valid = true; + } + return *new_decoder; +} + +s32 OpusMultiStreamDecodeObject::InitializeDecoder(u32 sample_rate, u32 total_stream_count, + u32 channel_count, u32 stereo_stream_count, + u8* mappings) { + if (!state_valid) { + return OPUS_INVALID_STATE; + } + + if (initialized) { + return OPUS_OK; + } + + // See OpusDecodeObject::InitializeDecoder for an explanation of this + decoder = (LibOpusMSDecoder*)(this + 1); + s32 ret = opus_multistream_decoder_init(decoder, sample_rate, channel_count, total_stream_count, + stereo_stream_count, mappings); + if (ret == OPUS_OK) { + magic = DecodeMultiStreamObjectMagic; + initialized = true; + state_valid = true; + self = this; + final_range = 0; + } + return ret; +} + +s32 OpusMultiStreamDecodeObject::Shutdown() { + if (!state_valid) { + return OPUS_INVALID_STATE; + } + + if (initialized) { + magic = 0x0; + initialized = false; + state_valid = false; + self = nullptr; + final_range = 0; + decoder = nullptr; + } + return OPUS_OK; +} + +s32 OpusMultiStreamDecodeObject::ResetDecoder() { + return opus_multistream_decoder_ctl(decoder, OPUS_RESET_STATE); +} + +s32 OpusMultiStreamDecodeObject::Decode(u32& out_sample_count, u64 output_data, + u64 output_data_size, u64 input_data, u64 input_data_size) { + ASSERT(initialized); + out_sample_count = 0; + + if (!state_valid) { + return OPUS_INVALID_STATE; + } + + auto ret_code_or_samples = opus_multistream_decode( + decoder, reinterpret_cast(input_data), static_cast(input_data_size), + reinterpret_cast(output_data), static_cast(output_data_size), 0); + + if (ret_code_or_samples < OPUS_OK) { + return ret_code_or_samples; + } + + out_sample_count = ret_code_or_samples; + return opus_multistream_decoder_ctl(decoder, OPUS_GET_FINAL_RANGE_REQUEST, &final_range); +} + +} // namespace AudioCore::ADSP::OpusDecoder diff --git a/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.h b/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.h new file mode 100644 index 0000000000..baad58385e --- /dev/null +++ b/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.h @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 + +#pragma once + +#include + +#include "common/common_types.h" + +namespace AudioCore::ADSP::OpusDecoder { +using LibOpusMSDecoder = ::OpusMSDecoder; +static constexpr u32 DecodeMultiStreamObjectMagic = 0xDEADBEEF; + +class OpusMultiStreamDecodeObject { +public: + static u32 GetWorkBufferSize(u32 total_stream_count, u32 stereo_stream_count); + static OpusMultiStreamDecodeObject& Initialize(u64 buffer, u64 buffer2); + + s32 InitializeDecoder(u32 sample_rate, u32 total_stream_count, u32 channel_count, + u32 stereo_stream_count, u8* mappings); + s32 Shutdown(); + s32 ResetDecoder(); + s32 Decode(u32& out_sample_count, u64 output_data, u64 output_data_size, u64 input_data, + u64 input_data_size); + u32 GetFinalRange() const noexcept { + return final_range; + } + +private: + u32 magic; + bool initialized; + bool state_valid; + OpusMultiStreamDecodeObject* self; + u32 final_range; + LibOpusMSDecoder* decoder; +}; +static_assert(std::is_trivially_constructible_v); + +} // namespace AudioCore::ADSP::OpusDecoder diff --git a/src/audio_core/adsp/apps/opus/opus_types.h b/src/audio_core/adsp/apps/opus/opus_types.h deleted file mode 100644 index bacfb30338..0000000000 --- a/src/audio_core/adsp/apps/opus/opus_types.h +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "common/common_types.h" - -namespace AudioCore::ADSP { - -static constexpr u32 DECODE_OBJECT_MAGIC = 0xDEADBEEF; -struct LibOpusDecoder { - u32 magic; - bool initialized; - bool state_valid; - LibOpusDecoder* self; - u32 final_range; - void* decoder; -}; -static_assert(sizeof(LibOpusDecoder) == 32); - -static constexpr u32 DECODE_MULTISTREAM_OBJECT_MAGIC = 0xDEADBEEF; -struct LibOpusMultistreamDecoder { - u32 magic; - bool initialized; - bool state_valid; - LibOpusMultistreamDecoder* self; - u32 final_range; - void* decoder; -}; -static_assert(sizeof(LibOpusMultistreamDecoder) == 32); - -} diff --git a/src/audio_core/adsp/apps/opus/shared_memory.h b/src/audio_core/adsp/apps/opus/shared_memory.h index 45079c6292..b15a1837cc 100644 --- a/src/audio_core/adsp/apps/opus/shared_memory.h +++ b/src/audio_core/adsp/apps/opus/shared_memory.h @@ -6,6 +6,7 @@ #pragma once +#include "common/common_funcs.h" #include "common/common_types.h" namespace AudioCore::ADSP::OpusDecoder { diff --git a/src/audio_core/opus/hardware_opus.cpp b/src/audio_core/opus/hardware_opus.cpp index c07a358168..04591c10b6 100644 --- a/src/audio_core/opus/hardware_opus.cpp +++ b/src/audio_core/opus/hardware_opus.cpp @@ -10,18 +10,39 @@ #include "audio_core/audio_core.h" #include "audio_core/opus/hardware_opus.h" #include "core/core.h" -#include "core/hle/result.h" namespace AudioCore::OpusDecoder { - namespace { using namespace Service::Audio; + +static constexpr Result ResultCodeFromLibOpusErrorCode(u64 error_code) { + s32 error{static_cast(error_code)}; + ASSERT(error <= OPUS_OK); + switch (error) { + case OPUS_ALLOC_FAIL: + R_THROW(ResultLibOpusAllocFail); + case OPUS_INVALID_STATE: + R_THROW(ResultLibOpusInvalidState); + case OPUS_UNIMPLEMENTED: + R_THROW(ResultLibOpusUnimplemented); + case OPUS_INVALID_PACKET: + R_THROW(ResultLibOpusInvalidPacket); + case OPUS_INTERNAL_ERROR: + R_THROW(ResultLibOpusInternalError); + case OPUS_BUFFER_TOO_SMALL: + R_THROW(ResultBufferTooSmall); + case OPUS_BAD_ARG: + R_THROW(ResultLibOpusBadArg); + case OPUS_OK: + R_RETURN(ResultSuccess); + } + UNREACHABLE(); +} + } // namespace HardwareOpus::HardwareOpus(Core::System& system_) - : system{system_} - , opus_decoder{system.AudioCore().ADSP().OpusDecoder()} -{ + : system{system_}, opus_decoder{system.AudioCore().ADSP().OpusDecoder()} { opus_decoder.SetSharedMemory(shared_memory); } @@ -91,7 +112,7 @@ Result HardwareOpus::InitializeDecodeObject(u32 sample_rate, u32 channel_count, R_THROW(ResultInvalidOpusDSPReturnCode); } - R_RETURN(Result(u32(shared_memory.dsp_return_data[0]))); + R_RETURN(ResultCodeFromLibOpusErrorCode(shared_memory.dsp_return_data[0])); } Result HardwareOpus::InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count, @@ -119,7 +140,7 @@ Result HardwareOpus::InitializeMultiStreamDecodeObject(u32 sample_rate, u32 chan R_THROW(ResultInvalidOpusDSPReturnCode); } - R_RETURN(Result(u32(shared_memory.dsp_return_data[0]))); + R_RETURN(ResultCodeFromLibOpusErrorCode(shared_memory.dsp_return_data[0])); } Result HardwareOpus::ShutdownDecodeObject(void* buffer, u64 buffer_size) { @@ -133,7 +154,7 @@ Result HardwareOpus::ShutdownDecodeObject(void* buffer, u64 buffer_size) { "Expected Opus shutdown code {}, got {}", ADSP::OpusDecoder::Message::ShutdownDecodeObjectOK, msg); - R_RETURN(Result(u32(shared_memory.dsp_return_data[0]))); + R_RETURN(ResultCodeFromLibOpusErrorCode(shared_memory.dsp_return_data[0])); } Result HardwareOpus::ShutdownMultiStreamDecodeObject(void* buffer, u64 buffer_size) { @@ -148,7 +169,7 @@ Result HardwareOpus::ShutdownMultiStreamDecodeObject(void* buffer, u64 buffer_si "Expected Opus shutdown code {}, got {}", ADSP::OpusDecoder::Message::ShutdownMultiStreamDecodeObjectOK, msg); - R_RETURN(Result(u32(shared_memory.dsp_return_data[0]))); + R_RETURN(ResultCodeFromLibOpusErrorCode(shared_memory.dsp_return_data[0])); } Result HardwareOpus::DecodeInterleaved(u32& out_sample_count, void* output_data, @@ -172,12 +193,12 @@ Result HardwareOpus::DecodeInterleaved(u32& out_sample_count, void* output_data, R_THROW(ResultInvalidOpusDSPReturnCode); } - auto error_code = s32(shared_memory.dsp_return_data[0]); - if (error_code == ResultSuccess.raw) { - out_sample_count = u32(shared_memory.dsp_return_data[1]); + auto error_code{static_cast(shared_memory.dsp_return_data[0])}; + if (error_code == OPUS_OK) { + out_sample_count = static_cast(shared_memory.dsp_return_data[1]); out_time_taken = 1000 * shared_memory.dsp_return_data[2]; } - R_RETURN(Result(u32(error_code))); + R_RETURN(ResultCodeFromLibOpusErrorCode(error_code)); } Result HardwareOpus::DecodeInterleavedForMultiStream(u32& out_sample_count, void* output_data, @@ -186,27 +207,29 @@ Result HardwareOpus::DecodeInterleavedForMultiStream(u32& out_sample_count, void void* buffer, u64& out_time_taken, bool reset) { std::scoped_lock l{mutex}; - shared_memory.host_send_data[0] = u64(buffer); - shared_memory.host_send_data[1] = u64(input_data); + shared_memory.host_send_data[0] = (u64)buffer; + shared_memory.host_send_data[1] = (u64)input_data; shared_memory.host_send_data[2] = input_data_size; - shared_memory.host_send_data[3] = u64(output_data); + shared_memory.host_send_data[3] = (u64)output_data; shared_memory.host_send_data[4] = output_data_size; shared_memory.host_send_data[5] = 0; shared_memory.host_send_data[6] = reset; - opus_decoder.Send(ADSP::Direction::DSP, ADSP::OpusDecoder::Message::DecodeInterleavedForMultiStream); + opus_decoder.Send(ADSP::Direction::DSP, + ADSP::OpusDecoder::Message::DecodeInterleavedForMultiStream); auto msg = opus_decoder.Receive(ADSP::Direction::Host); if (msg != ADSP::OpusDecoder::Message::DecodeInterleavedForMultiStreamOK) { - LOG_ERROR(Service_Audio, "OpusDecoder returned invalid message. Expected {} got {}", ADSP::OpusDecoder::Message::DecodeInterleavedForMultiStreamOK, msg); + LOG_ERROR(Service_Audio, "OpusDecoder returned invalid message. Expected {} got {}", + ADSP::OpusDecoder::Message::DecodeInterleavedForMultiStreamOK, msg); R_THROW(ResultInvalidOpusDSPReturnCode); } - auto const error_code = shared_memory.dsp_return_data[0]; - if (error_code == ResultSuccess.raw) { + auto error_code{static_cast(shared_memory.dsp_return_data[0])}; + if (error_code == OPUS_OK) { out_sample_count = static_cast(shared_memory.dsp_return_data[1]); out_time_taken = 1000 * shared_memory.dsp_return_data[2]; } - R_RETURN(Result(u32(shared_memory.dsp_return_data[0]))); + R_RETURN(ResultCodeFromLibOpusErrorCode(error_code)); } Result HardwareOpus::MapMemory(void* buffer, u64 buffer_size) { @@ -217,7 +240,8 @@ Result HardwareOpus::MapMemory(void* buffer, u64 buffer_size) { opus_decoder.Send(ADSP::Direction::DSP, ADSP::OpusDecoder::Message::MapMemory); auto msg = opus_decoder.Receive(ADSP::Direction::Host); if (msg != ADSP::OpusDecoder::Message::MapMemoryOK) { - LOG_ERROR(Service_Audio, "OpusDecoder returned invalid message. Expected {} got {}", ADSP::OpusDecoder::Message::MapMemoryOK, msg); + LOG_ERROR(Service_Audio, "OpusDecoder returned invalid message. Expected {} got {}", + ADSP::OpusDecoder::Message::MapMemoryOK, msg); R_THROW(ResultInvalidOpusDSPReturnCode); } R_SUCCEED(); @@ -231,7 +255,8 @@ Result HardwareOpus::UnmapMemory(void* buffer, u64 buffer_size) { opus_decoder.Send(ADSP::Direction::DSP, ADSP::OpusDecoder::Message::UnmapMemory); auto msg = opus_decoder.Receive(ADSP::Direction::Host); if (msg != ADSP::OpusDecoder::Message::UnmapMemoryOK) { - LOG_ERROR(Service_Audio, "OpusDecoder returned invalid message. Expected {} got {}", ADSP::OpusDecoder::Message::UnmapMemoryOK, msg); + LOG_ERROR(Service_Audio, "OpusDecoder returned invalid message. Expected {} got {}", + ADSP::OpusDecoder::Message::UnmapMemoryOK, msg); R_THROW(ResultInvalidOpusDSPReturnCode); } R_SUCCEED(); diff --git a/src/audio_core/opus/hardware_opus.h b/src/audio_core/opus/hardware_opus.h index 26c96e00c0..b6c7fbe6c8 100644 --- a/src/audio_core/opus/hardware_opus.h +++ b/src/audio_core/opus/hardware_opus.h @@ -8,6 +8,8 @@ #include #include +#include + #include "audio_core/adsp/apps/opus/opus_decoder.h" #include "audio_core/adsp/apps/opus/shared_memory.h" #include "audio_core/adsp/mailbox.h" diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index e72fd791b9..508ace3501 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -1199,6 +1199,7 @@ else() endif() endif() +target_include_directories(core PRIVATE ${OPUS_INCLUDE_DIRS}) target_link_libraries(core PUBLIC common PRIVATE audio_core hid_core network video_core nx_tzdb tz) if (BOOST_NO_HEADERS) diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 06b77a2a8f..64d14ab2a6 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -414,7 +414,9 @@ endif() if (YUZU_USE_EXTERNAL_FFMPEG) add_dependencies(video_core ffmpeg-build) endif() + target_include_directories(video_core PUBLIC ${FFmpeg_INCLUDE_DIR}) + target_link_libraries(video_core PRIVATE ${FFmpeg_LIBRARIES}) target_link_options(video_core PRIVATE ${FFmpeg_LDFLAGS}) From 5adaa5b0f7e19df9bf9dbd883fe921dfe4952125 Mon Sep 17 00:00:00 2001 From: Feng Chen Date: Mon, 14 Sep 2026 16:44:52 +0200 Subject: [PATCH 038/128] [core] Fix MSVC handler table initialization (#4421) Construct FunctionInfoTyped at runtime instead of forcing constant initialization. This avoids malformed static handler tables when MSVC converts typed member-function pointers, particularly for entries with null handlers. - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4421 Reviewed-by: MaranBr Reviewed-by: lizzie --- src/core/hle/service/service.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h index df56b69847..ea98897e79 100644 --- a/src/core/hle/service/service.h +++ b/src/core/hle/service/service.h @@ -143,7 +143,7 @@ protected: /// @param expected_header_ request header in the command buffer which will trigger dispatch to this handler /// @param handler_callback_ member function in this service which will be called to handle the request /// @param name_ human-friendly name for the request. Used mostly for logging purposes. - constexpr FunctionInfoTyped(u32 expected_header_, HandlerFnP handler_callback_, const char* name_) + FunctionInfoTyped(u32 expected_header_, HandlerFnP handler_callback_, const char* name_) : FunctionInfoBase{expected_header_, HandlerFnP(handler_callback_), name_} {} }; using FunctionInfo = FunctionInfoTyped; From 1a48de6e55d6894722e5f235bc1fc14beb308e27 Mon Sep 17 00:00:00 2001 From: Eden CI Date: Mon, 14 Sep 2026 19:00:47 +0200 Subject: [PATCH 039/128] [dist, android] Update translations from Transifex for Sep 14 (#4423) Automatic translation update for Sep 14 Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4423 --- dist/languages/ar.ts | 1308 ++++++++-------- dist/languages/ca.ts | 1309 ++++++++-------- dist/languages/cs.ts | 1309 ++++++++-------- dist/languages/da.ts | 1307 ++++++++-------- dist/languages/de.ts | 1307 ++++++++-------- dist/languages/el.ts | 1307 ++++++++-------- dist/languages/es.ts | 1311 +++++++++-------- dist/languages/fi.ts | 1307 ++++++++-------- dist/languages/fr.ts | 1307 ++++++++-------- dist/languages/hu.ts | 1309 ++++++++-------- dist/languages/id.ts | 1307 ++++++++-------- dist/languages/it.ts | 1309 ++++++++-------- dist/languages/ja_JP.ts | 1309 ++++++++-------- dist/languages/ko_KR.ts | 1307 ++++++++-------- dist/languages/nb.ts | 1309 ++++++++-------- dist/languages/nl.ts | 1309 ++++++++-------- dist/languages/pl.ts | 1309 ++++++++-------- dist/languages/pt_BR.ts | 1309 ++++++++-------- dist/languages/pt_PT.ts | 1309 ++++++++-------- dist/languages/ru_RU.ts | 1307 ++++++++-------- dist/languages/sv.ts | 1308 ++++++++-------- dist/languages/tr_TR.ts | 1309 ++++++++-------- dist/languages/uk.ts | 1309 ++++++++-------- dist/languages/vi.ts | 1309 ++++++++-------- dist/languages/vi_VN.ts | 1309 ++++++++-------- dist/languages/zh_CN.ts | 1307 ++++++++-------- dist/languages/zh_TW.ts | 1309 ++++++++-------- .../app/src/main/res/values-ar/strings.xml | 34 +- .../app/src/main/res/values-ckb/strings.xml | 2 - .../app/src/main/res/values-cs/strings.xml | 3 - .../app/src/main/res/values-de/strings.xml | 5 - .../app/src/main/res/values-es/strings.xml | 9 +- .../app/src/main/res/values-fr/strings.xml | 3 - .../app/src/main/res/values-he/strings.xml | 2 - .../app/src/main/res/values-hu/strings.xml | 2 - .../app/src/main/res/values-id/strings.xml | 3 - .../app/src/main/res/values-it/strings.xml | 3 - .../app/src/main/res/values-ja/strings.xml | 2 - .../app/src/main/res/values-ko/strings.xml | 2 - .../app/src/main/res/values-nb/strings.xml | 2 - .../app/src/main/res/values-pl/strings.xml | 3 - .../src/main/res/values-pt-rBR/strings.xml | 3 - .../src/main/res/values-pt-rPT/strings.xml | 2 - .../app/src/main/res/values-ru/strings.xml | 30 +- .../app/src/main/res/values-sr/strings.xml | 2 - .../app/src/main/res/values-uk/strings.xml | 3 - .../app/src/main/res/values-vi/strings.xml | 2 - .../src/main/res/values-zh-rCN/strings.xml | 5 - .../src/main/res/values-zh-rTW/strings.xml | 115 +- 49 files changed, 19283 insertions(+), 16279 deletions(-) diff --git a/dist/languages/ar.ts b/dist/languages/ar.ts index 0daf86c725..cd37ef9739 100644 --- a/dist/languages/ar.ts +++ b/dist/languages/ar.ts @@ -591,12 +591,12 @@ FXAA can produce a more stable picture in lower resolutions. يُمكن لـ FXAA إنتاج صورة أكثر ثباتًا بدقة أقل. - + Fullscreen Mode: وضع ملء الشاشة: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -605,12 +605,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp قد يوفر وضع ملء الشاشة الحصري أداءً أفضل ودعمًا أفضل لتقنيتي Freesync/Gsync. - + Aspect Ratio: نسبة العرض إلى الارتفاع: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -619,48 +619,48 @@ Also controls the aspect ratio of captured screenshots. كما يتحكم في نسبة العرض إلى الارتفاع للقطات الشاشة الملتقطة. - + Use persistent pipeline cache استخدام ذاكرة التخزين المؤقتة الدائمة للأنابيب - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. يسمح بحفظ التظليلات في وحدة التخزين لتحميلها بشكل أسرع عند تشغيل اللعبة في المرات التالية. لا يُقصد من تعطيله سوى تصحيح الأخطاء. - + Use asynchronous GPU emulation استخدم محاكاة وحدة معالجة الرسومات غير المتزامنة - + Uses an extra CPU thread for rendering. This option should always remain enabled. يستخدم خيط معالجة إضافي للمعالجة الرسومية. يجب أن يبقى هذا الخيار مُفعّلاً دائماً. - + NVDEC emulation: NVDEC محاكاة: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. يُحدد كيفية فك تشفير الفيديوهات.يمكن استخدام وحدة المعالجة المركزية CPU أو وحدة معالجة الرسومات GPU لفك التشفير، أو عدم فك التشفير إطلاقًا (شاشة سوداء على الفيديوهات).في معظم الحالات، يُوفر فك تشفير وحدة معالجة الرسومات GPU أفضل أداء. - + ASTC Decoding Method: ASTC طريقة فك تشفير: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -672,12 +672,12 @@ stuttering but may present artifacts. وحدة المعالجة المركزية بشكل غير متزامن: استخدمها لفك تشفير قوام ASTC عند الطلب. يزيل هذا الخيار تقطع فك تشفير ASTC، ولكنه قد يُظهر بعض العيوب. - + ASTC Recompression Method: ASTC طريقة إعادة ضغط: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -685,44 +685,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3: سيتم إعادة ضغط الصيغة الوسيطة إلى صيغة BC1 أو BC3، مما يوفر مساحة على ذاكرة الوصول العشوائي للفيديو VRAM ولكنه يُضعف جودة الصورة. - + Frame Pacing Mode (Vulkan only) (Vulkan فقط) وضع توقيت الإطارات - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. يتحكم في كيفية إدارة المحاكي لسرعة الإطارات لتقليل التقطع وجعل معدل الإطارات أكثر سلاسة واتساقًا. - + VRAM Usage Mode: VRAM وضع استهلاك: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. يُحدد ما إذا كان ينبغي على المُحاكي تفضيل توفير الذاكرة أو الاستفادة القصوى من ذاكرة الفيديو المُتاحة لتحسين الأداء. قد يؤثر الوضع المُكثّف على أداء تطبيقات أخرى، مثل برامج التسجيل. - + Skip CPU Inner Invalidation تخطي إبطال وحدة المعالجة المركزية الداخلية - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. يتخطى بعض عمليات إبطال ذاكرة التخزين المؤقتة أثناء تحديثات الذاكرة، مما يقلل من استخدام وحدة المعالجة المركزية ويحسّن زمن الوصول. قد يؤدي هذا إلى أعطال مؤقتة. - + VSync Mode: VSync وضع: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -733,12 +733,12 @@ Immediate (no synchronization) presents whatever is available and can exhibit te يُظهر الوضع الفوري (بدون مزامنة) كل ما هو متاح، وقد يُظهر تمزقًا. - + Sync Memory Operations مزامنة عمليات الذاكرة - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -747,44 +747,44 @@ Unreal Engine 4 games often see the most significant changes thereof. التغييرات الأكثر أهمية Unreal Engine 4 غالبًا ما تشهد ألعاب. - + Enable asynchronous presentation (Vulkan only) (Vulkan فقط) تمكين العرض التقديمي غير المتزامن - + Slightly improves performance by moving presentation to a separate CPU thread. تحسين الأداء بشكل طفيف عن طريق نقل العرض التقديمي إلى مؤشر ترابط منفصل في وحدة المعالجة المركزية. - + Force maximum clocks (Vulkan only) (Vulkan فقط) فرض الحد الأقصى للساعات - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. يعمل في الخلفية أثناء انتظار أوامر الرسومات لمنع وحدة معالجة الرسومات من خفض سرعة الساعة. - + Anisotropic Filtering: الترشيح المتباين الخواص: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. يتحكم بجودة عرض الملمس بزوايا مائلة. من الآمن ضبطه على 16x على معظم وحدات معالجة الرسومات. - + GPU Mode: وضع وحدة معالجة الرسومات: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -793,12 +793,12 @@ Particles tend to only render correctly with Accurate mode. لا تُعرض الجسيمات بشكل صحيح إلا في وضع «دقيق». - + DMA Accuracy: DMA دقة: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -807,12 +807,12 @@ Default follows the GPU Accuracy setting. يُتبع الإعداد الافتراضي إعداد «دقة وحدة معالجة الرسومات» - + GPU Fence Behavior: :سلوك حاجز وحدة معالجة الرسومات - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -827,56 +827,56 @@ Default follows the GPU Accuracy setting. الإعداد الافتراضي يتبع إعداد دقة وحدة معالجة الرسومات. - + Enable GPU buffer readback تفعيل قراءة مخزن وحدة معالجة الرسومات - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. يحافظ على البيانات المعدلة بواسطة وحدة معالجة الرسومات عن طريق قراءتها قبل رفعها. بعض الألعاب تحتاج هذا لعرض تأثيرات معينة بشكل صحيح. - + Enable asynchronous shader compilation تفعيل تجميع التظليل غير المتزامن - + May reduce shader stutter. قد يقلل من تقطع التظليل. - + GPU Clocks سرعات معالج الرسوميات - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. يجعل اللعبة تعتقد أن عمل وحدة معالجة الرسومات ينتهي بشكل أسرع مما هو عليه في الواقع، لذلك تتوقف عن خفض الدقة ومسافة العرض لتتناسب مع سرعات جهاز Switch. - + GPU Unswizzle إلغاء ترتيب بيانات وحدة معالجة الرسومات - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. باستخدام حوسبة وحدة معالجة الرسومات BCn 3D يسرع فك تشفير نسيج. قم بتعطيله في حالة حدوث أعطال أو مشاكل في الرسومات. - + GPU Unswizzle Max Texture Size الحد الأقصى لحجم النسيج في وحدة معالجة الرسومات بعد إعادة ترتيب البيانات - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -885,48 +885,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size حجم تدفق إلغاء ترتيب بيانات وحدة معالجة الرسومات - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. يحدد الحد الأقصى لكمية بيانات النسيج (بالميغابايت) التي تتم معالجتها لكل إطار. يمكن أن تقلل القيم الأعلى من التقطع أثناء تحميل النسيج، ولكنها قد تؤثر على اتساق الإطارات. - + GPU Unswizzle Chunk Size حجم كتلة إلغاء ترتيب بيانات وحدة معالجة الرسومات - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. يُحدد هذا الخيار عدد شرائح العمق التي تتم معالجتها في عملية إرسال واحدة. زيادة هذا الخيار قد تُحسّن الإنتاجية على وحدات معالجة الرسومات المتطورة، ولكنها قد تُسبب أخطاء في إعادة تعيين وقت الاستجابة أو انقطاع الاتصال ببرنامج التشغيل على الأجهزة ذات المواصفات الأقل. - + Use Vulkan pipeline cache Vulkan استخدام ذاكرة التخزين المؤقتة لخط أنابيب - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. يُفعّل ذاكرة التخزين المؤقت لخطوط الأنابيب الخاصة ببائع وحدة معالجة الرسومات. بتخزين ملفات ذاكرة التخزين المؤقتة للخطوط الداخلية Vulkan يمكن أن يؤدي هذا الخيار إلى تحسين وقت تحميل التظليل بشكل كبير في الحالات التي لا يقوم فيها برنامج تشغيل. - + Enable Compute Pipelines (Intel Vulkan Only) (Intel Vulkan فقط) تمكين خطوط أنابيب الحوسبة - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -935,192 +935,192 @@ Compute pipelines are always enabled on all other drivers. خطوط أنابيب الحوسبة مفعلة دائمًا على جميع برامج التشغيل الأخرى. - + Enable Reactive Flushing تمكين التنظيف التفاعلي - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. يستخدم التنظيف التفاعلي بدلاً من التنظيف التنبئي، مما يسمح بمزامنة الذاكرة بشكل أكثر دقة. - + Sync to framerate of video playback المزامنة مع معدل الإطارات لتشغيل الفيديو - + Run the game at normal speed during video playback, even when the framerate is unlocked. قم بتشغيل اللعبة بالسرعة العادية أثناء تشغيل الفيديو، حتى عندما يكون معدل الإطارات مفتوحًا. - + Barrier feedback loops حلقات التغذية الراجعة للحواجز - + Improves rendering of transparency effects in specific games. يحسن عرض تأثيرات الشفافية في بعض الألعاب المحددة. - + Enable buffer history تمكين سجل التخزين المؤقت - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. يُتيح هذا الخيار الوصول إلى حالات التخزين المؤقت السابقة. وقد يُحسّن جودة العرض وثبات الأداء في بعض الألعاب. - + Fix bloom effects إصلاح تأثيرات التوهج - + Removes bloom in Burnout. يزيل التوهج في وضع الاحتراق. - + Enable Legacy Rescale Pass تفعيل ميزة إعادة التحجيم القديمة - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. قد يصلح مشاكل إعادة القياس في بعض الألعاب بالاعتماد على سلوك من التنفيذ السابق. حل لسلوك قديم يصلح تشوهات الخطوط على بطاقات AMD وIntel الرسومية، ووميض النسيج الرمادي على بطاقات Nvidia الرسومية في لعبة Luigi's Mansion 3. - + Extended Dynamic State الحالة الديناميكية الموسعة - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. يتحكم في عدد الميزات التي يمكن استخدامها في الحالة الديناميكية الموسعة.تسمح الحالات الأعلى بمزيد من الميزات ويمكن أن تزيد من الأداء، ولكنها قد تسبب مشكلات رسومية إضافية. - + Vertex Input Dynamic State حالة ديناميكية لإدخال الرأس - + Enables vertex input dynamic state feature for better quality and performance. يتيح ميزة الحالة الديناميكية لإدخال الرأس لتحسين الجودة والأداء. - + Sample Shading تظليل العينة - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. يسمح لمظلل الأجزاء بالتنفيذ لكل عينة في جزء متعدد العينات بدلاً من مرة واحدة لكل جزء. يحسن جودة الرسومات على حساب الأداء. القيم الأعلى تحسن الجودة ولكنها تقلل من الأداء. - + RNG Seed مولد الأرقام العشوائية - + Controls the seed of the random number generator. Mainly used for speedrunning. يتحكم في بذرة مولد الأرقام العشوائية. يُستخدم بشكل رئيسي في سباقات السرعة. - + Device Name اسم الجهاز - + The name of the console. اسم وحدة التحكم. - + Homebrew Args Homebrew وسائط - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). (noglsl -مثل) عند التشغيل Homebrew سطر الأوامر الوسائط المُمررة إلى - + Custom RTC Date: المخصص RTC تاريخ: - + This option allows to change the clock of the console. Can be used to manipulate time in games. يتيح لك هذا الخيار تغيير ساعة وحدة التحكم. يمكن استخدامه للتحكم بالوقت في الألعاب. - + The number of seconds from the current unix time عدد الثواني من وقت يونكس الحالي - + Language: اللغة: - + This option can be overridden when region setting is auto-select يمكن تجاوز هذا الخيار عند تحديد إعداد المنطقة تلقائيًا - + Region: المنطقة: - + The region of the console. منطقة وحدة التحكم. - + Time Zone: المنطقة الزمنية: - + The time zone of the console. المنطقة الزمنية لوحدة التحكم. - + Sound Output Mode: وضع إخراج الصوت: - + Console Mode: وضع وحدة التحكم: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1129,1042 +1129,1042 @@ Setting to Handheld can help improve performance for low end systems. يُمكن أن يُساعد الضبط على الوضع المحمول على تحسين أداء الأجهزة منخفضة المواصفات. - + Prompt for user profile on boot المطالبة بملف تعريف المستخدم عند التشغيل - + Useful if multiple people use the same PC. مفيد إذا كان هناك عدة أشخاص يستخدمون نفس الكمبيوتر. - + Pause when not in focus توقف عند عدم التركيز - + Pauses emulation when focusing on other windows. يوقف المحاكاة عند التركيز على نوافذ أخرى. - + Confirm before stopping emulation تأكيد قبل إيقاف المحاكاة - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. يتجاوز المطالبات التي تطلب تأكيد إيقاف المحاكاة. يؤدي تمكينه إلى تجاوز هذه المطالبات والخروج مباشرة من المحاكاة. - + Hide mouse on inactivity إخفاء الماوس عند عدم النشاط - + Hides the mouse after 2.5s of inactivity. يخفي الماوس بعد 2.5 ثانية من عدم النشاط. - + Disable controller applet تعطيل تطبيق التحكم - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. يُعطّل استخدام أداة التحكم في البرامج المُحاكاة قسرًا. عند محاولة أي برنامج فتح أداة التحكم، تُغلق فورًا. - + Check for updates التحقق من توفر التحديثات - + Whether or not to check for updates upon startup. ما إذا كان يجب التحقق من التحديثات عند بدء التشغيل أم لا. - + Enable Gamemode تمكين وضع اللعبة - + Force X11 as Graphics Backend كخلفية رسومات X11 فرض - + Custom frontend الواجهة الأمامية المخصصة - + Real applet تطبيق صغير حقيقي - + Never أبداً - + On Load عند التحميل - + Always دائماً - + CPU وحدة المعالجة المركزية - + GPU وحدة معالجة الرسومات - + CPU Asynchronous وحدة المعالجة المركزية غير المتزامنة - + Uncompressed (Best quality) Uncompressed (أفضل جودة) - + BC1 (Low quality) BC1 (جودة منخفضة) - + BC3 (Medium quality) BC3 (جودة متوسطة) - - + + Auto تلقائي - + 30 FPS 30 إطارًا في الثانية - + 60 FPS 60 إطارًا في الثانية - + 90 FPS 90 إطارًا في الثانية - + 120 FPS 120 إطارًا في الثانية - + Conservative محافظ - + Aggressive عدواني - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null لا شيء - + Fast سريع - - - + + + Accurate دقه - - - + + + Default افتراضي - + Unsafe (fast) غير آمن (سريع) - + Safe (stable) آمن (مستقر) - + Immediate فوري - + Balanced متوازن - + Strict صارم - + Unsafe غير آمن - + Paranoid (disables most optimizations) جنون العظمة (يعطل معظم التحسينات) - + Debugging تصحيح الأخطاء - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed نافذة بلا حدود - + Exclusive Fullscreen شاشة كاملة حصرية - + No Video Output لا يوجد إخراج فيديو - + CPU Video Decoding فك تشفير فيديو وحدة المعالجة المركزية - + GPU Video Decoding (Default) فك تشفير فيديو وحدة معالجة الرسومات (افتراضي) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [تجريبي] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [تجريبي] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [تجريبي] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [تجريبي] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [تجريبي] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution دقة فائقة للألعاب من سنابدراغون - + Snapdragon Game Super Resolution EdgeDir دقة فائقة للألعاب من سنابدراغون EdgeDir - + None لا شيء - + FXAA FXAA - + SMAA SMAA - + Default (16:9) (16:9) افتراضي - + Force 4:3 4:3 فرض - + Force 21:9 21:9 فرض - + Force 16:10 16:10 فرض - + Stretch to Window تمديد إلى النافذة - + Automatic تلقائي - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) اليابانية (日本語) - + American English الإنجليزية الأمريكية - + French (français) الفرنسية (français) - + German (Deutsch) الألمانية (Deutsch) - + Italian (italiano) الإيطالية (Italiano) - + Spanish (español) الإسبانية (español) - + Chinese الصينية - + Korean (한국어) الكورية (한국어) - + Dutch (Nederlands) الهولندية (Nederlands) - + Portuguese (português) البرتغالية (Português) - + Russian (Русский) الروسية (Русский) - + Taiwanese تايواني - + British English الإنكليزية البريطانية - + Canadian French الكندية الفرنسية - + Latin American Spanish أمريكا اللاتينية الإسبانية - + Simplified Chinese الصينية المبسطة - + Traditional Chinese (正體中文) الصينية التقليدية (正體中文) - + Brazilian Portuguese (português do Brasil) البرتغالية البرازيلية (português do Brasil) - + Polish (polska) البولندية (polska) - + Thai (แบบไทย) التايلاندية (แบบไทย) - - + + Japan اليابان - + USA الولايات المتحدة الأمريكية - + Europe أوروبا - + Australia أستراليا - + China الصين - + Korea كوريا - + Taiwan تايوان - + Auto (%1) Auto select time zone تلقائي (%1) - + Default (%1) Default time zone افتراضي (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Poland - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkey - + UCT UCT - + Universal عالمي - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono أحادي - + Stereo مجسم - + Surround محيطي - + 4GB DRAM (Default) 4GB DRAM (افتراضي) - + 6GB DRAM (Unsafe) 6GB DRAM (غير آمنة) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (غير آمنة) - + 12GB DRAM (Unsafe) 12GB DRAM (غير آمنة) - + Docked الإرساء - + Handheld محمول - - + + Normal طبيعي - - + + Boost تعزيز - - + + Overclock كسر السرعة - + Always ask (Default) اسأل دائمًا (افتراضي) - + Only if game specifies not to stop فقط إذا حددت اللعبة عدم التوقف - + Never ask لا تسأل أبدا - + Very Small (16 MB) صغير جدًا (16 ميغابايت) - + Small (32 MB) صغير (32 ميغابايت) - + Normal (128 MB) قياسي (128 ميغابايت) - + Large (256 MB) كبير (256 ميغابايت) - + Very Large (512 MB) كبير جدًا (512 ميغابايت) - + Very Low (4 MB) منخفض جدًا (4 ميغابايت) - + Low (8 MB) منخفض (8 ميغابايت) - + Normal (16 MB) قياسي (16 ميغابايت) - + Medium (32 MB) متوسط (32 ميغابايت) - + High (64 MB) عالي (64 ميغابايت) - + Very Low (32) منخفض جدًا (32) - + Low (64) منخفض (64) - + Normal (128) قياسي (128) - + Medium (256) متوسط (256) - + High (512) عالي (512) - + Disabled معطل - + ExtendedDynamicState 1 الحالة الديناميكية الممتدة 1 - + ExtendedDynamicState 2 الحالة الديناميكية الممتدة 2 - + ExtendedDynamicState 3 الحالة الديناميكية الممتدة 3 - + Tree View عرض قائمة - + Grid View عرض شبكة @@ -4908,6 +4908,116 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t &فتح في مدير الملفات + + ConfigurePostProcessing + + + Post-Processing Effects + تأثيرات ما بعد المعالجة + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + Enable post-processing + تفعيل المعالجة اللاحقة + + + + Preset: + الإعداد المسبق: + + + + Apply + تطبيق + + + + Reset Values + إعادة تعيين القيم + + + + Return every effect to the values the preset ships with. + إعادة كل تأثير إلى القيم التي تأتي بها الإعدادات المسبقة. + + + + Save As... + حفظ باسم... + + + + Save Preset + حفظ الإعداد المسبق + + + + Preset name: + اسم الإعداد المسبق: + + + + Delete + حذف + + + + Add Effect + إضافة تأثير + + + + Custom chain. Pick a preset above and press Apply to replace it. + سلسلة مخصصة. اختر إعدادًا مسبقًا أعلاه واضغط على تطبيق لاستبداله. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + الإعداد المسبق النشط: 1% (معدّل). اضغط على إعادة تعيين القيم للعودة إلى الإعدادات الافتراضية. + + + + Active preset: %1 + الإعداد المسبق النشط: 1% + + + + Enabled + تفعيل + + + + Disabled + تعطيل + + + + Reset to defaults + إعادة التعيين إلى الإعدادات الافتراضية + + + + Effect '%1' was not found. + لم يتم العثور على التأثير '1%'. + + + + Effect failed to compile: +%1 + فشل تجميع التأثير: +%1 + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + ConfigureProfileManager @@ -5995,50 +6105,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL غير متوفر! - + OpenGL shared contexts are not supported. OpenGL لا يتم دعم السياقات المشتركة - + Eden has not been compiled with OpenGL support. OpenGL لم يتم تجميع إيدن بدعم - - - + + + Error while initializing OpenGL! OpenGL حدث خطأ أثناء تهيئة - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. أو قد لا يكون لديك أحدث برنامج تشغيل للرسومات OpenGL قد لا تدعم بطاقة الرسومات الخاصة بك - + Error while initializing OpenGL 4.6! OpenGL 4.6 حدث خطأ أثناء تهيئة - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 أو قد لا يكون لديك أحدث برنامج تشغيل للرسومات OpenGL 4.6 قد لا تدعم بطاقة الرسومات الخاصة بك.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 قد لا تدعم وحدة معالجة الرسومات لديك ملحقًا واحدًا أو أكثر من ملحقات OpenGL المطلوبة. يُرجى التأكد من تثبيت أحدث برنامج تشغيل للرسومات.<br><br>GL Renderer:<br>1%<br><br>إضافات غير مدعومة: <br>2% - + This build doesn't have OpenGL support. هذا الإصدار لا يدعم OpenGL. @@ -6860,42 +6970,42 @@ Debug Message: 1080p إعادة تعيين حجم النافذة إلى - + &Multiplayer &متعدد اللاعبين - + &Tools &أدوات - + Am&iibo أم&يبو - + Launch &Applet تشغيل &التطبيق المصغر - + &TAS &TAS - + &Create Home Menu Shortcut &إنشاء اختصار لقائمة الشاشة الرئيسية - + Install &Firmware تثبيت &الفيرموير - + &Help &مساعدة @@ -6921,7 +7031,7 @@ Debug Message: - + &Pause &إيقاف مؤقت @@ -7022,578 +7132,578 @@ Debug Message: - Open &Quickstart Guide - دليل &البدء السريع + &User Handbook + &دليل المستخدم - - &FAQ - &الأسئلة الشائعة - - - + &Capture Screenshot &التقاط لقطة للشاشة - + &Album &الألبوم - + &Set Nickname and Owner &تعيين الاسم المستعار والمالك - + &Delete Game Data حذف بيانات اللعبة - + &Restore Amiibo &استعادة أميبو - + &Format Amiibo &تنسيق أميبو - + &Mii Editor &Mii محرر - + &Configure TAS... &TAS إعدادات - + Configure C&urrent Game... إعدادات اللعبة ال&حالية - - + + &Start &بدء - + &Reset &إعادة تعيين - - + + R&ecord ت&سجيل - + Open &Controller Menu &قائمة ذراع التحكم - + Install Decryption &Keys تثبيت &مفاتيح فك التشفير - + &Home Menu &القائمة الرئيسية - + &Desktop &سطح المكتب - + &Application Menu &قائمة التطبيقات - + &Root Data Folder &مجلد البيانات الرئيسي - + &NAND Folder &مجلد الذاكرة الداخلية - + &SDMC Folder &مجلد بطاقة الذاكرة - + &Mod Folder &مجلد التعديلات - + &Log Folder &مجلد السجلات - + From Folder من مجلد - + From ZIP من ملف مضغوط - + &Eden Dependencies &تبعيات إيدن - + &Data Manager &إدارة البيانات - + &Tree View &عرض قائمة - + &Grid View &عرض شبكة - + Game Icon Size حجم أيقونة اللعبة - - + + None لا شيء - + Show Game &Name عرض اسم &اللعبة - + Show &Performance Overlay عرض &طبقة الأداء + + + Post-Processing &Shaders... + المعالجة اللاحقة &الظلال... + &Carousel View &عرض دائري - + Small (32x32) صغير (32x32) - + Standard (64x64) قياسي (64x64) - + Large (128x128) كبير (128x128) - + Full Size (256x256) حجم كامل (256x256) - + Broken Vulkan Installation Detected Vulkan تم الكشف عن تلف في تثبيت - + Vulkan initialization failed during boot. أثناء التشغيل Vulkan فشل تهيئة. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping تشغيل لعبة - + Loading Web Applet... جارٍ تحميل تطبيق الويب... - + Disable Web Applet تعطيل تطبيق الويب - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) قد يؤدي تعطيل أداة الويب إلى سلوك غير محدد، ويجب استخدامه فقط مع لعبة Super Mario 3D All-Stars. هل أنت متأكد من رغبتك في تعطيل أداة الويب؟ (يمكن إعادة تفعيلها في إعدادات التصحيح.) - + The amount of shaders currently being built كمية التظليلات التي يتم بناؤها حاليًا - + The current selected resolution scaling multiplier. مضاعف قياس الدقة المحددة حالياً. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Switch سرعة المحاكاة الحالية. تشير القيم الأعلى أو الأقل من 100٪ إلى أن المحاكاة تعمل بشكل أسرع أو أبطأ من. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. عدد الإطارات في الثانية التي تعرضها اللعبة حاليًا. يختلف هذا العدد من لعبة إلى أخرى ومن مشهد إلى آخر. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. الوقت المستغرق لمحاكاة إطار على جهاز سويتش، بدون احتساب تحديد الإطارات أو المزامنة العمودية. لمحاكاة بسرعة كاملة، يجب أن يكون هذا في حدود 16.67 مللي ثانية كحد أقصى. - + Unmute إلغاء كتم الصوت - + Mute كتم الصوت - + Reset Volume إعادة تعيين مستوى الصوت - + &Clear Recent Files &مسح الملفات الحديثة - + &Continue &متابعة - + Warning: Outdated Game Format تحذير: تنسيق اللعبة قديم - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. أنت تستخدم تنسيق مجلد ROM المُفكك لهذه اللعبة، وهو تنسيق قديم استُبدل بآخر مثل NCA وNAX وXCI وNSP. تفتقر مجلدات ROM المُفككة إلى الأيقونات والبيانات الوصفية ودعم التحديثات. <br>لتوضيح تنسيقات Switch المختلفة التي يدعمها Eden، يُرجى مراجعة دليل المستخدم. لن تظهر هذه الرسالة مرة أخرى. - - + + Error while loading ROM! ROM خطأ أثناء تحميل - + The ROM format is not supported. غير مدعوم ROM تنسيق. - + An error occurred initializing the video core. حدث خطأ أثناء تهيئة نواة الفيديو. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - واجه إيدن خطأً أثناء تشغيل نواة الفيديو. عادةً ما يكون السبب هو برامج تشغيل وحدة معالجة الرسومات القديمة، بما في ذلك المدمجة منها. يُرجى مراجعة السجل لمزيد من التفاصيل. لمزيد من المعلومات حول الوصول إلى السجل، يُرجى زيارة الصفحة التالية: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>كيفيه رفع سجلات الإخطاء</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. + عادةً ما يحدث هذا بسبب برامج تشغيل بطاقة الرسوميات GPU القديمة. يرجى الاطلاع على ملف السجل لمزيد من التفاصيل. انظر: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'> كيفية الوصول إلى ملفات السجل</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. حدث خطأ أثناء تحميل ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Discord/Stoat يرجى إعادة تحميل ملفاتك أو طلب المساعدة على - + An unknown error occurred. Please see the log for more details. حدث خطأ غير معروف. يرجى الاطلاع على السجل لمزيد من التفاصيل. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... جارٍ إغلاق البرنامج... - + Save Data بيانات الحفظ - + Mod Data بيانات التعديل - + Error Opening %1 Folder خطأ في فتح المجلد %1 - - + + Folder does not exist! المجلد غير موجود! - + Remove Installed Game Contents? إزالة محتويات اللعبة المثبتة؟ - + Remove Installed Game Update? إزالة تحديث اللعبة المثبت؟ - + Remove Installed Game DLC? إزالة المحتوى القابل للتنزيل المثبت للعبة؟ - + Remove Entry إزالة الإدخال - + Delete OpenGL Transferable Shader Cache? OpenGL Shader حذف ذاكرة التخزين المؤقتة القابلة للنقل لـ - + Delete Vulkan Transferable Shader Cache? Vulkan Shader حذف ذاكرة التخزين المؤقتة القابلة للنقل لـ - + Delete All Transferable Shader Caches? حذف جميع مخازن ذاكرة التظليل القابلة للنقل؟ - + Remove Custom Game Configuration? إزالة إعدادات اللعبة المخصص؟ - + Remove Cache Storage? إزالة ذاكرة التخزين المؤقتة؟ - + Remove File إزالة الملف - + Remove Play Time Data إزالة بيانات زمن اللعب - + Reset play time? إعادة تعيين زمن اللعب؟ - - + + RomFS Extraction Failed! RomFS فشل استخراج - + There was an error copying the RomFS files or the user cancelled the operation. أو قام المستخدم بإلغاء العملية RomFS حدث خطأ أثناء نسخ ملفات - + Full كامل - + Skeleton Skeleton - + Select RomFS Dump Mode RomFS حدد وضع تفريغ - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. الرجاء تحديد الطريقة التي تريد بها تفريغ RomFS. <br>سيتم نسخ جميع الملفات إلى المجلد الجديد في أثناء <br>قيام الهيكل العظمي بإنشاء بنية المجلد فقط. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root لا توجد مساحة فارغة كافية في %1 لاستخراج نظام الملفات RomFS. يُرجى تحرير مساحة أو اختيار مجلد تفريغ آخر من: المحاكاة > التكوين > النظام > نظام الملفات > تفريغ الجذر. - + Extracting RomFS... RomFS استخراج... - - + + Cancel إلغاء - + RomFS Extraction Succeeded! بنجاح RomFS تم استخراج! - + The operation completed successfully. تمت العملية بنجاح. - + Error Opening %1 خطأ في فتح %1 - + Select Directory حدد المجلد - + Properties خصائص - + The game properties could not be loaded. تعذر تحميل خصائص اللعبة. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. تشغيل الملف القابل للتنفيذ (%1)؛؛جميع الملفات (*.*) - + Load File تحميل الملف - + Open Extracted ROM Directory المستخرج ROM فتح ملف - + Invalid Directory Selected تم تحديد مجلد غير صالح - + The directory you have selected does not contain a 'main' file. لا يحتوي المجلد الذي حددته على ملف رئيسي - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files تثبيت الملفات - + %n file(s) remaining %n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية - + Installing file "%1"... تثبيت الملف ”%1“... - - + + Install Results نتائج التثبيت - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. لتجنب أي تعارضات محتملة، ننصح المستخدمين بعدم تثبيت الألعاب الأساسية على الذاكرة الداخلية. يرجى استخدام هذه الميزة فقط لتثبيت التحديثات والمحتوى القابل للتنزيل. - + %n file(s) were newly installed %n تم تثبيت ملف (ملفات) جديدة @@ -7605,7 +7715,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten %n تم استبدال ملف (ملفات) @@ -7617,7 +7727,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install %n فشل تثبيت ملف (ملفات) @@ -7629,314 +7739,314 @@ Please, only use this feature to install updates and DLC. - + System Application تطبيق النظام - + System Archive أرشيف النظام - + System Application Update تحديث تطبيق النظام - + Firmware Package (Type A) حزمة الفيرموير (النوع أ) - + Firmware Package (Type B) حزمة الفيرموير (النوع ب) - + Game لعبة - + Game Update تحديث اللعبة - + Game DLC الخاص باللعبة DLC الـ - + Delta Title Delta عنوان - + Select NCA Install Type... NCA حدد نوع تثبيت... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) يرجى تحديد نوع اللعبة التي ترغب في تثبيت NCA عليها: (في معظم الحالات، يكون الإعداد الافتراضي "لعبة" مناسبًا.) - + Failed to Install فشل التثبيت - + The title type you selected for the NCA is invalid. غير صالح NCA نوع العنوان الذي حددته لـ. - + File not found لم يتم العثور على الملف - + File "%1" not found لم يتم العثور على الملف "%1" - + OK موافق - + Function Disabled الوظيفة معطلة - + Compatibility list reporting is currently disabled. Check back later! تقارير قائمة التوافق معطلة حاليًا. يرجى التحقق لاحقًا! - + Error opening URL خطأ في فتح الرابط - + Unable to open the URL "%1". تعذر فتح الرابط ”%1“ - + TAS Recording TAS تسجيل - + Overwrite file of player 1? الكتابة فوق ملف اللاعب 1؟ - + Invalid config detected تم اكتشاف إعدادات غير صالح - + Handheld controller can't be used on docked mode. Pro controller will be selected. لا يمكن استخدام وحدة التحكم المحمولة في وضع الإرساء. سيتم اختيار وحدة تحكم احترافية. - - + + Amiibo أميبو - - + + The current amiibo has been removed تمت إزالة أميبو الحالي. - + Error خطأ - - + + The current game is not looking for amiibos اللعبة الحالية لا تبحث عن أميبو - + Amiibo File (%1);; All Files (*.*) جميع الملفات (%1)؛؛ ملف أميبو (*.*) - + Load Amiibo تحميل أميبو - + Error loading Amiibo data خطأ أثناء تحميل بيانات أميبو - + The selected file is not a valid amiibo الملف المحدد ليس أميبو صالح - + The selected file is already on use الملف المحدد قيد الاستخدام بالفعل - + An unknown error occurred حدث خطأ غير معروف - + No firmware available لا يوجد فيرموير متوفر - + Firmware Corrupted الفيرموير تالف - + Unknown applet تطبيق غير معروف - + Applet doesn't map to a known value. لا يرتبط التطبيق المصغر بقيمة معروفة. - + Record not found لم يتم العثور على السجل - + Applet not found. Please reinstall firmware. لم يتم العثور على التطبيق المصغر. يرجى إعادة تثبيت الفيرموير. - + Capture Screenshot التقاط لقطة شاشة - + PNG Image (*.png) PNG Image (*.png) - + TAS state: Running %1/%2 حالة TAS: تشغيل %1/%2 - + TAS state: Recording %1 حالة TAS: تسجيل %1 - + TAS state: Idle %1/%2 حالة TAS: خامل %1/%2 - + TAS State: Invalid حالة TAS: غير صالحة - + &Stop Running &إيقاف التشغيل - + Stop R&ecording إيقاف ال&تسجيل - + Building: %n shader(s) بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات) - + Scale: %1x %1 is the resolution scaling factor الدقة: %1x - + Speed: %1% / %2% السرعة: %1% / %2% - + Speed: %1% السرعة: %1% - + Game: %1 FPS اللعبة: %1 FPS - + Frame: %1 ms الإطار: %1 ms - + NO AA NO AA - + VOLUME: MUTE الصوت: كتم الصوت - + VOLUME: %1% Volume percentage (e.g. 50%) %1% :الصوت - + Derivation Components Missing مكونات الاشتقاق مفقودة - + Decryption keys are missing. Install them now? مفاتيح فك التشفير مفقودة. هل تريد تثبيتها الآن؟ - + Wayland Detected! Wayland تم الكشف عن - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7947,74 +8057,74 @@ Would you like to force it for future launches? هل ترغب في فرض استخدامه في عمليات التشغيل المستقبلية؟ - + Use X11 X11 استخدم - + Continue with Wayland Wayland متابعة مع - + Don't show again لا تعرض مرة أخرى - + Restart Required إعادة التشغيل مطلوبة - + Restart Eden to apply the X11 backend. X11 أعد تشغيل إيدن لتطبيق الخلفية - + Slow بطيء - + Turbo تيربو - + Unlocked إلغاء القفل - + Select RomFS Dump Target RomFS حدد هدف تفريغ - + Please select which RomFS you would like to dump. الذي تريد تفريغه RomFS الرجاء تحديد - + Are you sure you want to close Eden? هل أنت متأكد من أنك تريد إغلاق إيدن؟ - - - + + + Eden إيدن - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. هل أنت متأكد من أنك تريد إيقاف المحاكاة؟ سيتم فقدان أي تقدم لم يتم حفظه. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9216,41 +9326,41 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. - اللعبة التي تحاول تشغيلها تتطلب فيرموير للتشغيل أو لتجاوز قائمة الفتح. يُرجى <a href='https://yuzu-mirror.github.io/help/quickstart'>تفريغ فيرموير وتثبيتها</a>، أو اضغط "حسنًا" للعب على أي حال + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. + قد تتطلب هذه اللعبة برنامجاً ثابتاً لتعمل بشكل صحيح، ولم يتم تثبيت أي منها لديك. يرجى تثبيت البرنامج الثابت قبل التشغيل، أو الضغط على "موافق" للتشغيل على أية حال. - + Installing Firmware... تثبيت الفيرموير... - - - - - + + + + + Cancel إلغاء - + Firmware Install Failed فشل تثبيت الفيرموير - + Firmware Install Succeeded تم تثبيت الفيرموير بنجاح - + Firmware integrity verification failed! فشل التحقق من سلامة الفيرموير! - - + + Verification failed for the following files: %1 @@ -9259,235 +9369,235 @@ p, li { white-space: pre-wrap; } %1 - - + + Verifying integrity... جارٍ التحقق من السلامة... - - + + Integrity verification succeeded! تم التحقق من السلامة بنجاح! - - + + The operation completed successfully. اكتملت العملية بنجاح. - - + + Integrity verification failed! فشل التحقق من السلامة! - + File contents may be corrupt or missing. قد تكون محتويات الملف تالفة أو مفقودة. - + Integrity verification couldn't be performed تعذر إجراء التحقق من السلامة - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. تم إلغاء تثبيت الفيرموير، قد يكون الفيرموير في حالة سيئة أو تآلف. تعذر التحقق من صحة محتويات الملف. - + Select Dumped Keys Location حدد موقع المفاتيح المفرغة - + Decryption Keys install succeeded تم تثبيت مفاتيح فك التشفير بنجاح - + Decryption Keys install failed فشل تثبيت مفاتيح فك التشفير - + Orphaned Profiles Detected! تم الكشف عن ملفات تعريف مهملة! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> قد تحدث أمور سيئة غير متوقعة إذا لم تقرأ هذا<br>!لقد اكتشف إيدن مجلدات الحفظ التالية بدون ملف تعريف مرفق:<br>%1<br><br>ملفات التعريف التالية صالحة:<br>%2<br><br>انقر على ”موافق“ لفتح مجلد الحفظ وإصلاح ملفات التعريف الخاصة بك.<br>تلميح: انسخ محتويات المجلد الأكبر أو آخر مجلد تم تعديله إلى مكان آخر، واحذف جميع ملفات التعريف اليتيمة، وانقل المحتويات المنسوخة إلى ملف التعريف الصحيح.<br><br>هل ما زلت تشعر بالارتباك؟ انظر إلى <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>صفحة المساعدة</a>.<br> - + Really clear data? مسح البيانات بالفعل؟ - + Important data may be lost! قد يتم فقدان بيانات مهمة! - + Are you REALLY sure? هل أنت متأكد حقًا؟ - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. بمجرد حذفها، لن تتمكن من استعادة بياناتك! قم بذلك فقط إذا كنت متأكدًا بنسبة 100٪ أنك تريد حذف هذه البيانات. - + Clearing... إزالة... - + Select Export Location حدد موقع التصدير - + %1.zip %1.zip - - - + + + Zipped Archives (*.zip) Zipped Archives (*.zip) - + Exporting data. This may take a while... تصدير البيانات. قد يستغرق هذا بعض الوقت... - + Exporting التصدير - + Exported Successfully تم التصدير بنجاح - + Data was exported successfully. تم تصدير البيانات بنجاح. - + Export Cancelled تم إلغاء التصدير - + Export was cancelled by the user. تم إلغاء التصدير من قبل المستخدم. - + Export Failed فشل التصدير - + Ensure you have write permissions on the targeted directory and try again. تأكد من أن لديك أذونات الكتابة على المجلد المحدد وحاول مرة أخرى. - + Select Import Location حدد موقع الاستيراد - + Import Warning تحذير الاستيراد - + All previous data in this directory will be deleted. Are you sure you wish to proceed? سيتم حذف جميع البيانات السابقة في هذا المجلد. هل أنت متأكد من رغبتك في المتابعة؟ - + Importing data. This may take a while... استيراد البيانات. قد يستغرق هذا بعض الوقت... - + Importing استيراد - + Imported Successfully تم الاستيراد بنجاح - + Data was imported successfully. تم استيراد البيانات بنجاح. - + Import Cancelled تم إلغاء الاستيراد - + Import was cancelled by the user. تم إلغاء الاستيراد من قبل المستخدم. - + Import Failed فشل الاستيراد - + Ensure you have read permissions on the targeted directory and try again. تأكد من أن لديك أذونات قراءة على المجلد المحدد وحاول مرة أخرى. - + Keys not installed المفاتيح غير مثبتة - + Install decryption keys and restart Eden before attempting to install firmware. قم بتثبيت مفاتيح فك التشفير وأعد تشغيل إيدن قبل محاولة تثبيت الفيرموير. - + Select Dumped Firmware Source Location حدد موقع مصدر الفيرموير المفرغة - + Select Dumped Firmware ZIP حدد ملف الفيرموير المضغوط الذي تم تفريغه - + Firmware cleanup failed فشل مسح الفيرموير - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/ca.ts b/dist/languages/ca.ts index dd295efbb2..6b9f560f4a 100644 --- a/dist/languages/ca.ts +++ b/dist/languages/ca.ts @@ -569,70 +569,70 @@ FXAA can produce a more stable picture in lower resolutions. - + Fullscreen Mode: Mode pantalla completa: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Relació d'aspecte: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Emulació NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -641,55 +641,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: Mode de sincronització vertical: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -697,79 +697,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: Filtrat anisotròpic: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: Mode de la GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Precisió DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -779,1327 +779,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Llavor de GNA - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Nom del dispositiu - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Idioma: - + This option can be overridden when region setting is auto-select - + Region: Regió: - + The region of the console. - + Time Zone: Zona horària: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: Mode de la consola - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ocultar el cursor del ratolí en cas d'inactivitat - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Activa el mode joc - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never Mai - + On Load - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservador - + Aggressive Agressiu - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Ensamblat d'ombrejadors, només NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, només AMD/Mesa) - + Null Nul - + Fast Ràpid - - - + + + Accurate Precís - - - + + + Default Valor predeterminat - + Unsafe (fast) Insegur (ràpid) - + Safe (stable) Segur (estable) - + Immediate - + Balanced Equilibrat - + Strict - + Unsafe Insegur - + Paranoid (disables most optimizations) Paranoic (desactiva la majoria d'optimitzacions) - + Debugging Depuració - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Finestra sense vores - + Exclusive Fullscreen Pantalla completa exclusiva - + No Video Output Sense sortida de vídeo - + CPU Video Decoding Descodificació de vídeo a la CPU - + GPU Video Decoding (Default) Descodificació de vídeo a la GPU (Valor predeterminat) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Veí més proper - + Bilinear Bilineal - + Bicubic Bicúbic - + Gaussian Gaussià - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution Super resolució AMD FidelityFX - + Area Àrea - + MMPX MMPX - + Zero-Tangent Tangència zero - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Cap - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Valor predeterminat (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 - + Stretch to Window Estirar a la finestra - + Automatic Automàtic - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonès (日本語) - + American English Anglès americà - + French (français) Francès (français) - + German (Deutsch) Alemany (Deutsch) - + Italian (italiano) Italià (italiano) - + Spanish (español) Castellà (español) - + Chinese Xinès - + Korean (한국어) Coreà (한국어) - + Dutch (Nederlands) Holandès (Nederlands) - + Portuguese (português) Portuguès (português) - + Russian (Русский) Rus (Русский) - + Taiwanese Taiwanès - + British English Anglès britànic - + Canadian French Francès canadenc - + Latin American Spanish Espanyol llatinoamericà - + Simplified Chinese Xinès simplificat - + Traditional Chinese (正體中文) Xinès tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portuguès brasiler (português do Brasil) - + Polish (polska) Polonès (polska) - + Thai (แบบไทย) Tailandès (แบบไทย) - - + + Japan Japó - + USA EUA - + Europe Europa - + Australia Austràlia - + China Xina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Per defecte (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islàndia - + Iran Iran - + Israel Isreal - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polònia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estèreo - + Surround Envoltant - + 4GB DRAM (Default) 4GB DRAM (Insegur) - + 6GB DRAM (Unsafe) 6GB DRAM (Insegur) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Insegur) - + 12GB DRAM (Unsafe) 12GB DRAM (Insegur) - + Docked Sobretaula - + Handheld Portàtil - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) - + Only if game specifies not to stop Tan sols si el joc especifica no parar - + Never ask No preguntar mai - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4836,6 +4836,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5921,50 +6030,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL no disponible! - + OpenGL shared contexts are not supported. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! Error al inicialitzar OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. La seva GPU no suporta OpenGL, o no té instal·lat els últims controladors gràfics. - + Error while initializing OpenGL 4.6! Error inicialitzant OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 La seva GPU no suporta OpenGL 4.6, o no té instal·lats els últims controladors gràfics.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 És possible que la seva GPU no suporti una o més extensions necessàries d'OpenGL. Si us plau, asseguris de tenir els últims controladors de la tarjeta gràfica.<br><br>GL Renderer:<br>%1<br><br>Extensions no suportades:<br>%2 - + This build doesn't have OpenGL support. Aquesta compilació no té suport per a OpenGL. @@ -6785,42 +6894,42 @@ Debug Message: Reiniciar el tamany de la finestra a 1080p - + &Multiplayer - + &Tools &Eines - + Am&iibo - + Launch &Applet - + &TAS &TAS - + &Create Home Menu Shortcut - + Install &Firmware - + &Help &Ajuda @@ -6846,7 +6955,7 @@ Debug Message: - + &Pause &Pausar @@ -6947,900 +7056,900 @@ Debug Message: - Open &Quickstart Guide - Obre la guia d'&inici ràpid + &User Handbook + - - &FAQ - &Preguntes freqüents - - - + &Capture Screenshot &Captura de pantalla - + &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + &Mii Editor Editor de &Mii - + &Configure TAS... &Configurar TAS... - + Configure C&urrent Game... Configurar joc a&ctual... - - + + &Start &Iniciar - + &Reset &Reiniciar - - + + R&ecord E&nregistrar - + Open &Controller Menu - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None Cap - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) Petit (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Desilenciar - + Mute Silenciar - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full Complet - + Skeleton Esquelet - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel Cancel·lar - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties Propietats - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File Carregar arxiu - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Instal·lar arxius - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game Joc - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK D'acord - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Escala: %1x - + Speed: %1% / %2% Velocitat: %1% / %2% - + Speed: %1% Velocitat: %1% - + Game: %1 FPS Joc: %1 FPS - + Frame: %1 ms Fotograma: %1 ms - + NO AA SENSE AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUMEN: %1% - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7848,74 +7957,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow Lent - + Turbo Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9102,275 +9211,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel Cancel·lar - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting Exportant - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/cs.ts b/dist/languages/cs.ts index 4c459d5d52..875ade6480 100644 --- a/dist/languages/cs.ts +++ b/dist/languages/cs.ts @@ -569,70 +569,70 @@ FXAA can produce a more stable picture in lower resolutions. - + Fullscreen Mode: Režim celé obrazovky: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Poměr stran: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -641,55 +641,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -697,79 +697,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: Anizotropní filtrování: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -779,1327 +779,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Název Zařízení - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Jazyk: - + This option can be overridden when region setting is auto-select - + Region: Region: - + The region of the console. - + Time Zone: Časové Pásmo: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Potvrzení před zastavením emulace - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Skrýt myš při neaktivitě - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Automatické - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Přesné - - - + + + Default Výchozí - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Nebezpečné - + Paranoid (disables most optimizations) Paranoidní (zakáže většinu optimizací) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Okno bez okrajů - + Exclusive Fullscreen Exkluzivní - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - + Bilinear Bilineární - + Bicubic - + Gaussian - + Lanczos - + ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Žádné - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Výchozí (16:9) - + Force 4:3 Vynutit 4:3 - + Force 21:9 Vynutit 21:9 - + Force 16:10 - + Stretch to Window Roztáhnout podle okna - + Automatic - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonština (日本語) - + American English - + French (français) Francouzština (français) - + German (Deutsch) Nemčina (Deutsch) - + Italian (italiano) Italština (Italiano) - + Spanish (español) Španělština (español) - + Chinese Čínština - + Korean (한국어) Korejština (한국어) - + Dutch (Nederlands) Holandština (Nederlands) - + Portuguese (português) Portugalština (português) - + Russian (Русский) Ruština (Русский) - + Taiwanese Tajwanština - + British English Britská Angličtina - + Canadian French Kanadská Francouzština - + Latin American Spanish Latinsko Americká Španělština - + Simplified Chinese Zjednodušená Čínština - + Traditional Chinese (正體中文) Tradiční Čínština (正體中文) - + Brazilian Portuguese (português do Brasil) Brazilská Portugalština (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonsko - + USA USA - + Europe Evropa - + Australia Austrálie - + China Čína - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Lybie - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polsko - + Portugal Portugalsko - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turecko - + UCT UCT - + Universal Univerzální - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Zadokovaná - + Handheld Příruční - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) Vždy se zeptat (Výchozí) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4828,6 +4828,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5912,50 +6021,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL není k dispozici! - + OpenGL shared contexts are not supported. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! Chyba při inicializaci OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Vaše grafická karta pravděpodobně nepodporuje OpenGL nebo nejsou nainstalovány nejnovější ovladače. - + Error while initializing OpenGL 4.6! Chyba při inicializaci OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Vaše grafická karta pravděpodobně nepodporuje OpenGL 4.6 nebo nejsou nainstalovány nejnovější ovladače.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Vaše grafická karta pravděpodobně nepodporuje jedno nebo více rozšíření OpenGL. Ujistěte se prosím, že jsou nainstalovány nejnovější ovladače.<br><br>GL Renderer:<br>%1<br><br>Nepodporované rozšíření:<br>%2 - + This build doesn't have OpenGL support. @@ -6775,42 +6884,42 @@ Debug Message: Nastavit velikost okna na 1080p - + &Multiplayer - + &Tools &Nástroje - + Am&iibo - + Launch &Applet - + &TAS - + &Create Home Menu Shortcut - + Install &Firmware - + &Help &Pomoc @@ -6836,7 +6945,7 @@ Debug Message: - + &Pause &Pauza @@ -6937,900 +7046,900 @@ Debug Message: - Open &Quickstart Guide - Otevřít &rychlého průvodce + &User Handbook + - - &FAQ - Často &kladené otázky - - - + &Capture Screenshot Za&chytit snímek obrazovky - + &Album - + &Set Nickname and Owner &Nastavit Přezdívku a Vlastníka - + &Delete Game Data &Odstranit Herní Data - + &Restore Amiibo &Obnovit Amiibo - + &Format Amiibo - + &Mii Editor - + &Configure TAS... - + Configure C&urrent Game... Nastavení současné hry - - + + &Start &Start - + &Reset &Resetovat - - + + R&ecord - + Open &Controller Menu Otevřít &Menu Ovladače - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7838,74 +7947,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9090,275 +9199,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/da.ts b/dist/languages/da.ts index a651706061..32ebbea332 100644 --- a/dist/languages/da.ts +++ b/dist/languages/da.ts @@ -571,70 +571,70 @@ FXAA can produce a more stable picture in lower resolutions. - + Fullscreen Mode: Fuldskærmstilstand: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Skærmformat: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC-emulering: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +643,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -699,79 +699,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: Anisotropisk Filtrering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -781,1327 +781,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG-Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Region - + The region of the console. - + Time Zone: Tidszone - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Skjul mus ved inaktivitet - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Automatisk - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Nøjagtig - - - + + + Default Standard - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Usikker - + Paranoid (disables most optimizations) Paranoid (deaktiverer de fleste optimeringer) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Uindrammet Vindue - + Exclusive Fullscreen Eksklusiv Fuld Skærm - + No Video Output Ingen Video-Output - + CPU Video Decoding CPU-Video Afkodning - + GPU Video Decoding (Default) GPU-Video Afkodning (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75X (540p/810p) [EKSPERIMENTEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor Nærmeste Nabo - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gausisk - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tving 4:3 - + Force 21:9 Tving 21:9 - + Force 16:10 - + Stretch to Window Stræk til Vindue - + Automatic - + 2x - + 4x - + 8x - + 16x - + Japanese (日本語) Japansk (日本語) - + American English - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Hollandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwanesisk - + British English Britisk Engelsk - + Canadian French Candadisk Fransk - + Latin American Spanish Latinamerikansk Spansk - + Simplified Chinese Forenklet Kinesisk - + Traditional Chinese (正體中文) Traditionelt Kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliansk Portugisisk (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ægypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Tyrkiet - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokket - + Handheld Håndholdt - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4836,6 +4836,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5920,50 +6029,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! - + OpenGL shared contexts are not supported. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. - + Error while initializing OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 - + This build doesn't have OpenGL support. @@ -6783,42 +6892,42 @@ Debug Message: - + &Multiplayer - + &Tools - + Am&iibo - + Launch &Applet - + &TAS - + &Create Home Menu Shortcut - + Install &Firmware - + &Help &Hjælp @@ -6844,7 +6953,7 @@ Debug Message: - + &Pause @@ -6945,900 +7054,900 @@ Debug Message: - Open &Quickstart Guide + &User Handbook - - &FAQ - - - - + &Capture Screenshot - + &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + &Mii Editor - + &Configure TAS... - + Configure C&urrent Game... - - + + &Start - + &Reset - - + + R&ecord - + Open &Controller Menu - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7846,74 +7955,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9094,275 +9203,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/de.ts b/dist/languages/de.ts index db3d3020b4..ee57558cee 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -591,12 +591,12 @@ SMAA bietet die beste Bildqualität. FXAA liefert bei niedrigeren Auflösungen ein stabileres Bild. - + Fullscreen Mode: Vollbild-Modus: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -605,12 +605,12 @@ Der randlose Modus bietet die beste Kompatibilität mit der Bildschirmtastatur, Der exklusive Vollbildmodus bietet möglicherweise eine bessere Leistung und eine bessere Freesync-/G-Sync-Unterstützung. - + Aspect Ratio: Seitenverhältnis: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -619,36 +619,36 @@ Die meisten Spiele unterstützen nur das Seitenverhältnis 16:9, sodass Anpassun Steuert außerdem das Seitenverhältnis der aufgenommenen Bildschirmfotos. - + Use persistent pipeline cache Persistenten Rohrleitungs-Cache verwenden - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Ermöglicht das Speichern von Shadern, um sie beim nächsten Spielstart schneller laden zu können. Die Deaktivierung ist ausschließlich für Fehlerbehebungszwecke vorgesehen. - + Use asynchronous GPU emulation Asynchrone GPU-Emulation verwenden - + Uses an extra CPU thread for rendering. This option should always remain enabled. Verwendet einen zusätzlichen CPU-Thread für das Rendern. Diese Option sollte immer aktiviert bleiben. - + NVDEC emulation: NVDEC-Emulation: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -657,12 +657,12 @@ Dabei kann entweder die CPU oder die GPU für die Dekodierung verwendet werden, In den meisten Fällen bietet die GPU-Dekodierung die beste Leistung. - + ASTC Decoding Method: ASTC-Dekodier-Methode: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -675,12 +675,12 @@ CPU asynchron: Die Dekodierung von ASTC-Texturen erfolgt bei Bedarf über die CP kann jedoch zu Artefakten führen. - + ASTC Recompression Method: ASTC-Rekompression-Methode: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -689,44 +689,44 @@ BC1/BC3: Das Zwischenformat wird wieder in das BC1- oder BC3-Format komprimiert, was VRAM spart, jedoch zu Einbußen bei der Bildqualität führt. - + Frame Pacing Mode (Vulkan only) Frame-Pacing-Modus (nur Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. Steuert, wie der Emulator das Frame-Pacing verwaltet, um Ruckeln zu reduzieren und die Bildrate flüssiger und gleichmäßiger zu gestalten. - + VRAM Usage Mode: VRAM-Nutzungs Modus: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Legt fest, ob der Emulator vorrangig Speicherplatz sparen oder den verfügbaren Grafikspeicher zur Leistungsoptimierung maximal ausnutzen soll. Der aggressive Modus kann die Leistung anderer Anwendungen, wie z. B. Aufnahmesoftware, beeinträchtigen. - + Skip CPU Inner Invalidation CPU-interne Invalidierung überspringen - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Überspringt bestimmte Cache-Invalidierungen auf CPU-Seite während Speicherupdates, reduziert die CPU-Auslastung und verbessert die Leistung. Dies verursacht vielleicht Abstürze. - + VSync Mode: VSync-Modus: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -737,12 +737,12 @@ Postkasten kann eine geringere Latenz als FIFO aufweisen und verursacht kein Tea Sofort (ohne Synchronisation) zeigt alles an, was verfügbar ist, und kann Tearing verursachen. - + Sync Memory Operations Speicheroperationen synchronisieren - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -751,44 +751,44 @@ Diese Option behebt Probleme in Spielen, kann jedoch zu Leistungseinbußen führ Bei Spielen mit Unreal Engine 4 sind die Auswirkungen oft am deutlichsten spürbar. - + Enable asynchronous presentation (Vulkan only) Aktiviere asynchrone Präsentation (Nur Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Verbessert die Leistung geringfügig, indem die Darstellung auf einen separaten CPU-Thread verlagert wird. - + Force maximum clocks (Vulkan only) Erzwinge Maximale Taktrate (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Lässt im Hintergrund die GPU Aufgaben erledigen während diese auf Grafikbefehle wartet, damit diese nicht herunter taktet. - + Anisotropic Filtering: Anisotrope Filterung: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Steuert die Qualität der Texturwiedergabe bei schrägen Blickwinkeln. Bei den meisten Grafikkarten kann dieser Wert bedenkenlos auf 16x eingestellt werden. - + GPU Mode: GPU-Modus: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -797,12 +797,12 @@ Die meisten Spiele werden im Modus Schnell in Ordnung gerendert, für einige ist Partikel werden in der Regel nur im Modus Akkurat korrekt gerendert. - + DMA Accuracy: DMA-Genauigkeit: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -811,12 +811,12 @@ Unsicher ist schneller, während Sicher stabiler ist und in manchen Spielen Prob Standard folgt der GPU-Genauigkeit Einstellung. - + GPU Fence Behavior: GPU-Zaunobjekt-Verhalten: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -831,56 +831,56 @@ Strikt ist die langsamste Option, kann aber Probleme beheben, die striktere Sync Standard folgt der GPU-Genauigkeit Einstellung. - + Enable GPU buffer readback GPU-Puffer-Rücklesung aktivieren - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. Bewahrt von der GPU modifizierte Pufferdaten, indem diese vor dem Hochladen zurückgelesen werden. Einige Spiele benötigen dies, um bestimmte Effekte korrekt darzustellen. - + Enable asynchronous shader compilation Aktiviere asynchrones Shader-Kompilieren - + May reduce shader stutter. Kann Shader-Ruckler reduzieren. - + GPU Clocks GPU-Takte - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. Führt dazu, dass das Spiel glaubt, die Arbeit der GPU würde früher fertig sein, als sie eigentlich ist. Dadurch hört das Spiel auf die Auflösung und Render-Distanz zu verringern um sich den Takten der Switch anzupassen. - + GPU Unswizzle GPU-Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Beschleunigt die Dekodierung von BCn-3D-Texturen mithilfe von GPU-Rechenleistung. Deaktiviere diese Option, falls Abstürze oder Grafikfehler auftreten. - + GPU Unswizzle Max Texture Size GPU-Unswizzle max. Texturgröße - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -889,48 +889,48 @@ Während die GPU für mittelgroße und große Texturen schneller ist, kann die C Passen Sie diesen Wert an, um das Gleichgewicht zwischen GPU-Beschleunigung und CPU-Overhead zu finden. - + GPU Unswizzle Stream Size GPU-Unswizzle-Streamgröße - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Legt die maximale Menge an Texturdaten (in MiB) fest, die pro Bild verarbeitet wird. Höhere Werte können Ruckeln beim Laden von Texturen verringern, können sich jedoch auf die Bildrate auswirken. - + GPU Unswizzle Chunk Size GPU-Unswizzle Chunk-Größe - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Legt die Anzahl der Tiefenschnitte fest, die in einem einzelnen Durchlauf verarbeitet werden. Eine Erhöhung dieses Werts kann den Durchsatz auf High-End-GPUs verbessern, bei schwächerer Hardware jedoch zu TDR- oder Treiber-Auszeiten führen. - + Use Vulkan pipeline cache Vulkan-Pipeline-Cache verwenden - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Aktiviert den herstellerspezifischen Pipeline-Cache der GPU. Diese Option kann die Ladezeit von Shadern erheblich verkürzen, wenn der Vulkan-Treiber die Pipeline-Cache-Dateien nicht intern speichert. - + Enable Compute Pipelines (Intel Vulkan Only) Aktiviere Compute-Pipelines (Nur Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -939,194 +939,194 @@ Diese Einstellung ist nur bei proprietären Intel-Treibern vorhanden und kann be Bei allen anderen Treibern sind die Rechen-Rohrleitungen immer aktiviert. - + Enable Reactive Flushing Aktiviere Reactives Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Benutzt Reactive-Flushing anstatt Predictive-Flushing, welches akkurateres Speicher-Synchronisieren erlaubt. - + Sync to framerate of video playback Synchronisiere mit Bildrate von Video-Wiedergaben - + Run the game at normal speed during video playback, even when the framerate is unlocked. Lasse das Spiel in der normalen Geschwindigkeit abspielen, trotz freigeschalteter Bildrate - + Barrier feedback loops Barrier-Feedback-Schleifen - + Improves rendering of transparency effects in specific games. Verbessert das Rendering von Transparenzeffekten in bestimmten Spielen. - + Enable buffer history Puffer-Verlauf aktivieren - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Ermöglicht den Zugriff auf frühere Pufferzustände. Diese Option kann in manchen Spielen die Darstellungsqualität und die Leistungsstabilität verbessern. - + Fix bloom effects Bloom-Effekte beheben - + Removes bloom in Burnout. Entfernt Bloom in Burnout. - + Enable Legacy Rescale Pass „Legacy Rescale Pass“ aktivieren - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Behebt möglicherweise Probleme mit der Skalierung in einigen Spielen, indem auf das Verhalten der vorherigen Implementierung zurückgegriffen wird. Eine Umgehungslösung für das alte Verhalten, die Linienartefakte auf AMD- und Intel-GPUs sowie graues Texturflackern auf Nvidia-GPUs in „Luigi’s Mansion 3“ behebt. - + Extended Dynamic State Erweiterter dynamischer Zustand - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Legt die Anzahl der Funktionen fest, die im erweiterten dynamischen Modus verwendet werden können. Höhere Stufen ermöglichen mehr Funktionen und können die Leistung steigern, können jedoch zusätzliche grafische Probleme verursachen. - + Vertex Input Dynamic State Dynamischer Zustand der Scheitelpunkteingabe - + Enables vertex input dynamic state feature for better quality and performance. Aktiviert die Funktion für den dynamischen Status der Scheitelpunkteingabe, um eine bessere Qualität und Leistung zu erzielen. - + Sample Shading Probe-Schattierung - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Ermöglicht es dem Fragment-Shader, pro Abtastwert in einem mehrfach abgetasteten Fragment ausgeführt zu werden, anstatt nur einmal pro Fragment. Verbessert die Grafikqualität auf Kosten der Leistung. Höhere Werte verbessern die Qualität, beeinträchtigen jedoch die Leistung. - + RNG Seed Startwert für den Zufallszahlengenerator - + Controls the seed of the random number generator. Mainly used for speedrunning. Steuert den Startwert des Zufallszahlengenerators. Wird hauptsächlich für Schnelldurchläufe verwendet. - + Device Name Gerätename - + The name of the console. Der Name der Konsole. - + Homebrew Args Homebrew-Argumente - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Befehlszeilenargumente, die beim Start an Homebrew übergeben werden (z. B. -noglsl). - + Custom RTC Date: Benutzerdefinierte Echtzeituhrdatum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Diese Option erlaubt die Änderung der Uhr der Konsole. Kann benutzt werden um Zeit in Spielen zu manipulieren. - + The number of seconds from the current unix time Die Anzahl der Sekunden seit dem aktuellen Unix-Zeitstempel - + Language: Sprache: - + This option can be overridden when region setting is auto-select Diese Option kann überschrieben werden, wenn die Regionseinstellung auf „Automatische Auswahl“ steht - + Region: Region: - + The region of the console. Die Region der Konsole. - + Time Zone: Zeitzone: - + The time zone of the console. Die Zeitzone der Konsole. - + Sound Output Mode: Tonausgangsmodus: - + Console Mode: Konsolenmodus: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1135,1042 +1135,1042 @@ Je nach dieser Einstellung ändern sich bei Spielen die Auflösung, die Detailst Die Einstellung auf „Handgerät“ kann dazu beitragen, die Leistung auf Systemen mit geringerer Leistung zu verbessern. - + Prompt for user profile on boot Beim Systemstart nach dem Benutzerprofil fragen - + Useful if multiple people use the same PC. Nützlich, wenn mehrere Personen denselben PC nutzen. - + Pause when not in focus Pausieren, wenn nicht im Fokus - + Pauses emulation when focusing on other windows. Pausiert die Emulation, wenn der Fokus auf andere Fenster wechselt. - + Confirm before stopping emulation Vor dem Stoppen der Emulation bestätigen - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Überschreibt die Abfragen zur Bestätigung des Beendens der Emulation. Wenn diese Option aktiviert ist, werden solche Abfragen umgangen und die Emulation wird direkt beendet. - + Hide mouse on inactivity Mauszeiger verbergen - + Hides the mouse after 2.5s of inactivity. Verbirgt den Mauszeiger nach 2,5 Sekunden Inaktivität. - + Disable controller applet Controller-Applet deaktivieren - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Deaktiviert die Verwendung des Controller-Applets in emulierten Programmen zwangsweise. Wenn ein Programm versucht, das Controller-Applet zu öffnen, wird es sofort geschlossen. - + Check for updates Auf Aktualisierungen überprüfen - + Whether or not to check for updates upon startup. Ob nach Aktualisierungen während des Startens gesucht werden soll. - + Enable Gamemode Spielmodus aktivieren - + Force X11 as Graphics Backend X11 als Grafik-Backend erzwingen - + Custom frontend Benutzerdefiniertes Frontend - + Real applet Echtes Applet - + Never Niemals - + On Load Beim Laden - + Always Immer - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asynchron - + Uncompressed (Best quality) Unkomprimiert (Beste Qualität) - + BC1 (Low quality) BC1 (Niedrige Qualität) - + BC3 (Medium quality) BC3 (Mittlere Qualität) - - + + Auto Auto - + 30 FPS 30 BpS - + 60 FPS 60 BpS - + 90 FPS 90 BpS - + 120 FPS 120 BpS - + Conservative Konservativ - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembler-Shader, nur NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (experimentell, nur AMD/Mesa) - + Null Null - + Fast Schnell - - - + + + Accurate Akkurat - - - + + + Default Vorgabe - + Unsafe (fast) Unsicher (schnell) - + Safe (stable) Sicher (stabil) - + Immediate Direkt - + Balanced Ausgeglichen - + Strict Strikt - + Unsafe Unsicher - + Paranoid (disables most optimizations) Paranoid (deaktiviert die meisten Optimierungen) - + Debugging Fehlerbehebung - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Rahmenloses Fenster - + Exclusive Fullscreen Exklusiver Vollbildmodus - + No Video Output Keine Videoausgabe - + CPU Video Decoding CPU Video Dekodierung - + GPU Video Decoding (Default) GPU Video Dekodierung (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5X (360p/540p) [EXPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75X (540p/810p) [EXPERIMENTELL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1,5X (1080p/1620p) [EXPERIMENTELL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest-Neighbor - + Bilinear Bilinear - + Bicubic Bikubisch - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super-Auflösung - + Area Bereich - + MMPX MMPX - + Zero-Tangent Nulltangente - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Spiel-Superauflösung - + Snapdragon Game Super Resolution EdgeDir Snapdragon Spiel-Superauflösung EdgeDir - + None Keiner - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Vorgabe (16:9) - + Force 4:3 4:3 erzwingen - + Force 21:9 21:9 erzwingen - + Force 16:10 16:10 erzwingen - + Stretch to Window Auf Fenster anpassen - + Automatic Automatisch - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japanisch (日本語) - + American English Amerikanisches Englisch - + French (français) Französisch (français) - + German (Deutsch) Deutsch (German) - + Italian (italiano) Italienisch (italiano) - + Spanish (español) Spanisch (español) - + Chinese Chinesisch - + Korean (한국어) Koreanisch (한국어) - + Dutch (Nederlands) Niederländisch (Nederlands) - + Portuguese (português) Portugiesisch (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanesisch - + British English Britisches Englisch - + Canadian French Kanadisches Französisch - + Latin American Spanish Lateinamerikanisches Spanisch - + Simplified Chinese Vereinfachtes Chinesisch - + Traditional Chinese (正體中文) Traditionelles Chinesisch (正體中文) - + Brazilian Portuguese (português do Brasil) Brasilianisches Portugiesisch (português do Brasil) - + Polish (polska) Polnisch (Polen) - + Thai (แบบไทย) Thailändisch (Thailändische Version) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatisch (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Ägypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkei - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Vorgabe) - + 6GB DRAM (Unsafe) 6GB DRAM (Unsicher) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Unsicher) - + 12GB DRAM (Unsafe) 12GB DRAM (Unsicher) - + Docked Angedockt - + Handheld Handgerät - - + + Normal Normal - - + + Boost Beschleunigung - - + + Overclock Übertaktung - + Always ask (Default) Immer fragen (Vorgabe) - + Only if game specifies not to stop Nur wenn ein Spiel vorgibt, nicht zu stoppen - + Never ask Niemals fragen - + Very Small (16 MB) Sehr klein (16 MB) - + Small (32 MB) Klein (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Groß (256 MB) - + Very Large (512 MB) Sehr groß (512 MB) - + Very Low (4 MB) Sehr niedrig (4 MB) - + Low (8 MB) Niedrig (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Mittel (32 MB) - + High (64 MB) Hoch (64 MB) - + Very Low (32) Sehr niedrig (32) - + Low (64) Niedrig (64) - + Normal (128) Normal (128) - + Medium (256) Mittel (256) - + High (512) Hoch (512) - + Disabled Deaktiviert - + ExtendedDynamicState 1 ErweiterterDynamischerZustand 1 - + ExtendedDynamicState 2 ErweiterterDynamischerZustand 2 - + ExtendedDynamicState 3 ErweiterterDynamischerZustand 3 - + Tree View Baumansicht - + Grid View Rasteransicht @@ -4926,6 +4926,115 @@ Einmal gelöscht, können diese nicht wiederhergestellt werden. Bist du dir zu 1 &Im Dateimanager öffnen + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -6013,50 +6122,50 @@ Bitte gehe zu „Konfigurieren“ -> „System“ -> „Netzwerk“ und tr GRenderWindow - - + + OpenGL not available! OpenGL nicht verfügbar! - + OpenGL shared contexts are not supported. Gemeinsame OpenGL-Kontexte werden nicht unterstützt. - + Eden has not been compiled with OpenGL support. Eden wurde nicht mit OpenGL-Unterstützung kompiliert. - - - + + + Error while initializing OpenGL! Fehler beim Initialisieren von OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Deine Grafikkarte unterstützt kein OpenGL oder du hast nicht den neusten Treiber installiert. - + Error while initializing OpenGL 4.6! Fehler beim Initialisieren von OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Deine Grafikkarte unterstützt OpenGL 4.6 nicht, oder du benutzt nicht die neuste Treiberversion.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Deine Grafikkarte unterstützt anscheinend nicht eine oder mehrere von yuzu benötigten OpenGL-Erweiterungen. Bitte stelle sicher, dass du den neusten Grafiktreiber installiert hast.<br><br>GL Renderer:<br>%1<br><br>Nicht unterstützte Erweiterungen:<br>%2 - + This build doesn't have OpenGL support. Diese Version bietet keine OpenGL-Unterstützung. @@ -6877,42 +6986,42 @@ Fehlerbehebungs-Meldung: Fenstergröße auf 1080p zurücksetzen - + &Multiplayer &Mehrspieler - + &Tools &Werkzeuge - + Am&iibo Am&iibo - + Launch &Applet &Applet starten - + &TAS &TAS - + &Create Home Menu Shortcut &Startmenü-Verknüpfung erstellen - + Install &Firmware Installieren &Firmware - + &Help &Hilfe @@ -6938,7 +7047,7 @@ Fehlerbehebungs-Meldung: - + &Pause &Pause @@ -7039,578 +7148,578 @@ Fehlerbehebungs-Meldung: - Open &Quickstart Guide - &Schnellstart-Anleitung öffnen + &User Handbook + - - &FAQ - &FAQ - - - + &Capture Screenshot &Bildschirmfoto aufnehmen - + &Album &Album - + &Set Nickname and Owner Spitzname und Besitzer &festlegen - + &Delete Game Data Spiel-Daten &löschen - + &Restore Amiibo Amiibo &wiederherstellen - + &Format Amiibo Amiibo &formatieren - + &Mii Editor &Mii-Editor - + &Configure TAS... &TAS &konfigurieren... - + Configure C&urrent Game... &Spiel-Einstellungen ändern... - - + + &Start &Start - + &Reset &Zurücksetzen - - + + R&ecord Aufnahme - + Open &Controller Menu Öffne &Controller-Menü - + Install Decryption &Keys Entschlüsselungsschlüssel installieren - + &Home Menu &Startmenü - + &Desktop &Desktop - + &Application Menu &Anwendungsmenü - + &Root Data Folder &Stammdatenordner - + &NAND Folder &NAND-Ordner - + &SDMC Folder &SDMC-Ordner - + &Mod Folder &Mod-Ordner - + &Log Folder &Protokoll-Ordner - + From Folder Aus Ordner - + From ZIP Aus ZIP - + &Eden Dependencies &Eden-Abhängigkeiten - + &Data Manager &Datenverwalter - + &Tree View &Baumansicht - + &Grid View &Rasteransicht - + Game Icon Size Spielsymbolgröße - - + + None Keine - + Show Game &Name Spiel&name anzeigen - + Show &Performance Overlay Leistungsüberlagerung anzeigen + + + Post-Processing &Shaders... + + &Carousel View &Karussellansicht - + Small (32x32) Klein (32x32) - + Standard (64x64) Standard (64x64) - + Large (128x128) Groß (128x128) - + Full Size (256x256) Volle Größe (256x256) - + Broken Vulkan Installation Detected Defekte Vulkan-Installation erkannt - + Vulkan initialization failed during boot. Initialisierung von Vulkan ist beim Systemstart fehlgeschlagen. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Spiel wird ausgeführt - + Loading Web Applet... Web-Applet wird geladen... - + Disable Web Applet Web-Applet deaktivieren - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Das Deaktivieren des Web-Applets kann zu unvorhersehbarem Verhalten führen und sollte nur bei „Super Mario 3D All-Stars“ verwendet werden. Möchtest du das Web-Applet wirklich deaktivieren? (Dies kann in den Fehlerbehebungs-Einstellungen wieder aktiviert werden.) - + The amount of shaders currently being built Die Anzahl der Shader, die derzeit erstellt werden - + The current selected resolution scaling multiplier. Der aktuell ausgewählte Skalierungsfaktor für die Auflösung. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Aktuelle Emulationsgeschwindigkeit. Werte über oder unter 100 % bedeuten, dass die Emulation schneller oder langsamer läuft als auf einer Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Wie viele Bilder pro Sekunde das Spiel derzeit anzeigt. Dies variiert von Spiel zu Spiel und von Szene zu Szene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Die Zeit, die für die Emulation eines Switch-Frames benötigt wird, ohne Berücksichtigung von Framelimiting oder V-Sync. Bei einer Emulation mit voller Geschwindigkeit sollte dieser Wert höchstens 16,67 ms betragen. - + Unmute Stummschaltung aufheben - + Mute Stummschalten - + Reset Volume Lautstärke zurücksetzen - + &Clear Recent Files &Zuletzt verwendete Dateien löschen - + &Continue &Fortfahren - + Warning: Outdated Game Format Warnung: Veraltetes Spielformat - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Du verwendest für dieses Spiel das dekontruierte ROM-Verzeichnisformat - ein veraltetes Format, das durch andere Formate wie NCA, NAX, XCI oder NSP abgelöst wurde. Dekonstruierten ROM-Verzeichnissen fehlen Symbole, Metadaten und die Unterstützung für Aktualisierungen. <br>Eine Erläuterung der verschiedenen Switch-Formate, die Eden unterstützt, findest du in unserem Benutzerhandbuch. Diese Meldung wird nicht erneut angezeigt. - - + + Error while loading ROM! Fehler beim Laden des ROMs! - + The ROM format is not supported. Das ROM-Format wird nicht unterstützt. - + An error occurred initializing the video core. Beim Initialisieren des Videokerns ist ein Fehler aufgetreten. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - Bei der Ausführung des Videokerns ist bei Eden ein Fehler aufgetreten. Dies wird in der Regel durch veraltete GPU-Treiber verursacht, einschließlich integrierter Treiber. Weitere Details findest du im Protokoll. Informationen zum Abrufen des Protokolls findest du auf der folgenden Seite: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>So lädst du die Protokolldatei hoch</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. + - + Error while loading ROM! %1 %1 signifies a numeric error code. Fehler beim Laden des ROMs! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Bitte erstelle deine Dateien erneut oder bitte auf Discord/Stoat um Hilfe. - + An unknown error occurred. Please see the log for more details. Es ist ein unbekannter Fehler aufgetreten. Weitere Informationen findest du im Protokoll. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Software wird geschlossen... - + Save Data Speicherdaten - + Mod Data Mod-Daten - + Error Opening %1 Folder Fehler beim Öffnen des Ordners %1 - - + + Folder does not exist! Der Ordner existiert nicht! - + Remove Installed Game Contents? Installierte Spielinhalte entfernen? - + Remove Installed Game Update? Installierte Spielaktualisierung entfernen? - + Remove Installed Game DLC? Installiertes Spiel-DLC entfernen? - + Remove Entry Eintrag entfernen - + Delete OpenGL Transferable Shader Cache? Den übertragbaren Shader-Cache von OpenGL löschen? - + Delete Vulkan Transferable Shader Cache? Den übertragbaren Shader-Cache von Vulkan löschen? - + Delete All Transferable Shader Caches? Alle übertragbaren Shader-Caches löschen? - + Remove Custom Game Configuration? Benutzerdefinierte Spielkonfiguration entfernen? - + Remove Cache Storage? Cache-Speicher löschen? - + Remove File Datei entfernen - + Remove Play Time Data Wiedergabezeitdaten löschen - + Reset play time? Spielzeit zurücksetzen? - - + + RomFS Extraction Failed! RomFS-Extraktion fehlgeschlagen! - + There was an error copying the RomFS files or the user cancelled the operation. Beim Kopieren der RomFS-Dateien ist ein Fehler aufgetreten oder der Benutzer hat den Vorgang abgebrochen. - + Full Vollständig - + Skeleton Skelett - + Select RomFS Dump Mode RomFS-Auslesemodus auswählen - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Bitte wähle aus, wie das RomFS kopiert werden soll. <br>Vollständig kopiert alle Dateien in das neue Verzeichnis, während <br>Skelett lediglich die Verzeichnisstruktur erstellt. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Unter %1 ist nicht genügend Speicherplatz vorhanden, um das RomFS zu extrahieren. Bitte schaffe Speicherplatz oder wähle unter „Emulation > Konfigurieren > System > Dateisystem > Dump-Stammverzeichnis“ ein anderes Dump-Verzeichnis aus. - + Extracting RomFS... RomFS wird extrahiert... - - + + Cancel Abbrechen - + RomFS Extraction Succeeded! RomFS wurde erfolgreich extrahiert! - + The operation completed successfully. Der Vorgang wurde erfolgreich abgeschlossen. - + Error Opening %1 Fehler beim Öffnen von %1 - + Select Directory Verzeichnis auswählen - + Properties Eigenschaften - + The game properties could not be loaded. Die Spieleigenschaften konnten nicht geladen werden. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch-Ausführungsdatei (%1);;Alle Dateien (*.*) - + Load File Datei laden - + Open Extracted ROM Directory Verzeichnis mit dem extrahierten ROM öffnen - + Invalid Directory Selected Ungültiges Verzeichnis ausgewählt - + The directory you have selected does not contain a 'main' file. Das von dir ausgewählte Verzeichnis enthält keine „main“-Datei. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installierbare Switch-Dateien (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX-Kassetten-Image (*.xci) - + Install Files Dateien installieren - + %n file(s) remaining %n Datei(en) verbleiben%n Datei(en) verbleiben - + Installing file "%1"... Datei „%1“ wird installiert... - - + + Install Results Installationsergebnisse - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Um mögliche Konflikte zu vermeiden, raten wir davon ab, Basisspiele auf dem NAND-Speicher zu installieren. Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen und DLCs. - + %n file(s) were newly installed %n Datei(en) wurden neu installiert @@ -7618,7 +7727,7 @@ Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen - + %n file(s) were overwritten %n Datei(en) wurden überschrieben @@ -7626,7 +7735,7 @@ Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen - + %n file(s) failed to install %n Datei(en) konnten nicht installiert werden @@ -7634,314 +7743,314 @@ Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen - + System Application Systemanwendung - + System Archive Systemarchiv - + System Application Update System-Anwendungsaktualisierung - + Firmware Package (Type A) Firmware-Paket (Typ A) - + Firmware Package (Type B) Firmware-Paket (Typ B) - + Game Spiel - + Game Update Spielaktualisierung - + Game DLC Spiel-DLC - + Delta Title Delta-Titel - + Select NCA Install Type... NCA-Installationstyp auswählen... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Bitte wähle den Titeltyp aus, unter dem du diese NCA installieren möchtest: (In den meisten Fällen ist die Vorgabe „Spiel“ ausreichend.) - + Failed to Install Installation fehlgeschlagen - + The title type you selected for the NCA is invalid. Der von dir für die NCA ausgewählte Titel ist ungültig. - + File not found Datei nicht gefunden - + File "%1" not found Datei „%1“ nicht gefunden - + OK OK - + Function Disabled Funktion deaktiviert - + Compatibility list reporting is currently disabled. Check back later! Die Anzeige der Kompatibilitätsliste ist derzeit deaktiviert. Schaue später noch einmal vorbei! - + Error opening URL Fehler beim Öffnen der URL - + Unable to open the URL "%1". Die URL „%1“ kann nicht geöffnet werden. - + TAS Recording TAS-Aufnahme - + Overwrite file of player 1? Datei von Spieler 1 überschreiben? - + Invalid config detected Ungültige Konfiguration erkannt - + Handheld controller can't be used on docked mode. Pro controller will be selected. Der Handgerät-Controller kann im angedockten Modus nicht verwendet werden. Es wird der Pro-Controller ausgewählt. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Das aktuelle amiibo wurde entfernt - + Error Fehler - - + + The current game is not looking for amiibos Das aktuelle Spiel sucht nicht nach Amiibos - + Amiibo File (%1);; All Files (*.*) Amiibo-Datei (%1);; Alle Dateien (*.*) - + Load Amiibo Amiibo laden - + Error loading Amiibo data Fehler beim Laden der Amiibo-Daten - + The selected file is not a valid amiibo Die ausgewählte Datei ist kein gültiges amiibo - + The selected file is already on use Die ausgewählte Datei wird bereits verwendet - + An unknown error occurred Ein unbekannter Fehler ist aufgetreten - + No firmware available Keine Firmware verfügbar - + Firmware Corrupted Firmware beschädigt - + Unknown applet Unbekanntes Applet - + Applet doesn't map to a known value. „Applet“ lässt sich keinem bekannten Wert zuordnen. - + Record not found Aufnahme nicht gefunden - + Applet not found. Please reinstall firmware. Applet nicht gefunden. Bitte installiere die Firmware neu. - + Capture Screenshot Bildschirmfoto aufnehmen - + PNG Image (*.png) PNG-Bild (*.png) - + TAS state: Running %1/%2 TAS-Status: %1/%2 läuft - + TAS state: Recording %1 TAS-Status: %1 wird aufgenommen - + TAS state: Idle %1/%2 TAS-Status: Leerlauf %1/%2 - + TAS State: Invalid TAS-Status: Ungültig - + &Stop Running &Ausführung beenden - + Stop R&ecording Aufnahme beenden - + Building: %n shader(s) Erstellung: %n SchattiererErstelle: %n Shader - + Scale: %1x %1 is the resolution scaling factor Maßstab: 1:1 - + Speed: %1% / %2% Geschwindigkeit: %1% / %2% - + Speed: %1% Geschwindigkeit: %1% - + Game: %1 FPS Spiel: %1 FPS - + Frame: %1 ms Frame: %1 ms - + NO AA Kein AA - + VOLUME: MUTE LAUTSTÄRKE: STUMM - + VOLUME: %1% Volume percentage (e.g. 50%) LAUTSTÄRKE: %1% - + Derivation Components Missing Ableitungskomponenten fehlen - + Decryption keys are missing. Install them now? Entschlüsselungsschlüssel fehlen. Möchtest du diese jetzt installieren? - + Wayland Detected! Wayland erkannt! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7952,74 +8061,74 @@ Es wird empfohlen, stattdessen X11 zu verwenden. Möchtest du dies für zukünftige Starts erzwingen? - + Use X11 X11 verwenden - + Continue with Wayland Mit Wayland fortfahren - + Don't show again Nicht mehr anzeigen - + Restart Required Neustart erforderlich - + Restart Eden to apply the X11 backend. Starte Eden neu, um das X11-Backend zu aktivieren. - + Slow Langsam - + Turbo Turbo - + Unlocked Entsperrt - + Select RomFS Dump Target RomFS-Ausleseziel auswählen - + Please select which RomFS you would like to dump. Bitte wähle aus, welches RomFS du auslesen möchtest. - + Are you sure you want to close Eden? Möchtest du Eden wirklich schließen? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Möchtest du die Emulation wirklich beenden? Alle nicht gespeicherten Fortschritte gehen dabei verloren. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9220,41 +9329,41 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. - Das Spiel, das du starten möchtest, benötigt Firmware, um zu booten oder das Startmenü zu verlassen. Bitte <a href='https://yuzu-mirror.github.io/help/quickstart'>lade die Firmware herunter und installiere sie</a>, oder klicke auf „OK“, um das Spiel trotzdem zu starten. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. + - + Installing Firmware... Firmware wird installiert... - - - - - + + + + + Cancel Abbrechen - + Firmware Install Failed Firmware-Installation fehlgeschlagen - + Firmware Install Succeeded Firmware-Installation erfolgreich - + Firmware integrity verification failed! Überprüfung der Firmware-Integrität fehlgeschlagen! - - + + Verification failed for the following files: %1 @@ -9263,235 +9372,235 @@ p, li { white-space: pre-wrap; } %1 - - + + Verifying integrity... Integrität wird überprüft... - - + + Integrity verification succeeded! Die Integritätsprüfung war erfolgreich! - - + + The operation completed successfully. Der Vorgang wurde erfolgreich abgeschlossen. - - + + Integrity verification failed! Die Integritätsprüfung ist fehlgeschlagen! - + File contents may be corrupt or missing. Der Inhalt der Datei ist möglicherweise beschädigt oder fehlt. - + Integrity verification couldn't be performed Die Integritätsprüfung konnte nicht durchgeführt werden - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. Die Firmware-Installation wurde abgebrochen. Die Firmware ist möglicherweise fehlerhaft oder beschädigt. Der Inhalt der Datei konnte nicht auf Gültigkeit überprüft werden. - + Select Dumped Keys Location Speicherort der ausgelesenen Schlüssel auswählen - + Decryption Keys install succeeded Installation der Entschlüsselungsschlüssel erfolgreich - + Decryption Keys install failed Installation der Entschlüsselungsschlüssel fehlgeschlagen - + Orphaned Profiles Detected! Verwaiste Profile erkannt! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> UNERWARTETE PROBLEME KÖNNTEN AUFTRETEN, WENN DU DIES NICHT LIEST!<br>Eden hat die folgenden Speicherverzeichnisse ohne zugeordnetes Profil erkannt:<br>%1<br><br>Die folgenden Profile sind gültig:<br>%2<br><br>Klicke auf „OK“, um deinen Speicherordner zu öffnen und deine Profile zu korrigieren.<br>Tipp: Kopiere den Inhalt des größten oder zuletzt geänderten Ordners an einen anderen Ort, lösche alle verwaisten Profile und verschiebe die kopierten Inhalte in das intakte Profil.<br><br>Immer noch unsicher? Lies auf der <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>Hilfeseite</a> nach.<br> - + Really clear data? Daten wirklich löschen? - + Important data may be lost! Wichtige Daten könnten verloren gehen! - + Are you REALLY sure? Bist du dir WIRKLICH sicher? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. Sobald deine Daten gelöscht sind, können sie NICHT wiederhergestellt werden! Führe diesen Vorgang nur durch, wenn du dir zu 100 % sicher bist, dass du diese Daten löschen möchtest. - + Clearing... Säuberung... - + Select Export Location Exportziel auswählen - + %1.zip %1.zip - - - + + + Zipped Archives (*.zip) ZIP-Archive (*.zip) - + Exporting data. This may take a while... Daten werden exportiert. Das kann eine Weile dauern... - + Exporting Exportieren - + Exported Successfully Erfolgreich exportiert - + Data was exported successfully. Die Daten wurden erfolgreich exportiert. - + Export Cancelled Export abgebrochen - + Export was cancelled by the user. Der Export wurde vom Benutzer abgebrochen. - + Export Failed Export fehlgeschlagen - + Ensure you have write permissions on the targeted directory and try again. Stelle sicher, dass du Schreibrechte für das Zielverzeichnis hast, und versuche es erneut. - + Select Import Location Importziel auswählen - + Import Warning Importwarnung - + All previous data in this directory will be deleted. Are you sure you wish to proceed? Alle bisherigen Daten in diesem Verzeichnis werden gelöscht. Möchtest du wirklich fortfahren? - + Importing data. This may take a while... Daten werden importiert. Das kann eine Weile dauern... - + Importing Importieren - + Imported Successfully Erfolgreich importiert - + Data was imported successfully. Die Daten wurden erfolgreich importiert. - + Import Cancelled Import abgebrochen - + Import was cancelled by the user. Der Import wurde vom Benutzer abgebrochen. - + Import Failed Import fehlgeschlagen - + Ensure you have read permissions on the targeted directory and try again. Stelle sicher, dass du Lesezugriff auf das Zielverzeichnis hast, und versuche es erneut. - + Keys not installed Schlüssel nicht installiert - + Install decryption keys and restart Eden before attempting to install firmware. Installiere die Entschlüsselungsschlüssel und starte Eden neu, bevor du versuchst, die Firmware zu installieren. - + Select Dumped Firmware Source Location Speicherort der ausgelesenen Firmware auswählen - + Select Dumped Firmware ZIP ZIP-Datei der ausgelesenen Firmware auswählen - + Firmware cleanup failed Firmware-Bereinigung ist fehlgeschlagen - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/el.ts b/dist/languages/el.ts index b679ea8abd..50ec19b094 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -571,70 +571,70 @@ FXAA can produce a more stable picture in lower resolutions. - + Fullscreen Mode: Λειτουργία Πλήρους Οθόνης: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Αναλογία Απεικόνισης: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Εξομοίωση NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +643,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -699,79 +699,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: Ανισοτροπικό Φιλτράρισμα: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -781,1327 +781,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Περιφέρεια: - + The region of the console. - + Time Zone: Ζώνη Ώρας: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Απόκρυψη δρομέα ποντικιού στην αδράνεια - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Αυτόματη - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Ακριβής - - - + + + Default Προεπιλεγμένο - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Επισφαλής - + Paranoid (disables most optimizations) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Παραθυροποιημένο Χωρίς Όρια - + Exclusive Fullscreen Αποκλειστική Πλήρης Οθόνη - + No Video Output Χωρίς Έξοδο Βίντεο - + CPU Video Decoding Αποκωδικοποίηση Βίντεο CPU - + GPU Video Decoding (Default) Αποκωδικοποίηση Βίντεο GPU (Προεπιλογή) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ΠΕΙΡΑΜΑΤΙΚΟ] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor Πλησιέστερος Γείτονας - + Bilinear Διγραμμικό - + Bicubic Δικυβικό - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Κανένα - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Προεπιλογή (16:9) - + Force 4:3 Επιβολή 4:3 - + Force 21:9 Επιβολή 21:9 - + Force 16:10 Επιβολή 16:10 - + Stretch to Window Επέκταση στο Παράθυρο - + Automatic Αυτόματα - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Ιαπωνικά (日本語) - + American English - + French (français) Γαλλικά (Français) - + German (Deutsch) Γερμανικά (Deutsch) - + Italian (italiano) Ιταλικά (Italiano) - + Spanish (español) Ισπανικά (Español) - + Chinese Κινέζικα - + Korean (한국어) Κορεάτικα (한국어) - + Dutch (Nederlands) Ολλανδικά (Nederlands) - + Portuguese (português) Πορτογαλικά (Português) - + Russian (Русский) Ρώσικα (Русский) - + Taiwanese Ταϊβανέζικα - + British English Βρετανικά Αγγλικά - + Canadian French Καναδικά Γαλλικά - + Latin American Spanish Λατινοαμερικάνικα Ισπανικά - + Simplified Chinese Απλοποιημένα Κινέζικα - + Traditional Chinese (正體中文) Παραδοσιακά Κινέζικα (正體中文) - + Brazilian Portuguese (português do Brasil) Πορτογαλικά Βραζιλίας (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Ιαπωνία - + USA ΗΠΑ - + Europe Ευρώπη - + Australia Αυστραλία - + China Κίνα - + Korea Κορέα - + Taiwan Ταϊβάν - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Κούβα - + EET EET - + Egypt Αίγυπτος - + Eire - + EST EST - + EST5EDT EST5EDT - + GB - + GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Γκρήνουιτς - + Hongkong Χονγκ Κονγκ - + HST HST - + Iceland Ισλανδία - + Iran Ιράν - + Israel Ισραήλ - + Jamaica Ιαμαϊκή - + Kwajalein - + Libya Λιβύη - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Ναβάχο - + NZ - + NZ-CHAT - + Poland Πολωνία - + Portugal Πορτογαλία - + PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Σιγκαπούρη - + Turkey Τουρκία - + UCT UCT - + Universal Παγκόσμια - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu - + Mono Μονοφωνικό - + Stereo Στέρεοφωνικό - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4828,6 +4828,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5911,50 +6020,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! Το OpenGL δεν είναι διαθέσιμο! - + OpenGL shared contexts are not supported. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! Σφάλμα κατα την αρχικοποίηση του OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. - + Error while initializing OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 - + This build doesn't have OpenGL support. @@ -6774,42 +6883,42 @@ Debug Message: - + &Multiplayer &Πολλαπλών Παικτών - + &Tools - + Am&iibo - + Launch &Applet - + &TAS &TAS - + &Create Home Menu Shortcut - + Install &Firmware - + &Help @@ -6835,7 +6944,7 @@ Debug Message: - + &Pause &Παύση @@ -6936,900 +7045,900 @@ Debug Message: - Open &Quickstart Guide + &User Handbook - - &FAQ - - - - + &Capture Screenshot - + &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + &Mii Editor - + &Configure TAS... - + Configure C&urrent Game... - - + + &Start &Έναρξη - + &Reset - - + + R&ecord - + Open &Controller Menu - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7837,74 +7946,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9086,275 +9195,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/es.ts b/dist/languages/es.ts index 46eb96b33b..d12a8c2b36 100644 --- a/dist/languages/es.ts +++ b/dist/languages/es.ts @@ -592,12 +592,12 @@ SMAA ofrece mejor calidad. FXAA puede producir mejores resultados visuales en resoluciones bajas. - + Fullscreen Mode: Modo pantalla completa: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -606,12 +606,12 @@ Ventana sin bordes ofrece la mejor compatibilidad con el teclado en pantalla que Pantalla completa exclusiva puede ofrecer mejor rendimiento y mejor soporte para FreeSync/G-Sync/VRR. - + Aspect Ratio: Relación de aspecto: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -620,36 +620,36 @@ La mayoría de los juegos solo admiten 16:9, por lo que se requieren modificacio También controla la relación de aspecto de las capturas de pantalla. - + Use persistent pipeline cache Usar el caché de canalización persistente - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permite almacenar los sombreadores para que carguen más rápido la próxima vez que inicies el juego. Desactivarlo solo está destinado para depuración. - + Use asynchronous GPU emulation Usar emulación asíncrona de la GPU - + Uses an extra CPU thread for rendering. This option should always remain enabled. Usa un hilo adicional de la CPU para el renderizado. Esta opción siempre debe permanecer activada. - + NVDEC emulation: Emulación NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -658,12 +658,12 @@ Puede usar la CPU, GPU o no descodificar (mostrará una pantalla en negro durant En la mayoría de casos, descodificar mediante la GPU es la mejor opción. - + ASTC Decoding Method: Modo descodificación ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -675,12 +675,12 @@ GPU: utiliza los sombreadores computables de la GPU para descodificar las textur CPU asíncrona: usa la CPU para descodificar las texturas ASTC bajo demanda. Elimina los tirones causados por la descodificación ASTC, pero puede generar errores visuales. - + ASTC Recompression Method: Modo recompresión ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -688,44 +688,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3: El formato intermedio será recomprimido a BC1 o BC3, lo que ahorra VRAM, pero degrada la calidad de la imagen. - + Frame Pacing Mode (Vulkan only) Modo de ritmo de fotogramas (solo Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. Controla cómo el emulador gestiona el ritmo de los fotogramas para reducir los tirones y hacer que la velocidad de los fotogramas sea más suave y consistente. - + VRAM Usage Mode: Modo de uso de la VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Selecciona si el emulador prefiere ahorrar memoria o maximizar el uso de memoria de video disponible para mejorar el rendimiento. El modo agresivo puede afectar al rendimiento de otras aplicaciones, como a los programas de grabación. - + Skip CPU Inner Invalidation Saltar invalidación interna de la CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Omite ciertas invalidaciones de caché durante las actualizaciones de memoria, reduciendo el uso de la CPU y mejorando la latencia. Esto puede causar bloqueos leves. - + VSync Mode: Modo VSync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -736,12 +736,12 @@ Mailbox ofrece menor latencia que FIFO y evita el tearing, aunque puede perder a Immediate (sin sincronización) muestra los fotogramas tan pronto están disponibles, pero puede generar desgarros de imagen. - + Sync Memory Operations Sincronizar operaciones de memoria - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -750,56 +750,56 @@ Esta opción arregla errores en los juegos, pero puede afectar negativamente al Los juegos con Unreal Engine 4 son con frecuencia los que muestran cambios significantes en esto. - + Enable asynchronous presentation (Vulkan only) Activar presentación asíncrona (solo Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Mejora el rendimiento ligeramente al usar un hilo de CPU adicional para la presentación. - + Force maximum clocks (Vulkan only) Forzar relojes al máximo (solo Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Ejecuta los procesos en segundo plano mientras se espera a las instrucciones gráficas para evitar que la GPU reduzca su velocidad de reloj. - + Anisotropic Filtering: Filtrado anisotrópico: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Controla la calidad del renderizado de texturas en ángulos oblicuos. Es seguro configurarlo en 16x en la mayoría de las GPU. - + GPU Mode: Modo de la GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Precisión de DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -808,12 +808,12 @@ Inseguro es más rápido, mientras que seguro es más estable y puede solucionar Predeterminado sigue el ajuste de la precisión de GPU. - + GPU Fence Behavior: Comportamiento de vallado de la GPU: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -823,55 +823,55 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback Activar la lectura del búfer de la GPU - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Activa la compilación de shaders asincrónicos - + May reduce shader stutter. Puede reducir los tirones causados por la carga de sombreadores. - + GPU Clocks Relojes de GPU - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle Desentrelazado de la GPU - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Acelera la decodificación de texturas 3D BCn mediante computación de la GPU. Desactívela si experimenta problemas o fallos gráficos. - + GPU Unswizzle Max Texture Size Tamaño máximo de textura de desentrelazado de la GPU - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -880,46 +880,46 @@ Aunque la GPU es más rápida para texturas medianas y grandes, la CPU puede ser Ajuste este valor para encontrar el equilibrio entre la aceleración de la GPU y la sobrecarga de la CPU. - + GPU Unswizzle Stream Size Tamaño del flujo de desentrelazado de la GPU - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Establece la cantidad máxima de datos de textura (en MiB) procesados ​​por cada fotograma. Valores más altos pueden reducir la distorsión durante la carga de texturas, pero pueden afectar a la consistencia de los fotogramas. - + GPU Unswizzle Chunk Size Tamaño del trozo de desentrelazado de la GPU - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Determina la cantidad de cortes de profundidad procesados ​​en un solo envío. Aumentar este valor puede mejorar el rendimiento en una GPU de gama alta, pero puede causar tirones y problemas en los tiempos de respuesta en hardware más modesto. - + Use Vulkan pipeline cache Usar caché de canalización de Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Activa la caché de canalización específica del fabricante. Esta opción puede mejorar los tiempos de cargas de sombreadores en el caso de que el controlador de Vulkan no lo almacene internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Activar la canalizaciones de cómputo (solo Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -928,194 +928,194 @@ Este ajuste solo existe para los controladores propietarios de Intel y puede cau En los demás controladores, la canalización de cómputo siempre está activada. - + Enable Reactive Flushing Activar limpieza reactiva - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa limpieza de memoria reactiva en vez de predictiva, permitiendo una sincronización de memoria más precisa. - + Sync to framerate of video playback Sincronizar a fotogramas de reproducción de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Ejecuta el juego a velocidad normal durante la reproducción de vídeos, incluso cuando no hay límite de fotogramas. - + Barrier feedback loops Bucles de feedback de barrera - + Improves rendering of transparency effects in specific games. Mejora la renderización de los efectos de transparencia en ciertos juegos. - + Enable buffer history Activar el historial del búfer - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Habilita el acceso a estados de búfer anteriores. Esta opción puede mejorar la calidad de renderizado y la consistencia en el rendimiento de algunos juegos. - + Fix bloom effects Arreglar efectos de resplandor - + Removes bloom in Burnout. Elimina el resplandor en Burnout. - + Enable Legacy Rescale Pass Activar el pase de reescalado heredado - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Puede arreglar los problemas de reescalado en algunos juegos confiando en el comportamiento de la implementación anterior. Solución alternativa de comportamiento heredado que corrige los artefactos de línea de la GPU AMD y el parpadeo de texturas gris de la GPU Nvidia en Luigis Mansion 3. - + Extended Dynamic State Estado dinámico extendido - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Controla el número de funciones que pueden ser usadas en el Estado Dinámico Extendido. Números más altos permiten úsar más funciones y pueden aumentar el rendimiento, pero tambén pueden causar errores gráficos. - + Vertex Input Dynamic State Estado dinámico de entrada de vértices - + Enables vertex input dynamic state feature for better quality and performance. Activa la función de estado dinámico de entrada de vértices para una mejor calidad y rendimiento. - + Sample Shading Sombreado de muestra - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permite que el sombreador de fragmentos se ejecute por muestra en un fragmento multimuestreado, en lugar de una sola vez por fragmento. Mejora la calidad de los gráficos a costa de rendimiento. Los valores más altos mejoran la calidad, pero reducen el rendimiento. - + RNG Seed Semilla de GNA - + Controls the seed of the random number generator. Mainly used for speedrunning. Controla la semilla del generador de números aleatorios. Usado principalmente para speedrunning. - + Device Name Nombre del dispositivo - + The name of the console. El nombre de la consola - + Homebrew Args Argumentos Homebrew - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Argumentos en la línea de comandos pasados al homebrew al ser lanzado (p.e. -noglsl). - + Custom RTC Date: Fecha Personalizada RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Esta opción permite cambiar el reloj de la consola. Puede ser usado para manipular el tiempo en juegos. - + The number of seconds from the current unix time Número de segundos de la hora actual de Unix - + Language: Idioma: - + This option can be overridden when region setting is auto-select Esta opción puede ser reemplazada cuando la configuración de región está en selección automática. - + Region: Región: - + The region of the console. La Región de la Consola. - + Time Zone: Zona horaria: - + The time zone of the console. La zona horaria de la consola. - + Sound Output Mode: Método de salida de sonido: - + Console Mode: Modo consola: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1124,1041 +1124,1041 @@ Los juegos cambiarán su resolución, detalles y compatibilidad con los mandos s Configurar el modo portátil puede mejorar el rendimiento en sistemas de gama baja. - + Prompt for user profile on boot Solicitud para perfil de usuario al arrancar - + Useful if multiple people use the same PC. Útil si múltiples personas usan la misma PC - + Pause when not in focus Pausar cuando la ventana no esté activa - + Pauses emulation when focusing on other windows. Pausa la emulación cuando otra ventana diferente está activa. - + Confirm before stopping emulation Confirmar detención - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Anula las solicitudes de confirmación para detener la emulación. Al habilitar esta opción, se omiten dichas solicitudes y se sale directamente de la emulación. - + Hide mouse on inactivity Ocultar el cursor por inactividad. - + Hides the mouse after 2.5s of inactivity. Oculta el mouse después de 2.5s de inactividad. - + Disable controller applet Desactivar applet de mandos - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Desactiva forzosamente el uso del applet del controlador en programas emulados. Cuando un programa intenta abrir el applet del controlador, se cierra inmediatamente. - + Check for updates Buscar actualizaciones - + Whether or not to check for updates upon startup. Si se deben buscar actualizaciones al iniciar o no. - + Enable Gamemode Activar Modo Juego - + Force X11 as Graphics Backend Forzar X11 como motor gráfico - + Custom frontend Interfaz personalizada - + Real applet Applet real - + Never Nunca - + On Load Al cargar - + Always Siempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU asíncrona - + Uncompressed (Best quality) Sin compresión (Mejor calidad) - + BC1 (Low quality) BC1 (Calidad baja) - + BC3 (Medium quality) BC3 (Calidad media) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservativo - + Aggressive Agresivo - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Ensamblado de sombreadores, solo NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, solo AMD/Mesa) - + Null Ninguno - + Fast Rápido - - - + + + Accurate Preciso - - - + + + Default Predeterminado - + Unsafe (fast) Inseguro (rápido) - + Safe (stable) Seguro (estable) - + Immediate Inmediato - + Balanced Balanceado - + Strict Estricto - + Unsafe Impreciso - + Paranoid (disables most optimizations) Paranoico (Deshabilita la mayoría de optimizaciones) - + Debugging Depuración - + Dynarmic DynARMic - + NCE NCE - + Borderless Windowed Ventana sin bordes - + Exclusive Fullscreen Pantalla completa - + No Video Output Sin salida de vídeo - + CPU Video Decoding Decodificación de vídeo en la CPU - + GPU Video Decoding (Default) Decodificación de vídeo en GPU (Por defecto) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] x0,5 (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] x0,75 (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) x1 (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] x1,5 (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) x2 (1440p/2160p) - + 3X (2160p/3240p) x3 (2160p/3240p) - + 4X (2880p/4320p) x4 (2880p/4320p) - + 5X (3600p/5400p) x5 (3600p/5400p) - + 6X (4320p/6480p) x6 (4320p/6480p) - + 7X (5040p/7560p) x7 (5040p/7560p) - + 8X (5760p/8640p) x8 (5760p/8640p) - + Nearest Neighbor Vecino más próximo - + Bilinear Bilineal - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution Super Resolución AMD FidelityFX - + Area Área - + MMPX MMPX - + Zero-Tangent Tangente cero - + B-Spline Ranura B - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Super resolución de juego Snapdragon - + Snapdragon Game Super Resolution EdgeDir Filo direcorio de super resolución de juego Snapdragon - + None Ninguno - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Predeterminado (16:9) - + Force 4:3 Forzar 4:3 - + Force 21:9 Forzar 21:9 - + Force 16:10 Forzar 16:10 - + Stretch to Window Estirar a la ventana - + Automatic Automático - + 2x x2 - + 4x x4 - + 8x x8 - + 16x x16 - + Japanese (日本語) Japonés (日本語) - + American English Inglés estadounidense - + French (français) Francés (français) - + German (Deutsch) Alemán (deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Español - + Chinese Chino - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandés (nederlands) - + Portuguese (português) Portugués (português) - + Russian (Русский) Ruso (Русский) - + Taiwanese Taiwanés - + British English Inglés británico - + Canadian French Francés canadiense - + Latin American Spanish Español latinoamericano - + Simplified Chinese Chino simplificado - + Traditional Chinese (正體中文) Chino tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugués brasileño (português do Brasil) - + Polish (polska) Polaco (polska) - + Thai (แบบไทย) Tailandés (แบบไทย) - - + + Japan Japón - + USA EEUU - + Europe Europa - + Australia Australia - + China China - + Korea Corea - + Taiwan Taiwán - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Predeterminada (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Irán - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquía - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulú - + Mono Mono - + Stereo Estéreo - + Surround Envolvente - + 4GB DRAM (Default) 4GB DRAM (Por defecto) - + 6GB DRAM (Unsafe) 6GB DRAM (Inseguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Sobremesa - + Handheld Portátil - - + + Normal Normal - - + + Boost Impulso - - + + Overclock Overclock - + Always ask (Default) Preguntar siempre (Por defecto) - + Only if game specifies not to stop Solo si el juego pide no ser cerrado - + Never ask Nunca preguntar - + Very Small (16 MB) Muy pequeño (16 MB) - + Small (32 MB) Pequeño (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muy grande (512 MB) - + Very Low (4 MB) Muy bajo (4 MB) - + Low (8 MB) Bajo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muy bajo (32) - + Low (64) Bajo (64) - + Normal (128) Normal (128) - + Medium (256) Medio (256) - + High (512) Alto (512) - + Disabled Desactivado - + ExtendedDynamicState 1 ModoDynamicoExtendido 1 - + ExtendedDynamicState 2 ModoDynamicoExtendido 2 - + ExtendedDynamicState 3 ModoDynamicoExtendido 3 - + Tree View Vista en árbol - + Grid View Vista en cuadrícula @@ -4913,6 +4913,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t &Abrir en el gestor de archivos + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + Aplicar + + + + Reset Values + Restablecer valores + + + + Return every effect to the values the preset ships with. + + + + + Save As... + Guardar como... + + + + Save Preset + + + + + Preset name: + + + + + Delete + Borrar + + + + Add Effect + Añadir efecto + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + Activado + + + + Disabled + Desactivado + + + + Reset to defaults + Restaurar los valores predeterminados + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5201,7 +5310,7 @@ UUID: %2 <html><head/><body><p>Reads controller input from scripts in the same format as TAS-nx scripts.<br/>For a more detailed explanation, please consult the user handbook.</p></body></html> - <html><head/><body><p>Lee la entrada del mando desde los scripts en el mismo formato que los scripts TAS-nx.<br/>Para una explicación más detallada, por favor consulte el manual de usuario.</p></body></html> + <html><head/><body><p>Lee la entrada del mando desde los scripts en el mismo formato que los scripts TAS-nx.<br/>Para una explicación más detallada, por favor consulta el manual de usuario.</p></body></html> @@ -6000,50 +6109,50 @@ Por favor, vaya a Configuración -> Sistema -> Red y selecciona una interf GRenderWindow - - + + OpenGL not available! ¡OpenGL no está disponible! - + OpenGL shared contexts are not supported. Los contextos compartidos de OpenGL no son compatibles. - + Eden has not been compiled with OpenGL support. Eden no ha sido compilado con soporte para OpenGL. - - - + + + Error while initializing OpenGL! ¡Error al inicializar OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Tu GPU no soporta OpenGL, o no tienes instalados los últimos controladores gráficos. - + Error while initializing OpenGL 4.6! ¡Error al iniciar OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Tu GPU no soporta OpenGL 4.6, o no tienes instalado el último controlador de la tarjeta gráfica.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Es posible que la GPU no soporte una o más extensiones necesarias de OpenGL . Por favor, asegúrate de tener los últimos controladores de la tarjeta gráfica.<br><br>GL Renderer:<br>%1<br><br>Extensiones no soportadas:<br>%2 - + This build doesn't have OpenGL support. Esta compilación no tiene soporte para OpenGL. @@ -6865,42 +6974,42 @@ Mensaje de depuración: Reiniciar el tamaño de la ventana a 1080p - + &Multiplayer &Multijugador - + &Tools &Herramientas - + Am&iibo Am&iibo - + Launch &Applet Ejecutar &Applet - + &TAS &TAS - + &Create Home Menu Shortcut &Crear un acceso directo al menú de inicio - + Install &Firmware Instalar &Firmware - + &Help &Ayuda @@ -6926,7 +7035,7 @@ Mensaje de depuración: - + &Pause &Pausar @@ -7027,578 +7136,578 @@ Mensaje de depuración: - Open &Quickstart Guide - Abrir guía de &inicio rápido + &User Handbook + Manual de &usuario - - &FAQ - &Preguntas frecuentes - - - + &Capture Screenshot &Captura de pantalla - + &Album &Álbum - + &Set Nickname and Owner &Darle nombre y propietario - + &Delete Game Data &Borrar datos de juego - + &Restore Amiibo &Restaurar Amiibo - + &Format Amiibo &Formatear Amiibo - + &Mii Editor &Editor de Mii - + &Configure TAS... &Configurar TAS... - + Configure C&urrent Game... Configurar el j&uego actual... - - + + &Start &Iniciar - + &Reset &Reiniciar - - + + R&ecord G&rabar - + Open &Controller Menu Abrir el menú de &mandos - + Install Decryption &Keys Instalar &llaves de desencriptación - + &Home Menu &Menú de inicio - + &Desktop &Escritorio - + &Application Menu &Menú de la aplicación - + &Root Data Folder Carpeta de datos &raíz - + &NAND Folder Carpeta &NAND - + &SDMC Folder Carpeta &SDMC - + &Mod Folder Carpeta de &mods - + &Log Folder Carpeta de &registros - + From Folder Desde una carpeta - + From ZIP Desde un archivo ZIP - + &Eden Dependencies &Dependencias de Eden - + &Data Manager Gestor de &datos - + &Tree View Vista en &árbol - + &Grid View Vista en &cuadrícula - + Game Icon Size Tamaño del icono de los juegos - - + + None Nada - + Show Game &Name Mostrar el &nombre del juego - + Show &Performance Overlay Mostrar superposición de &rendimiento + + + Post-Processing &Shaders... + + &Carousel View Vista de &carrusel - + Small (32x32) Pequeño (32x32) - + Standard (64x64) Estandar (64x64) - + Large (128x128) Grande (128x128) - + Full Size (256x256) Tamaño completo (256x256) - + Broken Vulkan Installation Detected Detectada instalación fallida de Vulkan - + Vulkan initialization failed during boot. La inicialización de Vulkan falló durante el arranque. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Ejecutando un juego - + Loading Web Applet... Cargando applet web... - + Disable Web Applet Desactivar applet web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Desactivar el applet web puede causar comportamientos inesperados y debería solo ser usado con Super Mario 3D All-Stars. ¿Está seguro de que quiere desactivar el applet web? (Puede ser activado en las ajustes de depuración.) - + The amount of shaders currently being built La cantidad de sombreadores que se están contruyendo actualmente - + The current selected resolution scaling multiplier. El multiplicador de escalado de resolución seleccionado actualmente. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocidad de emulación actual. Los valores superiores o inferiores al 100% indican que la emulación se ejecuta más rápida o más lenta que en una Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. La cantidad de fotogramas por segundo que muestra el juego actualmente. Esto varía según el juego y la escena. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tiempo empleado en emular un fotograma de la Switch, sin contar la limitación de fotogramas ni la sincronización vertical. Para una emulación a máxima velocidad, debería ser de 16,67 ms como máximo. - + Unmute Desilenciar - + Mute Silenciar - + Reset Volume Restablecer volumen - + &Clear Recent Files &Limpiar archivos recientes - + &Continue &Continuar - + Warning: Outdated Game Format Advertencia: formato del juego obsoleto - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - Estás usando el formato de directorio ROM deconstruido para este juego, el cual es un formato obsoleto que ha sido reemplazado por otros como NCA, NAX, XCI o NSP. Los directorios ROM deconstruidos carecen de iconos, metadatos y compatibilidad con actualizaciones.<br>Para obtener una explicación de los distintos formatos de la Switch compatibles con Eden, consulte nuestro manual de usuario. Este mensaje no volverá a aparecer de nuevo. + Estás usando el formato de directorio ROM deconstruido para este juego, el cual es un formato obsoleto que ha sido reemplazado por otros como NCA, NAX, XCI o NSP. Los directorios ROM deconstruidos carecen de iconos, metadatos y compatibilidad con actualizaciones.<br>Para obtener una explicación de los distintos formatos de Switch compatibles con Eden, consulta nuestro manual de usuario. Este mensaje no volverá a aparecer de nuevo. - - + + Error while loading ROM! ¡Error al cargar la ROM! - + The ROM format is not supported. El formato de la ROM no está soportado. - + An error occurred initializing the video core. Se produjo un error al inicializar el núcleo de video. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - Eden ha detectado un error al ejecutar el núcleo de vídeo. Esto suele deberse por usar controladores de la GPU obsoletos, incluidos los integrados. Consulte el registro para obtener más información. Para más información sobre cómo acceder al archivo de registro, por favor consulte la siguiente página: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>Cómo subir el archivo de registro</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. + - + Error while loading ROM! %1 %1 signifies a numeric error code. ¡Error al cargar la ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Por favor vuelva a volcar sus archivos, o pida ayuda en Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Ha ocurrido un error desconocido. Por favor mire el registro para más detalles. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Cerrando el programa... - + Save Data Datos de guardado - + Mod Data Datos del mod - + Error Opening %1 Folder Error abriendo la carpeta %1 - - + + Folder does not exist! ¡La carpeta no existe! - + Remove Installed Game Contents? ¿Eliminar el contenido instalado del juego? - + Remove Installed Game Update? ¿Eliminar la actualización instalada del juego? - + Remove Installed Game DLC? ¿Eliminar el contenido descargable instalado del juego? - + Remove Entry Eliminar entrada - + Delete OpenGL Transferable Shader Cache? ¿Desea eliminar el caché transferible de sombreadores de OpenGL? - + Delete Vulkan Transferable Shader Cache? ¿Desea eliminar el caché transferible de sombreadores de Vulkan? - + Delete All Transferable Shader Caches? ¿Desea eliminar todo el caché transferible de sombreadores? - + Remove Custom Game Configuration? ¿Borrar configuración personalizada del juego? - + Remove Cache Storage? ¿Borrar el almacenamiento de caché? - + Remove File Eliminar archivo - + Remove Play Time Data Eliminar datos del tiempo de juego - + Reset play time? ¿Reiniciar el tiempo de juego? - - + + RomFS Extraction Failed! ¡Fallo al extraer el RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Ocurrió un error al copiar los archivos de la RomFS o el usuario canceló la operación. - + Full Completo - + Skeleton Esqueleto - + Select RomFS Dump Mode Seleccione el método de volcado del RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Por favor selecciona como quieres que sea volcada la RomFS.<br>Completa copiará todos los archivos en el nuevo directorio mientras que <br>esqueleto solo creará la estructura de los directorios. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root No hay suficiente espacio libre en %1 para extraer la RomFS. Por favor libera espacio o selecciona un directorio de volcado diferente en Emulación > Configurar > Sistema > Sistema de archivos > Volcado raiz - + Extracting RomFS... Extrayendo el RomFS... - - + + Cancel Cancelar - + RomFS Extraction Succeeded! ¡La extracción del RomFS ha sido un éxito! - + The operation completed successfully. La operación se completó con éxito. - + Error Opening %1 Error al abrir %1 - + Select Directory Seleccionar directorio - + Properties Propiedades - + The game properties could not be loaded. No se pudieron cargar las propiedades del juego. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Ejecutable de Switch (%1);;Todos los archivos (*.*) - + Load File Cargar archivo - + Open Extracted ROM Directory Abrir directorio de la ROM extraída - + Invalid Directory Selected Seleccionado directorio inválido - + The directory you have selected does not contain a 'main' file. El directorio seleccionado no contiene un archivo 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Archivo de Switch instalable (*.nca *.nsp *.xci);;Archivo de contenido de Nintendo (*.nca);;Paquete de envío de Nintendo (*.nsp);;Imagen de cartucho NX (*.xci) - + Install Files Instalar archivos - + %n file(s) remaining %n archivo(s) restantes%n archivo(s) restantes%n archivo(s) restantes - + Installing file "%1"... Instalando el archivo "%1"... - - + + Install Results Resultados de la instalación - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Para evitar posibles conflictos, desaconsejamos instalar juegos base en la NAND. Por favor, use solo esta función para instalar actualizaciones y contenido descargable. - + %n file(s) were newly installed %n archivo(s) se instalaron recientemente @@ -7607,7 +7716,7 @@ Por favor, use solo esta función para instalar actualizaciones y contenido desc - + %n file(s) were overwritten %n archivo(s) fueron sobreescritos @@ -7616,7 +7725,7 @@ Por favor, use solo esta función para instalar actualizaciones y contenido desc - + %n file(s) failed to install fallo al instalar %n archivo(s) @@ -7625,314 +7734,314 @@ Por favor, use solo esta función para instalar actualizaciones y contenido desc - + System Application Aplicación del sistema - + System Archive Archivo del sistema - + System Application Update Actualización de la aplicación del sistema - + Firmware Package (Type A) Paquete de firmware (Tipo A) - + Firmware Package (Type B) Paquete de firmware (Tipo B) - + Game Juego - + Game Update Actualización del juego - + Game DLC Contenido descargable del juego - + Delta Title Título Delta - + Select NCA Install Type... Seleccione el tipo de instalación NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Seleccione el tipo de título en el que desea instalar este NCA: (En la mayoría de los casos, la opción predeterminada "Juego" es suficiente). - + Failed to Install Fallo al instalar - + The title type you selected for the NCA is invalid. El tipo de título que ha seleccionado para el NCA es inválido. - + File not found Archivo no encontrado - + File "%1" not found Archivo "%1" no encontrado - + OK Aceptar - + Function Disabled Función desactivada - + Compatibility list reporting is currently disabled. Check back later! Los informes de la lista de compatibilidad están deshabilitados. ¡Vuelva más tarde! - + Error opening URL Error abriendo URL - + Unable to open the URL "%1". No se pudo abrir URL "%1". - + TAS Recording Grabación TAS - + Overwrite file of player 1? ¿Sobrescribir el archivo del jugador 1? - + Invalid config detected Detectada configuración inválida - + Handheld controller can't be used on docked mode. Pro controller will be selected. El mando del modo portátil no puede usarse en el modo sobremesa. El mando pro será seleccionado en su lugar. - - + + Amiibo Amiibo - - + + The current amiibo has been removed El amiibo actual fue borrado - + Error Error - - + + The current game is not looking for amiibos El juego actual no está buscando amiibos - + Amiibo File (%1);; All Files (*.*) Archivo Amiibo (%1);; Todos los archivos (*.*) - + Load Amiibo Cargar Amiibo - + Error loading Amiibo data Error al cargar los datos del Amiibo - + The selected file is not a valid amiibo El archivo seleccionado no es un amiibo válido - + The selected file is already on use El archivo seleccionado se encuentra en uso - + An unknown error occurred Ha ocurrido un error desconocido - + No firmware available No hay firmware disponible - + Firmware Corrupted Firmware corrompido - + Unknown applet Applet desconocido - + Applet doesn't map to a known value. Applet no asigna a un valor conocido. - + Record not found Grabación no encontrada - + Applet not found. Please reinstall firmware. Apple no encontrado. Por favor vuelva a instalar el firmware. - + Capture Screenshot Captura de pantalla - + PNG Image (*.png) Imagen PNG (*.png) - + TAS state: Running %1/%2 Estado de TAS: Ejecutando %1/%2 - + TAS state: Recording %1 Estado de TAS: Grabando %1 - + TAS state: Idle %1/%2 Estado de TAS: Inactivo %1/%2 - + TAS State: Invalid Estado de TAS: Inválido - + &Stop Running &Parar de ejecutarse - + Stop R&ecording &Parar grabación - + Building: %n shader(s) Construyendo: %n sombreador(es)Construyendo: %n sombreador(es)Construyendo: %n sombreador(es) - + Scale: %1x %1 is the resolution scaling factor Escala: %1x - + Speed: %1% / %2% Velocidad: %1% / %2% - + Speed: %1% Velocidad: %1% - + Game: %1 FPS Juego: %1 FPS - + Frame: %1 ms Fotograma: %1 ms - + NO AA NO AA - + VOLUME: MUTE VOLUMEN: SILENCIADO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUMEN: %1% - + Derivation Components Missing Componentes de derivación ausentes - + Decryption keys are missing. Install them now? Las claves de desencriptado están ausentes. ¿Desea instalarlas ahora? - + Wayland Detected! ¡Wayland detectado! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7943,74 +8052,74 @@ Se recomienda usar X11 en su lugar. ¿Le gustaría forzar a usarlo en futuras ejecuciones? - + Use X11 Usar X11 - + Continue with Wayland Continuar con Wayland - + Don't show again No mostrar de nuevo - + Restart Required Reinicio requerido - + Restart Eden to apply the X11 backend. Reinicie Eden para aplicar el motor X11. - + Slow Lento - + Turbo Turbo - + Unlocked Desbloqueado - + Select RomFS Dump Target Seleccione el destinatario para el volcado del RomFS - + Please select which RomFS you would like to dump. Por favor seleccione que RomFS desea volcar. - + Are you sure you want to close Eden? ¿Está seguro de que quiere cerrar Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. ¿Está seguro de que desea parar la emulación? Cualquier progreso sin guardar se perderá. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9212,41 +9321,41 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. - El juego que está tratando de abrir requiere firmware para arrancar o para pasar el menú de apertura. Por favor, <a href='https://yuzu-mirror.github.io/help/quickstart'>volcar e instalar el firmware</a>, o presionar "OK" para abrir de todas formas. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. + - + Installing Firmware... Instalando firmware... - - - - - + + + + + Cancel Cancelar - + Firmware Install Failed Instalación de Firmware Fallida. - + Firmware Install Succeeded Firmware instalado exitosamente. - + Firmware integrity verification failed! ¡Error en la verificación de integridad del firmware! - - + + Verification failed for the following files: %1 @@ -9255,237 +9364,237 @@ p, li { white-space: pre-wrap; } %1 - - + + Verifying integrity... Verificando integridad... - - + + Integrity verification succeeded! ¡La verificación de integridad ha sido un éxito! - - + + The operation completed successfully. La operación se completó con éxito. - - + + Integrity verification failed! ¡Verificación de integridad se fallo! - + File contents may be corrupt or missing. Los contenidos del archivo pueden estar corruptos. - + Integrity verification couldn't be performed No se pudo ejecutar la verificación de integridad - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. Instalacion de firmware cancellado , firmware podria estar en un mal estado o coruptos. contenidos de el archivo no pudieron ser verificados para validez. - + Select Dumped Keys Location Seleccionar ubicación de origen de los llaves volcados - + Decryption Keys install succeeded Instalación de llaves de descifra salo con exito - + Decryption Keys install failed Instalacion de las llaves de descifra se fallo - + Orphaned Profiles Detected! ¡Se detectaron perfiles huérfanos! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> ¡PODRÍAN SUCEDER COSAS MALAS E INESPERADAS SI NO LEE ESTO!<br>Eden ha detectado que los siguientes directorios de guardado no tienen perfil asociado:<br>%1<br><br>Los siguientes perfiles son válidos:<br>%2<br><br>Haga clic en "Aceptar" para abrir la carpeta de guardado y arreglar sus perfiles.<br>Consejo: copie el contenido de la carpeta más grande o la última modificada en otro lugar, elimine todos los perfiles huérfanos y mueva el contenido copiado al perfil correcto.<br><br>¿Aún tiene dudas? Consulte la <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>página de ayuda</a>.<br> - + Really clear data? ¿Realmente deseas borrar los datos? - + Important data may be lost! ¡Podrías perder información importante! - + Are you REALLY sure? ¿Estás REALMENTE seguro? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. ¡Una vez eliminados, tus datos no podrán recuperarse! Haz esto solo si estás 100% seguro de que deseas borrarlos. - + Clearing... Limpiando... - + Select Export Location Selecciona la Ubicación de Exportación. - + %1.zip %1.zip - - - + + + Zipped Archives (*.zip) Archivos comprimidos (*.zip) - + Exporting data. This may take a while... Exportando datos. Esto puede tardar un poco... - + Exporting Exportando - + Exported Successfully Exportación Exitosa. - + Data was exported successfully. Los datos se exportaron correctamente. - + Export Cancelled Exportación cancelada. - + Export was cancelled by the user. La exportación fue cancelada por el usuario. - + Export Failed Exportación Fallida - + Ensure you have write permissions on the targeted directory and try again. Asegúrate de tener permisos de escritura en el directorio seleccionado e inténtalo nuevamente. - + Select Import Location Seleccionar ubicación de importación. - + Import Warning Advertencia al importar datos - + All previous data in this directory will be deleted. Are you sure you wish to proceed? Todos los datos anteriores en este directorio serán eliminados. ¿Estás seguro de que deseas continuar? - + Importing data. This may take a while... Importando datos. Esto puede tomar unos minutos... - + Importing Importando - + Imported Successfully Importación completada con éxito. - + Data was imported successfully. Los datos se importaron correctamente. - + Import Cancelled La importación fue cancelada. - + Import was cancelled by the user. La importación fue cancelada por el usuario. - + Import Failed Importación Fallida. - + Ensure you have read permissions on the targeted directory and try again. Asegúrate de tener permisos de lectura en el directorio seleccionado e inténtalo nuevamente. - + Keys not installed Claves no instaladas - + Install decryption keys and restart Eden before attempting to install firmware. Instalar las claves de desencriptación y reiniciar Eden antes de intentar instalar el firmware. - + Select Dumped Firmware Source Location Seleccionar ubicación origen del firmware volcado - + Select Dumped Firmware ZIP Seleccionar el archivo ZIP del firmware volcado - + Firmware cleanup failed Fallo al limpiar firmware - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index bd2695f4f1..3c3ddc5354 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -571,70 +571,70 @@ FXAA can produce a more stable picture in lower resolutions. - + Fullscreen Mode: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +643,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -699,79 +699,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -781,1327 +781,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: - + The region of the console. - + Time Zone: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate - - - + + + Default - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe - + Paranoid (disables most optimizations) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed - + Exclusive Fullscreen - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - + Bilinear - + Bicubic - + Gaussian - + Lanczos - + ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None - + FXAA - + SMAA - + Default (16:9) - + Force 4:3 - + Force 21:9 - + Force 16:10 - + Stretch to Window - + Automatic - + 2x - + 4x - + 8x - + 16x - + Japanese (日本語) - + American English - + French (français) - + German (Deutsch) - + Italian (italiano) - + Spanish (español) - + Chinese - + Korean (한국어) - + Dutch (Nederlands) - + Portuguese (português) - + Russian (Русский) - + Taiwanese - + British English - + Canadian French - + Latin American Spanish - + Simplified Chinese - + Traditional Chinese (正體中文) - + Brazilian Portuguese (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan - + USA - + Europe - + Australia - + China - + Korea - + Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET - + CST6CDT - + Cuba - + EET - + Egypt - + Eire - + EST - + EST5EDT - + GB - + GB-Eire - + GMT - + GMT+0 - + GMT-0 - + GMT0 - + Greenwich - + Hongkong - + HST - + Iceland - + Iran - + Israel - + Jamaica - + Kwajalein - + Libya - + MET - + MST - + MST7MDT - + Navajo - + NZ - + NZ-CHAT - + Poland - + Portugal - + PRC - + PST8PDT - + ROC - + ROK - + Singapore - + Turkey - + UCT - + Universal - + UTC - + W-SU - + WET - + Zulu - + Mono - + Stereo - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked - + Handheld - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4806,6 +4806,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5889,50 +5998,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! openGL ei ole saatavilla! - + OpenGL shared contexts are not supported. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! Virhe käynnistäessä OpenGL ydintä! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. - + Error while initializing OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 - + This build doesn't have OpenGL support. @@ -6752,42 +6861,42 @@ Debug Message: - + &Multiplayer - + &Tools - + Am&iibo - + Launch &Applet - + &TAS - + &Create Home Menu Shortcut - + Install &Firmware - + &Help &Apu @@ -6813,7 +6922,7 @@ Debug Message: - + &Pause &Pysäytä @@ -6914,900 +7023,900 @@ Debug Message: - Open &Quickstart Guide + &User Handbook - - &FAQ - - - - + &Capture Screenshot - + &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + &Mii Editor - + &Configure TAS... - + Configure C&urrent Game... - - + + &Start &Käynnistä - + &Reset - - + + R&ecord - + Open &Controller Menu - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7815,74 +7924,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9063,275 +9172,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index 8526b3973d..fcee775250 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -592,12 +592,12 @@ SMAA offre la meilleure qualité. FXAA peut produire une image plus stable à des résolutions plus faibles. - + Fullscreen Mode: Mode Plein écran : - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -606,12 +606,12 @@ Sans bordure offre la meilleure compatibilité avec le clavier à l'écran Le mode plein écran exclusif peut offrir de meilleures performances et un meilleur support Freesync/Gsync. - + Aspect Ratio: Format : - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -620,35 +620,35 @@ La plupart des jeux ne supportent que le format 16:9, donc des modifications son Contrôle également le format des captures d’écran. - + Use persistent pipeline cache Conserver le cache du rendu graphique - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permet de sauvegarder les shaders sur le stockage pour un chargement plus rapide lors des démarrages ultérieurs du jeu. Le désactiver est uniquement destiné au débogage. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Émulation NVDEC : - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -657,12 +657,12 @@ Elles peuvent être décodées soit par le CPU, soit par le GPU, ou pas du tout Dans la plupart des cas, le décodage GPU offre les meilleures performances. - + ASTC Decoding Method: Méthode de décodage ASTC : - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -674,12 +674,12 @@ GPU : Utiliser les shaders de calcul du GPU pour décoder les textures ASTC (rec CPU asynchrone : Utiliser le CPU pour décoder les textures ASTC à la demande. Élimine les saccades liées au décodage ASTC, mais peut provoquer des artefacts. - + ASTC Recompression Method: Méthode de recompression ASTC : - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -687,44 +687,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3 : Le format intermédiaire sera recompressé en BC1 ou BC3, ce qui économise de la VRAM mais dégrade la qualité de l’image. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: Mode d'utilisation de la VRAM : - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Permet de choisir si l’émulateur doit privilégier la conservation de la mémoire ou utiliser au maximum la mémoire vidéo disponible pour les performances. Le mode agressif peut affecter les performances d’autres applications, comme les logiciels d’enregistrement. - + Skip CPU Inner Invalidation Ignorer l'invalidation interne du CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Ignore certaines invalidations de cache lors des mises à jour de la mémoire, réduisant l’utilisation du CPU et améliorant la latence. Cela peut provoquer des plantages légers. - + VSync Mode: Mode VSync : - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -735,12 +735,12 @@ Mailbox peut offrir une latence inférieure à FIFO et n’entraîne pas de déc Immediate (pas de synchronisation) affiche ce qui est disponible et peut provoquer du déchirement. - + Sync Memory Operations Synchroniser les opérations mémoire - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -749,68 +749,68 @@ Cette option corrige des problèmes dans les jeux, mais peut dégrader les perfo Les jeux Unreal Engine 4 sont souvent ceux qui bénéficient le plus de ce réglage. - + Enable asynchronous presentation (Vulkan only) Activer la présentation asynchrone (Vulkan uniquement) - + Slightly improves performance by moving presentation to a separate CPU thread. Améliore légèrement les performances en déplaçant la présentation vers un thread CPU séparé. - + Force maximum clocks (Vulkan only) Forcer la fréquence d'horloge maximale (Vulkan uniquement) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Les exécutions fonctionnent en arrière-plan en attendant les commandes graphiques pour empêcher le GPU de réduire sa vitesse de fréquence d'horloge. - + Anisotropic Filtering: Filtrage anisotropique : - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Contrôle la qualité du rendu des textures sous des angles obliques. Il est sûr de le régler à 16x sur la plupart des GPU. - + GPU Mode: Mode GPU : - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Précision du DMA : - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -820,100 +820,100 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Activer la compilation asynchrone des shaders - + May reduce shader stutter. Peut réduire les saccades dues aux shaders. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Utiliser le cache de pipeline Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Active le cache de pipeline spécifique au fournisseur de GPU. Cette option peut améliorer considérablement le temps de chargement des shaders dans les cas où le pilote Vulkan ne stocke pas les fichiers de cache de pipeline en interne. - + Enable Compute Pipelines (Intel Vulkan Only) Activer les pipelines de calcul (Vulkan sur Intel uniquement) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -922,95 +922,95 @@ Ce réglage n’existe que pour les pilotes propriétaires Intel et peut provoqu Les pipelines de calcul sont toujours activés sur tous les autres pilotes. - + Enable Reactive Flushing Activer le Vidage Réactif - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Utilise une purge réactive au lieu d'une purge prédictive, permettant une synchronisation de la mémoire plus précise. - + Sync to framerate of video playback Synchro la fréquence d'image de la relecture du vidéo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Éxécuter le jeu à une vitesse normale pendant la relecture du vidéo, même-ci la fréquence d'image est dévérouillée. - + Barrier feedback loops Boucles de rétroaction de barrière - + Improves rendering of transparency effects in specific games. Améliore le rendu des effets de transparence dans des jeux spécifiques. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State État dynamique étendu - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading Échantillonnage de shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permet au shader de fragments de s’exécuter pour chaque échantillon dans un fragment multi-échantillonné, au lieu d’une seule fois par fragment. @@ -1018,96 +1018,96 @@ Améliore la qualité graphique au prix de performances réduites. Des valeurs plus élevées améliorent la qualité mais dégradent les performances. - + RNG Seed Seed RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Contrôle la graine du générateur de nombres aléatoires. Principalement utilisé pour le speedrun. - + Device Name Nom de l'appareil - + The name of the console. Nom de la console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Date RTC personnalisée : - + This option allows to change the clock of the console. Can be used to manipulate time in games. Cette option permet de modifier l’horloge de la console. Peut être utilisée pour manipuler le temps dans les jeux. - + The number of seconds from the current unix time Nombre de secondes écoulées depuis le 1er janvier 1970. - + Language: Langue : - + This option can be overridden when region setting is auto-select Cette option peut être remplacée lorsque la région est sur auto. - + Region: Région : - + The region of the console. Région de la console. - + Time Zone: Fuseau horaire : - + The time zone of the console. Fuseau horaire de la console. - + Sound Output Mode: Mode de sortie sonore : - + Console Mode: Mode console : - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1116,1042 +1116,1042 @@ Les jeux adaptent leur résolution, leurs paramètres graphiques et les manettes Passer en mode Portable peut améliorer les performances sur les systèmes peu puissants. - + Prompt for user profile on boot Choisir l’utilisateur au démarrage. - + Useful if multiple people use the same PC. Utile si plusieurs personnes utilisent le même PC. - + Pause when not in focus Pause lorsque la fenêtre n’est pas active. - + Pauses emulation when focusing on other windows. Met l’émulation en pause dès que l’utilisateur change de fenêtre. - + Confirm before stopping emulation Confirmer avant d'arrêter l'émulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Ignore les demandes de confirmation pour arrêter l’émulation. L’activer permet de contourner ces confirmations et de quitter directement l’émulation. - + Hide mouse on inactivity Cacher la souris en cas d'inactivité - + Hides the mouse after 2.5s of inactivity. Cache le curseur après 2,5 secondes d’inactivité. - + Disable controller applet Désactiver l'applet du contrôleur - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Désactive de force le menu de configuration des manettes dans les programmes émulés. Lorsqu’un programme tente d’ouvrir ce menu, il est immédiatement fermé. - + Check for updates Rechercher des mises à jours - + Whether or not to check for updates upon startup. Vérifier ou non les mises à jour au démarrage. - + Enable Gamemode Activer le mode jeu - + Force X11 as Graphics Backend Forcer X11 comme moteur graphique - + Custom frontend Interface personnalisée - + Real applet Applet réel - + Never Jamais - + On Load Au chargement - + Always Toujours - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asynchrone - + Uncompressed (Best quality) Non compressé (Meilleure qualité) - + BC1 (Low quality) BC1 (Basse qualité) - + BC3 (Medium quality) BC3 (Qualité moyenne) - - + + Auto Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Conservateur - + Aggressive Agressif - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Nul - + Fast Rapide - - - + + + Accurate Précis - - - + + + Default Par défaut - + Unsafe (fast) Insecure (rapide) - + Safe (stable) Sûr (stable) - + Immediate - + Balanced Moyen - + Strict - + Unsafe Risqué - + Paranoid (disables most optimizations) Paranoïaque (désactive la plupart des optimisations) - + Debugging Débogage - + Dynarmic Dynamique - + NCE NCE - + Borderless Windowed Fenêtré sans bordure - + Exclusive Fullscreen Plein écran exclusif - + No Video Output Pas de sortie vidéo - + CPU Video Decoding Décodage Vidéo sur le CPU - + GPU Video Decoding (Default) Décodage Vidéo sur le GPU (par défaut) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPÉRIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPÉRIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1,25X (900p/1350p) [EXPÉRIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPÉRIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Plus proche voisin - + Bilinear Bilinéaire - + Bicubic Bicubique - + Gaussian Gaussien - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area (Par zone) - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Aucun - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Par défaut (16:9) - + Force 4:3 Forcer le 4:3 - + Force 21:9 Forcer le 21:9 - + Force 16:10 Forcer le 16:10 - + Stretch to Window Étirer à la fenêtre - + Automatic Automatique - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonais (日本語) - + American English Anglais Américain - + French (français) Français (français) - + German (Deutsch) Allemand (Deutsch) - + Italian (italiano) Italien (italiano) - + Spanish (español) Espagnol (español) - + Chinese Chinois - + Korean (한국어) Coréen (한국어) - + Dutch (Nederlands) Néerlandais (Nederlands) - + Portuguese (português) Portugais (português) - + Russian (Русский) Russe (Русский) - + Taiwanese Taïwanais - + British English Anglais Britannique - + Canadian French Français Canadien - + Latin American Spanish Espagnol d'Amérique Latine - + Simplified Chinese Chinois Simplifié - + Traditional Chinese (正體中文) Chinois Traditionnel (正體中文) - + Brazilian Portuguese (português do Brasil) Portugais Brésilien (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japon - + USA É.-U.A. - + Europe Europe - + Australia Australie - + China Chine - + Korea Corée - + Taiwan Taïwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Par défaut (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Égypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islande - + Iran Iran - + Israel Israël - + Jamaica Jamaïque - + Kwajalein Kwajalein - + Libya Libye - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Pologne - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapour - + Turkey Turquie - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stéréo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Par défaut) - + 6GB DRAM (Unsafe) 6 GB DRAM (Risqué) - + 8GB DRAM 8GO DRAM - + 10GB DRAM (Unsafe) 10GO DRAM (Insecure) - + 12GB DRAM (Unsafe) 12GO DRAM (Insecure) - + Docked Mode TV - + Handheld Mode Portable - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) Toujours demander (par défaut) - + Only if game specifies not to stop Uniquement si le jeu précise de ne pas s'arrêter - + Never ask Jamais demander - + Very Small (16 MB) Très petit (16Mo) - + Small (32 MB) Petit (32Mo) - + Normal (128 MB) Normal (128Mo) - + Large (256 MB) Large (256Mo) - + Very Large (512 MB) Très large (512Mo) - + Very Low (4 MB) Très faible (4 Mo) - + Low (8 MB) Faible (8 Mo) - + Normal (16 MB) Normal (16 Mo) - + Medium (32 MB) Moyen (32 Mo) - + High (64 MB) Élevé (64 Mo) - + Very Low (32) Très faible (32) - + Low (64) Faible (64) - + Normal (128) Normal (128) - + Medium (256) Moyen (256) - + High (512) Élevé (512) - + Disabled Désactivé - + ExtendedDynamicState 1 État dynamique étendu 1 - + ExtendedDynamicState 2 État dynamique étendu 2 - + ExtendedDynamicState 3 État dynamique étendu 3 - + Tree View Vue en liste - + Grid View Vue en grille @@ -4890,6 +4890,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5977,50 +6086,50 @@ Veuillez aller dans Configurer -> Système -> Réseau puis en choisir une. GRenderWindow - - + + OpenGL not available! OpenGL n'est pas disponible ! - + OpenGL shared contexts are not supported. Les contextes OpenGL partagés ne sont pas pris en charge. - + Eden has not been compiled with OpenGL support. Eden n'a pas été compilé avec le support OpenGL - - - + + + Error while initializing OpenGL! Erreur lors de l'initialisation d'OpenGL ! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Votre GPU peut ne pas prendre en charge OpenGL, ou vous n'avez pas les derniers pilotes graphiques. - + Error while initializing OpenGL 4.6! Erreur lors de l'initialisation d'OpenGL 4.6 ! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Votre GPU peut ne pas prendre en charge OpenGL 4.6 ou vous ne disposez pas du dernier pilote graphique: %1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Votre GPU peut ne pas prendre en charge une ou plusieurs extensions OpenGL requises. Veuillez vous assurer que vous disposez du dernier pilote graphique.<br><br>GL Renderer :<br>%1<br><br>Extensions non prises en charge :<br>%2 - + This build doesn't have OpenGL support. @@ -6842,42 +6951,42 @@ Message de débogage : Réinitialiser la taille de la fenêtre à 1080p - + &Multiplayer &Multijoueur - + &Tools &Outils - + Am&iibo Am&iibo - + Launch &Applet - + &TAS &TAS - + &Create Home Menu Shortcut &Créer un Raccourci du Menu d'Accueil - + Install &Firmware Installer le &Firmware - + &Help &Aide @@ -6903,7 +7012,7 @@ Message de débogage : - + &Pause &Pause @@ -7004,900 +7113,900 @@ Message de débogage : - Open &Quickstart Guide - Ouvrir le &guide de démarrage rapide + &User Handbook + - - &FAQ - &FAQ - - - + &Capture Screenshot &Capture d'écran - + &Album - + &Set Nickname and Owner &Définir le surnom et le propriétaire - + &Delete Game Data &Supprimer les données du jeu - + &Restore Amiibo &Restaurer l'amiibo - + &Format Amiibo &Formater l'amiibo - + &Mii Editor - + &Configure TAS... &Configurer TAS... - + Configure C&urrent Game... Configurer le j&eu actuel... - - + + &Start &Démarrer - + &Reset &Réinitialiser - - + + R&ecord En&registrer - + Open &Controller Menu Ouvrir le &menu des manettes - + Install Decryption &Keys Installer les &clés de déchiffrement - + &Home Menu - + &Desktop &Bureau - + &Application Menu &Menu de l'Application - + &Root Data Folder &Dossier de Données (Root) Principal. - + &NAND Folder &Dossier NAND - + &SDMC Folder &Dossier SDMC - + &Mod Folder &Dossier Mod - + &Log Folder &Dossier Log - + From Folder Depuis un dossier - + From ZIP Depuis une archive ZIP - + &Eden Dependencies Dépendances d'&Eden - + &Data Manager &Gestionnaire de données - + &Tree View - + &Grid View - + Game Icon Size - - + + None Aucun - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Remettre le son - + Mute Couper le son - + Reset Volume Réinitialiser le volume - + &Clear Recent Files - + &Continue &Continuer - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... Fermeture du logiciel... - + Save Data Données de sauvegarde - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? Réinitialiser le temps de jeu ? - - + + RomFS Extraction Failed! L'extraction de la RomFS a échoué ! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel Annuler - + RomFS Extraction Succeeded! Extraction de la RomFS réussi ! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties Propriétés - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game Jeu - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install Échec de l'installation - + The title type you selected for the NCA is invalid. - + File not found Fichier non trouvé - + File "%1" not found - + OK OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed - + Error Erreur - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo Charger un Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted Firmware corrompu - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE VOLUME : MUET - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! Wayland détecté ! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7905,74 +8014,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9172,41 +9281,41 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. - Le jeu que vous essayez de lancer nécessite un firmware pour démarrer ou pour passer le menu d’ouverture. Veuillez <a href='https://yuzu-mirror.github.io/help/quickstart'>dumper et installer le firmware</a>, ou appuyez sur « OK » pour lancer quand même. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. + - + Installing Firmware... Installation du firmware... - - - - - + + + + + Cancel Annuler - + Firmware Install Failed Installation du firmware échoué - + Firmware Install Succeeded Installation du firmware réussi - + Firmware integrity verification failed! Échec de la vérification de l'intégrité du firmware ! - - + + Verification failed for the following files: %1 @@ -9215,235 +9324,235 @@ p, li { white-space: pre-wrap; } %1 - - + + Verifying integrity... Vérification de l'intégrité... - - + + Integrity verification succeeded! La vérification de l'intégrité réussi ! - - + + The operation completed successfully. L'opération s'est déroulée avec succès. - - + + Integrity verification failed! La vérification de l'intégrité a échoué ! - + File contents may be corrupt or missing. Le contenu d'un fichier peut être corrompu or manquant. - + Integrity verification couldn't be performed La vérification de l'intégrité n'a pas pu être effectuée - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. Installation du firmware annulée, le firmware est peut-être en mauvais état ou corrompu. Impossible de vérifier la validité du contenu du fichier. - + Select Dumped Keys Location Sélectionner Emplacement Clés Extraites - + Decryption Keys install succeeded Installation des clés de décryptage avec succès - + Decryption Keys install failed Installation des clés de décryptage échoué - + Orphaned Profiles Detected! Profils orphelins détectés ! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> DES CHOSES GRAVES INATTENDUES PEUVENT SURVENIR SI VOUS NE LISEZ PAS CECI !<br>Eden a détecté les répertoires de sauvegarde suivants sans profil associé :<br>%1<br><br>Les profils suivants sont valides :<br>%2<br><br>Cliquez sur « OK » pour ouvrir votre dossier de sauvegarde et corriger vos profils.<br>Astuce : copiez le contenu du dossier le plus volumineux ou le plus récemment modifié ailleurs, supprimez tous les profils orphelins et déplacez le contenu copié vers le profil correct.<br><br>Toujours confus ? Consultez la <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>page d’aide</a>.<br> - + Really clear data? Vraiment effacer les données ? - + Important data may be lost! Des données importantes peuvent être perdues ! - + Are you REALLY sure? Êtes-vous VRAIMENT sûr ? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. Une fois supprimées, vos données NE POURRONT PAS être récupérées ! Ne faites cela que si vous êtes sûr à 100 % de vouloir supprimer ces données. - + Clearing... Suppression en cours… - + Select Export Location Sélectionner l’emplacement d’exportation - + %1.zip %1.zip - - - + + + Zipped Archives (*.zip) Archives compressées (*.zip) - + Exporting data. This may take a while... Exportation des données en cours. Cela peut prendre un certain temps… - + Exporting Exportation en cours… - + Exported Successfully Exportation réussie - + Data was exported successfully. Les données ont été exportées avec succès. - + Export Cancelled Exportation annulée - + Export was cancelled by the user. L’exportation a été annulée par l’utilisateur. - + Export Failed Échec de l’exportation - + Ensure you have write permissions on the targeted directory and try again. Assurez-vous d’avoir les permissions d’écriture sur le répertoire ciblé et réessayez. - + Select Import Location Sélectionner l’emplacement d’importation - + Import Warning Avertissement d’importation - + All previous data in this directory will be deleted. Are you sure you wish to proceed? Toutes les données précédentes de ce répertoire seront supprimées. Êtes-vous sûr de vouloir continuer ? - + Importing data. This may take a while... Importation des données en cours. Cela peut prendre un certain temps… - + Importing Importation en cours… - + Imported Successfully Importation réussie - + Data was imported successfully. Les données ont été importées avec succès. - + Import Cancelled Importation annulée - + Import was cancelled by the user. L’importation a été annulée par l’utilisateur. - + Import Failed Échec de l’importation - + Ensure you have read permissions on the targeted directory and try again. Assurez-vous d’avoir les permissions de lecture sur le répertoire ciblé et réessayez. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/hu.ts b/dist/languages/hu.ts index 1f47c4e564..11f04195b9 100644 --- a/dist/languages/hu.ts +++ b/dist/languages/hu.ts @@ -572,12 +572,12 @@ FXAA can produce a more stable picture in lower resolutions. - + Fullscreen Mode: Teljes képernyős mód: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -586,47 +586,47 @@ A borderless (szegély nélküli) biztosítja a legjobb kompatibilitást a képe Az exkluzív teljes képernyő jobb teljesítményt és jobb Freesync/Gsync támogatást kínálhat. - + Aspect Ratio: Képarány: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Lehetővé teszi az árnyékolók tárolását a gyorsabb betöltés érdekében a következő játékindításokkor. Kikapcsolása csak hibakeresésre szolgál. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC emuláció: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -635,12 +635,12 @@ A dekódoláshoz használhatja a CPU-t vagy a GPU-t, vagy egyáltalán nem vége A legtöbb esetben a GPU dekódolás nyújtja a legjobb teljesítményt. - + ASTC Decoding Method: ASTC dekódoló módszer: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -649,55 +649,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: ASTC újraszűrési módszer: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: VRAM használati mód: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: VSync mód: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -705,79 +705,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Aszinkron prezentálás engedélyezése (csak Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Kicsit javítja a teljesítményt azáltal, hogy a megjelenítést külön CPU szálra helyezi át. - + Force maximum clocks (Vulkan only) Maximális órajelek kényszerítése (csak Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. A háttérben fut, miközben várja a grafikai parancsokat, hogy a GPU ne csökkentse az órajelét. - + Anisotropic Filtering: Anizotropikus szűrés: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -787,1327 +787,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Vulkan pipeline gyorsítótár használata. - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Reaktív ürítés használata - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Reaktív ürítést használ a prediktív ürítés helyett, ami pontosabb memóriaszinkronizálást tesz lehetővé. - + Sync to framerate of video playback Szinkronizálás a videolejátszás képkockasebességéhez - + Run the game at normal speed during video playback, even when the framerate is unlocked. A játék futtatása normál sebességgel videolejátszás közben, még akkor is, ha a képkockasebesség fel van oldva. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. Javítja az átlátszósági effektek megjelenítését bizonyos játékokban. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Eszköznév - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Egyéni RTC dátum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Nyelv: - + This option can be overridden when region setting is auto-select - + Region: Régió: - + The region of the console. - + Time Zone: Időzóna: - + The time zone of the console. - + Sound Output Mode: Hangkimeneti mód: - + Console Mode: Konzol mód: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Emuláció leállításának megerősítése - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Egér elrejtése inaktivitáskor - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Vezérlő applet letiltása - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Játékmód engedélyezése - + Force X11 as Graphics Backend - + Custom frontend Egyéni frontend - + Real applet Valódi applet - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU aszinkron - + Uncompressed (Best quality) Tömörítetlen (legjobb minőség) - + BC1 (Low quality) BC1 (alacsony minőség) - + BC3 (Medium quality) BC3 (közepes minőség) - - + + Auto Automatikus - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Takarékos - + Aggressive Aggresszív - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Pontos - - - + + + Default Alapértelmezett - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Nem biztonságos - + Paranoid (disables most optimizations) Paranoid (a legtöbb optimalizálást letiltja) - + Debugging - + Dynarmic Dinamikus - + NCE NCE - + Borderless Windowed Szegély nélküli ablak - + Exclusive Fullscreen Exkluzív teljes képernyő - + No Video Output Nincs videokimenet - + CPU Video Decoding CPU videódekódolás - + GPU Video Decoding (Default) GPU videódekódolás (alapértelmezett) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [KÍSÉRLETI] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [KÍSÉRLETI] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [KÍSÉRLETI] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Legközelebbi szomszéd - + Bilinear Bilineáris - + Bicubic Bikubikus - + Gaussian Gauss-féle - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nincs - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Alapértelmezett (16:9) - + Force 4:3 4:3 kényszerítése - + Force 21:9 21:9 kényszerítése - + Force 16:10 16:10 kényszerítése - + Stretch to Window Ablakhoz nyújtás - + Automatic Automatikus - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japán (日本語) - + American English Amerikai angol - + French (français) Francia (français) - + German (Deutsch) Német (Deutsch) - + Italian (italiano) Olasz (italiano) - + Spanish (español) Spanyol (español) - + Chinese Kínai - + Korean (한국어) Koreai (한국어) - + Dutch (Nederlands) Holland (Nederlands) - + Portuguese (português) Portugál (português) - + Russian (Русский) Orosz (Русский) - + Taiwanese Tajvani - + British English Brit Angol - + Canadian French Kanadai francia - + Latin American Spanish Latin-amerikai spanyol - + Simplified Chinese Egyszerűsített kínai - + Traditional Chinese (正體中文) Hagyományos kínai (正體中文) - + Brazilian Portuguese (português do Brasil) Brazíliai portugál (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japán - + USA USA - + Europe Európa - + Australia Ausztrália - + China Kína - + Korea Korea - + Taiwan Tajvan - + Auto (%1) Auto select time zone Automatikus (%1) - + Default (%1) Default time zone Alapértelmezett (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egyiptom - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Izland - + Iran Irán - + Israel Izrael - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navahó - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Lengyelország - + Portugal Portugália - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Szingapúr - + Turkey Törökország - + UCT UCT - + Universal Univerzális - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Sztereó - + Surround Térhangzás - + 4GB DRAM (Default) 4GB DRAM (Alapértelmezett) - + 6GB DRAM (Unsafe) 6GB DRAM (Nem biztonságos) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokkolt - + Handheld Kézi - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) Mindig kérdezz rá (alapértelmezett) - + Only if game specifies not to stop Csak akkor, ha a játék kifejezetten kéri a folytatást. - + Never ask Soha ne kérdezz rá - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4819,6 +4819,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5904,50 +6013,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL nem elérhető! - + OpenGL shared contexts are not supported. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! Hiba történt az OpenGL inicializálása során! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Lehetséges, hogy a GPU-d nem támogatja az OpenGL-t, vagy nem a legfrissebb grafikus illesztőprogram van telepítve. - + Error while initializing OpenGL 4.6! Hiba történt az OpenGL 4.6 inicializálása során! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Lehetséges, hogy a GPU-d nem támogatja az OpenGL 4.6-ot, vagy nem a legfrissebb grafikus illesztőprogram van telepítve.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Előfordulhat, hogy a GPU-d nem támogat egy vagy több szükséges OpenGL kiterjesztést. Győződj meg róla, hogy a legújabb videokártya-illesztőprogramot használod.<br><br>GL Renderer:<br>%1<br><br>Nem támogatott kiterjesztések:<br>%2 - + This build doesn't have OpenGL support. @@ -6768,42 +6877,42 @@ Debug Message: Ablakfelbontás visszaállítása 1080p-re - + &Multiplayer &Multiplayer - + &Tools &Eszközök - + Am&iibo - + Launch &Applet - + &TAS &TAS - + &Create Home Menu Shortcut - + Install &Firmware - + &Help &Segítség @@ -6829,7 +6938,7 @@ Debug Message: - + &Pause &Szünet @@ -6930,900 +7039,900 @@ Debug Message: - Open &Quickstart Guide - &Gyorstájékoztató megnyitása + &User Handbook + - - &FAQ - &GYIK - - - + &Capture Screenshot &Képernyőkép készítése - + &Album - + &Set Nickname and Owner &Becenév és tulajdonos beállítása - + &Delete Game Data &Játékadatok törlése - + &Restore Amiibo &Amiibo helyreállítása - + &Format Amiibo &Amiibo formázása - + &Mii Editor - + &Configure TAS... &TAS konfigurálása... - + Configure C&urrent Game... J&elenlegi játék konfigurálása... - - + + &Start &Indítás - + &Reset &Visszaállítás - - + + R&ecord F&elvétel - + Open &Controller Menu &Vezérlő menü megnyitása - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7831,74 +7940,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9085,275 +9194,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/id.ts b/dist/languages/id.ts index 0ccf66400b..30f30a8c1d 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -583,12 +583,12 @@ FXAA can produce a more stable picture in lower resolutions. - + Fullscreen Mode: Mode Layar Penuh: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -597,47 +597,47 @@ Borderless menawarkan kompatibilitas terbaik dengan keyboard di layar yang dimin Layar penuh eksklusif mungkin menawarkan performa yang lebih baik dan dukungan Freesync/Gsync yang lebih baik. - + Aspect Ratio: Rasio Aspek: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Memungkinkan penyimpanan shader untuk mempercepat pengambilan pada saat game berikutnya dimulai. Menonaktifkannya hanya dimaksudkan untuk debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Emulasi NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -646,12 +646,12 @@ Ini dapat menggunakan CPU atau GPU untuk dekode, atau tidak melakukan dekode sam Dalam kebanyakan kasus, dekode GPU memberikan kinerja terbaik. - + ASTC Decoding Method: ASTC Metode Dekoding: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -660,55 +660,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: ASTC Metode Pemampatan Ulang: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: Mode Penggunaan VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation Abaikan Invalidasi Internal CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: Mode Sinkronisasi Vertikal - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -716,79 +716,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations Sinkronisasi Operasi Memori - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Aktifkan presentasi asinkron (hanya Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Meningkatkan kinerja sedikit dengan memindahkan presentasi ke thread CPU terpisah. - + Force maximum clocks (Vulkan only) Paksa jam maximum (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Berjalan bekerja di latar belakang sambil menunggu perintah grafis untuk mencegah GPU agar tidak menurunkan kecepatan jamnya. - + Anisotropic Filtering: Anisotropic Filtering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: Mode GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Akurasi DMA - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -798,1328 +798,1328 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Gunakan kompilasi shader asinkron - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Gunakan pipeline cache Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Memungkinkan cache pipeline spesifik vendor GPU. Opsi ini dapat meningkatkan waktu pemuatan shader secara signifikan dalam kasus di mana driver Vulkan tidak menyimpan file cache pipeline secara internal. - + Enable Compute Pipelines (Intel Vulkan Only) Aktifkan Pipa Komputasi (Hanya Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Aktifkan Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Menggunakan pemadatan reaktif alih-alih pemadatan prediktif, memungkinkan sinkronisasi memori yang lebih akurat. - + Sync to framerate of video playback Sinkronkan dengan kecepatan pemutaran video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Jalankan permainan dengan kecepatan normal selama pemutaran video, bahkan ketika framerate tidak terkunci. - + Barrier feedback loops Loop umpan balik penghalang - + Improves rendering of transparency effects in specific games. Meningkatkan rendering efek transparansi dalam game tertentu. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects Perbaiki efek bloom - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading Pencahayaan Sampel - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Benih RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Nama Perangkat - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Tanggal RTC Kustom: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Bahasa - + This option can be overridden when region setting is auto-select - + Region: Wilayah: - + The region of the console. - + Time Zone: Zona Waktu: - + The time zone of the console. - + Sound Output Mode: Mode keluaran suara. - + Console Mode: Mode Konsol - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Konfirmasi sebelum menghentikan emulasi - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Sembunyikan mouse saat tidak aktif - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Nonaktifkan aplikasi pengontrol - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates Cek Pembaruan - + Whether or not to check for updates upon startup. - + Enable Gamemode Aktifkan Mode Permainan - + Force X11 as Graphics Backend - + Custom frontend Tampilan depan kustom - + Real applet Aplikasi nyata - + Never Tidak Pernah - + On Load - + Always Selalu - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU sinkron - + Uncompressed (Best quality) Tidak terkompresi (Kualitas Terbaik) - + BC1 (Low quality) BC1 (Kualitas rendah) - + BC3 (Medium quality) BC3 (Kualitas sedang) - - + + Auto Otomatis - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Konservatif - + Aggressive Agresif - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast Cepat - - - + + + Accurate Akurat - - - + + + Default Bawaan - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced Seimbang - + Strict - + Unsafe Berbahaya - + Paranoid (disables most optimizations) Paranoid (menonaktifkan sebagian besar optimasi) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Layar Tanpa Batas - + Exclusive Fullscreen Layar Penuh Eksklusif - + No Video Output Tidak ada Keluaran Suara - + CPU Video Decoding Penguraian Video menggunakan CPU - + GPU Video Decoding (Default) Penguraian Video menggunakan GPU (Bawaan) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EKSPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EKSPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EKSPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Biliner - + Bicubic Bikubik - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Tak ada - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Bawaan (16:9) - + Force 4:3 Paksa 4:3 - + Force 21:9 Paksa 21:9 - + Force 16:10 Paksa 16:10 - + Stretch to Window Regangkan ke Layar - + Automatic Otomatis - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Jepang (日本語) - + American English Bahasa Inggris Amerika - + French (français) Prancis (français) - + German (Deutsch) Jerman (Deutsch) - + Italian (italiano) Italia (italiano) - + Spanish (español) Spanyol (español) - + Chinese Cina - + Korean (한국어) Korea (한국어) - + Dutch (Nederlands) Belanda (Nederlands) - + Portuguese (português) Portugis (português) - + Russian (Русский) Rusia (Русский) - + Taiwanese Taiwan - + British English Inggris Britania - + Canadian French Prancis Kanada - + Latin American Spanish Spanyol Amerika Latin - + Simplified Chinese Cina Sederhana - + Traditional Chinese (正體中文) Cina Tradisional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugis Brazil (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Jepang - + USA USA - + Europe Eropa - + Australia Australia - + China Tiongkok - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Bawaan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Mesir - + Eire Éire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Éire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polandia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turki - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Bawaan) - + 6GB DRAM (Unsafe) 6GB DRAM (Tidak Aman) - + 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Tidak Aman) - + 12GB DRAM (Unsafe) 12GB DRAM (Tidak Aman) - + Docked Terpasang - + Handheld Jinjing - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) Selalu tanyakan (Bawaan) - + Only if game specifies not to stop Hanya jika permainan menentukan untuk tidak berhenti - + Never ask Jangan pernah bertanya - + Very Small (16 MB) Sangat Kecil (16 MB) - + Small (32 MB) Kecil (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Sedang (256) - + High (512) Tinggi (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4856,6 +4856,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5939,50 +6048,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL tidak tersedia! - + OpenGL shared contexts are not supported. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! Terjadi kesalahan menginisialisasi OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. VGA anda mungkin tidak mendukung OpenGL, atau anda tidak memiliki pemacu piranti (driver) grafis terbaharu. - + Error while initializing OpenGL 4.6! Terjadi kesalahan menginisialisasi OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 VGA anda mungkin tidak mendukung OpenGL 4.6, atau anda tidak memiliki pemacu piranti (driver) grafis terbaharu.<br><br>Pemuat GL:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 VGA anda mungkin tidak mendukung satu atau lebih ekstensi OpenGL. Mohon pastikan bahwa anda memiliki pemacu piranti (driver) grafis terbaharu.<br><br>Pemuat GL:<br>%1<br><br>Ekstensi yang tidak didukung:<br>%2 - + This build doesn't have OpenGL support. @@ -6802,42 +6911,42 @@ Debug Message: - + &Multiplayer - + &Tools - + Am&iibo - + Launch &Applet - + &TAS - + &Create Home Menu Shortcut - + Install &Firmware - + &Help @@ -6863,7 +6972,7 @@ Debug Message: - + &Pause &Jeda @@ -6964,900 +7073,900 @@ Debug Message: - Open &Quickstart Guide - Buka %Panduan cepat - - - - &FAQ + &User Handbook - + &Capture Screenshot - + &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + &Mii Editor - + &Configure TAS... - + Configure C&urrent Game... - - + + &Start &Mulai - + &Reset - - + + R&ecord R&ekam - + Open &Controller Menu - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7865,74 +7974,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9113,275 +9222,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/it.ts b/dist/languages/it.ts index 9a94adc3f9..bb485065c8 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -592,12 +592,12 @@ SMAA offre la migliore qualità. FXAA può produrre un'immagine più stabile nelle risoluzioni più basse. - + Fullscreen Mode: Modalità schermo intero: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -606,12 +606,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp "Schermo intero esclusivo" può offrire prestazioni maggiori e un supporto migliore al Freesync/Gsync. - + Aspect Ratio: Rapporto d'aspetto: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -620,36 +620,36 @@ La maggior parte dei giochi supporta solo 16:9, quindi le mod sono necessarie pe Controlla anche il rapporto d'aspetto degli screenshot. - + Use persistent pipeline cache Usa la cache persistente delle pipeline - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permette di salvare gli shader su disco per velocizzarne il caricamento negli avvii successivi del gioco. Disabilitarla ha senso solo quando si effettua il debug. - + Use asynchronous GPU emulation Abilita l'emulazione asincrona della GPU - + Uses an extra CPU thread for rendering. This option should always remain enabled. Utilizza un thread aggiuntivo della CPU per il rendering. Quest'opzione dovrebbe sempre rimanere abilitata. - + NVDEC emulation: Emulazione NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -658,12 +658,12 @@ In most cases, GPU decoding provides the best performance. Nella maggior parte dei casi, la decodifica tramite GPU fornisce prestazioni migliori. - + ASTC Decoding Method: Metodo di decodifica ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -675,12 +675,12 @@ GPU: Usa i compute shader della GPU per decodificare le texture ASTC (consigliat CPU (Asincrono): Usa la CPU per decodificare le texture ASTC se richiesto. Elimina lo stuttering causato dalla decodifica ma potrebbe generare artefatti visivi. - + ASTC Recompression Method: Metodo di ricompressione ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -688,44 +688,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3: Il formato intermedio sarà ricompresso nel formato BC1 o BC3, risparmiando VRAM ma peggiorando la qualità visiva. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: Modalità di utilizzo della VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Determina se l'emulatore dovrebbe risparmiare memoria o utilizzarne il più possibile per massimizzare le prestazioni. La modalità aggressiva potrebbe impattare sulle prestazioni di altre applicazioni, come i programmi di registrazione. - + Skip CPU Inner Invalidation Salta invalidamento interno CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Salta alcuni invalidamenti della cache durante gli aggiornamenti della memoria, riducendo l'uso della CPU e migliorando la latenza. Questo potrebbe causare soft-crash. - + VSync Mode: Modalità VSync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -736,12 +736,12 @@ Mailbox può avere una latenza minore di FIFO e non ha tearing ma potrebbe perde Immediate (no sincronizzazione) mostra tutto il disponibile, quindi anche tearing. - + Sync Memory Operations Sincronizza operazioni di memoria - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -750,68 +750,68 @@ Questa opzione dovrebbe risolvere problemi in alcuni giochi, ma potrebbe ridurre I giochi con Unreal Engine 4 sembrano essere i più colpiti. - + Enable asynchronous presentation (Vulkan only) Abilita la presentazione asincrona (solo Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Migliora di poco le prestazioni spostando la presentazione su un thread della CPU separato. - + Force maximum clocks (Vulkan only) Forza clock massimi (solo Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Esegue del lavoro in background durante l'attesa dei comandi grafici per evitare che la GPU diminuisca la sua velocità di clock. - + Anisotropic Filtering: Filtro anisotropico: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Controlla la qualità del rendering delle texture negli angoli obliqui. Si può utilizzare in modo sicuro al 16x su quasi tutte le GPU. - + GPU Mode: Modalità GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Precisione DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -821,100 +821,100 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Abilita la compilazione asincrona degli shader - + May reduce shader stutter. Può ridurre i fenomeni di stuttering (scatti) causati dagli shader. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Usa la cache delle pipeline di Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Abilita la cache delle pipeline specifica del produttore della GPU. Quest'opzione può ridurre di molto i tempi di caricamento degli shader nei casi in cui il driver Vulkan non memorizza la cache delle pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Abilita le compute pipeline (solo per Vulkan su Intel) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -923,192 +923,192 @@ Quest'impostazione esiste solo per i driver proprietari Intel e potrebbe fa Le compute pipelines sono sempre attivate su tutti gli altri drivers. - + Enable Reactive Flushing Abilita il flushing reattivo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Utilizza il flushing reattivo invece di quello predittivo, al fine di ottenere una sincronizzazione della memoria più accurata. - + Sync to framerate of video playback Sincronizza il framerate a quello del video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Esegue il gioco a velocità normale durante le cutscene, anche quando il framerate è sbloccato. - + Barrier feedback loops Barrier feedback loops - + Improves rendering of transparency effects in specific games. Migliora il rendering degli effetti di trasparenza in alcuni giochi. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State Stato dinamico esteso - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Controlla il numero di funzionalità che possono essere usate con lo stato dinamico esteso. Gli stati più alti consentono più funzionalità e possono migliorare le prestazioni, ma possono causare ulteriori problemi grafici. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading Sample shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permette al fragment shader di eseguire per campione in un frammento multi-campione invece che una volta per frammento. Migliora la qualità grafica a scapito delle prestazioni. Alti valori migliorano la qualità ma peggiorano le prestazioni. - + RNG Seed Seed RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Controlla il seme del generatore di numeri casuali. Principalmente utilizzato per le speedrun. - + Device Name Nome del dispositivo - + The name of the console. Il nome della console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Data RTC personalizzata: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Quest'opzione permette di modificare l'orologio della console. Può essere usato per manipolare il tempo nei giochi. - + The number of seconds from the current unix time Il numero di secondi dal tempo Unix attuale - + Language: Lingua: - + This option can be overridden when region setting is auto-select Può essere rimpiazzato se il fuso orario della Regione è impostato su Auto - + Region: Regione: - + The region of the console. La regione della console. - + Time Zone: Fuso orario: - + The time zone of the console. Il fuso orario della console. - + Sound Output Mode: Modalità di output del suono: - + Console Mode: Modalità console: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1117,1042 +1117,1042 @@ I giochi ne terranno conto e modificheranno la risoluzione, i dettagli e i contr Impostare l'opzione su "Portatile" può aiutare a migliorare le prestazioni sui sistemi meno potenti. - + Prompt for user profile on boot Scegli il profilo utente all'avvio - + Useful if multiple people use the same PC. Utile se più persone utilizzano lo stesso PC. - + Pause when not in focus Metti in pausa quando la finestra non è in primo piano - + Pauses emulation when focusing on other windows. Mette in pausa l'emulazione quando altre finestre sono in primo piano. - + Confirm before stopping emulation Chiedi conferma prima di arrestare l'emulazione - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Sovrascrive le richieste di conferma per fermare l'emulazione. Abilitarla bypassa queste richieste e l'emulazione cesserà immediatamente. - + Hide mouse on inactivity Nascondi il puntatore del mouse se inattivo - + Hides the mouse after 2.5s of inactivity. Nasconde il mouse dopo 2,5 secondi di inattività. - + Disable controller applet Disabilita l'applet controller - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Disabilita forzatamente l'uso dell'applet del controller nei programmi emulati. Quando un programma proverà ad aprire l'applet del controller, quest'ultimo verrà immediatamente chiuso. - + Check for updates Controlla la presenza di aggiornamenti - + Whether or not to check for updates upon startup. Determina se controllare o meno la presenza di aggiornamenti all'avvio. - + Enable Gamemode Abilita Gamemode - + Force X11 as Graphics Backend Forza l'uso del back-end grafico X11 - + Custom frontend Frontend personalizzato - + Real applet Applet reale - + Never Mai - + On Load Al caricamento - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU (Asincrono) - + Uncompressed (Best quality) Nessuna compressione (qualità migliore) - + BC1 (Low quality) BC1 (qualità bassa) - + BC3 (Medium quality) BC3 (qualità media) - - + + Auto Automatico - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservativa - + Aggressive Aggressiva - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (shader assembly, solo NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (sperimentale, solo AMD/MESA) - + Null Nullo - + Fast Veloce - - - + + + Accurate Accurata - - - + + + Default Predefinito - + Unsafe (fast) Non sicuro (veloce) - + Safe (stable) Sicuro (stabile) - + Immediate - + Balanced Bilanciata - + Strict - + Unsafe Non sicura - + Paranoid (disables most optimizations) Paranoica (disabilita la maggior parte delle ottimizzazioni) - + Debugging Debug - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Finestra senza bordi - + Exclusive Fullscreen Schermo intero esclusivo - + No Video Output Nessun output video - + CPU Video Decoding Decodifica video CPU - + GPU Video Decoding (Default) Decodifica video GPU (predefinita) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [SPERIMENTALE] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [SPERIMENTALE] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [SPERIMENTALE] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [SPERIMENTALE] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [SPERIMENTALE] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest neighbor - + Bilinear Bilineare - + Bicubic Bicubico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nessuna - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Predefinito (16:9) - + Force 4:3 Forza 4:3 - + Force 21:9 Forza 21:9 - + Force 16:10 Forza 16:10 - + Stretch to Window Allunga a finestra - + Automatic Automatico - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Giapponese (日本語) - + American English Inglese americano - + French (français) Francese (français) - + German (Deutsch) Tedesco (Deutsch) - + Italian (italiano) Italiano - + Spanish (español) Spagnolo (español) - + Chinese Cinese - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Olandese (Nederlands) - + Portuguese (português) Portoghese (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanese - + British English Inglese britannico - + Canadian French Francese canadese - + Latin American Spanish Spagnolo latino-americano - + Simplified Chinese Cinese semplificato - + Traditional Chinese (正體中文) Cinese tradizionale (正體中文) - + Brazilian Portuguese (português do Brasil) Portoghese brasiliano (português do Brasil) - + Polish (polska) Polacco (polska) - + Thai (แบบไทย) Thailandese (แบบไทย) - - + + Japan Giappone - + USA USA - + Europe Europa - + Australia Australia - + China Cina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatico (%1) - + Default (%1) Default time zone Predefinito (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egitto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islanda - + Iran Iran - + Israel Israele - + Jamaica Giamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portogallo - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turchia - + UCT UCT - + Universal Universale - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Predefinito) - + 6GB DRAM (Unsafe) 6GB DRAM (Non sicuro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Non sicuro) - + 12GB DRAM (Unsafe) 12GB DRAM (Non sicuro) - + Docked Dock - + Handheld Portatile - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) Chiedi sempre (Predefinito) - + Only if game specifies not to stop Solo se il gioco richiede di non essere arrestato - + Never ask Non chiedere mai - + Very Small (16 MB) Molto piccola (16 MB) - + Small (32 MB) Piccola (32 MB) - + Normal (128 MB) Normale (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Molto grande (512 MB) - + Very Low (4 MB) Molto bassa (4 MB) - + Low (8 MB) Bassa (8 MB) - + Normal (16 MB) Normale (16 MB) - + Medium (32 MB) Media (32 MB) - + High (64 MB) Alta (64 MB) - + Very Low (32) Molto basso (32) - + Low (64) Basso (64) - + Normal (128) Normale (128) - + Medium (256) Medio (256) - + High (512) Alto (512) - + Disabled Disabilitato - + ExtendedDynamicState 1 Stato dinamico esteso 1 - + ExtendedDynamicState 2 Stato dinamico esteso 2 - + ExtendedDynamicState 3 Stato dinamico esteso 3 - + Tree View Vista ad albero - + Grid View Vista a griglia @@ -4910,6 +4910,115 @@ Una volta rimosse, non potranno più essere recuperate. Sei assolutamente sicuro &Apri nel gestore file + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5997,50 +6106,50 @@ Vai su Configura -> Sistema -> Rete e selezionane una. GRenderWindow - - + + OpenGL not available! OpenGL non disponibile! - + OpenGL shared contexts are not supported. Gli shared context di OpenGL non sono supportati. - + Eden has not been compiled with OpenGL support. Eden non è stato compilato con il supporto a OpenGL. - - - + + + Error while initializing OpenGL! Errore durante l'inizializzazione di OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. La tua GPU potrebbe non supportare OpenGL, o non hai installato l'ultima versione dei driver video. - + Error while initializing OpenGL 4.6! Errore durante l'inizializzazione di OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 La tua GPU potrebbe non supportare OpenGL 4.6, o non hai installato l'ultima versione dei driver video.<br><br>Renderer GL:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 La tua GPU potrebbe non supportare una o più estensioni OpenGL richieste. Assicurati di aver installato i driver video più recenti.<br><br>Renderer GL:<br>%1<br><br>Estensioni non supportate:<br>%2 - + This build doesn't have OpenGL support. @@ -6862,42 +6971,42 @@ Messaggio debug: Ripristina le dimensioni della finestra a 1080p - + &Multiplayer &Multigiocatore - + &Tools &Strumenti - + Am&iibo Am&iibo - + Launch &Applet Avvia &applet - + &TAS &TAS - + &Create Home Menu Shortcut &Crea scorciatoia per il menù Home - + Install &Firmware Installa &firmware - + &Help &Aiuto @@ -6923,7 +7032,7 @@ Messaggio debug: - + &Pause &Pausa @@ -7024,578 +7133,578 @@ Messaggio debug: - Open &Quickstart Guide - Apri la &guida introduttiva + &User Handbook + - - &FAQ - &Domande frequenti - - - + &Capture Screenshot Cattura schermo - + &Album &Album - + &Set Nickname and Owner &Imposta nickname e proprietario - + &Delete Game Data &Rimuovi i dati di gioco - + &Restore Amiibo &Ripristina gli Amiibo - + &Format Amiibo &Formatta gli Amiibo - + &Mii Editor Editor &Mii - + &Configure TAS... &Configura TAS... - + Configure C&urrent Game... Configura il gioco in uso... - - + + &Start &Avvia - + &Reset &Reimposta - - + + R&ecord R&egistra - + Open &Controller Menu Apri il menù dei &controller - + Install Decryption &Keys Installa le &chiavi di crittografia - + &Home Menu Menù &Home - + &Desktop &Desktop - + &Application Menu &Menù delle applicazioni - + &Root Data Folder Cartella &principale dei dati - + &NAND Folder Cartella &NAND - + &SDMC Folder Cartella &SDMC - + &Mod Folder Cartella delle &mod - + &Log Folder Cartella dei &log - + From Folder Da una cartella - + From ZIP Da un file ZIP - + &Eden Dependencies &Dipendenze di Eden - + &Data Manager Gestione &dati - + &Tree View Vista ad &albero - + &Grid View Vista a &griglia - + Game Icon Size Dimensione delle icone dei giochi - - + + None Nessuno - + Show Game &Name Mostra i nomi dei giochi - + Show &Performance Overlay Mostra &prestazioni in sovrimpressione + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) Piccola (32x32) - + Standard (64x64) Normale (64x64) - + Large (128x128) Grande (128x128) - + Full Size (256x256) Intera (256x256) - + Broken Vulkan Installation Detected Rilevata installazione di Vulkan non funzionante - + Vulkan initialization failed during boot. L'inizializzazione di Vulkan è fallita durante l'avvio. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Gioco in esecuzione - + Loading Web Applet... Caricamento dell'applet web... - + Disable Web Applet Disabilita l'applet web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Disabilitare l'applet web potrebbe causare dei comportamenti indesiderati e andrebbe fatto solo con Super Mario 3D All-Stars. Sei sicuro di voler procedere? (Puoi riabilitarlo quando vuoi nelle impostazioni di debug.) - + The amount of shaders currently being built Il numero di shader in fase di compilazione - + The current selected resolution scaling multiplier. Il moltiplicatore attuale della risoluzione. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocità attuale dell'emulazione. Valori più alti o più bassi di 100% indicano che l'emulazione sta funzionando più velocemente o lentamente rispetto a una Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Il numero di fotogrammi al secondo che il gioco sta attualmente renderizzando. Può variare in base al gioco e alla situazione. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tempo necessario per emulare un fotogramma della Switch, senza tenere conto del limite al framerate o del V-Sync. Per un'emulazione alla massima velocità, il valore non dovrebbe essere superiore a 16.67 ms. - + Unmute Riattiva - + Mute Silenzia - + Reset Volume Reimposta volume - + &Clear Recent Files &Cancella i file recenti - + &Continue &Continua - + Warning: Outdated Game Format Attenzione: Formato del gioco obsoleto - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Stai usando una cartella contenente una ROM decostruita per avviare questo gioco, che è un formato obsoleto e sostituito da NCA, NAX, XCI o NSP. Le ROM decostruite non hanno icone né metadati e non supportano gli aggiornamenti.<br>Per una spiegazione sui vari formati della console Switch supportati da Eden, consulta il manuale utente. Non riceverai di nuovo questo avviso. - - + + Error while loading ROM! Errore nel caricamento della ROM! - + The ROM format is not supported. Il formato della ROM non è supportato. - + An error occurred initializing the video core. Errore durante l'inizializzazione del componente video di base - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - Eden ha riscontrato un errore durante l'esecuzione del componente video di base. Di solito questo errore è causato da driver GPU obsoleti, compresi quelli integrati. Consulta il log per maggiori dettagli. Per informazioni su come accedere al log, visita <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>questa pagina</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. + - + Error while loading ROM! %1 %1 signifies a numeric error code. Errore nel caricamento della ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Esegui un nuovo dump dei tuoi file o chiedi aiuto su Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Si è verificato un errore sconosciuto. Consulta il log per maggiori dettagli. - - + + (64-bit) (64 bit) - - + + (32-bit) (32 bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Chiusura del software in corso... - + Save Data Dati di salvataggio - + Mod Data Dati delle mod - + Error Opening %1 Folder Impossibile aprire la cartella %1 - - + + Folder does not exist! La cartella non esiste! - + Remove Installed Game Contents? Rimuovere il contenuto del gioco installato? - + Remove Installed Game Update? Rimuovere l'aggiornamento installato? - + Remove Installed Game DLC? Rimuovere il DLC installato? - + Remove Entry Rimuovi voce - + Delete OpenGL Transferable Shader Cache? Vuoi rimuovere la cache trasferibile degli shader OpenGL? - + Delete Vulkan Transferable Shader Cache? Vuoi rimuovere la cache trasferibile degli shader Vulkan? - + Delete All Transferable Shader Caches? Vuoi rimuovere tutte le cache trasferibili degli shader? - + Remove Custom Game Configuration? Rimuovere la configurazione personalizzata del gioco? - + Remove Cache Storage? Rimuovere la cache del gioco? - + Remove File Rimuovi file - + Remove Play Time Data Reimposta il tempo di gioco - + Reset play time? Vuoi reimpostare il tempo di gioco? - - + + RomFS Extraction Failed! Estrazione RomFS fallita! - + There was an error copying the RomFS files or the user cancelled the operation. Si è verificato un errore durante la copia dei file del RomFS o l'operazione è stata annullata dall'utente. - + Full Completa - + Skeleton Cartelle - + Select RomFS Dump Mode Seleziona la modalità di estrazione del RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Seleziona come vorresti estrarre il RomFS. <br>La modalità Completa copierà tutti i file in una nuova cartella mentre<br>la modalità Cartelle creerà solamente la struttura delle cartelle. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Non c'è abbastanza spazio disponibile in %1 per estrarre il RomFS. Libera lo spazio o seleziona una cartella di estrazione diversa in Emulazione > Configura > Sistema > File system > Cartella di estrazione - + Extracting RomFS... Estrazione RomFS in corso... - - + + Cancel Annulla - + RomFS Extraction Succeeded! Estrazione RomFS riuscita! - + The operation completed successfully. L'operazione è stata completata con successo. - + Error Opening %1 Impossibile aprire %1 - + Select Directory Seleziona cartella - + Properties Proprietà - + The game properties could not be loaded. Non è stato possibile caricare le proprietà del gioco. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Eseguibile Switch (%1);;Tutti i file (*.*) - + Load File Carica file - + Open Extracted ROM Directory Apri la cartella della ROM estratta - + Invalid Directory Selected Cartella selezionata non valida - + The directory you have selected does not contain a 'main' file. La cartella che hai selezionato non contiene un file "main". - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) File Switch installabili (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Installa file - + %n file(s) remaining %n file rimanente%n di file rimanenti%n file rimanenti - + Installing file "%1"... Installazione del file "%1"... - - + + Install Results Risultati dell'installazione - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Per evitare possibli conflitti, sconsigliamo di installare i giochi base su NAND. Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) were newly installed %n nuovo file è stato installato @@ -7604,7 +7713,7 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) were overwritten %n file è stato sovrascritto @@ -7613,7 +7722,7 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) failed to install %n file non è stato installato a causa di errori @@ -7622,314 +7731,314 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + System Application Applicazione di sistema - + System Archive Archivio di sistema - + System Application Update Aggiornamento di un'applicazione di sistema - + Firmware Package (Type A) Pacchetto firmware (tipo A) - + Firmware Package (Type B) Pacchetto firmware (tipo B) - + Game Gioco - + Game Update Aggiornamento di gioco - + Game DLC DLC - + Delta Title Titolo delta - + Select NCA Install Type... Seleziona il tipo di installazione NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Seleziona il tipo del file NCA da installare: (Nella maggior parte dei casi, il valore predefinito "Gioco" va bene) - + Failed to Install Installazione fallita - + The title type you selected for the NCA is invalid. Il tipo che hai selezionato per il file NCA non è valido. - + File not found File non trovato - + File "%1" not found File "%1" non trovato - + OK OK - + Function Disabled Funzionalità disabilitata - + Compatibility list reporting is currently disabled. Check back later! La segnalazione della compatibilità è al momento disabilitata. Torna a controllare più avanti! - + Error opening URL Impossibile aprire l'URL - + Unable to open the URL "%1". Non è stato possibile aprire l'URL "%1". - + TAS Recording Registrazione TAS - + Overwrite file of player 1? Vuoi sovrascrivere il file del giocatore 1? - + Invalid config detected Rilevata configurazione non valida - + Handheld controller can't be used on docked mode. Pro controller will be selected. Il controller portatile non può essere utilizzato in modalità dock. Verrà selezionato il controller Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed L'Amiibo corrente è stato rimosso - + Error Errore - - + + The current game is not looking for amiibos Il gioco in uso non è alla ricerca di Amiibo - + Amiibo File (%1);; All Files (*.*) File Amiibo (%1);; Tutti i file (*.*) - + Load Amiibo Carica Amiibo - + Error loading Amiibo data Impossibile caricare i dati dell'Amiibo - + The selected file is not a valid amiibo Il file selezionato non è un Amiibo valido - + The selected file is already on use Il file selezionato è già in uso - + An unknown error occurred Si è verificato un errore sconosciuto - + No firmware available Nessun firmware disponibile - + Firmware Corrupted Firmware corrotto - + Unknown applet Applet sconosciuto - + Applet doesn't map to a known value. L'applet non è associato a un valore noto. - + Record not found Non trovato - + Applet not found. Please reinstall firmware. Applet non trovato. Reinstalla il firmware. - + Capture Screenshot Cattura screenshot - + PNG Image (*.png) Immagine PNG (*.png) - + TAS state: Running %1/%2 Stato TAS: In esecuzione (%1/%2) - + TAS state: Recording %1 Stato TAS: Registrazione in corso (%1) - + TAS state: Idle %1/%2 Stato TAS: In attesa (%1/%2) - + TAS State: Invalid Stato TAS: Non valido - + &Stop Running &Interrompi esecuzione - + Stop R&ecording Interrompi r&egistrazione - + Building: %n shader(s) Compilazione di %n shaderCompilazione di %n shaderCompilazione di %n shader - + Scale: %1x %1 is the resolution scaling factor Risoluzione: %1x - + Speed: %1% / %2% Velocità: %1% / %2% - + Speed: %1% Velocità: %1% - + Game: %1 FPS Gioco: %1 FPS - + Frame: %1 ms Frame: %1 ms - + NO AA NO AA - + VOLUME: MUTE VOLUME: MUTO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + Derivation Components Missing Componenti di derivazione mancanti - + Decryption keys are missing. Install them now? Chiavi di crittografia mancanti. Vuoi installarle ora? - + Wayland Detected! Wayland rilevato! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7940,74 +8049,74 @@ Si consiglia invece di usare X11. Vuoi forzare l'uso di quest'ultimo per i prossimi avvii? - + Use X11 Usa X11 - + Continue with Wayland Continua con Wayland - + Don't show again Non mostrare di nuovo - + Restart Required Riavvio richiesto - + Restart Eden to apply the X11 backend. Riavvia Eden per usare il back-end X11. - + Slow Lento - + Turbo Turbo - + Unlocked Sbloccato - + Select RomFS Dump Target Seleziona RomFS da estrarre - + Please select which RomFS you would like to dump. Seleziona quale RomFS vorresti estrarre. - + Are you sure you want to close Eden? Sei sicuro di voler uscire da Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Sei sicuro di voler arrestare l'emulazione? Tutti i progressi non salvati verranno perduti. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9197,41 +9306,41 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. - Il gioco che stai cercando di avviare richiede il firmware per poter partire o per superare il menù iniziale. <a href='https://yuzu-mirror.github.io/help/quickstart'>Esegui il dump del firmware e installalo</a>, o premi "OK" per continuare lo stesso. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. + - + Installing Firmware... Installazione del firmware in corso... - - - - - + + + + + Cancel Annulla - + Firmware Install Failed Installazione del firmware fallita - + Firmware Install Succeeded Installazione del firmware riuscita - + Firmware integrity verification failed! Verifica dell'integrità del firmware fallita! - - + + Verification failed for the following files: %1 @@ -9240,235 +9349,235 @@ p, li { white-space: pre-wrap; } %1 - - + + Verifying integrity... Verifica dell'integrità in corso... - - + + Integrity verification succeeded! Verifica dell'integrità riuscita! - - + + The operation completed successfully. L'operazione è stata completata con successo. - - + + Integrity verification failed! Verifica dell'integrità fallita! - + File contents may be corrupt or missing. I contenuti dei file potrebbero essere corrotti o mancanti. - + Integrity verification couldn't be performed Impossibile effettuare la verifica dell'integrità - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. Installazione del firmware annullata, il firmware potrebbe essere corrotto o in cattivo stato. Non è stato possibile controllare la validità dei contenuti dei file. - + Select Dumped Keys Location Seleziona il percorso delle chiavi estratte - + Decryption Keys install succeeded Installazione delle chiavi di crittografia riuscita - + Decryption Keys install failed Installazione delle chiavi di crittografia fallita - + Orphaned Profiles Detected! Rilevati profili scollegati! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? Eliminare i dati? - + Important data may be lost! Potresti perdere dei dati importanti! - + Are you REALLY sure? Sei DAVVERO sicuro? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. Una volta eliminati, i tuoi dati NON potranno essere ripristinati! Procedi solo se sei assolutamente sicuro di voler eliminare questi dati. - + Clearing... Eliminazione in corso... - + Select Export Location Scegli dove esportare i dati - + %1.zip %1.zip - - - + + + Zipped Archives (*.zip) Archivi compressi (*.zip) - + Exporting data. This may take a while... Esportazione dei dati in corso. Potrebbe richiedere un po' di tempo... - + Exporting Esportazione in corso - + Exported Successfully Esportazione completata - + Data was exported successfully. I dati sono stati esportati con successo. - + Export Cancelled Esportazione annullata - + Export was cancelled by the user. L'esportazione è stata annullata dall'utente. - + Export Failed Esportazione fallita - + Ensure you have write permissions on the targeted directory and try again. Assicurati di disporre dei permessi di scrittura nella cartella selezionata e poi riprova. - + Select Import Location Seleziona il file da importare - + Import Warning Attenzione - + All previous data in this directory will be deleted. Are you sure you wish to proceed? Tutti i dati già presenti in questa cartella verranno eliminati. Sei sicuro di voler procedere? - + Importing data. This may take a while... Importazione dei dati in corso. Potrebbe richiedere un po' di tempo... - + Importing Importazione in corso - + Imported Successfully Importazione completata - + Data was imported successfully. I dati sono stati importati con successo. - + Import Cancelled Importazione annullata - + Import was cancelled by the user. L'importazione è stata annullata dall'utente. - + Import Failed Importazione fallita - + Ensure you have read permissions on the targeted directory and try again. Assicurati di disporre dei permessi di lettura nella cartella selezionata e poi riprova. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index a5a357f534..01de70d2b2 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -571,70 +571,70 @@ FXAA can produce a more stable picture in lower resolutions. - + Fullscreen Mode: フルスクリーンモード: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: アスペクト比: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC エミュレーション: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: ASTC デコード方式: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +643,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: ASTC 再圧縮方式: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: 垂直同期: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -702,79 +702,79 @@ Mailbox は FIFO よりも遅延が小さくティアリングがありません Immediate (no synchronization) は表示可能なものをすべて表示し, ティアリング発生の可能性があります. - + Sync Memory Operations メモリ操作の同期 - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) 非同期プレゼンテーション (Vulkan のみ) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) 最大クロック強制 (Vulkan のみ) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. GPUのクロックスピードを下げないように、グラフィックコマンドを待っている間、バックグラウンドで作業を実行させます。 - + Anisotropic Filtering: 異方性フィルタリング: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: GPUモード: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: DMA精度: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -784,1327 +784,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Vulkan パイプラインキャッシュを使用 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) コンピュート・パイプラインの有効化(インテル Vulkan のみ) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback ビデオ再生のフレームレートに同期する - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. 特定のゲームにおける透明エフェクトのレンダリングを改善します。 - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed 乱数シード値の変更 - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name デバイス名 - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: 言語: - + This option can be overridden when region setting is auto-select - + Region: 地域: - + The region of the console. - + Time Zone: タイムゾーン: - + The time zone of the console. - + Sound Output Mode: 音声出力モード: - + Console Mode: コンソールモード: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation エミュレーションを停止する前に確認する - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity 非アクティブ時にマウスカーソルを隠す - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet コントローラーアプレットの無効化 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 非同期 - + Uncompressed (Best quality) 圧縮しない (最高品質) - + BC1 (Low quality) BC1 (低品質) - + BC3 (Medium quality) BC3 (中品質) - - + + Auto 自動 - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (アセンブリシェーダー、NVIDIA のみ) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V(実験的、AMD/Mesaのみ) - + Null - + Fast - - - + + + Accurate 正確 - - - + + + Default デフォルト - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe 不安定 - + Paranoid (disables most optimizations) パラノイド (ほとんどの最適化を無効化) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed ボーダーレスウィンドウ - + Exclusive Fullscreen 排他的フルスクリーン - + No Video Output ビデオ出力しない - + CPU Video Decoding ビデオをCPUでデコード - + GPU Video Decoding (Default) ビデオをGPUでデコード (デフォルト) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [実験的] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [実験的] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [実験的] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area - + MMPX MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None なし - + FXAA FXAA - + SMAA SMAA - + Default (16:9) デフォルト (16:9) - + Force 4:3 強制 4:3 - + Force 21:9 強制 21:9 - + Force 16:10 強制 16:10 - + Stretch to Window ウィンドウに合わせる - + Automatic 自動 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日本語 - + American English アメリカ英語 - + French (français) フランス語 (français) - + German (Deutsch) ドイツ語 (Deutsch) - + Italian (italiano) イタリア語 (italiano) - + Spanish (español) スペイン語 (español) - + Chinese 中国語 - + Korean (한국어) 韓国語 (한국어) - + Dutch (Nederlands) オランダ語 (Nederlands) - + Portuguese (português) ポルトガル語 (português) - + Russian (Русский) ロシア語 (Русский) - + Taiwanese 台湾語 - + British English イギリス英語 - + Canadian French カナダフランス語 - + Latin American Spanish ラテンアメリカスペイン語 - + Simplified Chinese 簡体字中国語 - + Traditional Chinese (正體中文) 繁体字中国語 (正體中文) - + Brazilian Portuguese (português do Brasil) ブラジルポルトガル語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA アメリカ - + Europe ヨーロッパ - + Australia オーストラリア - + China 中国 - + Korea 韓国 - + Taiwan 台湾 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 既定 (%1) - + CET 中央ヨーロッパ時間 - + CST6CDT CST6CDT - + Cuba キューバ - + EET 東ヨーロッパ標準時 - + Egypt エジプト - + Eire アイルランド - + EST アメリカ東部標準時 - + EST5EDT EST5EDT - + GB GB - + GB-Eire イギリス-アイルランド - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich グリニッジ - + Hongkong 香港 - + HST ハワイ標準時 - + Iceland アイスランド - + Iran イラン - + Israel イスラエル - + Jamaica ジャマイカ - + Kwajalein クェゼリン - + Libya リビア - + MET 中東時間 - + MST MST - + MST7MDT MST7MDT - + Navajo ナバホ - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland ポーランド - + Portugal ポルトガル - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore シンガポール - + Turkey トルコ - + UCT UCT - + Universal ユニバーサル - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu ズールー - + Mono モノラル - + Stereo ステレオ - + Surround サラウンド - + 4GB DRAM (Default) 4GB DRAM (デフォルト) - + 6GB DRAM (Unsafe) 6GB DRAM (不安定) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld 携帯モード - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) 常に確認する (デフォルト) - + Only if game specifies not to stop ゲームが停止しないように指定しているときのみ - + Never ask 確認しない - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled 無効 - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4842,6 +4842,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5927,50 +6036,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGLは使用できません! - + OpenGL shared contexts are not supported. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! OpenGL初期化エラー - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. GPUがOpenGLをサポートしていないか、グラフィックスドライバーが最新ではありません。 - + Error while initializing OpenGL 4.6! OpenGL4.6初期化エラー! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 GPUがOpenGL4.6をサポートしていないか、グラフィックスドライバーが最新ではありません。<br><br>GL レンダラ:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 GPUが1つ以上の必要なOpenGL拡張機能をサポートしていない可能性があります。最新のグラフィックドライバを使用していることを確認してください。<br><br>GL レンダラ:<br>%1<br><br>サポートされていない拡張機能:<br>%2 - + This build doesn't have OpenGL support. @@ -6791,42 +6900,42 @@ Debug Message: ウィンドウサイズを1080Pにリセット - + &Multiplayer マルチプレイヤー (&M) - + &Tools ツール(&T) - + Am&iibo - + Launch &Applet - + &TAS &TAS - + &Create Home Menu Shortcut - + Install &Firmware - + &Help ヘルプ(&H) @@ -6852,7 +6961,7 @@ Debug Message: - + &Pause 中断(&P) @@ -6953,900 +7062,900 @@ Debug Message: - Open &Quickstart Guide - クイックスタートガイドを開く(&Q) + &User Handbook + - - &FAQ - &FAQ - - - + &Capture Screenshot スクリーンショットをキャプチャ(&C) - + &Album - + &Set Nickname and Owner オーナーとニックネームを設定 (&S) - + &Delete Game Data ゲームデータの消去 (&D) - + &Restore Amiibo Amiibo を復旧 (&R) - + &Format Amiibo Amiibo を初期化(&F) - + &Mii Editor - + &Configure TAS... TASを設定... (&C) - + Configure C&urrent Game... 現在のゲームを設定...(&U) - - + + &Start 実行(&S) - + &Reset リセット(&R) - - + + R&ecord 記録(&R) - + Open &Controller Menu コントローラーメニューを開く (&C) - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7854,74 +7963,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9108,275 +9217,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index 7844a5ac2f..ecb5a29660 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -594,12 +594,12 @@ SMAA는 최고의 화질을 제공합니다. FXAA는 저해상도에서 더 안정적인 화면을 구현할 수 있습니다. - + Fullscreen Mode: 전체 화면 모드: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -608,12 +608,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp 전체 화면 전용 모드는 더 나은 성능과 FreeSync/GSync 지원을 제공할 수 있습니다. - + Aspect Ratio: 화면 비율: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -622,36 +622,36 @@ Also controls the aspect ratio of captured screenshots. 또한 캡처된 스크린샷의 화면 비율도 제어합니다. - + Use persistent pipeline cache 지속적 파이프라인 캐시 사용 - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. 셰이더를 저장소에 저장하여 다음 게임 실행 시 더 빠르게 불러올 수 있도록 합니다. 이 옵션을 비활성화하는 것은 디버깅 목적으로만 사용하세요. - + Use asynchronous GPU emulation 비동기 GPU 에뮬레이션 사용 - + Uses an extra CPU thread for rendering. This option should always remain enabled. 렌더링에 추가 CPU 스레드를 사용합니다. 이 옵션은 항상 활성화된 상태로 유지해야 합니다. - + NVDEC emulation: NVDEC 에뮬레이션: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -660,12 +660,12 @@ In most cases, GPU decoding provides the best performance. 대부분의 경우 GPU 디코딩이 가장 좋은 성능을 제공합니다. - + ASTC Decoding Method: ASTC 디코딩 방식: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -677,12 +677,12 @@ GPU: GPU의 컴퓨트 셰이더를 사용하여 ASTC 텍스처를 디코딩합 CPU 비동기: 필요에 따라 CPU를 사용하여 ASTC 텍스처를 디코딩합니다. ASTC 디코딩으로 인한 끊김 현상이 없어지지만, 아티팩트가 발생할 수 있습니다. - + ASTC Recompression Method: ASTC 재압축 방식: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -691,44 +691,44 @@ BC1/BC3: 중간 형식은 BC1 또는 BC3 형식으로 재압축되어 VRAM을 절약하지만 이미지 품질이 저하됩니다. - + Frame Pacing Mode (Vulkan only) 프레임 페이싱 모드(Vulkan 전용) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. 에뮬레이터가 프레임 페이싱을 관리하는 방식을 제어하여 끊김 현상을 줄이고 프레임 속도를 더욱 부드럽고 일관되게 만듭니다. - + VRAM Usage Mode: VRAM 사용 모드: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. 에뮬레이터가 메모리를 절약할지, 아니면 사용 가능한 비디오 메모리를 최대한 활용하여 성능을 향상시킬지 선택합니다. 적극적 모드는 녹화 소프트웨어와 같은 다른 애플리케이션의 성능에 영향을 줄 수 있습니다. - + Skip CPU Inner Invalidation CPU 내부 무효화 건너뛰기 - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. 메모리 업데이트 중 특정 캐시 무효화를 건너뛰어 CPU 사용량을 줄이고 지연 시간을 개선합니다. 하지만 이로 인해 소프트 크래시가 발생할 수 있습니다. - + VSync Mode: 수직 동기화 모드: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -739,12 +739,12 @@ Mailbox는 FIFO보다 지연 시간이 짧고 화면 찢김 현상이 없지만 즉각적(동기화 없음)는 사용 가능한 모든 화면을 표시하며 화면 찢김 현상이 발생할 수 있습니다. - + Sync Memory Operations 메모리 작업 동기화 - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -753,44 +753,44 @@ Unreal Engine 4 games often see the most significant changes thereof. 대개 언리얼 엔진 4 게임에서 이러한 변경 사항이 가장 두드러지게 나타납니다. - + Enable asynchronous presentation (Vulkan only) 비동기 프레젠테이션 활성화(Vulkan 전용) - + Slightly improves performance by moving presentation to a separate CPU thread. 프레젠테이션을 별도의 CPU 스레드로 이동시켜 성능을 약간 향상시킵니다. - + Force maximum clocks (Vulkan only) 최대 클럭 강제 적용(Vulkan 전용) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. 그래픽 명령을 기다리는 동안 백그라운드에서 작업을 실행하여 GPU 클럭 속도가 저하되는 것을 방지합니다. - + Anisotropic Filtering: 비등방성 필터링: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. 비스듬한 각도에서의 텍스처 렌더링 품질을 제어합니다. 대부분의 GPU에서 16x로 설정해도 안전합니다. - + GPU Mode: GPU 모드: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -799,12 +799,12 @@ Particles tend to only render correctly with Accurate mode. 특히 조각들은 정확 모드에서만 제대로 렌더링되는 경향이 있습니다. - + DMA Accuracy: DMA 정확도: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -813,12 +813,12 @@ Default follows the GPU Accuracy setting. 기본값은 GPU 정확도 설정을 따릅니다. - + GPU Fence Behavior: GPU 펜스 동작: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -833,56 +833,56 @@ Default follows the GPU Accuracy setting. 기본값은 GPU 정확도 설정을 따릅니다. - + Enable GPU buffer readback GPU 버퍼 되읽기 활성화 - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. 수정된 GPU 데이터를 업로드하기 전에 다시 읽어들여 보존합니다. 일부 게임에서는 특정 효과를 제대로 렌더링하기 위해 이 기능이 필요합니다. - + Enable asynchronous shader compilation 비동기 셰이더 컴파일 활성화 - + May reduce shader stutter. 셰이더 끊김 현상을 줄일 수 있습니다. - + GPU Clocks GPU 클럭 - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. 게임이 GPU 작업이 실제보다 더 빨리 완료된다고 착각하게 만들어, 스위치의 클럭 속도에 맞추기 위해 해상도와 렌더 거리를 낮추는 작업을 중단하게 합니다. - + GPU Unswizzle GPU 언스위즐 - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. GPU 컴퓨팅을 사용하여 BCn 3D 텍스처 디코딩을 가속화합니다. 충돌이나 그래픽 결함이 발생하는 경우 이 기능을 비활성화하세요. - + GPU Unswizzle Max Texture Size GPU 언스위즐 최대 텍스처 크기 - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -891,48 +891,48 @@ GPU는 중간 및 큰 크기의 텍스처에서 더 빠르지만, 매우 작은 이 값을 조정하여 GPU 가속과 CPU 오버헤드 간의 균형을 찾으세요. - + GPU Unswizzle Stream Size GPU 언스위즐 스트림 크기 - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. 프레임당 처리할 최대 텍스처 데이터 양(MiB 단위)을 설정합니다. 값이 높을수록 텍스처 로딩 중 끊김 현상을 줄일 수 있지만 프레임 일관성에 영향을 미칠 수 있습니다. - + GPU Unswizzle Chunk Size GPU 언스위즐 청크 크기 - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. 단일 디스패치에서 처리할 깊이 슬라이스 수를 결정합니다. 이 값을 높이면 고성능 GPU에서 처리량이 향상될 수 있지만, 성능이 낮은 하드웨어에서는 TDR 오류나 드라이버 시간 초과가 발생할 수 있습니다. - + Use Vulkan pipeline cache Vulkan 파이프라인 캐시 사용 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. GPU 제조사별 파이프라인 캐시를 활성화합니다. 이 옵션은 Vulkan 드라이버가 파이프라인 캐시 파일을 내부에 저장하지 않는 경우 셰이더 로딩 시간을 크게 향상시킬 수 있습니다. - + Enable Compute Pipelines (Intel Vulkan Only) 컴퓨트 파이프라인 활성화(인텔 Vulkan 전용) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -941,194 +941,194 @@ Compute pipelines are always enabled on all other drivers. 다른 모든 드라이버에서는 컴퓨트 파이프라인이 항상 활성화됩니다. - + Enable Reactive Flushing 반응형 플러싱 활성화 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 예측형 플러싱 대신 반응형 플러싱을 사용하여 보다 정확한 메모리 동기화를 가능하게 합니다. - + Sync to framerate of video playback 비디오 재생 프레임 속도에 동기화 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 프레임률 제한이 해제된 경우에도 비디오 재생 중에는 게임을 정상 속도로 실행합니다. - + Barrier feedback loops 피드백 루프 차단 - + Improves rendering of transparency effects in specific games. 특정 게임에서 투명 효과 렌더링을 개선합니다. - + Enable buffer history 버퍼 기록 활성화 - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. 이전 버퍼 상태에 접근할 수 있도록 합니다. 이 옵션은 일부 게임에서 렌더링 품질과 성능 일관성을 향상시킬 수 있습니다. - + Fix bloom effects 블룸 효과 수정 - + Removes bloom in Burnout. Burnout에서의 블룸 현상을 제거합니다. - + Enable Legacy Rescale Pass 기존 크기 조정 무시 활성화 - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. 이전 구현의 동작을 활용하여 일부 게임에서 발생하는 크기 조정 문제를 해결할 수 있습니다. 루이지 맨션 3에서 발생했던 AMD 및 인텔 GPU의 선 아티팩트 현상과 Nvidia GPU의 회색 텍스처 깜빡임 현상을 해결하는 기존 반응에 대한 예비 해결책입니다. - + Extended Dynamic State 확장된 동적 상태 - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. 확장된 동적 상태에서 사용할 수 있는 기능의 수를 제어합니다. 상태 수가 많을수록 더 많은 기능을 사용할 수 있고 성능이 향상될 수 있지만, 추가적인 그래픽 문제가 발생할 수 있습니다. - + Vertex Input Dynamic State 정점 입력 동적 상태 - + Enables vertex input dynamic state feature for better quality and performance. 정점 입력의 동적 상태 기능을 활성화하여 품질과 성능을 향상시킵니다. - + Sample Shading 샘플 셰이딩 - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. 조각 셰이더가 다중샘플 조각에서 한 번당 한 조각이 아닌 샘플별로 실행될 수 있도록 합니다. 성능 저하를 감수하고 그래픽 품질을 향상시킵니다. 값이 높을수록 품질은 향상되지만 성능은 저하됩니다. - + RNG Seed RNG 시드 - + Controls the seed of the random number generator. Mainly used for speedrunning. 난수 생성기의 시드 값을 제어합니다. 주로 스피드런에 사용됩니다. - + Device Name 장치 이름 - + The name of the console. 콘솔의 이름 - + Homebrew Args 홈브루 인수 - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). 홈브루 실행 시 전달되는 명령줄 인수(예: -noglsl). - + Custom RTC Date: 사용자 지정 RTC 날짜: - + This option allows to change the clock of the console. Can be used to manipulate time in games. 이 옵션을 사용하면 콘솔의 시간을 변경할 수 있습니다. 게임 내 시간을 조작하는 데 사용할 수 있습니다. - + The number of seconds from the current unix time 현재 unix 시간으로부터 경과한 초 수 - + Language: 언어: - + This option can be overridden when region setting is auto-select 이 옵션은 지역 설정이 자동 선택으로 되어 있을 경우 번복될 수 있습니다. - + Region: 지역: - + The region of the console. 콘솔의 지역 - + Time Zone: 시간대: - + The time zone of the console. 콘솔의 시간대 - + Sound Output Mode: 소리 출력 모드: - + Console Mode: 콘솔 모드: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1137,1042 +1137,1042 @@ Setting to Handheld can help improve performance for low end systems. 휴대 모드로 설정하면 저사양 시스템의 성능을 향상시키는 데 도움이 될 수 있습니다. - + Prompt for user profile on boot 부팅 시 유저 프로필 입력 요청 - + Useful if multiple people use the same PC. 여러 사람이 같은 PC를 사용할 때 유용합니다. - + Pause when not in focus 초점이 맞지 않을 때 일시 중지 - + Pauses emulation when focusing on other windows. 다른 창에 초점을 맞출 때 에뮬레이션을 일시 중지합니다. - + Confirm before stopping emulation 에뮬레이션을 중지하기 전에 확인 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. 에뮬레이션 중지를 확인하는 메시지를 무시합니다. 이 옵션을 활성화하면 이러한 메시지를 건너뛰고 에뮬레이션을 바로 종료합니다. - + Hide mouse on inactivity 마우스 커서가 비활동 상태일 때 숨기기 - + Hides the mouse after 2.5s of inactivity. 마우스 커서가 2.5초 동안 활동이 없으면 숨깁니다. - + Disable controller applet 컨트롤러 애플릿 비활성화 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. 에뮬레이트된 프로그램에서 컨트롤러 애플릿 사용을 강제적으로 비활성화합니다. 프로그램이 컨트롤러 애플릿을 열려고 하면 즉시 닫힙니다. - + Check for updates 업데이트 확인 - + Whether or not to check for updates upon startup. 시작 시 업데이트를 확인할지 여부. - + Enable Gamemode 게임 모드 활성화 - + Force X11 as Graphics Backend X11을 그래픽 백엔드로 강제 설정 - + Custom frontend 사용자 정의 프론트엔드 - + Real applet 실제 애플릿 - + Never 안 함 - + On Load 로드 시 - + Always 항상 - + CPU CPU - + GPU GPU - + CPU Asynchronous 비동기 CPU - + Uncompressed (Best quality) 비압축(최고 품질) - + BC1 (Low quality) BC1(저품질) - + BC3 (Medium quality) BC3(중간 품질) - - + + Auto 자동 - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative 소극적 - + Aggressive 적극적 - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM(어셈블리 셰이더, NVIDIA 전용) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V(실험적, AMD/Mesa 전용) - + Null Null - + Fast 고속 - - - + + + Accurate 정확 - - - + + + Default 기본값 - + Unsafe (fast) 불안전(빠름) - + Safe (stable) 안전(안정적) - + Immediate 즉시 - + Balanced 균형 - + Strict 염격 - + Unsafe 불안전 - + Paranoid (disables most optimizations) 편집증적(대부분의 최적화를 비활성화함) - + Debugging 디버깅 - + Dynarmic 동적 - + NCE NCE - + Borderless Windowed 테두리 없는 창 - + Exclusive Fullscreen 독점 전체 화면 - + No Video Output 비디오 출력 없음 - + CPU Video Decoding CPU 비디오 디코딩 - + GPU Video Decoding (Default) GPU 비디오 디코딩(기본값) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [실험적] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [실험적] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [실험적] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [실험적] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [실험적] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 최단입점 - + Bilinear 쌍선형 - + Bicubic 쌍입방 - + Gaussian 가우시안 - + Lanczos 란초스 - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area 영역 - + MMPX MMPX - + Zero-Tangent 제로탄젠트 - + B-Spline B-스플라인 - + Mitchell 미첼 - + Spline-1 스플라인-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None 없음 - + FXAA FXAA - + SMAA SMAA - + Default (16:9) 기본(16:9) - + Force 4:3 강제 4:3 - + Force 21:9 강제 21:9 - + Force 16:10 강제 16:10 - + Stretch to Window 화면 늘리기 - + Automatic 자동 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 일본어(日本語) - + American English 미국식 영어 - + French (français) 프랑스어(français) - + German (Deutsch) 독일어(Deutsch) - + Italian (italiano) 이탈리아어(italiano) - + Spanish (español) 스페인어(español) - + Chinese 중국어 - + Korean (한국어) 한국어(Korean) - + Dutch (Nederlands) 네덜란드어(Nederlands) - + Portuguese (português) 포르투갈어(português) - + Russian (Русский) 러시아어(Русский) - + Taiwanese 대만어 - + British English 영국식 영어 - + Canadian French 캐나다 프랑스어 - + Latin American Spanish 라틴아메리카 스페인어 - + Simplified Chinese 중국어 간체 - + Traditional Chinese (正體中文) 중국어 번체(正體中文) - + Brazilian Portuguese (português do Brasil) 브라질 포르투갈어(português do Brasil) - + Polish (polska) 폴란드어(polska) - + Thai (แบบไทย) 태국어(แบบไทย) - - + + Japan 일본 - + USA 미국 - + Europe 유럽 - + Australia 호주 - + China 중국 - + Korea 대한민국 - + Taiwan 대만 - + Auto (%1) Auto select time zone 자동(%1) - + Default (%1) Default time zone 기본(%1) - + CET CET - + CST6CDT CST6CDT - + Cuba 쿠바 - + EET EET - + Egypt 이집트 - + Eire 아일랜드 - + EST EST - + EST5EDT EST5EDT - + GB 영국 - + GB-Eire 영국-아일랜드 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 그리니치 - + Hongkong 홍콩 - + HST HST - + Iceland 아이슬란드 - + Iran 이란 - + Israel 이스라엘 - + Jamaica 자메이카 - + Kwajalein 콰잘레인 - + Libya 리비아 - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo 나바호 - + NZ 뉴질랜드 - + NZ-CHAT 뉴질랜드-채텀 - + Poland 폴란드 - + Portugal 포르투갈 - + PRC 중국 - + PST8PDT PST8PDT - + ROC 대만 - + ROK 대한민국 - + Singapore 싱가포르 - + Turkey 터키 - + UCT UCT - + Universal 세계 - + UTC UTC - + W-SU 모스크바 - + WET WET - + Zulu Zulu - + Mono 모노 - + Stereo 스테레오 - + Surround 서라운드 - + 4GB DRAM (Default) 4GB DRAM(기본값) - + 6GB DRAM (Unsafe) 6GB DRAM(불안전) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM(불안전) - + 12GB DRAM (Unsafe) 12GB DRAM(불안전) - + Docked 독 모드 - + Handheld 휴대 모드 - - + + Normal 보통 - - + + Boost 부스트 - - + + Overclock 오버클럭 - + Always ask (Default) 항상 묻기(기본값) - + Only if game specifies not to stop 게임에서 멈추지 말라고 명시한 경우에만 - + Never ask 절대 묻지 않음 - + Very Small (16 MB) 아주 작은 크기(16 MB) - + Small (32 MB) 작은 크기(32 MB) - + Normal (128 MB) 보통 크기(128 MB) - + Large (256 MB) 큰 크기(256 MB) - + Very Large (512 MB) 아주 큰 크기(512 MB) - + Very Low (4 MB) 매우 낮은 크기(4 MB) - + Low (8 MB) 낮은 크기(8 MB) - + Normal (16 MB) 보통 크기(16 MB) - + Medium (32 MB) 중간 크기(32 MB) - + High (64 MB) 높은 크기(64 MB) - + Very Low (32) 매우 낮은 크기(32) - + Low (64) 낮은 크기(64) - + Normal (128) 보통 크기(128) - + Medium (256) 보통(256) - + High (512) 빠름(512) - + Disabled 비활성화됨 - + ExtendedDynamicState 1 확장된 동적 상태 1 - + ExtendedDynamicState 2 확장된 동적 상태 2 - + ExtendedDynamicState 3 확장된 동적 상태 3 - + Tree View 트리 보기 - + Grid View 격자 보기 @@ -4927,6 +4927,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t 파일 관리자에서 열기(&O) + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -6014,50 +6123,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL을 사용할 수 없습니다! - + OpenGL shared contexts are not supported. OpenGL 공유 콘텍스트는 지원되지 않습니다. - + Eden has not been compiled with OpenGL support. Eden은 OpenGL 지원 기능을 포함하여 컴파일되지 않았습니다. - - - + + + Error while initializing OpenGL! OpenGL을 초기화하는 동안 오류가 발생했습니다! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. 사용하시는 GPU가 OpenGL을 지원하지 않거나, 최신 그래픽 드라이버가 설치되어 있지 않습니다. - + Error while initializing OpenGL 4.6! OpenGL 4.6 초기화 중 오류 발생! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 사용 중인 GPU가 OpenGL 4.6을 지원하지 않거나 최신 그래픽 드라이버가 설치되어 있지 않습니다.<br><br>GL 렌더러:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 사용 중인 GPU가 하나 이상의 필수 OpenGL 확장 기능을 지원하지 않을 수 있습니다. 최신 그래픽 드라이버가 설치되어 있는지 확인해 주세요.<br><br>GL 렌더러:<br>%1<br><br>지원되지 않는 확장 기능:<br>%2 - + This build doesn't have OpenGL support. 이 빌드는 OpenGL을 지원하지 않습니다. @@ -6879,42 +6988,42 @@ Debug Message: 창 크기를 1080p로 재설정 - + &Multiplayer 멀티플레이어(&M) - + &Tools 도구(&T) - + Am&iibo Amiibo(&i) - + Launch &Applet 애플릿 실행(&A) - + &TAS TAS(&T) - + &Create Home Menu Shortcut HOME 메뉴 바로가기 만들기(&C) - + Install &Firmware 펌웨어 설치(&F) - + &Help 도움말(&H) @@ -6940,7 +7049,7 @@ Debug Message: - + &Pause 일시중지(&P) @@ -7041,906 +7150,906 @@ Debug Message: - Open &Quickstart Guide - 빠른 시작 가이드 열기(&Q) + &User Handbook + - - &FAQ - FAQ(&F) - - - + &Capture Screenshot 스크린샷 캡처(&C) - + &Album 앨범(&A) - + &Set Nickname and Owner 닉네임과 오너 설정(&S) - + &Delete Game Data 게임 데이터 삭제(&D) - + &Restore Amiibo Amiibo 복원(&R) - + &Format Amiibo Amiibo 포맷(&F) - + &Mii Editor Mii 편집기(&M) - + &Configure TAS... TAS 구성...(&C) - + Configure C&urrent Game... 현재 게임 구성...(&u) - - + + &Start 시작(&S) - + &Reset 재설정(&R) - - + + R&ecord 기록(&e) - + Open &Controller Menu 컨트롤러 메뉴 열기(&C) - + Install Decryption &Keys 복호화 키 설치(&K) - + &Home Menu HOME 메뉴(&H) - + &Desktop 데스크톱(&D) - + &Application Menu 애플리케이션 메뉴(&A) - + &Root Data Folder 데이터 폴더 경로(&R) - + &NAND Folder NAND 폴더(&N) - + &SDMC Folder SDMC 폴더(&S) - + &Mod Folder 모드 폴더(&M) - + &Log Folder 로그 폴더(&L) - + From Folder 폴더에서 - + From ZIP ZIP에서 - + &Eden Dependencies Eden 의존물(&E) - + &Data Manager 데이터 관리자(&D) - + &Tree View 트리 보기(&T) - + &Grid View 격자 보기(&G) - + Game Icon Size 게임 아이콘 크기 - - + + None 없음 - + Show Game &Name 게임 이름 표시(&N) - + Show &Performance Overlay 성능 오버레이 표시(&P) + + + Post-Processing &Shaders... + + &Carousel View 캐러셀 보기(&C) - + Small (32x32) 작은 크기(32x32) - + Standard (64x64) 기본 크기(64x64) - + Large (128x128) 큰 크기(128x128) - + Full Size (256x256) 전체 크기(256x256) - + Broken Vulkan Installation Detected 손상된 Vulkan 설치가 발견됨 - + Vulkan initialization failed during boot. 부팅 중 Vulkan 초기화에 실패했습니다. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping 게임 실행 중 - + Loading Web Applet... 웹 애플릿을 불러오는 중... - + Disable Web Applet 웹 애플릿 비활성화 - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) 웹 애플릿을 비활성화하면 예기치 않은 동작이 발생할 수 있으며 슈퍼 마리오 3D 컬렉션에서만 사용해야 합니다. 웹 애플릿을 비활성화하겠습니까? (디버그 설정에서 다시 활성화할 수 있습니다.) - + The amount of shaders currently being built 현재 구축 중인 셰이더 수 - + The current selected resolution scaling multiplier. 현재 선택된 해상도 조정 배율입니다. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. 현재 에뮬레이션 속도입니다. 100%보다 높거나 낮은 값은 에뮬레이션이 스위치보다 빠르거나 느리게 실행되고 있음을 나타냅니다. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. 현재 게임이 표시하는 초당 프레임 수입니다. 이 값은 게임 및 장면에 따라 다릅니다. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 프레임 제한이나 수직 동기화를 제외하고 스위치 프레임을 에뮬레이션하는 데 걸리는 시간입니다. 최고 속도 에뮬레이션의 경우 최대 16.67 밀리초입니다. - + Unmute 음소거 해제 - + Mute 음소거 - + Reset Volume 볼륨 재설정 - + &Clear Recent Files 최근 파일 지우기(&C) - + &Continue 재개(&C) - + Warning: Outdated Game Format 경고: 구식 게임 형식입니다 - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. 현재 이 게임에 대해 구형 형식인 분해된 ROM 디렉터리 형식을 사용하고 있습니다. 이 형식은 NCA, NAX, XCI 또는 NSP와 같은 다른 형식으로 대체되었습니다. 분해된 ROM 디렉터리에는 아이콘, 메타데이터 및 업데이트 지원 기능이 없습니다.<br>Eden에서 지원하는 다양한 스위치 형식에 대한 자세한 내용은 사용자 설명서를 참조해 주세요. 이 메시지는 다시 표시되지 않습니다. - - + + Error while loading ROM! ROM 불러오는 중 오류 발생! - + The ROM format is not supported. 해당 ROM 형식은 지원되지 않습니다. - + An error occurred initializing the video core. 비디오 코어 초기화 중 오류가 발생했습니다. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - Eden에서 비디오 코어 실행 중 오류가 발생했습니다. 이는 일반적으로 내장 그래픽 드라이버를 포함한 GPU 드라이버가 최신 버전이 아니기 때문에 발생합니다. 자세한 내용은 로그 파일을 참조해 주세요. 로그 파일 접근 방법에 대한 자세한 내용은 <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>로그 파일 업로드 방법</a> 페이지를 참조해 주세요. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. + - + Error while loading ROM! %1 %1 signifies a numeric error code. ROM 불러오는 중 오류 발생! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>파일을 다시 덤프하거나 디스코드/Stoat에서 도움을 요청해 주세요. - + An unknown error occurred. Please see the log for more details. 알 수 없는 오류가 발생했습니다. 자세한 내용은 로그를 참조해 주세요. - - + + (64-bit) (64비트) - - + + (32-bit) (32비트) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... 소프트웨어 닫는 중... - + Save Data 저장 데이터 - + Mod Data 모드 데이터 - + Error Opening %1 Folder %1 폴더 여는 중 오류 발생 - - + + Folder does not exist! 폴더가 존재하지 않습니다! - + Remove Installed Game Contents? 설치된 게임 콘텐츠를 제거하겠습니까? - + Remove Installed Game Update? 설치된 게임 업데이트를 제거하겠습니까? - + Remove Installed Game DLC? 설치된 게임 DLC를 제거하겠습니까? - + Remove Entry 항목 제거 - + Delete OpenGL Transferable Shader Cache? OpenGL 이동 가능한 셰이더 캐시를 삭제하겠습니까? - + Delete Vulkan Transferable Shader Cache? Vulkan 이동 가능한 셰이더 캐시를 삭제하겠습니까? - + Delete All Transferable Shader Caches? 이동 가능한 셰이더 캐시를 모두 삭제하겠습니까? - + Remove Custom Game Configuration? 사용자 지정 게임 구성을 제거하겠습니까? - + Remove Cache Storage? 캐시 저장소를 제거하겠습니까? - + Remove File 파일 제거 - + Remove Play Time Data 플레이 시간 데이터 제거 - + Reset play time? 플레이 시간을 재설정하겠습니까? - - + + RomFS Extraction Failed! RomFS 추출 실패! - + There was an error copying the RomFS files or the user cancelled the operation. RomFS 파일을 복사하는 중에 오류가 발생했거나 사용자가 작업을 취소했습니다. - + Full 전체 - + Skeleton 뼈대 - + Select RomFS Dump Mode RomFS 덤프 모드 선택 - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. RomFS 덤프 방식을 선택해 주세요. 전체를 선택하면 모든 파일이 새 디렉터리로 복사되고, 뼈대를 선택하면 디렉터리 구조만 생성됩니다. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root %1 위치에 RomFS를 추출할 수 있는 여유 공간이 부족합니다. 공간을 확보하거나 에뮬레이션 > 구성 > 시스템 > 파일 시스템 > 덤프 경로에서 다른 덤프 디렉터리를 선택해 주세요. - + Extracting RomFS... RomFS 추출 중... - - + + Cancel 취소 - + RomFS Extraction Succeeded! RomFS 추출 성공! - + The operation completed successfully. 작업이 성공적으로 완료되었습니다. - + Error Opening %1 %1을(를) 여는 중 오류 발생 - + Select Directory 디렉터리 선택 - + Properties 속성 - + The game properties could not be loaded. 게임 속성을 불러올 수 없습니다. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. 스위치 실행 파일(%1);;모든 파일(*.*) - + Load File 파일 불러오기 - + Open Extracted ROM Directory 추출된 ROM 디렉터리 열기 - + Invalid Directory Selected 유효하지 않은 디렉터리 선택됨 - + The directory you have selected does not contain a 'main' file. 선택한 디렉터리에는 'main' 파일이 없습니다. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) 설치 가능한 스위치 파일(*.nca, *.nsp, *.xci);;닌텐도 콘텐츠 아카이브(*.nca);;닌텐도 제출 패키지(*.nsp);;NX 카트리지 이미지(*.xci) - + Install Files 파일 설치 - + %n file(s) remaining %n개 파일 남음 - + Installing file "%1"... "%1" 파일 설치 중... - - + + Install Results 설치 결과 - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. 잠재적인 충돌을 방지하기 위해 저희는 사용자가 기본 게임을 NAND에 설치하는 것은 권장하지 않습니다. 이 기능은 업데이트 및 DLC 설치에만 사용해 주세요. - + %n file(s) were newly installed %n개 파일이 새로 설치됨 - + %n file(s) were overwritten %n개 파일이 덮어쓰기됨 - + %n file(s) failed to install %n개 파일 설치 실패 - + System Application 시스템 애플리케이션 - + System Archive 시스템 아카이브 - + System Application Update 시스템 애플리케이션 업데이트 - + Firmware Package (Type A) 펌웨어 패키지(A타입) - + Firmware Package (Type B) 펌웨어 패키지(B타입) - + Game 게임 - + Game Update 게임 업데이트 - + Game DLC 게임 DLC - + Delta Title 델타 타이틀 - + Select NCA Install Type... NCA 설치 유형 선택... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) 이 NCA를 설치할 타이틀 유형을 선택해 주세요: (대부분의 경우 기본값인 '게임'을 선택하면 됩니다.) - + Failed to Install 설치 실패 - + The title type you selected for the NCA is invalid. NCA에 대해 선택한 타이틀 유형이 유효하지 않습니다. - + File not found 파일을 찾을 수 없음 - + File "%1" not found "%1" 파일을 찾을 수 없음 - + OK 확인 - + Function Disabled 기능 비활성화됨 - + Compatibility list reporting is currently disabled. Check back later! 호환성 목록 보고 옵션이 현재 비활성화되어 있습니다. 나중에 다시 확인해 주세요! - + Error opening URL URL 여는 중 오류 발생 - + Unable to open the URL "%1". "%1" URL을 열 수 없습니다. - + TAS Recording TAS 녹화 - + Overwrite file of player 1? 플레이어 1의 파일을 덮어쓰겠습니까? - + Invalid config detected 무효한 구성이 발견됨 - + Handheld controller can't be used on docked mode. Pro controller will be selected. 휴대 모드 컨트롤러는 독 모드에서 사용할 수 없습니다. Pro 컨트롤러로 선택됩니다. - - + + Amiibo Amiibo - - + + The current amiibo has been removed 현재 amiibo가 제거됨 - + Error 오류 - - + + The current game is not looking for amiibos 현재 게임은 amiibo를 찾고 있지 않습니다 - + Amiibo File (%1);; All Files (*.*) Amiibo 파일(%1);; 모든 파일(*.*) - + Load Amiibo Amiibo 불러오기 - + Error loading Amiibo data Amiibo 데이터 불러오는 중 오류 발생 - + The selected file is not a valid amiibo 선택한 파일은 유효한 amiibo가 아닙니다 - + The selected file is already on use 선택한 파일은 이미 사용 중입니다 - + An unknown error occurred 알 수 없는 오류 발생 - + No firmware available 사용 가능한 펌웨어 없음 - + Firmware Corrupted 펌웨어 손상됨 - + Unknown applet 알 수 없는 애플릿 - + Applet doesn't map to a known value. 애플릿이 알려진 값에 매핑되지 않습니다. - + Record not found 기록을 찾을 수 없음 - + Applet not found. Please reinstall firmware. 애플릿을 찾을 수 없습니다. 펌웨어를 다시 설치해 주세요. - + Capture Screenshot 스크린샷 캡처 - + PNG Image (*.png) PNG 이미지(*.png) - + TAS state: Running %1/%2 TAS 상태: %1/%2 실행 중 - + TAS state: Recording %1 TAS 상태: %1 녹화 중 - + TAS state: Idle %1/%2 TAS 상태: %1/%2 유휴 - + TAS State: Invalid TAS 상태: 무효 - + &Stop Running 실행 중지(&S) - + Stop R&ecording 녹화 중지(&e) - + Building: %n shader(s) 구축 중: %n개 셰이더 - + Scale: %1x %1 is the resolution scaling factor 크기: %1x - + Speed: %1% / %2% 속도: %1% / %2% - + Speed: %1% 속도: %1% - + Game: %1 FPS 게임: %1 FPS - + Frame: %1 ms 프레임: %1 밀리초 - + NO AA AA 없음 - + VOLUME: MUTE 볼륨: 음소거 - + VOLUME: %1% Volume percentage (e.g. 50%) 볼륨: %1% - + Derivation Components Missing 파생 구성 요소 누락 - + Decryption keys are missing. Install them now? 복호화 키가 없습니다. 지금 설치하겠습니까? - + Wayland Detected! Wayland 발견됨! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7951,74 +8060,74 @@ Would you like to force it for future launches? 향후 출시를 위해 Wayland 사용을 강제하겠습니까? - + Use X11 X11 사용 - + Continue with Wayland Wayland와 계속 - + Don't show again 다시 보지 않기 - + Restart Required 재시작이 필요함 - + Restart Eden to apply the X11 backend. X11 백엔드를 적용하려면 Eden을 다시 시작하세요. - + Slow 저속 - + Turbo 터보 - + Unlocked 제한 해제 - + Select RomFS Dump Target RomFS 덤프 대상 선택 - + Please select which RomFS you would like to dump. 덤프할 RomFS를 선택하세요. - + Are you sure you want to close Eden? 정말 Eden을 닫겠습니까? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. 정말 에뮬레이션을 중지하겠습니까? 저장되지 않은 진행 상황은 모두 손실됩니다. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9220,41 +9329,41 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. - 실행하려는 게임을 실행하거나 시작 메뉴를 넘어가려면 펌웨어가 필요합니다. <a href='https://yuzu-mirror.github.io/help/quickstart'>펌웨어를 덤프하여 설치하거나</a>, 그냥 ​​"확인"을 눌러 게임을 실행해 주세요. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. + - + Installing Firmware... 펌웨어 설치 중... - - - - - + + + + + Cancel 취소 - + Firmware Install Failed 펌웨어 설치 실패 - + Firmware Install Succeeded 펌웨어 설치 성공 - + Firmware integrity verification failed! 펌웨어 무결성 인증에 실패했습니다! - - + + Verification failed for the following files: %1 @@ -9263,235 +9372,235 @@ p, li { white-space: pre-wrap; } %1 - - + + Verifying integrity... 무결성 인증 중... - - + + Integrity verification succeeded! 무결성 인증에 성공했습니다! - - + + The operation completed successfully. 작업이 성공적으로 완료되었습니다. - - + + Integrity verification failed! 무결성 인증에 실패했습니다! - + File contents may be corrupt or missing. 파일 내용이 손상되었거나 누락되었을 수 있습니다. - + Integrity verification couldn't be performed 무결성 인증을 진행할 수 없습니다 - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. 펌웨어 설치가 취소되었습니다. 펌웨어 상태가 좋지 않거나 손상되었을 수 있습니다. 파일 내용의 유효성을 확인할 수 없습니다. - + Select Dumped Keys Location 덤프된 키 위치 ​​선택 - + Decryption Keys install succeeded 복호화 키 설치 성공 - + Decryption Keys install failed 복호화 키 설치 실패 - + Orphaned Profiles Detected! 사용되지 않는 프로필이 발견됨! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> 이 내용을 읽지 않으면 예상치 못한 문제가 발생할 수 있습니다!<br>Eden이 프로필에 연결되지 않은 다음 저장 디렉터리를 발견했습니다:<br>%1<br><br>다음 프로필이 유효합니다:<br>%2<br><br>"확인"을 클릭하여 저장 폴더를 열고 프로필을 수정하세요.<br>힌트: 가장 크거나 마지막으로 수정된 폴더의 내용을 다른 곳에 복사하고, 연결되지 않은 프로필을 모두 삭제한 다음, 복사한 내용을 유효한 프로필로 이동하세요.<br><br>여전히 이해가 안 되나요? <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>도움말 페이지</a>를 참조하세요.<br> - + Really clear data? 정말로 데이터를 지우겠습니까? - + Important data may be lost! 중요 데이터가 손실될 수 있습니다! - + Are you REALLY sure? 정말 확실해요? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. 한 번 삭제된 데이터는 절대 복구할 수 없습니다! 이 데이터를 100% 삭제하고 싶을 때만 이 작업을 수행하세요. - + Clearing... 지우는 중... - + Select Export Location 내보내기 위치 선택 - + %1.zip %1.zip - - - + + + Zipped Archives (*.zip) 압축된 아카이브(*.zip) - + Exporting data. This may take a while... 데이터를 내보내는 중입니다. 시간이 다소 걸릴 수 있습니다... - + Exporting 내보내는 중 - + Exported Successfully 성공적으로 내보냄 - + Data was exported successfully. 데이터를 성공적으로 내보냈습니다. - + Export Cancelled 내보내기 취소됨 - + Export was cancelled by the user. 사용자가 내보내기를 취소했습니다. - + Export Failed 내보내기 실패 - + Ensure you have write permissions on the targeted directory and try again. 대상 디렉터리에 쓰기 권한이 있는지 확인하고 다시 시도하세요. - + Select Import Location 가져오기 위치 선택 - + Import Warning 가져오기 경고 - + All previous data in this directory will be deleted. Are you sure you wish to proceed? 이 디렉터리의 이전 데이터가 모두 삭제됩니다. 계속하겠습니까? - + Importing data. This may take a while... 데이터를 가져오는 중입니다. 시간이 다소 걸릴 수 있습니다... - + Importing 가져오는 중 - + Imported Successfully 성공적으로 가져옴 - + Data was imported successfully. 데이터를 성공적으로 가져왔습니다. - + Import Cancelled 가져오기 취소됨 - + Import was cancelled by the user. 사용자가 가져오기를 취소했습니다. - + Import Failed 가져오기 실패 - + Ensure you have read permissions on the targeted directory and try again. 대상 디렉터리에 읽기 권한이 있는지 확인하고 다시 시도하세요. - + Keys not installed 키가 설치되지 않음 - + Install decryption keys and restart Eden before attempting to install firmware. 펌웨어를 설치하기 전에 복호화 키를 설치하고 Eden을 재시작하세요. - + Select Dumped Firmware Source Location 덤프된 펌웨어 소스 위치 선택 - + Select Dumped Firmware ZIP 덤프된 펌웨어 ZIP 선택 - + Firmware cleanup failed 펌웨어 정리 실패 - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index deaec1bb7e..5b5d8d6ba4 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -571,70 +571,70 @@ FXAA can produce a more stable picture in lower resolutions. - + Fullscreen Mode: Fullskjermmodus: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Bildeforhold: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC-emulering: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +643,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: VSync-modus: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -699,79 +699,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Aktiver asynkron presentasjon (kun Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) Tving maksikal klokkehastighet (kun Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Kjører arbeid i bakgrunnen mens den venter på grafikkommandoer for å forhindre at GPU-en senker klokkehastigheten. - + Anisotropic Filtering: Anisotropisk filtrering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: GPU-modus: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: DMA-nøyaktighet: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -781,1327 +781,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Bruk Vulkan-rørledningsbuffer - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Aktiver Reaktiv Tømming - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback Synkroniser med bildefrekvensen for videoavspilling - + Run the game at normal speed during video playback, even when the framerate is unlocked. Kjør spillet i normal hastighet under videoavspilling, selv når bildefrekvensen er låst opp. - + Barrier feedback loops Tilbakekoblingssløyfer for barrierer - + Improves rendering of transparency effects in specific games. Forbedrer gjengivelsen av transparenseffekter i spesifikke spill. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG-frø - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Enhetsnavn - + The name of the console. Konsollens navn. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Selvvalgt RTC-dato: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Språk: - + This option can be overridden when region setting is auto-select - + Region: Region: - + The region of the console. Konsollens region. - + Time Zone: Tidssone: - + The time zone of the console. Konsollens tidssone. - + Sound Output Mode: Lydutdatamodus: - + Console Mode: Konsollmodus: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Bekreft før stopping av emulering - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Gjem mus under inaktivitet - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Deaktiver kontroller-appleten - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates Se etter oppdateringer - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never Aldri - + On Load - + Always Alltid - + CPU CPU - + GPU Skjermkort - + CPU Asynchronous - + Uncompressed (Best quality) Ukomprimert (Best kvalitet) - + BC1 (Low quality) BC1 (Lav kvalitet) - + BC3 (Medium quality) BC3 (Middels kvalitet) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (eksperimentelt, kun AMD/Mesa) - + Null Null - + Fast Rask - - - + + + Accurate Nøyaktig - - - + + + Default Standard - + Unsafe (fast) Utrygg (raskt) - + Safe (stable) Trygg (stabil) - + Immediate - + Balanced Balansert - + Strict - + Unsafe Utrygt - + Paranoid (disables most optimizations) Paranoid (deaktiverer de fleste optimaliseringer) - + Debugging - + Dynarmic - + NCE NCE - + Borderless Windowed Rammeløst vindu - + Exclusive Fullscreen Eksklusiv fullskjerm - + No Video Output Ingen videoutdata - + CPU Video Decoding CPU-videodekoding - + GPU Video Decoding (Default) GPU-videodekoding (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0,25× (180p/270p) [EKSPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5× (360p/540p) [EKSPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75× (540p/810p) [EKSPERIMENTELL] - + 1X (720p/1080p) 1× (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1,25× (900p/1350p) [EKSPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1,5× (1080p/1620p) [EKSPERIMENTELL] - + 2X (1440p/2160p) 2× (1440p/2160p) - + 3X (2160p/3240p) 3× (2160p/3240p) - + 4X (2880p/4320p) 4× (2880p/4320p) - + 5X (3600p/5400p) 5× (3600p/5400p) - + 6X (4320p/6480p) 6× (4320p/6480p) - + 7X (5040p/7560p) 7× (5040p/7560p) - + 8X (5760p/8640p) 8× (5760p/8640p) - + Nearest Neighbor Nærmeste nabo - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gaussisk - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Område - + MMPX MMPX - + Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tving 4:3 - + Force 21:9 Tving 21:9 - + Force 16:10 Tving 16:10 - + Stretch to Window Strekk til vinduet - + Automatic Automatisk - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japansk (日本語) - + American English Amerikansk engelsk - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Nederlandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwansk - + British English Britisk engelsk - + Canadian French Kanadisk fransk - + Latin American Spanish Latinamerikansk spansk - + Simplified Chinese Forenklet kinesisk - + Traditional Chinese (正體中文) Tradisjonell kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisisk (português do Brasil) - + Polish (polska) Polsk (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australia - + China Folkerepublikken Kina - + Korea Korea - + Taiwan Taiwan (Republikken Kina) - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET Sentraleuropeisk tid - + CST6CDT CST6CDT - + Cuba Cuba - + EET Østeuropeisk tid - + Egypt Egypt - + Eire Republikken Irland - + EST EST - + EST5EDT EST5EDT - + GB Storbritannia - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC Folkerepublikken Kina - + PST8PDT PST8PDT - + ROC Taiwan (Republikken Kina) - + ROK Sør-Korea - + Singapore Singapore - + Turkey Tyrkia - + UCT UCT - + Universal Universalt - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (Utrygt) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (Utrygt) - + 12GB DRAM (Unsafe) 12 GB DRAM (Utrygt) - + Docked I dokking - + Handheld Håndholdt - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) Spør alltid (Standard) - + Only if game specifies not to stop - + Never ask Aldri spør - + Very Small (16 MB) Veldig liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Veldig stor (512 MB) - + Very Low (4 MB) Veldig lav (4 MB) - + Low (8 MB) Lav (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Middels (32 MB) - + High (64 MB) Høy (64 MB) - + Very Low (32) Svært lav (32) - + Low (64) Lav (64) - + Normal (128) Normal (128) - + Medium (256) Middels (256) - + High (512) Høy (512) - + Disabled Skrudd av - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4840,6 +4840,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5924,50 +6033,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL ikke tilgjengelig! - + OpenGL shared contexts are not supported. Delte OpenGL-kontekster støttes ikke. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! Feil under initialisering av OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Det kan hende at GPU-en din ikke støtter OpenGL, eller at du ikke har den nyeste grafikkdriveren. - + Error while initializing OpenGL 4.6! Feil under initialisering av OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Det kan hende at GPU-en din ikke støtter OpenGL 4.6, eller at du ikke har den nyeste grafikkdriveren.<br><br>GL-renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Det kan hende at GPU-en din ikke støtter én eller flere nødvendige OpenGL-utvidelser. Vennligst sørg for at du har den nyeste grafikkdriveren.<br><br>GL-renderer: <br>%1<br><br>Ikke-støttede utvidelser:<br>%2 - + This build doesn't have OpenGL support. @@ -6788,42 +6897,42 @@ Debug Message: Tilbakestill vindusstørrelsen til 1080p - + &Multiplayer &Flerspiller - + &Tools Verk&tøy - + Am&iibo am&iibo - + Launch &Applet - + &TAS &TAS - + &Create Home Menu Shortcut - + Install &Firmware Installér &fastvare - + &Help &Hjelp @@ -6849,7 +6958,7 @@ Debug Message: - + &Pause &Pause @@ -6950,900 +7059,900 @@ Debug Message: - Open &Quickstart Guide - Åpne Hurtigstartsguiden (&Q) + &User Handbook + - - &FAQ - &FAQ - - - + &Capture Screenshot &Ta skjermklipp - + &Album &Album - + &Set Nickname and Owner - + &Delete Game Data &Slett spilldata - + &Restore Amiibo &Gjenopprett amiibo - + &Format Amiibo - + &Mii Editor - + &Configure TAS... &Konfigurer TAS ... - + Configure C&urrent Game... Konfigurer nåværende spill ... - - + + &Start &Start - + &Reset &Omstart - - + + R&ecord T&a opp - + Open &Controller Menu Åpne &kontrollermeny - + Install Decryption &Keys - + &Home Menu &Hjem-meny - + &Desktop &Skrivebord - + &Application Menu &Appmeny - + &Root Data Folder &Rotdatamappe - + &NAND Folder &NAND-mappe - + &SDMC Folder &SDMC-mappe - + &Mod Folder &Mod-mappe - + &Log Folder &Loggmappe - + From Folder Fra mappe - + From ZIP Fra ZIP - + &Eden Dependencies &Eden-avhengigheter - + &Data Manager &Databehandler - + &Tree View &Trevisning - + &Grid View &Rutenettvisning - + Game Icon Size Spillikonstørrelse - - + + None Ingen - + Show Game &Name Vis spill&navn - + Show &Performance Overlay Vis &ytelsesoverlegg + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) Liten (32x32) - + Standard (64x64) Standard (64x64) - + Large (128x128) Stor (128x128) - + Full Size (256x256) Full størrelse (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Kjører et spill - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Slå på lyd - + Mute Demp - + Reset Volume Tilbakestill volum - + &Clear Recent Files &Tøm nylige filer - + &Continue &Fortsett - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... Lukker programvare ... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! Mappen finnes ikke! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File Fjern fil - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full Full - + Skeleton Skjelett - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... Utvinner RomFS... - - + + Cancel Avbryt - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory Velg mappe - + Properties Egenskaper - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... Installerer filen «%1» ... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application Systemapp - + System Archive Systemarkiv - + System Application Update - + Firmware Package (Type A) Fastvarepakke (Type A) - + Firmware Package (Type B) Fastvarepakke (Type B) - + Game Spill - + Game Update Spilloppdatering - + Game DLC Spill-DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found Filen ble ikke funnet - + File "%1" not found - + OK OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL Feil under åpning av URL - + Unable to open the URL "%1". - + TAS Recording TAS-opptak - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo amiibo - - + + The current amiibo has been removed - + Error Feil - - + + The current game is not looking for amiibos Det nåværende spillet ser ikke etter amiiboer - + Amiibo File (%1);; All Files (*.*) amiibo-fil (%1);; Alle filer (*.*) - + Load Amiibo Last inn amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available Ingen fastvare tilgjengelig - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot Ta skjermklipp - + PNG Image (*.png) PNG-bilde (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Hastighet: %1% / %2% - + Speed: %1% Hastighet: %1% - + Game: %1 FPS Spill: %1 FPS - + Frame: %1 ms Ramme: %1 ms - + NO AA INGEN AA - + VOLUME: MUTE VOLUM: DEMP - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUM: %1% - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7851,74 +7960,74 @@ Would you like to force it for future launches? - + Use X11 Bruk X11 - + Continue with Wayland - + Don't show again Ikke vis igjen - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow Treg - + Turbo Turbo - + Unlocked Ubegrenset - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9107,275 +9216,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... Installerer fastvare ... - - - - - + + + + + Cancel Avbryt - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? Er du HELT sikker? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip %1.zip - - - + + + Zipped Archives (*.zip) Zippede arkiver (*.zip) - + Exporting data. This may take a while... - + Exporting Eksporterer - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed Eksportering mislyktes - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing Importerer - + Imported Successfully Importeringen var vellykket - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed Importering mislyktes - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index 28d6649a8f..3e2831b876 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -578,70 +578,70 @@ FXAA can produce a more stable picture in lower resolutions. - + Fullscreen Mode: Volledig scherm modus: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Aspect Ratio: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC-emulatie: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: ASTC Decodeer Methode: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -650,55 +650,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: VSync-modus: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -706,79 +706,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Schakel asynchrone presentatie in (alleen Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) Forceer maximale klokken (alleen Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Werkt op de achtergrond terwijl er wordt gewacht op grafische opdrachten om te voorkomen dat de GPU zijn kloksnelheid verlaagt. - + Anisotropic Filtering: Anisotrope Filtering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -788,1327 +788,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Gebruik Vulkan-pijplijn-cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Schakel Reactive Flushing In - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Apparaatnaam - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Aangepaste RTC Datum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Taal: - + This option can be overridden when region setting is auto-select - + Region: Regio: - + The region of the console. - + Time Zone: Tijdzone: - + The time zone of the console. - + Sound Output Mode: Geluidsuitvoermodus: - + Console Mode: Console Modus: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Bevestig voordat u de emulatie stopt - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Verberg muis wanneer inactief - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Controller-applet uitschakelen - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) BC1 (Lage Kwaliteit) - + BC3 (Medium quality) BC3 (Gemiddelde kwaliteit) - - + + Auto Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Accuraat - - - + + + Default Standaard - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Onveilig - + Paranoid (disables most optimizations) Paranoid (schakelt de meeste optimalisaties uit) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Randloos Venster - + Exclusive Fullscreen Exclusief Volledig Scherm - + No Video Output Geen Video-uitvoer - + CPU Video Decoding CPU Videodecodering - + GPU Video Decoding (Default) GPU Videodecodering (Standaard) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTEEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTEEL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Geen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standaart (16:9) - + Force 4:3 Forceer 4:3 - + Force 21:9 Forceer 21:9 - + Force 16:10 Forceer 16:10 - + Stretch to Window Uitrekken naar Venster - + Automatic Automatisch - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japans (日本語) - + American English Amerikaans-Engels - + French (français) Frans (Français) - + German (Deutsch) Duits (Deutsch) - + Italian (italiano) Italiaans (italiano) - + Spanish (español) Spaans (Español) - + Chinese Chinees - + Korean (한국어) Koreaans (한국어) - + Dutch (Nederlands) Nederlands (Nederlands) - + Portuguese (português) Portugees (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanese - + British English Brits-Engels - + Canadian French Canadees-Frans - + Latin American Spanish Latijns-Amerikaans Spaans - + Simplified Chinese Vereenvoudigd Chinees - + Traditional Chinese (正體中文) Traditioneel Chinees (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliaans-Portugees (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australië - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standaard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Ijsland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libië - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkije - + UCT UCT - + Universal Universeel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4835,6 +4835,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5920,50 +6029,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL niet beschikbaar! - + OpenGL shared contexts are not supported. OpenGL gedeelde contexten worden niet ondersteund. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! Fout tijdens het initialiseren van OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Je GPU ondersteunt mogelijk geen OpenGL, of je hebt niet de laatste grafische stuurprogramma. - + Error while initializing OpenGL 4.6! Fout tijdens het initialiseren van OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Je GPU ondersteunt mogelijk OpenGL 4.6 niet, of je hebt niet het laatste grafische stuurprogramma.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Je GPU ondersteunt mogelijk een of meer vereiste OpenGL-extensies niet. Zorg ervoor dat je het laatste grafische stuurprogramma hebt.<br><br>GL Renderer:<br>%1<br><br>Ondersteunde extensies:<br>%2 - + This build doesn't have OpenGL support. @@ -6784,42 +6893,42 @@ Debug Message: Herstel Venstergrootte naar 1080p - + &Multiplayer &Multiplayer - + &Tools &Tools - + Am&iibo - + Launch &Applet - + &TAS &TAS - + &Create Home Menu Shortcut - + Install &Firmware - + &Help &Help @@ -6845,7 +6954,7 @@ Debug Message: - + &Pause &Onderbreken @@ -6946,900 +7055,900 @@ Debug Message: - Open &Quickstart Guide - Open &Snelstartgids + &User Handbook + - - &FAQ - &FAQ - - - + &Capture Screenshot &Leg Schermafbeelding Vast - + &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + &Mii Editor - + &Configure TAS... &Configureer TAS... - + Configure C&urrent Game... Configureer Huidig Spel... - - + + &Start &Start - + &Reset &Herstel - - + + R&ecord Opnemen - + Open &Controller Menu - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7847,74 +7956,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9101,275 +9210,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/pl.ts b/dist/languages/pl.ts index 1de0411aea..14da962f1a 100644 --- a/dist/languages/pl.ts +++ b/dist/languages/pl.ts @@ -592,12 +592,12 @@ SMAA oferuje najlepszą jakość. FXAA może zapewnić stabilniejszy obraz w niższych rozdzielczościach. - + Fullscreen Mode: Tryb Pełnoekranowy: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -606,12 +606,12 @@ Tryb bez ramek zapewnia najlepszą zgodność z klawiaturą ekranową wymaganą Pełny ekran wyłączny może oferować lepszą wydajność i lepsze wsparcie FreeSync/G-Sync. - + Aspect Ratio: Format obrazu: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -620,35 +620,35 @@ Większość gier obsługuje wyłącznie 16:9, więc inne proporcje wymagają mo Kontroluje także proporcje przechwytywanych zrzutów ekranu. - + Use persistent pipeline cache Używaj trwałej pamięci podręcznej (cache) potoków - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Pozwala zapisywać shadery w pamięci masowej, aby przyspieszyć ładowanie przy kolejnych uruchomieniach gry. Wyłączanie tej opcji jest przeznaczone do debugowania. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Emulacja NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -657,12 +657,12 @@ Dekodowanie może być wykonywane przez CPU albo GPU, albo może być całkowici W większości przypadków najlepszą wydajność zapewnia dekodowanie na GPU. - + ASTC Decoding Method: Metoda dekodowania ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -674,12 +674,12 @@ GPU: użyj shaderów obliczeniowych GPU do dekodowania tekstur ASTC (zalecane). CPU asynchronicznie: użyj CPU do dekodowania na żądanie. Eliminuje zacięcia podczas dekodowania ASTC, ale może powodować artefakty. - + ASTC Recompression Method: Metoda rekompresji ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -687,44 +687,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3: format pośredni zostanie ponownie skompresowany do BC1 lub BC3 — oszczędza VRAM kosztem jakości obrazu. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: Tryb wykorzystania VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Określa, czy emulator ma oszczędzać pamięć, czy maksymalnie wykorzystywać dostępną pamięć wideo dla wydajności. Tryb agresywny może pogorszyć działanie innych aplikacji, np. oprogramowania do nagrywania. - + Skip CPU Inner Invalidation Pomiń wewnętrzne unieważnienie procesora CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Pomija niektóre unieważnienia pamięci podręcznej po stronie CPU podczas aktualizacji pamięci, zmniejszając użycie CPU i poprawiając jego wydajność. Może powodować błędy lub awarie w niektórych grach. - + VSync Mode: Tryb synchronizacji pionowej: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -735,12 +735,12 @@ Mailbox może mieć niższe opóźnienia niż FIFO i nie powoduje tearingu, ale Immediate (bez synchronizacji) wyświetla wszystko, co jest dostępne, i może powodować tearing. - + Sync Memory Operations Synchronizuj operacje pamięci - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -748,68 +748,68 @@ Unreal Engine 4 games often see the most significant changes thereof. Gry z Unreal Engine 4 mogą być najbardziej dotknięte. - + Enable asynchronous presentation (Vulkan only) Włącz asynchroniczną prezentację (tylko Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Nieznacznie poprawia wydajność, przenosząc prezentację na oddzielny wątek CPU. - + Force maximum clocks (Vulkan only) Wymuś maksymalne zegary (Tylko Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Uruchamia pracę w tle podczas oczekiwania na komendy graficzne aby GPU nie obniżało taktowania. - + Anisotropic Filtering: Filtrowanie anizotropowe: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Steruje jakością renderowania tekstur pod ostrymi kątami. Na większości GPU bezpieczną wartością jest 16x. - + GPU Mode: Tryb GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Dokładność DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -819,100 +819,100 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Włącz asynchroniczną kompilację shaderów - + May reduce shader stutter. Może zmniejszyć zacięcia spowodowane kompilacją shaderów. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Użyj pamięci podręcznej strumienia dla Vulkana - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Włącza specyficzną dla producenta GPU pamięć podręczną potoków. Ta opcja może znacząco skrócić czas ładowania shaderów w przypadkach, gdy sterownik Vulkan nie przechowuje wewnętrznie plików pamięci podręcznej potoków. - + Enable Compute Pipelines (Intel Vulkan Only) Włącz potoki obliczeniowe (tylko Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -921,192 +921,192 @@ To ustawienie istnieje wyłącznie dla sterowników Intela i może spowodować b Na wszystkich pozostałych sterownikach potoki obliczeniowe są zawsze włączone. - + Enable Reactive Flushing Włącz reaktywne opróżnianie buforów - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Używa opróżniania reaktywnego zamiast predykcyjnego, co umożliwia dokładniejsze synchronizowanie pamięci. - + Sync to framerate of video playback Synchronizuj do liczby klatek odtwarzanego wideo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Uruchamiaj grę z normalną prędkością podczas odtwarzania wideo, nawet przy odblokowanej liczbie klatek na sekundę. - + Barrier feedback loops Pętle sprzężenia zwrotnego barier - + Improves rendering of transparency effects in specific games. Poprawia renderowanie efektów przezroczystości w niektórych grach. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State Rozszerzony stan dynamiczny - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Kontroluje liczbę funkcji, które mogą być używane w Extended Dynamic State. Wyższe poziomy pozwalają na użycie większej liczby funkcji i mogą zwiększyć wydajność, ale mogą powodować dodatkowe problemy z grafiką. - + Vertex Input Dynamic State Dynamiczny stan wejścia wierzchołków - + Enables vertex input dynamic state feature for better quality and performance. Włącza funkcję dynamicznego stanu wejścia wierzchołków, poprawiając jakość i wydajność. - + Sample Shading Cieniowanie próbkowe - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Pozwala wykonywać shader fragmentów dla każdej próbki we fragmencie wielokrotnie próbkowanym zamiast raz dla każdego fragmentu. Poprawia jakość grafiki kosztem wydajności. Wyższe wartości poprawiają jakość, ale obniżają wydajność. - + RNG Seed Ziarno RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Ustala ziarno generatora liczb losowych. Głównie używane do speedrunów. - + Device Name Nazwa urządzenia - + The name of the console. The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Własna data RTC - + This option allows to change the clock of the console. Can be used to manipulate time in games. Ta opcja pozwala zmienić zegar konsoli. Może służyć do manipulowania czasem w grach. - + The number of seconds from the current unix time Liczba sekund od bieżącego czasu Unix - + Language: Język: - + This option can be overridden when region setting is auto-select Ta opcja może zostać nadpisana, gdy ustawienie regionu to automatyczny wybór. - + Region: Region: - + The region of the console. Region konsoli. - + Time Zone: Strefa czasowa: - + The time zone of the console. Strefa czasowa konsoli. - + Sound Output Mode: Tryb wyjścia dźwięku: - + Console Mode: Tryb konsoli - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1115,1042 +1115,1042 @@ W zależności od tego ustawienia gry zmienią swoją rozdzielczość, szczegó Ustawienie na Handheld może poprawić wydajność na słabszych komputerach. - + Prompt for user profile on boot Pytaj o profil użytkownika przy uruchomieniu. - + Useful if multiple people use the same PC. Przydatne, gdy z tego samego PC korzysta wiele osób. - + Pause when not in focus Wstrzymuj, gdy okno nie jest aktywne - + Pauses emulation when focusing on other windows. Wstrzymuje emulację po przełączeniu na inne okna. - + Confirm before stopping emulation Potwierdzaj przed zatrzymaniem emulacji - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Nadpisuje monity z prośbą o potwierdzenie zatrzymania emulacji. Włączenie powoduje pominięcie takich monitów i bezpośrednie wyjście z emulacji. - + Hide mouse on inactivity Ukryj mysz przy braku aktywności - + Hides the mouse after 2.5s of inactivity. Ukrywa kursor po 2,5 s bezczynności. - + Disable controller applet Wyłącz aplet kontrolera - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Wymusza wyłączenie użycia apletu kontrolera w oprogramowaniu uruchamianym w emulacji. Jeśli emulowane oprogramowanie próbuje otworzyć aplet kontrolera, jest on natychmiast zamykany. - + Check for updates Sprawdź aktualizacje - + Whether or not to check for updates upon startup. Czy sprawdzać aktualizacje przy uruchomieniu. - + Enable Gamemode Włącz Tryb gry - + Force X11 as Graphics Backend Wymuś X11 jako backend grafiki - + Custom frontend Niestandardowy frontend - + Real applet Prawdziwy aplet - + Never Nigdy - + On Load Przy wczytywaniu - + Always Zawsze - + CPU CPU - + GPU GPU - + CPU Asynchronous Asynchroniczne CPU - + Uncompressed (Best quality) Brak (najlepsza jakość) - + BC1 (Low quality) BC1 (niska jakość) - + BC3 (Medium quality) BC3 (średnia jakość) - - + + Auto Automatyczny - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Konserwatywny - + Aggressive Agresywny - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast Szybkie - - - + + + Accurate Dokładny - - - + + + Default Domyślny - + Unsafe (fast) Niezalecane (szybkie) - + Safe (stable) Bezpieczne (stabilne) - + Immediate - + Balanced Zrównoważony - + Strict - + Unsafe Niebezpieczny - + Paranoid (disables most optimizations) Paranoiczne (wyłącza większość optymalizacji) - + Debugging Debugowanie - + Dynarmic Dynamiczny - + NCE NCE - + Borderless Windowed W oknie (Bezramkowy) - + Exclusive Fullscreen Exclusive Fullscreen - + No Video Output Brak wyjścia wideo - + CPU Video Decoding Dekodowanie Wideo przez CPU - + GPU Video Decoding (Default) Dekodowanie Wideo przez GPU (Domyślne) - + 0.25X (180p/270p) [EXPERIMENTAL] 0,25x (180p/270p) [EKSPERYMENTALNE] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5x (360p/540p) [EKSPERYMENTALNE] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EKSPERYMENTALNE] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EKSPERYMENTALNE] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [Ekperymentalnie] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Najbliższy sąsiadujący - + Bilinear Bilinearny - + Bicubic Bikubiczny - + Gaussian Kulisty - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Obszar - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Żadna (wyłączony) - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Domyślne (16:9) - + Force 4:3 Wymuś 4:3 - + Force 21:9 Wymuś 21:9 - + Force 16:10 Wymuś 16:10 - + Stretch to Window Rozciągnij do Okna - + Automatic Automatyczne - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japoński (日本語) - + American English Angielski Amerykański - + French (français) Francuski (français) - + German (Deutsch) Niemiecki (Niemcy) - + Italian (italiano) Włoski (italiano) - + Spanish (español) Hiszpański (español) - + Chinese Chiński - + Korean (한국어) Koreański (한국어) - + Dutch (Nederlands) Duński (Holandia) - + Portuguese (português) Portugalski (português) - + Russian (Русский) Rosyjski (Русский) - + Taiwanese Tajwański - + British English Angielski Brytyjski - + Canadian French Fancuski (Kanada) - + Latin American Spanish Hiszpański (Latin American) - + Simplified Chinese Chiński (Uproszczony) - + Traditional Chinese (正體中文) Chiński tradycyjny (正體中文) - + Brazilian Portuguese (português do Brasil) Portugalski (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonia - + USA USA - + Europe Europa - + Australia Australia - + China Chiny - + Korea Korea - + Taiwan Tajwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Domyślne (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipt - + Eire Irlandia - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Izrael - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polska - + Portugal Portugalia - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turcja - + UCT UCT - + Universal Uniwersalny - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Domyślne) - + 6GB DRAM (Unsafe) 6GB DRAM (NIebezpieczne) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (NIebezpieczne) - + 12GB DRAM (Unsafe) 12GB DRAM (NIebezpieczne) - + Docked Zadokowany - + Handheld Przenośnie - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) Zawsze pytaj (Domyślne) - + Only if game specifies not to stop Tylko jeśli gra określa, aby nie zatrzymywać - + Never ask Nie pytaj więcej - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Średnie (256) - + High (512) Wysokie (512) - + Disabled Wyłączone - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4899,6 +4899,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5986,50 +6095,50 @@ Przejdź do sekcji Konfiguracja -> System -> Sieć i dokonaj wyboru. GRenderWindow - - + + OpenGL not available! OpenGL niedostępny! - + OpenGL shared contexts are not supported. Współdzielone konteksty OpenGL nie są obsługiwane. - + Eden has not been compiled with OpenGL support. Eden nie został skompilowany z obsługą OpenGL. - - - + + + Error while initializing OpenGL! Błąd podczas inicjowania OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Twoja karta graficzna może nie obsługiwać OpenGL lub nie masz najnowszych sterowników karty graficznej. - + Error while initializing OpenGL 4.6! Błąd podczas inicjowania OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Twoja karta graficzna może nie obsługiwać OpenGL 4.6 lub nie masz najnowszych sterowników karty graficznej.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Twoja karta graficzna może nie obsługiwać co najmniej jednego wymaganego rozszerzenia OpenGL. Upewnij się, że masz najnowsze sterowniki karty graficznej<br><br>GL Renderer:<br>%1<br><br>Nieobsługiwane rozszerzenia:<br>%2 - + This build doesn't have OpenGL support. @@ -6851,42 +6960,42 @@ Komunikat debugowania: Zresetuj rozmiar okna do 1080p - + &Multiplayer &Multiplayer - + &Tools &Narzędzia - + Am&iibo Am&iibo - + Launch &Applet - + &TAS &TAS - + &Create Home Menu Shortcut &Utwórz skrót w Menu głównym - + Install &Firmware Zainstaluj &Firmware - + &Help &Pomoc @@ -6912,7 +7021,7 @@ Komunikat debugowania: - + &Pause &Pauza @@ -7013,579 +7122,579 @@ Komunikat debugowania: - Open &Quickstart Guide - Otwórz &Poradnik szybkiego startu + &User Handbook + - - &FAQ - &FAQ - - - + &Capture Screenshot &Zrób zdjęcie - + &Album - + &Set Nickname and Owner &Ustaw nick oraz właściciela - + &Delete Game Data &Usuń dane gry - + &Restore Amiibo &Przywróć Amiibo - + &Format Amiibo &Sformatuj Amiibo - + &Mii Editor - + &Configure TAS... &Skonfiguruj TAS - + Configure C&urrent Game... Skonfiguruj &obecną grę... - - + + &Start &Start - + &Reset &Zresetuj - - + + R&ecord &Nagraj - + Open &Controller Menu Otwórz Menu &kontrolera - + Install Decryption &Keys Zainstaluj &klucze deszyfrujące - + &Home Menu - + &Desktop &Pulpit - + &Application Menu Menu &Aplikacji - + &Root Data Folder Folder &Root (danych głównych) - + &NAND Folder Folder &NAND - + &SDMC Folder Folder &SDMC - + &Mod Folder Folder &modów - + &Log Folder Folder &logów - + From Folder Z Folderu - + From ZIP Z pliku ZIP - + &Eden Dependencies Zależności &Eden - + &Data Manager Manager &Danych - + &Tree View - + &Grid View - + Game Icon Size - - + + None Żadna (wyłączony) - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected Wykryto uszkodzoną instalację Vulkan - + Vulkan initialization failed during boot. Inicjalizacja Vulkana nie powiodła się podczas uruchamiania. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Gra uruchomiona - + Loading Web Applet... Ładowanie apletu internetowego... - + Disable Web Applet Wyłącz Aplet sieciowy - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Wyłączenie apletu sieciowego może prowadzić do nieprzewidywalnego działania i powinno być używane wyłącznie z Super Mario 3D All-Stars. Na pewno chcesz wyłączyć aplet sieciowy? (Tę opcję można ponownie włączyć w ustawieniach debugowania). - + The amount of shaders currently being built Liczba shaderów aktualnie budowanych - + The current selected resolution scaling multiplier. Aktualnie wybrany mnożnik skalowania rozdzielczości. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Bieżąca prędkość emulacji. Wartości wyższe lub niższe niż 100% oznaczają, że emulacja działa odpowiednio szybciej lub wolniej niż na Switchu. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Liczba klatek na sekundę aktualnie wyświetlanych przez grę. Wartość ta zależy od gry oraz od konkretnej sceny. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Czas potrzebny na emulację jednej klatki Switcha, bez uwzględniania ogranicznika klatek i synchronizacji pionowej. Dla emulacji z pełną prędkością powinno to być maksymalnie 16,67 ms. - + Unmute Wyłącz wyciszenie - + Mute Wycisz - + Reset Volume Zresetuj głośność - + &Clear Recent Files &Usuń Ostatnie pliki - + &Continue &Kontynuuj - + Warning: Outdated Game Format Ostrzeżenie: Nieaktualny format gry - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Używasz dla tej gry formatu katalogu zdekonstruowanego ROM-u, który jest przestarzały i został zastąpiony innymi formatami, takimi jak NCA, NAX, XCI czy NSP. Katalogi takich ROM-ów nie zawierają ikon, metadanych ani nie obsługują aktualizacji.<br>Aby uzyskać wyjaśnienie dotyczące różnych formatów Switcha obsługiwanych przez Eden, zajrzyj do naszego podręcznika użytkownika. Ten komunikat nie zostanie wyświetlony ponownie. - - + + Error while loading ROM! Błąd podczas wczytywania ROMu! - + The ROM format is not supported. Ten format ROMu nie jest wspierany. - + An error occurred initializing the video core. Wystąpił błąd podczas inicjowania rdzenia wideo. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - Podczas uruchamiania rdzenia wideo wystąpił błąd. Zazwyczaj jest to spowodowane nieaktualnymi sterownikami GPU, w tym sterownikami zintegrowanymi. Więcej szczegółów można znaleźć w logu. Więcej informacji na temat dostępu do logu można znaleźć na następującej stronie: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>Jak przesłać Log</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. + - + Error while loading ROM! %1 %1 signifies a numeric error code. Błąd podczas wczytywania ROMu! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Proszę ponownie zrzucić pliki lub poprosić o pomoc na Discordzie/Stoat. - + An unknown error occurred. Please see the log for more details. Wystąpił nieznany błąd. Więcej informacji można znaleźć w pliku log. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Zamykanie aplikacji... - + Save Data Zapis danych - + Mod Data Dane modów - + Error Opening %1 Folder Błąd podczas otwierania folderu %1 - - + + Folder does not exist! Folder nie istnieje! - + Remove Installed Game Contents? Usunąć zainstalowaną zawartość gry? - + Remove Installed Game Update? Usunąć zainstalowaną aktualizację gry? - + Remove Installed Game DLC? Usunąć zainstalowane DLC gry? - + Remove Entry Usuń wpis - + Delete OpenGL Transferable Shader Cache? Usunąć przenośną pamięć podręczną shaderów OpenGL? - + Delete Vulkan Transferable Shader Cache? Usunąć przenośną pamięć podręczną shaderów Vulkan? - + Delete All Transferable Shader Caches? Usunąć wszystkie przenośne pamięci podręczne shaderów? - + Remove Custom Game Configuration? Usunąć niestandardową konfigurację gry? - + Remove Cache Storage? Usunąć pamięć podręczną? - + Remove File Usuń plik - + Remove Play Time Data Usuń dane czasu gry - + Reset play time? Zresetować czas gry? - - + + RomFS Extraction Failed! Wyodrębnianie RomFS nie powiodło się! - + There was an error copying the RomFS files or the user cancelled the operation. Wystąpił błąd podczas kopiowania plików RomFS lub użytkownik przerwał operację. - + Full Pełny - + Skeleton Szkielet - + Select RomFS Dump Mode Wybierz tryb zrzutu RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Wybierz sposób wykonania zrzutu RomFS. <br>Tryb „Pełny” skopiuje wszystkie pliki do nowego katalogu, <br>natomiast „Szkielet” utworzy jedynie strukturę katalogów. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Nie ma wystarczająco miejsca w %1 aby wyodrębnić RomFS. Zwolnij trochę miejsca, albo zmień ścieżkę zrzutu RomFs w Emulacja > Konfiguruj > System > System Plików > Źródło Zrzutu - + Extracting RomFS... Wypakowywanie RomFS... - - + + Cancel Anuluj - + RomFS Extraction Succeeded! Wypakowanie RomFS zakończone pomyślnie! - + The operation completed successfully. Operacja zakończona pomyślnie. - + Error Opening %1 Błąd podczas otwierania %1 - + Select Directory Wybierz folder - + Properties Właściwości - + The game properties could not be loaded. Właściwości tej gry nie mogły zostać załadowane. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Plik wykonywalny Switcha (%1);;Wszystkie pliki (*.*) - + Load File Załaduj plik - + Open Extracted ROM Directory Otwórz folder wypakowanego ROMu - + Invalid Directory Selected Wybrano niewłaściwy folder - + The directory you have selected does not contain a 'main' file. Wybrany folder nie zawiera 'głównego' pliku. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Instalacyjne pliki Switch'a (*.nca *.nsp *.xci);;Archiwum zawartości Nintendo (*.nca);;Pakiet poddany Nintendo (*.nsp);;Obraz z kartridża NX (*.xci) - + Install Files Zainstaluj pliki - + %n file(s) remaining Pozostał %n plikPozostały %n plikiPozostało %n plikówPozostało %n plików - + Installing file "%1"... Instalowanie pliku "%1"... - - + + Install Results Wynik instalacji - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Aby uniknąć ewentualnych konfliktów, odradzamy użytkownikom instalowanie gier na NAND. Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + %n file(s) were newly installed %n plik został nowo zainstalowany @@ -7595,7 +7704,7 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + %n file(s) were overwritten %n plik został nadpisany @@ -7605,7 +7714,7 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + %n file(s) failed to install Nie udało się zainstalować %n pliku @@ -7615,314 +7724,314 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + System Application Aplikacja systemowa - + System Archive Archiwum systemu - + System Application Update Aktualizacja aplikacji systemowej - + Firmware Package (Type A) Paczka systemowa (Typ A) - + Firmware Package (Type B) Paczka systemowa (Typ B) - + Game Gra - + Game Update Aktualizacja gry - + Game DLC Dodatek do gry - + Delta Title Tytuł Delta - + Select NCA Install Type... Wybierz typ instalacji NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Wybierz typ tytułu, do którego chcesz zainstalować ten NCA, jako: (W większości przypadków domyślna "gra" jest w porządku.) - + Failed to Install Instalacja nieudana - + The title type you selected for the NCA is invalid. Typ tytułu wybrany dla NCA jest nieprawidłowy. - + File not found Nie znaleziono pliku - + File "%1" not found Nie znaleziono pliku "%1" - + OK OK - + Function Disabled Funkcja wyłączona - + Compatibility list reporting is currently disabled. Check back later! Zgłaszanie do listy kompatybilności jest obecnie wyłączone. Spróbuj ponownie później! - + Error opening URL Błąd otwierania adresu URL - + Unable to open the URL "%1". Nie można otworzyć adresu URL "%1". - + TAS Recording Nagrywanie TAS - + Overwrite file of player 1? Nadpisać plik gracza 1? - + Invalid config detected Wykryto nieprawidłową konfigurację - + Handheld controller can't be used on docked mode. Pro controller will be selected. Nie można używać kontrolera handheld w trybie zadokowanym. Zostanie wybrany kontroler Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Amiibo zostało "zdjęte" - + Error Błąd - - + + The current game is not looking for amiibos Ta gra nie szuka amiibo - + Amiibo File (%1);; All Files (*.*) Plik Amiibo (%1);;Wszyskie pliki (*.*) - + Load Amiibo Zamontuj Amiibo - + Error loading Amiibo data Błąd podczas ładowania danych Amiibo - + The selected file is not a valid amiibo Wybrany plik nie jest poprawnym amiibo - + The selected file is already on use Wybrany plik jest już w użyciu - + An unknown error occurred Wystąpił nieznany błąd - + No firmware available Brak dostępnego firmware'u - + Firmware Corrupted Uszkodzony Firmware - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot Zrób zrzut ekranu - + PNG Image (*.png) Obrazek PNG (*.png) - + TAS state: Running %1/%2 Status TAS: Działa %1%2 - + TAS state: Recording %1 Status TAS: Nagrywa %1 - + TAS state: Idle %1/%2 Status TAS: Bezczynny %1%2 - + TAS State: Invalid Status TAS: Niepoprawny - + &Stop Running &Wyłącz - + Stop R&ecording Przestań &Nagrywać - + Building: %n shader(s) Budowanie: %n shaderBudowanie: %n shaderyBudowanie: %n shaderówBudowanie: %n shaderów - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Prędkość: %1% / %2% - + Speed: %1% Prędkość: %1% - + Game: %1 FPS Gra: %1 FPS - + Frame: %1 ms Klatka: %1 ms - + NO AA BEZ AA - + VOLUME: MUTE Głośność: Wyciszony - + VOLUME: %1% Volume percentage (e.g. 50%) Głośność: %1% - + Derivation Components Missing Brak komponentów wyprowadzania - + Decryption keys are missing. Install them now? - + Wayland Detected! Wykryto Waylanda! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7932,74 +8041,74 @@ Zaleca się zamiast tego używać X11. Czy chcesz wymusić jego użycie przy przyszłych uruchomieniach? - + Use X11 Używaj X11 - + Continue with Wayland Kontynuuj z Waylandem - + Don't show again Nie pokazuj ponownie - + Restart Required Wymagane ponowne uruchomienie - + Restart Eden to apply the X11 backend. Uruchom ponownie Edena, aby zastosować backend X11. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target Wybierz cel zrzutu RomFS - + Please select which RomFS you would like to dump. Proszę wybrać RomFS, jakie chcesz zrzucić. - + Are you sure you want to close Eden? Czy na pewno chcesz zamknąć Edena? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Czy na pewno chcesz zatrzymać emulację? Wszystkie niezapisane postępy zostaną utracone. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9200,41 +9309,41 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. - Gra, którą próbujesz uruchomić, wymaga firmware’u do startu lub do przejścia ekranu początkowego. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>Zrzuć i zainstaluj firmware</a> albo naciśnij „OK”, aby mimo to uruchomić. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. + - + Installing Firmware... Instalacja Firmware... - - - - - + + + + + Cancel Anuluj - + Firmware Install Failed Instalacja firmware’u nie powiodła się - + Firmware Install Succeeded Instalacja firmware’u powiodła się - + Firmware integrity verification failed! Weryfikacja integralności firmware’u nie powiodła się! - - + + Verification failed for the following files: %1 @@ -9242,235 +9351,235 @@ p, li { white-space: pre-wrap; } %1 - - + + Verifying integrity... Weryfikacja integralności... - - + + Integrity verification succeeded! Weryfikacja integralności zakończona sukcesem! - - + + The operation completed successfully. Operacja zakończona pomyślnie. - - + + Integrity verification failed! Weryfikacja integralności nie powiodła się! - + File contents may be corrupt or missing. Zawartość pliku może być uszkodzona lub brakująca. - + Integrity verification couldn't be performed Nie można było przeprowadzić weryfikacji integralności - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. Instalacja firmware’u została anulowana — firmware może być w złym stanie lub uszkodzony. Nie udało się sprawdzić poprawności zawartości plików. - + Select Dumped Keys Location Wybierz lokalizację zrzutu kluczy - + Decryption Keys install succeeded Instalacja kluczy deszyfrujących powiodła się - + Decryption Keys install failed Instalacja kluczy deszyfrujących nie powiodła się - + Orphaned Profiles Detected! Wykryto osierocone profile! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> MOGĄ WYSTĄPIĆ NIEOCZEKIWANE PROBLEMY, JEŚLI TEGO NIE PRZECZYTASZ!<br>Eden wykrył następujące katalogi zapisów bez przypisanego profilu:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Kliknij „OK”, aby otworzyć folder zapisów i naprawić profile.<br>Wskazówka: skopiuj zawartość największego lub ostatnio modyfikowanego folderu w inne miejsce, usuń wszystkie osierocone profile, a następnie przenieś skopiowaną zawartość do właściwego profilu.<br><br>Nadal masz wątpliwości? Zobacz<a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>tronę pomocy</a>.<br> - + Really clear data? Na pewno wyczyścić dane? - + Important data may be lost! Ważne dane mogą zostać utracone! - + Are you REALLY sure? Czy NA PEWNO chcesz to zrobić? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. Po usunięciu Twoje dane NIE WRÓCĄ! Wykonaj to tylko, jeśli w 100% chcesz usunąć te dane. - + Clearing... Czyszczenie… - + Select Export Location Wybierz lokalizację eksportu - + %1.zip %1.zip - - - + + + Zipped Archives (*.zip) Archiwa ZIP (.zip) - + Exporting data. This may take a while... Eksportowanie danych. To może chwilę potrwać… - + Exporting Eksportowanie - + Exported Successfully Wyeksportowano pomyślnie - + Data was exported successfully. Dane zostały pomyślnie wyeksportowane. - + Export Cancelled Eksport anulowany - + Export was cancelled by the user. Eksport został anulowany przez użytkownika. - + Export Failed Eksport nie powiódł się - + Ensure you have write permissions on the targeted directory and try again. Upewnij się, że masz uprawnienia zapisu do docelowego katalogu i spróbuj ponownie. - + Select Import Location Wybierz lokalizację importu - + Import Warning Ostrzeżenie dotyczące importu - + All previous data in this directory will be deleted. Are you sure you wish to proceed? Wszystkie dotychczasowe dane w tym katalogu zostaną usunięte. Czy na pewno chcesz kontynuować? - + Importing data. This may take a while... Importowanie danych. To może chwilę potrwać… - + Importing Importowanie - + Imported Successfully Zaimportowano pomyślnie - + Data was imported successfully. Dane zostały pomyślnie zaimportowane. - + Import Cancelled Import anulowany - + Import was cancelled by the user. Import został anulowany przez użytkownika. - + Import Failed Import nie powiódł się - + Ensure you have read permissions on the targeted directory and try again. Upewnij się, że masz uprawnienia odczytu do docelowego katalogu i spróbuj ponownie. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index d7dfe6bf1a..36b5181730 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -590,12 +590,12 @@ SMAA oferece a melhor qualidade. FXAA pode produzir uma imagem mais estável em resoluções mais baixas. - + Fullscreen Mode: Tela Cheia - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -604,12 +604,12 @@ Sem borda oferece a melhor compatibilidade com o teclado na tela que alguns jogo Tela cheia exclusiva pode oferecer melhor desempenho e melhor suporte a Freesync/Gsync. - + Aspect Ratio: Proporção do Ecrã: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -618,36 +618,36 @@ A maioria dos jogos suporta apenas 16:9, sendo necessárias modificações para Também controla a proporção das capturas de tela. - + Use persistent pipeline cache Usar cache persistente de pipeline - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permite guardar os shaders para carregar os jogos nas execuções seguintes. Desabiltar essa opção só serve para propósitos de depuração. - + Use asynchronous GPU emulation Usar emulação assíncrona de GPU - + Uses an extra CPU thread for rendering. This option should always remain enabled. Usa uma thread de CPU extra para renderização. Esta opção deve estar sempre habilitada. - + NVDEC emulation: Emulação NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -656,12 +656,12 @@ Tanto a CPU quanto a GPU podem ser utilizadas para decodificação, ou não deco Na maioria dos casos, a decodificação pela GPU fornece um melhor desempenho. - + ASTC Decoding Method: Método de Decodificação ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -674,56 +674,56 @@ CPU Assíncrona: Usa a CPU para decodificar texturas ASTC sob demanda. Elimina t mas pode apresentar artefatos visuais. - + ASTC Recompression Method: Método de Recompressão ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. A maioria das GPUs não suporta texturas ASTC e precisa descompactá-las para um formato intermediário: RGBA8.BC1/BC3: O formato intermediário será recomprimido para BC1 ou BC3, economizando VRAM mas degradando a qualidade da imagem. - + Frame Pacing Mode (Vulkan only) Modo de Ritmo de Quadros (apenas Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. Controle como o emulador gerencia o ritmo de quadros para reduzir travamentos (engasgos) e deixar a taxa de quadros mais suave e consistente. - + VRAM Usage Mode: Modo de Uso da VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Define se o emulador deve priorizar a economia de memória ou fazer o uso máximo da memória de vídeo disponível para melhorar o desempenho. O modo agressivo pode impactar a performance de outros aplicativos, como softwares de gravação. - + Skip CPU Inner Invalidation Ignorar invalidação interna da CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Ignora certas invalidações de cache durante atualizações de memória, reduzindo o uso da CPU e melhorando a latência. Isso pode causar travamentos leves. - + VSync Mode: Modo de Sincronização vertical: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -734,12 +734,12 @@ Mailbox pode ter menor latência que FIFO e não apresenta cortes, mas pode perd Immediate (sem sincronização) exibe o que estiver disponível e pode apresentar cortes. - + Sync Memory Operations Sincronizar operações de memória - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -748,68 +748,68 @@ Esta opção corrige problemas em diversos jogos, mas pode reduzir o desempenho. Jogos baseados na Unreal Engine 4 costumam apresentar as mudanças mais significativas. - + Enable asynchronous presentation (Vulkan only) Ativar apresentação assíncrona (Somente Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Melhora ligeiramente o desempenho ao mover a apresentação para uma thread de CPU separada. - + Force maximum clocks (Vulkan only) Forçar clock máximo (somente Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Executa trabalho em segundo plano aguardando pelos comandos gráficos para evitar a GPU de reduzir seu clock. - + Anisotropic Filtering: Filtro Anisotrópico: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Controla a qualidade da renderização de texturas em ângulos oblíquos. Seguro definir em 16x na maioria das GPUs. - + GPU Mode: Modo da GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Precisão do DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -819,55 +819,55 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Ativar compilação assíncrona de shaders - + May reduce shader stutter. Pode reduzir travamentos de shaders. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Acelera a decodificação de texturas 3D BCn usando processamento da GPU. Desative se ocorrerem travamentos ou falhas gráficas. - + GPU Unswizzle Max Texture Size Tamanho Máximo de Textura para GPU Unswizzle - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -876,48 +876,48 @@ A GPU é mais rápida para texturas médias e grandes, mas a CPU pode ser mais e Ajuste para encontrar o equilíbrio entre aceleração da GPU e sobrecarga da CPU. - + GPU Unswizzle Stream Size Tamanho do Fluxo de GPU Unswizzle - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Define a quantidade máxima de dados de textura (em MiB) processados por quadro. Valores mais altos podem reduzir travamentos durante o carregamento de texturas, mas podem afetar a consistência dos quadros. - + GPU Unswizzle Chunk Size Tamanho do Bloco de GPU Unswizzle - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Determina o número de fatias de profundidade processadas em uma única execução. Aumentar esse valor pode melhorar o desempenho em GPUs avançadas, mas pode causar TDR ou tempo limite do driver em hardwares mais fracos. - + Use Vulkan pipeline cache Utilizar cache de pipeline do Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Habilita o cache de pipeline da fabricante da GPU. Esta opção pode melhorar o tempo de carregamento de shaders significantemente em casos onde o driver Vulkan não armazena o cache de pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Habilitar Pipeline de Computação (Somente Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -926,194 +926,194 @@ Esta configuração existe apenas para drivers proprietários da Intel e pode ca Pipelines de computação estão sempre habilitados em outros drivers. - + Enable Reactive Flushing Habilitar Flushing Reativo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa flushing reativo ao invés de flushing preditivo, permitindo mais precisão na sincronização da memória. - + Sync to framerate of video playback Sincronizar com o framerate da reprodução de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Executa o jogo na velocidade normal durante a reprodução de vídeo, mesmo se o framerate estiver desbloqueado. - + Barrier feedback loops Ciclos de feedback de barreira - + Improves rendering of transparency effects in specific games. Melhora a renderização de efeitos de transparência em jogos específicos. - + Enable buffer history Ativar histórico de buffer - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Permite acesso a estados anteriores do buffer. Esta opção pode melhorar a qualidade de renderização e a consistência de desempenho em alguns jogos. - + Fix bloom effects Corrigir efeitos de bloom - + Removes bloom in Burnout. Remove o bloom no Burnout. - + Enable Legacy Rescale Pass Ativar Passagem de Redimensionamento Legada - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Pode corrigir problemas de redimensionamento em alguns jogos, baseando-se no comportamento da implementação anterior. Solução legada que corrige artefatos de linha em GPUs AMD e Intel, e cintilação de texturas cinzas em GPUs Nvidia no Luigi's Mansion 3. - + Extended Dynamic State Estado Dinâmico Estendido - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Controla o número de recursos que podem ser usados no Estado Dinâmico Estendido. Estados mais altos permitem mais recursos e podem aumentar o desempenho, mas também podem causar problemas gráficos adicionais. - + Vertex Input Dynamic State Estado Dinâmico de Entrada de Vértices - + Enables vertex input dynamic state feature for better quality and performance. Ativa o recurso de estado dinâmico de entrada de vértices para melhor qualidade e desempenho. - + Sample Shading Sombreamento por Amostragem - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permite que o shader de fragmento seja processado por cada amostra em fragmentos multiamostrados, em vez de uma única vez por fragmento. Melhora a qualidade gráfica ao custo de desempenho. Valores mais altos aumentam a qualidade, mas reduzem a performance. - + RNG Seed Semente de RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Controla a semente do gerador de números aleatórios. Usado principalmente em speedruns. - + Device Name Nome do Dispositivo - + The name of the console. O nome do console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Data personalizada do RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Esta opção permite alterar o relógio do console. Pode ser usada para manipular o tempo nos jogos. - + The number of seconds from the current unix time Número de segundos a partir do tempo Unix atual - + Language: Idioma: - + This option can be overridden when region setting is auto-select Esta opção pode ser substituída quando a configuração de região estiver em seleção automática - + Region: Região: - + The region of the console. A região do console. - + Time Zone: Fuso Horário: - + The time zone of the console. O fuso horário do console. - + Sound Output Mode: Modo de saída de som - + Console Mode: Modo Console: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1122,1042 +1122,1042 @@ Os jogos ajustarão resolução, detalhes e controladores suportados conforme es Definir como Portátil pode ajudar a melhorar o desempenho em sistemas mais fracos. - + Prompt for user profile on boot Solicitar perfil de usuário na inicialização - + Useful if multiple people use the same PC. Útil se várias pessoas usam o mesmo PC. - + Pause when not in focus Pausar quando não estiver em foco - + Pauses emulation when focusing on other windows. Pausa a emulação ao focar em outras janelas. - + Confirm before stopping emulation Confirmar antes de parar a emulação - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Substitui as confirmações ao parar a emulação. Ao ativar, ignora esses avisos e encerra diretamente a emulação. - + Hide mouse on inactivity Esconder rato quando inactivo. - + Hides the mouse after 2.5s of inactivity. Oculta o mouse após 2,5s de inatividade. - + Disable controller applet Desabilitar applet de controle - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Desativa forçadamente o uso do applet de controle em programas emulados. Quando um programa tenta abrir o applet, ele é imediatamente fechado. - + Check for updates Verificar atualizações - + Whether or not to check for updates upon startup. Define se deve verificar atualizações na inicialização. - + Enable Gamemode Habilitar Gamemode - + Force X11 as Graphics Backend Forçar X11 como backend gráfico - + Custom frontend Frontend customizado - + Real applet Applet real - + Never Nunca - + On Load Ao carregar - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor Qualidade) - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - - + + Auto Automático - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservador - + Aggressive Agressivo - + Vulkan Vulcano - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Shaders em Assembly, apenas NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, apenas AMD/Mesa) - + Null Nenhum - + Fast Rápido - - - + + + Accurate Preciso - - - + + + Default Padrão - + Unsafe (fast) Inseguro (rápido) - + Safe (stable) Seguro (estável) - + Immediate - + Balanced Balanceado - + Strict - + Unsafe Inseguro - + Paranoid (disables most optimizations) Paranoia (desativa a maioria das otimizações) - + Debugging Depuração - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela sem bordas - + Exclusive Fullscreen Tela cheia exclusiva - + No Video Output Sem saída de vídeo - + CPU Video Decoding Decodificação de vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de vídeo pela GPU (Padrão) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Área - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à Janela - + Automatic Automático - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) Polonês (polska) - + Thai (แบบไทย) Tailandês (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egito - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irã - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polônia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Ancorado - + Handheld Portátil - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - + Very Small (16 MB) Muito Pequeno (16 MB) - + Small (32 MB) Pequeno (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muito Grande (512 MB) - + Very Low (4 MB) Muito Baixo (4 MB) - + Low (8 MB) Baixo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Médio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muito Baixo (32) - + Low (64) Baixo (64) - + Normal (128) Normal (128) - + Medium (256) Médio (256) - + High (512) Alto (512) - + Disabled Desativado - + ExtendedDynamicState 1 Estado Dinâmico Estendido 1 - + ExtendedDynamicState 2 Estado Dinâmico Estendido 2 - + ExtendedDynamicState 3 Estado Dinâmico Estendido 3 - + Tree View Visualização em Árvore - + Grid View Visualização em Grade @@ -4906,6 +4906,115 @@ Uma vez deletado, esses NÃO podem ser recuperados. Você tem 100% de certeza qu &Abrir Gerenciador de Arquivos + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5993,50 +6102,50 @@ Por favor vá para Configuração -> Sistema -> Rede e selecione. GRenderWindow - - + + OpenGL not available! OpenGL não está disponível! - + OpenGL shared contexts are not supported. Shared contexts do OpenGL não são suportados. - + Eden has not been compiled with OpenGL support. Eden não foi compilado com suporte a OpenGL. - - - + + + Error while initializing OpenGL! Erro ao inicializar OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. O seu GPU pode não suportar OpenGL, ou não tem os drivers gráficos mais recentes. - + Error while initializing OpenGL 4.6! Erro ao inicializar o OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 A sua GPU não tem suporte a OpenGL 4.6, talvez você não esteja usando os drivers gráficos mais atuais.<br><br>Renderizador GL:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Sua GPU pode não suportar uma ou mais extensões necessárias do OpenGL. Verifique se você possui a última versão dos drivers gráficos.<br><br>Renderizador GL:<br>%1<br><br>Extensões não suportadas:<br>%2 - + This build doesn't have OpenGL support. Essa build não suporte a OpenGL. @@ -6858,42 +6967,42 @@ Mensagem de Depuração: Restaurar tamanho da janela para 1080p - + &Multiplayer &Multijogador - + &Tools &Ferramentas - + Am&iibo Am&iibo - + Launch &Applet Iniciar &Applet - + &TAS &TAS - + &Create Home Menu Shortcut &Criar atalho para o menu Home - + Install &Firmware Instalar &Firmware - + &Help &Ajuda @@ -6919,7 +7028,7 @@ Mensagem de Depuração: - + &Pause &Pausa @@ -7020,901 +7129,901 @@ Mensagem de Depuração: - Open &Quickstart Guide - Abrir &guia de início rápido + &User Handbook + - - &FAQ - &Perguntas frequentes - - - + &Capture Screenshot &Captura de Tela - + &Album &Álbum - + &Set Nickname and Owner &Definir apelido e proprietário - + &Delete Game Data &Remover dados do jogo - + &Restore Amiibo &Recuperar Amiibo - + &Format Amiibo &Formatar Amiibo - + &Mii Editor &Editor de Mii - + &Configure TAS... &Configurar TAS - + Configure C&urrent Game... Configurar jogo atual... - - + + &Start &Começar - + &Reset &Restaurar - - + + R&ecord G&ravar - + Open &Controller Menu Menu Abrir &Controles - + Install Decryption &Keys Instalar Chaves de &Encriptação - + &Home Menu &Menu Home - + &Desktop &Área de Trabalho - + &Application Menu &Menu de Aplicativo - + &Root Data Folder &Pasta Raiz de Dados - + &NAND Folder &Pasta NAND - + &SDMC Folder &Pasta SDMC - + &Mod Folder &Pasta de Mods - + &Log Folder &Pasta de Logs - + From Folder Pela Pasta - + From ZIP Pelo ZIP - + &Eden Dependencies &Dependências do Eden - + &Data Manager &Gestor de Dados - + &Tree View &Visualização em Árvore - + &Grid View &Visualizar Grid - + Game Icon Size Tamanho do Ícone do jogo - - + + None Nenhum - + Show Game &Name Mostrar Nome de &Jogo - + Show &Performance Overlay Mostrar Sobreposição de &Desempenho + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) Pequeno (32x32) - + Standard (64x64) Padrão (64x64) - + Large (128x128) Grande (128x128) - + Full Size (256x256) Tamanho completo (256x256) - + Broken Vulkan Installation Detected Detectada Instalação Defeituosa do Vulkan - + Vulkan initialization failed during boot. Inicialização do Vulkan falhou durante o boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Rodando um jogo - + Loading Web Applet... Carregando Applet Web... - + Disable Web Applet Desativar Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Desativar o Applet Web pode problemas indefinidos e deverá apenas ser usando com o Super Mario 3D All-Stars. Você tem certeza que quer desativar o Applet Web? (Isso pode ser reativado nas Configurações de Depuração.) - + The amount of shaders currently being built A Quantidade total de Shaders está sendo atualmente construída - + The current selected resolution scaling multiplier. A atual multiplicação de escala de resolução selecionada. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocidade atual da emulação. Valores altos ou mais baixo que 100% indicam que o emulador está rodando mais rápido ou mais lento que um Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Quantos quadros por segundo o jogo está mostrando atualmente. Isto varia de jogo para jogo e de cena a cena. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory Selecionar Diretório - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory Abrir o Diretório da ROM extraída - + Invalid Directory Selected Diretório selecionado inválido - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed O Amiibo atual foi removido - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7922,74 +8031,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9178,275 +9287,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/pt_PT.ts b/dist/languages/pt_PT.ts index 19cffca27d..beef4e100c 100644 --- a/dist/languages/pt_PT.ts +++ b/dist/languages/pt_PT.ts @@ -573,12 +573,12 @@ FXAA can produce a more stable picture in lower resolutions. - + Fullscreen Mode: Tela Cheia - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -587,47 +587,47 @@ Sem borda oferece a melhor compatibilidade com o teclado na tela que alguns jogo Tela cheia exclusiva pode oferecer melhor performance e melhor suporte a Freesync/Gsync. - + Aspect Ratio: Proporção do Ecrã: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permite guardar os shaders para carregar os jogos nas execuções seguintes. Desabiltar essa opção só serve para propósitos de depuração. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Emulação NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -636,12 +636,12 @@ Tanto a CPU quanto a GPU podem ser utilizadas para decodificação, ou não deco Na maioria dos casos, a decodificação pela GPU fornece uma melhor performance. - + ASTC Decoding Method: Método de Decodificação ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -650,55 +650,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: Método de Recompressão ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: Modo de Uso da VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: Modo de Sincronização vertical: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -706,79 +706,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Ativar apresentação assíncrona (Somente Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Melhora ligeiramente o desempenho ao mover a apresentação para uma thread de CPU separada. - + Force maximum clocks (Vulkan only) Forçar clock máximo (somente Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Executa trabalho em segundo plano aguardando pelos comandos gráficos para evitar a GPU de reduzir seu clock. - + Anisotropic Filtering: Filtro Anisotrópico: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -788,1328 +788,1328 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Utilizar cache de pipeline do Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Habilita o cache de pipeline da fabricante da GPU. Esta opção pode melhorar o tempo de carregamento de shaders significantemente em casos onde o driver Vulkan não armazena o cache de pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Habilitar Pipeline de Computação (Somente Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Habilitar Flushing Reativo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa flushing reativo ao invés de flushing preditivo, permitindo mais precisão na sincronização da memória. - + Sync to framerate of video playback Sincronizar com o framerate da reprodução de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Executa o jogo na velocidade normal durante a reprodução de vídeo, mesmo se o framerate estiver desbloqueado. - + Barrier feedback loops Ciclos de feedback de barreira - + Improves rendering of transparency effects in specific games. Melhora a renderização de efeitos de transparência em jogos específicos. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Semente de RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Nome do Dispositivo - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Data personalizada do RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Idioma: - + This option can be overridden when region setting is auto-select - + Region: Região: - + The region of the console. - + Time Zone: Fuso Horário: - + The time zone of the console. - + Sound Output Mode: Modo de saída de som - + Console Mode: Modo Console: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Confirmar antes de parar a emulação - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Esconder rato quando inactivo. - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Desabilitar miniaplicativo de controle - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Habilitar Gamemode - + Force X11 as Graphics Backend - + Custom frontend Frontend customizado - + Real applet Miniaplicativo real - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor Q - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - - + + Auto Automático - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Conservador - + Aggressive Agressivo - + Vulkan Vulcano - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Nenhum (desativado) - + Fast - - - + + + Accurate Preciso - - - + + + Default Padrão - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Inseguro - + Paranoid (disables most optimizations) Paranoia (desativa a maioria das otimizações) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela sem bordas - + Exclusive Fullscreen Tela cheia exclusiva - + No Video Output Sem saída de vídeo - + CPU Video Decoding Decodificação de vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de vídeo pela GPU (Padrão) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à Janela - + Automatic Automático - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irão - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polónia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Ancorado - + Handheld Portátil - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4840,6 +4840,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5925,50 +6034,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL não está disponível! - + OpenGL shared contexts are not supported. Shared contexts do OpenGL não são suportados. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! Erro ao inicializar OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. O seu GPU pode não suportar OpenGL, ou não tem os drivers gráficos mais recentes. - + Error while initializing OpenGL 4.6! Erro ao inicializar o OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 O teu GPU pode não suportar OpenGL 4.6, ou não tem os drivers gráficos mais recentes. - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Sua GPU pode não suportar uma ou mais extensões necessárias do OpenGL. Verifique se você possui a última versão dos drivers gráficos.<br><br>Renderizador GL:<br>%1<br><br>Extensões não suportadas:<br>%2 - + This build doesn't have OpenGL support. @@ -6789,42 +6898,42 @@ Debug Message: Restaurar tamanho da janela para 1080p - + &Multiplayer &Multijogador - + &Tools &Ferramentas - + Am&iibo - + Launch &Applet - + &TAS &TAS - + &Create Home Menu Shortcut - + Install &Firmware - + &Help &Ajuda @@ -6850,7 +6959,7 @@ Debug Message: - + &Pause &Pausa @@ -6951,900 +7060,900 @@ Debug Message: - Open &Quickstart Guide - Abrir &guia de início rápido + &User Handbook + - - &FAQ - &Perguntas frequentes - - - + &Capture Screenshot &Captura de Tela - + &Album - + &Set Nickname and Owner &Definir apelido e proprietário - + &Delete Game Data &Remover dados do jogo - + &Restore Amiibo &Recuperar Amiibo - + &Format Amiibo &Formatar Amiibo - + &Mii Editor - + &Configure TAS... &Configurar TAS - + Configure C&urrent Game... Configurar jogo atual... - - + + &Start &Começar - + &Reset &Restaurar - - + + R&ecord G&ravar - + Open &Controller Menu Menu Abrir &Controles - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7852,74 +7961,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9106,275 +9215,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 3c80f8ee9d..9488e6f43b 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -592,12 +592,12 @@ SMAA обеспечивает лучшее качество. FXAA может давать более стабильное изображение на низком разрешении. - + Fullscreen Mode: Полноэкранный режим: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -606,12 +606,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp Эксклюзивный полноэкранный режим может иметь лучшую производительность и лучшую поддержку Freesync/G-Sync. - + Aspect Ratio: Соотношение сторон: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -620,35 +620,35 @@ Also controls the aspect ratio of captured screenshots. Также управляет соотношением сторон скриншотов. - + Use persistent pipeline cache Использовать постоянный кэш конвейера - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Позволяет сохранять шейдеры на диск для более быстрой загрузки при последующем запуске игры. Отключение этой функции предназначено только для отладки. - + Use asynchronous GPU emulation Использовать асинхронную эмуляцию GPU - + Uses an extra CPU thread for rendering. This option should always remain enabled. Использует дополнительный поток CPU для рендеринга. Эта опция всегда должна оставаться включенной. - + NVDEC emulation: Эмуляция NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -657,12 +657,12 @@ In most cases, GPU decoding provides the best performance. В большинстве случаев декодирование с использованием ГП обеспечивает лучшую производительность. - + ASTC Decoding Method: Метод декодирования ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -674,12 +674,12 @@ GPU: использовать вычислительные шейдеры ГП Асинхронный CPU: использовать ЦП для декодирования текстур ASTC по мере необходимости. Устраняет фризы при декодировании ASTC, но может вызывать артефакты. - + ASTC Recompression Method: Метод пересжатия ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -687,44 +687,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3: промежуточный формат будет перекодирован в BC1 или BC3, экономя видеопамять, но снижая качество изображения. - + Frame Pacing Mode (Vulkan only) Режим стабилизации кадров (только Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. Определяет способ управления выводом кадров для уменьшения подергиваний и повышения плавности и стабильности частоты кадров. - + VRAM Usage Mode: Режим VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Определяет, должен ли эмулятор экономить память или использовать всю доступную видеопамять для повышения производительности. Агрессивный режим может негативно сказаться на производительности других приложений, например программ записи. - + Skip CPU Inner Invalidation Пропуск внутренней инвалидизации CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Пропускает некоторые операции сброса кэша при обновлении памяти, снижая нагрузку на ЦП и уменьшая задержку. Может вызывать сбои в работе игр. - + VSync Mode: Режим VSync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -735,12 +735,12 @@ Mailbox может обеспечивать меньшую задержку, ч Immediate (без синхронизации) выводит все доступные кадры и может иметь разрывы. - + Sync Memory Operations Синхронизация операций памяти - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -749,56 +749,56 @@ Unreal Engine 4 games often see the most significant changes thereof. Игры на Unreal Engine 4 чаще всего демонстрируют заметные изменения. - + Enable asynchronous presentation (Vulkan only) Включить асинхронный вывод (только Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Немного повышает производительность, перенося вывод кадра в отдельный поток CPU. - + Force maximum clocks (Vulkan only) Принудительно зафиксировать максимальную тактовую частоту (только для Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Выполняет фоновые операции во время ожидания графических команд, предотвращая снижение тактовой частоты GPU. - + Anisotropic Filtering: Анизотропная фильтрация: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Управляет качеством отображения текстур под наклонными углами. На большинстве GPU безопасно использовать значение 16x. - + GPU Mode: Режим GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. Управляет режимом эмуляции ГПУ. Большинство игр нормально отображаются в режиме Быстрый, но для некоторых требуется режим Точный. Частицы обычно корректно отображаются только в режиме Точный. - + DMA Accuracy: Точность DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -807,12 +807,12 @@ Default follows the GPU Accuracy setting. По умолчанию соответствует настройке точности ГПУ. - + GPU Fence Behavior: Поведение барьеров ГПУ: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -827,56 +827,56 @@ Default follows the GPU Accuracy setting. По умолчанию соответствует настройке точности ГПУ. - + Enable GPU buffer readback Включить обратное чтение буфера ГПУ - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. Сохраняет измененные ГПУ данные путем чтения их обратно перед выгрузками. Некоторые игры требуют этого, чтобы рендерить определенные эффекты правильно. - + Enable asynchronous shader compilation Включить асинхронную компиляцию шейдеров - + May reduce shader stutter. Может уменьшить фризы, вызванные компиляцией шейдеров. - + GPU Clocks Частоты GPU - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. Заставляет игру думать, что GPU завершает свою работу быстрее, чем на самом деле, чтобы она перестала подстраиваться под частоты Switch, понижать разрешение и дальность прорисовки. - + GPU Unswizzle GPU-десвиззлинг (GPU Unswizzle) - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Ускоряет декодирование 3D-текстур BCn с использованием вычислений GPU. Отключите при возникновении сбоев или графических артефактов. - + GPU Unswizzle Max Texture Size Максимальный размер текстур для GPU-десвиззлинга - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -885,48 +885,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size Размер потока GPU-десвиззлинга - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Задает максимальный объем данных текстур (в МиБ), обрабатываемый за кадр. Более высокие значения могут уменьшить подергивания при загрузке текстур, но это может повлиять на стабильность кадров. - + GPU Unswizzle Chunk Size Размер блока GPU-десвиззлинга - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Определяет количество слоев глубины, обрабатываемых за один вызов. Увеличение этого значения может повысить пропускную способность на производительных GPU, но на слабом оборудовании способно вызвать TDR или тайм-ауты драйвера. - + Use Vulkan pipeline cache Использовать кэш конвейеров Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Включает кэш конвейеров, зависящий от производителя GPU. Эта опция может значительно ускорить загрузку шейдеров в тех случаях, когда драйвер Vulkan не сохраняет такие файлы кэша внутри себя. - + Enable Compute Pipelines (Intel Vulkan Only) Включить вычислительные конвейеры (только для Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -935,194 +935,194 @@ Compute pipelines are always enabled on all other drivers. На остальных драйверах вычислительные конвейеры всегда включены. - + Enable Reactive Flushing Включить реактивный сброс - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Использует реактивный сброс (Reactive Flushing) вместо прогнозирующего, обеспечивая более точную синхронизацию памяти. - + Sync to framerate of video playback Синхронизировать с частотой кадров видео - + Run the game at normal speed during video playback, even when the framerate is unlocked. Поддерживать нормальную скорость игры во время воспроизведения видео, даже если частота кадров разблокирована. - + Barrier feedback loops Циклы обратной связи барьеров - + Improves rendering of transparency effects in specific games. Улучшает отрисовку эффектов прозрачности в некоторых играх. - + Enable buffer history Включить историю буфера - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Предоставляет доступ к предыдущим состояниям буфера. В некоторых играх может повысить качество рендеринга и стабильность производительности. - + Fix bloom effects Исправить эффекты bloom - + Removes bloom in Burnout. Удаляет эффект bloom в игре Burnout. - + Enable Legacy Rescale Pass Включить устаревший режим масштабирования - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Может исправить проблемы масштабирования в некоторых играх, используя поведение предыдущей реализации. Это обходное решение устраняет артефакты линий на GPU AMD и Intel, а также мерцание серых текстур на GPU Nvidia в Luigis Mansion 3. - + Extended Dynamic State Расширенное динамическое состояние (Extended Dynamic State) - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Определяет количество функций, доступных в Extended Dynamic State. Более высокие значения позволяют использовать больше функций и иногда повышают производительность, но могут вызвать дополнительные графические проблемы. - + Vertex Input Dynamic State Динамическое состояние ввода вершин (Vertex Input Dynamic State) - + Enables vertex input dynamic state feature for better quality and performance. Включает функцию динамического состояния ввода вершин для улучшения качества и производительности. - + Sample Shading Множественное затенение (Sample Shading) - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Позволяет фрагментному шейдеру выполняться для каждого сэмпла в мультисемплированном фрагменте вместо одного раза. Повышает качество графики за счет снижения производительности. Более высокие значения повышают качество, но сильнее снижают производительность. - + RNG Seed Сид RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Задает начальное значение генератора случайных чисел. В основном используется для спидранов. - + Device Name Название устройства - + The name of the console. Имя консоли. - + Homebrew Args Аргументы Homebrew - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Аргументы командной строки при запуске homebrew (например, -noglsl). - + Custom RTC Date: Пользовательская RTC-дата: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Позволяет изменить системные часы консоли. Может использоваться для изменения времени в играх. - + The number of seconds from the current unix time Количество секунд от текущего UNIX-времени. - + Language: Язык: - + This option can be overridden when region setting is auto-select Эта настройка может быть переопределена при автоматическом выборе региона. - + Region: Регион: - + The region of the console. Регион консоли. - + Time Zone: Часовой пояс: - + The time zone of the console. Часовой пояс консоли. - + Sound Output Mode: Режим вывода звука: - + Console Mode: Консольный режим: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1131,1042 +1131,1042 @@ Setting to Handheld can help improve performance for low end systems. Установка в портативный режим может повысить производительность на слабых системах. - + Prompt for user profile on boot Запрашивать профиль пользователя при запуске игры - + Useful if multiple people use the same PC. Полезно, если одним ПК пользуются несколько человек. - + Pause when not in focus Приостанавливать, если окно не активно - + Pauses emulation when focusing on other windows. Приостанавливает эмуляцию при переключении на другие окна. - + Confirm before stopping emulation Запрашивать подтверждение перед остановкой эмуляции - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Убирает запросы на подтверждение остановки эмуляции. При включении этой настройки эмуляция завершается сразу, без подтверждения. - + Hide mouse on inactivity Скрывать курсор при бездействии - + Hides the mouse after 2.5s of inactivity. Скрывает курсор мыши после 2,5 секунд бездействия. - + Disable controller applet Отключить апплет контроллера - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Принудительно отключает использование апплета контроллера в эмулируемых программах. При попытке открыть апплет он сразу закрывается. - + Check for updates Проверять обновления - + Whether or not to check for updates upon startup. Проверять обновления при запуске. - + Enable Gamemode Включить режим игры - + Force X11 as Graphics Backend Принудительно использовать X11 как графический бэкенд - + Custom frontend Собственный интерфейс эмулятора - + Real applet Приложение из прошивки - + Never Никогда - + On Load При загрузке - + Always Всегда - + CPU CPU - + GPU GPU - + CPU Asynchronous Асинхронный CPU - + Uncompressed (Best quality) Без сжатия (наилучшее качество) - + BC1 (Low quality) BC1 (низкое качество) - + BC3 (Medium quality) BC3 (среднее качество) - - + + Auto Авто - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Консервативный - + Aggressive Агрессивный - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (ассемблерные шейдеры, только для NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (экспериментальный, только для AMD/Mesa) - + Null Null - + Fast Производительность - - - + + + Accurate Точность - - - + + + Default По умолчанию - + Unsafe (fast) Небезопасно (быстро) - + Safe (stable) Безопасно (стабильно) - + Immediate Мгновенный - + Balanced Баланс - + Strict Строгий - + Unsafe Небезопасно - + Paranoid (disables most optimizations) Параноик (отключает большинство оптимизаций) - + Debugging Отладка - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Безрамочный режим - + Exclusive Fullscreen Эксклюзивный полноэкранный - + No Video Output Отсутствие видеовыхода - + CPU Video Decoding Декодирование видео на CPU - + GPU Video Decoding (Default) Декодирование видео на GPU (По умолчанию) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [Экспериментально] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [Экспериментально] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [Экспериментально] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [ЭКПЕРИМЕНТАЛЬНО] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [Экспериментально] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Ближайший сосед (Nearest Neighbor) - + Bilinear Билинейный - + Bicubic Бикубический - + Gaussian По Гауссу - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX™️ Super Resolution - + Area Область (Area) - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Никакой - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Стандартное (16:9) - + Force 4:3 Принудительно 4:3 - + Force 21:9 Принудительно 21:9 - + Force 16:10 Принудительно 16:10 - + Stretch to Window Растянуть до окна - + Automatic Автоматически - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Японский (日本語) - + American English Американский английский - + French (français) Французский (français) - + German (Deutsch) Немецкий (Deutsch) - + Italian (italiano) Итальянский (italiano) - + Spanish (español) Испанский (español) - + Chinese Китайский - + Korean (한국어) Корейский (한국어) - + Dutch (Nederlands) Голландский (Nederlands) - + Portuguese (português) Португальский (português) - + Russian (Русский) Русский - + Taiwanese Тайваньский - + British English Британский английский - + Canadian French Канадский французский - + Latin American Spanish Латиноамериканский испанский - + Simplified Chinese Упрощённый китайский - + Traditional Chinese (正體中文) Традиционный китайский (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильский португальский (português do Brasil) - + Polish (polska) Польский (polska) - + Thai (แบบไทย) Тайский (แบบไทย) - - + + Japan Япония - + USA США - + Europe Европа - + Australia Австралия - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Авто (%1) - + Default (%1) Default time zone По умолчанию (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Египет - + Eire Эйре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Эйре - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвич - + Hongkong Гонконг - + HST HST - + Iceland Исландия - + Iran Иран - + Israel Израиль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Ливия - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польша - + Portugal Португалия - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сингапур - + Turkey Турция - + UCT UCT - + Universal Универсальный - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулу - + Mono Моно - + Stereo Стерео - + Surround Объемный звук - + 4GB DRAM (Default) 4 ГБ ОЗУ (По умолчанию) - + 6GB DRAM (Unsafe) 6 ГБ ОЗУ (Небезопасно) - + 8GB DRAM 8 ГБ ОЗУ - + 10GB DRAM (Unsafe) 10 ГБ ОЗУ (Небезопасно) - + 12GB DRAM (Unsafe) 12 ГБ ОЗУ (Небезопасно) - + Docked В док-станции - + Handheld Портативный - - + + Normal Нормальная - - + + Boost Ускоренная - - + + Overclock Разгон - + Always ask (Default) Всегда спрашивать (По умолчанию) - + Only if game specifies not to stop Только если игра указывает не останавливать - + Never ask Никогда не спрашивать - + Very Small (16 MB) Очень маленький (16 МБ) - + Small (32 MB) Маленький (32 МБ) - + Normal (128 MB) Нормальный (128 МБ) - + Large (256 MB) Большой (256 МБ) - + Very Large (512 MB) Очень большой (512 МБ) - + Very Low (4 MB) Очень низкий (4 МБ) - + Low (8 MB) Низкий (8 МБ) - + Normal (16 MB) Нормальный (16 МБ) - + Medium (32 MB) Средний (32 МБ) - + High (64 MB) Высокий (64 МБ) - + Very Low (32) Очень низкий (32) - + Low (64) Низкий (64) - + Normal (128) Нормальный (128) - + Medium (256) Средний (256) - + High (512) Высокий (512) - + Disabled Отключено - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View Древовидный - + Grid View Сетчатый @@ -4923,6 +4923,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t &Открыть в файловом менеджере + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -6010,50 +6119,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL не доступен! - + OpenGL shared contexts are not supported. Общие контексты OpenGL не поддерживаются. - + Eden has not been compiled with OpenGL support. Eden не был скомпилирован с поддержкой OpenGL. - - - + + + Error while initializing OpenGL! Ошибка при инициализации OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Ваш ГП может не поддерживать OpenGL, или у вас установлен устаревший графический драйвер. - + Error while initializing OpenGL 4.6! Ошибка при инициализации OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Ваш ГП может не поддерживать OpenGL 4.6, или у вас установлен устаревший графический драйвер.<br><br>Рендерер GL:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Ваш ГП может не поддерживать одно или несколько требуемых расширений OpenGL. Пожалуйста, убедитесь в том, что у вас установлен последний графический драйвер.<br><br>Рендерер GL:<br>%1<br><br>Неподдерживаемые расширения:<br>%2 - + This build doesn't have OpenGL support. В этой сборке отсутствует поддержка OpenGL. @@ -6875,42 +6984,42 @@ Debug Message: Сбросить размер окна до 1080p - + &Multiplayer &Мультиплеер - + &Tools &Инструменты - + Am&iibo Amiibo - + Launch &Applet &Апплеты - + &TAS &TAS - + &Create Home Menu Shortcut Создать &ярлык Home Menu - + Install &Firmware Установить &прошивку - + &Help &Помощь @@ -6936,7 +7045,7 @@ Debug Message: - + &Pause &Пауза @@ -7037,578 +7146,578 @@ Debug Message: - Open &Quickstart Guide - Открыть руководство &пользователя + &User Handbook + - - &FAQ - &FAQ - - - + &Capture Screenshot &Сделать скриншот - + &Album Открыть &Альбом - + &Set Nickname and Owner Установить &никнейм и владельца - + &Delete Game Data &Удалить данные игры - + &Restore Amiibo &Восстановить Amiibo - + &Format Amiibo &Форматировать Amiibo - + &Mii Editor Открыт&ь Mii Editor - + &Configure TAS... &Настройка TAS... - + Configure C&urrent Game... &Настроить текущую игру... - - + + &Start &Запустить - + &Reset &Сбросить - - + + R&ecord З&апись - + Open &Controller Menu Открыть &Меню контроллеров - + Install Decryption &Keys &Установить ключи дешифровки - + &Home Menu Отк&рыть Home Menu - + &Desktop &Рабочий стол - + &Application Menu &Меню приложений - + &Root Data Folder &Корневая папка - + &NAND Folder П&апка NAND - + &SDMC Folder Па&пка SDMC - + &Mod Folder Папка &модов - + &Log Folder Папка &журнала - + From Folder Из &папки - + From ZIP &Из ZIP - + &Eden Dependencies &Зависимости Eden - + &Data Manager Упра&вление данными - + &Tree View &Древовидный - + &Grid View &Сетчатый - + Game Icon Size Размер иконки игры - - + + None Никакой - + Show Game &Name Показать игру - + Show &Performance Overlay &Оверлей производительности + + + Post-Processing &Shaders... + + &Carousel View &В Виде Карусели - + Small (32x32) Маленький (32х32) - + Standard (64x64) Стандартный (64х64) - + Large (128x128) Большой (128х128) - + Full Size (256x256) Полноразмерный (256х256) - + Broken Vulkan Installation Detected Обнаружена поврежденная установка Vulkan - + Vulkan initialization failed during boot. Не удалось выполнить инициализацию Vulkan во время загрузки. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Запущена игра - + Loading Web Applet... Загрузка веб-апплета... - + Disable Web Applet Отключить веб-апплет - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Отключение веб-апплета может привести к неожиданному поведению и должно использоваться только, если вы хотите запустить Super Mario 3D All-Stars. Вы уверены, что хотите отключить веб-апплет? (Его можно снова включить в настройках отладки.) - + The amount of shaders currently being built Количество создаваемых шейдеров на данный момент - + The current selected resolution scaling multiplier. Текущий выбранный множитель масштабирования разрешения. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Текущая скорость эмуляции. Значения выше или ниже 100% указывают на то, что эмуляция идет быстрее или медленнее, чем на Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Количество кадров в секунду в данный момент. Значение будет различаться между играми и сценами. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Время, которое нужно для эмуляции одного кадра Switch, не принимая во внимание ограничение FPS или вертикальную синхронизацию. Для эмуляции в полной скорости значение должно быть не больше 16,67 мс. - + Unmute Включить звук - + Mute Выключить звук - + Reset Volume Сбросить громкость - + &Clear Recent Files &Очистить недавние файлы - + &Continue &Продолжить - + Warning: Outdated Game Format Предупреждение: устаревший формат игры - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Для этой игры вы используете разархивированный формат ROM'а, который является устаревшим и был заменен другими, такими как NCA, NAX, XCI или NSP. В разархивированных каталогах ROM'а отсутствуют иконки, метаданные и поддержка обновлений.<br><br>Для получения информации о различных форматах Switch, поддерживаемых Eden, ознакомьтесь с руководством пользователя. Это сообщение больше не будет отображаться. - - + + Error while loading ROM! Ошибка при загрузке ROM'а! - + The ROM format is not supported. Формат ROM'а не поддерживается. - + An error occurred initializing the video core. Произошла ошибка при инициализации видеоядра. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - Eden столкнулся с ошибкой при работе видеоядра. Обычно это вызвано устаревшими драйверами GPU, включая интегрированные. Проверьте журнал для получения подробностей. Информацию о том, как получить доступ к журналу, см. на странице: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>Как загрузить файл журнала</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. + - + Error while loading ROM! %1 %1 signifies a numeric error code. Ошибка при загрузке ROM'а! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Пожалуйста, пересоздайте дампы ваших файлов или обратитесь за помощью в Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Произошла неизвестная ошибка. Пожалуйста, проверьте журнал для подробностей. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Закрываем программу... - + Save Data Сохранения - + Mod Data Данные модов - + Error Opening %1 Folder Ошибка при открытии папки %1 - - + + Folder does not exist! Папка не существует! - + Remove Installed Game Contents? Удалить установленное содержимое игр? - + Remove Installed Game Update? Удалить установленное обновление игры? - + Remove Installed Game DLC? Удалить установленные DLC игры? - + Remove Entry Удалить запись - + Delete OpenGL Transferable Shader Cache? Удалить переносной кэш шейдеров OpenGL? - + Delete Vulkan Transferable Shader Cache? Удалить переносной кэш шейдеров Vulkan? - + Delete All Transferable Shader Caches? Удалить весь переносной кэш шейдеров? - + Remove Custom Game Configuration? Удалить пользовательскую настройку игры? - + Remove Cache Storage? Удалить кэш-хранилище? - + Remove File Удалить файл - + Remove Play Time Data Удалить данные игрового времени - + Reset play time? Сбросить время игры? - - + + RomFS Extraction Failed! Не удалось извлечь RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Произошла ошибка при копировании файлов RomFS или пользователь отменил операцию. - + Full Полный - + Skeleton Скелет - + Select RomFS Dump Mode Выберите режим дампа RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Пожалуйста, выберите, как вы хотите выполнить дамп RomFS. <br>Полный скопирует все файлы в новую папку, в то время как <br>скелет создаст только структуру папок. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root В %1 недостаточно свободного места для извлечения RomFS. Пожалуйста, освободите место или выберите другую папку для дампа в Эмуляция > Параметры > Система > Файловая система > Корень дампа - + Extracting RomFS... Извлечение RomFS... - - + + Cancel Отмена - + RomFS Extraction Succeeded! Извлечение RomFS прошло успешно! - + The operation completed successfully. Операция выполнена успешно. - + Error Opening %1 Ошибка при открытии %1 - + Select Directory Выбрать папку - + Properties Свойства - + The game properties could not be loaded. Не удалось загрузить свойства игры. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Исполняемый файл Switch (%1);;Все файлы (*.*) - + Load File Загрузить файл - + Open Extracted ROM Directory Открыть папку извлеченного ROM'а - + Invalid Directory Selected Выбрана недопустимая папка - + The directory you have selected does not contain a 'main' file. Папка, которую вы выбрали, не содержит файла 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Устанавливаемый файл Switch (*.nca *.nsp *.xci);;Архив контента Nintendo (*.nca);;Пакет подачи Nintendo (*.nsp);;Образ картриджа NX (*.xci) - + Install Files Установить файлы - + %n file(s) remaining %n файл(ов) осталось%n файл(ов) осталось%n файл(ов) осталось%n файл(ов) осталось - + Installing file "%1"... Установка "%1"... - - + + Install Results Результаты - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Чтобы избежать возможных конфликтов, мы не рекомендуем пользователям устанавливать игры в NAND. Пожалуйста, используйте эту функцию только для установки обновлений и DLC. - + %n file(s) were newly installed %n файл(ов) были установлены недавно @@ -7618,7 +7727,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten %n файл(ов) были перезаписаны @@ -7628,7 +7737,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install %n файл(ов) не удалось установить @@ -7638,314 +7747,314 @@ Please, only use this feature to install updates and DLC. - + System Application Системное приложение - + System Archive Системный архив - + System Application Update Обновление системного приложения - + Firmware Package (Type A) Пакет прошивки (Тип А) - + Firmware Package (Type B) Пакет прошивки (Тип Б) - + Game Игра - + Game Update Обновление игры - + Game DLC DLC игры - + Delta Title Дельта-титул - + Select NCA Install Type... Выберите тип установки NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Пожалуйста, выберите тип приложения, который вы хотите установить для этого NCA: (В большинстве случаев, подходит стандартный выбор «Игра».) - + Failed to Install Ошибка установки - + The title type you selected for the NCA is invalid. Тип приложения, который вы выбрали для NCA, недействителен. - + File not found Файл не найден - + File "%1" not found Файл "%1" не найден - + OK ОК - + Function Disabled Функция отключена - + Compatibility list reporting is currently disabled. Check back later! Отправка отчетов о совместимости временно отключена. Доступ будет восстановлен позднее! - + Error opening URL Ошибка при открытии URL - + Unable to open the URL "%1". Не удалось открыть URL: "%1". - + TAS Recording Запись TAS - + Overwrite file of player 1? Перезаписать файл игрока 1? - + Invalid config detected Обнаружена недопустимая конфигурация - + Handheld controller can't be used on docked mode. Pro controller will be selected. Портативный контроллер не может быть использован в режиме док-станции. Будет выбран контроллер Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Текущий amiibo был удален - + Error Ошибка - - + + The current game is not looking for amiibos Текущая игра не ищет amiibo - + Amiibo File (%1);; All Files (*.*) Файл Amiibo (%1);; Все Файлы (*.*) - + Load Amiibo Загрузить Amiibo - + Error loading Amiibo data Ошибка загрузки данных Amiibo - + The selected file is not a valid amiibo Выбранный файл не является допустимым amiibo - + The selected file is already on use Выбранный файл уже используется - + An unknown error occurred Произошла неизвестная ошибка - + No firmware available Прошивка недоступна - + Firmware Corrupted Прошивка повреждена - + Unknown applet Неизвестный апплет - + Applet doesn't map to a known value. Апплет не соответствует ни одному известному значению. - + Record not found Запись не найдена - + Applet not found. Please reinstall firmware. Апплет не найден. Пожалуйста, переустановите прошивку. - + Capture Screenshot Сделать скриншот - + PNG Image (*.png) Изображение PNG (*.png) - + TAS state: Running %1/%2 Состояние TAS: Выполняется %1/%2 - + TAS state: Recording %1 Состояние TAS: Записывается %1 - + TAS state: Idle %1/%2 Состояние TAS: Простой %1/%2 - + TAS State: Invalid Состояние TAS: Неверное - + &Stop Running &Остановка - + Stop R&ecording &Закончить запись - + Building: %n shader(s) Компиляция %n шейдер(ов)Компиляция %n шейдер(ов)Компиляция %n шейдер(ов)Компиляция %n шейдер(ов) - + Scale: %1x %1 is the resolution scaling factor Масштаб: %1x - + Speed: %1% / %2% Скорость: %1% / %2% - + Speed: %1% Скорость: %1% - + Game: %1 FPS Игра: %1 FPS - + Frame: %1 ms Кадр: %1 мс - + NO AA БЕЗ СГЛАЖИВАНИЯ - + VOLUME: MUTE ГРОМКОСТЬ: ЗАГЛУШЕНА - + VOLUME: %1% Volume percentage (e.g. 50%) ГРОМКОСТЬ: %1% - + Derivation Components Missing Отсутствуют необходимые компоненты - + Decryption keys are missing. Install them now? Ключи дешифрования отсутствуют. Хотите установить их? - + Wayland Detected! Обнаружен Wayland! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7956,74 +8065,74 @@ Would you like to force it for future launches? Хотите включить X11 для последующих запусков? - + Use X11 Использовать X11 - + Continue with Wayland Продолжить с Wayland - + Don't show again Больше не показывать - + Restart Required Требуется перезапуск - + Restart Eden to apply the X11 backend. Перезапустите Eden, чтобы применить X11. - + Slow Замедлено - + Turbo Турбо - + Unlocked Разблокировано - + Select RomFS Dump Target Выбор цели для дампа RomFS - + Please select which RomFS you would like to dump. Выберите RomFS, который вы хотите извлечь. - + Are you sure you want to close Eden? Вы уверены, что хотите закрыть Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Вы уверены, что хотите остановить эмуляцию? Любой несохраненный прогресс будет потерян. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9225,41 +9334,41 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. - Игра, которую вы пытаетесь запустить, требует прошивку для запуска или прохождения начального меню. Пожалуйста, <a href='https://yuzu-mirror.github.io/help/quickstart'>сделайте дамп и установите прошивку</a>, или нажмите «OK», чтобы запустить игру в любом случае. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. + - + Installing Firmware... Установка прошивки... - - - - - + + + + + Cancel Отмена - + Firmware Install Failed Не удалось установить прошивку - + Firmware Install Succeeded Прошивка успешно установлена - + Firmware integrity verification failed! Сбой проверки целостности прошивки! - - + + Verification failed for the following files: %1 @@ -9268,235 +9377,235 @@ p, li { white-space: pre-wrap; } %1 - - + + Verifying integrity... Проверка целостности... - - + + Integrity verification succeeded! Проверка целостности прошла успешно! - - + + The operation completed successfully. Операция выполнена успешно. - - + + Integrity verification failed! Проверка целостности не удалась! - + File contents may be corrupt or missing. Содержимое файла может быть повреждено или отсутствовать. - + Integrity verification couldn't be performed Проверка целостности не может быть выполнена - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. Установка прошивки отменена, прошивка может быть повреждена. Содержимое файла не удалось проверить на корректность. - + Select Dumped Keys Location Выберите местоположение дампнутых ключей - + Decryption Keys install succeeded Установка ключей дешифровки прошла успешно. - + Decryption Keys install failed Ошибка установки ключей дешифровки - + Orphaned Profiles Detected! Обнаружены «сиротские» профили! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> МОГУТ ПРОИЗОЙТИ НЕПРЕДВИДЕННЫЕ ПРОБЛЕМЫ, ЕСЛИ ВЫ НЕ ПРОЧИТАЕТЕ ЭТО!<br>Eden обнаружил следующие папки сохранений без привязанного профиля:<br>%1<br><br>Найдены следующие корректные профили:<br>%2<br><br>Нажмите «OK», чтобы открыть папку сохранений и исправить профили.<br>Совет: скопируйте содержимое самой большой или последней измененной папки в другое место, удалите все «сиротские» профили и переместите скопированные данные в правильный профиль.<br><br>Если есть вопросы, прочитайте <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>справку</a>.<br> - + Really clear data? Действительно очистить данные? - + Important data may be lost! Важные данные могут быть потеряны! - + Are you REALLY sure? Вы уверены? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. Данные будут безвозвратно потеряны после удаления! Делайте это только если вы абсолютно уверены, что хотите их удалить. - + Clearing... Очистка... - + Select Export Location Выберите папку для экспорта - + %1.zip %1.zip - - - + + + Zipped Archives (*.zip) Архивы ZIP (*.zip) - + Exporting data. This may take a while... Идет экспорт данных. Это может занять некоторое время... - + Exporting Экспорт - + Exported Successfully Экспорт выполнен успешно - + Data was exported successfully. Данные успешно экспортированы. - + Export Cancelled Экспорт отменен - + Export was cancelled by the user. Экспорт был отменен пользователем. - + Export Failed Не удалось экспортировать - + Ensure you have write permissions on the targeted directory and try again. Проверьте, есть ли права на запись в выбранную папку, и повторите попытку. - + Select Import Location Выберите папку для импорта - + Import Warning Предупреждение при импорте - + All previous data in this directory will be deleted. Are you sure you wish to proceed? Все существующие данные в этой папке будут удалены. Вы уверены, что хотите продолжить? - + Importing data. This may take a while... Идет импорт данных. Это может занять некоторое время... - + Importing Импорт - + Imported Successfully Импорт успешно выполнен - + Data was imported successfully. Данные успешно импортированы. - + Import Cancelled Импорт отменен - + Import was cancelled by the user. Импорт был отменен пользователем. - + Import Failed Не удалось импортировать - + Ensure you have read permissions on the targeted directory and try again. Проверьте, есть ли права на чтение в выбранной папке, и повторите попытку. - + Keys not installed Ключи не установлены - + Install decryption keys and restart Eden before attempting to install firmware. Установите ключи дешифрования и перезапустите Eden перед установкой прошивки. - + Select Dumped Firmware Source Location Выберите дамп распакованной прошивки - + Select Dumped Firmware ZIP Выберите дамп прошивки в ZIP-архиве - + Firmware cleanup failed Не удалось очистить прошивку - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index 089601486d..d916eb4d86 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -594,12 +594,12 @@ SMAA erbjuder den bästa kvaliteten. FXAA kan ge en stabilare bild i lägre upplösningar. - + Fullscreen Mode: Helskärmsläge: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -608,12 +608,12 @@ Borderless ger bäst kompatibilitet med skärmtangentbordet som vissa spel kräv Exklusiv helskärm kan ge bättre prestanda och bättre stöd för Freesync/Gsync. - + Aspect Ratio: Bildförhållande: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -622,36 +622,36 @@ De flesta spel stöder endast 16:9, så modifieringar krävs för att få andra Kontrollerar även bildförhållandet för tagna skärmdumpar. - + Use persistent pipeline cache Använd permanent pipeline-cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Gör det möjligt att spara shaders i lagringsutrymmet för snabbare laddning vid nästa spelstart. Att inaktivera detta är endast avsett för felsökning. - + Use asynchronous GPU emulation Använd asynkron GPU-emulering - + Uses an extra CPU thread for rendering. This option should always remain enabled. Använder en extra CPU-tråd för rendering. Detta alternativ bör alltid vara aktiverat. - + NVDEC emulation: NVDEC-emulering: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -660,12 +660,12 @@ Den kan antingen använda CPU eller GPU för avkodning, eller inte utföra någo I de flesta fall ger GPU-avkodning bäst prestanda. - + ASTC Decoding Method: ASTC-avkodningsmetod: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -678,12 +678,12 @@ CPU asynkront: Använd CPU:n för att avkoda ASTC-texturer vid behov. Eliminerar men kan ge artefakter. - + ASTC Recompression Method: ASTC-återkomprimeringsmetod: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -692,44 +692,44 @@ BC1/BC3: Det mellanliggande formatet kommer att komprimeras om till BC1- eller B vilket sparar VRAM men försämrar bildkvaliteten. - + Frame Pacing Mode (Vulkan only) Frame Pacing Mode (endast Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. Styr hur emulatorn hanterar bildhastigheten för att minska hackighet och göra bildfrekvensen jämnare och mer konsekvent. - + VRAM Usage Mode: VRAM-användningsläge: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Väljer om emulatorn ska prioritera att spara minne eller utnyttja tillgängligt videominne maximalt för prestanda. Aggressivt läge kan påverka prestandan hos andra program, till exempel inspelningsprogram. - + Skip CPU Inner Invalidation Hoppa över CPU:ns interna ogiltigförklaring - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Hoppar över vissa cache-ogiltigförklaringar under minnesuppdateringar, vilket minskar CPU-användningen och förbättrar latensen. Detta kan orsaka mjuka krascher. - + VSync Mode: VSync-läge: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -740,12 +740,12 @@ Mailbox kan ha lägre latens än FIFO och uppvisar inte tearing, men kan tappa b Immediate (ingen synkronisering) visar allt som är tillgängligt och kan uppvisa tearing. - + Sync Memory Operations Synkronisera minnesoperationer - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -756,32 +756,32 @@ Det här alternativet åtgärdar problem i spel, men kan försämra prestandan. Unreal Engine 4-spel upplever ofta de mest betydande förändringarna av detta. - + Enable asynchronous presentation (Vulkan only) Aktivera asynkron presentation (endast Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Förbättrar prestandan något genom att flytta presentationen till en separat CPU-tråd. - + Force maximum clocks (Vulkan only) Tvinga fram maximal klockfrekvens (endast Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Körs i bakgrunden i väntan på grafikkommandon för att förhindra att GPU:n sänker sin klockhastighet. - + Anisotropic Filtering: Anisotropisk filtrering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Kontrollerar kvaliteten på texturrendering vid sneda vinklar. @@ -789,12 +789,12 @@ Safe to set at 16x on most GPUs. Säker att ställa in på 16x på de flesta GPU:er. - + GPU Mode: GPU-läge: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -803,12 +803,12 @@ De flesta spel återges bra med Snabb, men Exakt krävs fortfarande för vissa. Partiklar återges ofta korrekt endast i läget Exakt. - + DMA Accuracy: DMA-noggrannhet: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -817,12 +817,12 @@ Osäker är snabbare, medan Säker är stabilare och kan lösa problem i vissa s Standard följer inställningen för GPU-noggrannhet. - + GPU Fence Behavior: Beteende för GPU-staket: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -837,56 +837,56 @@ Strikt är långsammast, men kan lösa problem som kräver striktare synkroniser Standard följer inställningen för GPU-noggrannhet. - + Enable GPU buffer readback Aktivera återläsning av GPU-buffert - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. Bevarar data som ändrats av GPU:n genom att läsa tillbaka dem före uppladdning. Vissa spel kräver detta för att vissa effekter ska återges korrekt. - + Enable asynchronous shader compilation Aktivera asynkron shaderkompilering - + May reduce shader stutter. Kan minska shader-hackighet. - + GPU Clocks GPU-klockfrekvenser - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. Får spelet att tro att GPU-arbetet avslutas snabbare än det gör, så att det slutar sänka upplösning och ritaravstånd för att passa Switch-klockfrekvenserna. - + GPU Unswizzle GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Accelererar avkodning av BCn 3D-texturer med hjälp av GPU-beräkningar. Inaktivera om du upplever krascher eller grafiska fel. - + GPU Unswizzle Max Texture Size Maximal texturstorlek för GPU Unswizzle - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -895,48 +895,48 @@ GPU är snabbare för medelstora och stora texturer, men CPU kan vara effektivar Justera detta för att hitta balansen mellan GPU-acceleration och CPU-överbelastning. - + GPU Unswizzle Stream Size Strömstorlek för GPU Unswizzle - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Ställer in den maximala mängden texturdata (i MiB) som bearbetas per bildruta. Högre värden kan minska hackighet under texturinläsning men kan påverka bildrutans konsistens. - + GPU Unswizzle Chunk Size Chunk-storlek för GPU Unswizzle - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Bestämmer antalet djupskivor som bearbetas i en enda sändning. Att öka detta kan förbättra genomströmningen på avancerade GPU:er, men kan orsaka TDR eller drivrutinstidsgränser på svagare hårdvara. - + Use Vulkan pipeline cache Använda Vulkan pipeline-cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Aktiverar GPU-leverantörsspecifik pipeline-cache. Det här alternativet kan förbättra laddningstiden för shaders avsevärt i fall där Vulkan-drivrutinen inte lagrar pipeline-cache-filer internt. - + Enable Compute Pipelines (Intel Vulkan Only) Aktivera compute pipelines (endast Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -945,194 +945,194 @@ Denna inställning finns endast för Intels egna drivrutiner och kan orsaka kras Beräkningspipelines är alltid aktiverade på alla andra drivrutiner. - + Enable Reactive Flushing Aktivera Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Använder reaktiv rensning i stället för prediktiv rensning, vilket ger mer exakt minnessynkning. - + Sync to framerate of video playback Synkronisera med bildfrekvensen för videouppspelning - + Run the game at normal speed during video playback, even when the framerate is unlocked. Kör spelet i normal hastighet under videouppspelning, även när bildfrekvensen är upplåst. - + Barrier feedback loops Återkopplingsloopar för barriärer - + Improves rendering of transparency effects in specific games. Förbättrar renderingen av transparenseffekter i vissa spel. - + Enable buffer history Aktivera bufferthistorik - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Aktiverar åtkomst till tidigare bufferttillstånd. Det här alternativet kan förbättra renderingskvaliteten och prestandakonsistensen i vissa spel. - + Fix bloom effects Korrigera bloom-effekter - + Removes bloom in Burnout. Tar bort bloom i Burnout. - + Enable Legacy Rescale Pass Aktivera äldre omskalningspass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Kan åtgärda skalningsproblem i vissa spel genom att förlita sig på beteendet från den tidigare implementeringen. Äldre beteende som åtgärdar linjeartefakter på AMD- och Intel-GPU:er och grå texturflimmer på Nvidia-GPU:er i Luigis Mansion 3. - + Extended Dynamic State Utökad dynamisk status - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Kontrollerar antalet funktioner som kan användas i utökat dynamiskt tillstånd. Högre tillstånd möjliggör fler funktioner och kan öka prestandan, men kan orsaka ytterligare grafiska problem. - + Vertex Input Dynamic State Dynamiskt tillstånd för vertexinmatning - + Enables vertex input dynamic state feature for better quality and performance. Aktiverar funktionen för dynamiskt tillstånd för vertexinmatning för bättre kvalitet och prestanda. - + Sample Shading Provskuggning - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Tillåter fragment-shadern att exekveras per prov i ett multisamplade fragment istället för en gång per fragment. Förbättrar grafikens kvalitet på bekostnad av prestanda. Högre värden förbättrar kvaliteten men försämrar prestandan. - + RNG Seed RNG-frö - + Controls the seed of the random number generator. Mainly used for speedrunning. Att kontrollera fröet till slumptalsgeneratorn. Används främst för speedrunning. - + Device Name Enhetsnamn - + The name of the console. Konsolens namn. - + Homebrew Args Homebrew-argument - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Kommandoradsargument som skickas till homebrew vid start (t.ex. -noglsl). - + Custom RTC Date: Anpassat RTC-datum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Med det här alternativet kan du ändra klockan på konsolen. Kan användas för att manipulera tiden i spel. - + The number of seconds from the current unix time Antalet sekunder från aktuell Unix-tid - + Language: Språk: - + This option can be overridden when region setting is auto-select Det här alternativet kan åsidosättas när regioninställningen är automatiskt vald. - + Region: Region: - + The region of the console. Konsolens region. - + Time Zone: Tidszon: - + The time zone of the console. Konsolens tidszon. - + Sound Output Mode: Ljudutmatningsläge: - + Console Mode: Konsolläge: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1141,1042 +1141,1042 @@ Spel ändrar upplösning, detaljer och stödda kontroller beroende på denna ins Inställningen Handhållen kan förbättra prestandan för enklare system. - + Prompt for user profile on boot Fråga efter användarprofil vid uppstart - + Useful if multiple people use the same PC. Användbart om flera personer använder samma dator. - + Pause when not in focus Pausa när inte i fokus - + Pauses emulation when focusing on other windows. Pausar emulering när fokus är på andra fönster. - + Confirm before stopping emulation Bekräfta innan emuleringen stoppas - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Åsidosätter frågor om att bekräfta att emuleringen ska avslutas. Om du aktiverar den hoppar du över sådana uppmaningar och avslutar emuleringen direkt. - + Hide mouse on inactivity Dölj musen vid inaktivitet - + Hides the mouse after 2.5s of inactivity. Döljer musen efter 2,5 sekunders inaktivitet. - + Disable controller applet Inaktivera kontroller-appleten - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Inaktiverar med tvång användningen av kontrollerappletten i emulerade program. När ett program försöker öppna kontrollerappletten stängs den omedelbart. - + Check for updates Leta efter uppdateringar - + Whether or not to check for updates upon startup. Om uppdateringar ska sökas vid start eller inte. - + Enable Gamemode Aktivera Gamemode - + Force X11 as Graphics Backend Tvinga X11 som grafikbackend - + Custom frontend Anpassad frontend - + Real applet Verklig applet - + Never Aldrig - + On Load Vid inläsning - + Always Alltid - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU asynkron - + Uncompressed (Best quality) Okomprimerad (bästa kvalitet) - + BC1 (Low quality) BC1 (låg kvalitet) - + BC3 (Medium quality) BC3 (medelhög kvalitet) - - + + Auto Auto - + 30 FPS 30 bilder/s - + 60 FPS 60 bilder/s - + 90 FPS 90 bilder/s - + 120 FPS 120 bilder/s - + Conservative Konservativ - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembly Shaders, endast NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimentell, endast AMD/Mesa) - + Null Null - + Fast Snabb - - - + + + Accurate Exakt - - - + + + Default Standard - + Unsafe (fast) Osäker (snabb) - + Safe (stable) Säker (stabil) - + Immediate Omedelbar - + Balanced Balanserad - + Strict Strikt - + Unsafe Inte säker - + Paranoid (disables most optimizations) Paranoid (inaktiverar de flesta optimeringar) - + Debugging Felsökning - + Dynarmic Dynarmisk - + NCE NCE - + Borderless Windowed Ramlöst fönsterläge - + Exclusive Fullscreen Exklusiv helskärm - + No Video Output Ingen videoutgång - + CPU Video Decoding CPU-videoavkodning - + GPU Video Decoding (Default) GPU videoavkodning (standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTELL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTELL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Närmsta granne - + Bilinear Bilinjär - + Bicubic Bikubisk - + Gaussian Gaussisk - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Område - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tvinga 4:3 - + Force 21:9 Tvinga 21:9 - + Force 16:10 Tvinga 16:10 - + Stretch to Window Sträck ut till fönster - + Automatic Automatiskt - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japanska (日本語) - + American English Amerikansk engelska - + French (français) Franska (français) - + German (Deutsch) Tyska (Deutsch) - + Italian (italiano) Italienska (italiano) - + Spanish (español) Spanska (español) - + Chinese Kinesiska - + Korean (한국어) Koreanska (한국어) - + Dutch (Nederlands) Nederländska (Nederlands) - + Portuguese (português) Portugisiska (português) - + Russian (Русский) Ryska (Русский) - + Taiwanese Taiwanesiska - + British English Brittisk engelska - + Canadian French Kanadensisk franska - + Latin American Spanish Latinamerikansk spanska - + Simplified Chinese Förenklad kinesiska - + Traditional Chinese (正體中文) Traditionell kinesiska (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisiska (português do Brasil) - + Polish (polska) Polska (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egypten - + Eire Irland - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irland - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkiet - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET VÅT - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (osäker) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (osäker) - + 12GB DRAM (Unsafe) 12 GB DRAM (osäker) - + Docked Dockad - + Handheld Handhållen - - + + Normal Normal - - + + Boost Förstärk - - + + Overclock Överklocka - + Always ask (Default) Fråga alltid (standard) - + Only if game specifies not to stop Endast om spelet anger att det inte ska stoppas - + Never ask Fråga aldrig - + Very Small (16 MB) Mycket liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Mycket stor (512 MB) - + Very Low (4 MB) Mycket låg (4 MB) - + Low (8 MB) Låg (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medium (32 MB) - + High (64 MB) Hög (64 MB) - + Very Low (32) Mycket låg (32) - + Low (64) Låg (64) - + Normal (128) Normal (128) - + Medium (256) Medium (256) - + High (512) Hög (512) - + Disabled Inaktiverad - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View Trädvy - + Grid View Rutnätsvy @@ -4932,6 +4932,116 @@ När de har tagits bort kan de INTE återställas. Är du 100% säker på att du Ö&ppna i filhanterare + + ConfigurePostProcessing + + + Post-Processing Effects + Efterbearbetningseffekter + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + ReShade FX-effekter läses in från mappen post_shaders i Eden-datakatalogen. Ändringar tillämpas direkt medan ett spel körs. + + + + Enable post-processing + Aktivera efterbearbetning + + + + Preset: + Förinställning: + + + + Apply + Tillämpa + + + + Reset Values + Återställ värden + + + + Return every effect to the values the preset ships with. + Återställ varje effekt till de värden som förinställningen levereras med. + + + + Save As... + Spara som… + + + + Save Preset + Spara förinställning + + + + Preset name: + Förinställningsnamn: + + + + Delete + Ta bort + + + + Add Effect + Lägg till effekt + + + + Custom chain. Pick a preset above and press Apply to replace it. + Anpassad kedja. Välj en förinställning ovan och tryck på Tillämpa för att ersätta den. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + Aktiv förinställning: %1 (ändrad). Tryck på Återställ värden för att återgå till ursprungsvärdena. + + + + Active preset: %1 + Aktiv förinställning: %1 + + + + Enabled + Aktiverad + + + + Disabled + Inaktiverad + + + + Reset to defaults + Återställ standardvärden + + + + Effect '%1' was not found. + Effekten ”%1” hittades inte. + + + + Effect failed to compile: +%1 + Effekten kunde inte kompileras: +%1 + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + Inga användbara ReShade FX-effekter hittades. Placera .fx-filer i mappen post_shaders. + + ConfigureProfileManager @@ -6019,50 +6129,50 @@ Gå till Konfigurera -> System -> Nätverk och gör ett val. GRenderWindow - - + + OpenGL not available! OpenGL är inte tillgängligt! - + OpenGL shared contexts are not supported. Delade OpenGL-kontexter stöds inte. - + Eden has not been compiled with OpenGL support. Eden har inte kompilerats med OpenGL-stöd. - - - + + + Error while initializing OpenGL! Fel vid initiering av OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Din GPU kanske inte stöder OpenGL, eller så har du inte den senaste grafikdrivrutinen. - + Error while initializing OpenGL 4.6! Fel vid initiering av OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Din GPU kanske inte stöder OpenGL 4.6, eller så har du inte den senaste grafikdrivrutinen.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Din GPU kanske inte stöder ett eller flera av de nödvändiga OpenGL-tilläggen. Se till att du har den senaste grafikdrivrutinen.<br><br>GL Renderer:<br>%1<br><br>Tillägg som inte stöds:<br>%2 - + This build doesn't have OpenGL support. Den här versionen saknar stöd för OpenGL. @@ -6884,42 +6994,42 @@ Felsökningsmeddelande: Återställ fönsterstorleken till 1080p - + &Multiplayer &Flera spelare - + &Tools Ver&ktyg - + Am&iibo Am&iibo - + Launch &Applet Starta &applet - + &TAS &TAS - + &Create Home Menu Shortcut S&kapa genväg till startmenyn - + Install &Firmware Installera &firmware - + &Help &Hjälp @@ -6945,7 +7055,7 @@ Felsökningsmeddelande: - + &Pause &Paus @@ -7046,578 +7156,578 @@ Felsökningsmeddelande: - Open &Quickstart Guide - Öppna &snabbstartsguide + &User Handbook + &Användarhandbok - - &FAQ - &Frågor och svar - - - + &Capture Screenshot &Ta skärmdump - + &Album &Album - + &Set Nickname and Owner &Ange smeknamn och ägare - + &Delete Game Data &Radera speldata - + &Restore Amiibo Å&terställ Amiibo - + &Format Amiibo &Formatera Amiibo - + &Mii Editor &Mii-redigerare - + &Configure TAS... &Konfigurera TAS... - + Configure C&urrent Game... Konfigurera a&ktuellt spel... - - + + &Start &Starta - + &Reset Starta &om - - + + R&ecord Spela &in - + Open &Controller Menu Öppna &kontrollermenyn - + Install Decryption &Keys Installera avkrypteringsn&ycklar - + &Home Menu &Hemmeny - + &Desktop S&krivbord - + &Application Menu &Applikationsmeny - + &Root Data Folder &Rotdatamapp - + &NAND Folder &NAND-mapp - + &SDMC Folder &SDMC-mapp - + &Mod Folder &Mod-mapp - + &Log Folder &Loggmapp - + From Folder Från mapp - + From ZIP Från ZIP - + &Eden Dependencies &Edens beroenden - + &Data Manager &Datahanterare - + &Tree View &Trädvy - + &Grid View &Rutnätsvy - + Game Icon Size Storlek för spelikon - - + + None Ingen - + Show Game &Name Visa spel&namn - + Show &Performance Overlay Visa &prestandaöverlägg + + + Post-Processing &Shaders... + Efterbearbetning och &skuggning… + &Carousel View &Karusellvy - + Small (32x32) Liten (32x32) - + Standard (64x64) Standard (64x64) - + Large (128x128) Stor (128x128) - + Full Size (256x256) Full storlek (256x256) - + Broken Vulkan Installation Detected Felaktig Vulkan-installation upptäcktes - + Vulkan initialization failed during boot. Vulkan-initialiseringen misslyckades under uppstarten. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Kör ett spel - + Loading Web Applet... Läser in webbapplet... - + Disable Web Applet Inaktivera webbapplet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Att inaktivera webbappletten kan leda till odefinierat beteende och bör endast användas med Super Mario 3D All-Stars. Är du säker på att du vill inaktivera webbappletten? (Detta kan återaktiveras i felsökningsinställningarna.) - + The amount of shaders currently being built Antalet shaders som för närvarande byggs - + The current selected resolution scaling multiplier. Den aktuella valda multiplikatorn för upplösningsskalning. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Aktuell emuleringshastighet. Värden högre eller lägre än 100% indikerar att emuleringen körs snabbare eller långsammare än en Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Hur många bildrutor per sekund spelet för närvarande visar. Detta varierar från spel till spel och från scen till scen. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tid som krävs för att emulera en Switch-bildruta, exklusive bildbegränsning eller v-synkronisering. För emulering i full hastighet bör detta vara högst 16,67 ms. - + Unmute Aktivera ljud - + Mute Tyst - + Reset Volume Återställ volym - + &Clear Recent Files &Töm tidigare filer - + &Continue &Fortsätt - + Warning: Outdated Game Format Varning: Föråldrat spelformat - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Du använder det dekonstruerade ROM-katalogformatet för detta spel, vilket är ett föråldrat format som har ersatts av andra format såsom NCA, NAX, XCI eller NSP. Dekonstruerade ROM-kataloger saknar ikoner, metadata och uppdateringsstöd.<br> För en förklaring av de olika Switch-format som Eden har stöd för, se vår användarhandbok. Detta meddelande kommer inte att visas igen. - - + + Error while loading ROM! Fel vid inläsning av ROM! - + The ROM format is not supported. ROM-formatet stöds inte. - + An error occurred initializing the video core. Ett fel uppstod vid initialiseringen av videokärnan. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - Eden har stött på ett fel vid körning av videokärnan. Detta orsakas vanligtvis av föråldrade GPU-drivrutiner, inklusive integrerade sådana. Se loggen för mer information. För mer information om hur du kommer åt loggen, se följande sida: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>Hur man laddar upp loggfilen</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. + Detta orsakas vanligtvis av inaktuella grafikdrivrutiner. Se loggen för mer information. Se: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>Så här kommer du åt loggfiler</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Fel vid inläsning av ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Dumpa dina filer igen eller fråga på Discord/Stoat för hjälp. - + An unknown error occurred. Please see the log for more details. Ett okänt fel har uppstått. Se loggen för mer information. - - + + (64-bit) (64-bitar) - - + + (32-bit) (32-bitar) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Stänger programvara... - + Save Data Sparat data - + Mod Data Mod-data - + Error Opening %1 Folder Fel vid öppning av mappen %1 - - + + Folder does not exist! Mappen finns inte! - + Remove Installed Game Contents? Ta bort installerat spelinnehåll? - + Remove Installed Game Update? Ta bort installerad speluppdatering? - + Remove Installed Game DLC? Ta bort installerat spel-DLC? - + Remove Entry Ta bort post - + Delete OpenGL Transferable Shader Cache? Ta bort OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? Ta bort Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? Ta bort alla Transferable Shader Caches? - + Remove Custom Game Configuration? Ta bort anpassad spelkonfiguration? - + Remove Cache Storage? Ta bort cachelagring? - + Remove File Ta bort fil - + Remove Play Time Data Ta bort data om speltid - + Reset play time? Nollställ speltid? - - + + RomFS Extraction Failed! Extrahering av RomFS misslyckades! - + There was an error copying the RomFS files or the user cancelled the operation. Det uppstod ett fel vid kopieringen av RomFS-filerna eller så avbröt användaren åtgärden. - + Full Fullständigt - + Skeleton Skelett - + Select RomFS Dump Mode Välj dumpläge för RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Välj hur du vill att RomFS ska dumpas. <br>Fullständigt kopierar alla filer till den nya katalogen, medan <br>skelett endast skapar katalogstrukturen. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Det finns inte tillräckligt med ledigt utrymme på %1 för att extrahera RomFS. Frigör utrymme eller välj en annan dumpkatalog under Emulering > Konfigurera > System > Filsystem > Dumprot. - + Extracting RomFS... Extraherar RomFS... - - + + Cancel Avbryt - + RomFS Extraction Succeeded! Extrahering av RomFS lyckades! - + The operation completed successfully. Operationen slutfördes. - + Error Opening %1 Fel vid öppning av %1 - + Select Directory Välj katalog - + Properties Egenskaper - + The game properties could not be loaded. Spelegenskaperna kunde inte läsas in. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Körbar Switch-fil (%1);;Alla filer (*.*) - + Load File Läs in fil - + Open Extracted ROM Directory Öppna katalog för extraherad ROM - + Invalid Directory Selected Ogiltig katalog valdes - + The directory you have selected does not contain a 'main' file. Den katalog du har valt innehåller ingen ”main”-fil. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installerbar Switch-fil (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Installera filer - + %n file(s) remaining %n fil återstår%n filer återstår - + Installing file "%1"... Installerar filen "%1"... - - + + Install Results Installationsresultat - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. För att undvika eventuella konflikter avråder vi användare från att installera basspel på NAND. Använd endast denna funktion för att installera uppdateringar och DLC. - + %n file(s) were newly installed %n ny fil installerades @@ -7625,7 +7735,7 @@ Använd endast denna funktion för att installera uppdateringar och DLC. - + %n file(s) were overwritten %n fil skrevs över @@ -7633,7 +7743,7 @@ Använd endast denna funktion för att installera uppdateringar och DLC. - + %n file(s) failed to install %n fil gick inte att installera @@ -7641,314 +7751,314 @@ Använd endast denna funktion för att installera uppdateringar och DLC. - + System Application Systemapplikation - + System Archive Systemarkiv - + System Application Update Uppdatering för systemapplikation - + Firmware Package (Type A) Firmware-paket (Type A) - + Firmware Package (Type B) Firmware-paket (Type B) - + Game Spel - + Game Update Speluppdatering - + Game DLC DLC för spel - + Delta Title Deltatitel - + Select NCA Install Type... Välj NCA-installationstyp... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Välj vilken typ av titel du vill installera denna NCA som: (I de flesta fall är standardinställningen ”Spel” tillräcklig.) - + Failed to Install Misslyckades med att installera - + The title type you selected for the NCA is invalid. Den titeltypen du valt för NCA är ogiltig. - + File not found Filen hittades inte - + File "%1" not found Filen "%1" hittades inte - + OK Ok - + Function Disabled Funktion inaktiverad - + Compatibility list reporting is currently disabled. Check back later! Rapportering till kompatibilitetslistan är för närvarande inaktiverad. Kom tillbaka senare! - + Error opening URL Fel vid öppning av URL - + Unable to open the URL "%1". Det går inte att öppna URL:en ”%1”. - + TAS Recording TAS-inspelning - + Overwrite file of player 1? Skriv över fil för spelare 1? - + Invalid config detected Ogiltig konfiguration upptäcktes - + Handheld controller can't be used on docked mode. Pro controller will be selected. Handhållen kontroller kan inte användas i dockat läge. Pro-kontrollern kommer att väljas. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Den aktuella amiibo har tagits bort. - + Error Fel - - + + The current game is not looking for amiibos Det aktuella spelet letar inte efter amiibos - + Amiibo File (%1);; All Files (*.*) Amiibo-fil (%1);; Alla filer (*.*) - + Load Amiibo Läs in Amiibo - + Error loading Amiibo data Fel vid läsning av Amiibo-data - + The selected file is not a valid amiibo Den valda filen är inte en giltig amiibo. - + The selected file is already on use Den valda filen används redan - + An unknown error occurred Ett okänt fel uppstod - + No firmware available Ingen firmware tillgänglig - + Firmware Corrupted Firmware är skadat - + Unknown applet Okänd applet - + Applet doesn't map to a known value. Appleten mappar inte till ett känt värde. - + Record not found Posten hittades inte - + Applet not found. Please reinstall firmware. Appleten hittades inte. Installera om fast programvara. - + Capture Screenshot Ta skärmbild - + PNG Image (*.png) PNG-bild (*.png) - + TAS state: Running %1/%2 TAS-tillstånd: Kör %1/%2 - + TAS state: Recording %1 TAS-tillstånd: Spelar in %1 - + TAS state: Idle %1/%2 TAS-tillstånd: Overksam %1/%2 - + TAS State: Invalid TAS-tillstånd: Ogiltig - + &Stop Running &Stoppa körning - + Stop R&ecording Stoppa i&nspelning - + Building: %n shader(s) Bygger: %n shaderBygger: %n shaders - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Hastighet: %1% / %2% - + Speed: %1% Hastighet: %1% - + Game: %1 FPS Spel: %1 bilder/s - + Frame: %1 ms Bildruta: %1 ms - + NO AA NO AA - + VOLUME: MUTE VOLYM: TYST - + VOLUME: %1% Volume percentage (e.g. 50%) VOLYM: %1% - + Derivation Components Missing Deriveringskomponenter saknas - + Decryption keys are missing. Install them now? Avkrypteringsnycklar saknas. Installera dem nu? - + Wayland Detected! Wayland upptäcktes! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7959,74 +8069,74 @@ Det rekommenderas att använda X11 istället. Vill du tvinga det för framtida starter? - + Use X11 Använd X11 - + Continue with Wayland Fortsätt med Wayland - + Don't show again Visa inte igen - + Restart Required Omstart krävs - + Restart Eden to apply the X11 backend. Starta om Eden för att tillämpa X11-backend. - + Slow Långsam - + Turbo Turbo - + Unlocked Upplåst - + Select RomFS Dump Target Välj RomFS-dumpmål - + Please select which RomFS you would like to dump. Välj vilken RomFS du vill dumpa. - + Are you sure you want to close Eden? Är du säker på att du vill stänga Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Är du säker på att du vill stoppa emuleringen? Alla osparade framsteg kommer att gå förlorade. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9228,41 +9338,41 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. - Spelet som du försöker starta kräver firmware för att starta eller komma förbi startmenyn. <a href='https://yuzu-mirror.github.io/help/quickstart'>Dumpa och installera firmware</a> eller tryck på ”OK” för att starta ändå. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. + Det här spelet kan kräva fast programvara för att fungera korrekt, men du har ingen installerad. Installera fast programvara innan du startar spelet, eller tryck på "OK" för att starta ändå. - + Installing Firmware... Installerar firmware... - - - - - + + + + + Cancel Avbryt - + Firmware Install Failed Installation av firmware misslyckades - + Firmware Install Succeeded Installation av firmware lyckades - + Firmware integrity verification failed! Verifieringen av firmwareintegriteten misslyckades! - - + + Verification failed for the following files: %1 @@ -9271,235 +9381,235 @@ p, li { white-space: pre-wrap; } %1 - - + + Verifying integrity... Verifierar integritet... - - + + Integrity verification succeeded! Integritetsverifieringen lyckades! - - + + The operation completed successfully. Operationen slutfördes utan problem. - - + + Integrity verification failed! Integritetsverifieringen misslyckades! - + File contents may be corrupt or missing. Filens innehåll kan vara skadat eller saknas. - + Integrity verification couldn't be performed Integritetsverifiering kunde inte utföras - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. Firmwareinstallationen avbruten, firmware kan vara i dåligt skick eller skadad. Filens innehåll kunde inte kontrolleras för giltighet. - + Select Dumped Keys Location Välj plats för dumpade nycklar - + Decryption Keys install succeeded Installation av avkrypteringsnycklar lyckades - + Decryption Keys install failed Installationen av avkrypteringsnycklar misslyckades - + Orphaned Profiles Detected! Föräldralösa profiler upptäcktes! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> OVÄNTADE PROBLEM KAN UPPSTÅ OM DU INTE LÄSER DETTA! <br>Eden har upptäckt följande sparningskataloger utan bifogade profiler:<br>%1<br><br>Följande profiler är giltiga:<br>%2<br><br>Klicka på ”OK” för att öppna din sparningsmapp och fixa dina profiler.<br>Tips: kopiera innehållet i den största eller senast ändrade mappen till en annan plats, ta bort alla övergivna profiler och flytta det kopierade innehållet till den giltiga profilen.<br><br>Fortfarande förvirrad? Se hjälpsidan<a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>.<br> - + Really clear data? Verkligen tömma data? - + Important data may be lost! Viktig data kan gå förlorad! - + Are you REALLY sure? Är du VERKLIGEN säker? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. När dina data har raderats kan de INTE återställas! Gör detta endast om du är 100% säker på att du vill radera dessa data. - + Clearing... Tömmer... - + Select Export Location Välj exportplats - + %1.zip %1.zip - - - + + + Zipped Archives (*.zip) Zippade arkiv (*.zip) - + Exporting data. This may take a while... Exporterar data. Detta kan ta en stund... - + Exporting Exporterar - + Exported Successfully Exporten lyckades - + Data was exported successfully. Data har exporterats. - + Export Cancelled Exporten avbröts - + Export was cancelled by the user. Exporten avbröts av användaren. - + Export Failed Exporten misslyckades - + Ensure you have write permissions on the targeted directory and try again. Kontrollera att du har skrivbehörighet till den aktuella katalogen och försök igen. - + Select Import Location Välj importplats - + Import Warning Importvarning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? Alla tidigare data i denna katalog kommer att raderas. Är du säker på att du vill fortsätta? - + Importing data. This may take a while... Importerar data. Detta kan ta en stund... - + Importing Importerar - + Imported Successfully Importen lyckades - + Data was imported successfully. Data har importerats. - + Import Cancelled Importen avbröts - + Import was cancelled by the user. Importen avbröts av användaren. - + Import Failed Importen misslyckades - + Ensure you have read permissions on the targeted directory and try again. Kontrollera att du har läsbehörighet till den aktuella katalogen och försök igen. - + Keys not installed Nycklar är inte installerade - + Install decryption keys and restart Eden before attempting to install firmware. Installera dekrypteringsnycklar och starta om Eden innan du försöker installera fast programvara. - + Select Dumped Firmware Source Location Välj platsen för den dumpade fasta programvaran - + Select Dumped Firmware ZIP Välj ZIP-fil med dumpad fast programvara - + Firmware cleanup failed Rensning av fast programvara misslyckades - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index 4cfb643668..1aea55d216 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -585,24 +585,24 @@ FXAA can produce a more stable picture in lower resolutions. Kullanılacak kenar yumuşatma yöntemi. SMAA en iyi kaliteyi sunar. FXAA, düşük çözünürlüklerde daha kararlı bir görüntü oluşturabilir. - + Fullscreen Mode: Tam Ekran Modu: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. Pencereyi tam ekranda işlemek için kullanılan yöntem. Sınırsız, bazı oyunların giriş için istediği ekran klavyesi ile en iyi uyumluluğu sunar. Özel tam ekran, daha iyi performans ve daha iyi Freesync/Gsync desteği sağlayabilir. - + Aspect Ratio: En-Boy Oranı: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -611,46 +611,46 @@ Also controls the aspect ratio of captured screenshots. Ayrıca, yakalanan ekran görüntülerinin en-boy oranını da kontrol eder. - + Use persistent pipeline cache Kalıcı işlem hattı önbelleğini kullan - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Gölgelendiriclerin sonraki oyun açılışlarında daha hızlı yüklenmesi için depolama alanına kaydedilmesine olanak tanır. Devre dışı bırakılması yalnızca hata ayıklama amaçlıdır. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC emülasyonu: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. Videoların nasıl çözüleceğini belirtir. Kod çözme için CPU veya GPU kullanabilir veya hiç kod çözme işlemi yapmayabilir (videolarda siyah ekran). Çoğu durumda GPU ile kod çözme en iyi performansı sağlar. - + ASTC Decoding Method: ASTC Kod Çözme Yöntemi - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -659,55 +659,55 @@ stuttering but may present artifacts. Bu seçenek ASTC dokularının nasıl çözüleceğini kontrol eder. CPU: Kod çözme için işlemciyi kullanır. GPU: ASTC dokularını çözmek için GPU'nun hesaplama gölgelendiricilerini kullanır (önerilir). CPU Asenkron: ASTC dokularını talep üzerine çözmek için işlemciyi kullanır. ASTC kod çözme kaynaklı takılmaları giderir ancak görsel bozulmalara neden olabilir. - + ASTC Recompression Method: ASTC Yeniden Sıkıştırma Yöntemi - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. Çoğu GPU, ASTC dokuları için doğrudan desteğe sahip değildir ve bir ara formata (RGBA8) açılmalıdır. BC1/BC3: Ara format BC1 veya BC3 formatında yeniden sıkıştırılarak VRAM tasarrufu sağlar ancak görüntü kalitesini düşürür. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: VRAM Kullanım Modu - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Emülatörün belleği korumayı mı yoksa performans için mevcut video belleğini maksimum düzeyde kullanmayı mı tercih edeceğini seçer. Agresif mod, kayıt yazılımları gibi diğer uygulamaların performansını etkileyebilir. - + Skip CPU Inner Invalidation CPU Geçersiz Kılma'yı Atla - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Bellek güncellemeleri sırasında belirli önbellek geçersiz kılma işlemlerini atlayarak işlemci kullanımını azaltır ve gecikmeyi iyileştirir. Bu, hafif çökmelere neden olabilir. - + VSync Mode: VSync Modu: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -715,79 +715,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te FIFO (VSync) kare düşürmez veya yırtılma göstermez ancak ekran yenileme hızıyla sınırlıdır. FIFO Relaxed, yavaşlamadan toparlanırken yırtılmaya izin verir. Mailbox, FIFO'dan daha düşük gecikmeye sahip olabilir ve yırtılma yapmaz ancak kare düşürebilir. Immediate (senkronizasyon yok), mevcut olanı anında sunar ve yırtılmalara neden olabilir. - + Sync Memory Operations Bellek İşlemlerini Senkronize Et - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. Hesaplama ve bellek işlemleri arasında veri tutarlılığı sağlar. Bu seçenek oyunlardaki sorunları giderir ancak performansı düşürebilir. Unreal Engine 4 oyunları genellikle bundan en önemli ölçüde etkilenenlerdir. - + Enable asynchronous presentation (Vulkan only) Asenkron sunumu etkinleştir (Yalnızca Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Sunum işlemini ayrı bir işlemci iş parçacığına taşıyarak performansı biraz artırır. - + Force maximum clocks (Vulkan only) En yüksek hızı zorla (Yalnızca Vulkan için) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Grafik komutlarını beklerken GPU'nun hızının düşmesini engellemek için arka planda görev yürütür - + Anisotropic Filtering: Anisotropic Filtering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Eğik açılardaki doku oluşturma kalitesini kontrol eder. Çoğu grafik kartında 16x olarak ayarlanması güvenlidir. - + GPU Mode: Grafik Kartı Modu - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: DMA Doğruluğu: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -797,1328 +797,1328 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Asenkron gölgelendirici derlemeyi etkinleştir - + May reduce shader stutter. Gölgelendirici/shader takılmalarını azaltabilir. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Vulkan pipeline önbelleği kullan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Grafik kartı üreticisine özel işlem hattı önbelleğini etkinleştirir. Bu seçenek, Vulkan sürücüsünün işlem hattı önbellek dosyalarını dahili olarak saklamadığı durumlarda gölgelendirici yükleme süresini önemli ölçüde iyileştirebilir. - + Enable Compute Pipelines (Intel Vulkan Only) Hesaplama İşlem Hatlarını Etkinleştir (Yalnızca Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. Bazı oyunlar için gereklidir. Bu ayar yalnızca Intel'in tescilli sürücüleri için mevcuttur ve etkinleştirilirse çökmeye neden olabilir. Hesaplama işlem hatları diğer tüm sürücülerde her zaman etkindir. - + Enable Reactive Flushing Reaktif Temizlemeyi Etkinleştir - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Tahminli temizleme yerine reaktif temizleme kullanarak daha doğru bellek senkronizasyonu sağlar. - + Sync to framerate of video playback Video oynatma kare hızına senkronize et - + Run the game at normal speed during video playback, even when the framerate is unlocked. Kare hızı kilidi açık olsa bile video oynatımı sırasında oyunu normal hızda çalıştırır. - + Barrier feedback loops Bariyer geri besleme döngüleri - + Improves rendering of transparency effects in specific games. Belirli oyunlarda şeffaflık efektlerinin oluşturulmasını iyileştirir. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State Genişletilmiş Dinamik Durum - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Genişletilmiş Dinamik Durumda kullanılabilecek özelliklerin sayısını kontrol eder. Daha yüksek durumlar daha fazla özelliğe izin verir ve performansı artırabilir, ancak ek grafik sorunlarına neden olabilir. - + Vertex Input Dynamic State Vertex Dinamik Durumu - + Enables vertex input dynamic state feature for better quality and performance. Daha iyi kalite ve performans için Vertex dinamik durum özelliğini etkinleştirir. - + Sample Shading Örnek Gölgelendirme - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Parça gölgelendiricinin, her parça için bir kez yerine çoklu örneklenmiş bir parçadaki her örnek için yürütülmesine olanak tanır. Performans pahasına grafik kalitesini artırır. Daha yüksek değerler kaliteyi artırır ancak performansı düşürür. - + RNG Seed RNG çekirdeği - + Controls the seed of the random number generator. Mainly used for speedrunning. Rastgele sayı üretecinin tohumunu kontrol eder. Esas olarak hızlı bitirme denemeleri için kullanılır. - + Device Name Cihaz İsmi - + The name of the console. Konsolun adı - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Özel RTC Tarihi - + This option allows to change the clock of the console. Can be used to manipulate time in games. Bu seçenek konsolun saatini değiştirmeye olanak tanır. Oyunlarda zamanı manipüle etmek için kullanılabilir. - + The number of seconds from the current unix time Mevcut unix zamanından itibaren saniye sayısı - + Language: Dil: - + This option can be overridden when region setting is auto-select Bölge ayarı otomatik seçim olduğunda bu seçenek geçersiz kılınabilir. - + Region: Bölge: - + The region of the console. Konsolun bölgesi - + Time Zone: Saat Dilimi: - + The time zone of the console. Konsolun saat dilimi - + Sound Output Mode: Ses Çıkış Modu: - + Console Mode: Konsol Modu: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. Konsolun Yerleşik veya El Modunda olup olmadığını seçer. Oyunlar bu ayara bağlı olarak çözünürlüklerini, detaylarını ve desteklenen kontrolcülerini değiştirecektir. El Moduna ayarlamak, düşük seviyeli sistemler için performansı artırmaya yardımcı olabilir. - + Prompt for user profile on boot Açılışta kullanıcı profili için sor - + Useful if multiple people use the same PC. Aynı bilgisayarı birden fazla kişi kullanıyorsa yararlıdır. - + Pause when not in focus Odaklı değilken duraklat - + Pauses emulation when focusing on other windows. Diğer pencerelere odaklanıldığında emülasyonu duraklatır. - + Confirm before stopping emulation Emülasyonu durdurmadan önce onayla - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Emülasyonu durdurma onayı isteklerini/istemlerini geçersiz kılar. Etkinleştirildiğinde, bu tür istekleri/istemleri atlar ve emülasyonu doğrudan/dirket olarak kapatır. - + Hide mouse on inactivity Hareketsizlik durumunda imleci gizle - + Hides the mouse after 2.5s of inactivity. 2,5 saniye hareketsizlikten sonra fareyi gizler. - + Disable controller applet Kontrolcü aplikasyonunu devre dışı bırak - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Emüle edilen programlarda kontrolcü aplikasyonunun kullanımını zorla devre dışı bırakır. Bir program kontrolcü aplikasyonunu açmaya çalıştığında, aplikasyon anında kapatılır. - + Check for updates Güncellemeleri Kontrol Et - + Whether or not to check for updates upon startup. Başlangıçta güncellemelerin kontrol edilip edilmeyeceği. - + Enable Gamemode Oyun Modunu/Gamemode Etkinleştir - + Force X11 as Graphics Backend Grafik arka ucu olarak X11'i zorla - + Custom frontend Özel ön yüz - + Real applet Gerçek aplikasyon - + Never Asla - + On Load Yüklemede - + Always Her zaman - + CPU CPU - + GPU GPU - + CPU Asynchronous Asenkron CPU - + Uncompressed (Best quality) Sıkıştırılmamış (En iyi kalite) - + BC1 (Low quality) BC1 (Düşük kalite) - + BC3 (Medium quality) BC3 (Orta kalite) - - + + Auto Otomatik - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Muhafazakar - + Aggressive Agresif - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Boş - + Fast Hızlı - - - + + + Accurate Doğru - - - + + + Default Varsayılan - + Unsafe (fast) Güvenli Değil (hızlı) - + Safe (stable) Güvenli (Stabil) - + Immediate - + Balanced Dengeli - + Strict - + Unsafe Güvensiz - + Paranoid (disables most optimizations) Paranoya (çoğu optimizasyonu kapatır) - + Debugging Hata ayıklama - + Dynarmic Dinamik - + NCE NCE - + Borderless Windowed Kenarlıksız Tam Ekran - + Exclusive Fullscreen Ayrılmış Tam Ekran - + No Video Output Video Çıkışı Yok - + CPU Video Decoding CPU Video Decoding - + GPU Video Decoding (Default) GPU Video Decoding (Varsayılan) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [DENEYSEL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [DENEYSEL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [DENEYSEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [DENEYSEL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [DENEYSEL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor En Yakın Komşu Algoritması - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gausyen - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Süper Çözünürlük - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Yok - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Varsayılan (16:9) - + Force 4:3 4:3'e Zorla - + Force 21:9 21:9'a Zorla - + Force 16:10 16:10'a Zorla - + Stretch to Window Ekrana Sığdır - + Automatic Otomatik - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonca (日本語) - + American English Amerikan İngilizcesi - + French (français) Fransızca (français) - + German (Deutsch) Almanca (Deutsch) - + Italian (italiano) İtalyanca (italiano) - + Spanish (español) İspanyolca (español) - + Chinese Çince - + Korean (한국어) Korece (한국어) - + Dutch (Nederlands) Flemenkçe (Nederlands) - + Portuguese (português) Portekizce (português) - + Russian (Русский) Rusça (Русский) - + Taiwanese Tayvanca - + British English İngiliz İngilizcesi - + Canadian French Kanada Fransızcası - + Latin American Spanish Latin Amerika İspanyolcası - + Simplified Chinese Basitleştirilmiş Çince - + Traditional Chinese (正體中文) Geleneksel Çince (正體中文) - + Brazilian Portuguese (português do Brasil) Brezilya Portekizcesi (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonya - + USA ABD - + Europe Avrupa - + Australia Avustralya - + China Çin - + Korea Kore - + Taiwan Tayvan - + Auto (%1) Auto select time zone Otomatik (%1) - + Default (%1) Default time zone Varsayılan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Küba - + EET EET - + Egypt Mısır - + Eire İrlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-İrlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 MT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland İzlanda - + Iran İran - + Israel İsrail - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navaho - + NZ Yeni Zelanda - + NZ-CHAT Chatham Adaları - + Poland Polonya - + Portugal Portekiz - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkiye - + UCT UCT - + Universal Evrensel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Varsayılan) - + 6GB DRAM (Unsafe) 6GB DRAM (Güvenli Değil) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Güvenli Değil) - + 12GB DRAM (Unsafe) 12GB DRAM (Güvenli Değil) - + Docked Dock Modu Aktif - + Handheld Taşınabilir - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) Her zaman sor (Varsayılan) - + Only if game specifies not to stop Sadece oyun durdurulmamasını belirtirse - + Never ask Asla sorma - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Orta (256) - + High (512) Yüksek (512) - + Disabled Devre Dışı - + ExtendedDynamicState 1 Genişletilmiş Dinamik Durum 1 - + ExtendedDynamicState 2 Genişletilmiş Dinamik Durum 2 - + ExtendedDynamicState 3 Genişletilmiş Dinamik Durum 3 - + Tree View - + Grid View @@ -4867,6 +4867,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5952,50 +6061,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL kullanıma uygun değil! - + OpenGL shared contexts are not supported. OpenGL paylaşılan bağlam desteklenmiyor. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! OpenGl başlatılırken bir hata oluştu! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. GPU'nuz OpenGL desteklemiyor veya güncel bir grafik sürücüsüne sahip değilsiniz. - + Error while initializing OpenGL 4.6! OpenGl 4.6 başlatılırken bir hata oluştu! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 GPU'nuz OpenGL 4.6'yı desteklemiyor veya güncel bir grafik sürücüsüne sahip değilsiniz.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 GPU'nuz gereken bir yada daha fazla OpenGL eklentisini desteklemiyor Lütfen güncel bir grafik sürücüsüne sahip olduğunuzdan emin olun.<br><br>GL Renderer:<br>%1<br><br> Desteklenmeyen Eklentiler:<br>%2 - + This build doesn't have OpenGL support. @@ -6816,42 +6925,42 @@ Debug Message: Pencere Boyutunu 1080p'ye Sıfırla - + &Multiplayer &Çok Oyunculu - + &Tools &Aletler - + Am&iibo - + Launch &Applet - + &TAS &TAS - + &Create Home Menu Shortcut - + Install &Firmware - + &Help &Yardım @@ -6877,7 +6986,7 @@ Debug Message: - + &Pause &Duraklat @@ -6978,900 +7087,900 @@ Debug Message: - Open &Quickstart Guide - &Hızlı Başlangıç Kılavuzunu Aç + &User Handbook + - - &FAQ - &SSS - - - + &Capture Screenshot &Ekran Görüntüsü Al - + &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + &Mii Editor - + &Configure TAS... &TAS'i Ayarla... - + Configure C&urrent Game... &Geçerli Oyunu Yapılandır... - - + + &Start B&aşlat - + &Reset &Sıfırla - - + + R&ecord K&aydet - + Open &Controller Menu - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected Bozuk Vulkan Kurulumu Algılandı - + Vulkan initialization failed during boot. Açılış sırasında Vulkan başlatma işlemi başarısız oldu. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Bir oyun çalıştırılıyor - + Loading Web Applet... Web Uygulaması Yükleniyor... - + Disable Web Applet Web Uygulamasını Devre Dışı Bırak - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Sesi aç - + Mute Sessize al - + Reset Volume Sesi Sıfırla - + &Clear Recent Files &Son Dosyaları Temizle - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL URL açılırken hata oluştu - + Unable to open the URL "%1". - + TAS Recording TAS İşlemi Kaydı - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Mevcut Amiibo kaldırıldı - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted Donanım Yazılımı/Firmware Bozuk - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 TAS durumu: %1/%2 Çalışıyor - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Ölçek: %1x - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7879,74 +7988,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9133,275 +9242,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/uk.ts b/dist/languages/uk.ts index b1df1267f4..ecaec4fa23 100644 --- a/dist/languages/uk.ts +++ b/dist/languages/uk.ts @@ -593,12 +593,12 @@ SMAA забезпечує найкращу якість. FXAA може створювати стабільніше зображення при низьких роздільностях. - + Fullscreen Mode: Повноекранний режим: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -607,12 +607,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp «Ексклюзивний повноекранний» може надати кращі продуктивність і підтримку Freesync/Gsync. - + Aspect Ratio: Співвідношення сторін: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -621,36 +621,36 @@ Also controls the aspect ratio of captured screenshots. Також керує співвідношеням сторін знімків екрана. - + Use persistent pipeline cache Використовувати стійкий кеш конвеєра - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Дозволяє зберігати шейдери на накопичувачі для швидшого завантаження під час наступних запусків гри. Вимкнення цього налаштування задумане лише для зневадження. - + Use asynchronous GPU emulation Використовувати асинхронну емуляцію ГП - + Uses an extra CPU thread for rendering. This option should always remain enabled. Використовує додатковий потік ЦП для візуалізації. Це налаштування повинно завжди залишатися увімкненим. - + NVDEC emulation: Емуляція NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -659,12 +659,12 @@ In most cases, GPU decoding provides the best performance. У більшості випадків декодування за допомогою ГП забезпечує найкращу продуктивність. - + ASTC Decoding Method: Метод декодування ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -676,12 +676,12 @@ stuttering but may present artifacts. Асинхронно ЦП: Використання ЦП для декодування ASTC-текстур по мірі їх викликів. Повністю усуває затримки декодування ASTC ціною проблем з візуалізацією, поки текстури декодуються. - + ASTC Recompression Method: Метод перестиснення ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -689,44 +689,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3: Проміжний формат буде перепаковано у формат BC1 або BC3 для збереження відеопам’яті, але це негатривно вплине на якість зображення. - + Frame Pacing Mode (Vulkan only) Режим виведення кадрів (лише Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. Керує тим, як емулятор виконує виведення кадрів, щоб зменшити затримки й забезпечити плавнішу й стабільнішу частоту кадрів. - + VRAM Usage Mode: Режим використання відеопам’яті: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Це налаштування вибирає, чи повинен емулятор надавати перевагу заощадженню пам’яті, чи по максимуму використовувати доступну відеопам’ять задля продуктивності. Режим «Агресивно» може вплинути на продуктивність інших застосунків, як-от засоби запису. - + Skip CPU Inner Invalidation Пропускати внутрішнє анулювання ЦП - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Пропускає деякі анулювання кешу під час оновлень пам’яті, зменшуючи використання ЦП й виправляючи затримки. Це може спричинити збої. - + VSync Mode: Режим вертикальної синхронізації: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -737,12 +737,12 @@ Mailbox може мати меншу затримку, ніж FIFO, і не ма Immediate (без синхронізації) показує всі кадри й може створювати розриви. - + Sync Memory Operations Синхронізувати операції з пам’яттю - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -751,44 +751,44 @@ Unreal Engine 4 games often see the most significant changes thereof. Ігри на Unreal Engine 4 часто зазнають найзначніших змін. - + Enable asynchronous presentation (Vulkan only) Увімкнути асинхронне подання (лише Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Трохи покращує продуктивність завдяки переміщенню подання на окремий потік ЦП. - + Force maximum clocks (Vulkan only) Примусово максимальна тактова частота (лише Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Виконує роботу у фоновому режимі в очікуванні графічних команд, не даючи змоги ГП знижувати тактову частоту. - + Anisotropic Filtering: Анізотропна фільтрація: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Керує якістю візуалізації текстур під непрямими кутами. Для більшості ГП можна вільно вибирати 16x. - + GPU Mode: Режим ГП: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -797,24 +797,24 @@ Particles tend to only render correctly with Accurate mode. Частинки зазвичай правильно візуалізуються лише з режимом «Точно». - + DMA Accuracy: Точність DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -824,55 +824,55 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Увімкнути асинхронну компіляцію шейдерів - + May reduce shader stutter. Може зменшити шейдерні затримки. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle Розпакування за допомогою ГП - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Прискорює декодування 3D-текстур BCn застосовуючи обчислення за допомогою ГП. Вимкніть у разі збоїв або проблем із графікою. - + GPU Unswizzle Max Texture Size Максимальний розмір текстур для розпакування за допомогою ГП - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -881,48 +881,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size Розмір потоку розпакування за допомогою ГП - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Встановлює максимальний обсяг даних текстур (у МіБ) для обробки на кадр. Вищі значення здатні зменшити затримки під час завантаження текстур, але можуть вплинути на стабільність кадрів. - + GPU Unswizzle Chunk Size Розмір блоків розпакування за допомогою ГП - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Визначає кількість зрізів глибини, оброблених за одне відправлення. Збільшення здатне покращити пропускну здатність на потужних ГП, але може призвести до TDR або затримок драйвера зі слабшим устаткуванням. - + Use Vulkan pipeline cache Використовувати кеш конвеєра Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Вмикає особливий для різних виробників ГП кеш конвеєра. Це налаштування може значно зменшити час завантаження шейдерів у випадках, коли драйвер Vulkan не зберігає власний кеш конвеєра. - + Enable Compute Pipelines (Intel Vulkan Only) Увімкнути обчислювальні конвеєри (лише Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -931,194 +931,194 @@ Compute pipelines are always enabled on all other drivers. Обчислювальні конвеєри завжди увімкнені у всіх інших драйверах. - + Enable Reactive Flushing Увімкнути реактивне очищення - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Використовує реактивне очищення замість прогнозованого, забезпечуючи точнішу синхронізацію пам’яті. - + Sync to framerate of video playback Синхронізувати частоту кадрів з відтворенням відео - + Run the game at normal speed during video playback, even when the framerate is unlocked. Відтворювати гру з нормальною швидкістю під час відтворення відео навіть при розблокованій частоті кадрів. - + Barrier feedback loops Бар’єрні цикли відгуку - + Improves rendering of transparency effects in specific games. Покращує візуалізацію ефектів прозорості в деяких іграх. - + Enable buffer history Увімкнути історію буфера - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Вмикає доступ до попередніх станів буфера. Цей параметр може покращити якість візуалізації та стабільну продуктивність у деяких іграх. - + Fix bloom effects Виправити ефекти світіння - + Removes bloom in Burnout. Прибирає світіння в Burnout. - + Enable Legacy Rescale Pass Увімкнути застаріле масштабування - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Може виправити проблеми з масштабуванням в іграх, покладаючись на поведінку з попередньої імплементації. Застаріле масштабування виправляє артефакти з лініями на ГП від AMD та Intel, а також сіре блимання текстур на ГП від Nvidia в Luigis Mansion 3. - + Extended Dynamic State Розширений динамічний стан - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Керує кількістю функцій, які можна використовувати в «Розширеному динамічному стані». Вищі значення допускають більше функцій і можуть збільшити продуктивність, але можуть спричинити додаткові проблеми з графікою. - + Vertex Input Dynamic State Динамічний стан введення вершин - + Enables vertex input dynamic state feature for better quality and performance. Вмикає можливість динамічного стану введення вершин для кращих якості й продуктивності. - + Sample Shading Шейдинг зразків - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Дозволяє виконувати фрагмент шейдера для кожного зразка в багатозразковому фрагменті замість одного разу для кожного фрагмента. Покращує якість графікі ціною втрати продуктивності. Вищі значення покращують якість, але погіршують продуктивність. - + RNG Seed Початкове значення RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Керує початковим значення генератора випадкових чисел. Зазвичай використовується в спідранах. - + Device Name Назва пристрою - + The name of the console. Назва консолі. - + Homebrew Args Параметри запуску Homebrew - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Параметри командного рядка, що передаються Homebrew при запуску (як-от noglsl). - + Custom RTC Date: Користувацька дата RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Це налаштування дозволяє змінити час годинника консолі. Можна використовувати для маніпуляцій із часом в іграх. - + The number of seconds from the current unix time Кількість секунд від поточного unix-часу. - + Language: Мова: - + This option can be overridden when region setting is auto-select Це налаштування може перевизначитися, якщо налаштування регіону вибирається автоматично - + Region: Регіон: - + The region of the console. Регіон консолі. - + Time Zone: Часовий пояс: - + The time zone of the console. Часовий пояс консолі. - + Sound Output Mode: Режим виведення звуку: - + Console Mode: Режим консолі: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1127,1042 +1127,1042 @@ Setting to Handheld can help improve performance for low end systems. Налаштування «Портативний» може покращити продуктивність на слабких системах. - + Prompt for user profile on boot Запитувати профіль користувача під час запуску - + Useful if multiple people use the same PC. Корисно, якщо одним комп’ютером користуються кілька користувачів. - + Pause when not in focus Призупиняти, якщо не у фокусі - + Pauses emulation when focusing on other windows. Призупиняє емуляцію при фокусування на інших вікнах. - + Confirm before stopping emulation Підтверджувати зупинку емуляції - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Перевизначає запити на підтвердження зупинки емуляції. Увімкнення обходить такі запити й одразу зупиняє емуляцію. - + Hide mouse on inactivity Приховувати курсор миші при бездіяльності - + Hides the mouse after 2.5s of inactivity. Приховує курсор миші після 2,5 с її бездіяльності. - + Disable controller applet Вимкнути аплет контролера - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Примусово вимикає використання в емульованих програмах аплета контролера. Якщо програма спробує відкрити аплет контролера, він одразу закриється. - + Check for updates Перевіряти оновлення - + Whether or not to check for updates upon startup. Чи перевіряти оновлення при запуску. - + Enable Gamemode Увімкнути ігровий режим - + Force X11 as Graphics Backend Примусово використовувати X11 як графічний бекенд - + Custom frontend Користувацький фронтенд - + Real applet Справжній аплет - + Never Ніколи - + On Load При завантаженні - + Always Завжди - + CPU ЦП - + GPU ГП - + CPU Asynchronous Асинхронно ЦП - + Uncompressed (Best quality) Без стиснення (Найкраща якість) - + BC1 (Low quality) ВС1 (Низька якість) - + BC3 (Medium quality) ВС3 (Середня якість) - - + + Auto Автоматично - + 30 FPS 30 к/с - + 60 FPS 60 к/с - + 90 FPS 90 к/с - + 120 FPS 120 к/с - + Conservative Заощадження - + Aggressive Агресивно - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (асемблерні шейдери, лише NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (експериментально, лише AMD/Mesa) - + Null Нічого - + Fast Швидко - - - + + + Accurate Точно - - - + + + Default Стандартно - + Unsafe (fast) Небезпечно (швидко) - + Safe (stable) Безпечно (стабільно) - + Immediate - + Balanced Збалансовано - + Strict - + Unsafe Небезпечно - + Paranoid (disables most optimizations) Параноїк (вимикає більшість оптимізацій) - + Debugging Зневадження - + Dynarmic Динамічно - + NCE NCE - + Borderless Windowed Безрамкове вікно - + Exclusive Fullscreen Ексклюзивний повноекранний - + No Video Output Виведення відео відсутнє - + CPU Video Decoding Декодування відео на ЦП - + GPU Video Decoding (Default) Декодування відео на ГП (стандатно) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [ЕКСПЕРИМЕНТАЛЬНО] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [ЕКСПЕРИМЕНТАЛЬНО] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ЕКСПЕРИМЕНТАЛЬНО] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [ЕКСПЕРИМЕНТАЛЬНО] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [ЕКСПЕРИМЕНТАЛЬНО] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Найближчий сусід - + Bilinear Білінійний - + Bicubic Бікубічний - + Gaussian Ґаусса - + Lanczos Ланцоша - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Області - + MMPX MMPX - + Zero-Tangent Нульовий тангенс - + B-Spline B-Spline - + Mitchell Мітчелла - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Немає - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Стандартно (16:9) - + Force 4:3 Примусово 4:3 - + Force 21:9 Примусово 21:9 - + Force 16:10 Примусово 16:10 - + Stretch to Window Розтягнути до вікна - + Automatic Автоматично - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Японська (日本語) - + American English Американська англійська - + French (français) Французька (français) - + German (Deutsch) Німецька (Deutsch) - + Italian (italiano) Італійська (italiano) - + Spanish (español) Іспанська (español) - + Chinese Китайська - + Korean (한국어) Корейська (한국어) - + Dutch (Nederlands) Нідерландська (Nederlands) - + Portuguese (português) Португальська (português) - + Russian (Русский) Російська (Русский) - + Taiwanese Тайванська - + British English Британська англійська - + Canadian French Канадська французька - + Latin American Spanish Латиноамериканська іспанська - + Simplified Chinese Спрощена китайська - + Traditional Chinese (正體中文) Традиційна китайська (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильська португальська (português do Brasil) - + Polish (polska) Польська (polska) - + Thai (แบบไทย) Тайська (แบบไทย) - - + + Japan Японія - + USA США - + Europe Європа - + Australia Австралія - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Автоматично (%1) - + Default (%1) Default time zone Стандартно (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Єгипет - + Eire Ейре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвіч - + Hongkong Гонконг - + HST HST - + Iceland Ісландія - + Iran Іран - + Israel Ізраїль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Лівія - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польща - + Portugal Португалія - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сінгапур - + Turkey Туреччина - + UCT UCT - + Universal Універсальний - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулу - + Mono Моно - + Stereo Стерео - + Surround Об’ємний - + 4GB DRAM (Default) 4GB DRAM (стандартно) - + 6GB DRAM (Unsafe) 6GB DRAM (небезпечно) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (небезпечно) - + 12GB DRAM (Unsafe) 12GB DRAM (небезпечно) - + Docked У докстанції - + Handheld Портативний - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) Завжди запитувати (стандартно) - + Only if game specifies not to stop Лише якщо гра вказує не зупиняти - + Never ask Ніколи не запитувати - + Very Small (16 MB) Дуже малий (16 МБ) - + Small (32 MB) Малий (32 МБ) - + Normal (128 MB) Нормальний (128 МБ) - + Large (256 MB) Великий (256 МБ) - + Very Large (512 MB) Дуже великий (512 МБ) - + Very Low (4 MB) Дуже низький (4 МБ) - + Low (8 MB) Низький (8 МБ) - + Normal (16 MB) Нормальний (16 МБ) - + Medium (32 MB) Середній (32 МБ) - + High (64 MB) Високий (64 МБ) - + Very Low (32) Дуже низький (32) - + Low (64) Низький (64) - + Normal (128) Нормальний (128) - + Medium (256) Середньо (256) - + High (512) Високо (512) - + Disabled Вимкнено - + ExtendedDynamicState 1 Розширений динамічний стан 1 - + ExtendedDynamicState 2 Розширений динамічний стан 2 - + ExtendedDynamicState 3 Розширений динамічний стан 3 - + Tree View Дерево вибору - + Grid View Таблиця @@ -4918,6 +4918,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t [&O] Відкрити у файловому менеджері + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -6005,50 +6114,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL недоступний! - + OpenGL shared contexts are not supported. Спільні контексти OpenGL не підтримуються. - + Eden has not been compiled with OpenGL support. Eden не скомпільовано з підтримкою OpenGL. - - - + + + Error while initializing OpenGL! Помилка під час ініціалізації OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. Ваш ГП може не підтримувати OpenGL або у вас встановлено застарілий графічний драйвер. - + Error while initializing OpenGL 4.6! Помилка під час ініціалізації OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 Ваш ГП може не підтримувати OpenGL 4.6 або у вас встановлено застарілий графічний драйвер.<br><br>Візуалізатор GL:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 Ваш ГП може не підтримувати одне або кілька розширень, необхідних для OpenGL. Переконайтеся, що у вас встановлено останній графічний драйвер.<br><br>Візуалізатор GL:<br>%1<br><br>Непідтримувані розширення:<br>%2 - + This build doesn't have OpenGL support. Ця збірка не підтримує OpenGL. @@ -6870,42 +6979,42 @@ Debug Message: Скинути розмір вікна до 1080p - + &Multiplayer [&M] Багатоосібна гра - + &Tools [&T] Інструменти - + Am&iibo [&I] Amiibo - + Launch &Applet [&A] Запустити аплет - + &TAS [&T] TAS - + &Create Home Menu Shortcut [&C] Створити ярлик меню-домівки - + Install &Firmware [&F] Встановити прошивку - + &Help [&H] Допомога @@ -6931,7 +7040,7 @@ Debug Message: - + &Pause [&P] Призупинити @@ -7032,578 +7141,578 @@ Debug Message: - Open &Quickstart Guide - [&Q] Відкрити посібник користувача + &User Handbook + - - &FAQ - [&F] ЧаПи - - - + &Capture Screenshot [&C] Зробити знімок екрана - + &Album [&A] Альбом - + &Set Nickname and Owner [&S] Указати псевдонім і власника - + &Delete Game Data [&D] Видалити дані гри - + &Restore Amiibo [&R] Відновити amiibo - + &Format Amiibo [&F] Форматувати amiibo - + &Mii Editor [&M] Редактор Mii - + &Configure TAS... [&C] Налаштувати TAS... - + Configure C&urrent Game... [&U] Налаштувати поточну гру... - - + + &Start [&S] Запустити - + &Reset [&S] Скинути - - + + R&ecord [&E] Запис - + Open &Controller Menu [&C] Відкрити меню контролерів - + Install Decryption &Keys [&K] Встановити ключі дешифрування - + &Home Menu [&H] Меню-домівка - + &Desktop [&D] Стільниця - + &Application Menu [&A] Меню застосунків - + &Root Data Folder [&R] Коренева тека даних - + &NAND Folder [&N] Тека NAND - + &SDMC Folder [&S] Тека SDMC - + &Mod Folder [&M] Тека модів - + &Log Folder [&L] Тека журналу - + From Folder З теки - + From ZIP Із ZIP - + &Eden Dependencies [&E] Залежності Eden - + &Data Manager [&D] Керування даними - + &Tree View [&T] Дерево вибору - + &Grid View [&G] Таблиця - + Game Icon Size Розмір значків ігор - - + + None Жодного - + Show Game &Name [&N] Показати назву гри - + Show &Performance Overlay [&P] Показати оверлей продуктивності + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) Маленький (32х32) - + Standard (64x64) Стандартний (64х64) - + Large (128x128) Великий (128х128) - + Full Size (256x256) Повнорозмірний (256х256) - + Broken Vulkan Installation Detected Виявлено пошкоджене встановлення Vulkan - + Vulkan initialization failed during boot. Не вдалося ініціалізувати Vulkan під час запуску. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Запущено гру - + Loading Web Applet... Завантаження вебаплета... - + Disable Web Applet Вимкнути вебаплет - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Вимкнення вебапплета може призвести до несподіваної поведінки, і це слід робити лише для Super Mario 3D All-Stars. Ви впевнені, що хочете вимкнути вебапплет? (Його можна знову увімкнути в налаштуваннях зневадження.) - + The amount of shaders currently being built Кількість наразі створених шейдерів - + The current selected resolution scaling multiplier. Наразі вибраний множник масштабування роздільності. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Поточна швидкість емуляції. Значення вище або нижче 100% вказують на те, що емуляція йде швидше або повільніше, ніж на Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Частота кадрів, яку наразі показує гра. Значення змінюватиметься залежно від гри та з кожною сценою. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Час, потрібний для емуляції 1 кадру Switch, не враховуючи обмеження частоти кадрів або вертикальну синхронізацію. Для повношвидкісної емуляції значення повинно бути не вище 16,67 мс. - + Unmute Увімкнути звук - + Mute Вимкнути звук - + Reset Volume Скинути гучність - + &Clear Recent Files [&C] Очистити нещодавні файли - + &Continue [&C] Продовжити - + Warning: Outdated Game Format Увага: Застарілий формат гри - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Для цієї гри ви використовуєте формат теки з деконструйованим ROM, який є застарілим форматом, заміненим на інші, як-от NCA, NAX, XCI, або NSP. У тек із деконструйованими ROM немає значків, метаданих, а також вони не підтримують оновлення.<br>Для подробиць стосовно різноманітних форматів Switch, які підтримує Eden, ознайомтеся з нашим посібником користувача. Це повідомлення не буде показано знову. - - + + Error while loading ROM! Помилка під час завантаження ROM! - + The ROM format is not supported. Непідтримуваний формат ROM. - + An error occurred initializing the video core. Сталася помилка під час ініціалізації відеоядра. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - В Eden сталася помилка під час роботи відеоядра. Зазвичай це відбувається через застарілі драйвери ГП, зокрема інтегрованих. Для подробиць перегляньте журнал. Для додаткової інформації стосовно доступу до журналу перегляньте таку сторінку: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>Як відвантажити файл журналу</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. + - + Error while loading ROM! %1 %1 signifies a numeric error code. Помилка під час завантаження ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Створіть новий дамп файлів або зверніться по допомогу в Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Сталася невідома помилка. Ознайомтеся з журналом, щоб дізнатися подробиці. - - + + (64-bit) (64-бітовий) - - + + (32-bit) (32-бітовий) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Закриття програмного засобу... - + Save Data Дані збережень - + Mod Data Дані модів - + Error Opening %1 Folder Помилка під час відкриття теки «%1» - - + + Folder does not exist! Теки не існує! - + Remove Installed Game Contents? Вилучити встановлений вміст гри? - + Remove Installed Game Update? Вилучити встановлені оновлення гри? - + Remove Installed Game DLC? Вилучити встановлені доповнення гри? - + Remove Entry Вилучити запис - + Delete OpenGL Transferable Shader Cache? Видалити переміщуваний кеш шейдерів OpenGL? - + Delete Vulkan Transferable Shader Cache? Видалити переміщуваний кеш шейдерів Vulkan? - + Delete All Transferable Shader Caches? Видалити весь переміщуваний кеш шейдерів? - + Remove Custom Game Configuration? Вилучити користувацькі налаштування гри? - + Remove Cache Storage? Вилучити сховище кешу? - + Remove File Вилучити файл - + Remove Play Time Data Вилучити дані награного часу - + Reset play time? Скинути награний час? - - + + RomFS Extraction Failed! Не вдалося видобути RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Під час копіювання файлів RomFS сталася помилка або користувач скасував операцію. - + Full Повний - + Skeleton Скелет - + Select RomFS Dump Mode Виберіть режим створення дампу RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Виберіть, як ви хочете виконати дамп RomFS <br>Повний скопіює всі файли до нової теки, тоді як <br>скелет створить лише структуру тек. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root За адресою «%1» недостатньо вільного місця для видобування RomFS. Звільніть місце або виберіть іншу теку для створення дампу в «Емуляція» → «Налаштувати» → «Система» → «Файлова система» → «Коренева тека дампів». - + Extracting RomFS... Видобування RomFS... - - + + Cancel Скасувати - + RomFS Extraction Succeeded! RomFS видобуто успішно! - + The operation completed successfully. Операцію успішно виконано. - + Error Opening %1 Помилка під час відкриття «%1» - + Select Directory Вибрати теку - + Properties Властивості - + The game properties could not be loaded. Неможливо завантажити властивості гри. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Виконуваний файл Switch (%1);;Усі файли (*.*) - + Load File Завантажити файл - + Open Extracted ROM Directory Відкрити теку видобутого ROM - + Invalid Directory Selected Вибрано неправильну теку - + The directory you have selected does not contain a 'main' file. Вибрана тека не містить файлу «main». - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Встановлюваний файл Switch (*.nca, *.nsp, *.xci);;Архів вмісту Nintendo (*.nca);;Пакет подання Nintendo (*.nsp);;Образ картриджа NX (*.xci) - + Install Files Встановити файли - + %n file(s) remaining Лишився 1 файлЛишилося %n файлиЛишилося %n файлівЛишилося %n файлів - + Installing file "%1"... Встановлення файлу «%1»... - - + + Install Results Результати встановлення - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Щоб уникнути можливих конфліктів, ми не радимо користувачам встановлювати ігри в NAND. Користуйтеся цією функцією лише для встановлення оновлень і доповнень. - + %n file(s) were newly installed Щойно встановлено %n файл @@ -7613,7 +7722,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten Перезаписано %n файл @@ -7623,7 +7732,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install Не вдалося встановити %n файл @@ -7633,314 +7742,314 @@ Please, only use this feature to install updates and DLC. - + System Application Системний застосунок - + System Archive Системний архів - + System Application Update Оновлення системного застосунку - + Firmware Package (Type A) Пакет прошивки (Тип А) - + Firmware Package (Type B) Пакет прошивки (Тип Б) - + Game Гра - + Game Update Оновлення гри - + Game DLC Доповнення гри - + Delta Title Проєкт «Дельта» - + Select NCA Install Type... Виберіть тип встановлення NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Виберіть тип проєкту, який ви хочете встановити для цього NCA: (У більшості випадків підходить стандартний вибір «Гра».) - + Failed to Install Не вдалося встановити - + The title type you selected for the NCA is invalid. Тип проєкту, який ви вибрали для NCA, неправильний. - + File not found Файл не виявлено - + File "%1" not found Файл «%1» не виявлено - + OK Гаразд - + Function Disabled Функцію вимкнену - + Compatibility list reporting is currently disabled. Check back later! Звітування для переліку сумісності наразі вимкнено. Зазирніть пізніше! - + Error opening URL Помилка під час відкриття URL - + Unable to open the URL "%1". Не вдалося відкрити URL: «%1». - + TAS Recording Записування TAS - + Overwrite file of player 1? Перезаписати файл гравця 1? - + Invalid config detected Виявлено неправильне налаштування - + Handheld controller can't be used on docked mode. Pro controller will be selected. Портативний контролер неможливо використовувати в режимі докстанції. Буде вибрано контролер Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Поточний amiibo вилучено - + Error Помилка - - + + The current game is not looking for amiibos Поточна гра не очікує amiibo - + Amiibo File (%1);; All Files (*.*) Файл amiibo (%1);; Усі файли (*.*) - + Load Amiibo Завантажити amiibo - + Error loading Amiibo data Помилка під час завантаження даних amiibo - + The selected file is not a valid amiibo Вибраний файл не є дійсним amiibo - + The selected file is already on use Вибраний файл уже використовується - + An unknown error occurred Сталася невідома помилка - + No firmware available Немає доступних прошивок - + Firmware Corrupted Прошивка пошкоджена - + Unknown applet Невідомий аплет - + Applet doesn't map to a known value. Аплет не призначено до відомого значення. - + Record not found Запис не виявлено - + Applet not found. Please reinstall firmware. Аплет не виявлено. Перевстановіть прошивку. - + Capture Screenshot Зробити знімок екрана - + PNG Image (*.png) Зображення PNG (*.png) - + TAS state: Running %1/%2 Стан TAS: Працює %1/%2 - + TAS state: Recording %1 Стан TAS: Триває запис %1 - + TAS state: Idle %1/%2 Стан TAS: Бездіяльність %1/%2 - + TAS State: Invalid Стан TAS: Неправильний - + &Stop Running [&S] Зупинити - + Stop R&ecording [&E] Зупинити запис - + Building: %n shader(s) Компіляція: %n шейдерКомпіляція: %n шейдериКомпіляція: %n шейдерівКомпіляція: %n шейдерів - + Scale: %1x %1 is the resolution scaling factor Масштаб: %1x - + Speed: %1% / %2% Швидкість: %1% / %2% - + Speed: %1% Швидкість: %1% - + Game: %1 FPS Гра: %1 к/с - + Frame: %1 ms Кадр: %1 мс - + NO AA БЕЗ ЗГЛАДЖУВАННЯ - + VOLUME: MUTE ГУЧНІСТЬ: ВИМКНЕНО - + VOLUME: %1% Volume percentage (e.g. 50%) ГУЧНІСТЬ: %1% - + Derivation Components Missing Відсутні компоненти виведення - + Decryption keys are missing. Install them now? Відсутні ключі шифрування. Встановити їх зараз? - + Wayland Detected! Виявлено Wayland! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7951,74 +8060,74 @@ Would you like to force it for future launches? Хочете примусово увімкнути його для наступних запусків? - + Use X11 Використовувати X11 - + Continue with Wayland Продовжити з Wayland - + Don't show again Не показувати знову - + Restart Required Потрібен перезапуск - + Restart Eden to apply the X11 backend. Перезапуск Eden для застосування бекенду X11. - + Slow Сповільнення - + Turbo Прискорення - + Unlocked Розблоковано - + Select RomFS Dump Target Виберіть розташування для створення дампу RomFS - + Please select which RomFS you would like to dump. Виберіть, який дамп RomFS ви хочете створити. - + Are you sure you want to close Eden? Ви впевнені, що хочете закрити Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Ви впевнені, що хочете зупинити емуляцію? Увесь незбережений поступ буде втрачено. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9220,41 +9329,41 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. - Гра, яку ви намагаєтеся запустити, потребує прошивку, щоб запуститися або пройти меню запуску. <a href='https://yuzu-mirror.github.io/help/quickstart'>Створіть дамп і встановіть прошивку</a> або натисніть «Гаразд», щоб однаково запустити. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. + - + Installing Firmware... Встановлення прошивки... - - - - - + + + + + Cancel Скасувати - + Firmware Install Failed Не вдалося встановити прошивку - + Firmware Install Succeeded Прошивку успішно встановлено - + Firmware integrity verification failed! Не вдалося перевірити цілісність прошивки! - - + + Verification failed for the following files: %1 @@ -9263,235 +9372,235 @@ p, li { white-space: pre-wrap; } %1 - - + + Verifying integrity... Перевірка цілісності... - - + + Integrity verification succeeded! Перевірка цілісності успішна! - - + + The operation completed successfully. Операцію успішно завершено. - - + + Integrity verification failed! Не вдалося перевірити цілісність! - + File contents may be corrupt or missing. Файли вмісту можуть бути пошкоджені або відсутні. - + Integrity verification couldn't be performed Неможливо виконати перевірку цілісності - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. Встановлення прошивки скасовано. Можливо, прошивка в поганому стані або пошкоджена. Неможливо перевірити на дійсність файли вмісту. - + Select Dumped Keys Location Виберіть розатшування дампу ключів - + Decryption Keys install succeeded Ключі дешифрування успішно встановлено - + Decryption Keys install failed Не вдалося встановити ключі дешифрування - + Orphaned Profiles Detected! Виявлено покинуті профілі! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> ЯКЩО ВИ ЦЕ НЕ ПРОЧИТАЄТЕ, МОЖУТЬ СТАТИСЯ НЕОЧІКУВАНІ ПОГАНІ РЕЧІ!<br>Eden виявив такі теки збережень без прикріпленого профілю:<br>%1<br><br>Є такі дійсні профілі:<br>%2<br><br>Натисніть «ОК», щоб відкрити теку збережень і полагодити свої профілі.<br>Порада: скопіюйте у будь-яке інше місце вміст найбільшої теки, у якій нещодавно були зміни, видаліть профілі, що лишилися та перемістіть скопійований вміст до провильного профілю.<br><br>Досі не розумієте, що робити? Перегляньте <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>сторінку допомоги</a>.<br> - + Really clear data? Дійсно очистити дані? - + Important data may be lost! Може бути втрачено важливі дані! - + Are you REALLY sure? Ви ДІЙСНО впевнені? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. Після видалення ваші дані буде НЕМОЖЛИВО повернути! Виконуйте цю дію, лише якщо ви на 100% упевнені, що хочете видалити ці дані. - + Clearing... Очищення... - + Select Export Location Виберіть розташування для експортування - + %1.zip %1.zip - - - + + + Zipped Archives (*.zip) Zip-архіви (*.zip) - + Exporting data. This may take a while... Експортування даних. Це може тривати певний час... - + Exporting Експортування - + Exported Successfully Успішно експортовано - + Data was exported successfully. Дані успішно експортовано. - + Export Cancelled Експортування скасовано - + Export was cancelled by the user. Експортування скасовано користувачем. - + Export Failed Не вдалося експортувати - + Ensure you have write permissions on the targeted directory and try again. Запевніться, що у вас є дозволи на записування до вказаної теки й спробуйте знову. - + Select Import Location Виберіть розташування для імпортування - + Import Warning Попередження щодо імпортування - + All previous data in this directory will be deleted. Are you sure you wish to proceed? Усі попередні в цій теці будуть видалені. Ви впевнені, що хочете продовжити? - + Importing data. This may take a while... Імпортування даних. Це може тривати певний час... - + Importing Імпортування - + Imported Successfully Успішно імпортовано - + Data was imported successfully. Дані успішно імпортовано. - + Import Cancelled Імпортування скасовано - + Import was cancelled by the user. Імпортування скасовано користувачем. - + Import Failed Не вдалося імпортувати - + Ensure you have read permissions on the targeted directory and try again. Запевніться, що у вас є дозволи на читання зі вказаної теки й спробуйте знову. - + Keys not installed Ключі не встановлено - + Install decryption keys and restart Eden before attempting to install firmware. Встановіть ключі дешифрування та перезапустіть Eden, перш ніж спробувати встановити прошивку. - + Select Dumped Firmware Source Location Виберіть розташування дампу прошивки - + Select Dumped Firmware ZIP Виберіть ZIP із дампом прошивки - + Firmware cleanup failed Не вдалося очистити прошивку - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/vi.ts b/dist/languages/vi.ts index 8821619815..2fc96b21fe 100644 --- a/dist/languages/vi.ts +++ b/dist/languages/vi.ts @@ -571,70 +571,70 @@ FXAA can produce a more stable picture in lower resolutions. - + Fullscreen Mode: Chế độ toàn màn hình: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Tỉ lệ khung hình: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Giả lập NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +643,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: Chế độ Vsync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -699,79 +699,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Bật hiển thị bất đồng bộ (chỉ cho Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) Buộc chạy ở xung nhịp tối đa (chỉ cho Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Chạy các công việc trong nền trong khi đang chờ lệnh đồ họa để giữ cho GPU không giảm xung nhịp. - + Anisotropic Filtering: Lọc bất đẳng hướng: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -781,1327 +781,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Dùng bộ nhớ đệm pipeline Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Bật xả tương ứng - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback Đồng bộ hóa với tốc độ khung hình khi phát video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Chạy game với tốc độ bình thường trong quá trình phát video, ngay cả khi tốc độ khung hình được mở khóa. - + Barrier feedback loops Vòng lặp phản hồi rào cản - + Improves rendering of transparency effects in specific games. Cải thiện hiệu quả kết xuất của hiệu ứng trong suốt trong một số game. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Hạt giống RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Tên thiết bị - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Vùng: - + The region of the console. - + Time Zone: Múi giờ: - + The time zone of the console. - + Sound Output Mode: Chế độ đầu ra âm thanh: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ẩn con trỏ chuột khi không dùng - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Vô hiệu hoá applet tay cầm - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) Không nén (Chất lượng tốt nhất) - + BC1 (Low quality) BC1 (Chất lượng thấp) - + BC3 (Medium quality) BC3 (Chất lượng trung bình) - - + + Auto Tự động - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Chính xác - - - + + + Default Mặc định - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Không an toàn - + Paranoid (disables most optimizations) Paranoid (vô hiệu hoá hầu hết sự tối ưu) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Cửa sổ không viền - + Exclusive Fullscreen Toàn màn hình - + No Video Output Không có đầu ra video - + CPU Video Decoding Giải mã video bằng CPU - + GPU Video Decoding (Default) Giải mã video bằng GPU (Mặc định) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [THỬ NGHIỆM] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [THỬ NGHIỆM] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Không có - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Mặc định (16:9) - + Force 4:3 Dùng 4:3 - + Force 21:9 Dùng 21:9 - + Force 16:10 Dùng 16:10 - + Stretch to Window Mở rộng đến cửa sổ - + Automatic Tự động - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Español) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Nederlands) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh Anh - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Tây Ban Nha Mỹ Latinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha Brasil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4840,6 +4840,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5925,50 +6034,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL không khả dụng! - + OpenGL shared contexts are not supported. Các ngữ cảnh OpenGL chung không được hỗ trợ. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! Lỗi khi khởi tạo OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. GPU của bạn có thể không hỗ trợ OpenGL, hoặc bạn không có driver đồ hoạ mới nhất. - + Error while initializing OpenGL 4.6! Lỗi khi khởi tạo OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 GPU của bạn có thể không hỗ trợ OpenGL 4.6, hoặc bạn không có driver đồ hoạ mới nhất.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 GPU của bạn có thể không hỗ trợ một hoặc nhiều tiện ích OpenGL cần thiết. Vui lòng đảm bảo bạn có driver đồ hoạ mới nhất.<br><br>GL Renderer:<br>%1<br><br>Tiện ích không hỗ trợ:<br>%2 - + This build doesn't have OpenGL support. @@ -6789,42 +6898,42 @@ Debug Message: Đặt lại kích thước cửa sổ về 1080p - + &Multiplayer &Nhiều người chơi - + &Tools &Công cụ - + Am&iibo - + Launch &Applet - + &TAS &TAS - + &Create Home Menu Shortcut - + Install &Firmware - + &Help &Trợ giúp @@ -6850,7 +6959,7 @@ Debug Message: - + &Pause &Tạm dừng @@ -6951,900 +7060,900 @@ Debug Message: - Open &Quickstart Guide - Mở &Hướng dẫn nhanh + &User Handbook + - - &FAQ - &FAQ - - - + &Capture Screenshot &Chụp ảnh màn hình - + &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + &Mii Editor - + &Configure TAS... &Cấu hình TAS... - + Configure C&urrent Game... Cấu hình game h&iện tại... - - + + &Start &Bắt đầu - + &Reset &Đặt lại - - + + R&ecord G&hi lại - + Open &Controller Menu - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7852,74 +7961,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9106,275 +9215,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index fe2cd1d2c7..e81053b393 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -571,70 +571,70 @@ FXAA can produce a more stable picture in lower resolutions. - + Fullscreen Mode: Chế độ Toàn màn hình: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Tỉ lệ khung hình: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Giả lập NVDEC - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +643,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: Chế độ Vsync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -699,79 +699,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Bật hiển thị bất đồng bộ (chỉ dành cho Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) Buộc chạy ở xung nhịp tối đa (chỉ Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Chạy các công việc trong nền trong khi đang chờ lệnh đồ họa để giữ cho GPU không giảm xung nhịp. - + Anisotropic Filtering: Bộ lọc góc nghiêng: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -781,1327 +781,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Dùng Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Bật xả tương ứng - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback Đồng bộ hóa với tốc độ khung hình khi phát video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Chạy game với tốc độ bình thường trong quá trình phát video, ngay cả khi tốc độ khung hình được mở khóa. - + Barrier feedback loops Vòng lặp phản hồi rào cản - + Improves rendering of transparency effects in specific games. Cải thiện hiệu quả hiển thị của hiệu ứng trong suốt trong một số trò chơi. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Hạt giống RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Tên thiết bị - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Vùng: - + The region of the console. - + Time Zone: Múi giờ: - + The time zone of the console. - + Sound Output Mode: Chế độ đầu ra âm thanh - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ẩn con trỏ chuột khi không dùng - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Vô hiệu hoá applet tay cầm - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) Không nén (Chất lượng tốt nhất) - + BC1 (Low quality) BC1 (Chất lượng thấp) - + BC3 (Medium quality) BC3 (Chất lượng trung bình) - - + + Auto Tự động - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Tuyệt đối - - - + + + Default Mặc định - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Tương đối - + Paranoid (disables most optimizations) Paranoid (vô hiệu hoá hầu hết sự tối ưu) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Cửa sổ không viền - + Exclusive Fullscreen Toàn màn hình - + No Video Output Không Video Đầu Ra - + CPU Video Decoding Giải mã video bằng CPU - + GPU Video Decoding (Default) Giải mã video bằng GPU (Mặc định) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [THỬ NGHIỆM] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [THỬ NGHIỆM] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian ScaleForce - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Trống - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Mặc định (16:9) - + Force 4:3 Dùng 4:3 - + Force 21:9 Dùng 21:9 - + Force 16:10 Dung 16:10 - + Stretch to Window Kéo dãn đến cửa sổ phần mềm - + Automatic Tự động - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Spanish) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Dutch) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh UK (British English) - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Mỹ La-tinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha của người Brazil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Châu Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Chế độ cắm TV - + Handheld Cầm tay - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4840,6 +4840,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5925,50 +6034,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! Không có sẵn OpenGL! - + OpenGL shared contexts are not supported. Các ngữ cảnh OpenGL chung không được hỗ trợ. - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! Đã xảy ra lỗi khi khởi tạo OpenGL! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. GPU của bạn có thể không hỗ trợ OpenGL, hoặc bạn không có driver đồ hoạ mới nhất. - + Error while initializing OpenGL 4.6! Lỗi khi khởi tạo OpenGL 4.6! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 GPU của bạn có thể không hỗ trợ OpenGL 4.6, hoặc bạn không có driver đồ hoạ mới nhất.<br><br>GL Renderer:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 GPU của bạn có thể không hỗ trợ một hoặc nhiều tiện ích OpenGL cần thiết. Vui lòng đảm bảo bạn có driver đồ hoạ mới nhất.<br><br>GL Renderer:<br>%1<br><br>Tiện ích không hỗ trợ:<br>%2 - + This build doesn't have OpenGL support. @@ -6789,42 +6898,42 @@ Debug Message: Đặt lại kích thước cửa sổ về 1080p - + &Multiplayer &Nhiều người chơi - + &Tools &Công cụ - + Am&iibo - + Launch &Applet - + &TAS &TAS - + &Create Home Menu Shortcut - + Install &Firmware - + &Help &Trợ giúp @@ -6850,7 +6959,7 @@ Debug Message: - + &Pause &Tạm dừng @@ -6951,900 +7060,900 @@ Debug Message: - Open &Quickstart Guide - Mở &Hướng dẫn nhanh + &User Handbook + - - &FAQ - &FAQ - - - + &Capture Screenshot &Chụp ảnh màn hình - + &Album - + &Set Nickname and Owner - + &Delete Game Data - + &Restore Amiibo - + &Format Amiibo - + &Mii Editor - + &Configure TAS... &Cấu hình TAS... - + Configure C&urrent Game... Cấu hình game hiện tại... - - + + &Start &Bắt đầu - + &Reset &Đặt lại - - + + R&ecord G&hi - + Open &Controller Menu - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7852,74 +7961,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9106,275 +9215,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index ea35dae1ba..2321ff89e0 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -594,12 +594,12 @@ SMAA 提供最佳质量。 FXAA 可以在较低分辨率下产生更稳定的画面。 - + Fullscreen Mode: 全屏模式: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -608,12 +608,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp 独占全屏提供更好的性能和 Freesync/Gsync 支持。 - + Aspect Ratio: 屏幕纵横比: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -622,36 +622,36 @@ Also controls the aspect ratio of captured screenshots. 此设置同时控制捕获截图的高宽比。 - + Use persistent pipeline cache 使用持久管道缓存 - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. 将生成的着色器保存到硬盘,提高后续游戏过程中的着色器加载速度。 请仅在调试时禁用此项。 - + Use asynchronous GPU emulation 使用异步 GPU 模拟 - + Uses an extra CPU thread for rendering. This option should always remain enabled. 使用额外的 CPU 线程进行渲染。 此选项应始终保持启用状态。 - + NVDEC emulation: NVDEC 模拟方式: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -660,12 +660,12 @@ In most cases, GPU decoding provides the best performance. 大多数情况下,使用 GPU 解码将提供最好的性能。 - + ASTC Decoding Method: ASTC 纹理解码方式: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -678,12 +678,12 @@ CPU 异步模拟:使用 CPU 在 ASTC 纹理到达时对其进行解码。 消除 ASTC 解码带来的卡顿,但在解码时可能出现渲染问题。 - + ASTC Recompression Method: ASTC 纹理重压缩方式: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -692,44 +692,44 @@ BC1/BC3: 中间格式将被重新压缩为 BC1 或 BC3 格式,从而节省显存 但会降低图像质量。 - + Frame Pacing Mode (Vulkan only) 帧同步模式 (仅限 Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. 控制模拟器如何管理帧同步,以减少卡顿,使帧率表现更加平稳顺滑。 - + VRAM Usage Mode: VRAM 使用模式: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. 选择模拟器是应优先节省内存还是最大限度地使用可用视频内存以提高性能。 激进模式可能会影响诸如录屏软件等其他应用程序的性能,。 - + Skip CPU Inner Invalidation 跳过 CPU 内部失效处理 - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. 在内存更新期间跳过某些缓存失效,从而降低 CPU 使用率并改善延迟。这可能导致软件崩溃。 - + VSync Mode: 垂直同步模式: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -740,12 +740,12 @@ Mailbox 的延迟可能比 FIFO 低且不会导致撕裂,但可能会丢帧。 Immediate (不同步) 会呈现全部可用内容,并可能出现撕裂。 - + Sync Memory Operations 同步内存操作 - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -754,44 +754,44 @@ Unreal Engine 4 games often see the most significant changes thereof. 虚幻 4 引擎的游戏通常会看到最显著的变化。 - + Enable asynchronous presentation (Vulkan only) 启用异步帧提交 (仅限 Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. 将帧提交移动到单独的 CPU 线程,略微提高性能。 - + Force maximum clocks (Vulkan only) 强制最大时钟 (仅限 Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. 在后台运行的同时等待图形命令,以防止 GPU 降低时钟速度。 - + Anisotropic Filtering: 各向异性过滤: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. 控制在斜角下纹理渲染的质量。 大多数 GPU 上设置为 16 倍是安全的。 - + GPU Mode: GPU 模式: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -799,12 +799,12 @@ Particles tend to only render correctly with Accurate mode. 大多数游戏在“快速”模式下渲染效果良好,但有些游戏仍需使用“精确”模式。而粒子效果通常只有在“精确”模式下才能正确渲染。 - + DMA Accuracy: DMA 精度: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -813,12 +813,12 @@ Default follows the GPU Accuracy setting. 默认使用 GPU 精度设置。 - + GPU Fence Behavior: GPU 围栏行为: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -833,55 +833,55 @@ Default follows the GPU Accuracy setting. 默认遵循 GPU “精确”设定。 - + Enable GPU buffer readback 开启 GPU 缓冲区回读 - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. 通过在上传前读取来保留 GPU 修改的数据。 某些游戏需要这样才能正确渲染某些效果。 - + Enable asynchronous shader compilation 开启异步着色器编译 - + May reduce shader stutter. 可能减少着色器卡顿。 - + GPU Clocks GPU 时钟频率 - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. 通过让游戏误以为 GPU 的处理速度比实际更快,以避免游戏为了适应 Switch 的时钟频率而降低分辨率和渲染距离。 - + GPU Unswizzle GPU 还原 - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. 利用 GPU 计算来加速 BCn 格式 3D 纹理的解码。如果遇到崩溃或画面花屏,请禁用此项。 - + GPU Unswizzle Max Texture Size GPU 还原最大纹理尺寸 - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -890,48 +890,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size GPU 还原流大小 - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. 设置每帧处理的纹理数据最大量(单位:MiB)。 较高的数值可以减少纹理加载时的卡顿,但可能会影响帧率的稳定性(即造成帧时间波动)。 - + GPU Unswizzle Chunk Size GPU 还原块大小 - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. 确定在单次调度(Dispatch)中处理的深度切片(Depth Slices)数量。 增加此数值可以提高高端 GPU 的吞吐量(处理效率),但在性能较弱的硬件上可能会引发 TDR(驱动程序重置)或驱动超时。 - + Use Vulkan pipeline cache 启用 Vulkan 管线缓存 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. 启用 GPU 供应商专用的管线缓存。 在 Vulkan 驱动程序内部不存储管线缓存的情况下,此选项可显著提高着色器加载速度。 - + Enable Compute Pipelines (Intel Vulkan Only) 启用计算管线 (仅限 Intel 显卡 Vulkan 模式) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -940,193 +940,193 @@ Compute pipelines are always enabled on all other drivers. 在所有其他驱动程序上始终启用计算管线。 - + Enable Reactive Flushing 启用反应性刷新 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 使用反应性刷新取代预测性刷新,从而更精确地同步内存。 - + Sync to framerate of video playback 播放视频时帧率同步 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 在视频播放期间以正常速度运行游戏,即使帧率未锁定。 - + Barrier feedback loops 屏障反馈环路 - + Improves rendering of transparency effects in specific games. 改进某些游戏中透明效果的渲染。 - + Enable buffer history 启用缓冲区历史 - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. 允许访问之前的缓冲状态。 这个选项可能会提升某些游戏的渲染质量和性能一致性。 - + Fix bloom effects 修复泛光效果 - + Removes bloom in Burnout. 去除《火爆狂飙》中的泛光特效。 - + Enable Legacy Rescale Pass 启用旧版缩放 - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. 通过依赖之前实现的行为,可能会修复部分游戏的缩放重叠问题。 修复 AMD 和 Intel 显卡上的线条伪影,以及《路易斯洋楼3》中 Nvidia 显卡的灰色纹理闪烁的遗留行为变通方法。 - + Extended Dynamic State 扩展动态状态 - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. 控制在扩展动态状态中可使用的函数数量。更高的数值允许启用更多功能,并可能提升性能,但同时也可能导致额外的图形问题。 - + Vertex Input Dynamic State 顶点输入动态状态 - + Enables vertex input dynamic state feature for better quality and performance. 开启顶点输入动态状态功能来获得更好的质量和性能。 - + Sample Shading 采样着色 - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. 允许片段着色器在多重采样的片段中每个样本执行一次而不是每个片段执行一次。可以提高图形质量,但会降低性能。 更高的值可以提高质量但会降低性能。 - + RNG Seed 随机数生成器种子 - + Controls the seed of the random number generator. Mainly used for speedrunning. 控制随机数生成器的种子。 主要用于竞速游戏。 - + Device Name 设备名称 - + The name of the console. 主机的数量。 - + Homebrew Args 自制软件参数 - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). 启动 homebrew 时需要传递的命令行参数 (例如 -noglsl)。 - + Custom RTC Date: 自定义系统时间: - + This option allows to change the clock of the console. Can be used to manipulate time in games. 此选项允许更改控制台的时钟。 可用于操纵游戏中的时间。 - + The number of seconds from the current unix time 来自当前 unix 时间的秒数。 - + Language: 语言: - + This option can be overridden when region setting is auto-select 当区域设置为自动选择时可以使用此选项替代。 - + Region: 地区: - + The region of the console. 主机的区域。 - + Time Zone: 时区: - + The time zone of the console. 主机的时区。 - + Sound Output Mode: 声音输出模式: - + Console Mode: 控制台模式: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1135,1042 +1135,1042 @@ Setting to Handheld can help improve performance for low end systems. 将设置为掌机模式可以帮助低端系统提高性能。 - + Prompt for user profile on boot 启动时提示选择用户账户 - + Useful if multiple people use the same PC. 在多人使用相同的 PC 时有效。 - + Pause when not in focus 在丢失焦点时暂停 - + Pauses emulation when focusing on other windows. 当焦点位于其它窗口时暂停模拟器。 - + Confirm before stopping emulation 停止模拟时需要确认 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. 替代提示以确认停止模拟。 启用它将绕过此类提示并直接退出模拟。 - + Hide mouse on inactivity 自动隐藏鼠标光标 - + Hides the mouse after 2.5s of inactivity. 在 2.5 秒无活动后隐藏鼠标。 - + Disable controller applet 禁用控制器小程序 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. 强制禁止在模拟程序中使用控制器小程序。 当程序尝试打开控制器小程序时,它会立即被关闭。 - + Check for updates 检查更新 - + Whether or not to check for updates upon startup. 在启动时是否检查更新。 - + Enable Gamemode 启用游戏模式 - + Force X11 as Graphics Backend 强制使用 X11 作为图形后端 - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - + Never 永不 - + On Load 加载时 - + Always 总是 - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不压缩 (最高质量) - + BC1 (Low quality) BC1 (低质量) - + BC3 (Medium quality) BC3 (中等质量) - - + + Auto 自动 - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative 保守模式 - + Aggressive 激进模式 - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (汇编着色器,仅限 NVIDIA 显卡) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (实验性,仅限 AMD/Mesa) - + Null 无 - + Fast 高速 - - - + + + Accurate 高精度 - - - + + + Default 系统默认 - + Unsafe (fast) 不安全(快速) - + Safe (stable) 安全(稳定) - + Immediate 即时 - + Balanced 平衡 - + Strict 严格 - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Debugging 调试 - + Dynarmic 动态编译 - + NCE 本机代码执行 - + Borderless Windowed 无边框窗口 - + Exclusive Fullscreen 独占全屏 - + No Video Output 无视频输出 - + CPU Video Decoding CPU 视频解码 - + GPU Video Decoding (Default) GPU 视频解码 (默认) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [实验性] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [实验性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [实验性] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [实验性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 近邻取样 - + Bilinear 双线性过滤 - + Bicubic 双三线过滤 - + Gaussian 高斯模糊 - + Lanczos Lanczos - + ScaleForce 强制缩放 - + AMD FidelityFX Super Resolution AMD FidelityFX 超级分辨率 - + Area 区域 - + MMPX MMPX - + Zero-Tangent 零切线 - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution 骁龙游戏超级分辨率 - + Snapdragon Game Super Resolution EdgeDir 骁龙游戏超级分辨率 EdgeDir - + None 无 - + FXAA 快速近似抗锯齿 - + SMAA 子像素形态学抗锯齿 - + Default (16:9) 默认 (16:9) - + Force 4:3 强制 4:3 - + Force 21:9 强制 21:9 - + Force 16:10 强制 16:10 - + Stretch to Window 拉伸窗口 - + Automatic 自动 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日语 (日本語) - + American English 美式英语 - + French (français) 法语 (français) - + German (Deutsch) 德语 (Deutsch) - + Italian (italiano) 意大利语 (italiano) - + Spanish (español) 西班牙语 (español) - + Chinese 中文 - + Korean (한국어) 韩语 (한국어) - + Dutch (Nederlands) 荷兰语 (Nederlands) - + Portuguese (português) 葡萄牙语 (português) - + Russian (Русский) 俄语 (Русский) - + Taiwanese 台湾中文 - + British English 英式英语 - + Canadian French 加拿大法语 - + Latin American Spanish 拉美西班牙语 - + Simplified Chinese 简体中文 - + Traditional Chinese (正體中文) 繁体中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙语 (português do Brasil) - + Polish (polska) 波兰语(波兰语) - + Thai (แบบไทย) 泰语 - - + + Japan 日本 - + USA 美国 - + Europe 欧洲 - + Australia 澳大利亚 - + China 中国 - + Korea 韩国 - + Taiwan 台湾地区 - + Auto (%1) Auto select time zone 自动 (%1) - + Default (%1) Default time zone 默认 (%1) - + CET 欧洲中部时间 - + CST6CDT 古巴标准时间&古巴夏令时 - + Cuba 古巴 - + EET 东欧时间 - + Egypt 埃及 - + Eire 爱尔兰 - + EST 东部标准时间 - + EST5EDT 东部标准时间&东部夏令时 - + GB 英国 - + GB-Eire 英国-爱尔兰时间 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 美国夏威夷时间 - + Iceland 冰岛 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙买加 - + Kwajalein 夸贾林环礁 - + Libya 利比亚 - + MET 中欧时间 - + MST 山区标准时间 (北美) - + MST7MDT 山区标准时间&山区夏令时 (北美) - + Navajo 纳瓦霍 - + NZ 新西兰时间 - + NZ-CHAT NZ-CHAT - + Poland 波兰 - + Portugal 葡萄牙 - + PRC 中国标准时间 - + PST8PDT 太平洋标准时间&太平洋夏令时 - + ROC 台湾时间 - + ROK 韩国时间 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界时间 - + UTC 协调世界时 - + W-SU 欧洲-莫斯科时间 - + WET 西欧时间 - + Zulu 祖鲁 - + Mono 单声道 - + Stereo 立体声 - + Surround 环绕声 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (不安全) - + 12GB DRAM (Unsafe) 12GB DRAM (不安全) - + Docked 主机模式 - + Handheld 掌机模式 - - + + Normal 正常 - - + + Boost 升频 - - + + Overclock 超频 - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - + Very Small (16 MB) 很小 (16 MB) - + Small (32 MB) 较小 (32 MB) - + Normal (128 MB) 正常 (128 MB) - + Large (256 MB) 较大 (256 MB) - + Very Large (512 MB) 很大 (512 MB) - + Very Low (4 MB) 很低 (4 MB) - + Low (8 MB) 低 (8 MB) - + Normal (16 MB) 正常 (16 MB) - + Medium (32 MB) 中 (32 MB) - + High (64 MB) 高 (64 MB) - + Very Low (32) 很低 (32) - + Low (64) 低 (64) - + Normal (128) 正常 (128) - + Medium (256) 中(256) - + High (512) 高(512) - + Disabled 禁用 - + ExtendedDynamicState 1 扩展动态状态 1 - + ExtendedDynamicState 2 扩展动态状态 2 - + ExtendedDynamicState 3 扩展动态状态 3 - + Tree View 树景视图 - + Grid View 网格视图 @@ -4913,6 +4913,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t 在文件管理器中打开(&O) + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5999,50 +6108,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! OpenGL 模式不可用! - + OpenGL shared contexts are not supported. 不支持 OpenGL 共享上下文。 - + Eden has not been compiled with OpenGL support. Eden 尚未编译为支持 OpenGL。 - - - + + + Error while initializing OpenGL! 初始化 OpenGL 时出错! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. 您的 GPU 可能不支持 OpenGL ,或者您没有安装最新的显卡驱动。 - + Error while initializing OpenGL 4.6! 初始化 OpenGL 4.6 时出错! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 您的 GPU 可能不支持 OpenGL 4.6 ,或者您没有安装最新的显卡驱动。<br><br>GL 渲染器:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 您的 GPU 可能不支持某些必需的 OpenGL 扩展。请确保您已经安装最新的显卡驱动。<br><br>GL 渲染器:<br>%1<br><br>不支持的扩展:<br>%2 - + This build doesn't have OpenGL support. 此版本不支持 OpenGL。 @@ -6863,42 +6972,42 @@ Debug Message: 重置窗口大小为1080p - + &Multiplayer 多人游戏 (&M) - + &Tools 工具 (&T) - + Am&iibo Am&iibo - + Launch &Applet 启动小程序 (&A) - + &TAS TAS (&T) - + &Create Home Menu Shortcut 创建主页菜单快捷方式(&C) - + Install &Firmware 安装固件(&F) - + &Help 帮助 (&H) @@ -6924,7 +7033,7 @@ Debug Message: - + &Pause 暂停 (&P) @@ -7025,905 +7134,905 @@ Debug Message: - Open &Quickstart Guide - 查看快速导航 (&Q) + &User Handbook + - - &FAQ - FAQ (&F) - - - + &Capture Screenshot 捕获截图 (&C) - + &Album 相册 (&A) - + &Set Nickname and Owner 设置昵称及所有者 (&S) - + &Delete Game Data 删除游戏数据 (&D) - + &Restore Amiibo 重置 Amiibo (&R) - + &Format Amiibo 格式化 Amiibo (&F) - + &Mii Editor Mii 编辑器 (&M) - + &Configure TAS... 配置 TAS... (&C) - + Configure C&urrent Game... 配置当前游戏... (&U) - - + + &Start 开始 (&S) - + &Reset 重置 (&R) - - + + R&ecord 录制 (&E) - + Open &Controller Menu 打开控制器菜单 (&C) - + Install Decryption &Keys 安装解密密钥(&K) - + &Home Menu 主页 (&H) - + &Desktop 桌面(&D) - + &Application Menu 应用程序菜单(&A) - + &Root Data Folder 根数据文件夹(&R) - + &NAND Folder &NAND 文件夹 - + &SDMC Folder &SDMC 文件夹 - + &Mod Folder &Mod 文件夹 - + &Log Folder &Log 文件夹 - + From Folder 从文件夹 - + From ZIP 从 ZIP - + &Eden Dependencies &Eden 依赖项 - + &Data Manager 数据管理器(&D) - + &Tree View 树景视图 (&T) - + &Grid View 网格视图 (&G) - + Game Icon Size 游戏图标大小 - - + + None 无 - + Show Game &Name 显示游戏名称 (&N) - + Show &Performance Overlay 显示性能覆盖层 + + + Post-Processing &Shaders... + + &Carousel View 轮播视图(&C) - + Small (32x32) 小 (32x32) - + Standard (64x64) 标准 (64x64) - + Large (128x128) 大 (128x128) - + Full Size (256x256) 最大 (256x256) - + Broken Vulkan Installation Detected 检测到损坏的 Vulkan 安装 - + Vulkan initialization failed during boot. 在启动时初始化 Vulkan 失败。 - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping 运行游戏 - + Loading Web Applet... 正在加载 Web 小程序... - + Disable Web Applet 禁用 Web 小程序 - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) 禁用网页小程序可能会导致未定义的行为并且应仅在 超级马里奥 3D 全明星中使用。您确定要禁用网页小程序吗? (这可以在调试设置中重新启用。) - + The amount of shaders currently being built 当前正在构建的着色器数量 - + The current selected resolution scaling multiplier. 当前选择的分辨率缩放倍数。 - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. 当前模拟速度。高于或低于 100% 的数值表示模拟运行比 Switch 快或慢。 - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. 游戏当前显示的每秒帧数。这个数值会因游戏和场景的不同而有所变化。 - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 模拟 Switch 一帧所需的时间,不包括帧限制或垂直同步。为了全速模拟这个时间最多应为 16.67 毫秒。 - + Unmute 取消静音 - + Mute 静音 - + Reset Volume 重置音量 - + &Clear Recent Files 清除最近的文件(&C) - + &Continue 继续(&C) - + Warning: Outdated Game Format 警告: 游戏格式过时 - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. 您正在为此游戏使用解包 ROM 目录格式,这是一种已过时的格式,它已被 NCA、NAX、XCI 或 NSP 等其他格式取代。解包 ROM 目录缺少图标、元数据和更新支持。<br>有关 Eden 支持的各种 Switch 格式的说明请查阅我们的用户手册。此消息将不再显示。 - - + + Error while loading ROM! 加载 ROM 时出错! - + The ROM format is not supported. 不支持该 ROM 格式。 - + An error occurred initializing the video core. 初始化视频核心时发生错误。 - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. - Eden 在运行视频核心时遇到了错误。通常这是由于 GPU 驱动程序过时引起的,包括集成显卡驱动程序。有关详细信息,请查看日志。有关如何访问日志的更多信息,请参阅以下页面:<a href="https://yuzu-mirror.github.io/help/reference/log-files/">如何上传日志文件</a>。 + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. + - + Error while loading ROM! %1 %1 signifies a numeric error code. 加载 ROM 时出错! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>请重新导出您的文件,或在 Discord/Stoat 上寻求帮助。 - + An unknown error occurred. Please see the log for more details. 发生未知错误。请查看日志以获取更多详情。 - - + + (64-bit) (64 位) - - + + (32-bit) (32 位) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... 正在关闭软件... - + Save Data 存档数据 - + Mod Data Mod 数据 - + Error Opening %1 Folder 打开 %1 文件夹出错 - - + + Folder does not exist! 文件夹不存在! - + Remove Installed Game Contents? 是否移除已安装的游戏内容? - + Remove Installed Game Update? 是否移除已安装的游戏更新? - + Remove Installed Game DLC? 是否移除已安装的游戏 DLC? - + Remove Entry 删除条目 - + Delete OpenGL Transferable Shader Cache? 要删除 OpenGL 可传输着色器缓存吗? - + Delete Vulkan Transferable Shader Cache? 要删除 Vulkan 可传输着色器缓存吗? - + Delete All Transferable Shader Caches? 删除所有可传输的着色器缓存? - + Remove Custom Game Configuration? 是否移除自定义游戏配置? - + Remove Cache Storage? 要清除缓存存储吗? - + Remove File 删除文件 - + Remove Play Time Data 删除游戏时间数据 - + Reset play time? 要重置播放时间吗? - - + + RomFS Extraction Failed! RomFS 提取失败! - + There was an error copying the RomFS files or the user cancelled the operation. 复制 RomFS 文件时出错或用户取消了操作。 - + Full 完整 - + Skeleton 结构 - + Select RomFS Dump Mode 选择 RomFS 转储模式 - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. 请选择您希望如何导出 RomFS。<br>&quot;完整&quot; 将把所有文件复制到新的目录中,而<br>&quot;结构&quot; 仅会创建目录结构。</br></br> - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root %1 的可用空间不足,无法提取 RomFS。请释放空间或在模拟 > 配置 > 系统 > 文件系统 > 转储根目录,中选择其它目录 - + Extracting RomFS... 正在提取 RomFS... - - + + Cancel 取消 - + RomFS Extraction Succeeded! RomFS 提取成功! - + The operation completed successfully. 操作已成功完成。 - + Error Opening %1 打开 %1 时出错 - + Select Directory 选择目录 - + Properties 属性 - + The game properties could not be loaded. 无法加载游戏属性。 - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch 可执行文件 (%1);;所有文件 (*.*) - + Load File 加载文件 - + Open Extracted ROM Directory 打开已提取的 ROM 目录 - + Invalid Directory Selected 选择的目录无效 - + The directory you have selected does not contain a 'main' file. 您选择的目录不包含 'main' 文件。 - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) 可安装的 Switch 文件 (*.nca *.nsp *.xci);;任天堂内容档案 (*.nca);;任天堂提交包 (*.nsp);;NX 卡带镜像 (*.xci) - + Install Files 安装文件 - + %n file(s) remaining 剩余 %n 个文件 - + Installing file "%1"... 正在安装文件 "%1"... - - + + Install Results 安装结果 - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. 为了避免可能的冲突,我们不鼓励用户将基础游戏安装到 NAND。 请仅使用此功能来安装更新和 DLC。 - + %n file(s) were newly installed 已新安装 %n 个文件 - + %n file(s) were overwritten 已覆盖了 %n 个文件 - + %n file(s) failed to install %n 个文件安装失败 - + System Application 系统应用 - + System Archive 系统档案 - + System Application Update 系统应用更新 - + Firmware Package (Type A) 固件包 (类型 A) - + Firmware Package (Type B) 固件包 (类型 B) - + Game 游戏 - + Game Update 游戏更新 - + Game DLC 游戏可下载内容 - + Delta Title Delta 标题 - + Select NCA Install Type... 选择 NCA 安装类型... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) 请选择您希望将此 NCA 安装为的标题类型: (在大多数情况下,默认的 '游戏' 就可以。) - + Failed to Install 安装失败 - + The title type you selected for the NCA is invalid. 您为 NCA 选择的标题类型无效。 - + File not found 找不到文件 - + File "%1" not found 未找到文件 "%1" - + OK 确定 - + Function Disabled 功能已被关闭 - + Compatibility list reporting is currently disabled. Check back later! 兼容性列表报告目前已被禁用。请稍后再查看! - + Error opening URL 打开网址出错 - + Unable to open the URL "%1". 无法打开 URL "%1"。 - + TAS Recording TAS 录像 - + Overwrite file of player 1? 要覆盖玩家 1 的文件吗? - + Invalid config detected 检测到无效配置 - + Handheld controller can't be used on docked mode. Pro controller will be selected. 手柄在主机模式下无法使用。将选择 Pro 手柄。 - - + + Amiibo Amiibo - - + + The current amiibo has been removed 当前的 amiibo 已被移除 - + Error 错误 - - + + The current game is not looking for amiibos 当前游戏不支持寻找 amiibo - + Amiibo File (%1);; All Files (*.*) Amiibo 文件 (%1);; 所有文件 (*.*) - + Load Amiibo 读取 Amiibo - + Error loading Amiibo data 加载 Amiibo 数据出错 - + The selected file is not a valid amiibo 所选文件不是有效的 amiibo - + The selected file is already on use 所选文件正在使用中 - + An unknown error occurred 发生未知错误 - + No firmware available 没有可用的固件 - + Firmware Corrupted 固件已损坏 - + Unknown applet 未知小程序 - + Applet doesn't map to a known value. 无法识别该小程序对应的值。 - + Record not found 找不到记录程序 - + Applet not found. Please reinstall firmware. 找不到小程序。请重新安装固件。 - + Capture Screenshot 截取屏幕截图 - + PNG Image (*.png) PNG 图像 (*.png) - + TAS state: Running %1/%2 TAS 状态: 正在运行 %1/%2 - + TAS state: Recording %1 TAS 状态: 正在录制 %1 - + TAS state: Idle %1/%2 TAS 状态: 空闲 %1/%2 - + TAS State: Invalid TAS 状态: 无效 - + &Stop Running 停止运行(&S) - + Stop R&ecording 停止录制(&A) - + Building: %n shader(s) 正在编译:%n 个着色器 - + Scale: %1x %1 is the resolution scaling factor 缩放: %1x - + Speed: %1% / %2% 速度: %1% / %2% - + Speed: %1% 速度: %1% - + Game: %1 FPS 游戏: %1 FPS - + Frame: %1 ms 帧: %1 ms - + NO AA 无 AA - + VOLUME: MUTE 音量: 静音 - + VOLUME: %1% Volume percentage (e.g. 50%) 音量: %1% - + Derivation Components Missing 缺少派生组件 - + Decryption keys are missing. Install them now? 缺少解密密钥。现在安装吗? - + Wayland Detected! 检测到 Wayland! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7934,74 +8043,74 @@ Would you like to force it for future launches? 您想要在未来的启动中强制执行吗? - + Use X11 使用 X11 - + Continue with Wayland 继续使用 Wayland - + Don't show again 不再显示 - + Restart Required 需要重新启动 - + Restart Eden to apply the X11 backend. 重新启动 Eden 以应用 X11 后端。 - + Slow 慢速 - + Turbo 加速 - + Unlocked 解锁 - + Select RomFS Dump Target 选择 RomFS 转储目标 - + Please select which RomFS you would like to dump. 请选择您想要转储的 RomFS。 - + Are you sure you want to close Eden? 您确实要关闭 Eden 吗? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. 您确定要停止模拟吗?任何未保存的进度将会丢失。 - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9203,41 +9312,41 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. - 您正尝试启动的游戏需要固件才能启动或通过启动画面打开菜单。请 <a href='https://yuzu-mirror.github.io/help/quickstart'>转储并安装固件</a>, 或点击 "确定" 继续启动。 + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. + - + Installing Firmware... 正在安装固件…… - - - - - + + + + + Cancel 取消 - + Firmware Install Failed 安装固件失败 - + Firmware Install Succeeded 安装固件成功 - + Firmware integrity verification failed! 固件完整性验证失败! - - + + Verification failed for the following files: %1 @@ -9246,235 +9355,235 @@ p, li { white-space: pre-wrap; } %1 - - + + Verifying integrity... 正在验证完整性... - - + + Integrity verification succeeded! 完整性验证成功! - - + + The operation completed successfully. 操作成功完成。 - - + + Integrity verification failed! 完整性验证失败! - + File contents may be corrupt or missing. 文件内容可能缺失或已损坏。 - + Integrity verification couldn't be performed 无法执行完整性验证 - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. 固件安装失败。固件可能处于异常状态或已损坏,无法验证文件内容的有效性。 - + Select Dumped Keys Location 选择导出的密钥文件位置 - + Decryption Keys install succeeded 密钥文件安装成功 - + Decryption Keys install failed 密钥文件安装失败 - + Orphaned Profiles Detected! 检测到孤立的配置文件! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> 如果您不阅读此内容,可能会发生意想不到的糟糕情况!<br>Eden 检测到以下存档目录没有附加的配置文件:<br>%1<br><br>下列配置是有效的:<br>%2<br><br>点击“确定”以打开您的存档文件夹并修复配置文件。<br>提示: 将最大或最近修改的文件夹内容复制到其他地方,删除所有孤立的配置文件,然后将复制的内容移到正确的配置文件中。<br><br>还是感到疑惑? 请查看 <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>帮助页</a>。<br> - + Really clear data? 确实要清除数据吗? - + Important data may be lost! 可能会丢失重要的数据! - + Are you REALLY sure? 您真的确定吗? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. 在删除后,您将无法找回数据! 仅在您 100% 确认要删除此数据时才这样做。 - + Clearing... 正在清除... - + Select Export Location 选择导出位置 - + %1.zip %1.zip - - - + + + Zipped Archives (*.zip) 压缩档案 (*.zip) - + Exporting data. This may take a while... 正在导出数据。这可能需要一些时间... - + Exporting 正在导出 - + Exported Successfully 导出成功 - + Data was exported successfully. 数据已成功导出。 - + Export Cancelled 导出已被取消 - + Export was cancelled by the user. 导出已被用户取消。 - + Export Failed 导出失败 - + Ensure you have write permissions on the targeted directory and try again. 请确认您是否具有目标目录的写入权限然后再次尝试。 - + Select Import Location 选择导入位置 - + Import Warning 导入警告 - + All previous data in this directory will be deleted. Are you sure you wish to proceed? 此目录中的所有先前数据将被删除。您确定要继续吗? - + Importing data. This may take a while... 正在导入数据。这需要一些时间... - + Importing 正在导入 - + Imported Successfully 导入成功 - + Data was imported successfully. 数据已导入成功。 - + Import Cancelled 导入已被取消 - + Import was cancelled by the user. 导入已被用户取消。 - + Import Failed 导入失败 - + Ensure you have read permissions on the targeted directory and try again. 请确认是否您具有目标目录的读取权限然后再次尝试。 - + Keys not installed 未安装密钥 - + Install decryption keys and restart Eden before attempting to install firmware. 在尝试安装固件之前先安装解密密钥并重启 Eden。 - + Select Dumped Firmware Source Location 选择已转储的固件源位置 - + Select Dumped Firmware ZIP 选择已转储的固件 ZIP - + Firmware cleanup failed 清理固件失败 - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index 34190d4db8..3aa6892ac9 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -592,12 +592,12 @@ SMAA的品質最佳 FXAA在低解析度下可以產生較穩定的畫面 - + Fullscreen Mode: 全螢幕模式: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -606,47 +606,47 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp 獨佔全螢幕將提供更好的性能以及更佳的FreeSync/G-Sync支援 - + Aspect Ratio: 長寬比: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. 將產生的著色器快取儲存至硬碟,讓遊戲在後續過程中不需再次產生以提高速度 建議僅在偵錯時才停用此選項 - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC 模擬: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -655,12 +655,12 @@ In most cases, GPU decoding provides the best performance. GPU解碼在大多數情況下提供最好的性能 - + ASTC Decoding Method: ASTC解碼方式: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -669,55 +669,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: ASTC重新壓縮方式: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: VRAM 使用模式: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation 跳過CPU內部失效處理 - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: 垂直同步: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -725,79 +725,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations 同步記憶體操作 - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) 啟用非同步顯示(僅限Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. 透過將畫面顯示移至獨立的CPU執行緒來略微提升性能。 - + Force maximum clocks (Vulkan only) 強制使用最大時脈(僅限Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. 在等待圖形命令時於背景執行任務以防GPU降低時脈 - + Anisotropic Filtering: 各向異性過濾: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -807,1328 +807,1328 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache 启用 Vulkan 管线缓存 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. 启用 GPU 供应商专用的管线缓存。 在 Vulkan 驱动程序内部不存储管线缓存的情况下,此选项可显著提高着色器加载速度。 - + Enable Compute Pipelines (Intel Vulkan Only) 启用计算管线 (仅限 Intel 显卡 Vulkan 模式) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing 启用反应性刷新 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 使用反应性刷新取代预测性刷新,从而更精确地同步内存。 - + Sync to framerate of video playback 播放视频时帧率同步 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 在视频播放期间以正常速度运行游戏,即使帧率未锁定。 - + Barrier feedback loops 屏障反馈循环 - + Improves rendering of transparency effects in specific games. 改进某些游戏中透明效果的渲染。 - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed 隨機種子 - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name 裝置名稱 - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: 自定义系统时间: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: 语言: - + This option can be overridden when region setting is auto-select - + Region: 區域: - + The region of the console. - + Time Zone: 時區: - + The time zone of the console. - + Sound Output Mode: 音訊輸出模式: - + Console Mode: 控制台模式: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation 停止模拟时需要确认 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity 滑鼠閒置時自動隱藏 - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet 禁用控制器程序 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode 启用游戏模式 - + Force X11 as Graphics Backend - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不壓縮 (最高品質) - + BC1 (Low quality) BC1 (低品質) - + BC3 (Medium quality) BC3 (中品質) - - + + Auto 自動 - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative 保守模式(节省 VRAM) - + Aggressive 激进模式 - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null 無 - + Fast - - - + + + Accurate 高精度 - - - + + + Default 預設 - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed 無邊框視窗 - + Exclusive Fullscreen 全螢幕獨占 - + No Video Output 無視訊輸出 - + CPU Video Decoding CPU 視訊解碼 - + GPU Video Decoding (Default) GPU 視訊解碼(預設) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [實驗性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [實驗性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 最近鄰 - + Bilinear 雙線性 - + Bicubic 雙立方 - + Gaussian 高斯 - + Lanczos - + ScaleForce 強制縮放 - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None 無 - + FXAA FXAA - + SMAA SMAA - + Default (16:9) 預設 (16:9) - + Force 4:3 強制 4:3 - + Force 21:9 強制 21:9 - + Force 16:10 強制 16:10 - + Stretch to Window 延伸視窗 - + Automatic 自動 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日文 (日本語) - + American English 美式英语 - + French (français) 法文 (français) - + German (Deutsch) 德文 (Deutsch) - + Italian (italiano) 義大利文 (italiano) - + Spanish (español) 西班牙文 (español) - + Chinese 中文 - + Korean (한국어) 韓文 (한국어) - + Dutch (Nederlands) 荷蘭文 (Nederlands) - + Portuguese (português) 葡萄牙文 (português) - + Russian (Русский) 俄文 (Русский) - + Taiwanese 台灣中文 - + British English 英式英文 - + Canadian French 加拿大法文 - + Latin American Spanish 拉丁美洲西班牙文 - + Simplified Chinese 簡體中文 - + Traditional Chinese (正體中文) 正體中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA 美國 - + Europe 歐洲 - + Australia 澳洲 - + China 中國 - + Korea 南韓 - + Taiwan 台灣 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 預設 (%1) - + CET 中歐 - + CST6CDT CST6CDT - + Cuba 古巴 - + EET EET - + Egypt 埃及 - + Eire 愛爾蘭 - + EST 北美東部 - + EST5EDT EST5EDT - + GB GB - + GB-Eire 英國-愛爾蘭 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 夏威夷 - + Iceland 冰島 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙買加 - + Kwajalein 瓜加林環礁 - + Libya 利比亞 - + MET 中歐 - + MST 北美山區 - + MST7MDT MST7MDT - + Navajo 納瓦霍 - + NZ 紐西蘭 - + NZ-CHAT 紐西蘭-查塔姆群島 - + Poland 波蘭 - + Portugal 葡萄牙 - + PRC 中國 - + PST8PDT 太平洋 - + ROC 臺灣 - + ROK 韓國 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界 - + UTC UTC - + W-SU 莫斯科 - + WET 西歐 - + Zulu 協調世界時 - + Mono 單聲道 - + Stereo 立體聲 - + Surround 環繞音效 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked TV - + Handheld 掌機模式 - - - - Normal - - - Boost + Normal + Boost + + + + + Overclock - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -4866,6 +4866,115 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t + + ConfigurePostProcessing + + + Post-Processing Effects + + + + + ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + + + + + Enable post-processing + + + + + Preset: + + + + + Apply + + + + + Reset Values + + + + + Return every effect to the values the preset ships with. + + + + + Save As... + + + + + Save Preset + + + + + Preset name: + + + + + Delete + + + + + Add Effect + + + + + Custom chain. Pick a preset above and press Apply to replace it. + + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. + + + + + Active preset: %1 + + + + + Enabled + + + + + Disabled + + + + + Reset to defaults + + + + + Effect '%1' was not found. + + + + + Effect failed to compile: +%1 + + + + + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. + + + ConfigureProfileManager @@ -5951,50 +6060,50 @@ Please go to Configure -> System -> Network and make a selection. GRenderWindow - - + + OpenGL not available! 無法使用 OpenGL 模式! - + OpenGL shared contexts are not supported. 不支援 OpenGL 共用的上下文。 - + Eden has not been compiled with OpenGL support. - - - + + + Error while initializing OpenGL! 初始化 OpenGL 時發生錯誤! - + Your GPU may not support OpenGL, or you do not have the latest graphics driver. 您的 GPU 可能不支援 OpenGL,或是未安裝最新的圖形驅動程式 - + Error while initializing OpenGL 4.6! 初始化 OpenGL 4.6 時發生錯誤! - + Your GPU may not support OpenGL 4.6, or you do not have the latest graphics driver.<br><br>GL Renderer:<br>%1 您的 GPU 可能不支援 OpenGL 4.6,或是未安裝最新的圖形驅動程式<br><br>GL 渲染器:<br>%1 - + Your GPU may not support one or more required OpenGL extensions. Please ensure you have the latest graphics driver.<br><br>GL Renderer:<br>%1<br><br>Unsupported extensions:<br>%2 您的 GPU 可能不支援某些必需的 OpenGL 功能。請確保您已安裝最新的圖形驅動程式。<br><br>GL 渲染器:<br>%1<br><br>不支援的功能:<br>%2 - + This build doesn't have OpenGL support. @@ -6814,42 +6923,42 @@ Debug Message: 重設視窗大小為 1080p - + &Multiplayer 多人遊戲 (&M) - + &Tools 工具 (&T) - + Am&iibo - + Launch &Applet - + &TAS TAS (&T) - + &Create Home Menu Shortcut - + Install &Firmware - + &Help 說明 (&H) @@ -6875,7 +6984,7 @@ Debug Message: - + &Pause 暫停(&P) @@ -6976,900 +7085,900 @@ Debug Message: - Open &Quickstart Guide - 快速入門 (&Q) + &User Handbook + - - &FAQ - 常見問題 (&F) - - - + &Capture Screenshot 截圖 (&C) - + &Album - + &Set Nickname and Owner 登錄持有者和暱稱 (&S) - + &Delete Game Data 清除遊戲資料 (&D) - + &Restore Amiibo 復原資料 (&R) - + &Format Amiibo 初始化 Amiibo (&F) - + &Mii Editor - + &Configure TAS... 設定 &TAS… - + Configure C&urrent Game... 目前遊戲設定...(&U) - - + + &Start 開始(&S) - + &Reset 重設 (&R) - - + + R&ecord 錄製 (&E) - + Open &Controller Menu 打开控制器菜单 (&C) - + Install Decryption &Keys - + &Home Menu - + &Desktop - + &Application Menu - + &Root Data Folder - + &NAND Folder - + &SDMC Folder - + &Mod Folder - + &Log Folder - + From Folder - + From ZIP - + &Eden Dependencies - + &Data Manager - + &Tree View - + &Grid View - + Game Icon Size - - + + None - + Show Game &Name - + Show &Performance Overlay + + + Post-Processing &Shaders... + + &Carousel View - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - - Eden has encountered an error while running the video core. This is usually caused by outdated GPU drivers, including integrated ones. Please see the log for more details. For more information on accessing the log, please see the following page: <a href='https://yuzu-mirror.github.io/help/reference/log-files/'>How to Upload the Log File</a>. + + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7877,74 +7986,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9131,275 +9240,275 @@ p, li { white-space: pre-wrap; } - The game you are trying to launch requires firmware to boot or to get past the opening menu. Please <a href='https://yuzu-mirror.github.io/help/quickstart'>dump and install firmware</a>, or press "OK" to launch anyways. + This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + Installing Firmware... - - - - - + + + + + Cancel - + Firmware Install Failed - + Firmware Install Succeeded - + Firmware integrity verification failed! - - + + Verification failed for the following files: %1 - - + + Verifying integrity... + + + + Integrity verification succeeded! + + - Integrity verification succeeded! - - - - - The operation completed successfully. - - + + Integrity verification failed! - + File contents may be corrupt or missing. - + Integrity verification couldn't be performed - + Firmware installation cancelled, firmware may be in a bad state or corrupted. File contents could not be checked for validity. - + Select Dumped Keys Location - + Decryption Keys install succeeded - + Decryption Keys install failed - + Orphaned Profiles Detected! - + UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - + Really clear data? - + Important data may be lost! - + Are you REALLY sure? - + Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. - + Clearing... - + Select Export Location - + %1.zip - - - + + + Zipped Archives (*.zip) - + Exporting data. This may take a while... - + Exporting - + Exported Successfully - + Data was exported successfully. - + Export Cancelled - + Export was cancelled by the user. - + Export Failed - + Ensure you have write permissions on the targeted directory and try again. - + Select Import Location - + Import Warning - + All previous data in this directory will be deleted. Are you sure you wish to proceed? - + Importing data. This may take a while... - + Importing - + Imported Successfully - + Data was imported successfully. - + Import Cancelled - + Import was cancelled by the user. - + Import Failed - + Ensure you have read permissions on the targeted directory and try again. - + Keys not installed - + Install decryption keys and restart Eden before attempting to install firmware. - + Select Dumped Firmware Source Location - + Select Dumped Firmware ZIP - + Firmware cleanup failed - + Failed to clean up extracted firmware cache. Check write permissions in the system temp directory and try again. OS reported error: %1 diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 9895ec011c..44f86d380f 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -1,7 +1,7 @@ - سيشغل هذا البرنامج ألعاب جهاز Nintendo Switch. لا يتضمن البرنامج أي ألعاب أو مفاتيح.

قبل أن تبدأ، يرجى تحديد موقع ملف prod.keys ]]> على وحدة تخزين جهازك.

اعرف المزيد]]>
+ سيعمل هذا البرنامج على تشغيل ألعاب منصة ألعاب «نينتندو سويتش». لا يتضمن البرنامج أي ألعاب أو مفاتيح تفعيل.

قبل البدء، يرجى تحديد موقع ملف prod.keys ]]> في مساحة التخزين بجهازك.

مزيد من المعلومات]]>
الإشعارات والأخطاء عرض الإشعارات عند حدوث خطأ ما. لم يتم منح إذن الإشعار! @@ -291,6 +291,25 @@ أداة جلب برامج تشغيل وحدة المعالجة الرسومية إدارة برامج تشغيل وحدة معالجة الرسومات تثبيت برامج تشغيل بديلة لأداء أو دقة أفضل + تأثيرات ما بعد المعالجة + تأثيرات ReShade FX التي يتم تطبيقها بعد عملية العرض + ضبط تسلسل التأثيرات لهذه اللعبة + إضافة تأثير + إزالة + فتح القائمة + إغلاق القائمة + إزالة التأثيرات + الإعداد مسبقًا نشط. قم بتعديله في «تأثيرات ما بعد المعالجة» قبل بدء اللعبة. + تم تغيير القيم عن الإعداد الأصلي. + الإعدادات المسبقة + إعداد مسبق جديد + يحفظ التأثيرات التي قمت بتحميلها، مع قيمها الحالية، كإعداد مسبق يمكنك اختياره لاحقًا. + قم بتسمية الإعداد المسبق باسم لا يحتوي على علامة يساوي. + لا يوجد إعداد مسبق + حذف الإعداد المسبق + إعادة تعيين القيم المحددة مسبقًا + إعادة التعيين إلى الإعدادات الافتراضية + لم يتم العثور على أي ملفات. ضع ملفات .fx في هذا المجلد: توليد الإطار ضبط إعدادات إنشاء الإطارات لهذه اللعبة قم بإدراج الإطارات المُستكملة بين الإطارات المُعالجة باستخدام تقنية التحجيم بدون فقدان الجودة. يُفرض هذا الخيار عرض الإطارات وفقًا لترتيب FIFO عند تفعيله. @@ -305,6 +324,13 @@ 60 إطارًا في الثانية 90 إطارًا في الثانية 120 إطارًا في الثانية + تشغيل + إيقاف + مستقر + تلقائي + قم بتشغيل أو إيقاف توليد الإطارات واختر مضاعف الإطارات. + توليد إطارات بمعدل إطارات مستهدف. ويتم ضبط المضاعف تلقائيًا. + الدقة المستخدمة لتقدير الحركة بين الإطارات. تقلل القيم المنخفضة من الوقت الذي تستهلكه وحدة معالجة الرسومات. هدف قائمة انتظار الإطارات كم عدد الإطارات المكتملة التي قد تنتظر قبل عرضها؟ تعمل قوائم الانتظار الأكبر حجمًا على امتصاص الارتفاعات المفاجئة في حمل وحدة معالجة الرسومات على حساب زمن انتقال الإدخال. أقل زمن انتقال (بدون تخزين مؤقت) @@ -315,14 +341,14 @@ دقة تقدير الحركة دقة مسار التدفق البصري، كجزء من الناتج. ويُعد خفض هذه القيمة أرخص طريقة لاستعادة الأداء. توليد الإطار غير متاح - لا يدعم برنامج تشغيل وحدة معالجة الرسومات هذا نموذج ذاكرة Vulkan، الذي تتطلبه برامج التظليل الخاصة بـ«Lossless Scaling». + يفتقر برنامج تشغيل وحدة معالجة الرسومات هذا إلى نموذج ذاكرة Vulkan أو دعم الدقة النصفية (float16) التي تتطلبها برامج التظليل الخاصة بـ «Lossless Scaling». اختياري. قم بتوفير ملف Lossless.dll الخاص بك لتمكين إنشاء الإطارات لاحقًا تثبيت ملف Lossless.dll يتطلب إنشاء الإطارات أن تكون لديك نسخة قانونية خاصة بك من ملف Lossless.dll المأخوذ من برنامج Lossless Scaling اختر نسخة أخرى من ملف Lossless.dll توليد الإطارات مدعوم - غير مدعوم (لا يتوفر نموذج ذاكرة Vulkan) + غير مدعوم (لا يتوفر نموذج ذاكرة Vulkan أو float16) Lossless Scaling قم بتوفير نسختك الخاصة من ملف Lossless.dll لتمكين توليد الإطارات مثبت @@ -912,7 +938,7 @@ ملف ROM غير موجود اللعبة تتطلب الفيرموير - نسخ وتثبيت الفيرموير، أو اضغط \"موافق\" للمتابعة على أي حال.]]> + جارٍ البحث عن اللعبة... diff --git a/src/android/app/src/main/res/values-ckb/strings.xml b/src/android/app/src/main/res/values-ckb/strings.xml index eb0c586695..c4b59984c5 100644 --- a/src/android/app/src/main/res/values-ckb/strings.xml +++ b/src/android/app/src/main/res/values-ckb/strings.xml @@ -474,8 +474,6 @@ فایلی ڕۆم بوونی نییە یارییەکە فریموێر پێویستە - فریموێر دامپ بکە و دابنێ, یان پەنجە بنێ سەر \"باشە\" بۆ بەردەوامبوون هەرچۆنێک بێت.]]> - گەڕان بە دوای یارییە... یاری نەدۆزرایەوە بۆ ناسنامەی ناونیشان: %1$s diff --git a/src/android/app/src/main/res/values-cs/strings.xml b/src/android/app/src/main/res/values-cs/strings.xml index 9a914959e5..a8e859cb45 100644 --- a/src/android/app/src/main/res/values-cs/strings.xml +++ b/src/android/app/src/main/res/values-cs/strings.xml @@ -1,7 +1,6 @@ - Tento software umožňuje spouštět hry pro herní konzoli Nintendo Switch. Neobsahuje žádné herní tituly ani klíče.

Nejdříve prosím vyhledejte soubor prod.keys ]]> v úložišti vašeho zařízení.

Další informace]]>
Upozornění a chyby Zobrazí oznámení v případě chyby. Oprávnění k zobrazení oznámení nebylo uděleno! @@ -605,8 +604,6 @@ ROM neexistuje Hra vyžaduje firmware - převezměte a nainstalujte firmware, nebo stiskněte \"OK\" pro pokračování v každém případě.]]> - Hledání hry... Hra nebyla nalezena pro ID titulu: %1$s diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index 42a428143a..6ed158fc72 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -1,7 +1,6 @@ - Diese Software führt Spiele für die Nintendo Switch-Konsole aus. Es sind keine Spiele oder Schlüssel enthalten. Suche, bevor du beginnst, deine prod.keys ]]>-Datei auf deinem Gerät.

Mehr Erfahren]]>
Hinweise und Fehler Zeigt Benachrichtigungen an, wenn etwas schief läuft. Berechtigung für Benachrichtigungen nicht zugelassen! @@ -307,12 +306,10 @@ Ausbalanciert (1 Bild) Flüssigste (2 Bilder) Frame-Generation nicht verfügbar - Dieser GPU-Treiber unterstützt das Vulkan-Memory-Model nicht, welches Lossless Scaling-Shader benötigen. Optional. Stelle deine eigene Lossless.dll zur Verfügung, um Frame-Generation später zu aktivieren. Installiere Lossless.dll Wähle eine andere Kopie von Lossless.dll Unterstützt - Nicht unterstützt (kein Vulkan-Memory-Model) Lossless Scaling Installiert Nicht installiert @@ -811,8 +808,6 @@ Wirklich fortfahren? ROM-Datei existiert nicht Spiel erfordert Firmware - dumpen und installieren Sie Firmware, oder drücken Sie \"OK\", um trotzdem zu starten.]]> - Suche nach Spiel... Spiel nicht gefunden für Titel-ID: %1$s diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index 10031b7441..448d55b92b 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -1,7 +1,6 @@ - Este software arrancará juegos para la consola Nintendo Switch. No se incluyen títulos ni claves de juego.

Antes de continuar, por favor localiza tu archivo en el almacenamiento de tu dispositivo.

Aprender más]]><b>
Avisos y errores Mostrar notificaciones cuando algo vaya mal. ¡Permiso de notificación no concedido! @@ -290,6 +289,9 @@ Obtenedor de controladores de la GPU Gestor de controladores de la GPU Instale los controladores alternativos para obtener un posible mejor rendimiento o precisión + Abrir lista + Cerrar lista + Restablecer a predeterminado Generación de fotograma Configurar la generación de fotogramas para este juego Multiplicador de fotograma @@ -309,7 +311,6 @@ Seleccionar una copia diferente de Lossless.dll Generación de fotograma Soportado - No soportado (sin modelo de memoria de Vulkan) Escalado sin pérdidas Instalado No instalado @@ -783,7 +784,7 @@ Directorio de los datos de guardado Establecer una ruta personalizada para el almacenamiento de los datos de guardado - Restaurar valores predeterminados + Restaurar los valores predeterminados Migrar datos de guardado ¿Desea migrar los datos de guardado existentes a la nueva ubicación\? Datos de guardado migrados con éxito @@ -877,8 +878,6 @@ Archivo ROM no existe El juego requiere firmware - vuelque e instale el firmware, o pulse \"Aceptar\" para continuar de todos modos.]]> - Buscando juego... Juego no encontrado para el ID de título: %1$s diff --git a/src/android/app/src/main/res/values-fr/strings.xml b/src/android/app/src/main/res/values-fr/strings.xml index 582fc33535..7507051dd7 100644 --- a/src/android/app/src/main/res/values-fr/strings.xml +++ b/src/android/app/src/main/res/values-fr/strings.xml @@ -1,7 +1,6 @@ - Ce logiciel permet de jouer à des jeux de la console Nintendo Switch. Aucun titre ni clé de jeu n\'est inclus.

Avant de commencer, veuillez localiser votre fichier prod.keys ]]> sur le stockage de votre appareil.

En savoir plus]]>
Avis et erreurs Affiche des notifications en cas de problème. Permission de notification non accordée ! @@ -785,8 +784,6 @@ Le fichier ROM n\'existe pas Jeu nécessite un firmware - dumper et installer le firmware ou appuyez sur \"OK\" pour continuer quand même.]]> - Recherche du jeu... Jeu non trouvé pour l\'ID de titre : %1$s diff --git a/src/android/app/src/main/res/values-he/strings.xml b/src/android/app/src/main/res/values-he/strings.xml index 9c42d8cbd9..265c38fa82 100644 --- a/src/android/app/src/main/res/values-he/strings.xml +++ b/src/android/app/src/main/res/values-he/strings.xml @@ -510,8 +510,6 @@ קובץ המשחק לא קיים המשחק דורש קושחה - שמור והתקן קושחה או לחץ \"אישור\" כדי להמשיך בכל מקרה.]]> - מחפש משחק... משחק לא נמצא למזהה כותרת: %1$s diff --git a/src/android/app/src/main/res/values-hu/strings.xml b/src/android/app/src/main/res/values-hu/strings.xml index c281e18dea..daa9539756 100644 --- a/src/android/app/src/main/res/values-hu/strings.xml +++ b/src/android/app/src/main/res/values-hu/strings.xml @@ -598,8 +598,6 @@ ROM fájl nem létezik A játék firmware-t igényel - dumpolja és telepítse a firmware-t, vagy nyomja meg az \"OK\" gombot a folytatáshoz.]]> - Játék keresése... A játék nem található a következő címazonosítóhoz: %1$s diff --git a/src/android/app/src/main/res/values-id/strings.xml b/src/android/app/src/main/res/values-id/strings.xml index c507b727fb..6dcb323579 100644 --- a/src/android/app/src/main/res/values-id/strings.xml +++ b/src/android/app/src/main/res/values-id/strings.xml @@ -1,7 +1,6 @@ - Perangkat lunak ini akan menjalankan permainan dari konsol Nintendo Switch. Permainan maupun keys tidak disediakan.

Sebelum memulai, tolong temukan berkas prod.keys ]]> didalam tempat penyimpanan mu.

Pelajari lebih lanjut]]>
Pemberitahuan dan error Menampilkan pemberitahuan ketika terjadi kesalahan. Izin notifikasi tidak diberikan! @@ -638,8 +637,6 @@ Berkas Tidak Ditemukan Game memerlukan firmware - dump dan instal firmware, atau tekan \"OK\" untuk melanjutkan.]]> - Mencari game... Game tidak ditemukan untuk ID Judul: %1$s diff --git a/src/android/app/src/main/res/values-it/strings.xml b/src/android/app/src/main/res/values-it/strings.xml index 18b4faddfc..0b74a74aed 100644 --- a/src/android/app/src/main/res/values-it/strings.xml +++ b/src/android/app/src/main/res/values-it/strings.xml @@ -1,7 +1,6 @@ - Questo software esegue giochi per la console Nintendo Switch. Non sono inclusi titoli di giochi o chiavi.

Prima di iniziare, individua il file prod.keys]]> nella memoria del tuo dispositivo.

Ulteriori informazioni]]>
Avvisi ed errori Mostra le notifiche quando qualcosa va storto. Autorizzazione di notifica non concessa! @@ -662,8 +661,6 @@ Il file della ROM non esiste Firmware richiesto - Esegui il dump del firmware e installalo, o premi \"OK\" per continuare lo stesso.]]> - Ricerca del gioco in corso... Gioco non trovato per l\'ID titolo: %1$s diff --git a/src/android/app/src/main/res/values-ja/strings.xml b/src/android/app/src/main/res/values-ja/strings.xml index 516cf4cb07..4b84e82b3d 100644 --- a/src/android/app/src/main/res/values-ja/strings.xml +++ b/src/android/app/src/main/res/values-ja/strings.xml @@ -508,8 +508,6 @@ ROMファイルが存在しません ゲームにはファームウェアが必要です - ファームウェアをダンプしてインストールするか、\"OK\"を押して続行してください。]]> - ゲームを検索中... タイトルID: %1$s のゲームが見つかりません diff --git a/src/android/app/src/main/res/values-ko/strings.xml b/src/android/app/src/main/res/values-ko/strings.xml index 7bd0b38fee..e9f79165e5 100644 --- a/src/android/app/src/main/res/values-ko/strings.xml +++ b/src/android/app/src/main/res/values-ko/strings.xml @@ -558,8 +558,6 @@ 롬 파일이 존재하지 않음 게임에 펌웨어가 필요합니다 - 펌웨어를 덤프하여 설치하거나 \"확인\"을 눌러 계속 진행하세요.]]> - 게임 검색 중... 타이틀 ID에 대한 게임을 찾을 수 없음: %1$s diff --git a/src/android/app/src/main/res/values-nb/strings.xml b/src/android/app/src/main/res/values-nb/strings.xml index 700ef6106a..a3fc8bad7c 100644 --- a/src/android/app/src/main/res/values-nb/strings.xml +++ b/src/android/app/src/main/res/values-nb/strings.xml @@ -487,8 +487,6 @@ ROM-filen finnes ikke Spillet krever fastvare - dump og installer fastvare, eller trykk \"OK\" for å fortsette likevel.]]> - Søker etter spill... Spill ikke funnet for tittel-ID: %1$s diff --git a/src/android/app/src/main/res/values-pl/strings.xml b/src/android/app/src/main/res/values-pl/strings.xml index f7129fe560..9f49ae5dd0 100644 --- a/src/android/app/src/main/res/values-pl/strings.xml +++ b/src/android/app/src/main/res/values-pl/strings.xml @@ -1,7 +1,6 @@ - To oprogramowanie uruchamia gry na konsoli Nintendo Switch. Żadne tytuły gier ani klucze nie są dołączone.

Zanim zaczniesz, zlokalizuj plik prod.keys ]]> na swoim urządzeniu.

Więcej informacji]]>
Powiadomienia błędy Pokaż powiadomienie gdy coś pójdzie źle Nie zezwolono na powiadomienia! @@ -758,8 +757,6 @@ Plik ROM nie istnieje Gra wymaga oprogramowania sprzętowego - zrzuć i zainstaluj oprogramowanie sprzętowe, lub naciśnij \"OK\", aby kontynuować mimo to.]]> - Wyszukiwanie gry... Nie znaleziono gry dla ID tytułu: %1$s diff --git a/src/android/app/src/main/res/values-pt-rBR/strings.xml b/src/android/app/src/main/res/values-pt-rBR/strings.xml index 335178f90c..533ccbcdf2 100644 --- a/src/android/app/src/main/res/values-pt-rBR/strings.xml +++ b/src/android/app/src/main/res/values-pt-rBR/strings.xml @@ -1,7 +1,6 @@ - Este programa serve para rodar jogos do Nintendo Switch. Nenhum jogo ou chaves do sistema são inclusos

Antes de começar, localize o seu prod.keys ]]> salvo no seu sistema.

Saiba mais]]>
Notificações e erros Mostra notificações quando acontecer um erro. Acesso às notificações não foi permitido! @@ -717,8 +716,6 @@ O arquivo ROM não existe O jogo requer firmware - faça dump e instale o firmware, ou pressione \"OK\" para continuar mesmo assim.]]> - Procurando jogo... Jogo não encontrado para o ID do Título: %1$s diff --git a/src/android/app/src/main/res/values-pt-rPT/strings.xml b/src/android/app/src/main/res/values-pt-rPT/strings.xml index 7ccaed721d..598c80985a 100644 --- a/src/android/app/src/main/res/values-pt-rPT/strings.xml +++ b/src/android/app/src/main/res/values-pt-rPT/strings.xml @@ -609,8 +609,6 @@ uma tentativa de mapeamento automático O ficheiro da ROM não existe O jogo requer firmware - faça dump e instale o firmware, ou pressione \"OK\" para continuar mesmo assim.]]> - A procurar jogo... Jogo não encontrado para o ID do Título: %1$s diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 9a3c97de9d..7a4b6cf91e 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -1,7 +1,7 @@ - Это программное обеспечение предназначено для запуска игр для игровой консоли Nintendo Switch. Игры и ключи в комплект не входят.

Прежде чем начать, пожалуйста, найдите файл prod.keys]]> на вашем устройстве.

Узнать больше]]>
+ Это программное обеспечение предназначено для запуска игр консоли Nintendo Switch. Никакие игры или ключи не входят в комплект.

Перед началом работы найдите файл prod.keys ]]> во внутреннем хранилище вашего устройства.

Узнать больше]]>
Уведомления и ошибки Показывает уведомления, когда что-то пошло не так Вы не предоставили разрешение на уведомления! @@ -291,6 +291,25 @@ Получение драйверов ГПУ Менеджер драйверов ГПУ Установите альтернативные драйверы для потенциально лучшей производительности и/или точности + Эффекты постобработки + Эффекты ReShade FX, применяемые после рендеринга + Настроить цепочку эффектов для этой игры + Добавить эффект + Удалить + Открыть список + Закрыть список + Удалить эффекты + Пресет активен. Отредактируйте его в разделе \"Эффекты постобработки\" перед запуском игры. + Значения изменены относительно исходного пресета. + Пресеты + Новый пресет + Сохраняет загруженные вами эффекты вместе с их текущими значениями в виде пресета, который можно будет выбрать позже. + Дайте пресету имя без знака равенства. + Нет пресета + Удалить пресет + Сбросить значения пресета + Сбросить до значений по умолчанию + Эффекты не найдены. Поместите файлы .fx в эту папку: Генерация кадров Настройка генерации кадров для данной игры Вставляет промежуточные кадры между отрендеренными с помощью Lossless Scaling. При включении принудительно устанавливает режим вывода FIFO. @@ -309,14 +328,12 @@ Разрешение оценки движения Разрешение прохода оптического потока в долях от выходного разрешения. Его понижение — самый дешёвый способ вернуть производительность. Генерация кадров недоступна - Драйвер ГПУ не поддерживает модель памяти Vulkan, требуемую шейдерами Lossless Scaling. Опционально. Укажите свой Lossless.dll для включения генерации кадров позже. Установить Lossless.dll Для генерации кадров требуется ваша собственная легальная копия Lossless.dll из Lossless Scaling Выбрать другой файл Lossless.dll Генерация кадров Поддерживается - Не поддерживается (нет модели памяти Vulkan) Предоставьте свою копию Lossless.dll для включения генерации кадров Установлена Не установлена @@ -613,6 +630,11 @@ Логирование Сбрасывать логи отладки построчно Сбрасывает логи отладки после каждой написанной строки, упрощая отладку в случае сбоев или зависаний. + Включить расширенное логирование + Увеличивает максимальный размер файла журнала со 100 МБ до 1 ГБ. + Фильтр журнала + Управляет категориями журнала Eden. Пример: :Info Service.LM:Debug + Ведение журнала ГПУ Уровень журналирования @@ -896,7 +918,7 @@ Файл ROM не существует Игре требуется прошивка - сохраните и установите прошивку или нажмите \"OK\" для запуска в любом случае.]]> + Поиск игры... diff --git a/src/android/app/src/main/res/values-sr/strings.xml b/src/android/app/src/main/res/values-sr/strings.xml index b5d6476e1b..49641692d9 100644 --- a/src/android/app/src/main/res/values-sr/strings.xml +++ b/src/android/app/src/main/res/values-sr/strings.xml @@ -606,8 +606,6 @@ РОМ датотека не постоји Игра захтева firmware - направите дамп и инсталирајте firmware, или притисните \"OK\" да бисте наставили у сваком случају.]]> - Тражење игре... Игра није пронађена за ID наслова: %1$s diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index 54ce8dfa72..9923fc72c4 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -1,7 +1,6 @@ - Цей застосунок запускає ігри для ігрової консолі Nintendo Switch. Він не містить ігор чи ключів.

Перш ніж почати, укажіть розташування файлу prod.keys ]]> у пам’яті вашого пристрою.

Дізнатися більше]]>
Сповіщення та помилки Показує сповіщення у разі виникнення проблем. Дозвіл на сповіщення не надано! @@ -830,8 +829,6 @@ ROM файлу не існує Гра вимагає прошивки - зробіть дамп і встановіть прошивку, або натисніть \"OK\", щоб продовжити в будь-якому разі.]]> - Пошук гри... Гру не знайдено для ID заголовку: %1$s diff --git a/src/android/app/src/main/res/values-vi/strings.xml b/src/android/app/src/main/res/values-vi/strings.xml index d08d87c64a..06e4551f71 100644 --- a/src/android/app/src/main/res/values-vi/strings.xml +++ b/src/android/app/src/main/res/values-vi/strings.xml @@ -483,8 +483,6 @@ Tệp ROM không tồn tại Trò chơi yêu cầu firmware - dump và cài đặt firmware, hoặc nhấn \"OK\" để tiếp tục dù sao đi nữa.]]> - Đang tìm kiếm trò chơi... Không tìm thấy trò chơi cho ID Tiêu đề: %1$s diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index 03b730f1ed..193d00c3d1 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -1,7 +1,6 @@ - 本软件可以运行Nintendo Switch游戏主机的游戏,但自身并不包含任何游戏或密钥。

请于开始之前选定位于你的设备存储空间中的prod.keys]]>。

了解更多]]>
错误与注意事项 当发生错误时显示通知。 未授予通知权限! @@ -315,14 +314,12 @@ 运动预估分辨率 光流通道的分辨率,以输出的比例表示。降低它是提升性能最经济的做法。 帧生成不可用 - 这个 GPU 驱动不支持无损缩放着色器所需的 Vulkan 内存模型。 作为可选项。请提供您自己的 Lossless.dll 以便在之后可以启用帧生成。 安装 Lossless.dll 帧生成需要您自己从 Lossless Scaling 获得合法的 Lossless.dll 副本 选择其它 Lossless.dll 副本 帧生成 支持 - 不支持 (无 Vulkan 内存模型) 无损缩放 提供您自己的 Lossless.dll 文件以启用帧生成 已安装 @@ -897,8 +894,6 @@ ROM 文件不存在 游戏需要固件 - 转储并安装固件,或点击\"确定\"继续。]]> - 正在搜索游戏... 未找到标题ID的游戏: %1$s diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 63eac94759..0a1c3ba4c2 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -1,7 +1,7 @@ - 本軟體可執行Nintendo Switch主機的遊戲,軟體不提供遊戲和金鑰檔案。<br/> <br/>在開始之前,請先安裝您的 <prod.keys</b> ]]> 檔案,<br /><br />了解更多]]> + 本軟體可執行Nintendo Switch主機的遊戲,軟體不提供遊戲和金鑰檔案。

在開始之前,請先安裝您的 prod.keys ]]> 檔案,了解更多]]>
通知和錯誤 發生錯誤時顯示通知 未授予通知權限! @@ -291,6 +291,25 @@ GPU驅動程式下載器 GPU 驅動程式管理員 安裝替代驅動程式以取得潛在的更佳效能或準確度 + 後製處理效果 + 在渲染完成後套用 ReShade FX 效果 + 為此遊戲設定特殊濾鏡或效果 + 新增效果 + 移除 + 開啟清單 + 收起清單 + 移除效果 + 濾鏡已啟用。請在開啟遊戲前於 後製處理效果 中調整 + 數值已變更,與原始濾鏡設定不同 + 濾鏡 + 新增濾鏡 + 將目前載入的效果及數值儲存為設定檔方便日後使用 + 請為此濾鏡設定檔命名,名稱中不得包含等號且不能與預先提供的設定檔名稱相同 + 無濾鏡 + 刪除濾鏡 + 重設此濾鏡的所有設定值 + 重設為預設值 + 找不到設定檔。請將濾鏡效果的 .fx 檔案放置於此資料夾: 影格生成 調整此遊戲的影格生成設定 使用 Lossless Scaling 在已渲染的影格之間插入補間影格。啟用此功能時,會強制採用 FIFO 垂直同步 @@ -315,10 +334,37 @@ 運動預測解析度 光流處理的解析度,以輸出解析度的比例表示。降低此設定值是減少效能負載最有效的方法 無法使用影格生成 - Lossless Scaling 的著色器需要 Vulkan 記憶體模型,所選的驅動程式不支援該功能 可選擇安裝自己擁有的 Lossless.dll 以在之後啟用影格生成功能 + 安裝 Lossless.dll + 您需要擁有從合法管道獲得的 Lossless Scaling 並從該軟體的資料夾中取得 Lossless.dll 檔案才能使用影格生成功能 + 安裝不同的 Lossless.dll 檔案 + 影格生成 + 支援 + Lossless Scaling + 安裝您擁有的 Lossless.dll 檔案以使用影格生成 + 已安裝 + 未安裝 + 替換 + 刪除 + 刪除已安裝的 Lossless.dll 及預先編譯的著色器 + 影格生成功能會停止運作直到您重新安裝 Lossless.dll 。您的 Lossless.dll 原始檔並不會被 Eden 修改 + Lossless.dll 未安裝 + 前往 設定 -> Lossless Scaling 安裝以使用影格生成功能 + 請先關閉遊戲 + Lossless.dll 無法在遊戲執行時進行更換 + 沒有東西可以刪除 + 尚未安裝 Lossless.dll + 準備影格生成著色器中... + 成功安裝 Lossless.dll + 無法安裝 Lossless.dll + 無法複製選取的檔案 + 無法讀取選取的檔案 + 選取的檔案並不是 Windows 程式庫。請在 Lossless Scaling 的安裝位置(資料夾)中選擇 Lossless.dll + 這個 Lossless.dll 的副本並未包含影格生成著色器。請更新 Lossless Scaling 後再試一次 + 無法轉譯影格生成著色器。尚不支援此 Lossless Scaling 版本 + 轉譯的著色器無法寫入到儲存空間。請確認手機容量是否充足 進階設定 - 進行模擬器設定 + 調整模擬器設定 最近遊玩 最近新增 開啟 Eden 資料夾 @@ -512,7 +558,7 @@ 非同步呈現 此修改可以透過將渲染移至單獨的 CPU 執行緒來提升性能,但可能會導致圖形問題 使用重新啟用排清 - 犧牲效能,以改善部分遊戲的轉譯準確度。 + 犧牲效能,以改善部分遊戲的轉譯準確度 啟用緩衝區歷史 允許存取先前的緩衝區狀態。此選項可能會改善部分遊戲的渲染品質與效能穩定性 啟用 GPU 緩衝區讀回 @@ -525,7 +571,7 @@ GPU 時脈 讓遊戲誤以為 GPU 工作能更快完成,避免遊戲為了配合 Switch 的時脈而降低解析度與渲染距離 跳過CPU內部失效處理 - 在記憶體更新期間跳過某些CPU端快取的失效處理,減少CPU使用率並提高其性能。可能會導致某些遊戲出現故障或當機。 + 在記憶體更新期間跳過某些CPU端快取的失效處理,減少CPU使用率並提高其性能。可能會導致某些遊戲出現故障或當機 修正光暈特效 在 薩爾達傳說:織夢島 和 薩爾達傳說:智慧的再現 中 減少光暈模糊的問題並移除 橫衝直撞:狂飆樂園重製版 中的光暈效果 (Adreno A6XX - A7XX/ Turnip)。警告:可能會在其它遊戲中導致圖形異常 模擬 BGR565 @@ -585,6 +631,11 @@ 日誌 按行寫入偵錯日誌 在每行寫入時重新整理偵錯日誌,讓程式在當機或閃退時更容易偵錯。 + 啟用更詳細的日誌記錄 + 將日誌檔的最大檔案限制從 100MB 提高到 1GB + 日誌過濾器 + 控制 Eden 日誌的紀錄類別。例如: *:Info Service.LM:Debug + GPU 日誌 記錄層級 @@ -709,7 +760,7 @@ 導入失敗 正在取消 安裝 - 獲取 + 下載 刪除 編輯 已成功導入 @@ -734,12 +785,12 @@ 顯示版本 - 獲取失敗 - 獲取過程中發生錯誤 + 下載失敗 + 下載過程中發生錯誤 顯示下載 隱藏下載 快取目錄不可用 - 回應內容為空 + 未回傳任何資料 %1$s 安裝成功 驅動程式安裝失敗 無法安裝 %1$s 驅動程式,您的系統支援此驅動程式嗎? @@ -780,13 +831,21 @@ 成功遷移儲存資料 儲存資料遷移失敗 存檔目錄設定完成 + 所選取的位置已有儲存資料。是否要取代該檔案? + 若要自訂路徑必須授予所有檔案的存取權 + 授予權限 + NAND 路徑 + 設定 NAND 資料的自訂路徑 + 虛擬 SD卡 路徑 + 設定虛擬 SD卡 儲存空間的自訂路徑 + 路徑設定成功 跳過 - 資訊 + 軟體資訊 程式 ID、開發人員及版本資訊 個別遊戲設定 - 編輯此遊戲的特定設定 + 調整此遊戲的專用設定 啟動設定 路徑 程式 ID @@ -821,17 +880,17 @@ 管理此遊戲的儲存資料 刪除儲存資料 刪除此遊戲的所有儲存資料 - 這將會刪除此遊戲的所有儲存資料,且無法復原,您確定要繼續嗎? + 這將會刪除此遊戲的所有儲存資料且無法復原,您確定要繼續嗎? 儲存資料已成功刪除 內容類型 更新及 DLC - 模組及密技 + 模組及金手指 重要的˙附加元件通知 - 若要安裝模組及密技,您必須選擇一個包含 cheats/、romfs/ 或 exefs/ 的目錄。我們無法驗證這些內容是否與您的遊戲相容,所以請謹慎安裝! + 若要安裝模組及金手指,您必須選擇一個包含 cheats/、romfs/ 或 exefs/ 的目錄。我們無法驗證這些內容是否與您的遊戲相容,所以請謹慎安裝! 無效的目錄 - 請確保您選取的目錄包含 cheats/、romfs/ 或 exefs/ 資料夾,然後再試一次。 + 請確保您選取的目錄包含 cheats/、romfs/ 或 exefs/ 資料夾,然後再試一次 附加元件已成功安裝 正在驗證內容… 內容安裝通知 @@ -839,11 +898,12 @@ 確認刪除 您確定要刪除此附加元件嗎? 完整性驗證 + 驗證中... 完整性驗證成功! 完整性驗證失敗! 文件可能已經損壞 - 無法執行完整性驗證 - 未檢查文件的完整性 + 無法正常執行完整性驗證 + 未完成文件完整性檢查 以下文件的完整性驗證失敗:\n %1$s 分享設定 導入設定 @@ -853,13 +913,13 @@ 您的 ROM 已加密 遊戲卡或數位版遊戲。]]> - prod.keys 檔案已安裝,讓遊戲可以解密。]]> + prod.keys 檔案已安裝,讓遊戲可以正常解密]]> 初始化視訊核心時發生錯誤 這經常是因為不相容的 GPU 驅動程式造成,安裝自訂 GPU 驅動程式可能會解決此問題。 ROM 檔案不存在 遊戲需要韌體 - 轉儲並安裝韌體,或點擊\"確定\"繼續。]]> + 正在搜尋遊戲... @@ -881,15 +941,15 @@ 設定寫入失敗 套用設定失敗 設定已存在 - %1$s已存在自訂設定\n\n您要覆寫它嗎?\n\n這個動作無法復原 + %1$s已存在自訂設定\n\n您要取代它嗎?\n\n這個動作無法復原 正在檢查現有設定... - 覆寫已取消 - 覆寫 + 已取消取代該設定 + 取代 - 未安裝所需的驅動程式: %s - 無效的驅動程式檔案: %s - 無可用網路連線。請檢查您的網路連線並重試。 + 未安裝所需的驅動程式: %s + 無效的驅動程式檔案: %s + 無可用網路連線。請檢查您的網路連線並重試 需要GPU驅動程式 這個遊戲的設定需要 \"%s\"驅動程式,而它並沒有安裝在您的裝置上\n\n要下載並安裝此驅動程式嗎? 驅動程式下載已取消。沒有所需的驅動程式無法啟動遊戲。 @@ -901,7 +961,7 @@ 切換控制 相對搖桿中心 方向鍵滑動 - 觸覺回饋技術 + 觸覺回饋 顯示虛擬按鍵 隱藏虛擬按鍵 全部切換 @@ -910,8 +970,9 @@ 不透明度 重設虛擬按鍵 編輯虛擬按鍵 + 對齊網格 暫停模擬 - 取消暫停模擬 + 繼續模擬 疊加層/虛擬按鍵設定 導入Amiibo 觸控螢幕 From 42642f8bad85a3f194c4bf878e512d68791d1634 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 14 Sep 2026 21:56:31 +0200 Subject: [PATCH 040/128] [hle] Implement I{User,Debug,System}::StartDetectionWithFilter (#4425) On fw23 it just uses the same thunk as StartDetection. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4425 Reviewed-by: Maufeat Reviewed-by: CamilleLaVey --- src/core/hle/service/nfp/nfp.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp index b9922ce024..e0c24679ab 100644 --- a/src/core/hle/service/nfp/nfp.cpp +++ b/src/core/hle/service/nfp/nfp.cpp @@ -42,6 +42,7 @@ public: {22, &IUser::GetApplicationAreaSize, "GetApplicationAreaSize"}, {23, &IUser::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, {24, &IUser::RecreateApplicationArea, "RecreateApplicationArea"}, + {25, &IUser::StartDetection, "StartDetectionWithFilter"}, }; // clang-format on @@ -74,6 +75,7 @@ public: {20, &ISystem::GetDeviceState, "GetDeviceState"}, {21, &ISystem::GetNpadId, "GetNpadId"}, {23, &ISystem::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, + {25, &ISystem::StartDetection, "StartDetectionWithFilter"}, {100, &ISystem::Format, "Format"}, {101, &ISystem::GetAdminInfo, "GetAdminInfo"}, {102, &ISystem::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"}, @@ -118,6 +120,7 @@ public: {22, &IDebug::GetApplicationAreaSize, "GetApplicationAreaSize"}, {23, &IDebug::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, {24, &IDebug::RecreateApplicationArea, "RecreateApplicationArea"}, + {25, &IDebug::StartDetection, "StartDetectionWithFilter"}, {100, &IDebug::Format, "Format"}, {101, &IDebug::GetAdminInfo, "GetAdminInfo"}, {102, &IDebug::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"}, From ee73920d288586103491d3e2af003b5c40bf4a1c Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 14 Sep 2026 22:15:54 +0200 Subject: [PATCH 041/128] [hle/services/ssl] Remove deprecated SecureTransport and SChannel backends (#4392) Removes deprecated SecureTransport and SChannel backends, they're dead code. See discussion on #4271 Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4392 Reviewed-by: MaranBr Reviewed-by: crueter --- src/core/CMakeLists.txt | 24 +- .../hle/service/ssl/ssl_backend_schannel.cpp | 563 ------------------ .../ssl/ssl_backend_securetransport.cpp | 236 -------- 3 files changed, 6 insertions(+), 817 deletions(-) delete mode 100644 src/core/hle/service/ssl/ssl_backend_schannel.cpp delete mode 100644 src/core/hle/service/ssl/ssl_backend_securetransport.cpp diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 508ace3501..5c31ebb70e 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -1261,23 +1261,11 @@ if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64 OR ARCHITECTURE_riscv64 OR ARCHITE target_link_libraries(core PRIVATE dynarmic::dynarmic) endif() -target_sources(core PRIVATE hle/service/ssl/ssl_backend_openssl.cpp) - -target_link_libraries(core PRIVATE OpenSSL::SSL OpenSSL::Crypto) - -# TODO - -# elseif (APPLE) -# target_sources(core PRIVATE -# hle/service/ssl/ssl_backend_securetransport.cpp) -# target_link_libraries(core PRIVATE "-framework Security") -# elseif (WIN32) -# target_sources(core PRIVATE -# hle/service/ssl/ssl_backend_schannel.cpp) -# target_link_libraries(core PRIVATE crypt32 secur32) -# else() -# target_sources(core PRIVATE -# hle/service/ssl/ssl_backend_none.cpp) -# endif() +if (TARGET OpenSSL::SSL) + target_sources(core PRIVATE hle/service/ssl/ssl_backend_openssl.cpp) + target_link_libraries(core PRIVATE OpenSSL::SSL OpenSSL::Crypto) +else() + target_sources(core PRIVATE hle/service/ssl/ssl_backend_none.cpp) +endif() create_target_directory_groups(core) diff --git a/src/core/hle/service/ssl/ssl_backend_schannel.cpp b/src/core/hle/service/ssl/ssl_backend_schannel.cpp deleted file mode 100644 index 2b68f29eaf..0000000000 --- a/src/core/hle/service/ssl/ssl_backend_schannel.cpp +++ /dev/null @@ -1,563 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 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 - -#include - -#include "common/error.h" -#include "common/fs/file.h" -#include "common/hex_util.h" -#include "common/string_util.h" - -#include "core/hle/service/ssl/ssl_backend.h" -#include "core/internal_network/network.h" -#include "core/internal_network/sockets.h" - -namespace { - -// These includes are inside the namespace to avoid a conflict on MinGW where -// the headers define an enum containing Network and Service as enumerators -// (which clash with the correspondingly named namespaces). -#define SECURITY_WIN32 -#include -#include -#include - -std::once_flag one_time_init_flag; -bool one_time_init_success = false; - -SCHANNEL_CRED schannel_cred{}; -CredHandle cred_handle; - -static void OneTimeInit() { - schannel_cred.dwVersion = SCHANNEL_CRED_VERSION; - schannel_cred.dwFlags = - SCH_USE_STRONG_CRYPTO | // don't allow insecure protocols - SCH_CRED_NO_SERVERNAME_CHECK | // don't validate server names - SCH_CRED_NO_DEFAULT_CREDS; // don't automatically present a client certificate - // ^ I'm assuming that nobody would want to connect Yuzu to a - // service that requires some OS-provided corporate client - // certificate, and presenting one to some arbitrary server - // might be a privacy concern? Who knows, though. - - const SECURITY_STATUS ret = - AcquireCredentialsHandle(nullptr, const_cast(UNISP_NAME), SECPKG_CRED_OUTBOUND, - nullptr, &schannel_cred, nullptr, nullptr, &cred_handle, nullptr); - if (ret != SEC_E_OK) { - // SECURITY_STATUS codes are a type of HRESULT and can be used with NativeErrorToString. - LOG_ERROR(Service_SSL, "AcquireCredentialsHandle failed: {}", - Common::NativeErrorToString(ret)); - return; - } - - if (getenv("SSLKEYLOGFILE")) { - LOG_CRITICAL(Service_SSL, "SSLKEYLOGFILE was set but Schannel does not support exporting " - "keys; not logging keys!"); - // Not fatal. - } - - one_time_init_success = true; -} - -} // namespace - -namespace Service::SSL { - -class SSLConnectionBackendSchannel final : public SSLConnectionBackend { -public: - Result Init() { - std::call_once(one_time_init_flag, OneTimeInit); - - if (!one_time_init_success) { - LOG_ERROR( - Service_SSL, - "Can't create SSL connection because Schannel one-time initialization failed"); - return ResultInternalError; - } - - return ResultSuccess; - } - - void SetSocket(std::shared_ptr socket_in) override { - socket = std::move(socket_in); - } - - Result SetHostName(const std::string& hostname_in) override { - hostname = hostname_in; - return ResultSuccess; - } - - void SetVerifyOption(u32 option) override { - skip_cert_verification = (option == 0); - LOG_WARNING(Service_SSL, "option={} skip_verification={}", option, - skip_cert_verification); - } - - Result DoHandshake() override { - while (1) { - Result r; - switch (handshake_state) { - case HandshakeState::Initial: - if ((r = FlushCiphertextWriteBuf()) != ResultSuccess || - (r = CallInitializeSecurityContext()) != ResultSuccess) { - return r; - } - // CallInitializeSecurityContext updated `handshake_state`. - continue; - case HandshakeState::ContinueNeeded: - case HandshakeState::IncompleteMessage: - if ((r = FlushCiphertextWriteBuf()) != ResultSuccess || - (r = FillCiphertextReadBuf()) != ResultSuccess) { - return r; - } - if (ciphertext_read_buf.empty()) { - LOG_ERROR(Service_SSL, "SSL handshake failed because server hung up"); - return ResultInternalError; - } - if ((r = CallInitializeSecurityContext()) != ResultSuccess) { - return r; - } - // CallInitializeSecurityContext updated `handshake_state`. - continue; - case HandshakeState::DoneAfterFlush: - if ((r = FlushCiphertextWriteBuf()) != ResultSuccess) { - return r; - } - handshake_state = HandshakeState::Connected; - return ResultSuccess; - case HandshakeState::Connected: - LOG_ERROR(Service_SSL, "Called DoHandshake but we already handshook"); - return ResultInternalError; - case HandshakeState::Error: - return ResultInternalError; - } - } - } - - Result FillCiphertextReadBuf() { - const size_t fill_size = read_buf_fill_size ? read_buf_fill_size : 4096; - read_buf_fill_size = 0; - // This unnecessarily zeroes the buffer; oh well. - const size_t offset = ciphertext_read_buf.size(); - ASSERT_OR_EXECUTE(offset + fill_size >= offset, { return ResultInternalError; }); - ciphertext_read_buf.resize(offset + fill_size, 0); - const auto read_span = std::span(ciphertext_read_buf).subspan(offset, fill_size); - const auto [actual, err] = socket->Recv(0, read_span); - switch (err) { - case Network::Errno::SUCCESS: - ASSERT(static_cast(actual) <= fill_size); - ciphertext_read_buf.resize(offset + actual); - return ResultSuccess; - case Network::Errno::AGAIN: - ciphertext_read_buf.resize(offset); - return ResultWouldBlock; - default: - ciphertext_read_buf.resize(offset); - LOG_ERROR(Service_SSL, "Socket recv returned Network::Errno {}", err); - return ResultInternalError; - } - } - - // Returns success if the write buffer has been completely emptied. - Result FlushCiphertextWriteBuf() { - while (!ciphertext_write_buf.empty()) { - const auto [actual, err] = socket->Send(ciphertext_write_buf, 0); - switch (err) { - case Network::Errno::SUCCESS: - ASSERT(static_cast(actual) <= ciphertext_write_buf.size()); - ciphertext_write_buf.erase(ciphertext_write_buf.begin(), - ciphertext_write_buf.begin() + actual); - break; - case Network::Errno::AGAIN: - return ResultWouldBlock; - default: - LOG_ERROR(Service_SSL, "Socket send returned Network::Errno {}", err); - return ResultInternalError; - } - } - return ResultSuccess; - } - - Result CallInitializeSecurityContext() { - unsigned long req = ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_CONFIDENTIALITY | - ISC_REQ_INTEGRITY | ISC_REQ_REPLAY_DETECT | - ISC_REQ_SEQUENCE_DETECT | ISC_REQ_STREAM | - ISC_REQ_USE_SUPPLIED_CREDS; - - if (skip_cert_verification) { - req |= ISC_REQ_MANUAL_CRED_VALIDATION; - } - - unsigned long attr; - // https://learn.microsoft.com/en-us/windows/win32/secauthn/initializesecuritycontext--schannel - std::array input_buffers{{ - // only used if `initial_call_done` - { - // [0] - .cbBuffer = static_cast(ciphertext_read_buf.size()), - .BufferType = SECBUFFER_TOKEN, - .pvBuffer = ciphertext_read_buf.data(), - }, - { - // [1] (will be replaced by SECBUFFER_MISSING when SEC_E_INCOMPLETE_MESSAGE is - // returned, or SECBUFFER_EXTRA when SEC_E_CONTINUE_NEEDED is returned if the - // whole buffer wasn't used) - .cbBuffer = 0, - .BufferType = SECBUFFER_EMPTY, - .pvBuffer = nullptr, - }, - }}; - std::array output_buffers{{ - { - .cbBuffer = 0, - .BufferType = SECBUFFER_TOKEN, - .pvBuffer = nullptr, - }, // [0] - { - .cbBuffer = 0, - .BufferType = SECBUFFER_ALERT, - .pvBuffer = nullptr, - }, // [1] - }}; - SecBufferDesc input_desc{ - .ulVersion = SECBUFFER_VERSION, - .cBuffers = static_cast(input_buffers.size()), - .pBuffers = input_buffers.data(), - }; - SecBufferDesc output_desc{ - .ulVersion = SECBUFFER_VERSION, - .cBuffers = static_cast(output_buffers.size()), - .pBuffers = output_buffers.data(), - }; - ASSERT_OR_EXECUTE_MSG( - input_buffers[0].cbBuffer == ciphertext_read_buf.size(), - { return ResultInternalError; }, "read buffer too large"); - - bool initial_call_done = handshake_state != HandshakeState::Initial; - if (initial_call_done) { - LOG_DEBUG(Service_SSL, "Passing {} bytes into InitializeSecurityContext", - ciphertext_read_buf.size()); - } - - char* hostname_ptr = hostname ? const_cast(hostname->c_str()) : nullptr; - const SECURITY_STATUS ret = InitializeSecurityContextA( - &cred_handle, initial_call_done ? &ctxt : nullptr, hostname_ptr, req, - 0, // Reserved1 - 0, // TargetDataRep not used with Schannel - initial_call_done ? &input_desc : nullptr, - 0, // Reserved2 - initial_call_done ? nullptr : &ctxt, &output_desc, &attr, - nullptr); // ptsExpiry - - if (output_buffers[0].pvBuffer) { - const std::span span(static_cast(output_buffers[0].pvBuffer), - output_buffers[0].cbBuffer); - ciphertext_write_buf.insert(ciphertext_write_buf.end(), span.begin(), span.end()); - FreeContextBuffer(output_buffers[0].pvBuffer); - } - - if (output_buffers[1].pvBuffer) { - const std::span span(static_cast(output_buffers[1].pvBuffer), - output_buffers[1].cbBuffer); - // The documentation doesn't explain what format this data is in. - LOG_DEBUG(Service_SSL, "Got a {}-byte alert buffer: {}", span.size(), - Common::HexToString(span)); - } - - switch (ret) { - case SEC_I_CONTINUE_NEEDED: - LOG_DEBUG(Service_SSL, "InitializeSecurityContext => SEC_I_CONTINUE_NEEDED"); - if (input_buffers[1].BufferType == SECBUFFER_EXTRA) { - LOG_DEBUG(Service_SSL, "EXTRA of size {}", input_buffers[1].cbBuffer); - ASSERT(input_buffers[1].cbBuffer <= ciphertext_read_buf.size()); - ciphertext_read_buf.erase(ciphertext_read_buf.begin(), - ciphertext_read_buf.end() - input_buffers[1].cbBuffer); - } else { - ASSERT(input_buffers[1].BufferType == SECBUFFER_EMPTY); - ciphertext_read_buf.clear(); - } - handshake_state = HandshakeState::ContinueNeeded; - return ResultSuccess; - case SEC_E_INCOMPLETE_MESSAGE: - LOG_DEBUG(Service_SSL, "InitializeSecurityContext => SEC_E_INCOMPLETE_MESSAGE"); - ASSERT(input_buffers[1].BufferType == SECBUFFER_MISSING); - read_buf_fill_size = input_buffers[1].cbBuffer; - handshake_state = HandshakeState::IncompleteMessage; - return ResultSuccess; - case SEC_E_OK: - LOG_DEBUG(Service_SSL, "InitializeSecurityContext => SEC_E_OK"); - ciphertext_read_buf.clear(); - handshake_state = HandshakeState::DoneAfterFlush; - return GrabStreamSizes(); - default: - LOG_ERROR(Service_SSL, - "InitializeSecurityContext failed (probably certificate/protocol issue): {}", - Common::NativeErrorToString(ret)); - handshake_state = HandshakeState::Error; - return ResultInternalError; - } - } - - Result GrabStreamSizes() { - const SECURITY_STATUS ret = - QueryContextAttributes(&ctxt, SECPKG_ATTR_STREAM_SIZES, &stream_sizes); - if (ret != SEC_E_OK) { - LOG_ERROR(Service_SSL, "QueryContextAttributes(SECPKG_ATTR_STREAM_SIZES) failed: {}", - Common::NativeErrorToString(ret)); - handshake_state = HandshakeState::Error; - return ResultInternalError; - } - return ResultSuccess; - } - - Result Read(size_t* out_size, std::span data) override { - *out_size = 0; - if (handshake_state != HandshakeState::Connected) { - LOG_ERROR(Service_SSL, "Called Read but we did not successfully handshake"); - return ResultInternalError; - } - if (data.size() == 0 || got_read_eof) { - return ResultSuccess; - } - while (1) { - if (!cleartext_read_buf.empty()) { - *out_size = (std::min)(cleartext_read_buf.size(), data.size()); - std::memcpy(data.data(), cleartext_read_buf.data(), *out_size); - cleartext_read_buf.erase(cleartext_read_buf.begin(), - cleartext_read_buf.begin() + *out_size); - return ResultSuccess; - } - if (!ciphertext_read_buf.empty()) { - SecBuffer empty{ - .cbBuffer = 0, - .BufferType = SECBUFFER_EMPTY, - .pvBuffer = nullptr, - }; - std::array buffers{{ - { - .cbBuffer = static_cast(ciphertext_read_buf.size()), - .BufferType = SECBUFFER_DATA, - .pvBuffer = ciphertext_read_buf.data(), - }, - empty, - empty, - empty, - }}; - ASSERT_OR_EXECUTE_MSG( - buffers[0].cbBuffer == ciphertext_read_buf.size(), - { return ResultInternalError; }, "read buffer too large"); - SecBufferDesc desc{ - .ulVersion = SECBUFFER_VERSION, - .cBuffers = static_cast(buffers.size()), - .pBuffers = buffers.data(), - }; - SECURITY_STATUS ret = - DecryptMessage(&ctxt, &desc, /*MessageSeqNo*/ 0, /*pfQOP*/ nullptr); - switch (ret) { - case SEC_E_OK: - ASSERT_OR_EXECUTE(buffers[0].BufferType == SECBUFFER_STREAM_HEADER, - { return ResultInternalError; }); - ASSERT_OR_EXECUTE(buffers[1].BufferType == SECBUFFER_DATA, - { return ResultInternalError; }); - ASSERT_OR_EXECUTE(buffers[2].BufferType == SECBUFFER_STREAM_TRAILER, - { return ResultInternalError; }); - cleartext_read_buf.assign(static_cast(buffers[1].pvBuffer), - static_cast(buffers[1].pvBuffer) + - buffers[1].cbBuffer); - if (buffers[3].BufferType == SECBUFFER_EXTRA) { - ASSERT(buffers[3].cbBuffer <= ciphertext_read_buf.size()); - ciphertext_read_buf.erase(ciphertext_read_buf.begin(), - ciphertext_read_buf.end() - buffers[3].cbBuffer); - } else { - ASSERT(buffers[3].BufferType == SECBUFFER_EMPTY); - ciphertext_read_buf.clear(); - } - continue; - case SEC_E_INCOMPLETE_MESSAGE: - break; - case SEC_I_CONTEXT_EXPIRED: - // Server hung up by sending close_notify. - got_read_eof = true; - *out_size = 0; - return ResultSuccess; - default: - LOG_ERROR(Service_SSL, "DecryptMessage failed: {}", - Common::NativeErrorToString(ret)); - return ResultInternalError; - } - } - const Result r = FillCiphertextReadBuf(); - if (r != ResultSuccess) { - return r; - } - if (ciphertext_read_buf.empty()) { - got_read_eof = true; - *out_size = 0; - return ResultSuccess; - } - } - } - - Result Write(size_t* out_size, std::span data) override { - *out_size = 0; - - if (handshake_state != HandshakeState::Connected) { - LOG_ERROR(Service_SSL, "Called Write but we did not successfully handshake"); - return ResultInternalError; - } - if (data.size() == 0) { - return ResultSuccess; - } - data = data.subspan(0, std::min(data.size(), stream_sizes.cbMaximumMessage)); - if (!cleartext_write_buf.empty()) { - // Already in the middle of a write. It wouldn't make sense to not - // finish sending the entire buffer since TLS has - // header/MAC/padding/etc. - if (data.size() != cleartext_write_buf.size() || - std::memcmp(data.data(), cleartext_write_buf.data(), data.size())) { - LOG_ERROR(Service_SSL, "Called Write but buffer does not match previous buffer"); - return ResultInternalError; - } - return WriteAlreadyEncryptedData(out_size); - } else { - cleartext_write_buf.assign(data.begin(), data.end()); - } - - std::vector header_buf(stream_sizes.cbHeader, 0); - std::vector tmp_data_buf = cleartext_write_buf; - std::vector trailer_buf(stream_sizes.cbTrailer, 0); - - std::array buffers{{ - { - .cbBuffer = stream_sizes.cbHeader, - .BufferType = SECBUFFER_STREAM_HEADER, - .pvBuffer = header_buf.data(), - }, - { - .cbBuffer = static_cast(tmp_data_buf.size()), - .BufferType = SECBUFFER_DATA, - .pvBuffer = tmp_data_buf.data(), - }, - { - .cbBuffer = stream_sizes.cbTrailer, - .BufferType = SECBUFFER_STREAM_TRAILER, - .pvBuffer = trailer_buf.data(), - }, - }}; - ASSERT_OR_EXECUTE_MSG( - buffers[1].cbBuffer == tmp_data_buf.size(), { return ResultInternalError; }, - "temp buffer too large"); - SecBufferDesc desc{ - .ulVersion = SECBUFFER_VERSION, - .cBuffers = static_cast(buffers.size()), - .pBuffers = buffers.data(), - }; - - const SECURITY_STATUS ret = EncryptMessage(&ctxt, /*fQOP*/ 0, &desc, /*MessageSeqNo*/ 0); - if (ret != SEC_E_OK) { - LOG_ERROR(Service_SSL, "EncryptMessage failed: {}", Common::NativeErrorToString(ret)); - return ResultInternalError; - } - ciphertext_write_buf.insert(ciphertext_write_buf.end(), header_buf.begin(), - header_buf.end()); - ciphertext_write_buf.insert(ciphertext_write_buf.end(), tmp_data_buf.begin(), - tmp_data_buf.end()); - ciphertext_write_buf.insert(ciphertext_write_buf.end(), trailer_buf.begin(), - trailer_buf.end()); - return WriteAlreadyEncryptedData(out_size); - } - - Result WriteAlreadyEncryptedData(size_t* out_size) { - const Result r = FlushCiphertextWriteBuf(); - if (r != ResultSuccess) { - return r; - } - // write buf is empty - *out_size = cleartext_write_buf.size(); - cleartext_write_buf.clear(); - return ResultSuccess; - } - - Result GetServerCerts(std::vector>* out_certs) override { - PCCERT_CONTEXT returned_cert = nullptr; - const SECURITY_STATUS ret = - QueryContextAttributes(&ctxt, SECPKG_ATTR_REMOTE_CERT_CONTEXT, &returned_cert); - if (ret != SEC_E_OK) { - LOG_ERROR(Service_SSL, - "QueryContextAttributes(SECPKG_ATTR_REMOTE_CERT_CONTEXT) failed: {}", - Common::NativeErrorToString(ret)); - return ResultInternalError; - } - PCCERT_CONTEXT some_cert = nullptr; - while ((some_cert = CertEnumCertificatesInStore(returned_cert->hCertStore, some_cert)) != - nullptr) { - out_certs->emplace_back(static_cast(some_cert->pbCertEncoded), - static_cast(some_cert->pbCertEncoded) + - some_cert->cbCertEncoded); - } - std::reverse(out_certs->begin(), - out_certs->end()); // Windows returns certs in reverse order from what we want - CertFreeCertificateContext(returned_cert); - return ResultSuccess; - } - - ~SSLConnectionBackendSchannel() { - if (handshake_state != HandshakeState::Initial) { - DeleteSecurityContext(&ctxt); - } - } - - enum class HandshakeState { - // Haven't called anything yet. - Initial, - // `SEC_I_CONTINUE_NEEDED` was returned by - // `InitializeSecurityContext`; must finish sending data (if any) in - // the write buffer, then read at least one byte before calling - // `InitializeSecurityContext` again. - ContinueNeeded, - // `SEC_E_INCOMPLETE_MESSAGE` was returned by - // `InitializeSecurityContext`; hopefully the write buffer is empty; - // must read at least one byte before calling - // `InitializeSecurityContext` again. - IncompleteMessage, - // `SEC_E_OK` was returned by `InitializeSecurityContext`; must - // finish sending data in the write buffer before having `DoHandshake` - // report success. - DoneAfterFlush, - // We finished the above and are now connected. At this point, writing - // and reading are separate 'state machines' represented by the - // nonemptiness of the ciphertext and cleartext read and write buffers. - Connected, - // Another error was returned and we shouldn't allow initialization - // to continue. - Error, - } handshake_state = HandshakeState::Initial; - - CtxtHandle ctxt; - SecPkgContext_StreamSizes stream_sizes; - - std::shared_ptr socket; - std::optional hostname; - - std::vector ciphertext_read_buf; - std::vector ciphertext_write_buf; - std::vector cleartext_read_buf; - std::vector cleartext_write_buf; - - bool got_read_eof = false; - bool skip_cert_verification = false; - size_t read_buf_fill_size = 0; -}; - -Result CreateSSLConnectionBackend(std::unique_ptr* out_backend) { - auto conn = std::make_unique(); - - R_TRY(conn->Init()); - - *out_backend = std::move(conn); - return ResultSuccess; -} - -} // namespace Service::SSL diff --git a/src/core/hle/service/ssl/ssl_backend_securetransport.cpp b/src/core/hle/service/ssl/ssl_backend_securetransport.cpp deleted file mode 100644 index 65f81be631..0000000000 --- a/src/core/hle/service/ssl/ssl_backend_securetransport.cpp +++ /dev/null @@ -1,236 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 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 - -#include - -// SecureTransport has been deprecated in its entirety in favor of -// Network.framework, but that does not allow layering TLS on top of an -// arbitrary socket. -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#include -#pragma GCC diagnostic pop -#endif - -#include "core/hle/service/ssl/ssl_backend.h" -#include "core/internal_network/network.h" -#include "core/internal_network/sockets.h" - -namespace { - -template -struct CFReleaser { - T ptr; - - YUZU_NON_COPYABLE(CFReleaser); - constexpr CFReleaser() : ptr(nullptr) {} - constexpr CFReleaser(T ptr) : ptr(ptr) {} - constexpr operator T() { - return ptr; - } - ~CFReleaser() { - if (ptr) { - CFRelease(ptr); - } - } -}; - -std::string CFStringToString(CFStringRef cfstr) { - CFReleaser cfdata( - CFStringCreateExternalRepresentation(nullptr, cfstr, kCFStringEncodingUTF8, 0)); - ASSERT_OR_EXECUTE(cfdata, { return "???"; }); - return std::string(reinterpret_cast(CFDataGetBytePtr(cfdata)), - CFDataGetLength(cfdata)); -} - -std::string OSStatusToString(OSStatus status) { - CFReleaser cfstr(SecCopyErrorMessageString(status, nullptr)); - if (!cfstr) { - return "[unknown error]"; - } - return CFStringToString(cfstr); -} - -} // namespace - -namespace Service::SSL { - -class SSLConnectionBackendSecureTransport final : public SSLConnectionBackend { -public: - Result Init() { - static std::once_flag once_flag; - std::call_once(once_flag, []() { - if (getenv("SSLKEYLOGFILE")) { - LOG_CRITICAL(Service_SSL, "SSLKEYLOGFILE was set but SecureTransport does not " - "support exporting keys; not logging keys!"); - // Not fatal. - } - }); - - context.ptr = SSLCreateContext(nullptr, kSSLClientSide, kSSLStreamType); - if (!context) { - LOG_ERROR(Service_SSL, "SSLCreateContext failed"); - return ResultInternalError; - } - - OSStatus status; - if ((status = SSLSetIOFuncs(context, ReadCallback, WriteCallback)) || - (status = SSLSetConnection(context, this))) { - LOG_ERROR(Service_SSL, "SSLContext initialization failed: {}", - OSStatusToString(status)); - return ResultInternalError; - } - - return ResultSuccess; - } - - void SetSocket(std::shared_ptr in_socket) override { - socket = std::move(in_socket); - } - - Result SetHostName(const std::string& hostname) override { - OSStatus status = SSLSetPeerDomainName(context, hostname.c_str(), hostname.size()); - if (status) { - LOG_ERROR(Service_SSL, "SSLSetPeerDomainName failed: {}", OSStatusToString(status)); - return ResultInternalError; - } - return ResultSuccess; - } - - void SetVerifyOption(u32 option) override { - skip_cert_verification = (option == 0); - LOG_WARNING(Service_SSL, "option={} skip_verification={}", option, - skip_cert_verification); - if (skip_cert_verification) { - SSLSetSessionOption(context, kSSLSessionOptionBreakOnServerAuth, true); - } - } - - Result DoHandshake() override { - OSStatus status = SSLHandshake(context); - - if (skip_cert_verification && status == errSSLServerAuthCompleted) { - LOG_DEBUG(Service_SSL, "Skipping certificate verification as requested"); - status = SSLHandshake(context); - } - - return HandleReturn("SSLHandshake", 0, status); - } - - Result Read(size_t* out_size, std::span data) override { - OSStatus status = SSLRead(context, data.data(), data.size(), out_size); - return HandleReturn("SSLRead", out_size, status); - } - - Result Write(size_t* out_size, std::span data) override { - OSStatus status = SSLWrite(context, data.data(), data.size(), out_size); - return HandleReturn("SSLWrite", out_size, status); - } - - Result HandleReturn(const char* what, size_t* actual, OSStatus status) { - switch (status) { - case 0: - return ResultSuccess; - case errSSLWouldBlock: - return ResultWouldBlock; - default: { - std::string reason; - if (got_read_eof) { - reason = "server hung up"; - } else { - reason = OSStatusToString(status); - } - LOG_ERROR(Service_SSL, "{} failed: {}", what, reason); - return ResultInternalError; - } - } - } - - Result GetServerCerts(std::vector>* out_certs) override { - CFReleaser trust; - OSStatus status = SSLCopyPeerTrust(context, &trust.ptr); - if (status) { - LOG_ERROR(Service_SSL, "SSLCopyPeerTrust failed: {}", OSStatusToString(status)); - return ResultInternalError; - } - for (CFIndex i = 0, count = SecTrustGetCertificateCount(trust); i < count; i++) { - SecCertificateRef cert = SecTrustGetCertificateAtIndex(trust, i); - CFReleaser data(SecCertificateCopyData(cert)); - ASSERT_OR_EXECUTE(data, { return ResultInternalError; }); - const u8* ptr = CFDataGetBytePtr(data); - out_certs->emplace_back(ptr, ptr + CFDataGetLength(data)); - } - return ResultSuccess; - } - - static OSStatus ReadCallback(SSLConnectionRef connection, void* data, size_t* dataLength) { - return ReadOrWriteCallback(connection, data, dataLength, true); - } - - static OSStatus WriteCallback(SSLConnectionRef connection, const void* data, - size_t* dataLength) { - return ReadOrWriteCallback(connection, const_cast(data), dataLength, false); - } - - static OSStatus ReadOrWriteCallback(SSLConnectionRef connection, void* data, size_t* dataLength, - bool is_read) { - auto self = - static_cast(const_cast(connection)); - ASSERT_OR_EXECUTE_MSG( - self->socket, { return 0; }, "SecureTransport asked to {} but we have no socket", - is_read ? "read" : "write"); - - // SecureTransport callbacks (unlike OpenSSL BIO callbacks) are - // expected to read/write the full requested dataLength or return an - // error, so we have to add a loop ourselves. - size_t requested_len = *dataLength; - size_t offset = 0; - while (offset < requested_len) { - std::span cur(reinterpret_cast(data) + offset, requested_len - offset); - auto [actual, err] = is_read ? self->socket->Recv(0, cur) : self->socket->Send(cur, 0); - LOG_CRITICAL(Service_SSL, "op={}, offset={} actual={}/{} err={}", is_read, offset, - actual, cur.size(), static_cast(err)); - switch (err) { - case Network::Errno::SUCCESS: - offset += actual; - if (actual == 0) { - ASSERT(is_read); - self->got_read_eof = true; - return errSecEndOfData; - } - break; - case Network::Errno::AGAIN: - *dataLength = offset; - return errSSLWouldBlock; - default: - LOG_ERROR(Service_SSL, "Socket {} returned Network::Errno {}", - is_read ? "recv" : "send", err); - return errSecIO; - } - } - ASSERT(offset == requested_len); - return 0; - } - -private: - CFReleaser context = nullptr; - bool got_read_eof = false; - bool skip_cert_verification = false; - - std::shared_ptr socket; -}; - -Result CreateSSLConnectionBackend(std::unique_ptr* out_backend) { - auto conn = std::make_unique(); - - R_TRY(conn->Init()); - - *out_backend = std::move(conn); - return ResultSuccess; -} - -} // namespace Service::SSL From bfba95fd6072885b16aa3b52b450d4058cc871d6 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Mon, 14 Sep 2026 23:53:44 +0200 Subject: [PATCH 042/128] [ns, olsc] stubs for qlaunch fw23 (#4427) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- These two stubs fix freezes, in the description and when closing the game. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4427 Reviewed-by: Maufeat Reviewed-by: lizzie --- src/core/hle/service/ns/application_manager_interface.cpp | 6 ++++++ src/core/hle/service/ns/application_manager_interface.h | 1 + .../ns/read_only_application_control_data_interface.cpp | 2 +- .../hle/service/olsc/transfer_task_list_controller.cpp | 7 ++++++- src/core/hle/service/olsc/transfer_task_list_controller.h | 1 + 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/core/hle/service/ns/application_manager_interface.cpp b/src/core/hle/service/ns/application_manager_interface.cpp index c3b2aee8a8..8f21244439 100644 --- a/src/core/hle/service/ns/application_manager_interface.cpp +++ b/src/core/hle/service/ns/application_manager_interface.cpp @@ -476,6 +476,7 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_ {4096, nullptr, "Unknown4096"}, //20.0.0+ {4097, nullptr, "Unknown4097"}, //20.0.0+ {4099, nullptr, "Unknown4099"}, //21.0.0+ + {4105, D<&IApplicationManagerInterface::Unknown4105>, "Unknown4105"}, //23.0.0+ {5000, nullptr, "Unknown5000"}, //18.0.0+ {5001, nullptr, "Unknown5001"}, //18.0.0+ {9999, nullptr, "GetApplicationCertificate"}, //10.0.0-10.2.0 @@ -866,6 +867,11 @@ Result IApplicationManagerInterface::Unknown4053() { R_SUCCEED(); } +Result IApplicationManagerInterface::Unknown4105() { + LOG_WARNING(Service_NS, "(STUBBED) called."); + R_SUCCEED(); +} + void IApplicationManagerInterface::PushApplicationRecord(HLERequestContext& ctx) { const auto record = ctx.ReadBuffer(); u64 application_id{}; diff --git a/src/core/hle/service/ns/application_manager_interface.h b/src/core/hle/service/ns/application_manager_interface.h index f09ccf7b81..52858f03f8 100644 --- a/src/core/hle/service/ns/application_manager_interface.h +++ b/src/core/hle/service/ns/application_manager_interface.h @@ -72,6 +72,7 @@ public: Result Unknown4022(OutCopyHandle out_event); Result Unknown4023(Out out_result); Result Unknown4053(); + Result Unknown4105(); Result RequestDownloadApplicationControlDataInBackground(u64 control_source, u64 application_id); diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp index fb3b627585..baf28b9b5c 100644 --- a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp +++ b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp @@ -142,7 +142,7 @@ IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterfa {10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"}, {13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"}, {19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, - {23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, + {23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, //23.0.0+ }; // clang-format on diff --git a/src/core/hle/service/olsc/transfer_task_list_controller.cpp b/src/core/hle/service/olsc/transfer_task_list_controller.cpp index 0f9042bf01..95e41cdb51 100644 --- a/src/core/hle/service/olsc/transfer_task_list_controller.cpp +++ b/src/core/hle/service/olsc/transfer_task_list_controller.cpp @@ -36,7 +36,7 @@ ITransferTaskListController::ITransferTaskListController(Core::System& system_) {18, nullptr, "ListTransferTaskInfo"}, {19, nullptr, "DeleteTransferTask"}, {20, nullptr, "RaiseTransferTaskPriority"}, - {21, nullptr, "GetTransferTaskProgress"}, + {21, D<&ITransferTaskListController::GetTransferTaskProgress>, "GetTransferTaskProgress"}, //10.1.0+ {22, nullptr, "GetTransferTaskLastResult"}, {23, nullptr, "SuspendTransferTask"}, {24, D<&ITransferTaskListController::GetCurrentTransferTaskInfo>, "GetCurrentTransferTaskInfo"}, @@ -82,6 +82,11 @@ Result ITransferTaskListController::GetCurrentTransferTaskInfo(Out> out_info, InBuffer in) { LOG_WARNING(Service_OLSC, "(STUBBED) called, in_size={}", in.size()); diff --git a/src/core/hle/service/olsc/transfer_task_list_controller.h b/src/core/hle/service/olsc/transfer_task_list_controller.h index 4ac770b477..5f3429879a 100644 --- a/src/core/hle/service/olsc/transfer_task_list_controller.h +++ b/src/core/hle/service/olsc/transfer_task_list_controller.h @@ -24,6 +24,7 @@ private: Result GetTransferTaskStartEventNativeHandleHolder(Out> out_holder); Result StopNextTransferTaskExecution(Out> out_stopper); Result GetTransferTaskCount(Out out_count, u8 unknown); + Result GetTransferTaskProgress(); Result GetCurrentTransferTaskInfo(Out> out_info, u8 unknown); Result FindTransferTaskInfo(Out> out_info, InBuffer in); }; From 1575f55abee50a563502e5afb098ebed9d5d8995 Mon Sep 17 00:00:00 2001 From: Exverge Date: Tue, 15 Sep 2026 01:14:31 +0200 Subject: [PATCH 043/128] [dynarmic] fix sign extension logic on x64 (#4415) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Co-authored-by: lizzie Co-authored-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4415 Reviewed-by: lizzie Reviewed-by: MaranBr --- .../src/dynarmic/backend/x64/emit_x64_memory.h | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h index 9686e4fc04..54ad638ada 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h @@ -85,8 +85,13 @@ template<> code.mov(tmp, vaddr); code.shr(tmp, int(page_table_const_bits)); - code.shl(tmp, int(ctx.conf.page_table_log2_stride)); - code.mov(page, qword[r14 + tmp.cvt64()]); + + if (ctx.conf.page_table_log2_stride > 3) { + code.shl(tmp, int(ctx.conf.page_table_log2_stride)); + code.mov(page, qword[r14 + tmp.cvt64()]); + } else { + code.mov(page, qword[r14 + tmp.cvt64() * int(ctx.conf.page_table_log2_stride)]); + } // check for marked bit, use as unmapped if marked if (ctx.conf.page_table_marked_bit) { @@ -102,9 +107,10 @@ template<> code.mov(tmp, ctx.conf.page_table_pointer_mask); code.and_(page, tmp); } + // check for sign bit, apply sign extension as needed if (ctx.conf.page_table_sign_extension) { - code.shl(page, *ctx.conf.page_table_sign_extension); - code.sar(page, *ctx.conf.page_table_sign_extension); + code.shl(page, 63 - int(*ctx.conf.page_table_sign_extension)); + code.sar(page, 63 - int(*ctx.conf.page_table_sign_extension)); } code.jz(abort, code.T_NEAR); From 505b1576470796db7e6d561f62ac392f613b9797 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Tue, 15 Sep 2026 03:42:11 +0200 Subject: [PATCH 044/128] [qt common] use ConfigurationShared translation context (#4430) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4430 Reviewed-by: crueter Reviewed-by: CamilleLaVey --- src/qt_common/config/shared_translation.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index be2f986eaf..0db439691f 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -23,7 +23,7 @@ namespace ConfigurationShared { std::unique_ptr InitializeTranslations(QObject* parent) { std::unique_ptr translations = std::make_unique(); - const auto& tr = [parent](const char* text) -> QString { return parent->tr(text); }; + const auto& tr = [](const char* text) -> QString { return QCoreApplication::translate("ConfigurationShared", text); }; #define INSERT(SETTINGS, ID, NAME, TOOLTIP) \ translations->insert(std::pair{SETTINGS::values.ID.Id(), std::pair{(NAME), (TOOLTIP)}}) @@ -368,8 +368,8 @@ std::unique_ptr InitializeTranslations(QObject* parent) { std::unique_ptr ComboboxEnumeration(QObject* parent) { std::unique_ptr translations = std::make_unique(); - const auto& tr = [&](const char* text, const char* context = "") { - return parent->tr(text, context); + const auto& tr = [](const char* text, const char* context = "") { + return QCoreApplication::translate("ConfigurationShared", text, context); }; #define PAIR(ENUM, VALUE, TRANSLATION) {static_cast(Settings::ENUM::VALUE), (TRANSLATION)} From 10c07d700c33fa1ff78d5f616c2da2872fc5d43f Mon Sep 17 00:00:00 2001 From: crueter Date: Tue, 15 Sep 2026 07:22:23 +0200 Subject: [PATCH 045/128] [cmake] Use a debloated boost distribution (#4198) This addresses another issue that caused Windows configure time to take significantly longer than other platforms. Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4198 Reviewed-by: CamilleLaVey Reviewed-by: lizzie --- .patch/boost/0001-clang-cl.patch | 13 ------------- CMakeLists.txt | 10 +++------- cpmfile.json | 15 ++++++--------- 3 files changed, 9 insertions(+), 29 deletions(-) delete mode 100644 .patch/boost/0001-clang-cl.patch diff --git a/.patch/boost/0001-clang-cl.patch b/.patch/boost/0001-clang-cl.patch deleted file mode 100644 index cdabc712cb..0000000000 --- a/.patch/boost/0001-clang-cl.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/libs/cobalt/include/boost/cobalt/concepts.hpp b/libs/cobalt/include/boost/cobalt/concepts.hpp -index d49f2ec..a9bdb80 100644 ---- a/libs/cobalt/include/boost/cobalt/concepts.hpp -+++ b/libs/cobalt/include/boost/cobalt/concepts.hpp -@@ -62,7 +62,7 @@ struct enable_awaitables - template - concept with_get_executor = requires (T& t) - { -- {t.get_executor()} -> asio::execution::executor; -+ t.get_executor(); - }; - - diff --git a/CMakeLists.txt b/CMakeLists.txt index 266331b0ac..f647204a4b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -417,12 +417,9 @@ AddJsonPackage(boost) set(BOOST_NO_HEADERS ${Boost_ADDED}) if (Boost_ADDED) - if (MSVC OR ANDROID) - add_compile_definitions(YUZU_BOOST_v1) - endif() - + add_compile_definitions(YUZU_BOOST_v1) if (NOT MSVC OR CXX_CLANG) - # boost sucks + # solaris sucks if (SOLARIS) add_compile_options($<$:-pthreads>) endif() @@ -431,8 +428,7 @@ if (Boost_ADDED) target_compile_options(boost_icl INTERFACE $<$:-Wno-shadow>) target_compile_options(boost_asio INTERFACE $<$:-Wno-conversion> - $<$:-Wno-implicit-fallthrough> - ) + $<$:-Wno-implicit-fallthrough>) endif() endif() diff --git a/cpmfile.json b/cpmfile.json index 8b2099f40a..f574bf5668 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -6,22 +6,19 @@ "version": "v0.19.0" }, "boost": { - "artifact": "%VERSION%-cmake.tar.xz", + "artifact": "boost-%VERSION%.tar.zst", "find_args": "CONFIG OPTIONAL_COMPONENTS headers context system fiber filesystem", - "hash": "6ae6e94664fe7f2fb01976b59b276ac5df8085c7503fa829d810fbfe495960cfec44fa2c36e2cb23480bc19c956ed199d4952b02639a00a6c07625d4e7130c2d", + "hash": "681d97be4386767662e230b2e7c9754d45e709cc5db4e747c23c27d1f5b0e87770bdf19b0bc44dcb0e8349324887bbb8fffb432098f4d0ce74a5043021a90afc", "min_version": "1.57", "package": "Boost", - "patches": [ - "0001-clang-cl.patch" - ], - "repo": "boostorg/boost", - "version": "boost-1.90.0" + "repo": "eden-emulator/ext-boost", + "version": "1.92.0" }, "boost_headers": { "bundled": true, - "hash": "4ef845775e2277a8104ded6ddf749aa262ce52cf8438042869a048f9a0156dd772fbbcfa74efa1378fecef339b7286f6fe4b4feb5c45d49966b35d08e3e83507", + "hash": "c5fa2cd72f6e6666b7963b97bc359c75284b8fb540c30f3629a028b85270c9bc66c8a051383964f2bd4c1e005a4691593d15696e7ef39ea87cf6cff9e5691fb2", "repo": "boostorg/headers", - "version": "boost-1.90.0" + "version": "boost-1.91.0" }, "catch2": { "hash": "7eea385d79d88a5690cde131fe7ccda97d5c54ea09d6f515000d7bf07c828809d61c1ac99912c1ee507cf933f61c1c47ecdcc45df7850ffa82714034b0fccf35", From c5405250d179824cdcd55d2dbd0a484f516490af Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Tue, 15 Sep 2026 07:23:12 +0200 Subject: [PATCH 046/128] [common, ui] Refining UI for FX shaders for PC (#4426) Self-explanatory refinements on the already existing access/usage of post-processing shaders on Eden for PC UI. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4426 Reviewed-by: MaranBr Reviewed-by: lizzie --- src/qt_common/config/shared_translation.cpp | 3 + src/yuzu/configuration/configure_graphics.cpp | 27 +++++++++ .../configure_post_processing.cpp | 36 +++++++----- src/yuzu/main_window.cpp | 57 +++++++++++++++++++ src/yuzu/main_window.h | 2 + 5 files changed, 110 insertions(+), 15 deletions(-) diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index 0db439691f..4ef97c602a 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -151,6 +151,9 @@ std::unique_ptr InitializeTranslations(QObject* parent) { tr("The anti-aliasing method to use.\nSMAA offers the best quality.\nFXAA " "can produce a more stable picture in lower resolutions.")); INSERT(Settings, post_shader_chain, QString(), QString()); + INSERT(Settings, post_shader_preset, QString(), QString()); + INSERT(Settings, post_shader_enabled, tr("Enable post-processing effects"), + tr("Applies post-processing effects to the final image.")); INSERT(Settings, fullscreen_mode, tr("Fullscreen Mode:"), tr("The method used to render the window in fullscreen.\nBorderless offers the best " "compatibility with the on-screen keyboard that some games request for " diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index f294403397..641f65d82a 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp @@ -37,6 +37,10 @@ #include "yuzu/configuration/configure_graphics.h" #include "yuzu/configuration/shared_widget.h" +#ifdef HAS_RESHADE +#include "yuzu/configuration/configure_post_processing.h" +#endif + ConfigureGraphics::ConfigureGraphics( const Core::System& system_, std::vector& records_, const std::function& expose_compute_option_, @@ -216,6 +220,12 @@ void ConfigureGraphics::Setup(const ConfigurationShared::Builder& builder) { std::vector hold_api; for (const auto setting : Settings::values.linkage.by_category[Settings::Category::Renderer]) { +#ifndef HAS_RESHADE + if (setting->Id() == Settings::values.post_shader_enabled.Id()) { + continue; + } +#endif + ConfigurationShared::Widget* widget = [&]() { if (setting->Id() == Settings::values.fsr_sharpening_slider.Id()) { // FSR needs a reversed slider and a 0.5 multiplier @@ -295,6 +305,23 @@ void ConfigureGraphics::Setup(const ConfigurationShared::Builder& builder) { // Keep track of the resolution combobox to update other UI tabs that need it resolution_combobox = widget->combobox; hold_graphics.emplace(setting->Id(), widget); +#ifdef HAS_RESHADE + } else if (setting->Id() == Settings::values.post_shader_enabled.Id()) { + QPushButton* post_shader_button = new QPushButton(tr("Configure Effects..."), widget); + post_shader_button->setVisible(widget->checkbox->isChecked()); + + connect(post_shader_button, &QAbstractButton::clicked, this, [this]() { + ConfigurePostProcessing dialog(this); + dialog.exec(); + }); + connect(widget->checkbox, &QCheckBox::toggled, post_shader_button, + &QWidget::setVisible); + + QBoxLayout* row = qobject_cast(widget->layout()); + row->insertWidget(1, post_shader_button); + + hold_graphics.emplace(setting->Id(), widget); +#endif } else { hold_graphics.emplace(setting->Id(), widget); } diff --git a/src/yuzu/configuration/configure_post_processing.cpp b/src/yuzu/configuration/configure_post_processing.cpp index 6fe46da6c5..659c3618f2 100644 --- a/src/yuzu/configuration/configure_post_processing.cpp +++ b/src/yuzu/configuration/configure_post_processing.cpp @@ -70,10 +70,8 @@ ConfigurePostProcessing::ConfigurePostProcessing(QWidget* parent) : QDialog(pare auto* root = new QVBoxLayout(this); - auto* description = new QLabel( - tr("ReShade FX effects are loaded from the post_shaders folder in the Eden data " - "directory. Changes apply immediately while a game is running."), - this); + auto* description = + new QLabel(tr("Changes apply immediately while a game is running."), this); description->setWordWrap(true); root->addWidget(description); @@ -128,17 +126,15 @@ ConfigurePostProcessing::ConfigurePostProcessing(QWidget* parent) : QDialog(pare }); preset_row->addWidget(save_button); - auto* delete_button = new QPushButton(tr("Delete"), this); - connect(delete_button, &QPushButton::clicked, this, [this]() { - const QString name = preset_combo->currentData().toString(); - if (name.isEmpty()) { - return; - } - VideoCore::DeleteFxPreset(name.toStdString()); - PopulatePresetCombo(); - RefreshPresetStatus(); + auto* clear_button = new QPushButton(tr("Clear"), this); + clear_button->setToolTip(tr("Remove every effect in use and deselect the preset.")); + connect(clear_button, &QPushButton::clicked, this, [this]() { + VideoCore::FxChain::Instance().Clear(); + VideoCore::SetActiveFxPreset(std::string()); + preset_combo->setCurrentIndex(0); + ApplyStructuralChange(); }); - preset_row->addWidget(delete_button); + preset_row->addWidget(clear_button); root->addLayout(preset_row); @@ -203,6 +199,7 @@ void ConfigurePostProcessing::ApplyStructuralChange() { void ConfigurePostProcessing::PopulatePresetCombo() { const QString previous = preset_combo->currentData().toString(); preset_combo->clear(); + preset_combo->addItem(tr("None"), QString()); for (const auto& preset : VideoCore::GetFxPresetCatalog()) { const QString name = QString::fromStdString(preset.name); @@ -212,7 +209,7 @@ void ConfigurePostProcessing::PopulatePresetCombo() { } const int restored = preset_combo->findData(previous); - if (restored >= 0) { + if (!previous.isEmpty() && restored >= 0) { preset_combo->setCurrentIndex(restored); return; } @@ -220,12 +217,21 @@ void ConfigurePostProcessing::PopulatePresetCombo() { const int active = preset_combo->findData(QString::fromStdString(VideoCore::GetActiveFxPreset())); if (active >= 0) { preset_combo->setCurrentIndex(active); + return; } + + preset_combo->setCurrentIndex(0); } void ConfigurePostProcessing::RefreshPresetStatus() { const std::string active = VideoCore::GetActiveFxPreset(); if (active.empty()) { + if (VideoCore::FxChain::Instance().Size() == 0) { + preset_status->setText( + tr("No effects in use. Pick a preset and press Apply, or add effects one " + "by one.")); + return; + } preset_status->setText(tr("Custom chain. Pick a preset above and press Apply to replace it.")); return; } diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 95b91a4f38..1d579239a1 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -15,6 +15,7 @@ #include "render/performance_overlay.h" #ifdef HAS_RESHADE #include "configuration/configure_post_processing.h" +#include "video_core/post_processing/fx_preset.h" #endif #include "updater/update_dialog.h" @@ -1090,6 +1091,41 @@ void MainWindow::InitializeWidgets() { statusBar()->insertPermanentWidget(0, volume_button); +#ifdef HAS_RESHADE + post_shader_status_button = new QPushButton(); + post_shader_status_button->setObjectName(QStringLiteral("TogglableStatusBarButton")); + post_shader_status_button->setFocusPolicy(Qt::NoFocus); + post_shader_status_button->setCheckable(true); + connect(post_shader_status_button, &QPushButton::clicked, this, [this] { + const bool enabled = Settings::values.post_shader_enabled.GetValue(); + Settings::values.post_shader_enabled.SetValue(!enabled); + UpdatePostShaderText(); + }); + UpdatePostShaderText(); + post_shader_status_button->setContextMenuPolicy(Qt::CustomContextMenu); + connect(post_shader_status_button, &QPushButton::customContextMenuRequested, + [this](const QPoint& menu_location) { + QMenu context_menu; + + for (auto const& preset : VideoCore::GetFxPresetCatalog()) { + context_menu.addAction(QString::fromStdString(preset.name), + [this, name = preset.name] { + VideoCore::ApplyFxPreset(name); + Settings::values.post_shader_enabled.SetValue(true); + UpdatePostShaderText(); + }); + } + + context_menu.addSeparator(); + context_menu.addAction(tr("Configure Effects..."), this, + &MainWindow::OnPostProcessingShaders); + + context_menu.exec(post_shader_status_button->mapToGlobal(menu_location)); + post_shader_status_button->repaint(); + }); + statusBar()->insertPermanentWidget(0, post_shader_status_button); +#endif + // setup AA button aa_status_button = new QPushButton(); aa_status_button->setObjectName(QStringLiteral("TogglableStatusBarButton")); @@ -3908,6 +3944,7 @@ void MainWindow::OnPostProcessingShaders() { connect(post_processing_dialog, &QDialog::finished, post_processing_dialog, [this]() { post_processing_dialog->deleteLater(); post_processing_dialog = nullptr; + UpdatePostShaderText(); }); } @@ -4262,6 +4299,26 @@ void MainWindow::UpdateAAText() { : aa_text.toUpper()); } +#ifdef HAS_RESHADE +void MainWindow::UpdatePostShaderText() { + const bool enabled = Settings::values.post_shader_enabled.GetValue(); + post_shader_status_button->setChecked(enabled); + + if (!enabled) { + post_shader_status_button->setText(tr("NO FX")); + return; + } + + const std::string preset = VideoCore::GetActiveFxPreset(); + if (preset.empty()) { + post_shader_status_button->setText(tr("FX")); + return; + } + + post_shader_status_button->setText(QString::fromStdString(preset).toUpper()); +} +#endif + void MainWindow::UpdateVolumeUI() { const auto volume_value = static_cast(Settings::values.volume.GetValue()); volume_slider->setValue(volume_value); diff --git a/src/yuzu/main_window.h b/src/yuzu/main_window.h index 2e92df135d..8aedeec721 100644 --- a/src/yuzu/main_window.h +++ b/src/yuzu/main_window.h @@ -448,6 +448,7 @@ private: void UpdateAPIText(); void UpdateFilterText(); void UpdateAAText(); + void UpdatePostShaderText(); void UpdateVolumeUI(); void UpdateStatusBar(); void UpdateGPUAccuracyButton(); @@ -524,6 +525,7 @@ private: QPushButton* dock_status_button = nullptr; QPushButton* filter_status_button = nullptr; QPushButton* aa_status_button = nullptr; + QPushButton* post_shader_status_button = nullptr; VolumeButton* volume_button = nullptr; QWidget* volume_popup = nullptr; QSlider* volume_slider = nullptr; From defddec47ff997824b6f8adb3bece790f6723c24 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Tue, 15 Sep 2026 08:01:17 +0200 Subject: [PATCH 047/128] [ns] add stubs for cmd936 and cmd4042 (#4429) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- This is necessary to close Absolum and Hades 2 in qlaunch. Cmd4042 is necessary that there are no freezes when opening virtual cartridges. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4429 Reviewed-by: lizzie Reviewed-by: Maufeat --- src/core/CMakeLists.txt | 2 ++ .../ns/application_manager_interface.cpp | 23 +++++++++--- .../ns/application_manager_interface.h | 5 +++ src/core/hle/service/ns/i_async_result.cpp | 35 +++++++++++++++++++ src/core/hle/service/ns/i_async_result.h | 19 ++++++++++ 5 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 src/core/hle/service/ns/i_async_result.cpp create mode 100644 src/core/hle/service/ns/i_async_result.h diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 5c31ebb70e..74391b5e65 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -810,6 +810,8 @@ add_library(core STATIC hle/service/ns/ecommerce_interface.h hle/service/ns/factory_reset_interface.cpp hle/service/ns/factory_reset_interface.h + hle/service/ns/i_async_result.cpp + hle/service/ns/i_async_result.h hle/service/ns/language.cpp hle/service/ns/language.h hle/service/ns/ns.cpp diff --git a/src/core/hle/service/ns/application_manager_interface.cpp b/src/core/hle/service/ns/application_manager_interface.cpp index 8f21244439..348649917e 100644 --- a/src/core/hle/service/ns/application_manager_interface.cpp +++ b/src/core/hle/service/ns/application_manager_interface.cpp @@ -228,9 +228,9 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_ {930, nullptr, "Unknown930"}, //20.0.0+ {931, nullptr, "Unknown931"}, //20.0.0+ {933, nullptr, "Unknown933"}, //20.0.0+ - {934, nullptr, "Unknown934"}, //20.0.0+ - {935, nullptr, "Unknown935"}, //20.0.0+ - {936, nullptr, "Unknown936"}, //20.0.0+ + {934, nullptr, "Unknown934"}, //21.0.0+ + {935, nullptr, "Unknown935"}, //21.0.0+ + {936, D<&IApplicationManagerInterface::Unknown936>, "Unknown936"}, //21.0.0+ {1000, nullptr, "RequestVerifyApplicationDeprecated"}, {1001, nullptr, "CorruptApplicationForDebug"}, {1002, nullptr, "RequestVerifyAddOnContentsRights"}, @@ -422,7 +422,7 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_ {4039, nullptr, "Unknown4039"}, //20.0.0+ {4040, nullptr, "Unknown4040"}, //20.0.0+ {4041, nullptr, "Unknown4041"}, //20.0.0+ - {4042, nullptr, "Unknown4042"}, //20.0.0+ + {4042, D<&IApplicationManagerInterface::Unknown4042>, "Unknown4042"}, //20.0.0+ {4043, nullptr, "Unknown4043"}, //20.0.0+ {4044, nullptr, "Unknown4044"}, //20.0.0+ {4045, nullptr, "Unknown4045"}, //20.0.0+ @@ -639,6 +639,12 @@ Result IApplicationManagerInterface::IsGameCardApplicationRunning(Out out_ R_SUCCEED(); } +Result IApplicationManagerInterface::Unknown936(Out out_result) { + LOG_WARNING(Service_NS, "(STUBBED) called."); + *out_result = 0; + R_SUCCEED(); +} + Result IApplicationManagerInterface::IsAnyApplicationEntityInstalled( Out out_is_any_application_entity_installed) { LOG_WARNING(Service_NS, "(STUBBED) called"); @@ -862,6 +868,15 @@ Result IApplicationManagerInterface::Unknown4023(Out out_result) { R_SUCCEED(); } +Result IApplicationManagerInterface::Unknown4042(OutInterface out_interface, + OutCopyHandle out_event, + u64 arg1, u64 arg2) { + LOG_WARNING(Service_NS, "(STUBBED) called, arg1={:016X}, arg2={:016X}", arg1, arg2); + *out_event = unknown_event.GetHandle(); + *out_interface = std::make_shared(system, &unknown_event); + R_SUCCEED(); +} + Result IApplicationManagerInterface::Unknown4053() { LOG_WARNING(Service_NS, "(STUBBED) called."); R_SUCCEED(); diff --git a/src/core/hle/service/ns/application_manager_interface.h b/src/core/hle/service/ns/application_manager_interface.h index 52858f03f8..af5ec780af 100644 --- a/src/core/hle/service/ns/application_manager_interface.h +++ b/src/core/hle/service/ns/application_manager_interface.h @@ -7,6 +7,7 @@ #pragma once #include "core/hle/service/cmif_types.h" +#include "core/hle/service/ns/i_async_result.h" #include "core/hle/service/ns/language.h" #include "core/hle/service/ns/ns_types.h" #include "core/hle/service/os/event.h" @@ -34,6 +35,7 @@ public: Result GetGameCardMountFailureEvent(OutCopyHandle out_event); Result GetGameCardWakenReadyEvent(OutCopyHandle out_event); Result IsGameCardApplicationRunning(Out out_is_running); + Result Unknown936(Out out_result); Result IsAnyApplicationEntityInstalled(Out out_is_any_application_entity_installed); Result GetApplicationViewDeprecated( OutArray out_application_views, @@ -71,6 +73,9 @@ public: InBuffer logo_path_buffer); Result Unknown4022(OutCopyHandle out_event); Result Unknown4023(Out out_result); + Result Unknown4042(OutInterface out_interface, + OutCopyHandle out_event, + u64 arg1, u64 arg2); Result Unknown4053(); Result Unknown4105(); diff --git a/src/core/hle/service/ns/i_async_result.cpp b/src/core/hle/service/ns/i_async_result.cpp new file mode 100644 index 0000000000..be04c162d3 --- /dev/null +++ b/src/core/hle/service/ns/i_async_result.cpp @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/ns/i_async_result.h" + +#include + +namespace Service::NS { + +IAsyncResult::IAsyncResult(Core::System& system_, Service::Event* event_) + : ServiceFramework{system_, "nn::ns::detail::IAsyncResult"}, event{event_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Get"}, + {1, D<&IAsyncResult::Cancel>, "Cancel"}, + {2, nullptr, "GetErrorContext"}, // 4.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); +} + +IAsyncResult::~IAsyncResult() = default; + +Result IAsyncResult::Cancel() { + LOG_DEBUG(Service_NS, "called"); + if (event != nullptr) { + event->Signal(system.Kernel()); + } + + R_SUCCEED(); +} + +} // namespace Service::NS \ No newline at end of file diff --git a/src/core/hle/service/ns/i_async_result.h b/src/core/hle/service/ns/i_async_result.h new file mode 100644 index 0000000000..914ea5a42c --- /dev/null +++ b/src/core/hle/service/ns/i_async_result.h @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "core/hle/service/service.h" + +namespace Service::NS { + +class IAsyncResult final : public ServiceFramework { +public: + explicit IAsyncResult(Core::System& system_, Service::Event* event_); + ~IAsyncResult() override; + +private: + Result Cancel(); + + Service::Event* event{}; +}; + +} // namespace Service::NS \ No newline at end of file From b77308ced62abe890428955dba687c95e4d93aba Mon Sep 17 00:00:00 2001 From: xbzk Date: Tue, 15 Sep 2026 21:53:07 +0200 Subject: [PATCH 048/128] [applet] ReconfigureControllers fallback unconditional disconnect fix (#4420) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- So, about Absolum's no overlay applet P2 issue: The fallback controller applet ignored keep_controllers_connected, according comment: "This makes it easy to connect the desired controllers". Unfortunately it was not good enough. It disconnected every controller, then reconnected only the minimum player count. That disconnect interacts with some guests (absolum in this case) causing undesired behaviors. The fix is entwined to original routine but it is a lot simple tho: preserves compatible connected controllers within the requested player range, while the existing routine configures only the remaining slots. This may fix some games, and should not harm others. Let us give it a go. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4420 Reviewed-by: MaranBr --- src/core/frontend/applets/controller.cpp | 33 ++++++++++++++++++------ 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/core/frontend/applets/controller.cpp b/src/core/frontend/applets/controller.cpp index c4292c5a12..e535866855 100644 --- a/src/core/frontend/applets/controller.cpp +++ b/src/core/frontend/applets/controller.cpp @@ -12,6 +12,7 @@ #include "hid_core/frontend/emulated_controller.h" #include "hid_core/hid_core.h" #include "hid_core/hid_types.h" +#include namespace Core::Frontend { @@ -29,23 +30,39 @@ void DefaultControllerApplet::ReconfigureControllers(ReconfigureCallback callbac const std::size_t min_supported_players = parameters.enable_single_mode ? 1 : parameters.min_players; + using Core::HID::NpadStyleIndex; + const std::size_t max_supported_players = parameters.enable_single_mode ? 1 : parameters.max_players; + std::size_t num_selected_players = 0; + std::array keep_connected{}; - // Disconnect Handheld first. + // reserve existing AND valid players before filling slots. include Handheld, but not other + for (std::size_t index = 0; index < hid_core.available_controllers - 1; ++index) { + const auto* controller = hid_core.GetEmulatedControllerByIndex(index); + if (!parameters.keep_controllers_connected || !controller->IsConnected() || num_selected_players >= max_supported_players) continue; + + const auto style = controller->GetNpadStyleIndex(); + keep_connected[index] = + (style == NpadStyleIndex::Fullkey && parameters.allow_pro_controller) || + (style == NpadStyleIndex::JoyconDual && parameters.allow_dual_joycons) || + (style == NpadStyleIndex::JoyconLeft && parameters.allow_left_joycon) || + (style == NpadStyleIndex::JoyconRight && parameters.allow_right_joycon) || + (style == NpadStyleIndex::Handheld && parameters.enable_single_mode && parameters.allow_handheld && !Settings::IsDockedMode()) || + (style == NpadStyleIndex::GameCube && parameters.allow_gamecube_controller); + num_selected_players += keep_connected[index]; + } auto* handheld = hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld); - handheld->Disconnect(); + if (!keep_connected[hid_core.available_controllers - 2]) handheld->Disconnect(); // Deduce the best configuration based on the input parameters. for (std::size_t index = 0; index < hid_core.available_controllers - 2; ++index) { auto* controller = hid_core.GetEmulatedControllerByIndex(index); - // First, disconnect all controllers regardless of the value of keep_controllers_connected. - // This makes it easy to connect the desired controllers. + if (keep_connected[index]) continue; controller->Disconnect(); - // Only connect the minimum number of required players. - if (index >= min_supported_players) { - continue; - } + // only add players still needed to reach the minimum + if (num_selected_players >= min_supported_players) continue; + ++num_selected_players; // Connect controllers based on the following priority list from highest to lowest priority: // Pro Controller -> Dual Joycons -> Left Joycon/Right Joycon -> Handheld From fa4e7c699243dae407a09fc3c54e7a0a822329b5 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Wed, 16 Sep 2026 01:42:37 +0200 Subject: [PATCH 049/128] [vk_texture_cache] drop depth comparison sampler fallback (#4408) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- This fixes the flashlight in Alan Wake. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4408 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey --- src/video_core/renderer_vulkan/vk_texture_cache.cpp | 5 ----- src/video_core/renderer_vulkan/vk_texture_cache.h | 1 - 2 files changed, 6 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index c3f56408b5..bc2e82acae 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -2850,8 +2850,6 @@ Sampler::VariantKey Sampler::MakeKey(const ImageView& image_view, bool is_depth) VariantKey key{}; key.reduce_anisotropy = has_added_anisotropy && !image_view.SupportsAnisotropy(); key.force_nearest = has_linear_filtering && IsPixelFormatInteger(image_view.format); - key.drop_depth_comparison = - is_depth && has_depth_comparison && !image_view.SupportsDepthComparison(); key.drop_reduction = has_minmax_reduction && !image_view.SupportsMinmaxFilter(); key.drop_custom_border = has_custom_border_colors && image_view.RequiresBorderColorFormat(); key.srgb_border = has_srgb_border_color && IsPixelFormatSRGB(image_view.format); @@ -2929,9 +2927,6 @@ VkSampler Sampler::Emplace(VariantKey key) { create_info.anisotropyEnable = static_cast(default_anisotropy > 1.0f); create_info.maxAnisotropy = default_anisotropy; } - if (key.drop_depth_comparison) { - create_info.compareEnable = VK_FALSE; - } if (!custom_border) { create_info.borderColor = ConvertBorderColor(color); } diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index 68bf2af991..2e9736f707 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h @@ -536,7 +536,6 @@ private: struct VariantKey { bool reduce_anisotropy; bool force_nearest; - bool drop_depth_comparison; bool drop_reduction; bool drop_custom_border; bool srgb_border; From a7061eb4c8afc3a74bd983212131954671317f0b Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Wed, 16 Sep 2026 03:46:44 +0200 Subject: [PATCH 050/128] [ns] Rename i_async_result -> async_result (#4439) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4439 Reviewed-by: lizzie Reviewed-by: MaranBr --- src/core/CMakeLists.txt | 4 ++-- src/core/hle/service/ns/application_manager_interface.h | 2 +- .../hle/service/ns/{i_async_result.cpp => async_result.cpp} | 0 src/core/hle/service/ns/{i_async_result.h => async_result.h} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename src/core/hle/service/ns/{i_async_result.cpp => async_result.cpp} (100%) rename src/core/hle/service/ns/{i_async_result.h => async_result.h} (100%) diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 74391b5e65..5f9e9bd654 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -796,6 +796,8 @@ add_library(core STATIC hle/service/ns/application_manager_interface.h hle/service/ns/application_version_interface.cpp hle/service/ns/application_version_interface.h + hle/service/ns/async_result.cpp + hle/service/ns/async_result.h hle/service/ns/content_management_interface.cpp hle/service/ns/content_management_interface.h hle/service/ns/develop_interface.cpp @@ -810,8 +812,6 @@ add_library(core STATIC hle/service/ns/ecommerce_interface.h hle/service/ns/factory_reset_interface.cpp hle/service/ns/factory_reset_interface.h - hle/service/ns/i_async_result.cpp - hle/service/ns/i_async_result.h hle/service/ns/language.cpp hle/service/ns/language.h hle/service/ns/ns.cpp diff --git a/src/core/hle/service/ns/application_manager_interface.h b/src/core/hle/service/ns/application_manager_interface.h index af5ec780af..c4ca66f319 100644 --- a/src/core/hle/service/ns/application_manager_interface.h +++ b/src/core/hle/service/ns/application_manager_interface.h @@ -7,7 +7,7 @@ #pragma once #include "core/hle/service/cmif_types.h" -#include "core/hle/service/ns/i_async_result.h" +#include "core/hle/service/ns/async_result.h" #include "core/hle/service/ns/language.h" #include "core/hle/service/ns/ns_types.h" #include "core/hle/service/os/event.h" diff --git a/src/core/hle/service/ns/i_async_result.cpp b/src/core/hle/service/ns/async_result.cpp similarity index 100% rename from src/core/hle/service/ns/i_async_result.cpp rename to src/core/hle/service/ns/async_result.cpp diff --git a/src/core/hle/service/ns/i_async_result.h b/src/core/hle/service/ns/async_result.h similarity index 100% rename from src/core/hle/service/ns/i_async_result.h rename to src/core/hle/service/ns/async_result.h From d76f8f91c423841e131ad822ce26610585cca018 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 16 Sep 2026 04:00:59 +0200 Subject: [PATCH 051/128] [hle] Fix nullptr on ListApplicationIcon (#4438) Control could be null, handle such case Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4438 Reviewed-by: CamilleLaVey Reviewed-by: MaranBr --- ...nly_application_control_data_interface.cpp | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp index baf28b9b5c..1359cdbb95 100644 --- a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp +++ b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp @@ -311,27 +311,30 @@ void IReadOnlyApplicationControlDataInterface::ListApplicationIcon(HLERequestCon // u64 - app count memory.WriteBlock(t_mem_address + out_length, &app_count, sizeof(u64)); out_length += sizeof(u64); + ASSERT(out_length <= t_mem->GetSize()); // [list of u64] - size of icons for (size_t i = 0; i < app_count; ++i) { const u64 app_id = app_ids_buffer[i]; const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()}; - const auto control = pm.GetControlMetadata(); - u64 full_size = control.second->GetSize(); - memory.WriteBlock(t_mem_address + out_length, &full_size, sizeof(u64)); + if (const auto control = pm.GetControlMetadata(); control.second) { + u64 full_size = control.second->GetSize(); + memory.WriteBlock(t_mem_address + out_length, &full_size, sizeof(u64)); + } out_length += sizeof(u64); + ASSERT(out_length <= t_mem->GetSize()); } // [list of raw icon data] - std::vector full_icon_data; for (size_t i = 0; i < app_count; ++i) { const u64 app_id = app_ids_buffer[i]; const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()}; - const auto control = pm.GetControlMetadata(); - auto const full_size = control.second->GetSize(); - if (full_size > 0) { - full_icon_data.resize(full_size); - control.second->Read(full_icon_data.data(), full_size, 0); - memory.WriteBlock(t_mem_address + out_length, full_icon_data.data(), full_size); - out_length += full_size; + if (const auto control = pm.GetControlMetadata(); control.second) { + if (auto const full_size = control.second->GetSize(); full_size > 0) { + std::vector full_icon_data(full_size); + control.second->Read(full_icon_data.data(), full_size, 0); + memory.WriteBlock(t_mem_address + out_length, full_icon_data.data(), full_size); + out_length += full_size; + ASSERT(out_length <= t_mem->GetSize()); + } } } } @@ -345,6 +348,12 @@ void IReadOnlyApplicationControlDataInterface::ListApplicationIcon(HLERequestCon void IReadOnlyApplicationControlDataInterface::ListApplicationTitle(HLERequestContext& ctx) { const auto app_ids_buffer = ctx.ReadBuffer(); const size_t app_count = app_ids_buffer.size() / sizeof(u64); + + std::vector application_ids(app_count); + if (app_count > 0) { + std::memcpy(application_ids.data(), app_ids_buffer.data(), app_count * sizeof(u64)); + } + auto t_mem_obj = ctx.GetObjectFromHandle(ctx.GetCopyHandle(0)); auto* t_mem = t_mem_obj.GetPointerUnsafe(); constexpr size_t title_entry_size = sizeof(FileSys::LanguageEntry); @@ -354,8 +363,9 @@ void IReadOnlyApplicationControlDataInterface::ListApplicationTitle(HLERequestCo auto& memory = system.ApplicationMemory(); const auto t_mem_address = t_mem->GetSourceAddress(); for (size_t i = 0; i < app_count; ++i) { - const u64 app_id = app_ids_buffer[i]; - const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), system.GetContentProvider()}; + const u64 app_id = application_ids[i]; + const FileSys::PatchManager pm{app_id, system.GetFileSystemController(), + system.GetContentProvider()}; const auto control = pm.GetControlMetadata(); FileSys::LanguageEntry entry{}; if (control.first != nullptr) { From fd34024f0e1ffca0aa813698d2552a1dea2b5b17 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 16 Sep 2026 04:45:45 +0200 Subject: [PATCH 052/128] [hle/ns] fix build error due to missing async_result.h (#4440) We may have merged quite a bit too fast before letting CI finish. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4440 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey --- src/core/hle/service/ns/async_result.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/hle/service/ns/async_result.cpp b/src/core/hle/service/ns/async_result.cpp index be04c162d3..8617280bef 100644 --- a/src/core/hle/service/ns/async_result.cpp +++ b/src/core/hle/service/ns/async_result.cpp @@ -2,7 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/ns/i_async_result.h" +#include "core/hle/service/ns/async_result.h" #include @@ -32,4 +32,4 @@ Result IAsyncResult::Cancel() { R_SUCCEED(); } -} // namespace Service::NS \ No newline at end of file +} // namespace Service::NS From 4ce45b3b37d162660f0e1ec829c4eab896fc4db4 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 16 Sep 2026 08:10:29 +0200 Subject: [PATCH 053/128] [hle] Fix crash on MK8D and SM3DW LDN (#4417) Crash is due to SIGILL due to mismatched N and span<> ctor(). Also some astray nullptr references. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4417 Reviewed-by: MaranBr Reviewed-by: Maufeat --- src/common/uuid.cpp | 4 ++-- src/common/uuid.h | 2 +- .../hle/service/am/service/application_functions.cpp | 9 +++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/common/uuid.cpp b/src/common/uuid.cpp index 51fe0abaa5..4b992c5df8 100644 --- a/src/common/uuid.cpp +++ b/src/common/uuid.cpp @@ -208,9 +208,9 @@ UUID UUID::MakeRandomRFC4122V4() { return uuid; } -UUID UUID::MakeRFC4122V5(std::span sha1) { +UUID UUID::MakeRFC4122V5(std::span sha1) { UUID uuid{}; - std::memcpy(&uuid.uuid, sha1.data(), sizeof(UUID)); + std::memcpy(&uuid.uuid, sha1.data(), sha1.size()); uuid.uuid[8] = 0x80 | (uuid.uuid[8] & 0x3F); uuid.uuid[6] = 0x50 | (uuid.uuid[6] & 0xF); return uuid; diff --git a/src/common/uuid.h b/src/common/uuid.h index 3aa3212dd7..465b5be58d 100644 --- a/src/common/uuid.h +++ b/src/common/uuid.h @@ -104,7 +104,7 @@ struct UUID { /// @returns A random UUID that is RFC 4122 Version 4 compliant. [[nodiscard]] static UUID MakeRandomRFC4122V4(); - [[nodiscard]] static UUID MakeRFC4122V5(std::span sha1); + [[nodiscard]] static UUID MakeRFC4122V5(std::span sha1); friend constexpr bool operator==(const UUID& lhs, const UUID& rhs) = default; }; diff --git a/src/core/hle/service/am/service/application_functions.cpp b/src/core/hle/service/am/service/application_functions.cpp index 215d204098..90d292c4a2 100644 --- a/src/core/hle/service/am/service/application_functions.cpp +++ b/src/core/hle/service/am/service/application_functions.cpp @@ -347,21 +347,22 @@ Result IApplicationFunctions::NotifyRunning(Out out_became_running) { Result IApplicationFunctions::GetPseudoDeviceId(Out out_pseudo_device_id) { LOG_WARNING(Service_AM, "(stubbed)"); - R_UNLESS(out_pseudo_device_id, ResultUnknown); + R_UNLESS(out_pseudo_device_id != nullptr, ResultUnknown); // This should be hashed with the device specific hash // for now this will do const auto res = FileSys::PatchManager::GetMetadataFromBaseOrUpdate(system, m_applet->program_id); - u8 hash[EVP_MAX_MD_SIZE]; + R_UNLESS(res.first != nullptr, ResultUnknown); + std::array hash; unsigned int hash_len = 0; auto const seed = res.first->raw.seed_for_pseudo_device_id; EVP_MD_CTX *ctx = EVP_MD_CTX_new(); auto const algorithm = EVP_sha1(); EVP_DigestInit_ex(ctx, algorithm, nullptr); EVP_DigestUpdate(ctx, &seed, sizeof(seed)); - EVP_DigestFinal_ex(ctx, hash, &hash_len); + EVP_DigestFinal_ex(ctx, hash.data(), &hash_len); EVP_MD_CTX_free(ctx); - *out_pseudo_device_id = Common::UUID::MakeRFC4122V5(std::span{hash, std::size(hash)}); + *out_pseudo_device_id = Common::UUID::MakeRFC4122V5(std::span{hash.begin(), hash.begin() + 16}); R_SUCCEED(); } From 7bf95be2c29328a4cfeb8b2384ce34c6fb6d890c Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 16 Sep 2026 09:29:12 +0200 Subject: [PATCH 054/128] [dynarmic] fix A32 crash due to wrong LEA encoding (#4444) LEA 1< - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4444 Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h index 54ad638ada..5d98d47564 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h @@ -90,7 +90,7 @@ template<> code.shl(tmp, int(ctx.conf.page_table_log2_stride)); code.mov(page, qword[r14 + tmp.cvt64()]); } else { - code.mov(page, qword[r14 + tmp.cvt64() * int(ctx.conf.page_table_log2_stride)]); + code.mov(page, qword[r14 + tmp.cvt64() * int(1 << ctx.conf.page_table_log2_stride)]); } // check for marked bit, use as unmapped if marked From ac35358b3ffed74aaac56b0e99b09e81bb60d2e1 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 16 Sep 2026 15:35:13 +0200 Subject: [PATCH 055/128] [common] Replace `Common::SpinLock` with `std::mutex` (#4436) `std::mutex` can be better than the spin-lock specially since we don't waste CPU cycles for no reason. Test less stuttering/heat consumption. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4436 Reviewed-by: CamilleLaVey Reviewed-by: MaranBr --- src/common/CMakeLists.txt | 1 - src/common/spin_lock.h | 50 ------------------------------- src/core/hle/kernel/k_slab_heap.h | 7 ++--- src/core/hle/kernel/k_thread.h | 3 +- 4 files changed, 4 insertions(+), 57 deletions(-) delete mode 100644 src/common/spin_lock.h diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 61e0e64aa8..94da1724df 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -110,7 +110,6 @@ add_library( socket_types.h sparse_large_vector.cpp sparse_large_vector.h - spin_lock.h stb.cpp stb.h steady_clock.cpp diff --git a/src/common/spin_lock.h b/src/common/spin_lock.h deleted file mode 100644 index 93d507ae80..0000000000 --- a/src/common/spin_lock.h +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#ifdef _MSC_VER -#include -#elif defined(ARCHITECTURE_x86_64) -#include -#endif -#include - -namespace Common { - -/// @brief A lock similar to mutex that forces a thread to spin wait instead calling the -/// supervisor. Should be used on short sequences of code. -struct SpinLock { - SpinLock() noexcept = default; - SpinLock(const SpinLock&) noexcept = delete; - SpinLock& operator=(const SpinLock&) noexcept = delete; - SpinLock(SpinLock&&) noexcept = delete; - SpinLock& operator=(SpinLock&&) noexcept = delete; - - inline void lock() noexcept { - while (lck.test_and_set(std::memory_order_acquire)) { -#if defined(ARCHITECTURE_x86_64) - _mm_pause(); -#elif defined(ARCHITECTURE_arm64) && defined(_MSC_VER) - __yield(); -#elif defined(ARCHITECTURE_arm64) - asm("yield"); -#endif - } - } - - inline void unlock() noexcept { - lck.clear(std::memory_order_release); - } - - [[nodiscard]] inline bool try_lock() noexcept { - return !lck.test_and_set(std::memory_order_acquire); - } - - std::atomic_flag lck = ATOMIC_FLAG_INIT; -}; - -} // namespace Common diff --git a/src/core/hle/kernel/k_slab_heap.h b/src/core/hle/kernel/k_slab_heap.h index c91e7969a2..a5dbab9571 100644 --- a/src/core/hle/kernel/k_slab_heap.h +++ b/src/core/hle/kernel/k_slab_heap.h @@ -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-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -12,7 +12,6 @@ #include "common/atomic_ops.h" #include "common/common_funcs.h" #include "common/common_types.h" -#include "common/spin_lock.h" namespace Kernel { @@ -30,7 +29,7 @@ public: }; public: - constexpr KSlabHeapImpl() = default; + KSlabHeapImpl() = default; void Initialize() { ASSERT(m_head == nullptr); @@ -68,7 +67,7 @@ public: private: std::atomic m_head{}; - Common::SpinLock m_lock; + std::mutex m_lock; }; } // namespace impl diff --git a/src/core/hle/kernel/k_thread.h b/src/core/hle/kernel/k_thread.h index 95ba1b4d76..0ee5f72c8e 100644 --- a/src/core/hle/kernel/k_thread.h +++ b/src/core/hle/kernel/k_thread.h @@ -19,7 +19,6 @@ #include "common/intrusive_red_black_tree.h" #include "common/scratch_buffer.h" -#include "common/spin_lock.h" #include "core/arm/arm_interface.h" #include "core/hle/kernel/k_affinity_mask.h" #include "core/hle/kernel/k_light_lock.h" @@ -920,7 +919,7 @@ private: bool m_resource_limit_release_hint{}; bool m_is_kernel_address_key{}; StackParameters m_stack_parameters{}; - Common::SpinLock m_context_guard{}; + std::mutex m_context_guard{}; // For emulation std::shared_ptr m_host_context{}; From c3f1e6562b6cb5aefcb9edd490b303867917f25e Mon Sep 17 00:00:00 2001 From: Feng Chen Date: Wed, 16 Sep 2026 22:12:01 +0200 Subject: [PATCH 056/128] [common/fs] Preserve Windows roots during path sanitization (#4437) Commit 5b4c29b123 made SanitizePath rebuild paths from split components after resolving traversal. That reconstruction retained only one leading separator, collapsing UNC paths and breaking network-backed directories. Parse the path root separately from normal components. Preserve UNC prefixes, drive-absolute and drive-relative forms, and extended UNC/device namespaces while normalizing separators and dot components. Treat the UNC server/share portion as part of the root so parent traversal cannot escape into another share. Also preserve root-only results such as / and C:\\ instead of stripping their final separator. - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4437 Reviewed-by: lizzie Reviewed-by: CamilleLaVey --- src/common/fs/path_util.cpp | 79 +++++++++++++++++++++++++++++++------ src/common/fs/path_util.h | 5 ++- 2 files changed, 69 insertions(+), 15 deletions(-) diff --git a/src/common/fs/path_util.cpp b/src/common/fs/path_util.cpp index b895aac54c..82ea8f6cb2 100644 --- a/src/common/fs/path_util.cpp +++ b/src/common/fs/path_util.cpp @@ -5,6 +5,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include #include #include "common/container/unordered_map.h" @@ -480,28 +481,80 @@ std::string SanitizePath(std::string_view path_, DirectorySeparator directory_se [type2](char c1, char c2) { return c1 == type2 && c2 == type2; }), path.end()); - const bool absolute = !path.empty() && path[0] == type2; - std::vector parts; + std::string root; + std::string_view components{path}; + bool drive_relative = false; - for (const auto part : SplitPathComponents(path)) - { - if (part.empty() || part == ".") - continue; - if (part == ".." && !parts.empty() && parts.back() != "..") - parts.pop_back(); - else if (part != "..") parts.push_back(part); +#ifdef _WIN32 + const bool network = path.size() > 1 && path[0] == type2 && path[1] == type2; + const bool drive = + path.size() > 1 && std::isalpha(static_cast(path[0])) && path[1] == ':'; + + if (network) { + root.assign(2, type2); + components.remove_prefix(2); + } else if (drive) { + root.assign(path.data(), 2); + components.remove_prefix(2); + if (!components.empty() && components.front() == type2) { + root += type2; + components.remove_prefix(1); + } else { + drive_relative = true; + } + } +#endif + + if (root.empty() && !components.empty() && components.front() == type2) { + root += type2; + components.remove_prefix(1); } - std::string resolved = absolute ? std::string(1, type2) : std::string{}; - for (std::size_t i = 0; i < parts.size(); ++i) - { - if (i != 0) + const auto path_parts = SplitPathComponents(components); + std::size_t root_component_count = 0; +#ifdef _WIN32 + if (network) { + root_component_count = 2; + + const auto is_unc = [](std::string_view part) { + return part.size() == 3 && (part[0] == 'U' || part[0] == 'u') && + (part[1] == 'N' || part[1] == 'n') && (part[2] == 'C' || part[2] == 'c'); + }; + if (path_parts.size() >= 2 && path_parts[0] == "?" && is_unc(path_parts[1])) { + root_component_count = 4; + } + } +#endif + + std::vector parts; + for (std::size_t i = 0; i < path_parts.size(); ++i) { + const auto part = path_parts[i]; + if (i < root_component_count) { + parts.push_back(part); + } else if (part.empty() || part == ".") { + continue; + } else if (part == "..") { + if (parts.size() > root_component_count) { + parts.pop_back(); + } + } else { + parts.push_back(part); + } + } + + const std::size_t root_length = root.size(); + std::string resolved = std::move(root); + for (std::size_t i = 0; i < parts.size(); ++i) { + if (i != 0 || (!resolved.empty() && resolved.back() != type2 && !drive_relative)) resolved += type2; resolved.append(parts[i].data(), parts[i].size()); } path = std::move(resolved); + if (!path.empty() && path.size() == root_length) { + return path; + } return std::string(RemoveTrailingSlash(path)); } diff --git a/src/common/fs/path_util.h b/src/common/fs/path_util.h index 983e4917e8..e8fa5614ae 100644 --- a/src/common/fs/path_util.h +++ b/src/common/fs/path_util.h @@ -347,8 +347,9 @@ enum class DirectorySeparator { // i.e. "C:\Users\Yuzu\Documents\save.bin" becomes {"C:", "Users", "Yuzu", "Documents", "save.bin" } [[nodiscard]] std::vector SplitPathComponentsCopy(std::string_view filename); -// Removes trailing slash, makes all '\\' into '/', and removes duplicate '/'. Makes '/' into '\\' -// depending if directory_separator is BackwardSlash or PlatformDefault and running on windows +// Normalizes directory separators, removes duplicate and non-root trailing separators, and resolves +// '.' and '..' components without traversing above the path root. Windows drive and UNC roots are +// preserved. [[nodiscard]] std::string SanitizePath( std::string_view path, DirectorySeparator directory_separator = DirectorySeparator::ForwardSlash); From 4fe5f62c38e71b045d425dc5f4cc4ab83feeafbe Mon Sep 17 00:00:00 2001 From: Exverge Date: Wed, 16 Sep 2026 22:47:16 +0200 Subject: [PATCH 057/128] [dynarmic] fix sign extension and optimize vaddr lookups for 64bit on x64 systems (#4446) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Same as #4415 + #4444 just ported to A64 because I amazingly forgot Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4446 Reviewed-by: lizzie Reviewed-by: CamilleLaVey --- .../src/dynarmic/backend/x64/emit_x64_memory.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h index 5d98d47564..b78c14f6b7 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h @@ -161,8 +161,12 @@ template<> code.jnz(abort, code.T_NEAR); } - code.shl(tmp, int(ctx.conf.page_table_log2_stride)); - code.mov(page, qword[r14 + tmp]); + if (ctx.conf.page_table_log2_stride > 3) { + code.shl(tmp, int(ctx.conf.page_table_log2_stride)); + code.mov(page, qword[r14 + tmp.cvt64()]); + } else { + code.mov(page, qword[r14 + tmp.cvt64() * int(1 << ctx.conf.page_table_log2_stride)]); + } // check for marked bit, use as unmapped if marked if (ctx.conf.page_table_marked_bit) { @@ -178,9 +182,10 @@ template<> code.mov(tmp, ctx.conf.page_table_pointer_mask); code.and_(page, tmp); } + // check for sign bit, apply sign extension as needed if (ctx.conf.page_table_sign_extension) { - code.shl(page, *ctx.conf.page_table_sign_extension); - code.sar(page, *ctx.conf.page_table_sign_extension); + code.shl(page, 63 - int(*ctx.conf.page_table_sign_extension)); + code.sar(page, 63 - int(*ctx.conf.page_table_sign_extension)); } code.jz(abort, code.T_NEAR); From 90aafeedc1d980849894f5bf251313db95594e8a Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 17 Sep 2026 00:28:37 +0200 Subject: [PATCH 058/128] [k_scheduler] fix for libc++ that lazily initializes mutexes (#4447) `__m_` is nullptr when `unlock();` is called, so `try_lock();` will force materialization of the backing mutex. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4447 Reviewed-by: CamilleLaVey Reviewed-by: MaranBr --- src/core/hle/kernel/k_scheduler.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/core/hle/kernel/k_scheduler.cpp b/src/core/hle/kernel/k_scheduler.cpp index 8e629f6456..3156a17064 100644 --- a/src/core/hle/kernel/k_scheduler.cpp +++ b/src/core/hle/kernel/k_scheduler.cpp @@ -465,6 +465,10 @@ void KScheduler::ScheduleImplFiber(KernelCore& kernel) { // Check if we need scheduling. If we do, then we can't complete the switch and should // retry. if (m_state.needs_scheduling.load(std::memory_order_seq_cst)) { + // Some libc++ lazily init mutex + [[maybe_unused]] auto const can_lock = highest_priority_thread->m_context_guard.try_lock(); + DEBUG_ASSERT(!can_lock); + // Our switch failed. // We should unlock the thread context, and then retry. highest_priority_thread->m_context_guard.unlock(); @@ -496,6 +500,10 @@ void KScheduler::Unload(KernelCore& kernel, KThread* thread) { // Check if the thread is terminated by checking the DPC flags. if ((thread->GetStackParameters().dpc_flags & static_cast(DpcFlag::Terminated)) == 0) { + // Some libc++ lazily init mutex + [[maybe_unused]] auto const can_lock = thread->m_context_guard.try_lock(); + DEBUG_ASSERT(!can_lock); + // The thread isn't terminated, so we want to unlock it. thread->m_context_guard.unlock(); } From 8c1194474e76be02eaf69eefb9fcfdd04bd31229 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 17 Sep 2026 05:43:59 +0200 Subject: [PATCH 059/128] [hle/ssl] Implement Peek(),{Get,Set}RenegotiationMode,Pending,Poll and stub miscellany (#4428) Mainly because of Pending() as it's used in some games. May as well implement the rest. Skyline implemented ISslContext::RegisterInternalPki which is just a success stub (for now) for JJBA:ASB Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4428 Reviewed-by: MaranBr Reviewed-by: Maufeat Reviewed-by: CamilleLaVey --- src/core/hle/service/ssl/ssl.cpp | 462 +++++++++--------- src/core/hle/service/ssl/ssl_backend.h | 7 +- .../hle/service/ssl/ssl_backend_openssl.cpp | 47 +- 3 files changed, 266 insertions(+), 250 deletions(-) diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index 750a7de236..178c4c690b 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp @@ -48,6 +48,12 @@ enum class OptionType : u32 { EnableAlpn = 3, }; +// This is nn::ssl::sf::RenegotiationMode +enum RenegotiationMode : u32 { + None = 0, ///< None + Secure = 1, ///< Secure +}; + // This is nn::ssl::sf::SslVersion struct SslVersion { union { @@ -75,34 +81,34 @@ public: shared_data{shared_data_in}, backend{std::move(backend_in)} { // clang-format off static const FunctionInfo functions[] = { - {0, &ISslConnection::SetSocketDescriptor, "SetSocketDescriptor"}, - {1, &ISslConnection::SetHostName, "SetHostName"}, - {2, &ISslConnection::SetVerifyOption, "SetVerifyOption"}, - {3, &ISslConnection::SetIoMode, "SetIoMode"}, - {4, nullptr, "GetSocketDescriptor"}, - {5, nullptr, "GetHostName"}, + {0, D<&ISslConnection::SetSocketDescriptor>, "SetSocketDescriptor"}, + {1, D<&ISslConnection::SetHostName>, "SetHostName"}, + {2, D<&ISslConnection::SetVerifyOption>, "SetVerifyOption"}, + {3, D<&ISslConnection::SetIoMode>, "SetIoMode"}, + {4, D<&ISslConnection::GetSocketDescriptor>, "GetSocketDescriptor"}, + {5, D<&ISslConnection::GetHostName>, "GetHostName"}, {6, nullptr, "GetVerifyOption"}, - {7, nullptr, "GetIoMode"}, - {8, &ISslConnection::DoHandshake, "DoHandshake"}, + {7, D<&ISslConnection::GetIoMode>, "GetIoMode"}, + {8, D<&ISslConnection::DoHandshake>, "DoHandshake"}, {9, &ISslConnection::DoHandshakeGetServerCert, "DoHandshakeGetServerCert"}, - {10, &ISslConnection::Read, "Read"}, - {11, &ISslConnection::Write, "Write"}, - {12, &ISslConnection::Pending, "Pending"}, - {13, nullptr, "Peek"}, - {14, nullptr, "Poll"}, - {15, nullptr, "GetVerifyCertError"}, - {16, nullptr, "GetNeededServerCertBufferSize"}, - {17, &ISslConnection::SetSessionCacheMode, "SetSessionCacheMode"}, - {18, nullptr, "GetSessionCacheMode"}, - {19, nullptr, "FlushSessionCache"}, - {20, nullptr, "SetRenegotiationMode"}, - {21, nullptr, "GetRenegotiationMode"}, - {22, &ISslConnection::SetOption, "SetOption"}, - {23, &ISslConnection::GetOption, "GetOption"}, + {10, D<&ISslConnection::Read>, "Read"}, + {11, D<&ISslConnection::Write>, "Write"}, + {12, D<&ISslConnection::Pending>, "Pending"}, + {13, D<&ISslConnection::Peek>, "Peek"}, + {14, D<&ISslConnection::Poll>, "Poll"}, + {15, D<&ISslConnection::GetVerifyCertError>, "GetVerifyCertError"}, + {16, D<&ISslConnection::GetNeededServerCertBufferSize>, "GetNeededServerCertBufferSize"}, + {17, D<&ISslConnection::SetSessionCacheMode>, "SetSessionCacheMode"}, + {18, D<&ISslConnection::GetSessionCacheMode>, "GetSessionCacheMode"}, + {19, D<&ISslConnection::FlushSessionCache>, "FlushSessionCache"}, + {20, D<&ISslConnection::SetRenegotiationMode>, "SetRenegotiationMode"}, + {21, D<&ISslConnection::GetRenegotiationMode>, "GetRenegotiationMode"}, + {22, D<&ISslConnection::SetOption>, "SetOption"}, + {23, D<&ISslConnection::GetOption>, "GetOption"}, {24, nullptr, "GetVerifyCertErrors"}, {25, nullptr, "GetCipherInfo"}, - {26, &ISslConnection::SetNextAlpnProto, "SetNextAlpnProto"}, - {27, &ISslConnection::GetNextAlpnProto, "GetNextAlpnProto"}, + {26, D<&ISslConnection::SetNextAlpnProto>, "SetNextAlpnProto"}, + {27, D<&ISslConnection::GetNextAlpnProto>, "GetNextAlpnProto"}, {28, nullptr, "SetDtlsSocketDescriptor"}, {29, nullptr, "GetDtlsHandshakeTimeout"}, {30, nullptr, "SetPrivateOption"}, @@ -141,80 +147,6 @@ public: } private: - SslVersion ssl_version; - std::shared_ptr shared_data; - std::unique_ptr backend; - std::optional fd_to_close; - bool do_not_close_socket = false; - bool get_server_cert_chain = false; - bool skip_default_verify = false; - bool enable_alpn = false; - std::shared_ptr socket; - std::vector next_alpn_proto; - bool did_handshake = false; - u32 verify_option = 0; - - Result SetSocketDescriptorImpl(s32* out_fd, s32 fd) { - LOG_DEBUG(Service_SSL, "called, fd={}", fd); - ASSERT(!did_handshake); - auto bsd = system.ServiceManager().GetService("bsd:u"); - ASSERT_OR_EXECUTE(bsd, { return ResultInternalError; }); - - auto const res_v = bsd->DuplicateSocketImpl(fd); - if (auto *res = std::get_if(&res_v)) { - const s32 duplicated_fd = *res; - if (do_not_close_socket) { - *out_fd = duplicated_fd; - } else { - *out_fd = -1; - fd_to_close = duplicated_fd; - } - std::optional> sock = bsd->GetSocket(duplicated_fd); - if (!sock.has_value()) { - LOG_ERROR(Service_SSL, "invalid socket fd {} after duplication", duplicated_fd); - return ResultInvalidSocket; - } - socket = std::move(*sock); - backend->SetSocket(socket); - return ResultSuccess; - } - LOG_ERROR(Service_SSL, "Failed to duplicate socket with fd {}", fd); - return ResultInvalidSocket; - } - - Result SetHostNameImpl(const std::string& hostname) { - LOG_DEBUG(Service_SSL, "called. hostname={}", hostname); - ASSERT(!did_handshake); - return backend->SetHostName(hostname); - } - - Result SetVerifyOptionImpl(u32 option) { - ASSERT(!did_handshake); - LOG_DEBUG(Service_SSL, "called. option={} (forcing 0)", option); - verify_option = 0; - backend->SetVerifyOption(0); - return ResultSuccess; - } - - Result SetIoModeImpl(u32 input_mode) { - auto mode = static_cast(input_mode); - ASSERT(mode == IoMode::Blocking || mode == IoMode::NonBlocking); - ASSERT_OR_EXECUTE(socket, { return ResultNoSocket; }); - - const bool non_block = mode == IoMode::NonBlocking; - const Network::Errno error = socket->SetNonBlock(non_block); - if (error != Network::Errno::SUCCESS) { - LOG_ERROR(Service_SSL, "Failed to set native socket non-block flag to {}", non_block); - } - return ResultSuccess; - } - - Result SetSessionCacheModeImpl(u32 mode) { - ASSERT(!did_handshake); - LOG_WARNING(Service_SSL, "(STUBBED) called. value={}", mode); - return ResultSuccess; - } - Result DoHandshakeImpl() { ASSERT_OR_EXECUTE(!did_handshake && socket, { return ResultNoSocket; }); Result res = backend->DoHandshake(); @@ -234,19 +166,17 @@ private: }; if (!get_server_cert_chain) { // Just return the first one, unencoded. - ASSERT_OR_EXECUTE_MSG( - !certs.empty(), { return {}; }, "Should be at least one server cert"); + ASSERT_OR_EXECUTE_MSG(!certs.empty(), { return {}; }, "Should be at least one server cert"); return certs[0]; } std::vector ret; - Header header{0x4E4D684374726543, static_cast(certs.size()), 0}; + Header header{0x4E4D684374726543, u32(certs.size()), 0}; ret.insert(ret.end(), reinterpret_cast(&header), reinterpret_cast(&header + 1)); size_t data_offset = sizeof(Header) + certs.size() * sizeof(EntryHeader); for (auto& cert : certs) { - EntryHeader entry_header{static_cast(cert.size()), static_cast(data_offset)}; + EntryHeader entry_header{u32(cert.size()), u32(data_offset)}; data_offset += cert.size(); - ret.insert(ret.end(), reinterpret_cast(&entry_header), - reinterpret_cast(&entry_header + 1)); + ret.insert(ret.end(), reinterpret_cast(&entry_header), reinterpret_cast(&entry_header + 1)); } for (auto& cert : certs) { ret.insert(ret.end(), cert.begin(), cert.end()); @@ -254,65 +184,77 @@ private: return ret; } - Result ReadImpl(std::vector* out_data) { - ASSERT_OR_EXECUTE(did_handshake, { return ResultInternalError; }); - size_t actual_size{}; - Result res = backend->Read(&actual_size, *out_data); - if (res != ResultSuccess) { - return res; + Result SetSocketDescriptor(s32 in_fd, Out out_fd) { + LOG_DEBUG(Service_SSL, "called, fd={}", in_fd); + ASSERT(!did_handshake); + auto bsd = system.ServiceManager().GetService("bsd:u"); + ASSERT_OR_EXECUTE(bsd, { return ResultInternalError; }); + + auto const res_v = bsd->DuplicateSocketImpl(in_fd); + if (auto *res = std::get_if(&res_v)) { + const s32 dup_fd = *res; + *out_fd = do_not_close_socket ? dup_fd : -1; + if (!do_not_close_socket) + fd_to_close = dup_fd; + auto const sock = bsd->GetSocket(dup_fd); + if (!sock.has_value()) { + LOG_ERROR(Service_SSL, "invalid socket fd {} after duplication", dup_fd); + return ResultInvalidSocket; + } + socket = std::move(*sock); + backend->SetSocket(std::move(socket)); + return ResultSuccess; } - out_data->resize(actual_size); - return res; + LOG_ERROR(Service_SSL, "Failed to duplicate socket with fd {}", in_fd); + return ResultInvalidSocket; } - Result WriteImpl(size_t* out_size, std::span data) { - ASSERT_OR_EXECUTE(did_handshake, { return ResultInternalError; }); - return backend->Write(out_size, data); + Result SetHostName(InBuffer buf) { + auto const hostname = Common::StringFromBuffer(buf); + LOG_DEBUG(Service_SSL, "called. hostname={}", hostname); + ASSERT(!did_handshake); + return backend->SetHostName(hostname.c_str()); } - Result PendingImpl(s32* out_pending) { - LOG_WARNING(Service_SSL, "(STUBBED) called."); - *out_pending = 0; - return ResultSuccess; + Result SetVerifyOption(u32 option) { + LOG_DEBUG(Service_SSL, "called. option={} (forcing 0)", option); + ASSERT(!did_handshake); + verify_option = 0; + backend->SetVerifyOption(0); + R_SUCCEED(); } - void SetSocketDescriptor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const s32 in_fd = rp.Pop(); - s32 out_fd{-1}; - const Result res = SetSocketDescriptorImpl(&out_fd, in_fd); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(res); - rb.Push(out_fd); + Result SetIoMode(u32 input_mode) { + auto mode = IoMode(input_mode); + ASSERT(mode == IoMode::Blocking || mode == IoMode::NonBlocking); + R_UNLESS(socket, ResultNoSocket); + const bool non_block = mode == IoMode::NonBlocking; + const Network::Errno error = socket->SetNonBlock(non_block); + if (error != Network::Errno::SUCCESS) { + LOG_ERROR(Service_SSL, "Failed to set native socket non-block flag to {}", non_block); + } + R_SUCCEED(); } - void SetHostName(HLERequestContext& ctx) { - const std::string hostname = Common::StringFromBuffer(ctx.ReadBuffer()); - const Result res = SetHostNameImpl(hostname); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(res); + Result GetSocketDescriptor(Out out_fd) { + LOG_WARNING(Service_SSL, "(STUBBED)"); + *out_fd = socket->GetFD(); + R_SUCCEED(); } - void SetVerifyOption(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const u32 option = rp.Pop(); - const Result res = SetVerifyOptionImpl(option); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(res); + Result GetHostName(OutBuffer data, Out out_size) { + LOG_WARNING(Service_SSL, "(STUBBED)"); + ASSERT(!did_handshake); + return backend->GetHostName(std::span{data.begin(), data.end()}, out_size); } - void SetIoMode(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const u32 mode = rp.Pop(); - const Result res = SetIoModeImpl(mode); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(res); + Result GetIoMode(Out out_mode) { + LOG_WARNING(Service_SSL, "(STUBBED)"); + R_SUCCEED(); } - void DoHandshake(HLERequestContext& ctx) { - const Result res = DoHandshakeImpl(); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(res); + Result DoHandshake() { + return DoHandshakeImpl(); } void DoHandshakeGetServerCert(HLERequestContext& ctx) { @@ -351,131 +293,158 @@ private: rb.PushRaw(out); } - void Read(HLERequestContext& ctx) { - std::vector output_bytes(ctx.GetWriteBufferSize()); - const Result res = ReadImpl(&output_bytes); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(res); - if (res == ResultSuccess) { - rb.Push(static_cast(output_bytes.size())); - ctx.WriteBuffer(output_bytes); - } else { - rb.Push(static_cast(0)); - } + Result Read(OutBuffer data, Out out_size) { + R_UNLESS(did_handshake, ResultInternalError); + size_t tmp{}; + auto const res = backend->Read(&tmp, data); + *out_size = u32(tmp); + return res; } - void Write(HLERequestContext& ctx) { - size_t write_size{0}; - const Result res = WriteImpl(&write_size, ctx.ReadBuffer()); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(res); - rb.Push(static_cast(write_size)); + Result Write(InBuffer data, Out out_size) { + R_UNLESS(did_handshake, ResultInternalError); + size_t tmp{}; + auto const res = backend->Write(&tmp, data); + *out_size = u32(tmp); + return res; } - void Pending(HLERequestContext& ctx) { - s32 pending_size{0}; - const Result res = PendingImpl(&pending_size); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(res); - rb.Push(pending_size); + Result Pending(Out out_pending_size) { + LOG_WARNING(Service_SSL, "(STUBBED)"); + *out_pending_size = s32(backend->Pending()); + R_SUCCEED(); } - void SetSessionCacheMode(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const u32 mode = rp.Pop(); - const Result res = SetSessionCacheModeImpl(mode); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(res); + Result Peek(OutBuffer data, Out out_size) { + LOG_WARNING(Service_SSL, "(STUBBED)"); + size_t tmp{}; + auto const res = backend->Peek(&tmp, data); + *out_size = u32(tmp); + return res; } - void SetOption(HLERequestContext& ctx) { - struct Parameters { - OptionType option; - s32 value; - }; - static_assert(sizeof(Parameters) == 0x8, "Parameters is an invalid size"); - - IPC::RequestParser rp{ctx}; - const auto parameters = rp.PopRaw(); - - switch (parameters.option) { - case OptionType::DoNotCloseSocket: - do_not_close_socket = static_cast(parameters.value); - break; - case OptionType::GetServerCertChain: - get_server_cert_chain = static_cast(parameters.value); - break; - case OptionType::SkipDefaultVerify: - skip_default_verify = static_cast(parameters.value); - break; - case OptionType::EnableAlpn: - enable_alpn = static_cast(parameters.value); - break; - default: - LOG_WARNING(Service_SSL, "Unknown option={}, value={}", parameters.option, - parameters.value); - } - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); + Result Poll(u32 in_pollevent, u32 timer, Out out_pollevent) { + LOG_WARNING(Service_SSL, "(STUBBED)"); + R_SUCCEED(); } - void GetOption(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto option = rp.PopRaw(); + Result GetVerifyCertError() { + LOG_WARNING(Service_SSL, "(STUBBED)"); + R_SUCCEED(); + } - u8 value = 0; + Result GetNeededServerCertBufferSize(Out out_needed_buffer_size) { + LOG_WARNING(Service_SSL, "(STUBBED)"); + R_SUCCEED(); + } + Result SetSessionCacheMode(u32 mode) { + LOG_WARNING(Service_SSL, "(STUBBED) called. value={}", mode); + R_UNLESS(!did_handshake, ResultInternalError); + R_SUCCEED(); + } + + Result GetSessionCacheMode(Out mode) { + LOG_WARNING(Service_SSL, "(STUBBED)"); + R_UNLESS(!did_handshake, ResultInternalError); + R_SUCCEED(); + } + + Result FlushSessionCache() { + LOG_WARNING(Service_SSL, "(STUBBED)"); + R_UNLESS(!did_handshake, ResultInternalError); + R_SUCCEED(); + } + + Result SetRenegotiationMode(RenegotiationMode mode) { + LOG_WARNING(Service_SSL, "(STUBBED)"); + backend->SetRenegotiationMode(u32(mode)); + R_SUCCEED(); + } + + Result GetRenegotiationMode(Out mode) { + LOG_WARNING(Service_SSL, "(STUBBED)"); + u32 tmp{}; + auto const res = backend->GetRenegotiationMode(&tmp); + *mode = RenegotiationMode(tmp); + return res; + } + + Result SetOption(OptionType option, s32 value) { switch (option) { case OptionType::DoNotCloseSocket: - value = static_cast(do_not_close_socket); + do_not_close_socket = bool(value); break; case OptionType::GetServerCertChain: - value = static_cast(get_server_cert_chain); + get_server_cert_chain = bool(value); break; case OptionType::SkipDefaultVerify: - value = static_cast(skip_default_verify); + skip_default_verify = bool(value); break; case OptionType::EnableAlpn: - value = static_cast(enable_alpn); + enable_alpn = bool(value); break; default: - LOG_WARNING(Service_SSL, "Unknown option={}", option); - value = 0; + LOG_WARNING(Service_SSL, "Unknown option={}, value={}", option, value); + } + R_SUCCEED(); + } + + Result GetOption(OptionType option, Out value) { + switch (option) { + case OptionType::DoNotCloseSocket: + *value = u8(do_not_close_socket); + break; + case OptionType::GetServerCertChain: + *value = u8(get_server_cert_chain); + break; + case OptionType::SkipDefaultVerify: + *value = u8(skip_default_verify); + break; + case OptionType::EnableAlpn: + *value = u8(enable_alpn); + break; + default: + LOG_WARNING(Service_SSL, "Unknown option={}", u32(option)); + *value = 0; break; } - - LOG_DEBUG(Service_SSL, "GetOption called, option={}, ret value={}", option, value); - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(value); + LOG_DEBUG(Service_SSL, "GetOption called, option={}, ret value={}", u32(option), *value); + R_SUCCEED(); } - void SetNextAlpnProto(HLERequestContext& ctx) { - const auto data = ctx.ReadBuffer(0); - next_alpn_proto.assign(data.begin(), data.end()); - + Result SetNextAlpnProto(InBuffer data) { + auto const to_write = u32((std::min)(next_alpn_proto.size(), data.size())); + next_alpn_proto.assign(data.begin(), data.begin() + to_write); LOG_DEBUG(Service_SSL, "SetNextAlpnProto called, size={}", next_alpn_proto.size()); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); + R_SUCCEED(); } - void GetNextAlpnProto(HLERequestContext& ctx) { - const size_t writable = ctx.GetWriteBufferSize(); - const size_t to_write = (std::min)(next_alpn_proto.size(), writable); - - if (to_write != 0) { - ctx.WriteBuffer(std::span(next_alpn_proto.data(), to_write)); - } - - LOG_DEBUG(Service_SSL, "GetNextAlpnProto called, size={}", to_write); - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(static_cast(to_write)); + Result GetNextAlpnProto(OutBuffer data, Out to_write) { + *to_write = u32((std::min)(next_alpn_proto.size(), data.size())); + next_alpn_proto.assign(data.begin(), data.begin() + *to_write); + LOG_DEBUG(Service_SSL, "GetNextAlpnProto called, size={}", *to_write); + R_SUCCEED(); } + + Result GetVerifyCertErrors(OutBuffer unk0, Out unk1, Out unk2) { + LOG_WARNING(Service_SSL, "(STUBBED)"); + R_SUCCEED(); + } + + SslVersion ssl_version; + std::shared_ptr shared_data; + std::unique_ptr backend; + std::optional fd_to_close; + std::shared_ptr socket; + std::vector next_alpn_proto; + u32 verify_option = 0; + + bool do_not_close_socket = false; + bool get_server_cert_chain = false; + bool skip_default_verify = false; + bool enable_alpn = false; + bool did_handshake = false; }; class ISslContext final : public ServiceFramework { @@ -492,7 +461,7 @@ public: {5, &ISslContext::ImportClientPki, "ImportClientPki"}, {6, nullptr, "RemoveServerPki"}, {7, nullptr, "RemoveClientPki"}, - {8, nullptr, "RegisterInternalPki"}, + {8, D<&ISslContext::RegisterInternalPki>, "RegisterInternalPki"}, {9, nullptr, "AddPolicyOid"}, {10, nullptr, "ImportCrl"}, {11, nullptr, "RemoveCrl"}, @@ -587,6 +556,11 @@ private: rb.Push(ResultSuccess); rb.Push(client_id); } + + Result RegisterInternalPki() { + LOG_WARNING(Service_SSL, "(STUBBED) called"); + R_SUCCEED(); + } }; class ISslService final : public ServiceFramework { diff --git a/src/core/hle/service/ssl/ssl_backend.h b/src/core/hle/service/ssl/ssl_backend.h index a3127342a2..ef6bf8f9de 100644 --- a/src/core/hle/service/ssl/ssl_backend.h +++ b/src/core/hle/service/ssl/ssl_backend.h @@ -36,12 +36,17 @@ class SSLConnectionBackend { public: virtual ~SSLConnectionBackend() {} virtual void SetSocket(std::shared_ptr socket) = 0; - virtual Result SetHostName(const std::string& hostname) = 0; virtual void SetVerifyOption(u32 option) = 0; virtual Result DoHandshake() = 0; virtual Result Read(size_t* out_size, std::span data) = 0; + virtual Result Peek(size_t* out_size, std::span data) = 0; virtual Result Write(size_t* out_size, std::span data) = 0; virtual Result GetServerCerts(std::vector>* out_certs) = 0; + virtual Result SetHostName(const char* hostname) = 0; + virtual Result GetHostName(std::span hostname, u32* out_size) = 0; + virtual int Pending() = 0; + virtual Result SetRenegotiationMode(u32 mode) = 0; + virtual Result GetRenegotiationMode(u32* mode) = 0; }; Result CreateSSLConnectionBackend(std::unique_ptr* out_backend); diff --git a/src/core/hle/service/ssl/ssl_backend_openssl.cpp b/src/core/hle/service/ssl/ssl_backend_openssl.cpp index f0e05266ba..435ada845d 100644 --- a/src/core/hle/service/ssl/ssl_backend_openssl.cpp +++ b/src/core/hle/service/ssl/ssl_backend_openssl.cpp @@ -157,18 +157,30 @@ public: socket = std::move(socket_in); } - Result SetHostName(const std::string& hostname) override { + Result SetHostName(const char* hostname) override { if (!skip_cert_verification) { - if (!SSL_set1_host(ssl, hostname.c_str())) { + if (!SSL_set1_host(ssl, hostname)) { LOG_ERROR(Service_SSL, "SSL_set1_host({}) failed", hostname); return CheckOpenSSLErrors(); } } - if (!SSL_set_tlsext_host_name(ssl, hostname.c_str())) { // hostname for SNI + if (!SSL_set_tlsext_host_name(ssl, hostname)) { // hostname for SNI LOG_ERROR(Service_SSL, "SSL_set_tlsext_host_name({}) failed", hostname); return CheckOpenSSLErrors(); } - return ResultSuccess; + R_SUCCEED(); + } + + Result GetHostName(std::span data, u32* out_size) override { + auto const peer_name = SSL_get0_peername(ssl); + if (peer_name == nullptr) { + LOG_ERROR(Service_SSL, "SSL_get0_peername()"); + return CheckOpenSSLErrors(); + } + auto const s = std::string{peer_name}; + *out_size = u32(s.size()); + std::memcpy(data.data(), s.data(), (std::min)(s.size(), data.size())); + R_SUCCEED(); } void SetVerifyOption(u32 option) override { @@ -213,6 +225,13 @@ public: return HandleReturn("SSL_read_ex", out_size, ret); } + Result Peek(size_t* out_size, std::span data) override { + auto const n = (std::min)(data.size(), *out_size); + const int ret = SSL_peek(ssl, data.data(), int(n)); + *out_size = n; + return HandleReturn("SSL_write_ex", out_size, ret); + } + Result Write(size_t* out_size, std::span data) override { const int ret = SSL_write_ex(ssl, data.data(), data.size(), out_size); return HandleReturn("SSL_write_ex", out_size, ret); @@ -263,7 +282,25 @@ public: out_certs->emplace_back(buf, buf + len); OPENSSL_free(buf); } - return ResultSuccess; + R_SUCCEED(); + } + + int Pending() override { + return SSL_pending(ssl); + } + + Result SetRenegotiationMode(u32 mode) override { + if (mode == 0) { + SSL_CTX_set_options(ssl_ctx, SSL_OP_NO_RENEGOTIATION); + } else { + SSL_CTX_set_options(ssl_ctx, SSL_OP_ALLOW_CLIENT_RENEGOTIATION); + } + R_SUCCEED(); + } + + Result GetRenegotiationMode(u32* mode) override { + *mode = SSL_get_secure_renegotiation_support(ssl) ? 1 : 0; + R_SUCCEED(); } ~SSLConnectionBackendOpenSSL() { From f7b8ade40ec28b35309de0f86391ee7507affa36 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 17 Sep 2026 05:45:37 +0200 Subject: [PATCH 060/128] [hle] stpl:sys, stpl:u initial implementation (#4435) These cmds are hardcoded to use 0x20b, also the vftable is the same for `nn::sf::hipc`. Streamplay is probably not gonna be implemented fully, but some future updates *may* hang when querying for the service, thus registering it at once will avoid such issues. - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4435 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey --- src/core/hle/service/acc/profile_manager.h | 6 + .../hle/service/filesystem/fsp/fsp_srv.cpp | 3 + src/core/hle/service/ipc_helpers.h | 1 + src/core/hle/service/ngc/ngc.cpp | 117 ++++++++++++++++++ 4 files changed, 127 insertions(+) diff --git a/src/core/hle/service/acc/profile_manager.h b/src/core/hle/service/acc/profile_manager.h index 1fd0cc700f..81688175c2 100644 --- a/src/core/hle/service/acc/profile_manager.h +++ b/src/core/hle/service/acc/profile_manager.h @@ -23,6 +23,12 @@ constexpr std::size_t profile_username_size{32}; using ProfileUsername = std::array; using UserIDArray = std::array; +// This is nn::account::Uid +struct Uid { + std::array unk0; +}; +static_assert(sizeof(Uid) == 0x10); + /// Contains extra data related to a user. /// TODO: RE this structure struct UserData { diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp index 7d270b7b6f..58303a0bd6 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp @@ -154,6 +154,9 @@ FSP_SRV::FSP_SRV(Core::System& system_) {720, nullptr, "AbandonAccessFailure"}, {800, nullptr, "GetAndClearFileSystemProxyErrorInfo"}, {810, nullptr, "RegisterProgramIndexMapInfo"}, + {820, nullptr, "GetContentStorageInfoIndex"}, + {830, nullptr, "EncryptStreamPlaySaveData"}, + {831, nullptr, "DecryptStreamPlaySaveData"}, {1000, nullptr, "SetBisRootForHost"}, {1001, nullptr, "SetSaveDataSize"}, {1002, nullptr, "SetSaveDataRootPath"}, diff --git a/src/core/hle/service/ipc_helpers.h b/src/core/hle/service/ipc_helpers.h index 67eef7a087..a266b1a05c 100644 --- a/src/core/hle/service/ipc_helpers.h +++ b/src/core/hle/service/ipc_helpers.h @@ -22,6 +22,7 @@ namespace IPC { +constexpr Result ResultNotSupported{ErrorModule::HIPC, 1}; constexpr Result ResultSessionClosed{ErrorModule::HIPC, 301}; struct ResponseBuilder { diff --git a/src/core/hle/service/ngc/ngc.cpp b/src/core/hle/service/ngc/ngc.cpp index 06310145e5..e79108a1eb 100644 --- a/src/core/hle/service/ngc/ngc.cpp +++ b/src/core/hle/service/ngc/ngc.cpp @@ -6,10 +6,16 @@ #include "common/string_util.h" #include "core/core.h" +#include "core/hle/kernel/k_client_session.h" +#include "core/hle/result.h" +#include "core/hle/service/acc/profile_manager.h" +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/cmif_serialization.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/ngc/ngc.h" #include "core/hle/service/server_manager.h" #include "core/hle/service/service.h" +#include "frontend_common/firmware_manager.h" namespace Service::NGC { @@ -166,12 +172,123 @@ public: } }; +struct SaveDataHandle { + u64 unk0; +}; +static_assert(sizeof(SaveDataHandle) == 0x08); + +class IUserShimScopedObject final : public ServiceFramework { +public: + explicit IUserShimScopedObject(Core::System& system_) : ServiceFramework(system_, "IUserShimScopedObject") { + // clang-format off + static const FunctionInfo functions[] = { + {450, nullptr, "InitializeForSaveData"}, + {451, nullptr, "FinalizeForSaveData"}, + {452, D<&IUserShimScopedObject::OpenSaveData>, "OpenSaveData"}, + {453, nullptr, "CloseSaveData"}, + {454, D<&IUserShimScopedObject::ReadSaveSlot>, "ReadSaveSlot"}, + {455, D<&IUserShimScopedObject::WriteSaveSlot>, "WriteSaveSlot"}, + {456, nullptr, "FlushSaveSlot"}, + {457, nullptr, "CommitSaveData"}, + }; + // clang-format on + RegisterHandlers(functions); + } + + Result OpenSaveData(Account::Uid unk0, Out unk1) { + LOG_WARNING(Service_NGC, "stubbed"); + R_THROW(IPC::ResultNotSupported); + } + + Result ReadSaveSlot(s32 offset, SaveDataHandle handle, OutBuffer out_data, Out out_size) { + LOG_WARNING(Service_NGC, "stubbed"); + R_THROW(IPC::ResultNotSupported); + } + + Result WriteSaveSlot(s32 offset, SaveDataHandle handle, InBuffer out_data) { + LOG_WARNING(Service_NGC, "stubbed"); + // to implement + R_SUCCEED(); + } +}; + +class IUserService final : public ServiceFramework { +public: + explicit IUserService(Core::System& system_) : ServiceFramework(system_, "stpl:u") { + // clang-format off + static const FunctionInfo functions[] = { + {0 , D<&IUserService::Cmd0>, "Cmd0"}, + }; + // clang-format on + RegisterHandlers(functions); + } + Result Cmd0(u32 unk0, OutInterface out_interface) { + LOG_WARNING(Service_NGC, "stubbed"); + *out_interface = std::make_shared(system); + R_SUCCEED(); + } +}; + +class ISystemShimScopedObject final : public ServiceFramework { +public: + explicit ISystemShimScopedObject(Core::System& system_) : ServiceFramework(system_, "ISystemShimScopedObject") { + // clang-format off + static const FunctionInfo functions[] = { + {106, nullptr, "Cmd106"}, + {107, nullptr, "Cmd107"}, + {108, D<&ISystemShimScopedObject::Cmd108>, "Cmd108"}, + {207, nullptr, "Cmd207"}, + {208, D<&ISystemShimScopedObject::Cmd208>, "Cmd208"}, + {209, nullptr, "Cmd209"}, + {210, nullptr, "Cmd210"}, + {211, nullptr, "Cmd211"}, + {212, nullptr, "Cmd212"}, + }; + // clang-format on + RegisterHandlers(functions); + } + + Result Cmd108() { + LOG_WARNING(Service_NGC, "stubbed"); + R_THROW(IPC::ResultNotSupported); + } + + Result Cmd208(Out> unk0) { + LOG_WARNING(Service_NGC, "stubbed"); + R_THROW(IPC::ResultNotSupported); + } +}; + +class ISystemService final : public ServiceFramework { +public: + explicit ISystemService(Core::System& system_) : ServiceFramework(system_, "stpl:sys") { + // clang-format off + static const FunctionInfo functions[] = { + {0 , D<&ISystemService::Cmd0>, "Cmd0"}, + }; + // clang-format on + RegisterHandlers(functions); + } + Result Cmd0(OutInterface out_interface) { + LOG_WARNING(Service_NGC, "stubbed"); + *out_interface = std::make_shared(system); + R_SUCCEED(); + } +}; + void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); server_manager->RegisterNamedService("ngct:u", std::make_shared(system), 4); server_manager->RegisterNamedService("ngct:s", std::make_shared(system), 4); server_manager->RegisterNamedService("ngc:u", std::make_shared(system), 4); + + // +23.0.0 + if (FirmwareManager::GetFirmwareVersion(system).first.major >= 23) { + server_manager->RegisterNamedService("stpl:u", std::make_shared(system), 4); + server_manager->RegisterNamedService("stpl:sys", std::make_shared(system), 4); + } + ServerManager::RunServer(std::move(server_manager)); } From 73e004de6eb530567b3022531c11b92f55f265a6 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 17 Sep 2026 05:51:23 +0200 Subject: [PATCH 061/128] [common/page_table] unmark non-constexpr functions (#4433) `std::atomic` member functions don't translate unto `constexpr`. Trivial change, fixes CI warning. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4433 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey --- src/common/page_table.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/page_table.h b/src/common/page_table.h index 1588eca616..a21fe5311b 100644 --- a/src/common/page_table.h +++ b/src/common/page_table.h @@ -96,15 +96,15 @@ struct PageTable { } /// Write page info atomically - constexpr void Store(bool marked, PageType type, u16 block, uintptr_t pointer) noexcept { + inline void Store(bool marked, PageType type, u16 block, uintptr_t pointer) noexcept { data_raw.store(std::bit_cast(Data{marked, type, block, pointer})); } - constexpr void MarkRasterizerCached() noexcept { + inline void MarkRasterizerCached() noexcept { data_raw.fetch_or(0b111); } - constexpr void MarkDebug(u64 ptr, u16 block) noexcept { + inline void MarkDebug(u64 ptr, u16 block) noexcept { Store(true, PageType::DebugMemory, block, ptr); } From 6374f7f51f0254358fc26a0b3a182f06a9d84ec9 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 17 Sep 2026 05:52:36 +0200 Subject: [PATCH 062/128] Partial revert: [dynarmic] fix sign extension and optimize vaddr lookups for 64bit on x64 systems (#4446) (#4448) Breaks Mario Kart 8 Deluxe. #4446 Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4448 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey --- src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h index b78c14f6b7..d072b9963d 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h @@ -184,8 +184,8 @@ template<> } // check for sign bit, apply sign extension as needed if (ctx.conf.page_table_sign_extension) { - code.shl(page, 63 - int(*ctx.conf.page_table_sign_extension)); - code.sar(page, 63 - int(*ctx.conf.page_table_sign_extension)); + code.shl(page, *ctx.conf.page_table_sign_extension); + code.sar(page, *ctx.conf.page_table_sign_extension); } code.jz(abort, code.T_NEAR); From 14235dc0d0543c7397dd19eb1a677e76114c08f3 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 17 Sep 2026 08:15:58 +0200 Subject: [PATCH 063/128] [ips] fix .pchtxt with >256 bytes on a single line (#4445) It wasn't correct to assume pchtxt would've been less than 256 bytes per line. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4445 Reviewed-by: Maufeat Reviewed-by: CamilleLaVey --- src/core/file_sys/ips_layer.cpp | 36 ++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/core/file_sys/ips_layer.cpp b/src/core/file_sys/ips_layer.cpp index 9d46549bf0..5a0ddb44f8 100644 --- a/src/core/file_sys/ips_layer.cpp +++ b/src/core/file_sys/ips_layer.cpp @@ -100,8 +100,7 @@ VirtualFile PatchIPS(const VirtualFile& in, const VirtualFile& ips) { struct IPSwitchRecord { - std::array data; - size_t count; + std::vector data; }; struct IPSwitchCompiler::IPSwitchPatch { ::Common::unordered_map records; @@ -122,22 +121,23 @@ static IPSwitchRecord EscapeStringSequences(std::string_view sv) { IPSwitchRecord r{}; for (auto it = sv.cbegin(); it < sv.cend(); ) { if (*it == '\\' && it + 1 < sv.cend()) { - switch (it[1]) { - case 'a': r.data[r.count] = '\a'; break; - case 'b': r.data[r.count] = '\b'; break; - case 'e': r.data[r.count] = '\e'; break; - case 'f': r.data[r.count] = '\f'; break; - case 'n': r.data[r.count] = '\n'; break; - case 'r': r.data[r.count] = '\r'; break; - case 't': r.data[r.count] = '\t'; break; - case 'v': r.data[r.count] = '\v'; break; - case '?': r.data[r.count] = '\?'; break; - default: r.data[r.count] = it[1]; break; - } - ++r.count; + r.data.push_back([it]() { + switch (it[1]) { + case 'a': return '\a'; + case 'b': return '\b'; + case 'e': return '\e'; + case 'f': return '\f'; + case 'n': return '\n'; + case 'r': return '\r'; + case 't': return '\t'; + case 'v': return '\v'; + case '?': return '\?'; + default: return it[1]; + } + }()); it += 2; } else { - ++r.count; + r.data.push_back(*it); ++it; } } @@ -223,8 +223,8 @@ void IPSwitchCompiler::Parse(std::span bytes) { if (start <= line.cend() && end <= line.cend()) { // Actually IPS wants ordering from {lsb, ..., msb} -- so LE and BE are inverted, fun! auto const hs = Common::HexStringToVector({start, end}, is_little_endian); + r.data.resize(hs.size()); std::memcpy(r.data.data(), hs.data(), hs.size()); - r.count = hs.size(); LOG_INFO(Loader, "[H] value @ {:#08X}", offset); patches.back().records.insert_or_assign(u32(offset), std::move(r)); } else { @@ -293,7 +293,7 @@ VirtualFile IPSwitchCompiler::Apply(const VirtualFile& in) const { if (patch.enabled) { for (const auto& record : patch.records) { if (record.first < in_data.size()) { - auto replace_size = record.second.count; + auto replace_size = record.second.data.size(); if (record.first + replace_size > in_data.size()) replace_size = in_data.size() - record.first; std::memcpy(in_data.data() + record.first, record.second.data.data(), replace_size); From 1203082a8f1211ad6ce4d95f0c6947f7ecd27a55 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 17 Sep 2026 08:16:18 +0200 Subject: [PATCH 064/128] [msvc] fix build errors (#4451) MSVC doesn't consider atomic to be trivially copyable on x86 (why?). And other chary idiosyncrasies from constructing `std::optional` Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4451 Reviewed-by: Maufeat Reviewed-by: CamilleLaVey --- src/common/sparse_large_vector.h | 3 ++- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 4 ++-- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 4 ++-- src/core/hle/service/ssl/ssl.cpp | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/common/sparse_large_vector.h b/src/common/sparse_large_vector.h index 827944fb08..dad3aea97e 100644 --- a/src/common/sparse_large_vector.h +++ b/src/common/sparse_large_vector.h @@ -38,7 +38,8 @@ void FreeMemoryPages(void* base, std::size_t size) noexcept; /// A large page-aligned buffer that has optimized memory usage for zero-writes. template -requires std::is_trivially_copyable_v + // MSVC doesn't regard structs with atomics as trivially copyable + // requires std::is_trivially_copyable_v class SparseLargeVector final { public: constexpr SparseLargeVector() = default; diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 80e2b2dca9..8be0abc4fa 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -177,7 +177,7 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { config.page_table = reinterpret_cast*>( const_cast(page_table->entries.data())); config.page_table_pointer_mask = Common::PageTable::ATTRIBUTE_MASK; - config.page_table_marked_bit = 0; + config.page_table_marked_bit = uint8_t(0); config.absolute_offset_page_table = true; config.detect_misaligned_access_via_page_table = 16 | 32 | 64 | 128; config.only_detect_misalignment_via_page_table_on_page_boundary = true; @@ -193,7 +193,7 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) { Kernel::Board::Nintendo::Nx::KSystemControl::Init::GetIntendedMemorySize()) < (1ULL << 39)) { // Systems like FreeBSD allocate memory really low by default, and since we pack our page table entries, // we have to manually sign extend when our actual pointer is negative. - config.page_table_sign_extension = Common::PageTable::SIGN_BIT; + config.page_table_sign_extension = std::uint8_t(Common::PageTable::SIGN_BIT); } } diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 9662bf1712..9db40b9356 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -216,7 +216,7 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s const_cast(page_table->entries.data())); config.page_table_address_space_bits = std::uint32_t(address_space_bits); config.page_table_pointer_mask = Common::PageTable::ATTRIBUTE_MASK; - config.page_table_marked_bit = 0; + config.page_table_marked_bit = uint8_t(0); config.silently_mirror_page_table = false; config.absolute_offset_page_table = true; config.detect_misaligned_access_via_page_table = 16 | 32 | 64 | 128; @@ -235,7 +235,7 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s Kernel::Board::Nintendo::Nx::KSystemControl::Init::GetIntendedMemorySize()) < (1ULL << 39)) { // Systems like FreeBSD allocate memory really low by default, and since we pack our page table entries, // we have to manually sign extend when our actual pointer is negative. - config.page_table_sign_extension = Common::PageTable::SIGN_BIT; + config.page_table_sign_extension = std::uint8_t(Common::PageTable::SIGN_BIT); } } diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index 178c4c690b..999efd4295 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp @@ -238,7 +238,7 @@ private: Result GetSocketDescriptor(Out out_fd) { LOG_WARNING(Service_SSL, "(STUBBED)"); - *out_fd = socket->GetFD(); + *out_fd = uint32_t(socket->GetFD()); R_SUCCEED(); } From 0ce29be60874b24890ab9239cecf1bd67b924428 Mon Sep 17 00:00:00 2001 From: Feng Chen Date: Thu, 17 Sep 2026 19:50:19 +0200 Subject: [PATCH 065/128] [common] Fix RDTSC nanosecond conversion (#4422) Split the RDTSC ticks-per-nanosecond ratio into integer and Q0.64 fractional components. This avoids overflowing GetFixedPoint64Factor for TSC frequencies above 1 GHz while preserving the multiply-only conversion path. Use the invariant clock only above 1 GHz because the reverse nanoseconds-per-tick factor cannot represent an exact ratio of one. - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4422 Reviewed-by: lizzie Reviewed-by: MaranBr --- src/common/cpu_features.cpp | 7 ++++--- src/common/cpu_features.h | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/common/cpu_features.cpp b/src/common/cpu_features.cpp index 2e02c47826..8ccb6847f7 100644 --- a/src/common/cpu_features.cpp +++ b/src/common/cpu_features.cpp @@ -244,7 +244,8 @@ WallClock::WallClock(bool invariant_, u64 rdtsc_frequency_) noexcept , ns_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(NsRatio::den, rdtsc_frequency_) : 0} , us_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(UsRatio::den, rdtsc_frequency_) : 0} , ms_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(MsRatio::den, rdtsc_frequency_) : 0} - , rdtsc_ns_factor{invariant_ ? GetFixedPoint64Factor(rdtsc_frequency_, NsRatio::den) : 1} + , rdtsc_ns_integer{invariant_ ? rdtsc_frequency_ / NsRatio::den : 1} + , rdtsc_ns_factor{invariant_ ? GetFixedPoint64Factor(rdtsc_frequency_ % NsRatio::den, NsRatio::den) : 0} , cntpct_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(CNTFRQ, rdtsc_frequency_) : 0} , gputick_rdtsc_factor{invariant_ ? GetFixedPoint64Factor(GPUTickFreq, rdtsc_frequency_) : 0} , invariant{invariant_} @@ -291,7 +292,7 @@ bool WallClock::IsNative() const { } u64 WallClock::NsToTicks(std::chrono::nanoseconds ns) const { - return invariant ? MultiplyHigh(ns.count(), rdtsc_ns_factor) : ns.count(); + return ns.count() * rdtsc_ns_integer + MultiplyHigh(ns.count(), rdtsc_ns_factor); } #elif defined(HAS_NCE) namespace { @@ -416,7 +417,7 @@ u64 WallClock::NsToTicks(std::chrono::nanoseconds ns) const { const WallClock g_wall_clock = [] { #if defined(ARCHITECTURE_x86_64) auto const& caps = Common::g_cpu_caps; - return WallClock(caps.invariant_tsc && caps.tsc_frequency >= std::nano::den, caps.tsc_frequency); + return WallClock(caps.invariant_tsc && caps.tsc_frequency > std::nano::den, caps.tsc_frequency); #elif defined(HAS_NCE) return WallClock(false, 1); #else diff --git a/src/common/cpu_features.h b/src/common/cpu_features.h index 7dcb550f8f..61aa2767ab 100644 --- a/src/common/cpu_features.h +++ b/src/common/cpu_features.h @@ -96,6 +96,7 @@ public: u64 ns_rdtsc_factor; u64 us_rdtsc_factor; u64 ms_rdtsc_factor; + u64 rdtsc_ns_integer; u64 rdtsc_ns_factor; u64 cntpct_rdtsc_factor; u64 gputick_rdtsc_factor; From 3c38afad74c751a949de0bcca9a51cfc11797f68 Mon Sep 17 00:00:00 2001 From: xbzk Date: Fri, 18 Sep 2026 23:48:35 +0200 Subject: [PATCH 066/128] [fs] share parent resources with bundled programs (#4319) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Normal games are Applications; Bundled games are Application + Programs; We've been treating both as the same thing, calling both programs, and making programs unable to see settings and saves from application. References: https://switchbrew.org/wiki/Filesystem_services https://switchbrew.org/wiki/NCM_services#ApplicationId https://switchbrew.org/wiki/Super_Mario_3D_All-Stars Ryujinx.HLE/HOS/ApplicationLoader.cs:GetMultiProgramInfo UPDATE: The first version was a big rework to make AppId/ProgId concepts proper, and it was successful in most tests, but it caused a regression with applets, which are programs that breed straight from no application. In order to simplify things i've reverted all the rework, added a helper to identify whether a program has a parent Application and bounded it to it's proper stores. Although this is no big deal coz it doesn't have impact on emulation, it permeates to several routines, so it needs to be tested broadly. Applets, Normal games, Bundled games, Blobbed NSPs/XCIs, Mods, Updates, Saves, DLCs,. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4319 Reviewed-by: MaranBr Reviewed-by: lizzie --- src/core/file_sys/patch_manager.cpp | 68 +++++++++++++++++++------- src/core/file_sys/patch_manager.h | 4 ++ src/core/file_sys/registered_cache.cpp | 17 +++++++ src/core/file_sys/registered_cache.h | 2 + src/core/file_sys/savedata_factory.cpp | 22 ++++++--- src/core/file_sys/savedata_factory.h | 4 ++ 6 files changed, 91 insertions(+), 26 deletions(-) diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp index ada8c44e78..4fd7dc6c71 100644 --- a/src/core/file_sys/patch_manager.cpp +++ b/src/core/file_sys/patch_manager.cpp @@ -9,6 +9,7 @@ #include #include +#include "common/assert.h" #include "common/hex_util.h" #include "common/logging.h" #include "common/settings.h" @@ -156,12 +157,15 @@ std::string GetUpdateVersionStringFromSlot(const ContentProvider* provider, u64 NACP nacp{nacp_file}; return nacp.GetVersionString(); } +YUZU_NO_INLINE std::optional GetParentApplicationId(const ContentProvider* provider, u64 title_id) { + return provider == nullptr ? std::nullopt : provider->GetParentApplicationId(title_id); +} } // Anonymous namespace PatchManager::PatchManager(u64 title_id_, const Service::FileSystem::FileSystemController& fs_controller_, const ContentProvider& content_provider_) - : title_id{title_id_}, fs_controller{fs_controller_}, content_provider{content_provider_} {} + : title_id{title_id_}, parent_title_id{GetParentApplicationId(std::addressof(content_provider_), title_id_)}, fs_controller{fs_controller_}, content_provider{content_provider_} {} PatchManager::~PatchManager() = default; @@ -169,13 +173,35 @@ u64 PatchManager::GetTitleID() const { return title_id; } +VirtualDir PatchManager::GetModificationLoadRoot(bool sdmc) const { + const auto get_root = [&](u64 id) { + return sdmc ? fs_controller.GetSDMCModificationLoadRoot(id) : fs_controller.GetModificationLoadRoot(id); + }; + auto root = get_root(title_id); + if (!parent_title_id) { + return root; + } + std::vector roots{std::move(root), get_root(*parent_title_id)}; + std::erase(roots, nullptr); + return LayeredVfsDirectory::MakeLayeredDirectory(std::move(roots)); +} + +std::vector PatchManager::GetDisabledAddons() const { + auto disabled = Settings::values.disabled_addons[title_id]; + if (parent_title_id) { + const auto& shared = Settings::values.disabled_addons[*parent_title_id]; + disabled.insert(disabled.end(), shared.begin(), shared.end()); + } + return disabled; +} + VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const { LOG_INFO(Loader, "Patching ExeFS for title_id={:016X}", title_id); if (exefs == nullptr) return exefs; - const auto& disabled = Settings::values.disabled_addons[title_id]; + const auto disabled = GetDisabledAddons(); bool update_disabled = true; std::optional enabled_version; @@ -303,8 +329,8 @@ VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const { } // LayeredExeFS - const auto load_dir = fs_controller.GetModificationLoadRoot(title_id); - const auto sdmc_load_dir = fs_controller.GetSDMCModificationLoadRoot(title_id); + const auto load_dir = GetModificationLoadRoot(); + const auto sdmc_load_dir = GetModificationLoadRoot(true); std::vector patch_dirs = {sdmc_load_dir}; if (load_dir != nullptr) { @@ -346,7 +372,7 @@ VirtualDir PatchManager::PatchExeFS(VirtualDir exefs) const { } std::vector PatchManager::CollectPatches(const std::vector& patch_dirs, const std::string& build_id) const { - const auto& disabled = Settings::values.disabled_addons[title_id]; + const auto disabled = GetDisabledAddons(); const auto nso_build_id = fmt::format("{:0<64}", build_id); std::vector out; @@ -405,7 +431,7 @@ std::vector PatchManager::PatchNSO(const std::vector& nso, const std::st LOG_INFO(Loader, "Patching NSO for name={}, build_id={}", name, build_id); - const auto load_dir = fs_controller.GetModificationLoadRoot(title_id); + const auto load_dir = GetModificationLoadRoot(); if (load_dir == nullptr) { LOG_ERROR(Loader, "Cannot load mods for invalid title_id={:016X}", title_id); return nso; @@ -448,7 +474,7 @@ bool PatchManager::HasNSOPatch(const BuildID& build_id_, std::string_view name) LOG_INFO(Loader, "Querying NSO patch existence for build_id={}, name={}", build_id, name); - const auto load_dir = fs_controller.GetModificationLoadRoot(title_id); + const auto load_dir = GetModificationLoadRoot(); if (load_dir == nullptr) { LOG_ERROR(Loader, "Cannot load mods for invalid title_id={:016X}", title_id); return false; @@ -462,13 +488,13 @@ bool PatchManager::HasNSOPatch(const BuildID& build_id_, std::string_view name) } std::vector PatchManager::CreateCheatList(const BuildID& build_id_) const { - const auto load_dir = fs_controller.GetModificationLoadRoot(title_id); + const auto load_dir = GetModificationLoadRoot(); if (load_dir == nullptr) { LOG_ERROR(Loader, "Cannot load mods for invalid title_id={:016X}", title_id); return {}; } - const auto& disabled = Settings::values.disabled_addons[title_id]; + const auto disabled = GetDisabledAddons(); auto patch_dirs = load_dir->GetSubdirectories(); std::sort(patch_dirs.begin(), patch_dirs.end(), [](auto const& l, auto const& r) { return l->GetName() < r->GetName(); }); @@ -502,17 +528,16 @@ std::vector PatchManager::CreateCheatList(const BuildI return out; } -static void ApplyLayeredFS(VirtualFile& romfs, u64 title_id, ContentRecordType type, - const Service::FileSystem::FileSystemController& fs_controller) { - const auto load_dir = fs_controller.GetModificationLoadRoot(title_id); - const auto sdmc_load_dir = fs_controller.GetSDMCModificationLoadRoot(title_id); +void PatchManager::ApplyLayeredFS(VirtualFile& romfs, ContentRecordType type) const { + const auto load_dir = GetModificationLoadRoot(); + const auto sdmc_load_dir = GetModificationLoadRoot(true); if ((type != ContentRecordType::Program && type != ContentRecordType::Data && type != ContentRecordType::HtmlDocument) || (load_dir == nullptr && sdmc_load_dir == nullptr)) { return; } - const auto& disabled = Settings::values.disabled_addons[title_id]; + const auto disabled = GetDisabledAddons(); std::vector patch_dirs = load_dir->GetSubdirectories(); if (std::find(disabled.cbegin(), disabled.cend(), "SDMC") == disabled.cend()) { patch_dirs.push_back(sdmc_load_dir); @@ -591,7 +616,7 @@ VirtualFile PatchManager::PatchRomFS(const NCA* base_nca, VirtualFile base_romfs // Game Updates const auto update_tid = GetUpdateTitleID(title_id); - const auto& disabled = Settings::values.disabled_addons[title_id]; + const auto disabled = GetDisabledAddons(); bool update_disabled = true; std::optional enabled_version; @@ -698,7 +723,7 @@ VirtualFile PatchManager::PatchRomFS(const NCA* base_nca, VirtualFile base_romfs // LayeredFS if (apply_layeredfs) { - ApplyLayeredFS(romfs, title_id, type, fs_controller); + ApplyLayeredFS(romfs, type); } return romfs; @@ -1072,15 +1097,22 @@ std::vector PatchManager::GetPatches(VirtualFile update_raw) const { std::optional PatchManager::GetGameVersion() const { const auto update_tid = GetUpdateTitleID(title_id); if (content_provider.HasEntry(update_tid, ContentRecordType::Program)) { - return content_provider.GetEntryVersion(update_tid); + const auto version = content_provider.GetEntryVersion(update_tid); + return version || !parent_title_id ? version : content_provider.GetEntryVersion(GetUpdateTitleID(*parent_title_id)); } - return content_provider.GetEntryVersion(title_id); + const auto version = content_provider.GetEntryVersion(title_id); + return version || !parent_title_id ? version : content_provider.GetEntryVersion(*parent_title_id); } PatchManager::Metadata PatchManager::GetControlMetadata() const { const auto base_control_nca = content_provider.GetEntry(title_id, ContentRecordType::Control); if (base_control_nca == nullptr) { + if (parent_title_id) { + const auto control_id = content_provider.HasEntry(*parent_title_id, ContentRecordType::Control) ? *parent_title_id : GetUpdateTitleID(*parent_title_id); + const PatchManager parent{control_id, fs_controller, content_provider}; + return parent.GetControlMetadata(); + } return {}; } diff --git a/src/core/file_sys/patch_manager.h b/src/core/file_sys/patch_manager.h index 5d71dbcf20..6819a1a3e7 100644 --- a/src/core/file_sys/patch_manager.h +++ b/src/core/file_sys/patch_manager.h @@ -109,10 +109,14 @@ public: [[nodiscard]] static PatchManager::Metadata GetMetadataFromBaseOrUpdate(Core::System& system, u64 application_id) noexcept; private: + [[nodiscard]] VirtualDir GetModificationLoadRoot(bool sdmc = false) const; + [[nodiscard]] std::vector GetDisabledAddons() const; + void ApplyLayeredFS(VirtualFile& romfs, ContentRecordType type) const; [[nodiscard]] std::vector CollectPatches(const std::vector& patch_dirs, const std::string& build_id) const; u64 title_id; + std::optional parent_title_id; const Service::FileSystem::FileSystemController& fs_controller; const ContentProvider& content_provider; }; diff --git a/src/core/file_sys/registered_cache.cpp b/src/core/file_sys/registered_cache.cpp index ce851e4d38..1f430434f7 100644 --- a/src/core/file_sys/registered_cache.cpp +++ b/src/core/file_sys/registered_cache.cpp @@ -5,6 +5,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include #include #include @@ -348,6 +349,22 @@ std::vector ContentProvider::ListEntries() const { return ListEntriesFilter(std::nullopt, std::nullopt, std::nullopt); } +std::optional ContentProvider::GetParentApplicationId(u64 program_id) const { + const auto application_id = GetBaseTitleID(program_id); + const auto program_index = program_id - application_id; + if (program_index == 0 || program_index > std::numeric_limits::max()) { + return std::nullopt; + } + if (!ListEntriesFilter(TitleType::Application, ContentRecordType::Meta, program_id).empty()) { + return std::nullopt; + } + if ((!ListEntriesFilter(TitleType::Application, ContentRecordType::Meta, application_id).empty() && HasEntry(program_id, ContentRecordType::Program)) + || (!ListEntriesFilter(TitleType::Update, ContentRecordType::Meta, GetUpdateTitleID(application_id)).empty() && HasEntry(GetUpdateTitleID(program_id), ContentRecordType::Program))) { + return application_id; + } + return std::nullopt; +} + PlaceholderCache::PlaceholderCache(VirtualDir dir_) : dir(std::move(dir_)) {} bool PlaceholderCache::Create(const NcaID& id, u64 size) const { diff --git a/src/core/file_sys/registered_cache.h b/src/core/file_sys/registered_cache.h index a8e60ad470..89140a2e95 100644 --- a/src/core/file_sys/registered_cache.h +++ b/src/core/file_sys/registered_cache.h @@ -100,6 +100,8 @@ public: std::optional title_type = {}, std::optional record_type = {}, std::optional title_id = {}) const = 0; + [[nodiscard]] std::optional GetParentApplicationId(u64 program_id) const; + protected: // A single instance of KeyManager to be used by GetEntry() Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::Instance(); diff --git a/src/core/file_sys/savedata_factory.cpp b/src/core/file_sys/savedata_factory.cpp index c756734a43..72f022cb41 100644 --- a/src/core/file_sys/savedata_factory.cpp +++ b/src/core/file_sys/savedata_factory.cpp @@ -9,6 +9,7 @@ #include "common/logging.h" #include "common/uuid.h" #include "core/core.h" +#include "core/file_sys/registered_cache.h" #include "core/file_sys/savedata_factory.h" #include "core/file_sys/vfs/vfs.h" @@ -61,17 +62,24 @@ SaveDataFactory::SaveDataFactory(Core::System& system_, ProgramId program_id_, SaveDataFactory::~SaveDataFactory() = default; +std::string SaveDataFactory::GetSaveDataPath(SaveDataSpaceId space, SaveDataType type, u64 title_id, u128 user_id, u64 save_id) const { + if (type == SaveDataType::Account || type == SaveDataType::Device) { + const auto requested_id = title_id != 0 ? title_id : program_id; + const auto parent_id = system.GetContentProvider().GetParentApplicationId(requested_id); + title_id = parent_id.value_or(requested_id); + } + return GetFullPath(program_id, dir, space, type, title_id, user_id, save_id); +} + VirtualDir SaveDataFactory::Create(SaveDataSpaceId space, const SaveDataAttribute& meta) const { - const auto save_directory = GetFullPath(program_id, dir, space, meta.type, meta.program_id, - meta.user_id, meta.system_save_data_id); + const auto save_directory = GetSaveDataPath(space, meta.type, meta.program_id, meta.user_id, meta.system_save_data_id); return dir->CreateDirectoryRelative(save_directory); } VirtualDir SaveDataFactory::Open(SaveDataSpaceId space, const SaveDataAttribute& meta) const { - const auto save_directory = GetFullPath(program_id, dir, space, meta.type, meta.program_id, - meta.user_id, meta.system_save_data_id); + const auto save_directory = GetSaveDataPath(space, meta.type, meta.program_id, meta.user_id, meta.system_save_data_id); auto out = dir->GetDirectoryRelative(save_directory); @@ -154,8 +162,7 @@ std::string SaveDataFactory::GetUserGameSaveDataRoot(u128 user_id, bool future) SaveDataSize SaveDataFactory::ReadSaveDataSize(SaveDataType type, u64 title_id, u128 user_id) const { - const auto path = - GetFullPath(program_id, dir, SaveDataSpaceId::User, type, title_id, user_id, 0); + const auto path = GetSaveDataPath(SaveDataSpaceId::User, type, title_id, user_id, 0); const auto relative_dir = GetOrCreateDirectoryRelative(dir, path); const auto size_file = relative_dir->GetFile(GetSaveDataSizeFileName()); @@ -173,8 +180,7 @@ SaveDataSize SaveDataFactory::ReadSaveDataSize(SaveDataType type, u64 title_id, void SaveDataFactory::WriteSaveDataSize(SaveDataType type, u64 title_id, u128 user_id, SaveDataSize new_value) const { - const auto path = - GetFullPath(program_id, dir, SaveDataSpaceId::User, type, title_id, user_id, 0); + const auto path = GetSaveDataPath(SaveDataSpaceId::User, type, title_id, user_id, 0); const auto relative_dir = GetOrCreateDirectoryRelative(dir, path); const auto size_file = relative_dir->CreateFile(GetSaveDataSizeFileName()); diff --git a/src/core/file_sys/savedata_factory.h b/src/core/file_sys/savedata_factory.h index 15dd4ec7de..36c09ce2ac 100644 --- a/src/core/file_sys/savedata_factory.h +++ b/src/core/file_sys/savedata_factory.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -47,6 +50,7 @@ public: void SetAutoCreate(bool state); private: + std::string GetSaveDataPath(SaveDataSpaceId space, SaveDataType type, u64 title_id, u128 user_id, u64 save_id) const; Core::System& system; ProgramId program_id; VirtualDir dir; From 07f40d5cac635ff102aa6ce9c32572cc20d69959 Mon Sep 17 00:00:00 2001 From: xbzk Date: Fri, 18 Sep 2026 23:49:17 +0200 Subject: [PATCH 067/128] [npad,hid,am] npad WriteEmptyEntry fix, hid function 551 stub, and applet PopOutData rework (#4442) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- This was intended to fix Dave the Diver issue, but we found a real silly hid bug, then a maybe broader applet issue: By testing with John it was found out only the last controller connected worked, the others caused the game to freeze peacefully, no crashes, suggesting some loop or deadlock. After seeking that lead, it was found that the freeze was caused by a malformed HID history entry when the controller applet removed P2. Pressing P1 opens the controller applet, then Qt applet disconnects P2, which is expected. Upon seeking callstack and hid sync path, it was found out that NPad::WriteEmptyEntry: was using: ReadCurrentEntry().sampling_number + 1 instead of: ReadCurrentEntry().state.sampling_number + 1 (checked AtomicStorage in src\hid_core\resources\ring_lifo.h) Fixing that fixed the freeze, but killed the sound! Later handheld/docked was accidentally clicked and sound returned. Good lead. Then i just had to corner which part of the toggle was causing the refresh and do something similar at the controller applet return routine (PopOutData in library_applet_accessor.cpp). This part seems harmless, but i'm not clearly sure about how proper it is, since it was like a transplant and test operation. UPDATE: To try Diablo 3 on my machine it was needed to stub HID function 551. And to fix all abnormalies like multiple applet requests and crash the function PopOutData was reworked to ensurey idempotency among different applet focus conditions: focus state changed: updates state and signals if needed no state change, HLE application frontend: requests focus state changed notification already pending change message: flag remains true and no duplicate pushed to queue entry Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4442 Reviewed-by: MaranBr Reviewed-by: lizzie --- src/core/hle/service/am/lifecycle_manager.h | 7 +++++++ .../am/service/library_applet_accessor.cpp | 14 +++++++------- src/core/hle/service/hid/hid_system_server.cpp | 4 ++-- src/hid_core/resources/npad/npad.cpp | 16 ++++++++-------- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/core/hle/service/am/lifecycle_manager.h b/src/core/hle/service/am/lifecycle_manager.h index ae041d3e29..15657a36d8 100644 --- a/src/core/hle/service/am/lifecycle_manager.h +++ b/src/core/hle/service/am/lifecycle_manager.h @@ -92,6 +92,13 @@ public: } } + void RequestFocusStateChangedNotification(Kernel::KernelCore& kernel) { + if (m_focus_state_changed_notification_enabled) { + m_has_focus_state_changed = true; + this->SignalSystemEventIfNeeded(kernel); + } + } + void OnOperationAndPerformanceModeChanged(Kernel::KernelCore& kernel); public: diff --git a/src/core/hle/service/am/service/library_applet_accessor.cpp b/src/core/hle/service/am/service/library_applet_accessor.cpp index c49b1f3f05..849e5794cf 100644 --- a/src/core/hle/service/am/service/library_applet_accessor.cpp +++ b/src/core/hle/service/am/service/library_applet_accessor.cpp @@ -164,14 +164,14 @@ Result ILibraryAppletAccessor::PushInData(SharedPointer storage) { Result ILibraryAppletAccessor::PopOutData(Out> out_storage) { LOG_DEBUG(Service_AM, "called"); - if (auto caller_applet = m_applet->caller_applet.lock(); caller_applet) { - caller_applet->lifecycle_manager.GetSystemEvent().Signal(system.Kernel()); - caller_applet->lifecycle_manager.RequestResumeNotification(); - caller_applet->lifecycle_manager.GetSystemEvent().Clear(system.Kernel()); - caller_applet->lifecycle_manager.UpdateRequestedFocusState(); - } - R_TRY(m_broker->GetOutData().Pop(system.Kernel(), out_storage.Get())); + if (auto caller_applet = m_applet->caller_applet.lock(); caller_applet) { + std::scoped_lock lk{caller_applet->lock}; + const bool focus_state_changed = caller_applet->lifecycle_manager.UpdateRequestedFocusState(); + const bool is_front_app = m_applet->frontend && caller_applet->lifecycle_manager.IsApplication(); + if (focus_state_changed) caller_applet->lifecycle_manager.SignalSystemEventIfNeeded(system.Kernel()); + else if (is_front_app) caller_applet->lifecycle_manager.RequestFocusStateChangedNotification(system.Kernel()); + } if (m_applet->applet_id == AppletId::ProfileSelect && *out_storage) { auto impl = (*out_storage)->GetImpl(); diff --git a/src/core/hle/service/hid/hid_system_server.cpp b/src/core/hle/service/hid/hid_system_server.cpp index f3c01b5d89..e544adf03c 100644 --- a/src/core/hle/service/hid/hid_system_server.cpp +++ b/src/core/hle/service/hid/hid_system_server.cpp @@ -121,7 +121,7 @@ IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr data; diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index e7a1ee2bf3..c67f839df1 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp @@ -398,21 +398,21 @@ void NPad::InitNewlyAddedController(Kernel::KernelCore& kernel, u64 aruid, Core: void NPad::WriteEmptyEntry(NpadInternalState* npad) { NPadGenericState dummy_pad_state{}; NpadGcTriggerState dummy_gc_state{}; - dummy_pad_state.sampling_number = npad->fullkey_lifo.ReadCurrentEntry().sampling_number + 1; + dummy_pad_state.sampling_number = npad->fullkey_lifo.ReadCurrentEntry().state.sampling_number + 1; npad->fullkey_lifo.WriteNextEntry(dummy_pad_state); - dummy_pad_state.sampling_number = npad->handheld_lifo.ReadCurrentEntry().sampling_number + 1; + dummy_pad_state.sampling_number = npad->handheld_lifo.ReadCurrentEntry().state.sampling_number + 1; npad->handheld_lifo.WriteNextEntry(dummy_pad_state); - dummy_pad_state.sampling_number = npad->joy_dual_lifo.ReadCurrentEntry().sampling_number + 1; + dummy_pad_state.sampling_number = npad->joy_dual_lifo.ReadCurrentEntry().state.sampling_number + 1; npad->joy_dual_lifo.WriteNextEntry(dummy_pad_state); - dummy_pad_state.sampling_number = npad->joy_left_lifo.ReadCurrentEntry().sampling_number + 1; + dummy_pad_state.sampling_number = npad->joy_left_lifo.ReadCurrentEntry().state.sampling_number + 1; npad->joy_left_lifo.WriteNextEntry(dummy_pad_state); - dummy_pad_state.sampling_number = npad->joy_right_lifo.ReadCurrentEntry().sampling_number + 1; + dummy_pad_state.sampling_number = npad->joy_right_lifo.ReadCurrentEntry().state.sampling_number + 1; npad->joy_right_lifo.WriteNextEntry(dummy_pad_state); - dummy_pad_state.sampling_number = npad->palma_lifo.ReadCurrentEntry().sampling_number + 1; + dummy_pad_state.sampling_number = npad->palma_lifo.ReadCurrentEntry().state.sampling_number + 1; npad->palma_lifo.WriteNextEntry(dummy_pad_state); - dummy_pad_state.sampling_number = npad->system_ext_lifo.ReadCurrentEntry().sampling_number + 1; + dummy_pad_state.sampling_number = npad->system_ext_lifo.ReadCurrentEntry().state.sampling_number + 1; npad->system_ext_lifo.WriteNextEntry(dummy_pad_state); - dummy_gc_state.sampling_number = npad->gc_trigger_lifo.ReadCurrentEntry().sampling_number + 1; + dummy_gc_state.sampling_number = npad->gc_trigger_lifo.ReadCurrentEntry().state.sampling_number + 1; npad->gc_trigger_lifo.WriteNextEntry(dummy_gc_state); } From 9a30172e45fcb7833cc49ba4d6450211449b14df Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 19 Sep 2026 01:39:46 +0200 Subject: [PATCH 068/128] [dynarmic] Coalesce non-exclusive Write/Read fallback functions (#4158) the general idea is to have a common procedure form whom to call this way theres less "jumping around" for values of different sizes additionally this **should** allow for better codegen since most of the u8,u16,u32,u64 can be held within a u64 theoretically this means that you could deifne callbacks in suck a way that it's essentially as costly as a `mov r64, m64` but that's not doable due to the fact we have to do translations... Is this a good change? Primarily aimed for x86 and ARM to benefit, but I suppose LooooooongArch64 can benefit too. Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4158 Reviewed-by: crueter Reviewed-by: MaranBr Reviewed-by: CamilleLaVey --- src/core/arm/dynarmic/arm_dynarmic_32.cpp | 52 +++---- src/core/arm/dynarmic/arm_dynarmic_32.h | 10 +- src/core/arm/dynarmic/arm_dynarmic_64.cpp | 52 +++---- src/core/arm/dynarmic/arm_dynarmic_64.h | 11 +- src/core/hle/service/jit/jit_context.cpp | 62 ++++---- src/core/tools/freezer.cpp | 16 +- .../backend/arm64/a32_address_space.cpp | 39 ++--- .../backend/arm64/a64_address_space.cpp | 40 ++--- .../dynarmic/backend/arm64/address_space.cpp | 51 +++++-- .../dynarmic/backend/arm64/address_space.h | 20 +-- .../backend/x64/a32_emit_x64_memory.cpp | 60 ++++---- .../backend/x64/a64_emit_x64_memory.cpp | 62 ++++---- .../backend/x64/emit_x64_memory.cpp.inc | 36 +++-- .../src/dynarmic/interface/A32/config.h | 14 +- .../src/dynarmic/interface/A64/config.h | 14 +- src/dynarmic/src/dynarmic/ir/opt_passes.cpp | 8 +- src/dynarmic/tests/A32/fuzz_thumb.cpp | 2 +- .../tests/A32/test_arm_instructions.cpp | 6 +- src/dynarmic/tests/A32/testenv.h | 127 ++++++++-------- src/dynarmic/tests/A64/a64.cpp | 20 +-- src/dynarmic/tests/A64/fibonacci.cpp | 81 +++++----- src/dynarmic/tests/A64/testenv.h | 142 ++++++++++-------- src/dynarmic/tests/print_info.cpp | 72 +++++---- .../tests/unicorn_emu/a32_unicorn.cpp | 21 +-- .../tests/unicorn_emu/a64_unicorn.cpp | 21 +-- 25 files changed, 475 insertions(+), 564 deletions(-) diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 8be0abc4fa..a59aa3cac3 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -22,21 +22,15 @@ DynarmicCallbacks32::DynarmicCallbacks32(ArmDynarmic32& parent, Kernel::KProcess , m_check_memory_access{m_debugger_enabled || !Settings::values.cpuopt_ignore_memory_aborts.GetValue()} {} -u8 DynarmicCallbacks32::MemoryRead8(u32 vaddr) { - CheckMemoryAccess(vaddr, 1, Kernel::DebugWatchpointType::Read); - return m_memory.Read8(vaddr); -} -u16 DynarmicCallbacks32::MemoryRead16(u32 vaddr) { - CheckMemoryAccess(vaddr, 2, Kernel::DebugWatchpointType::Read); - return m_memory.Read16(vaddr); -} -u32 DynarmicCallbacks32::MemoryRead32(u32 vaddr) { - CheckMemoryAccess(vaddr, 4, Kernel::DebugWatchpointType::Read); - return m_memory.Read32(vaddr); -} -u64 DynarmicCallbacks32::MemoryRead64(u32 vaddr) { - CheckMemoryAccess(vaddr, 8, Kernel::DebugWatchpointType::Read); - return m_memory.Read64(vaddr); +u64 DynarmicCallbacks32::MemoryRead(u32 vaddr, size_t size) { + CheckMemoryAccess(vaddr, size, Kernel::DebugWatchpointType::Read); + switch (size) { + case sizeof(u64): return m_memory.Read64(vaddr); + case sizeof(u32): return m_memory.Read32(vaddr); + case sizeof(u16): return m_memory.Read16(vaddr); + case sizeof(u8): return m_memory.Read8(vaddr); + default: UNREACHABLE(); + } } std::optional DynarmicCallbacks32::MemoryReadCode(u32 vaddr) { @@ -50,27 +44,17 @@ std::optional DynarmicCallbacks32::MemoryReadCode(u32 vaddr) { return cached_code_page.inst[(vaddr & Core::Memory::YUZU_PAGEMASK) / sizeof(u32)]; } -void DynarmicCallbacks32::MemoryWrite8(u32 vaddr, u8 value) { - if (CheckMemoryAccess(vaddr, 1, Kernel::DebugWatchpointType::Write)) { - m_memory.Write8(vaddr, value); +void DynarmicCallbacks32::MemoryWrite(Dynarmic::A32::VAddr vaddr, u64 value, size_t size) { + if (CheckMemoryAccess(vaddr, size, Kernel::DebugWatchpointType::Write)) { + switch (size) { + case sizeof(u64): return m_memory.Write64(vaddr, value); + case sizeof(u32): return m_memory.Write32(vaddr, u32(value)); + case sizeof(u16): return m_memory.Write16(vaddr, u16(value)); + case sizeof(u8): return m_memory.Write8(vaddr, u8(value)); + default: UNREACHABLE(); + } } } -void DynarmicCallbacks32::MemoryWrite16(u32 vaddr, u16 value) { - if (CheckMemoryAccess(vaddr, 2, Kernel::DebugWatchpointType::Write)) { - m_memory.Write16(vaddr, value); - } -} -void DynarmicCallbacks32::MemoryWrite32(u32 vaddr, u32 value) { - if (CheckMemoryAccess(vaddr, 4, Kernel::DebugWatchpointType::Write)) { - m_memory.Write32(vaddr, value); - } -} -void DynarmicCallbacks32::MemoryWrite64(u32 vaddr, u64 value) { - if (CheckMemoryAccess(vaddr, 8, Kernel::DebugWatchpointType::Write)) { - m_memory.Write64(vaddr, value); - } -} - bool DynarmicCallbacks32::MemoryWriteExclusive8(u32 vaddr, u8 value, u8 expected) { return CheckMemoryAccess(vaddr, 1, Kernel::DebugWatchpointType::Write) && m_memory.WriteExclusive8(vaddr, value, expected); diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.h b/src/core/arm/dynarmic/arm_dynarmic_32.h index 623597152f..22655dff47 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.h +++ b/src/core/arm/dynarmic/arm_dynarmic_32.h @@ -30,18 +30,12 @@ class System; class DynarmicCallbacks32 : public Dynarmic::A32::UserCallbacks { public: explicit DynarmicCallbacks32(ArmDynarmic32& parent, Kernel::KProcess* process); - u8 MemoryRead8(u32 vaddr) override; - u16 MemoryRead16(u32 vaddr) override; - u32 MemoryRead32(u32 vaddr) override; - u64 MemoryRead64(u32 vaddr) override; + u64 MemoryRead(u32 vaddr, size_t size) override; std::optional MemoryReadCode(u32 vaddr) override; void InstructionSynchronizationBarrierRaised() override { last_code_addr = u64(-1); //reset back, force refetch } - void MemoryWrite8(u32 vaddr, u8 value) override; - void MemoryWrite16(u32 vaddr, u16 value) override; - void MemoryWrite32(u32 vaddr, u32 value) override; - void MemoryWrite64(u32 vaddr, u64 value) override; + void MemoryWrite(Dynarmic::A32::VAddr vaddr, u64 value, size_t size) override; bool MemoryWriteExclusive8(u32 vaddr, u8 value, u8 expected) override; bool MemoryWriteExclusive16(u32 vaddr, u16 value, u16 expected) override; bool MemoryWriteExclusive32(u32 vaddr, u32 value, u32 expected) override; diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp index 9db40b9356..894857a86d 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp @@ -10,6 +10,7 @@ #include "core/arm/dynarmic/dynarmic_exclusive_monitor.h" #include "core/core_timing.h" #include "core/hle/kernel/k_process.h" +#include "dynarmic/interface/A64/config.h" namespace Core { @@ -21,21 +22,15 @@ DynarmicCallbacks64::DynarmicCallbacks64(ArmDynarmic64& parent, Kernel::KProcess , m_check_memory_access{m_debugger_enabled || !Settings::values.cpuopt_ignore_memory_aborts.GetValue()} {} -u8 DynarmicCallbacks64::MemoryRead8(u64 vaddr) { - CheckMemoryAccess(vaddr, 1, Kernel::DebugWatchpointType::Read); - return m_memory.Read8(vaddr); -} -u16 DynarmicCallbacks64::MemoryRead16(u64 vaddr) { - CheckMemoryAccess(vaddr, 2, Kernel::DebugWatchpointType::Read); - return m_memory.Read16(vaddr); -} -u32 DynarmicCallbacks64::MemoryRead32(u64 vaddr) { - CheckMemoryAccess(vaddr, 4, Kernel::DebugWatchpointType::Read); - return m_memory.Read32(vaddr); -} -u64 DynarmicCallbacks64::MemoryRead64(u64 vaddr) { - CheckMemoryAccess(vaddr, 8, Kernel::DebugWatchpointType::Read); - return m_memory.Read64(vaddr); +u64 DynarmicCallbacks64::MemoryRead(u64 vaddr, size_t size) { + CheckMemoryAccess(vaddr, size, Kernel::DebugWatchpointType::Read); + switch (size) { + case sizeof(u64): return m_memory.Read64(vaddr); + case sizeof(u32): return m_memory.Read32(vaddr); + case sizeof(u16): return m_memory.Read16(vaddr); + case sizeof(u8): return m_memory.Read8(vaddr); + default: UNREACHABLE(); + } } Dynarmic::A64::Vector DynarmicCallbacks64::MemoryRead128(u64 vaddr) { CheckMemoryAccess(vaddr, 16, Kernel::DebugWatchpointType::Read); @@ -53,24 +48,15 @@ std::optional DynarmicCallbacks64::MemoryReadCode(u64 vaddr) { return cached_code_page.inst[(vaddr & Core::Memory::YUZU_PAGEMASK) / sizeof(u32)]; } -void DynarmicCallbacks64::MemoryWrite8(u64 vaddr, u8 value) { - if (CheckMemoryAccess(vaddr, 1, Kernel::DebugWatchpointType::Write)) { - m_memory.Write8(vaddr, value); - } -} -void DynarmicCallbacks64::MemoryWrite16(u64 vaddr, u16 value) { - if (CheckMemoryAccess(vaddr, 2, Kernel::DebugWatchpointType::Write)) { - m_memory.Write16(vaddr, value); - } -} -void DynarmicCallbacks64::MemoryWrite32(u64 vaddr, u32 value) { - if (CheckMemoryAccess(vaddr, 4, Kernel::DebugWatchpointType::Write)) { - m_memory.Write32(vaddr, value); - } -} -void DynarmicCallbacks64::MemoryWrite64(u64 vaddr, u64 value) { - if (CheckMemoryAccess(vaddr, 8, Kernel::DebugWatchpointType::Write)) { - m_memory.Write64(vaddr, value); +void DynarmicCallbacks64::MemoryWrite(Dynarmic::A64::VAddr vaddr, u64 value, std::size_t size) { + if (CheckMemoryAccess(vaddr, size, Kernel::DebugWatchpointType::Write)) { + switch (size) { + case sizeof(u64): return m_memory.Write64(vaddr, u64(value)); + case sizeof(u32): return m_memory.Write32(vaddr, u32(value)); + case sizeof(u16): return m_memory.Write16(vaddr, u16(value)); + case sizeof(u8): return m_memory.Write8(vaddr, u8(value)); + default: UNREACHABLE(); + } } } void DynarmicCallbacks64::MemoryWrite128(u64 vaddr, Dynarmic::A64::Vector value) { diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.h b/src/core/arm/dynarmic/arm_dynarmic_64.h index 4c8570913f..5ea5dde8a6 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_64.h +++ b/src/core/arm/dynarmic/arm_dynarmic_64.h @@ -16,6 +16,7 @@ #include "common/hash.h" #include "core/arm/arm_interface.h" #include "core/arm/dynarmic/dynarmic_exclusive_monitor.h" +#include "dynarmic/interface/A64/config.h" namespace Core::Memory { class Memory; @@ -36,19 +37,13 @@ class DynarmicCallbacks64 : public Dynarmic::A64::UserCallbacks { public: explicit DynarmicCallbacks64(ArmDynarmic64& parent, Kernel::KProcess* process); - u8 MemoryRead8(u64 vaddr) override; - u16 MemoryRead16(u64 vaddr) override; - u32 MemoryRead32(u64 vaddr) override; - u64 MemoryRead64(u64 vaddr) override; + u64 MemoryRead(u64 vaddr, size_t size) override; Dynarmic::A64::Vector MemoryRead128(u64 vaddr) override; std::optional MemoryReadCode(u64 vaddr) override; void InstructionSynchronizationBarrierRaised() override { last_code_addr = u64(-1); //reset back, force refetch } - void MemoryWrite8(u64 vaddr, u8 value) override; - void MemoryWrite16(u64 vaddr, u16 value) override; - void MemoryWrite32(u64 vaddr, u32 value) override; - void MemoryWrite64(u64 vaddr, u64 value) override; + void MemoryWrite(Dynarmic::A64::VAddr vaddr, u64 value, std::size_t size) override; void MemoryWrite128(u64 vaddr, Dynarmic::A64::Vector value) override; bool MemoryWriteExclusive8(u64 vaddr, std::uint8_t value, std::uint8_t expected) override; bool MemoryWriteExclusive16(u64 vaddr, std::uint16_t value, std::uint16_t expected) override; diff --git a/src/core/hle/service/jit/jit_context.cpp b/src/core/hle/service/jit/jit_context.cpp index 36bf5d6649..e1e8eeadbe 100644 --- a/src/core/hle/service/jit/jit_context.cpp +++ b/src/core/hle/service/jit/jit_context.cpp @@ -71,17 +71,14 @@ public: void InstructionSynchronizationBarrierRaised() override { last_code_addr = u64(-1); //reset back, force refetch } - u8 MemoryRead8(u64 vaddr) override { - return ReadMemory(vaddr); - } - u16 MemoryRead16(u64 vaddr) override { - return ReadMemory(vaddr); - } - u32 MemoryRead32(u64 vaddr) override { - return ReadMemory(vaddr); - } - u64 MemoryRead64(u64 vaddr) override { - return ReadMemory(vaddr); + u64 MemoryRead(u64 vaddr, size_t size) override { + switch (size) { + case sizeof(u64): return ReadMemory(vaddr); + case sizeof(u32): return ReadMemory(vaddr); + case sizeof(u16): return ReadMemory(vaddr); + case sizeof(u8): return ReadMemory(vaddr); + default: UNREACHABLE(); + } } u128 MemoryRead128(u64 vaddr) override { return ReadMemory(vaddr); @@ -89,22 +86,19 @@ public: std::string MemoryReadCString(u64 vaddr) { std::string result{}; u8 next; - while ((next = MemoryRead8(vaddr++)) != 0) + while ((next = u8(MemoryRead(vaddr++, sizeof(u8)))) != 0) result += char(next); return result; } - void MemoryWrite8(u64 vaddr, u8 value) override { - WriteMemory(vaddr, value); - } - void MemoryWrite16(u64 vaddr, u16 value) override { - WriteMemory(vaddr, value); - } - void MemoryWrite32(u64 vaddr, u32 value) override { - WriteMemory(vaddr, value); - } - void MemoryWrite64(u64 vaddr, u64 value) override { - WriteMemory(vaddr, value); + void MemoryWrite(u64 vaddr, u64 value, size_t size) override { + switch (size) { + case sizeof(u64): WriteMemory(vaddr, u64(value)); break; + case sizeof(u32): WriteMemory(vaddr, u32(value)); break; + case sizeof(u16): WriteMemory(vaddr, u16(value)); break; + case sizeof(u8): WriteMemory(vaddr, u8(value)); break; + default: UNREACHABLE(); + } } void MemoryWrite128(u64 vaddr, u128 value) override { WriteMemory(vaddr, value); @@ -193,14 +187,14 @@ public: // The loaded NRO file has ELF relocations that must be processed before it can run. // Normally this would be processed by RTLD, but in HLE context, we don't have // the linker available, so we have to do it ourselves. - const VAddr mod_offset{callbacks->MemoryRead32(4)}; - if (callbacks->MemoryRead32(mod_offset) != Common::MakeMagic('M', 'O', 'D', '0')) + const VAddr mod_offset{callbacks->MemoryRead(4, sizeof(u32))}; + if (callbacks->MemoryRead(mod_offset, sizeof(u32)) != Common::MakeMagic('M', 'O', 'D', '0')) return false; // For more info about dynamic entries, see the ELF ABI specification: // https://refspecs.linuxbase.org/elf/gabi4+/ch5.dynamic.html // https://refspecs.linuxbase.org/elf/gabi4+/ch4.reloc.html - VAddr dynamic_offset{mod_offset + callbacks->MemoryRead32(mod_offset + 4)}; + VAddr dynamic_offset{mod_offset + callbacks->MemoryRead(mod_offset + 4, sizeof(u32))}; VAddr rela_dyn = 0, relr_dyn = 0; size_t num_rela = 0, num_relr = 0; while (true) { @@ -222,8 +216,8 @@ public: for (size_t i = 0; i < num_rela; i++) { const auto rela{callbacks->ReadMemory(rela_dyn + i * sizeof(Elf64_Rela))}; if (Elf64RelType(rela.r_info) == ElfAArch64Relative) { - const VAddr contents{callbacks->MemoryRead64(rela.r_offset)}; - callbacks->MemoryWrite64(rela.r_offset, contents + rela.r_addend); + const VAddr contents{callbacks->MemoryRead(rela.r_offset, sizeof(u64))}; + callbacks->MemoryWrite(rela.r_offset, contents + rela.r_addend, sizeof(u64)); } } @@ -231,7 +225,7 @@ public: for (size_t i = 0; i < num_relr; i++) { const auto relr = callbacks->ReadMemory(relr_dyn + i * sizeof(Elf64_Relr)); const auto incr = [&](VAddr where) { - callbacks->MemoryWrite64(where, callbacks->MemoryRead64(where) + relocbase); + callbacks->MemoryWrite(where, callbacks->MemoryRead(where, sizeof(u64)) + relocbase, sizeof(u64)); }; if ((relr & 1) == 0) { // where pointer @@ -294,7 +288,7 @@ public: if (argument_stack.size() > 8) { const VAddr new_sp = Common::AlignDown(top_of_stack - (argument_stack.size() - 8) * sizeof(u64), STACK_ALIGN); for (size_t i = 8; i < argument_stack.size(); i++) - callbacks->MemoryWrite64(new_sp + (i - 8) * sizeof(u64), argument_stack[i]); + callbacks->MemoryWrite(new_sp + (i - 8) * sizeof(u64), argument_stack[i], sizeof(u64)); jit->SetSP(new_sp); } // Reset the call state for the next invocation @@ -385,17 +379,17 @@ void DynarmicCallbacks64::CallSVC(u32 swi) { if (dest < src) { for (size_t i = 0; i < n; i++) - MemoryWrite8(dest + i, MemoryRead8(src + i)); + MemoryWrite(dest + i, u8(MemoryRead(src + i, sizeof(u8))), sizeof(u8)); } else { for (size_t i = n; i > 0; i--) - MemoryWrite8(dest + i - 1, MemoryRead8(src + i - 1)); + MemoryWrite(dest + i - 1, u8(MemoryRead(src + i - 1, sizeof(u8))), sizeof(u8)); } } else if (pc == parent.helpers[size_t(HelperFn::Memset)]) { const VAddr dest{parent.jit->GetRegister(0)}; const u64 c{parent.jit->GetRegister(1)}; const size_t n{parent.jit->GetRegister(2)}; for (size_t i = 0; i < n; i++) - MemoryWrite8(dest + i, u8(c)); + MemoryWrite(dest + i, u8(c), sizeof(u8)); } else if (pc == parent.helpers[size_t(HelperFn::Resolve)]) { // X0 contains a char* for a symbol to resolve const auto name{MemoryReadCString(parent.jit->GetRegister(0))}; @@ -422,7 +416,7 @@ void DynarmicCallbacks64::CallSVC(u32 swi) { } void DynarmicCallbacks64::ExceptionRaised(u64 pc, Dynarmic::A64::Exception exception) { - auto const inst = MemoryRead32(pc); + auto const inst = MemoryRead(pc, sizeof(u32)); LOG_CRITICAL(Service_JIT, "{} PC @ {:08x}, data = {:08x}", exception, pc, inst); parent.jit->HaltExecution(); } diff --git a/src/core/tools/freezer.cpp b/src/core/tools/freezer.cpp index 73a86b3c8c..606ac2da42 100644 --- a/src/core/tools/freezer.cpp +++ b/src/core/tools/freezer.cpp @@ -33,18 +33,10 @@ u64 MemoryReadWidth(Core::Memory::Memory& memory, u32 width, VAddr addr) { void MemoryWriteWidth(Core::Memory::Memory& memory, u32 width, VAddr addr, u64 value) { switch (width) { - case 1: - memory.Write8(addr, static_cast(value)); - break; - case 2: - memory.Write16(addr, static_cast(value)); - break; - case 4: - memory.Write32(addr, static_cast(value)); - break; - case 8: - memory.Write64(addr, value); - break; + case sizeof(u64): return memory.Write64(addr, value); + case sizeof(u32): return memory.Write32(addr, u32(value)); + case sizeof(u16): return memory.Write16(addr, u16(value)); + case sizeof(u8): return memory.Write8(addr, u8(value)); default: UNREACHABLE(); } diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp index 8b6ec2506e..dc14d16978 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp @@ -82,7 +82,7 @@ static void* EmitExclusiveReadCallTrampoline(oaknut::CodeGenerator& code, const auto fn = [](const A32::UserConfig& conf, A32::VAddr vaddr) -> T { return conf.global_monitor->ReadAndMark(conf.processor_id, vaddr, [&]() -> T { - return (conf.callbacks->*callback)(vaddr); + return (conf.callbacks->*callback)(vaddr, sizeof(T)); }); }; @@ -136,12 +136,9 @@ static void* EmitExclusiveWriteCallTrampoline(oaknut::CodeGenerator& code, const oaknut::Label l_addr, l_this; auto fn = [](const A32::UserConfig& conf, A32::VAddr vaddr, T value) -> u32 { - return conf.global_monitor->DoExclusiveOperation(conf.processor_id, vaddr, - [&](T expected) -> bool { - return (conf.callbacks->*callback)(vaddr, value, expected); - }) - ? 0 - : 1; + return conf.global_monitor->DoExclusiveOperation(conf.processor_id, vaddr, [&](T expected) -> bool { + return (conf.callbacks->*callback)(vaddr, value, expected); + }) ? 0 : 1; }; void* target = code.xptr(); @@ -179,26 +176,14 @@ void A32AddressSpace::EmitPrelude() { UnprotectCodeMemory(); - prelude_info.read_memory_8 = EmitCallTrampoline<&A32::UserCallbacks::MemoryRead8>(code, conf.callbacks); - prelude_info.read_memory_16 = EmitCallTrampoline<&A32::UserCallbacks::MemoryRead16>(code, conf.callbacks); - prelude_info.read_memory_32 = EmitCallTrampoline<&A32::UserCallbacks::MemoryRead32>(code, conf.callbacks); - prelude_info.read_memory_64 = EmitCallTrampoline<&A32::UserCallbacks::MemoryRead64>(code, conf.callbacks); - prelude_info.wrapped_read_memory_8 = EmitWrappedReadCallTrampoline<&A32::UserCallbacks::MemoryRead8>(code, conf.callbacks); - prelude_info.wrapped_read_memory_16 = EmitWrappedReadCallTrampoline<&A32::UserCallbacks::MemoryRead16>(code, conf.callbacks); - prelude_info.wrapped_read_memory_32 = EmitWrappedReadCallTrampoline<&A32::UserCallbacks::MemoryRead32>(code, conf.callbacks); - prelude_info.wrapped_read_memory_64 = EmitWrappedReadCallTrampoline<&A32::UserCallbacks::MemoryRead64>(code, conf.callbacks); - prelude_info.exclusive_read_memory_8 = EmitExclusiveReadCallTrampoline<&A32::UserCallbacks::MemoryRead8, u8>(code, conf); - prelude_info.exclusive_read_memory_16 = EmitExclusiveReadCallTrampoline<&A32::UserCallbacks::MemoryRead16, u16>(code, conf); - prelude_info.exclusive_read_memory_32 = EmitExclusiveReadCallTrampoline<&A32::UserCallbacks::MemoryRead32, u32>(code, conf); - prelude_info.exclusive_read_memory_64 = EmitExclusiveReadCallTrampoline<&A32::UserCallbacks::MemoryRead64, u64>(code, conf); - prelude_info.write_memory_8 = EmitCallTrampoline<&A32::UserCallbacks::MemoryWrite8>(code, conf.callbacks); - prelude_info.write_memory_16 = EmitCallTrampoline<&A32::UserCallbacks::MemoryWrite16>(code, conf.callbacks); - prelude_info.write_memory_32 = EmitCallTrampoline<&A32::UserCallbacks::MemoryWrite32>(code, conf.callbacks); - prelude_info.write_memory_64 = EmitCallTrampoline<&A32::UserCallbacks::MemoryWrite64>(code, conf.callbacks); - prelude_info.wrapped_write_memory_8 = EmitWrappedWriteCallTrampoline<&A32::UserCallbacks::MemoryWrite8>(code, conf.callbacks); - prelude_info.wrapped_write_memory_16 = EmitWrappedWriteCallTrampoline<&A32::UserCallbacks::MemoryWrite16>(code, conf.callbacks); - prelude_info.wrapped_write_memory_32 = EmitWrappedWriteCallTrampoline<&A32::UserCallbacks::MemoryWrite32>(code, conf.callbacks); - prelude_info.wrapped_write_memory_64 = EmitWrappedWriteCallTrampoline<&A32::UserCallbacks::MemoryWrite64>(code, conf.callbacks); + prelude_info.read_memory = EmitCallTrampoline<&A32::UserCallbacks::MemoryRead>(code, conf.callbacks); + prelude_info.wrapped_read_memory = EmitWrappedReadCallTrampoline<&A32::UserCallbacks::MemoryRead>(code, conf.callbacks); + prelude_info.exclusive_read_memory_8 = EmitExclusiveReadCallTrampoline<&A32::UserCallbacks::MemoryRead, u8>(code, conf); + prelude_info.exclusive_read_memory_16 = EmitExclusiveReadCallTrampoline<&A32::UserCallbacks::MemoryRead, u16>(code, conf); + prelude_info.exclusive_read_memory_32 = EmitExclusiveReadCallTrampoline<&A32::UserCallbacks::MemoryRead, u32>(code, conf); + prelude_info.exclusive_read_memory_64 = EmitExclusiveReadCallTrampoline<&A32::UserCallbacks::MemoryRead, u64>(code, conf); + prelude_info.write_memory = EmitCallTrampoline<&A32::UserCallbacks::MemoryWrite>(code, conf.callbacks); + prelude_info.wrapped_write_memory = EmitWrappedWriteCallTrampoline<&A32::UserCallbacks::MemoryWrite>(code, conf.callbacks); prelude_info.exclusive_write_memory_8 = EmitExclusiveWriteCallTrampoline<&A32::UserCallbacks::MemoryWriteExclusive8, u8>(code, conf); prelude_info.exclusive_write_memory_16 = EmitExclusiveWriteCallTrampoline<&A32::UserCallbacks::MemoryWriteExclusive16, u16>(code, conf); prelude_info.exclusive_write_memory_32 = EmitExclusiveWriteCallTrampoline<&A32::UserCallbacks::MemoryWriteExclusive32, u32>(code, conf); diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp index 2dbb7d2e1d..efb9fc538c 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp @@ -81,7 +81,7 @@ static void* EmitExclusiveReadCallTrampoline(oaknut::CodeGenerator& code, const auto fn = [](const A64::UserConfig& conf, A64::VAddr vaddr) -> T { return conf.global_monitor->ReadAndMark(conf.processor_id, vaddr, [&]() -> T { - return (conf.callbacks->*callback)(vaddr); + return (conf.callbacks->*callback)(vaddr, sizeof(T)); }); }; @@ -133,14 +133,10 @@ static void* EmitExclusiveWriteCallTrampoline(oaknut::CodeGenerator& code, const using namespace oaknut::util; oaknut::Label l_addr, l_this; - auto fn = [](const A64::UserConfig& conf, A64::VAddr vaddr, T value) -> u32 { - return conf.global_monitor->DoExclusiveOperation(conf.processor_id, vaddr, - [&](T expected) -> bool { - return (conf.callbacks->*callback)(vaddr, value, expected); - }) - ? 0 - : 1; + return conf.global_monitor->DoExclusiveOperation(conf.processor_id, vaddr, [&](T expected) -> bool { + return (conf.callbacks->*callback)(vaddr, value, expected); + }) ? 0 : 1; }; void* target = code.xptr(); @@ -346,30 +342,18 @@ void A64AddressSpace::EmitPrelude() { UnprotectCodeMemory(); - prelude_info.read_memory_8 = EmitCallTrampoline<&A64::UserCallbacks::MemoryRead8>(code, conf.callbacks); - prelude_info.read_memory_16 = EmitCallTrampoline<&A64::UserCallbacks::MemoryRead16>(code, conf.callbacks); - prelude_info.read_memory_32 = EmitCallTrampoline<&A64::UserCallbacks::MemoryRead32>(code, conf.callbacks); - prelude_info.read_memory_64 = EmitCallTrampoline<&A64::UserCallbacks::MemoryRead64>(code, conf.callbacks); + prelude_info.read_memory = EmitCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks); prelude_info.read_memory_128 = EmitRead128CallTrampoline(code, conf.callbacks); - prelude_info.wrapped_read_memory_8 = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead8>(code, conf.callbacks); - prelude_info.wrapped_read_memory_16 = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead16>(code, conf.callbacks); - prelude_info.wrapped_read_memory_32 = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead32>(code, conf.callbacks); - prelude_info.wrapped_read_memory_64 = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead64>(code, conf.callbacks); + prelude_info.wrapped_read_memory = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks); prelude_info.wrapped_read_memory_128 = EmitWrappedRead128CallTrampoline(code, conf.callbacks); - prelude_info.exclusive_read_memory_8 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead8, u8>(code, conf); - prelude_info.exclusive_read_memory_16 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead16, u16>(code, conf); - prelude_info.exclusive_read_memory_32 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead32, u32>(code, conf); - prelude_info.exclusive_read_memory_64 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead64, u64>(code, conf); + prelude_info.exclusive_read_memory_8 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead, u8>(code, conf); + prelude_info.exclusive_read_memory_16 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead, u16>(code, conf); + prelude_info.exclusive_read_memory_32 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead, u32>(code, conf); + prelude_info.exclusive_read_memory_64 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead, u64>(code, conf); prelude_info.exclusive_read_memory_128 = EmitExclusiveRead128CallTrampoline(code, conf); - prelude_info.write_memory_8 = EmitCallTrampoline<&A64::UserCallbacks::MemoryWrite8>(code, conf.callbacks); - prelude_info.write_memory_16 = EmitCallTrampoline<&A64::UserCallbacks::MemoryWrite16>(code, conf.callbacks); - prelude_info.write_memory_32 = EmitCallTrampoline<&A64::UserCallbacks::MemoryWrite32>(code, conf.callbacks); - prelude_info.write_memory_64 = EmitCallTrampoline<&A64::UserCallbacks::MemoryWrite64>(code, conf.callbacks); + prelude_info.write_memory = EmitCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks); prelude_info.write_memory_128 = EmitWrite128CallTrampoline(code, conf.callbacks); - prelude_info.wrapped_write_memory_8 = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite8>(code, conf.callbacks); - prelude_info.wrapped_write_memory_16 = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite16>(code, conf.callbacks); - prelude_info.wrapped_write_memory_32 = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite32>(code, conf.callbacks); - prelude_info.wrapped_write_memory_64 = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite64>(code, conf.callbacks); + prelude_info.wrapped_write_memory = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks); prelude_info.wrapped_write_memory_128 = EmitWrappedWrite128CallTrampoline(code, conf.callbacks); prelude_info.exclusive_write_memory_8 = EmitExclusiveWriteCallTrampoline<&A64::UserCallbacks::MemoryWriteExclusive8, u8>(code, conf); prelude_info.exclusive_write_memory_16 = EmitExclusiveWriteCallTrampoline<&A64::UserCallbacks::MemoryWriteExclusive16, u16>(code, conf); diff --git a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp index 947c50f4c3..7b83e372e6 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp @@ -145,32 +145,42 @@ void AddressSpace::Link(EmittedBlockInfo& block_info) { case LinkTarget::ReturnFromRunCode: c.B(prelude_info.return_from_run_code); break; + // { this, vaddr, size } case LinkTarget::ReadMemory8: - c.BL(prelude_info.read_memory_8); + c.LDR(X2, 1); + c.BL(prelude_info.read_memory); break; case LinkTarget::ReadMemory16: - c.BL(prelude_info.read_memory_16); + c.LDR(X2, 2); + c.BL(prelude_info.read_memory); break; case LinkTarget::ReadMemory32: - c.BL(prelude_info.read_memory_32); + c.LDR(X2, 4); + c.BL(prelude_info.read_memory); break; case LinkTarget::ReadMemory64: - c.BL(prelude_info.read_memory_64); + c.LDR(X2, 8); + c.BL(prelude_info.read_memory); break; case LinkTarget::ReadMemory128: c.BL(prelude_info.read_memory_128); break; + // { this, vaddr, size } case LinkTarget::WrappedReadMemory8: - c.BL(prelude_info.wrapped_read_memory_8); + c.LDR(X2, 1); + c.BL(prelude_info.wrapped_read_memory); break; case LinkTarget::WrappedReadMemory16: - c.BL(prelude_info.wrapped_read_memory_16); + c.LDR(X2, 2); + c.BL(prelude_info.wrapped_read_memory); break; case LinkTarget::WrappedReadMemory32: - c.BL(prelude_info.wrapped_read_memory_32); + c.LDR(X2, 4); + c.BL(prelude_info.wrapped_read_memory); break; case LinkTarget::WrappedReadMemory64: - c.BL(prelude_info.wrapped_read_memory_64); + c.LDR(X2, 8); + c.BL(prelude_info.wrapped_read_memory); break; case LinkTarget::WrappedReadMemory128: c.BL(prelude_info.wrapped_read_memory_128); @@ -190,32 +200,41 @@ void AddressSpace::Link(EmittedBlockInfo& block_info) { case LinkTarget::ExclusiveReadMemory128: c.BL(prelude_info.exclusive_read_memory_128); break; + // { this, vaddr, value, size } case LinkTarget::WriteMemory8: - c.BL(prelude_info.write_memory_8); + c.LDR(X3, 1); + c.BL(prelude_info.write_memory); break; case LinkTarget::WriteMemory16: - c.BL(prelude_info.write_memory_16); + c.LDR(X3, 2); + c.BL(prelude_info.write_memory); break; case LinkTarget::WriteMemory32: - c.BL(prelude_info.write_memory_32); + c.LDR(X3, 4); + c.BL(prelude_info.write_memory); break; case LinkTarget::WriteMemory64: - c.BL(prelude_info.write_memory_64); + c.LDR(X3, 8); + c.BL(prelude_info.write_memory); break; case LinkTarget::WriteMemory128: c.BL(prelude_info.write_memory_128); break; case LinkTarget::WrappedWriteMemory8: - c.BL(prelude_info.wrapped_write_memory_8); + c.LDR(X3, 1); + c.BL(prelude_info.wrapped_write_memory); break; case LinkTarget::WrappedWriteMemory16: - c.BL(prelude_info.wrapped_write_memory_16); + c.LDR(X3, 2); + c.BL(prelude_info.wrapped_write_memory); break; case LinkTarget::WrappedWriteMemory32: - c.BL(prelude_info.wrapped_write_memory_32); + c.LDR(X3, 4); + c.BL(prelude_info.wrapped_write_memory); break; case LinkTarget::WrappedWriteMemory64: - c.BL(prelude_info.wrapped_write_memory_64); + c.LDR(X3, 8); + c.BL(prelude_info.wrapped_write_memory); break; case LinkTarget::WrappedWriteMemory128: c.BL(prelude_info.wrapped_write_memory_128); diff --git a/src/dynarmic/src/dynarmic/backend/arm64/address_space.h b/src/dynarmic/src/dynarmic/backend/arm64/address_space.h index 755b05bd02..73e2c94a19 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/address_space.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/address_space.h @@ -93,30 +93,18 @@ protected: void* return_to_dispatcher; void* return_from_run_code; - void* read_memory_8; - void* read_memory_16; - void* read_memory_32; - void* read_memory_64; + void* read_memory; void* read_memory_128; - void* wrapped_read_memory_8; - void* wrapped_read_memory_16; - void* wrapped_read_memory_32; - void* wrapped_read_memory_64; + void* wrapped_read_memory; void* wrapped_read_memory_128; void* exclusive_read_memory_8; void* exclusive_read_memory_16; void* exclusive_read_memory_32; void* exclusive_read_memory_64; void* exclusive_read_memory_128; - void* write_memory_8; - void* write_memory_16; - void* write_memory_32; - void* write_memory_64; + void* write_memory; void* write_memory_128; - void* wrapped_write_memory_8; - void* wrapped_write_memory_16; - void* wrapped_write_memory_32; - void* wrapped_write_memory_64; + void* wrapped_write_memory; void* wrapped_write_memory_128; void* exclusive_write_memory_8; void* exclusive_write_memory_16; diff --git a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64_memory.cpp b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64_memory.cpp index f138b5f137..e866b2acd6 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64_memory.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a32_emit_x64_memory.cpp @@ -31,16 +31,16 @@ using namespace Xbyak::util; void A32EmitX64::GenFastmemFallbacks() { const std::initializer_list idxes{0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; const std::array, 4> read_callbacks{{ - {8, Devirtualize<&A32::UserCallbacks::MemoryRead8>(conf.callbacks)}, - {16, Devirtualize<&A32::UserCallbacks::MemoryRead16>(conf.callbacks)}, - {32, Devirtualize<&A32::UserCallbacks::MemoryRead32>(conf.callbacks)}, - {64, Devirtualize<&A32::UserCallbacks::MemoryRead64>(conf.callbacks)}, + {8, Devirtualize<&A32::UserCallbacks::MemoryRead>(conf.callbacks)}, + {16, Devirtualize<&A32::UserCallbacks::MemoryRead>(conf.callbacks)}, + {32, Devirtualize<&A32::UserCallbacks::MemoryRead>(conf.callbacks)}, + {64, Devirtualize<&A32::UserCallbacks::MemoryRead>(conf.callbacks)}, }}; const std::array, 4> write_callbacks{{ - {8, Devirtualize<&A32::UserCallbacks::MemoryWrite8>(conf.callbacks)}, - {16, Devirtualize<&A32::UserCallbacks::MemoryWrite16>(conf.callbacks)}, - {32, Devirtualize<&A32::UserCallbacks::MemoryWrite32>(conf.callbacks)}, - {64, Devirtualize<&A32::UserCallbacks::MemoryWrite64>(conf.callbacks)}, + {8, Devirtualize<&A32::UserCallbacks::MemoryWrite>(conf.callbacks)}, + {16, Devirtualize<&A32::UserCallbacks::MemoryWrite>(conf.callbacks)}, + {32, Devirtualize<&A32::UserCallbacks::MemoryWrite>(conf.callbacks)}, + {64, Devirtualize<&A32::UserCallbacks::MemoryWrite>(conf.callbacks)}, }}; const std::array, 4> exclusive_write_callbacks{{ {8, Devirtualize<&A32::UserCallbacks::MemoryWriteExclusive8>(conf.callbacks)}, @@ -56,12 +56,12 @@ void A32EmitX64::GenFastmemFallbacks() { code.align(); read_fallbacks[std::make_tuple(ordered, bitsize, vaddr_idx, value_idx)] = code.getCurr(); ABI_PushCallerSaveRegistersAndAdjustStackExcept(code, HostLocRegIdx(value_idx)); + // params = { this, vaddr, size } if (vaddr_idx != code.ABI_PARAM2.getIdx()) { code.mov(code.ABI_PARAM2, Xbyak::Reg64{vaddr_idx}); } - if (ordered) { - code.mfence(); - } + code.mov(code.ABI_PARAM3, bitsize / CHAR_BIT); + if (ordered) code.mfence(); callback.EmitCall(code); if (value_idx != code.ABI_RETURN.getIdx()) { code.mov(Xbyak::Reg64{value_idx}, code.ABI_RETURN); @@ -76,6 +76,7 @@ void A32EmitX64::GenFastmemFallbacks() { code.align(); write_fallbacks[std::make_tuple(ordered, bitsize, vaddr_idx, value_idx)] = code.getCurr(); ABI_PushCallerSaveRegistersAndAdjustStack(code); + // params = { this, vaddr, value, size } if (vaddr_idx == code.ABI_PARAM3.getIdx() && value_idx == code.ABI_PARAM2.getIdx()) { code.xchg(code.ABI_PARAM2, code.ABI_PARAM3); } else if (vaddr_idx == code.ABI_PARAM3.getIdx()) { @@ -92,10 +93,9 @@ void A32EmitX64::GenFastmemFallbacks() { } } code.ZeroExtendFrom(bitsize, code.ABI_PARAM3); + code.mov(code.ABI_PARAM4, bitsize / CHAR_BIT); callback.EmitCall(code); - if (ordered) { - code.mfence(); - } + if (ordered) code.mfence(); ABI_PopCallerSaveRegistersAndAdjustStack(code); code.ret(); PerfMapRegister(write_fallbacks[std::make_tuple(ordered, bitsize, vaddr_idx, value_idx)], code.getCurr(), fmt::format("a32_write_fallback_{}", bitsize)); @@ -138,35 +138,35 @@ void A32EmitX64::GenFastmemFallbacks() { #undef Axx void A32EmitX64::EmitA32ReadMemory8(A32EmitContext& ctx, IR::Inst* inst) { - EmitMemoryRead<8, &A32::UserCallbacks::MemoryRead8>(ctx, inst); + EmitMemoryRead<8, &A32::UserCallbacks::MemoryRead>(ctx, inst); } void A32EmitX64::EmitA32ReadMemory16(A32EmitContext& ctx, IR::Inst* inst) { - EmitMemoryRead<16, &A32::UserCallbacks::MemoryRead16>(ctx, inst); + EmitMemoryRead<16, &A32::UserCallbacks::MemoryRead>(ctx, inst); } void A32EmitX64::EmitA32ReadMemory32(A32EmitContext& ctx, IR::Inst* inst) { - EmitMemoryRead<32, &A32::UserCallbacks::MemoryRead32>(ctx, inst); + EmitMemoryRead<32, &A32::UserCallbacks::MemoryRead>(ctx, inst); } void A32EmitX64::EmitA32ReadMemory64(A32EmitContext& ctx, IR::Inst* inst) { - EmitMemoryRead<64, &A32::UserCallbacks::MemoryRead64>(ctx, inst); + EmitMemoryRead<64, &A32::UserCallbacks::MemoryRead>(ctx, inst); } void A32EmitX64::EmitA32WriteMemory8(A32EmitContext& ctx, IR::Inst* inst) { - EmitMemoryWrite<8, &A32::UserCallbacks::MemoryWrite8>(ctx, inst); + EmitMemoryWrite<8, &A32::UserCallbacks::MemoryWrite>(ctx, inst); } void A32EmitX64::EmitA32WriteMemory16(A32EmitContext& ctx, IR::Inst* inst) { - EmitMemoryWrite<16, &A32::UserCallbacks::MemoryWrite16>(ctx, inst); + EmitMemoryWrite<16, &A32::UserCallbacks::MemoryWrite>(ctx, inst); } void A32EmitX64::EmitA32WriteMemory32(A32EmitContext& ctx, IR::Inst* inst) { - EmitMemoryWrite<32, &A32::UserCallbacks::MemoryWrite32>(ctx, inst); + EmitMemoryWrite<32, &A32::UserCallbacks::MemoryWrite>(ctx, inst); } void A32EmitX64::EmitA32WriteMemory64(A32EmitContext& ctx, IR::Inst* inst) { - EmitMemoryWrite<64, &A32::UserCallbacks::MemoryWrite64>(ctx, inst); + EmitMemoryWrite<64, &A32::UserCallbacks::MemoryWrite>(ctx, inst); } void A32EmitX64::EmitA32ClearExclusive(A32EmitContext&, IR::Inst*) { @@ -175,33 +175,33 @@ void A32EmitX64::EmitA32ClearExclusive(A32EmitContext&, IR::Inst*) { void A32EmitX64::EmitA32ExclusiveReadMemory8(A32EmitContext& ctx, IR::Inst* inst) { if (conf.fastmem_exclusive_access) { - EmitExclusiveReadMemoryInline<8, &A32::UserCallbacks::MemoryRead8>(ctx, inst); + EmitExclusiveReadMemoryInline<8, &A32::UserCallbacks::MemoryRead>(ctx, inst); } else { - EmitExclusiveReadMemory<8, &A32::UserCallbacks::MemoryRead8>(ctx, inst); + EmitExclusiveReadMemory<8, &A32::UserCallbacks::MemoryRead>(ctx, inst); } } void A32EmitX64::EmitA32ExclusiveReadMemory16(A32EmitContext& ctx, IR::Inst* inst) { if (conf.fastmem_exclusive_access) { - EmitExclusiveReadMemoryInline<16, &A32::UserCallbacks::MemoryRead16>(ctx, inst); + EmitExclusiveReadMemoryInline<16, &A32::UserCallbacks::MemoryRead>(ctx, inst); } else { - EmitExclusiveReadMemory<16, &A32::UserCallbacks::MemoryRead16>(ctx, inst); + EmitExclusiveReadMemory<16, &A32::UserCallbacks::MemoryRead>(ctx, inst); } } void A32EmitX64::EmitA32ExclusiveReadMemory32(A32EmitContext& ctx, IR::Inst* inst) { if (conf.fastmem_exclusive_access) { - EmitExclusiveReadMemoryInline<32, &A32::UserCallbacks::MemoryRead32>(ctx, inst); + EmitExclusiveReadMemoryInline<32, &A32::UserCallbacks::MemoryRead>(ctx, inst); } else { - EmitExclusiveReadMemory<32, &A32::UserCallbacks::MemoryRead32>(ctx, inst); + EmitExclusiveReadMemory<32, &A32::UserCallbacks::MemoryRead>(ctx, inst); } } void A32EmitX64::EmitA32ExclusiveReadMemory64(A32EmitContext& ctx, IR::Inst* inst) { if (conf.fastmem_exclusive_access) { - EmitExclusiveReadMemoryInline<64, &A32::UserCallbacks::MemoryRead64>(ctx, inst); + EmitExclusiveReadMemoryInline<64, &A32::UserCallbacks::MemoryRead>(ctx, inst); } else { - EmitExclusiveReadMemory<64, &A32::UserCallbacks::MemoryRead64>(ctx, inst); + EmitExclusiveReadMemory<64, &A32::UserCallbacks::MemoryRead>(ctx, inst); } } diff --git a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64_memory.cpp b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64_memory.cpp index 4b7054b4b2..8bb2fcfa59 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64_memory.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64_memory.cpp @@ -115,16 +115,16 @@ void A64EmitX64::GenMemory128Accessors() { void A64EmitX64::GenFastmemFallbacks() { const std::initializer_list idxes{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; const std::array, 4> read_callbacks{{ - {8, Devirtualize<&A64::UserCallbacks::MemoryRead8>(conf.callbacks)}, - {16, Devirtualize<&A64::UserCallbacks::MemoryRead16>(conf.callbacks)}, - {32, Devirtualize<&A64::UserCallbacks::MemoryRead32>(conf.callbacks)}, - {64, Devirtualize<&A64::UserCallbacks::MemoryRead64>(conf.callbacks)}, + {8, Devirtualize<&A64::UserCallbacks::MemoryRead>(conf.callbacks)}, + {16, Devirtualize<&A64::UserCallbacks::MemoryRead>(conf.callbacks)}, + {32, Devirtualize<&A64::UserCallbacks::MemoryRead>(conf.callbacks)}, + {64, Devirtualize<&A64::UserCallbacks::MemoryRead>(conf.callbacks)}, }}; const std::array, 4> write_callbacks{{ - {8, Devirtualize<&A64::UserCallbacks::MemoryWrite8>(conf.callbacks)}, - {16, Devirtualize<&A64::UserCallbacks::MemoryWrite16>(conf.callbacks)}, - {32, Devirtualize<&A64::UserCallbacks::MemoryWrite32>(conf.callbacks)}, - {64, Devirtualize<&A64::UserCallbacks::MemoryWrite64>(conf.callbacks)}, + {8, Devirtualize<&A64::UserCallbacks::MemoryWrite>(conf.callbacks)}, + {16, Devirtualize<&A64::UserCallbacks::MemoryWrite>(conf.callbacks)}, + {32, Devirtualize<&A64::UserCallbacks::MemoryWrite>(conf.callbacks)}, + {64, Devirtualize<&A64::UserCallbacks::MemoryWrite>(conf.callbacks)}, }}; const std::array, 4> exclusive_write_callbacks{{ {8, Devirtualize<&A64::UserCallbacks::MemoryWriteExclusive8>(conf.callbacks)}, @@ -204,12 +204,12 @@ void A64EmitX64::GenFastmemFallbacks() { code.align(); read_fallbacks[std::make_tuple(ordered, bitsize, vaddr_idx, value_idx)] = code.getCurr(); ABI_PushCallerSaveRegistersAndAdjustStackExcept(code, HostLocRegIdx(value_idx)); + // params = { this, vaddr, size } if (vaddr_idx != code.ABI_PARAM2.getIdx()) { code.mov(code.ABI_PARAM2, Xbyak::Reg64{vaddr_idx}); } - if (ordered) { - code.mfence(); - } + code.mov(code.ABI_PARAM3, bitsize / CHAR_BIT); + if (ordered) code.mfence(); callback.EmitCall(code); if (value_idx != code.ABI_RETURN.getIdx()) { code.mov(Xbyak::Reg64{value_idx}, code.ABI_RETURN); @@ -224,6 +224,7 @@ void A64EmitX64::GenFastmemFallbacks() { code.align(); write_fallbacks[std::make_tuple(ordered, bitsize, vaddr_idx, value_idx)] = code.getCurr(); ABI_PushCallerSaveRegistersAndAdjustStack(code); + // params = { this, vaddr, value, size } if (vaddr_idx == code.ABI_PARAM3.getIdx() && value_idx == code.ABI_PARAM2.getIdx()) { code.xchg(code.ABI_PARAM2, code.ABI_PARAM3); } else if (vaddr_idx == code.ABI_PARAM3.getIdx()) { @@ -240,10 +241,9 @@ void A64EmitX64::GenFastmemFallbacks() { } } code.ZeroExtendFrom(bitsize, code.ABI_PARAM3); + code.mov(code.ABI_PARAM4, bitsize / CHAR_BIT); callback.EmitCall(code); - if (ordered) { - code.mfence(); - } + if (ordered) code.mfence(); ABI_PopCallerSaveRegistersAndAdjustStack(code); code.ret(); PerfMapRegister(write_fallbacks[std::make_tuple(ordered, bitsize, vaddr_idx, value_idx)], code.getCurr(), fmt::format("a64_write_fallback_{}", bitsize)); @@ -286,19 +286,19 @@ void A64EmitX64::GenFastmemFallbacks() { #undef Axx void A64EmitX64::EmitA64ReadMemory8(A64EmitContext& ctx, IR::Inst* inst) { - EmitMemoryRead<8, &A64::UserCallbacks::MemoryRead8>(ctx, inst); + EmitMemoryRead<8, &A64::UserCallbacks::MemoryRead>(ctx, inst); } void A64EmitX64::EmitA64ReadMemory16(A64EmitContext& ctx, IR::Inst* inst) { - EmitMemoryRead<16, &A64::UserCallbacks::MemoryRead16>(ctx, inst); + EmitMemoryRead<16, &A64::UserCallbacks::MemoryRead>(ctx, inst); } void A64EmitX64::EmitA64ReadMemory32(A64EmitContext& ctx, IR::Inst* inst) { - EmitMemoryRead<32, &A64::UserCallbacks::MemoryRead32>(ctx, inst); + EmitMemoryRead<32, &A64::UserCallbacks::MemoryRead>(ctx, inst); } void A64EmitX64::EmitA64ReadMemory64(A64EmitContext& ctx, IR::Inst* inst) { - EmitMemoryRead<64, &A64::UserCallbacks::MemoryRead64>(ctx, inst); + EmitMemoryRead<64, &A64::UserCallbacks::MemoryRead>(ctx, inst); } void A64EmitX64::EmitA64ReadMemory128(A64EmitContext& ctx, IR::Inst* inst) { @@ -306,23 +306,23 @@ void A64EmitX64::EmitA64ReadMemory128(A64EmitContext& ctx, IR::Inst* inst) { } void A64EmitX64::EmitA64WriteMemory8(A64EmitContext& ctx, IR::Inst* inst) { - EmitMemoryWrite<8, &A64::UserCallbacks::MemoryWrite8>(ctx, inst); + EmitMemoryWrite<8, &A64::UserCallbacks::MemoryWrite>(ctx, inst); } void A64EmitX64::EmitA64WriteMemory16(A64EmitContext& ctx, IR::Inst* inst) { - EmitMemoryWrite<16, &A64::UserCallbacks::MemoryWrite16>(ctx, inst); + EmitMemoryWrite<16, &A64::UserCallbacks::MemoryWrite>(ctx, inst); } void A64EmitX64::EmitA64WriteMemory32(A64EmitContext& ctx, IR::Inst* inst) { - EmitMemoryWrite<32, &A64::UserCallbacks::MemoryWrite32>(ctx, inst); + EmitMemoryWrite<32, &A64::UserCallbacks::MemoryWrite>(ctx, inst); } void A64EmitX64::EmitA64WriteMemory64(A64EmitContext& ctx, IR::Inst* inst) { - EmitMemoryWrite<64, &A64::UserCallbacks::MemoryWrite64>(ctx, inst); + EmitMemoryWrite<64, &A64::UserCallbacks::MemoryWrite>(ctx, inst); } void A64EmitX64::EmitA64WriteMemory128(A64EmitContext& ctx, IR::Inst* inst) { - EmitMemoryWrite<128, &A64::UserCallbacks::MemoryWrite64>(ctx, inst); + EmitMemoryWrite<128, &A64::UserCallbacks::MemoryWrite>(ctx, inst); } void A64EmitX64::EmitA64ClearExclusive(A64EmitContext&, IR::Inst*) { @@ -331,33 +331,33 @@ void A64EmitX64::EmitA64ClearExclusive(A64EmitContext&, IR::Inst*) { void A64EmitX64::EmitA64ExclusiveReadMemory8(A64EmitContext& ctx, IR::Inst* inst) { if (conf.fastmem_exclusive_access) { - EmitExclusiveReadMemoryInline<8, &A64::UserCallbacks::MemoryRead8>(ctx, inst); + EmitExclusiveReadMemoryInline<8, &A64::UserCallbacks::MemoryRead>(ctx, inst); } else { - EmitExclusiveReadMemory<8, &A64::UserCallbacks::MemoryRead8>(ctx, inst); + EmitExclusiveReadMemory<8, &A64::UserCallbacks::MemoryRead>(ctx, inst); } } void A64EmitX64::EmitA64ExclusiveReadMemory16(A64EmitContext& ctx, IR::Inst* inst) { if (conf.fastmem_exclusive_access) { - EmitExclusiveReadMemoryInline<16, &A64::UserCallbacks::MemoryRead16>(ctx, inst); + EmitExclusiveReadMemoryInline<16, &A64::UserCallbacks::MemoryRead>(ctx, inst); } else { - EmitExclusiveReadMemory<16, &A64::UserCallbacks::MemoryRead16>(ctx, inst); + EmitExclusiveReadMemory<16, &A64::UserCallbacks::MemoryRead>(ctx, inst); } } void A64EmitX64::EmitA64ExclusiveReadMemory32(A64EmitContext& ctx, IR::Inst* inst) { if (conf.fastmem_exclusive_access) { - EmitExclusiveReadMemoryInline<32, &A64::UserCallbacks::MemoryRead32>(ctx, inst); + EmitExclusiveReadMemoryInline<32, &A64::UserCallbacks::MemoryRead>(ctx, inst); } else { - EmitExclusiveReadMemory<32, &A64::UserCallbacks::MemoryRead32>(ctx, inst); + EmitExclusiveReadMemory<32, &A64::UserCallbacks::MemoryRead>(ctx, inst); } } void A64EmitX64::EmitA64ExclusiveReadMemory64(A64EmitContext& ctx, IR::Inst* inst) { if (conf.fastmem_exclusive_access) { - EmitExclusiveReadMemoryInline<64, &A64::UserCallbacks::MemoryRead64>(ctx, inst); + EmitExclusiveReadMemoryInline<64, &A64::UserCallbacks::MemoryRead>(ctx, inst); } else { - EmitExclusiveReadMemory<64, &A64::UserCallbacks::MemoryRead64>(ctx, inst); + EmitExclusiveReadMemory<64, &A64::UserCallbacks::MemoryRead>(ctx, inst); } } diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc index 4fa14d504b..8bb8be3d5b 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + /* This file is part of the dynarmic project. * Copyright (c) 2022 MerryMage * SPDX-License-Identifier: 0BSD @@ -56,16 +59,13 @@ void AxxEmitX64::EmitMemoryRead(AxxEmitContext& ctx, IR::Inst* inst) { // Neither fastmem nor page table: Use callbacks if constexpr (bitsize == 128) { ctx.reg_alloc.HostCall(code, nullptr, {}, args[1]); - if (ordered) { - code.mfence(); - } + if (ordered) code.mfence(); code.CallFunction(memory_read_128); ctx.reg_alloc.DefineValue(code, inst, xmm1); } else { ctx.reg_alloc.HostCall(code, inst, {}, args[1]); - if (ordered) { - code.mfence(); - } + code.mov(code.ABI_PARAM3.cvt32(), bitsize / CHAR_BIT); + if (ordered) code.mfence(); Devirtualize(conf.callbacks).EmitCall(code); code.ZeroExtendFrom(bitsize, code.ABI_RETURN); } @@ -148,12 +148,12 @@ void AxxEmitX64::EmitMemoryWrite(AxxEmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.HostCall(code, nullptr); code.CallFunction(memory_write_128); } else { + // { this, vaddr, value, size } ctx.reg_alloc.HostCall(code, nullptr, {}, args[1], args[2]); + code.mov(code.ABI_PARAM4.cvt32(), bitsize / CHAR_BIT); Devirtualize(conf.callbacks).EmitCall(code); } - if (ordered) { - code.mfence(); - } + if (ordered) code.mfence(); EmitCheckMemoryAbort(ctx, inst); return; } @@ -230,12 +230,11 @@ void AxxEmitX64::EmitExclusiveReadMemory(AxxEmitContext& ctx, IR::Inst* inst) { if (ordered) { code.mfence(); } - code.CallLambda( - [](AxxUserConfig& conf, Axx::VAddr vaddr) -> T { - return conf.global_monitor->ReadAndMark(conf.processor_id, vaddr, [&]() -> T { - return (conf.callbacks->*callback)(vaddr); - }); + code.CallLambda([](AxxUserConfig& conf, Axx::VAddr vaddr) -> T { + return conf.global_monitor->ReadAndMark(conf.processor_id, vaddr, [&]() -> T { + return (conf.callbacks->*callback)(vaddr, bitsize / CHAR_BIT); }); + }); code.ZeroExtendFrom(bitsize, code.ABI_RETURN); } else { const Xbyak::Xmm result = ctx.reg_alloc.ScratchXmm(code); @@ -250,12 +249,11 @@ void AxxEmitX64::EmitExclusiveReadMemory(AxxEmitContext& ctx, IR::Inst* inst) { if (ordered) { code.mfence(); } - code.CallLambda( - [](AxxUserConfig& conf, Axx::VAddr vaddr, Vector& ret) { - ret = conf.global_monitor->ReadAndMark(conf.processor_id, vaddr, [&]() -> Vector { - return (conf.callbacks->*callback)(vaddr); - }); + code.CallLambda([](AxxUserConfig& conf, Axx::VAddr vaddr, Vector& ret) { + ret = conf.global_monitor->ReadAndMark(conf.processor_id, vaddr, [&]() -> Vector { + return (conf.callbacks->*callback)(vaddr); }); + }); code.movups(result, xword[rsp + ABI_SHADOW_SPACE]); ctx.reg_alloc.ReleaseStackSpace(code, 16 + ABI_SHADOW_SPACE); diff --git a/src/dynarmic/src/dynarmic/interface/A32/config.h b/src/dynarmic/src/dynarmic/interface/A32/config.h index b93b116164..49063ed619 100644 --- a/src/dynarmic/src/dynarmic/interface/A32/config.h +++ b/src/dynarmic/src/dynarmic/interface/A32/config.h @@ -66,7 +66,9 @@ struct UserCallbacks : public TranslateCallbacks { // All reads through this callback are 4-byte aligned. // Memory must be interpreted as little endian. - std::optional MemoryReadCode(VAddr vaddr) override { return MemoryRead32(vaddr); } + std::optional MemoryReadCode(VAddr vaddr) override { + return std::uint32_t(MemoryRead(vaddr, sizeof(std::uint32_t))); + } // This function is called before the instruction at pc is read. // IR code can be emitted by the callee prior to instruction handling. @@ -80,16 +82,10 @@ struct UserCallbacks : public TranslateCallbacks { // Reads through these callbacks may not be aligned. // Memory must be interpreted as if ENDIANSTATE == 0, endianness will be corrected by the JIT. - virtual std::uint8_t MemoryRead8(VAddr vaddr) = 0; - virtual std::uint16_t MemoryRead16(VAddr vaddr) = 0; - virtual std::uint32_t MemoryRead32(VAddr vaddr) = 0; - virtual std::uint64_t MemoryRead64(VAddr vaddr) = 0; + virtual std::uint64_t MemoryRead(VAddr vaddr, std::size_t size) = 0; // Writes through these callbacks may not be aligned. - virtual void MemoryWrite8(VAddr vaddr, std::uint8_t value) = 0; - virtual void MemoryWrite16(VAddr vaddr, std::uint16_t value) = 0; - virtual void MemoryWrite32(VAddr vaddr, std::uint32_t value) = 0; - virtual void MemoryWrite64(VAddr vaddr, std::uint64_t value) = 0; + virtual void MemoryWrite(VAddr vaddr, std::uint64_t value, std::size_t size) = 0; // Writes through these callbacks may not be aligned. virtual bool MemoryWriteExclusive8(VAddr /*vaddr*/, std::uint8_t /*value*/, std::uint8_t /*expected*/) { return false; } diff --git a/src/dynarmic/src/dynarmic/interface/A64/config.h b/src/dynarmic/src/dynarmic/interface/A64/config.h index 818aed73e7..859aeba709 100644 --- a/src/dynarmic/src/dynarmic/interface/A64/config.h +++ b/src/dynarmic/src/dynarmic/interface/A64/config.h @@ -89,20 +89,16 @@ struct UserCallbacks { // All reads through this callback are 4-byte aligned. // Memory must be interpreted as little endian. - virtual std::optional MemoryReadCode(VAddr vaddr) { return MemoryRead32(vaddr); } + virtual std::optional MemoryReadCode(VAddr vaddr) { + return std::uint32_t(MemoryRead(vaddr, sizeof(std::uint32_t))); + } // Reads through these callbacks may not be aligned. - virtual std::uint8_t MemoryRead8(VAddr vaddr) = 0; - virtual std::uint16_t MemoryRead16(VAddr vaddr) = 0; - virtual std::uint32_t MemoryRead32(VAddr vaddr) = 0; - virtual std::uint64_t MemoryRead64(VAddr vaddr) = 0; + virtual std::uint64_t MemoryRead(VAddr vaddr, std::size_t size) = 0; virtual Vector MemoryRead128(VAddr vaddr) = 0; // Writes through these callbacks may not be aligned. - virtual void MemoryWrite8(VAddr vaddr, std::uint8_t value) = 0; - virtual void MemoryWrite16(VAddr vaddr, std::uint16_t value) = 0; - virtual void MemoryWrite32(VAddr vaddr, std::uint32_t value) = 0; - virtual void MemoryWrite64(VAddr vaddr, std::uint64_t value) = 0; + virtual void MemoryWrite(VAddr vaddr, std::uint64_t value, std::size_t size) = 0; virtual void MemoryWrite128(VAddr vaddr, Vector value) = 0; // Writes through these callbacks may not be aligned. diff --git a/src/dynarmic/src/dynarmic/ir/opt_passes.cpp b/src/dynarmic/src/dynarmic/ir/opt_passes.cpp index 02b8e821da..b32bbd517a 100644 --- a/src/dynarmic/src/dynarmic/ir/opt_passes.cpp +++ b/src/dynarmic/src/dynarmic/ir/opt_passes.cpp @@ -40,7 +40,7 @@ static void ConstantMemoryReads(IR::Block& block, A32::UserCallbacks* cb) { if (inst.AreAllArgsImmediates()) { const u32 vaddr = inst.GetArg(1).GetU32(); if (cb->IsReadOnlyMemory(vaddr)) { - const u8 value_from_memory = cb->MemoryRead8(vaddr); + const u8 value_from_memory = u8(cb->MemoryRead(vaddr, sizeof(u8))); inst.ReplaceUsesWith(IR::Value{value_from_memory}); } } @@ -51,7 +51,7 @@ static void ConstantMemoryReads(IR::Block& block, A32::UserCallbacks* cb) { if (inst.AreAllArgsImmediates()) { const u32 vaddr = inst.GetArg(1).GetU32(); if (cb->IsReadOnlyMemory(vaddr)) { - const u16 value_from_memory = cb->MemoryRead16(vaddr); + const u16 value_from_memory = u16(cb->MemoryRead(vaddr, sizeof(u16))); inst.ReplaceUsesWith(IR::Value{value_from_memory}); } } @@ -62,7 +62,7 @@ static void ConstantMemoryReads(IR::Block& block, A32::UserCallbacks* cb) { if (inst.AreAllArgsImmediates()) { const u32 vaddr = inst.GetArg(1).GetU32(); if (cb->IsReadOnlyMemory(vaddr)) { - const u32 value_from_memory = cb->MemoryRead32(vaddr); + const u32 value_from_memory = u32(cb->MemoryRead(vaddr, sizeof(u32))); inst.ReplaceUsesWith(IR::Value{value_from_memory}); } } @@ -73,7 +73,7 @@ static void ConstantMemoryReads(IR::Block& block, A32::UserCallbacks* cb) { if (inst.AreAllArgsImmediates()) { const u32 vaddr = inst.GetArg(1).GetU32(); if (cb->IsReadOnlyMemory(vaddr)) { - const u64 value_from_memory = cb->MemoryRead64(vaddr); + const u64 value_from_memory = u64(cb->MemoryRead(vaddr, sizeof(u64))); inst.ReplaceUsesWith(IR::Value{value_from_memory}); } } diff --git a/src/dynarmic/tests/A32/fuzz_thumb.cpp b/src/dynarmic/tests/A32/fuzz_thumb.cpp index 67a01daf9c..a29b877f3e 100644 --- a/src/dynarmic/tests/A32/fuzz_thumb.cpp +++ b/src/dynarmic/tests/A32/fuzz_thumb.cpp @@ -503,7 +503,7 @@ TEST_CASE("Fuzz Thumb32 instructions set", "[JitX64][Thumb][Thumb32]") { } } -TEST_CASE("Verify fix for off by one error in MemoryRead32 worked", "[Thumb][Thumb16]") { +TEST_CASE("Verify fix for off by one error in MemoryRead<32> worked", "[Thumb][Thumb16]") { ThumbTestEnv test_env; // Prepare test subjects diff --git a/src/dynarmic/tests/A32/test_arm_instructions.cpp b/src/dynarmic/tests/A32/test_arm_instructions.cpp index 5a27cd499c..ee24131386 100644 --- a/src/dynarmic/tests/A32/test_arm_instructions.cpp +++ b/src/dynarmic/tests/A32/test_arm_instructions.cpp @@ -553,9 +553,9 @@ TEST_CASE("arm: Memory access (fastmem)", "[arm][A32]") { memset(backing_memory, 0, memory_size); memcpy(backing_memory + 0x100, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", 57); - env.MemoryWrite32(0, 0xE5904000); // LDR R4, [R0] - env.MemoryWrite32(4, 0xE5814000); // STR R4, [R1] - env.MemoryWrite32(8, 0xEAFFFFFE); // B . + env.MemoryWrite(0, 0xE5904000, sizeof(u32)); // LDR R4, [R0] + env.MemoryWrite(4, 0xE5814000, sizeof(u32)); // STR R4, [R1] + env.MemoryWrite(8, 0xEAFFFFFE, sizeof(u32)); // B . jit.Regs()[0] = 0x100; jit.Regs()[1] = 0x1F0; jit.Regs()[15] = 0; // PC = 0 diff --git a/src/dynarmic/tests/A32/testenv.h b/src/dynarmic/tests/A32/testenv.h index bebc2566da..a22cc7131e 100644 --- a/src/dynarmic/tests/A32/testenv.h +++ b/src/dynarmic/tests/A32/testenv.h @@ -16,6 +16,7 @@ #include "common/assert.h" #include "common/common_types.h" +#include "dynarmic/frontend/A32/translate/translate_callbacks.h" #include "dynarmic/interface/A32/a32.h" template @@ -59,42 +60,51 @@ public: return infinite_loop_u32; // B . } - std::uint8_t MemoryRead8(u32 vaddr) override { - if (IsInCodeMem(vaddr)) { - return reinterpret_cast(code_mem.data())[vaddr]; + u64 MemoryRead(u32 vaddr, size_t size) override { + switch (size) { + case sizeof(u64): + return MemoryRead(vaddr, sizeof(u32)) + | MemoryRead(vaddr + sizeof(u32), sizeof(u32)) << 32; + case sizeof(u32): + return MemoryRead(vaddr, sizeof(u16)) + | MemoryRead(vaddr + sizeof(u16), sizeof(u16)) << 16; + case sizeof(u16): + return MemoryRead(vaddr, sizeof(u8)) + | MemoryRead(vaddr + sizeof(u8), sizeof(u8)) << 8; + case sizeof(u8): { + if (IsInCodeMem(vaddr)) + return reinterpret_cast(code_mem.data())[vaddr]; + if (auto iter = modified_memory.find(vaddr); iter != modified_memory.end()) + return iter->second; + return u8(vaddr); } - if (auto iter = modified_memory.find(vaddr); iter != modified_memory.end()) { - return iter->second; + default: + std::abort(); } - return static_cast(vaddr); - } - std::uint16_t MemoryRead16(u32 vaddr) override { - return u16(MemoryRead8(vaddr)) | u16(MemoryRead8(vaddr + 1)) << 8; - } - std::uint32_t MemoryRead32(u32 vaddr) override { - return u32(MemoryRead16(vaddr)) | u32(MemoryRead16(vaddr + 2)) << 16; - } - std::uint64_t MemoryRead64(u32 vaddr) override { - return u64(MemoryRead32(vaddr)) | u64(MemoryRead32(vaddr + 4)) << 32; } - void MemoryWrite8(u32 vaddr, std::uint8_t value) override { - if (vaddr < code_mem.size() * sizeof(u32)) { - code_mem_modified_by_guest = true; + void MemoryWrite(Dynarmic::A32::VAddr vaddr, u64 value, size_t size) override { + switch (size) { + case sizeof(u64): + MemoryWrite(vaddr, u32(value), sizeof(u32)); + MemoryWrite(vaddr + 4, u32(value >> 32), sizeof(u32)); + break; + case sizeof(u32): + MemoryWrite(vaddr, u16(value), sizeof(u16)); + MemoryWrite(vaddr + 2, u16(value >> 16), sizeof(u16)); + break; + case sizeof(u16): + MemoryWrite(vaddr, u8(value), sizeof(u8)); + MemoryWrite(vaddr + 1, u8(value >> 8), sizeof(u8)); + break; + case sizeof(u8): + if (vaddr < code_mem.size() * sizeof(u32)) + code_mem_modified_by_guest = true; + modified_memory[vaddr] = value; + break; + default: + std::abort(); } - modified_memory[vaddr] = value; - } - void MemoryWrite16(u32 vaddr, std::uint16_t value) override { - MemoryWrite8(vaddr, static_cast(value)); - MemoryWrite8(vaddr + 1, static_cast(value >> 8)); - } - void MemoryWrite32(u32 vaddr, std::uint32_t value) override { - MemoryWrite16(vaddr, static_cast(value)); - MemoryWrite16(vaddr + 2, static_cast(value >> 16)); - } - void MemoryWrite64(u32 vaddr, std::uint64_t value) override { - MemoryWrite32(vaddr, static_cast(value)); - MemoryWrite32(vaddr + 4, static_cast(value >> 32)); } void CallSVC(std::uint32_t swi) override { @@ -143,46 +153,41 @@ public: return read(vaddr); } - std::uint8_t MemoryRead8(std::uint32_t vaddr) override { - return read(vaddr); - } - std::uint16_t MemoryRead16(std::uint32_t vaddr) override { - return read(vaddr); - } - std::uint32_t MemoryRead32(std::uint32_t vaddr) override { - return read(vaddr); - } - std::uint64_t MemoryRead64(std::uint32_t vaddr) override { - return read(vaddr); + u64 MemoryRead(u32 vaddr, size_t size) override { + switch (size) { + case sizeof(u64): return read(vaddr); + case sizeof(u32): return read(vaddr); + case sizeof(u16): return read(vaddr); + case sizeof(u8): return read(vaddr); + default: + std::abort(); + } } - void MemoryWrite8(std::uint32_t vaddr, std::uint8_t value) override { - write(vaddr, value); - } - void MemoryWrite16(std::uint32_t vaddr, std::uint16_t value) override { - write(vaddr, value); - } - void MemoryWrite32(std::uint32_t vaddr, std::uint32_t value) override { - write(vaddr, value); - } - void MemoryWrite64(std::uint32_t vaddr, std::uint64_t value) override { - write(vaddr, value); + void MemoryWrite(Dynarmic::A32::VAddr vaddr, std::uint64_t value, size_t size) override { + switch (size) { + case sizeof(u64): return write(vaddr, u64(value)); + case sizeof(u32): return write(vaddr, u32(value)); + case sizeof(u16): return write(vaddr, u16(value)); + case sizeof(u8): return write(vaddr, u8(value)); + default: std::abort(); + } } - bool MemoryWriteExclusive8(std::uint32_t vaddr, std::uint8_t value, [[maybe_unused]] std::uint8_t expected) override { - MemoryWrite8(vaddr, value); + bool MemoryWriteExclusive8(Dynarmic::A32::VAddr vaddr, std::uint8_t value, [[maybe_unused]] std::uint8_t expected) override { + MemoryWrite(vaddr, value, sizeof(u8)); return true; } - bool MemoryWriteExclusive16(std::uint32_t vaddr, std::uint16_t value, [[maybe_unused]] std::uint16_t expected) override { - MemoryWrite16(vaddr, value); + bool MemoryWriteExclusive16(Dynarmic::A32::VAddr vaddr, std::uint16_t value, [[maybe_unused]] std::uint16_t expected) override { + MemoryWrite(vaddr, value, sizeof(u16)); return true; } - bool MemoryWriteExclusive32(std::uint32_t vaddr, std::uint32_t value, [[maybe_unused]] std::uint32_t expected) override { - MemoryWrite32(vaddr, value); + bool MemoryWriteExclusive32(Dynarmic::A32::VAddr vaddr, std::uint32_t value, [[maybe_unused]] std::uint32_t expected) override { + MemoryWrite(vaddr, value, sizeof(u32)); return true; } - bool MemoryWriteExclusive64(std::uint32_t vaddr, std::uint64_t value, [[maybe_unused]] std::uint64_t expected) override { - MemoryWrite64(vaddr, value); + bool MemoryWriteExclusive64(Dynarmic::A32::VAddr vaddr, std::uint64_t value, [[maybe_unused]] std::uint64_t expected) override { + MemoryWrite(vaddr, value, sizeof(u64)); return true; } diff --git a/src/dynarmic/tests/A64/a64.cpp b/src/dynarmic/tests/A64/a64.cpp index 99cc9d3d4d..24ddfd4084 100644 --- a/src/dynarmic/tests/A64/a64.cpp +++ b/src/dynarmic/tests/A64/a64.cpp @@ -1006,8 +1006,8 @@ TEST_CASE("A64: 128-bit exclusive read/write", "[a64]") { REQUIRE(jit.GetRegister(1) == 0x7f7e7d7c7b7a7978); REQUIRE(jit.GetRegister(2) == 0x8786858483828180); REQUIRE(jit.GetRegister(4) == 0); - REQUIRE(env.MemoryRead64(0x1234567812345678) == 0xaf00d1e5badcafe0); - REQUIRE(env.MemoryRead64(0x1234567812345680) == 0xd0d0cacad0d0caca); + REQUIRE(env.MemoryRead(0x1234567812345678, sizeof(u64)) == 0xaf00d1e5badcafe0); + REQUIRE(env.MemoryRead(0x1234567812345680, sizeof(u64)) == 0xd0d0cacad0d0caca); } TEST_CASE("A64: CNTPCT_EL0", "[a64]") { @@ -1517,11 +1517,11 @@ TEST_CASE("A64: Memory access (fastmem)", "[a64]") { memset(backing_memory, 0, memory_size); memcpy(backing_memory + 0x100, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", 57); - env.MemoryWrite32(0, 0xA9401404); // LDP X4, X5, [X0] - env.MemoryWrite32(4, 0xF9400046); // LDR X6, [X2] - env.MemoryWrite32(8, 0xA9001424); // STP X4, X5, [X1] - env.MemoryWrite32(12, 0xF9000066); // STR X6, [X3] - env.MemoryWrite32(16, 0x14000000); // B . + env.MemoryWrite(0, 0xA9401404, sizeof(u32)); // LDP X4, X5, [X0] + env.MemoryWrite(4, 0xF9400046, sizeof(u32)); // LDR X6, [X2] + env.MemoryWrite(8, 0xA9001424, sizeof(u32)); // STP X4, X5, [X1] + env.MemoryWrite(12, 0xF9000066, sizeof(u32)); // STR X6, [X3] + env.MemoryWrite(16, 0x14000000, sizeof(u32)); // B . jit.SetRegister(0, 0x100); jit.SetRegister(1, 0x1F0); jit.SetRegister(2, 0x10F); @@ -1788,8 +1788,8 @@ TEST_CASE("A64: rand3", "[a64]") { memset(backing_memory, 0, memory_size); // cat rand2.txt | awk '{print "env.code_mem.emplace_back(0x"$2"); // "$0}' > rand2-out.tx - env.MemoryWrite32(100, 0x58028edd); // 0000000000000084 58028edd ldr x29, #20952 - env.MemoryWrite32(104, 0x14000000); // 0000000000000ea4 14000000 b #0 + env.MemoryWrite(100, 0x58028edd, sizeof(u32)); // 0000000000000084 58028edd ldr x29, #20952 + env.MemoryWrite(104, 0x14000000, sizeof(u32)); // 0000000000000ea4 14000000 b #0 jit.SetPC(100); jit.SetPstate(0xb0000000); @@ -1824,7 +1824,7 @@ TEST_CASE("A64: rand2", "[a64][.]") { // cat rand2.txt | awk '{print "env.code_mem.emplace_back(0x"$2"); // "$0}' > rand2-out.tx const std::array code32 = {0xea80f352, 0x6e65e59d, 0x1e20c343, 0x2e3a7192, 0x2e267249, 0xd500405f, 0x6f01f461, 0x6eb684fc, 0x58028edd, 0x0ea5f5b6, 0x0ea069fb, 0x2e769517, 0x5e066063, 0x1e65c3f5, 0x4f00ff52, 0x93401cf6, 0x1e274248, 0x6f67aaf5, 0x5e0c0782, 0x5ef43f3c, 0x2e6595b7, 0x4e20590f, 0xb35aa451, 0x6ee2c5ed, 0x4e32bf46, 0x2ea1ba8f, 0x2f68a85e, 0x9237d90a, 0x5e23dd10, 0x0e762e32, 0x4e31a8cf, 0xce1f3360, 0x781a4ac0, 0x13834066, 0x5fa8101c, 0x6f7c5594, 0x0e71bb68, 0xbc0b3e8f, 0x785dbbda, 0x6f51e794, 0xce50af75, 0x1ad728ec, 0x6ee0da4c, 0xb84efa14, 0x2eb3f613, 0x4e287ade, 0x4eb8c734, 0x2e83f4e8, 0x0e397c80, 0xd08f93f8, 0xce718e48, 0x0f672a0d, 0x2e9edd40, 0x0e14128b, 0x6f5942e6, 0x8b3a0f03, 0x3c5d16b9, 0x7f7e3743, 0x4f4c54e4, 0x0ea0a9e9, 0x9e59dbe6, 0x6e7ddcd3, 0xcec08377, 0x9ba759f8, 0x2ea5046e, 0x0e24c569, 0xb8979780, 0x4e31b98c, 0x4efe4f46, 0x4ea7c762, 0x7e61c9c6, 0x6e30c880, 0x1ada0c25, 0x4e603a2f, 0xda9d7218, 0x0d40c5d9, 0x5e214b05, 0x9ba9efc5, 0x5e61b81e, 0x6e7bc31c, 0x0e61a163, 0x9e5832d2, 0x4e772248, 0x4e3d17c8, 0x92624f60, 0x7a1a02dc, 0x79891f65, 0x6eb45036, 0x0e321ee8, 0x4e2566f0, 0x4ea02b9b, 0x0f9dcb3d, 0x2e21b9f9, 0x0e21a8c3, 0xda1700bd, 0x6ea0fb38, 0x7e607a0b, 0x72845817, 0x7f61068e, 0x0d60e529, 0x4ea0ca5c, 0x1a94b20f, 0x8b87419d, 0x7ea9ed71, 0x2ea1a86e, 0x4d40c4da, 0x5ea0eada, 0x784ba96e, 0x7eb6ee02, 0x3db1c710, 0x0e217836, 0x7ee0bb96, 0x4e786c08, 0x4e976a08, 0x489ffe86, 0x4e79fc9b, 0x0e21cbce, 0x5ef7fc65, 0x4ea1286d, 0xd29c771e, 0x6f5c2839, 0x0ea00a9d, 0x6ee44c06, 0x5ee1d858, 0x5ef2fda6, 0x7eb0c9fe, 0x7f762791, 0x2e212ae6, 0x4e61c9db, 0x13003c57, 0x5ee1b8f8, 0x0f2396d2, 0x6ea0db1e, 0x0e71ba82, 0xab29c807, 0x6ef8f8b3, 0x1f18d4a1, 0x0e261d15, 0x1e290081, 0x1b0c7d12, 0x4e7771c3, 0xf845f1e4, 0x4d40c9e8, 0xce778452, 0x6eb9879d, 0x6e21c93d, 0xcec0829f, 0x52a0969f, 0x1e772b4f, 0x7ee1da88, 0x5f52fe0a, 0x7f3387b1, 0x5e214850, 0x1e65c025, 0x0e2ca294, 0x2e614829, 0x1e640077, 0x9e240048, 0x4ebe9537, 0x9bb7925e, 0x38b669c5, 0x2840d089, 0x6f43e648, 0x2e662d28, 0x4eabaff3, 0x6e734cc7, 0x0e31baee, 0x7ee0d93c, 0x5e282bde, 0x7e21bba4, 0x4e6c75fa, 0x5ac01217, 0x7f4304af, 0x1e7878ed, 0x1ada2196, 0x7ee1aba3, 0x93407f3c, 0x4f6c34eb, 0x6e3447a9, 0x7e7ae545, 0x5e0802bb, 0x6eeae63a, 0x7ee1da62, 0x5e280bb3, 0xf81d4009, 0x1e603b21, 0x5e281a14, 0x6eb0a99b, 0x1e266a25, 0x0d60cafe, 0x0e0b6194, 0x7a4ed2c5, 0x92b762ec, 0x4e6b5749, 0x3c16a6e5, 0x4ea0a92b, 0x0fa58b6a, 0x5f76148c, 0x6e30c95f, 0x1e6540fd, 0x5e28e40f, 0x0d403fd4, 0x7e30da36, 0x7fda9b51, 0x2ea04bde, 0x1e25c3d2, 0x1ee0434c, 0x5e21d8e7, 0x5ee1ba51, 0x5e61aba9, 0x4e2849fb, 0x5ee098ea, 0x4e60f63d, 0x0f280443, 0x5ee0da27, 0x2e78a6ce, 0x78054afc, 0x4e14286b, 0x4e218bd8, 0x2a3d2551, 0x3a04017a, 0x5f4317cd, 0x0e604a37, 0x9a834614, 0x0e2edf4d, 0x7a51a0a0, 0x5f8e9043, 0x6ea06bb2, 0xaa2857dd, 0x7a1903fc, 0x301ba9ba, 0x9ac929cd, 0x4e061ff0, 0x2e38fcfc, 0x0e2f614a, 0x7ee0d8e4, 0x6e73afda, 0x7f4156f7, 0x0e6078bf, 0x4ee1d9ed, 0x93403fbe, 0xce6f8640, 0x4e3855e3, 0x6f76fe23, 0x112466e8, 0x1e358a90, 0x7f45272c, 0x6ea19a9d, 0x8a696350, 0x1e3900f6, 0x5e61c866, 0x0e3fbfd0, 0x5ee09ad0, 0x0e651d27, 0x4dffc35e, 0x2e20c6ce, 0x0fbe118d, 0x1e656a15, 0xd1357365, 0x0e20a847, 0xce4a835c, 0x4e203905, 0x2e60090d, 0x7f4a27bb, 0x1e64c316, 0xce7d86a4, 0x7ebded2d, 0x6e70a97e, 0x4eb9a42b, 0x0e209bef, 0x6f151730, 0x0e7e30f7, 0x4e724509, 0xd503375f, 0xce58b6ae, 0x5e21a9b8, 0xcb2ca538, 0x5ac01131, 0x6ea19a24, 0xeb40c8b3, 0xc8df7d65, 0x78108341, 0x3218ab9b, 0x0f3da7dd, 0x2e003089, 0x4e21cab5, 0x8aa5c924, 0x1a94950c, 0x123e506f, 0x13117e37, 0x1ee6005b, 0x5ac00647, 0x5eec8cd5, 0x7ef0fb3d, 0x9223272a, 0x5ee0cb02, 0x6e66071d, 0x6ea1dbbf, 0x5e61c903, 0x5ac015ea, 0x93db6206, 0x7e62b5e3, 0x6ea0c87b, 0xdac0090e, 0x48df7d90, 0x6e206ba5, 0x9e2503c2, 0x6e25fc89, 0x4d60e2db, 0x1e3e22a0, 0x2eb81c19, 0x7856ea00, 0x5fbfb22d, 0x1e630244, 0x4e202a83, 0x1f50a722, 0x7f7b55d2, 0x0fae89b9, 0x4e781d73, 0xce738c3a, 0x4f15a591, 0x6e21c7e1, 0x586ff77e, 0x8a5d3592, 0x93401c67, 0x5e61cb86, 0xce6bc2c1, 0x6e393f10, 0x9bb70ec3, 0xdac0098c, 0x4da84b95, 0x7f494476, 0x9ace5c11, 0x7e61ca14, 0x4f7a60ef, 0x1ad32b39, 0x0ea3777f, 0x5e61da7f, 0x4f1404e2, 0x4e3244e2, 0x6e1b1ceb, 0x0dee5aac, 0x4e2f9dc4, 0x5ea1b8c3, 0x1e59f863, 0xd500403f, 0x4e3ae7d0, 0x4ef5c6ea, 0x08dffe3b, 0x6e36f4f6, 0x2e764f29, 0x0e726f23, 0x5f42375b, 0x7f71fc40, 0x6e618aad, 0x93403e5b, 0x0e205976, 0x0e7250c4, 0x6eb0abc9, 0x2e2049f0, 0x5f14754d, 0x7f6ce468, 0x6f950bbe, 0x6e31aa47, 0x4eb83396, 0x0dccc952, 0x2ea1ca90, 0xce69c701, 0xb0bed69e, 0x7c5dec39, 0x4e2868a2, 0x0e591b08, 0x5f34e6dd, 0x3a449184, 0x5e3ce6de, 0x4ea149b7, 0x4e7ad29b, 0xba198503, 0x1f683e8f, 0xfa52f2a7, 0x6e30dffc, 0x4e6c3d17, 0x2eae3248, 0xd503349f, 0x1e60002c, 0x0f180680, 0x9e240049, 0x6f75774e, 0xa90d8678, 0x9ad924c4, 0x7eb0f85b, 0x0e205aaf, 0x7ee08899, 0x5f4bffd8, 0x1b0ff5f3, 0x4ee11dcd, 0x2e218948, 0x0dcb2733, 0x4eac107c, 0x4ea04a53, 0x4e287b44, 0x0e60b82a, 0x5ee0ebbc, 0xce454ff1, 0x5e1761e7, 0x5e09202f, 0x0e0c0754, 0x1e72e6b9, 0x7e21da70, 0x0fbdb20c, 0x5efb8c84, 0xd500401f, 0x3a47526e, 0x1e680acf, 0x7f7375fc, 0xf80522da, 0x4ee60c02, 0x4d40c2e7, 0x6f89096b, 0x7ee1bb6e, 0x5e280b4a, 0x1e3120c8, 0x7eb2ef96, 0x4fd012dd, 0x0f3027ef, 0x4e2078a8, 0xd503201f, 0x2e2312d9, 0x6ebf1c6e, 0x5ee1f8df, 0x4e607a46, 0x6e30c877, 0x6c09d2d1, 0x4e61abd8, 0x0e35267e, 0x6ac17728, 0x0e861aa0, 0x6f63fe26, 0x6f157628, 0x6f30a5f9, 0x4d60cc0c, 0x4e21cb59, 0x2e68a3fb, 0x7efae601, 0x6ea0f82c, 0x9b25ec12, 0x1a1a0305, 0x0e043fe1, 0x6e73c0ed, 0x6ea1b8c0, 0x7e20380b, 0x0f0534e8, 0x1f56bc7d, 0xba0c0128, 0x1e672160, 0x6e7b259b, 0x7ee07b5d, 0x9a820443, 0x4e040581, 0x2f1d87e8, 0x1acd2f5b, 0x6e20794f, 0x2e6a3c93, 0xc8dffe13, 0xce5ab1c6, 0x6eea55f6, 0x4ea039b3, 0x0d602fec, 0x2e246e2f, 0x7857be39, 0xb80608fb, 0x1e67c017, 0x9bcf7f63, 0x0f92d857, 0x5e0812f7, 0x1e210172, 0x7e6128e9, 0x7ea94d41, 0x981179e1, 0x1effb018, 0x2e600828, 0x0eb9c6b2, 0x6ee1baae, 0x4ea0db28, 0x2ea1487b, 0x4ea6c7f0, 0x2e2374c7, 0x7e30d8dd, 0xb9991fa7, 0x4e791e3e, 0x889f7c4b, 0x0e6c753c, 0x1e740ad1, 0x1e244324, 0x1ef33010, 0x5ac01102, 0x9bd97fba, 0x6e290143, 0x1e2220d8, 0x4d8d5aee, 0x6f28570b, 0xfa4ab0c1, 0xdac00b14, 0x7ea1a90e, 0x2e3027d8, 0x6f25a733, 0x4e61a96e, 0x4e1a2fcb, 0x0e22fe0a, 0xc8df7cd0, 0x5e280a55, 0x4e012b20, 0x7e70dbf4, 0x520c5a4e, 0x6ea6c57f, 0x0e861af8, 0xd503233f, 0x889ffe3c, 0x5e274ea9, 0x4e21a89a, 0x0e170c02, 0x6efd4c0b, 0xd5033ebf, 0x6e61a92c, 0x2e205b72, 0x789fb828, 0x0e626e94, 0x2ea6724c, 0x9a10028b, 0x2c6c51fc, 0x5a9de6b9, 0x6e6881f3, 0x5ee0ea6b, 0x0faec36e, 0x0e955bca, 0x1acf206d, 0x7f6f571b, 0x4e286930, 0x12b41ceb, 0x1e770b7a, 0x0ea18ac2, 0x5e282aaf, 0xf2b7fa1e, 0x1ac34311, 0x13167d11, 0x4ea63412, 0x6e758038, 0x2f1d85d6, 0x0f275480, 0x0ead6c71, 0x6e204b69, 0x1e6303f4, 0x5e0031ef, 0x13001e40, 0x7a16006f, 0x6e6ae4c0, 0x0f0f242f, 0x6e674f50, 0x4e606b7a, 0x7e6ee684, 0x1e6b5957, 0x7ea1bbab, 0x7ea0b6cb, 0xce4da241, 0x0ea1b953, 0x0eb2af4b, 0x9ac309d0, 0x6e61d8bd, 0x5ea0d890, 0x5f47d1e7, 0xfa5981ca, 0x1e7f7959, 0x6ef24dd8, 0x0e0a41d1, 0x5ee0e898, 0x4e6038e2, 0x13097d65, 0x6f839088, 0x9e290265, 0x0e208824, 0x2e65af79, 0x6f36a561, 0x9ad3204b, 0x0e21482e, 0x1e24431d, 0xd50330bf, 0x0df641aa, 0x6e602a83, 0xce30505f, 0x5e025238, 0xd503201f, 0x4e608880, 0x4de9c38d, 0x5e0f5348, 0x6eb48ca9, 0x50fda31b, 0x2e251eec, 0x7842ba50, 0xd8a1cd86, 0x2ea09862, 0x0ea09983, 0x2ea333b0, 0x0ea6032c, 0x4f94801b, 0x7e3ee57d, 0x38135e4f, 0xd8fdd9dd, 0x5ee0fcde, 0x9e64033d, 0x6e37f547, 0x6e3dd7ef, 0x13003f3d, 0x0e602f9f, 0x4e7ad014, 0x9b3b6857, 0x5ea0cb67, 0x0eb31c9f, 0x4e7c5372, 0x5e61b8c0, 0x0ea19b23, 0x0ee6e1df, 0x6e63a626, 0x2f139405, 0x7eb0f96d, 0x9e588c63, 0x2e714c3a, 0x6e8c941e, 0x0f61b331, 0x6f01f625, 0x4e78d4ea, 0x6f403709, 0x1a0300da, 0xda0102c8, 0x7e61d9fd, 0xb89469bb, 0x0c838780, 0x2e60a590, 0x4dfd29e1, 0x4e150f2e, 0xce2810bc, 0x5f541591, 0x9ee60259, 0x2eb40e56, 0x5e014027, 0x2ef71faf, 0x4e2d452f, 0x5ee0a813, 0x4eb03301, 0x38443acf, 0x6eabd502, 0x0e2ee71e, 0x5a960364, 0xce7ec596, 0x7efbed09, 0x4ef42ea2, 0x0eb30ea5, 0x5ee0d9f8, 0x6f513552, 0xf89eb3fa, 0x7ea2eca6, 0x9b00cc19, 0xf897409e, 0x1e73485f, 0x381afa77, 0x0f169f3b, 0x5ee1aa70, 0x5e1803ee, 0x0dbf5a4c, 0xce78c7a6, 0x9b0b260c, 0x2ef8fa19, 0x6e70aa4b, 0xce45b805, 0x2ea08e86, 0x4ee0bafd, 0x2ea09a1f, 0x4e218900, 0x6e744f13, 0xce518653, 0xf81b7a68, 0xce45ac5e, 0x7e62e416, 0x1a1b02b6, 0x7e21db48, 0x381daaaf, 0x6b2c0987, 0x0e2ec651, 0x4eae8502, 0x9bde7ca0, 0x6f47201f, 0x7e61a8a3, 0x6e60d5db, 0x4e2879de, 0xf81d194e, 0x4f1b8d05, 0x4d0048b2, 0x6e203be9, 0x4e3e7eb1, 0x0e260ef8, 0x2e688518, 0x7e3fec46, 0xdac00843, 0xf85c8917, 0x2e212a0f, 0x0e8196da, 0xd503359f, 0xce4c81f2, 0x6ee19992, 0x6e21ca79, 0x4d40c1d2, 0x4f5816ef, 0x4e34c3ea, 0x4df7c283, 0x7ef7eeb6, 0x18e276ce, 0xab0d21c0, 0xd5032f7f, 0x4ea00dbf, 0x5ac01251, 0xd0121955, 0x7f1495e4, 0x7ef0fa11, 0x5e24dd9c, 0x9add25b5, 0x0eb2bdef, 0x9e1977c7, 0x6f4b26bd, 0x0e200a9c, 0x9b4f7c00, 0x0ea0392e, 0x7e212a2c, 0x0b248b90, 0x1acc27a1, 0x2e701c90, 0x5ee1b870, 0x5e280aba, 0x5ea0780e, 0x1e264246, 0x4e052d04, 0x0e731dc4, 0xce461997, 0x9a9e9413, 0x3d462048, 0x5ea1fac5, 0x2ea0c8c4, 0x9a030280, 0x2ebda4b8, 0x5eef8614, 0x6eadc4e0, 0xbd035a8f, 0x4e606b84, 0x4eb1aba1, 0x4e286928, 0x4e2858cc, 0x9add0ce9, 0x4e070d65, 0x5fd399d5, 0x0f03fde7, 0x6ee90c74, 0x4ef8e31e, 0x381d986a, 0x5ea0ebf4, 0x5ea0d87e, 0x2e76ac9e, 0x6eb36cd4, 0x2e6e1c4c, 0x2e2feebc, 0x1ace4b03, 0x5ee0db12, 0x5ea0e9b1, 0x2e1c32d5, 0x5fa49a09, 0x0e258737, 0x7e21ca8e, 0xce4f9988, 0x5f7f56a6, 0x0e739766, 0x4e28586c, 0x6e619908, 0xd500401f, 0xf88b9252, 0x6e251c8e, 0x9e20015b, 0x7f1486b9, 0x717c339b, 0x1f31ff70, 0x4ea0eb62, 0x9acb0926, 0x489f7d85, 0x4e209b54, 0x2e84cf03, 0x2e65946c, 0x0e7d80cd, 0xc8dffecc, 0xce668bd8, 0x6e2188af, 0xeb4ada34, 0x2b25ec33, 0x0d40e6e7, 0x4eb2c757, 0x4ec82ad0, 0x7e21cb0a, 0x0e21a847, 0x4e0b1ec0, 0x381e6ac0, 0x6e61c8f5, 0x0f10071c, 0x2ee21daa, 0x5e61ab31, 0x6e218892, 0x2e7e7cb5, 0x6f2826aa, 0x7f6b54df, 0x4eaa2620, 0xdac00034, 0x4f6477be, 0x7e6148ea, 0x4eef1f57, 0x78459aeb, 0x2ebc3f10, 0x2e35f4eb, 0x4fbf19ce, 0xd8d0e58e, 0x2e21bbc7, 0x6ee0cab6, 0x9bc57e3f, 0x2f854037, 0x4e92181c, 0x6e6d1f89, 0x0f305545, 0x4ee19a57, 0x0e887bdf, 0x5e1a4185, 0x7ef0c821, 0x2eb6607c, 0x2ea0d9b8, 0x9e0380f4, 0x2ebf1c83, 0x1e62597d, 0x7f6e2548, 0x5ac00205, 0x4e616adb, 0xce638b8c, 0x5e1653cf, 0x2e6069be, 0x0e2ac641, 0x1e33c76f, 0xce44956d, 0x9bb90d31, 0x1e24c20a, 0x7ee038c1, 0x93407e5e, 0x4e280127, 0xc8df7f7d, 0xba42f263, 0x1e6f199c, 0x6e212889, 0x6e92f60e, 0x6ebdc499, 0x8b9acbf8, 0x4d40c581, 0x3a020250, 0x6e6a6716, 0x9248403b, 0x9081ffea, 0x4e603856, 0x9ad1242b, 0x6f270579, 0x1a070349, 0xcec08133, 0xd503305f, 0x5a1a00ca, 0x2e60b8a2, 0x0e5f28fd, 0x0e31a3da, 0x7e61cbc1, 0xd503399f, 0x5f5e54aa, 0x0eb8bdea, 0x4eba8f10, 0x4e2a2e60, 0x2f3da7d6, 0x1e58e297, 0x6e71aa3e, 0x6b86701a, 0xce4fa5e6, 0x4ee7c463, 0x8a79307f, 0x0ebea541, 0x2e218af4, 0x4e774f8a, 0xb9b95dc5, 0x6e61abd5, 0x4dd1e814, 0x4da72098, 0x98307582, 0x3a512101, 0x7ef95497, 0x1ace5535, 0x5a0c0349, 0x4e28581b, 0x6ebf1c02, 0x5ea1da23, 0x1e274314, 0x5e25dd29, 0x6e75f594, 0x6eaf6ed5, 0x4e214abe, 0x4e064172, 0x2e21c8f4, 0xf84c5b08, 0x1e244312, 0x14000000}; for (size_t i = 0; i < code32.size(); ++i) - env.MemoryWrite32(100 + i, code32[i]); + env.MemoryWrite(100 + i, code32[i], sizeof(u32)); env.ignore_invalid_insn = true; jit.SetRegister(0, 0x866524401a1d4e47); diff --git a/src/dynarmic/tests/A64/fibonacci.cpp b/src/dynarmic/tests/A64/fibonacci.cpp index f52a04e217..8816a89b1c 100644 --- a/src/dynarmic/tests/A64/fibonacci.cpp +++ b/src/dynarmic/tests/A64/fibonacci.cpp @@ -25,48 +25,55 @@ public: u64 ticks_left = 0; ::Common::unordered_map memory{}; - u8 MemoryRead8(u64 vaddr) override { - return memory[vaddr]; - } - - u16 MemoryRead16(u64 vaddr) override { - return u16(MemoryRead8(vaddr)) | u16(MemoryRead8(vaddr + 1)) << 8; - } - - u32 MemoryRead32(u64 vaddr) override { - return u32(MemoryRead16(vaddr)) | u32(MemoryRead16(vaddr + 2)) << 16; - } - - u64 MemoryRead64(u64 vaddr) override { - return u64(MemoryRead32(vaddr)) | u64(MemoryRead32(vaddr + 4)) << 32; + u64 MemoryRead(u64 vaddr, size_t size) override { + switch (size) { + case sizeof(u64): + return MemoryRead(vaddr, sizeof(u32)) + | MemoryRead(vaddr + sizeof(u32), sizeof(u32)) << 32; + case sizeof(u32): + return MemoryRead(vaddr, sizeof(u16)) + | MemoryRead(vaddr + sizeof(u16), sizeof(u16)) << 16; + case sizeof(u16): + return MemoryRead(vaddr, sizeof(u8)) + | MemoryRead(vaddr + sizeof(u8), sizeof(u8)) << 8; + case sizeof(u8): + return memory[vaddr]; + default: + std::abort(); + } } std::array MemoryRead128(u64 vaddr) override { - return {MemoryRead64(vaddr), MemoryRead64(vaddr + 8)}; + return { + MemoryRead(vaddr, sizeof(u64)), + MemoryRead(vaddr + sizeof(u64), sizeof(u64)) + }; } - void MemoryWrite8(u64 vaddr, u8 value) override { - memory[vaddr] = value; + void MemoryWrite(Dynarmic::A64::VAddr vaddr, u64 value, size_t size) override { + switch (size) { + case sizeof(u64): + MemoryWrite(vaddr, u32(value), sizeof(u32)); + MemoryWrite(vaddr + 4, u32(value >> 32), sizeof(u32)); + break; + case sizeof(u32): + MemoryWrite(vaddr, u16(value), sizeof(u16)); + MemoryWrite(vaddr + 2, u16(value >> 16), sizeof(u16)); + break; + case sizeof(u16): + MemoryWrite(vaddr, u8(value), sizeof(u8)); + MemoryWrite(vaddr + 1, u8(value >> 8), sizeof(u8)); + break; + case sizeof(u8): + memory[vaddr] = value; + break; + default: + std::abort(); + } } - - void MemoryWrite16(u64 vaddr, u16 value) override { - MemoryWrite8(vaddr, u8(value)); - MemoryWrite8(vaddr + 1, u8(value >> 8)); - } - - void MemoryWrite32(u64 vaddr, u32 value) override { - MemoryWrite16(vaddr, u16(value)); - MemoryWrite16(vaddr + 2, u16(value >> 16)); - } - - void MemoryWrite64(u64 vaddr, u64 value) override { - MemoryWrite32(vaddr, u32(value)); - MemoryWrite32(vaddr + 4, u32(value >> 32)); - } - void MemoryWrite128(u64 vaddr, std::array value) override { - MemoryWrite64(vaddr, value[0]); - MemoryWrite64(vaddr + 8, value[1]); + MemoryWrite(vaddr, value[0], sizeof(u64)); + MemoryWrite(vaddr + 8, value[1], sizeof(u64)); } void CallSVC(u32) override { @@ -135,9 +142,9 @@ TEST_CASE("A64: fibonacci", "[a64]") { code.RET(); for (size_t i = 0; i < 1024; i++) { - env.MemoryWrite32(i * 4, instructions[i]); + env.MemoryWrite(i * 4, instructions[i], sizeof(u32)); } - env.MemoryWrite32(8888, 0xd4200000); + env.MemoryWrite(8888, 0xd4200000, sizeof(u32)); cpu.SetRegister(30, 8888); cpu.SetRegister(0, 10); diff --git a/src/dynarmic/tests/A64/testenv.h b/src/dynarmic/tests/A64/testenv.h index f4ddc63a6b..11aa6389f8 100644 --- a/src/dynarmic/tests/A64/testenv.h +++ b/src/dynarmic/tests/A64/testenv.h @@ -12,6 +12,7 @@ #include "common/assert.h" #include "common/common_types.h" #include "dynarmic/interface/A64/a64.h" +#include "dynarmic/interface/A64/config.h" using Vector = Dynarmic::A64::Vector; @@ -34,64 +35,79 @@ public: return code_mem[index]; } - std::uint8_t MemoryRead8(u64 vaddr) override { - if (IsInCodeMem(vaddr)) { - return reinterpret_cast(code_mem.data())[vaddr - code_mem_start_address]; + u64 MemoryRead(u64 vaddr, size_t size) override { + switch (size) { + case sizeof(u64): + return MemoryRead(vaddr, sizeof(u32)) + | MemoryRead(vaddr + sizeof(u32), sizeof(u32)) << 32; + case sizeof(u32): + return MemoryRead(vaddr, sizeof(u16)) + | MemoryRead(vaddr + sizeof(u16), sizeof(u16)) << 16; + case sizeof(u16): + return MemoryRead(vaddr, sizeof(u8)) + | MemoryRead(vaddr + sizeof(u8), sizeof(u8)) << 8; + case sizeof(u8): { + if (IsInCodeMem(vaddr)) + return reinterpret_cast(code_mem.data())[vaddr - code_mem_start_address]; + if (auto const it = modified_memory.find(vaddr); it != modified_memory.end()) + return it->second; + return u8(vaddr); + } + default: + std::abort(); } - if (auto const it = modified_memory.find(vaddr); it != modified_memory.end()) - return it->second; - return u8(vaddr); - } - std::uint16_t MemoryRead16(u64 vaddr) override { - return u16(MemoryRead8(vaddr)) | u16(MemoryRead8(vaddr + 1)) << 8; - } - std::uint32_t MemoryRead32(u64 vaddr) override { - return u32(MemoryRead16(vaddr)) | u32(MemoryRead16(vaddr + 2)) << 16; - } - std::uint64_t MemoryRead64(u64 vaddr) override { - return u64(MemoryRead32(vaddr)) | u64(MemoryRead32(vaddr + 4)) << 32; - } - Vector MemoryRead128(u64 vaddr) override { - return {MemoryRead64(vaddr), MemoryRead64(vaddr + 8)}; } - void MemoryWrite8(u64 vaddr, std::uint8_t value) override { - if (IsInCodeMem(vaddr)) { - code_mem_modified_by_guest = true; + Vector MemoryRead128(u64 vaddr) override { + return { + MemoryRead(vaddr, sizeof(u64)), + MemoryRead(vaddr + 8, sizeof(u64)) + }; + } + + void MemoryWrite(Dynarmic::A64::VAddr vaddr, u64 value, size_t size) override { + switch (size) { + case sizeof(u64): + MemoryWrite(vaddr, u32(value), sizeof(u32)); + MemoryWrite(vaddr + 4, u32(value >> 32), sizeof(u32)); + break; + case sizeof(u32): + MemoryWrite(vaddr, u16(value), sizeof(u16)); + MemoryWrite(vaddr + 2, u16(value >> 16), sizeof(u16)); + break; + case sizeof(u16): + MemoryWrite(vaddr, u8(value), sizeof(u8)); + MemoryWrite(vaddr + 1, u8(value >> 8), sizeof(u8)); + break; + case sizeof(u8): + if (IsInCodeMem(vaddr)) { + code_mem_modified_by_guest = true; + } + modified_memory[vaddr] = value; + break; + default: + std::abort(); } - modified_memory[vaddr] = value; - } - void MemoryWrite16(u64 vaddr, std::uint16_t value) override { - MemoryWrite8(vaddr, u8(value)); - MemoryWrite8(vaddr + 1, u8(value >> 8)); - } - void MemoryWrite32(u64 vaddr, std::uint32_t value) override { - MemoryWrite16(vaddr, u16(value)); - MemoryWrite16(vaddr + 2, u16(value >> 16)); - } - void MemoryWrite64(u64 vaddr, std::uint64_t value) override { - MemoryWrite32(vaddr, u32(value)); - MemoryWrite32(vaddr + 4, u32(value >> 32)); } void MemoryWrite128(u64 vaddr, Vector value) override { - MemoryWrite64(vaddr, value[0]); - MemoryWrite64(vaddr + 8, value[1]); + MemoryWrite(vaddr, value[0], sizeof(u64)); + MemoryWrite(vaddr + 8, value[1], sizeof(u64)); } bool MemoryWriteExclusive8(u64 vaddr, std::uint8_t value, [[maybe_unused]] std::uint8_t expected) override { - MemoryWrite8(vaddr, value); + MemoryWrite(vaddr, value, sizeof(u8)); return true; } bool MemoryWriteExclusive16(u64 vaddr, std::uint16_t value, [[maybe_unused]] std::uint16_t expected) override { - MemoryWrite16(vaddr, value); + MemoryWrite(vaddr, value, sizeof(u16)); return true; } bool MemoryWriteExclusive32(u64 vaddr, std::uint32_t value, [[maybe_unused]] std::uint32_t expected) override { - MemoryWrite32(vaddr, value); + MemoryWrite(vaddr, value, sizeof(u32)); return true; } bool MemoryWriteExclusive64(u64 vaddr, std::uint64_t value, [[maybe_unused]] std::uint64_t expected) override { - MemoryWrite64(vaddr, value); + MemoryWrite(vaddr, value, sizeof(u64)); return true; } bool MemoryWriteExclusive128(u64 vaddr, Vector value, [[maybe_unused]] Vector expected) override { @@ -145,52 +161,46 @@ public: return read(vaddr); } - std::uint8_t MemoryRead8(u64 vaddr) override { - return read(vaddr); - } - std::uint16_t MemoryRead16(u64 vaddr) override { - return read(vaddr); - } - std::uint32_t MemoryRead32(u64 vaddr) override { - return read(vaddr); - } - std::uint64_t MemoryRead64(u64 vaddr) override { - return read(vaddr); + u64 MemoryRead(u64 vaddr, size_t size) override { + switch (size) { + case sizeof(u64): return read(vaddr); + case sizeof(u32): return read(vaddr); + case sizeof(u16): return read(vaddr); + case sizeof(u8): return read(vaddr); + default: std::abort(); + } } Vector MemoryRead128(u64 vaddr) override { return read(vaddr); } - void MemoryWrite8(u64 vaddr, std::uint8_t value) override { - write(vaddr, value); - } - void MemoryWrite16(u64 vaddr, std::uint16_t value) override { - write(vaddr, value); - } - void MemoryWrite32(u64 vaddr, std::uint32_t value) override { - write(vaddr, value); - } - void MemoryWrite64(u64 vaddr, std::uint64_t value) override { - write(vaddr, value); + void MemoryWrite(u64 vaddr, std::uint64_t value, size_t size) override { + switch (size) { + case sizeof(u64): return write(vaddr, u64(value)); + case sizeof(u32): return write(vaddr, u32(value)); + case sizeof(u16): return write(vaddr, u16(value)); + case sizeof(u8): return write(vaddr, u8(value)); + default: std::abort(); + } } void MemoryWrite128(u64 vaddr, Vector value) override { write(vaddr, value); } bool MemoryWriteExclusive8(u64 vaddr, std::uint8_t value, [[maybe_unused]] std::uint8_t expected) override { - MemoryWrite8(vaddr, value); + MemoryWrite(vaddr, value, sizeof(u8)); return true; } bool MemoryWriteExclusive16(u64 vaddr, std::uint16_t value, [[maybe_unused]] std::uint16_t expected) override { - MemoryWrite16(vaddr, value); + MemoryWrite(vaddr, value, sizeof(u16)); return true; } bool MemoryWriteExclusive32(u64 vaddr, std::uint32_t value, [[maybe_unused]] std::uint32_t expected) override { - MemoryWrite32(vaddr, value); + MemoryWrite(vaddr, value, sizeof(u32)); return true; } bool MemoryWriteExclusive64(u64 vaddr, std::uint64_t value, [[maybe_unused]] std::uint64_t expected) override { - MemoryWrite64(vaddr, value); + MemoryWrite(vaddr, value, sizeof(u64)); return true; } bool MemoryWriteExclusive128(u64 vaddr, Vector value, [[maybe_unused]] Vector expected) override { diff --git a/src/dynarmic/tests/print_info.cpp b/src/dynarmic/tests/print_info.cpp index 5b1c5cfe63..87f4438ad4 100644 --- a/src/dynarmic/tests/print_info.cpp +++ b/src/dynarmic/tests/print_info.cpp @@ -18,6 +18,7 @@ #include #include #include +#include "dynarmic/frontend/A32/translate/translate_callbacks.h" #include "dynarmic/mcl/bit.hpp" #include "common/common_types.h" @@ -118,36 +119,47 @@ public: u64 ticks_left = 0; std::map memory; - std::uint8_t MemoryRead8(u32 vaddr) override { - if (auto iter = memory.find(vaddr); iter != memory.end()) { - return iter->second; + u64 MemoryRead(Dynarmic::A32::VAddr vaddr, size_t size) override { + switch (size) { + case sizeof(u64): + return MemoryRead(vaddr, sizeof(u32)) + | MemoryRead(vaddr + sizeof(u32), sizeof(u32)) << 32; + case sizeof(u32): + return MemoryRead(vaddr, sizeof(u16)) + | MemoryRead(vaddr + sizeof(u16), sizeof(u16)) << 16; + case sizeof(u16): + return MemoryRead(vaddr, sizeof(u8)) + | MemoryRead(vaddr + sizeof(u8), sizeof(u8)) << 8; + case sizeof(u8): { + if (auto const it = memory.find(vaddr); it != memory.end()) + return it->second; + return 0; + } + default: + std::abort(); } - return 0; - } - std::uint16_t MemoryRead16(u32 vaddr) override { - return u16(MemoryRead8(vaddr)) | u16(MemoryRead8(vaddr + 1)) << 8; - } - std::uint32_t MemoryRead32(u32 vaddr) override { - return u32(MemoryRead16(vaddr)) | u32(MemoryRead16(vaddr + 2)) << 16; - } - std::uint64_t MemoryRead64(u32 vaddr) override { - return u64(MemoryRead32(vaddr)) | u64(MemoryRead32(vaddr + 4)) << 32; } - void MemoryWrite8(u32 vaddr, std::uint8_t value) override { - memory[vaddr] = value; - } - void MemoryWrite16(u32 vaddr, std::uint16_t value) override { - MemoryWrite8(vaddr, static_cast(value)); - MemoryWrite8(vaddr + 1, static_cast(value >> 8)); - } - void MemoryWrite32(u32 vaddr, std::uint32_t value) override { - MemoryWrite16(vaddr, static_cast(value)); - MemoryWrite16(vaddr + 2, static_cast(value >> 16)); - } - void MemoryWrite64(u32 vaddr, std::uint64_t value) override { - MemoryWrite32(vaddr, static_cast(value)); - MemoryWrite32(vaddr + 4, static_cast(value >> 32)); + void MemoryWrite(Dynarmic::A32::VAddr vaddr, u64 value, size_t size) override { + switch (size) { + case sizeof(u64): + MemoryWrite(vaddr, u32(value), sizeof(u32)); + MemoryWrite(vaddr + 4, u32(value >> 32), sizeof(u32)); + break; + case sizeof(u32): + MemoryWrite(vaddr, u16(value), sizeof(u16)); + MemoryWrite(vaddr + 2, u16(value >> 16), sizeof(u16)); + break; + case sizeof(u16): + MemoryWrite(vaddr, u8(value), sizeof(u8)); + MemoryWrite(vaddr + 1, u8(value >> 8), sizeof(u8)); + break; + case sizeof(u8): + memory[vaddr] = value; + break; + default: + std::abort(); + } } void CallSVC(std::uint32_t swi) override { @@ -231,7 +243,7 @@ void ExecuteA32Instruction(u32 instruction) { if (const auto address = get_value()) { fmt::print("value: "); if (const auto value = get_value()) { - env.MemoryWrite32(*address, *value); + env.MemoryWrite(*address, *value, sizeof(u32)); fmt::print("> mem[{:#08x}] = {:#08x}\n", *address, *value); } } @@ -247,8 +259,8 @@ void ExecuteA32Instruction(u32 instruction) { cpu.SetFpscr(fpscr); const u32 initial_pc = regs[15]; - env.MemoryWrite32(initial_pc + 0, instruction); - env.MemoryWrite32(initial_pc + 4, 0xEAFFFFFE); // B +0 + env.MemoryWrite(initial_pc + 0, instruction, sizeof(u32)); + env.MemoryWrite(initial_pc + 4, 0xEAFFFFFE, sizeof(u32)); // B +0 cpu.Run(); fmt::print("{}", fmt::join(cpu.Disassemble(), "\n")); diff --git a/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp b/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp index c0e1e13d9b..1fe09cdef0 100644 --- a/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp +++ b/src/dynarmic/tests/unicorn_emu/a32_unicorn.cpp @@ -290,7 +290,7 @@ bool A32Unicorn::UnmappedMemoryHook(uc_engine* uc, uc_mem_type auto page = std::make_unique(); page->address = base_address; for (size_t i = 0; i < page->data.size(); ++i) - page->data[i] = this_->testenv.MemoryRead8(static_cast(base_address + i)); + page->data[i] = u8(this_->testenv.MemoryRead(u32(base_address + i), sizeof(u8))); uc_err err = uc_mem_map_ptr(uc, base_address, page->data.size(), permissions, page->data.data()); if (err == UC_ERR_MAP) @@ -321,24 +321,7 @@ bool A32Unicorn::UnmappedMemoryHook(uc_engine* uc, uc_mem_type template bool A32Unicorn::MemoryWriteHook(uc_engine* /*uc*/, uc_mem_type /*type*/, u32 start_address, int size, u64 value, void* user_data) { auto* this_ = static_cast(user_data); - - switch (size) { - case 1: - this_->testenv.MemoryWrite8(start_address, static_cast(value)); - break; - case 2: - this_->testenv.MemoryWrite16(start_address, static_cast(value)); - break; - case 4: - this_->testenv.MemoryWrite32(start_address, static_cast(value)); - break; - case 8: - this_->testenv.MemoryWrite64(start_address, value); - break; - default: - UNREACHABLE(); - } - + this_->testenv.MemoryWrite(start_address, value, size); return true; } diff --git a/src/dynarmic/tests/unicorn_emu/a64_unicorn.cpp b/src/dynarmic/tests/unicorn_emu/a64_unicorn.cpp index c9a194d50a..4afb6a6859 100644 --- a/src/dynarmic/tests/unicorn_emu/a64_unicorn.cpp +++ b/src/dynarmic/tests/unicorn_emu/a64_unicorn.cpp @@ -197,7 +197,7 @@ bool A64Unicorn::UnmappedMemoryHook(uc_engine* uc, uc_mem_type /*type*/, u64 sta auto page = std::make_unique(); page->address = base_address; for (size_t i = 0; i < page->data.size(); ++i) - page->data[i] = this_->testenv.MemoryRead8(base_address + i); + page->data[i] = u8(this_->testenv.MemoryRead(base_address + i, sizeof(u8))); uc_err err = uc_mem_map_ptr(uc, base_address, page->data.size(), permissions, page->data.data()); if (err == UC_ERR_MAP) @@ -227,23 +227,6 @@ bool A64Unicorn::UnmappedMemoryHook(uc_engine* uc, uc_mem_type /*type*/, u64 sta bool A64Unicorn::MemoryWriteHook(uc_engine* /*uc*/, uc_mem_type /*type*/, u64 start_address, int size, u64 value, void* user_data) { auto* this_ = static_cast(user_data); - - switch (size) { - case 1: - this_->testenv.MemoryWrite8(start_address, static_cast(value)); - break; - case 2: - this_->testenv.MemoryWrite16(start_address, static_cast(value)); - break; - case 4: - this_->testenv.MemoryWrite32(start_address, static_cast(value)); - break; - case 8: - this_->testenv.MemoryWrite64(start_address, value); - break; - default: - UNREACHABLE(); - } - + this_->testenv.MemoryWrite(start_address, value, size); return true; } From 2d1eb0dab91ec9389870ed6da7d1ef1fd01ab14a Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 19 Sep 2026 08:21:39 +0200 Subject: [PATCH 069/128] [common/error] remove preprocessor macros for strerror_r gating (#4450) We use C++, we can just use SFINAE for this. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4450 Reviewed-by: MaranBr Reviewed-by: Shinmegumi --- src/common/error.cpp | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/common/error.cpp b/src/common/error.cpp index 070c9a5c7e..1d67dad6a9 100644 --- a/src/common/error.cpp +++ b/src/common/error.cpp @@ -17,35 +17,33 @@ namespace Common { +// glibc, mlibc, musl, and newlib all define their own variants of strerror_r +// We don't need to use the preprocessor, we can just select depending on return type +template std::string HandleStrerrorR(T r, char *err_str); +template<> std::string HandleStrerrorR(char* r, char *) { return std::string{r}; } +template<> std::string HandleStrerrorR(const char* r, char *) { return std::string{r}; } +template<> std::string HandleStrerrorR(int r, char *err_str) { + return std::string{r != 0 + ? "(strerror_r failed to format error)" + : err_str}; +} + std::string NativeErrorToString(int e) { #ifdef _WIN32 LPSTR err_str; - DWORD res = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, e, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - reinterpret_cast(&err_str), 1, nullptr); - if (!res) { - return "(FormatMessageA failed to format error)"; + LPSTR(&err_str), 1, nullptr); + if (res) { + std::string ret(err_str); + LocalFree(err_str); + return ret; } - std::string ret(err_str); - LocalFree(err_str); - return ret; + return "(FormatMessageA failed to format error)"; #else char err_str[255]; -#if defined(__ANDROID__) || \ - (defined(__GLIBC__) && (_GNU_SOURCE || (_POSIX_C_SOURCE < 200112L && _XOPEN_SOURCE < 600))) - // Thread safe (GNU-specific) - const char* str = strerror_r(e, err_str, sizeof(err_str)); - return std::string(str); -#else - // Thread safe (XSI-compliant) - int second_err = strerror_r(e, err_str, sizeof(err_str)); - if (second_err != 0) { - return "(strerror_r failed to format error)"; - } - return std::string(err_str); -#endif // GLIBC etc. + return HandleStrerrorR(strerror_r(e, err_str, sizeof(err_str)), err_str); #endif // _WIN32 } From 847e91c3a8ca2d699cc9ce0df68b733dd5f37b97 Mon Sep 17 00:00:00 2001 From: xbzk Date: Sat, 19 Sep 2026 17:44:12 +0200 Subject: [PATCH 070/128] [applet] add post exit cleanups to frontend applets to avoid accumulation (#4457) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Maran reported MK8D if one press Plus button 38 times. This could be impacting other games around, but 4442 already quenched the spontaneous accumulation cases, by avoiding multiple event signals. MK8D is an atypical induced example. The reason was a controller applet accumulation, as we had no proper way to keep track and erase child applets on exit. Now we have. Enjoy your Plus button rushing fetish! Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4457 Reviewed-by: lizzie Reviewed-by: MaranBr --- src/core/hle/service/am/frontend/applets.cpp | 15 +++++++++++---- .../service/am/service/library_applet_creator.cpp | 13 ++++++++----- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/core/hle/service/am/frontend/applets.cpp b/src/core/hle/service/am/frontend/applets.cpp index 407ca10602..d622c7b7a7 100644 --- a/src/core/hle/service/am/frontend/applets.cpp +++ b/src/core/hle/service/am/frontend/applets.cpp @@ -29,6 +29,7 @@ #include "core/hle/service/am/frontend/applet_web_browser.h" #include "core/hle/service/am/frontend/applets.h" #include "core/hle/service/am/service/storage.h" +#include "core/hle/service/am/window_system.h" #include "core/hle/service/sm/sm.h" namespace Service::AM::Frontend { @@ -72,10 +73,16 @@ void FrontendApplet::PushInteractiveOutData(std::shared_ptr storage) { void FrontendApplet::Exit() { auto applet_ = applet.lock(); - - std::scoped_lock lk{applet_->lock}; - applet_->is_completed = true; - applet_->state_changed_event.Signal(system.Kernel()); + { + std::scoped_lock lk{applet_->lock}; + applet_->is_completed = true; + applet_->state_changed_event.Signal(system.Kernel()); + } + if (auto caller_applet = applet_->caller_applet.lock()) { + std::scoped_lock lk{caller_applet->lock}; + std::erase(caller_applet->child_applets, applet_); + } + if (auto* window_system = system.GetAppletManager().GetWindowSystem()) window_system->RequestUpdate(); } FrontendAppletSet::FrontendAppletSet() = default; diff --git a/src/core/hle/service/am/service/library_applet_creator.cpp b/src/core/hle/service/am/service/library_applet_creator.cpp index ce80ce946f..4ee92908b5 100644 --- a/src/core/hle/service/am/service/library_applet_creator.cpp +++ b/src/core/hle/service/am/service/library_applet_creator.cpp @@ -122,7 +122,10 @@ std::shared_ptr CreateGuestApplet(Core::System& system, auto broker = std::make_shared(system); applet->caller_applet = caller_applet; applet->caller_applet_broker = broker; - caller_applet->child_applets.push_back(applet); + { + std::scoped_lock lk{caller_applet->lock}; + caller_applet->child_applets.push_back(applet); + } window_system.TrackApplet(applet, false); return std::make_shared(system, broker, applet); } @@ -148,10 +151,10 @@ std::shared_ptr CreateFrontendApplet(Core::System& syste applet->caller_applet = caller_applet; applet->caller_applet_broker = storage; applet->frontend = system.GetFrontendAppletHolder().GetApplet(applet, applet_id, mode); - caller_applet->child_applets.push_back(applet); - - window_system.TrackApplet(applet, false); - + { + std::scoped_lock lk{caller_applet->lock}; + caller_applet->child_applets.push_back(applet); + } return std::make_shared(system, storage, applet); } From 908b1e9a3701f142de51e133d910aa058d4b071c Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 20 Sep 2026 00:29:28 +0200 Subject: [PATCH 071/128] [dynarmic] fix bad arm codegen on relocations (#4458) In an earlier version I had these as constants which were referred to via `db`, I haphazardly left the LDR and didn't notice. Even still relocations apply to only 1 ins at a time. Fixes regressions on #4158 Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4458 Reviewed-by: CamilleLaVey Reviewed-by: MaranBr --- .../backend/arm64/a32_address_space.cpp | 75 ++++++++++++++++--- .../backend/arm64/a64_address_space.cpp | 74 +++++++++++++++--- .../dynarmic/backend/arm64/address_space.cpp | 51 +++++-------- .../dynarmic/backend/arm64/address_space.h | 20 ++++- 4 files changed, 160 insertions(+), 60 deletions(-) diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp index dc14d16978..0cf9bb9fae 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp @@ -24,29 +24,65 @@ namespace Dynarmic::Backend::Arm64 { template -static void* EmitCallTrampoline(oaknut::CodeGenerator& code, T* this_) { +static void* EmitCallReadTrampoline(oaknut::CodeGenerator& code, T* this_, size_t bitsize) { using namespace oaknut::util; - const auto info = Devirtualize(this_); - oaknut::Label l_addr, l_this; - void* target = code.xptr(); + // params = { this, vaddr, bitsize } code.LDR(X0, l_this); + // X1 = vaddr + code.MOV(X2, bitsize); code.LDR(Xscratch0, l_addr); code.BR(Xscratch0); - code.align(8); code.l(l_this); code.dx(info.this_ptr); code.l(l_addr); code.dx(info.fn_ptr); - return target; } template -static void* EmitWrappedReadCallTrampoline(oaknut::CodeGenerator& code, T* this_) { +static void* EmitCallWriteTrampoline(oaknut::CodeGenerator& code, T* this_, size_t bitsize) { + using namespace oaknut::util; + const auto info = Devirtualize(this_); + oaknut::Label l_addr, l_this; + void* target = code.xptr(); + // params = { this, vaddr, value, bitsize } + code.LDR(X0, l_this); + // X1 = vaddr + // X2 = value + code.MOV(X3, bitsize); + code.LDR(Xscratch0, l_addr); + code.BR(Xscratch0); + code.align(8); + code.l(l_this); + code.dx(info.this_ptr); + code.l(l_addr); + code.dx(info.fn_ptr); + return target; +} + +template +static void* EmitCallTrampoline(oaknut::CodeGenerator& code, T* this_) { + using namespace oaknut::util; + const auto info = Devirtualize(this_); + oaknut::Label l_addr, l_this; + void* target = code.xptr(); + code.LDR(X0, l_this); + code.LDR(Xscratch0, l_addr); + code.BR(Xscratch0); + code.align(8); + code.l(l_this); + code.dx(info.this_ptr); + code.l(l_addr); + code.dx(info.fn_ptr); + return target; +} + +template +static void* EmitWrappedReadCallTrampoline(oaknut::CodeGenerator& code, T* this_, size_t bitsize) { using namespace oaknut::util; const auto info = Devirtualize(this_); @@ -59,6 +95,7 @@ static void* EmitWrappedReadCallTrampoline(oaknut::CodeGenerator& code, T* this_ ABI_PushRegisters(code, save_regs, 0); code.LDR(X0, l_this); code.MOV(X1, Xscratch0); + code.MOV(X2, bitsize); code.LDR(Xscratch0, l_addr); code.BLR(Xscratch0); code.MOV(Xscratch0, X0); @@ -101,7 +138,7 @@ static void* EmitExclusiveReadCallTrampoline(oaknut::CodeGenerator& code, const } template -static void* EmitWrappedWriteCallTrampoline(oaknut::CodeGenerator& code, T* this_) { +static void* EmitWrappedWriteCallTrampoline(oaknut::CodeGenerator& code, T* this_, size_t bitsize) { using namespace oaknut::util; const auto info = Devirtualize(this_); @@ -115,6 +152,7 @@ static void* EmitWrappedWriteCallTrampoline(oaknut::CodeGenerator& code, T* this code.LDR(X0, l_this); code.MOV(X1, Xscratch0); code.MOV(X2, Xscratch1); + code.MOV(X3, bitsize); code.LDR(Xscratch0, l_addr); code.BLR(Xscratch0); ABI_PopRegisters(code, save_regs, 0); @@ -176,14 +214,27 @@ void A32AddressSpace::EmitPrelude() { UnprotectCodeMemory(); - prelude_info.read_memory = EmitCallTrampoline<&A32::UserCallbacks::MemoryRead>(code, conf.callbacks); - prelude_info.wrapped_read_memory = EmitWrappedReadCallTrampoline<&A32::UserCallbacks::MemoryRead>(code, conf.callbacks); + + prelude_info.read_memory_8 = EmitCallReadTrampoline<&A32::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u8)); + prelude_info.read_memory_16 = EmitCallReadTrampoline<&A32::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u16)); + prelude_info.read_memory_32 = EmitCallReadTrampoline<&A32::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u32)); + prelude_info.read_memory_64 = EmitCallReadTrampoline<&A32::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u64)); + prelude_info.wrapped_read_memory_8 = EmitWrappedReadCallTrampoline<&A32::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u8)); + prelude_info.wrapped_read_memory_16 = EmitWrappedReadCallTrampoline<&A32::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u16)); + prelude_info.wrapped_read_memory_32 = EmitWrappedReadCallTrampoline<&A32::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u32)); + prelude_info.wrapped_read_memory_64 = EmitWrappedReadCallTrampoline<&A32::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u64)); prelude_info.exclusive_read_memory_8 = EmitExclusiveReadCallTrampoline<&A32::UserCallbacks::MemoryRead, u8>(code, conf); prelude_info.exclusive_read_memory_16 = EmitExclusiveReadCallTrampoline<&A32::UserCallbacks::MemoryRead, u16>(code, conf); prelude_info.exclusive_read_memory_32 = EmitExclusiveReadCallTrampoline<&A32::UserCallbacks::MemoryRead, u32>(code, conf); prelude_info.exclusive_read_memory_64 = EmitExclusiveReadCallTrampoline<&A32::UserCallbacks::MemoryRead, u64>(code, conf); - prelude_info.write_memory = EmitCallTrampoline<&A32::UserCallbacks::MemoryWrite>(code, conf.callbacks); - prelude_info.wrapped_write_memory = EmitWrappedWriteCallTrampoline<&A32::UserCallbacks::MemoryWrite>(code, conf.callbacks); + prelude_info.write_memory_8 = EmitCallWriteTrampoline<&A32::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u8)); + prelude_info.write_memory_16 = EmitCallWriteTrampoline<&A32::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u16)); + prelude_info.write_memory_32 = EmitCallWriteTrampoline<&A32::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u32)); + prelude_info.write_memory_64 = EmitCallWriteTrampoline<&A32::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u64)); + prelude_info.wrapped_write_memory_8 = EmitWrappedWriteCallTrampoline<&A32::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u8)); + prelude_info.wrapped_write_memory_16 = EmitWrappedWriteCallTrampoline<&A32::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u16)); + prelude_info.wrapped_write_memory_32 = EmitWrappedWriteCallTrampoline<&A32::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u32)); + prelude_info.wrapped_write_memory_64 = EmitWrappedWriteCallTrampoline<&A32::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u64)); prelude_info.exclusive_write_memory_8 = EmitExclusiveWriteCallTrampoline<&A32::UserCallbacks::MemoryWriteExclusive8, u8>(code, conf); prelude_info.exclusive_write_memory_16 = EmitExclusiveWriteCallTrampoline<&A32::UserCallbacks::MemoryWriteExclusive16, u16>(code, conf); prelude_info.exclusive_write_memory_32 = EmitExclusiveWriteCallTrampoline<&A32::UserCallbacks::MemoryWriteExclusive32, u32>(code, conf); diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp index efb9fc538c..492242fa73 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp @@ -23,29 +23,65 @@ namespace Dynarmic::Backend::Arm64 { template -static void* EmitCallTrampoline(oaknut::CodeGenerator& code, T* this_) { +static void* EmitCallReadTrampoline(oaknut::CodeGenerator& code, T* this_, size_t bitsize) { using namespace oaknut::util; - const auto info = Devirtualize(this_); - oaknut::Label l_addr, l_this; - void* target = code.xptr(); + // params = { this, vaddr, bitsize } code.LDR(X0, l_this); + // X1 = vaddr + code.MOV(X2, bitsize); code.LDR(Xscratch0, l_addr); code.BR(Xscratch0); - code.align(8); code.l(l_this); code.dx(info.this_ptr); code.l(l_addr); code.dx(info.fn_ptr); - return target; } template -static void* EmitWrappedReadCallTrampoline(oaknut::CodeGenerator& code, T* this_) { +static void* EmitCallWriteTrampoline(oaknut::CodeGenerator& code, T* this_, size_t bitsize) { + using namespace oaknut::util; + const auto info = Devirtualize(this_); + oaknut::Label l_addr, l_this; + void* target = code.xptr(); + // params = { this, vaddr, value, bitsize } + code.LDR(X0, l_this); + // X1 = vaddr + // X2 = value + code.MOV(X3, bitsize); + code.LDR(Xscratch0, l_addr); + code.BR(Xscratch0); + code.align(8); + code.l(l_this); + code.dx(info.this_ptr); + code.l(l_addr); + code.dx(info.fn_ptr); + return target; +} + +template +static void* EmitCallTrampoline(oaknut::CodeGenerator& code, T* this_) { + using namespace oaknut::util; + const auto info = Devirtualize(this_); + oaknut::Label l_addr, l_this; + void* target = code.xptr(); + code.LDR(X0, l_this); + code.LDR(Xscratch0, l_addr); + code.BR(Xscratch0); + code.align(8); + code.l(l_this); + code.dx(info.this_ptr); + code.l(l_addr); + code.dx(info.fn_ptr); + return target; +} + +template +static void* EmitWrappedReadCallTrampoline(oaknut::CodeGenerator& code, T* this_, size_t bitsize) { using namespace oaknut::util; const auto info = Devirtualize(this_); @@ -58,6 +94,7 @@ static void* EmitWrappedReadCallTrampoline(oaknut::CodeGenerator& code, T* this_ ABI_PushRegisters(code, save_regs, 0); code.LDR(X0, l_this); code.MOV(X1, Xscratch0); + code.MOV(X2, bitsize); code.LDR(Xscratch0, l_addr); code.BLR(Xscratch0); code.MOV(Xscratch0, X0); @@ -100,7 +137,7 @@ static void* EmitExclusiveReadCallTrampoline(oaknut::CodeGenerator& code, const } template -static void* EmitWrappedWriteCallTrampoline(oaknut::CodeGenerator& code, T* this_) { +static void* EmitWrappedWriteCallTrampoline(oaknut::CodeGenerator& code, T* this_, size_t bitsize) { using namespace oaknut::util; const auto info = Devirtualize(this_); @@ -114,6 +151,7 @@ static void* EmitWrappedWriteCallTrampoline(oaknut::CodeGenerator& code, T* this code.LDR(X0, l_this); code.MOV(X1, Xscratch0); code.MOV(X2, Xscratch1); + code.MOV(X3, bitsize); code.LDR(Xscratch0, l_addr); code.BLR(Xscratch0); ABI_PopRegisters(code, save_regs, 0); @@ -342,18 +380,30 @@ void A64AddressSpace::EmitPrelude() { UnprotectCodeMemory(); - prelude_info.read_memory = EmitCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks); + prelude_info.read_memory_8 = EmitCallReadTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u8)); + prelude_info.read_memory_16 = EmitCallReadTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u16)); + prelude_info.read_memory_32 = EmitCallReadTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u32)); + prelude_info.read_memory_64 = EmitCallReadTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u64)); prelude_info.read_memory_128 = EmitRead128CallTrampoline(code, conf.callbacks); - prelude_info.wrapped_read_memory = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks); + prelude_info.wrapped_read_memory_8 = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u8)); + prelude_info.wrapped_read_memory_16 = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u16)); + prelude_info.wrapped_read_memory_32 = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u32)); + prelude_info.wrapped_read_memory_64 = EmitWrappedReadCallTrampoline<&A64::UserCallbacks::MemoryRead>(code, conf.callbacks, sizeof(u64)); prelude_info.wrapped_read_memory_128 = EmitWrappedRead128CallTrampoline(code, conf.callbacks); prelude_info.exclusive_read_memory_8 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead, u8>(code, conf); prelude_info.exclusive_read_memory_16 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead, u16>(code, conf); prelude_info.exclusive_read_memory_32 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead, u32>(code, conf); prelude_info.exclusive_read_memory_64 = EmitExclusiveReadCallTrampoline<&A64::UserCallbacks::MemoryRead, u64>(code, conf); prelude_info.exclusive_read_memory_128 = EmitExclusiveRead128CallTrampoline(code, conf); - prelude_info.write_memory = EmitCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks); + prelude_info.write_memory_8 = EmitCallWriteTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u8)); + prelude_info.write_memory_16 = EmitCallWriteTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u16)); + prelude_info.write_memory_32 = EmitCallWriteTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u32)); + prelude_info.write_memory_64 = EmitCallWriteTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u64)); prelude_info.write_memory_128 = EmitWrite128CallTrampoline(code, conf.callbacks); - prelude_info.wrapped_write_memory = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks); + prelude_info.wrapped_write_memory_8 = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u8)); + prelude_info.wrapped_write_memory_16 = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u16)); + prelude_info.wrapped_write_memory_32 = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u32)); + prelude_info.wrapped_write_memory_64 = EmitWrappedWriteCallTrampoline<&A64::UserCallbacks::MemoryWrite>(code, conf.callbacks, sizeof(u64)); prelude_info.wrapped_write_memory_128 = EmitWrappedWrite128CallTrampoline(code, conf.callbacks); prelude_info.exclusive_write_memory_8 = EmitExclusiveWriteCallTrampoline<&A64::UserCallbacks::MemoryWriteExclusive8, u8>(code, conf); prelude_info.exclusive_write_memory_16 = EmitExclusiveWriteCallTrampoline<&A64::UserCallbacks::MemoryWriteExclusive16, u16>(code, conf); diff --git a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp index 7b83e372e6..4ef3296c4a 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp @@ -147,44 +147,37 @@ void AddressSpace::Link(EmittedBlockInfo& block_info) { break; // { this, vaddr, size } case LinkTarget::ReadMemory8: - c.LDR(X2, 1); - c.BL(prelude_info.read_memory); + c.BL(prelude_info.read_memory_8); break; case LinkTarget::ReadMemory16: - c.LDR(X2, 2); - c.BL(prelude_info.read_memory); + c.BL(prelude_info.read_memory_16); break; case LinkTarget::ReadMemory32: - c.LDR(X2, 4); - c.BL(prelude_info.read_memory); + c.BL(prelude_info.read_memory_32); break; case LinkTarget::ReadMemory64: - c.LDR(X2, 8); - c.BL(prelude_info.read_memory); + c.BL(prelude_info.read_memory_64); break; case LinkTarget::ReadMemory128: c.BL(prelude_info.read_memory_128); break; // { this, vaddr, size } case LinkTarget::WrappedReadMemory8: - c.LDR(X2, 1); - c.BL(prelude_info.wrapped_read_memory); + c.BL(prelude_info.wrapped_read_memory_8); break; case LinkTarget::WrappedReadMemory16: - c.LDR(X2, 2); - c.BL(prelude_info.wrapped_read_memory); + c.BL(prelude_info.wrapped_read_memory_16); break; case LinkTarget::WrappedReadMemory32: - c.LDR(X2, 4); - c.BL(prelude_info.wrapped_read_memory); + c.BL(prelude_info.wrapped_read_memory_32); break; case LinkTarget::WrappedReadMemory64: - c.LDR(X2, 8); - c.BL(prelude_info.wrapped_read_memory); + c.BL(prelude_info.wrapped_read_memory_64); break; case LinkTarget::WrappedReadMemory128: c.BL(prelude_info.wrapped_read_memory_128); break; + // case LinkTarget::ExclusiveReadMemory8: c.BL(prelude_info.exclusive_read_memory_8); break; @@ -202,43 +195,37 @@ void AddressSpace::Link(EmittedBlockInfo& block_info) { break; // { this, vaddr, value, size } case LinkTarget::WriteMemory8: - c.LDR(X3, 1); - c.BL(prelude_info.write_memory); + c.BL(prelude_info.write_memory_8); break; case LinkTarget::WriteMemory16: - c.LDR(X3, 2); - c.BL(prelude_info.write_memory); + c.BL(prelude_info.write_memory_16); break; case LinkTarget::WriteMemory32: - c.LDR(X3, 4); - c.BL(prelude_info.write_memory); + c.BL(prelude_info.write_memory_32); break; case LinkTarget::WriteMemory64: - c.LDR(X3, 8); - c.BL(prelude_info.write_memory); + c.BL(prelude_info.write_memory_64); break; case LinkTarget::WriteMemory128: c.BL(prelude_info.write_memory_128); break; + // case LinkTarget::WrappedWriteMemory8: - c.LDR(X3, 1); - c.BL(prelude_info.wrapped_write_memory); + c.BL(prelude_info.wrapped_write_memory_8); break; case LinkTarget::WrappedWriteMemory16: - c.LDR(X3, 2); - c.BL(prelude_info.wrapped_write_memory); + c.BL(prelude_info.wrapped_write_memory_16); break; case LinkTarget::WrappedWriteMemory32: - c.LDR(X3, 4); - c.BL(prelude_info.wrapped_write_memory); + c.BL(prelude_info.wrapped_write_memory_32); break; case LinkTarget::WrappedWriteMemory64: - c.LDR(X3, 8); - c.BL(prelude_info.wrapped_write_memory); + c.BL(prelude_info.wrapped_write_memory_64); break; case LinkTarget::WrappedWriteMemory128: c.BL(prelude_info.wrapped_write_memory_128); break; + // case LinkTarget::ExclusiveWriteMemory8: c.BL(prelude_info.exclusive_write_memory_8); break; diff --git a/src/dynarmic/src/dynarmic/backend/arm64/address_space.h b/src/dynarmic/src/dynarmic/backend/arm64/address_space.h index 73e2c94a19..755b05bd02 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/address_space.h +++ b/src/dynarmic/src/dynarmic/backend/arm64/address_space.h @@ -93,18 +93,30 @@ protected: void* return_to_dispatcher; void* return_from_run_code; - void* read_memory; + void* read_memory_8; + void* read_memory_16; + void* read_memory_32; + void* read_memory_64; void* read_memory_128; - void* wrapped_read_memory; + void* wrapped_read_memory_8; + void* wrapped_read_memory_16; + void* wrapped_read_memory_32; + void* wrapped_read_memory_64; void* wrapped_read_memory_128; void* exclusive_read_memory_8; void* exclusive_read_memory_16; void* exclusive_read_memory_32; void* exclusive_read_memory_64; void* exclusive_read_memory_128; - void* write_memory; + void* write_memory_8; + void* write_memory_16; + void* write_memory_32; + void* write_memory_64; void* write_memory_128; - void* wrapped_write_memory; + void* wrapped_write_memory_8; + void* wrapped_write_memory_16; + void* wrapped_write_memory_32; + void* wrapped_write_memory_64; void* wrapped_write_memory_128; void* exclusive_write_memory_8; void* exclusive_write_memory_16; From a277b62fe4328dddaced9a97d324c6e5478d16a0 Mon Sep 17 00:00:00 2001 From: xbzk Date: Sun, 20 Sep 2026 04:40:14 +0200 Subject: [PATCH 072/128] [fs] revert #4319 savedata_factory changes (#4462) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- This one reverts part of the PR 4319 which was aimed to allow child titles to inherit bundle settings. The fix seems good so far, but by applying it to save folders caused a trap: Now child's save folders move to bundle folder, hence saves will vanish, and the android/qt save tools are still pointing to old folders. Since the save part was only a compliance fix, instead of fiddle in master i'd rather revert this part now, then only touch this again if any bug show up. No worries. I'll be right here waiting. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4462 Reviewed-by: lizzie Reviewed-by: MaranBr --- src/core/file_sys/savedata_factory.cpp | 22 ++++++++-------------- src/core/file_sys/savedata_factory.h | 1 - 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/core/file_sys/savedata_factory.cpp b/src/core/file_sys/savedata_factory.cpp index 72f022cb41..c756734a43 100644 --- a/src/core/file_sys/savedata_factory.cpp +++ b/src/core/file_sys/savedata_factory.cpp @@ -9,7 +9,6 @@ #include "common/logging.h" #include "common/uuid.h" #include "core/core.h" -#include "core/file_sys/registered_cache.h" #include "core/file_sys/savedata_factory.h" #include "core/file_sys/vfs/vfs.h" @@ -62,24 +61,17 @@ SaveDataFactory::SaveDataFactory(Core::System& system_, ProgramId program_id_, SaveDataFactory::~SaveDataFactory() = default; -std::string SaveDataFactory::GetSaveDataPath(SaveDataSpaceId space, SaveDataType type, u64 title_id, u128 user_id, u64 save_id) const { - if (type == SaveDataType::Account || type == SaveDataType::Device) { - const auto requested_id = title_id != 0 ? title_id : program_id; - const auto parent_id = system.GetContentProvider().GetParentApplicationId(requested_id); - title_id = parent_id.value_or(requested_id); - } - return GetFullPath(program_id, dir, space, type, title_id, user_id, save_id); -} - VirtualDir SaveDataFactory::Create(SaveDataSpaceId space, const SaveDataAttribute& meta) const { - const auto save_directory = GetSaveDataPath(space, meta.type, meta.program_id, meta.user_id, meta.system_save_data_id); + const auto save_directory = GetFullPath(program_id, dir, space, meta.type, meta.program_id, + meta.user_id, meta.system_save_data_id); return dir->CreateDirectoryRelative(save_directory); } VirtualDir SaveDataFactory::Open(SaveDataSpaceId space, const SaveDataAttribute& meta) const { - const auto save_directory = GetSaveDataPath(space, meta.type, meta.program_id, meta.user_id, meta.system_save_data_id); + const auto save_directory = GetFullPath(program_id, dir, space, meta.type, meta.program_id, + meta.user_id, meta.system_save_data_id); auto out = dir->GetDirectoryRelative(save_directory); @@ -162,7 +154,8 @@ std::string SaveDataFactory::GetUserGameSaveDataRoot(u128 user_id, bool future) SaveDataSize SaveDataFactory::ReadSaveDataSize(SaveDataType type, u64 title_id, u128 user_id) const { - const auto path = GetSaveDataPath(SaveDataSpaceId::User, type, title_id, user_id, 0); + const auto path = + GetFullPath(program_id, dir, SaveDataSpaceId::User, type, title_id, user_id, 0); const auto relative_dir = GetOrCreateDirectoryRelative(dir, path); const auto size_file = relative_dir->GetFile(GetSaveDataSizeFileName()); @@ -180,7 +173,8 @@ SaveDataSize SaveDataFactory::ReadSaveDataSize(SaveDataType type, u64 title_id, void SaveDataFactory::WriteSaveDataSize(SaveDataType type, u64 title_id, u128 user_id, SaveDataSize new_value) const { - const auto path = GetSaveDataPath(SaveDataSpaceId::User, type, title_id, user_id, 0); + const auto path = + GetFullPath(program_id, dir, SaveDataSpaceId::User, type, title_id, user_id, 0); const auto relative_dir = GetOrCreateDirectoryRelative(dir, path); const auto size_file = relative_dir->CreateFile(GetSaveDataSizeFileName()); diff --git a/src/core/file_sys/savedata_factory.h b/src/core/file_sys/savedata_factory.h index 36c09ce2ac..c7899f023d 100644 --- a/src/core/file_sys/savedata_factory.h +++ b/src/core/file_sys/savedata_factory.h @@ -50,7 +50,6 @@ public: void SetAutoCreate(bool state); private: - std::string GetSaveDataPath(SaveDataSpaceId space, SaveDataType type, u64 title_id, u128 user_id, u64 save_id) const; Core::System& system; ProgramId program_id; VirtualDir dir; From 74b5e10dc553bb24ccb3460529b15b3c3198bb10 Mon Sep 17 00:00:00 2001 From: xbzk Date: Sun, 20 Sep 2026 22:56:06 +0200 Subject: [PATCH 073/128] [native] doesUpdateMatchProgram update mask fix (#4465) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Old silly bug i've been neglecting: On Android, installing content to NAND, under some content id conditions (ie MK8D DLC), base/update IDs mismatch, and UI prompts "The content that you selected does not match this game. Install anyway? Useless, yet fixed. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4465 Reviewed-by: lizzie Reviewed-by: MaranBr --- src/android/app/src/main/jni/native.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 746b00ad11..d4f7689934 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -788,7 +788,7 @@ int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj, jstring jprogramId, jstring jupdatePath) { - u64 program_id = EmulationSession::GetProgramId(env, jprogramId); + const u64 program_id = FileSys::GetBaseTitleID(EmulationSession::GetProgramId(env, jprogramId)); std::string updatePath = Common::Android::GetJString(env, jupdatePath); std::shared_ptr nsp = std::make_shared( EmulationSession::GetInstance().System().GetFilesystem()->OpenFile( @@ -796,7 +796,7 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* en for (const auto& item : nsp->GetNCAs()) { for (const auto& nca_details : item.second) { if (nca_details.second->GetName().ends_with(".cnmt.nca")) { - auto update_id = nca_details.second->GetTitleId() & ~0xFFFULL; + const auto update_id = FileSys::GetBaseTitleID(nca_details.second->GetTitleId()); if (update_id == program_id) { return true; } From 9cd24e85c2c24016cfdba50e3533395561536f7e Mon Sep 17 00:00:00 2001 From: Eden CI Date: Mon, 21 Sep 2026 19:25:54 +0200 Subject: [PATCH 074/128] [dist, android] Update translations from Transifex for Sep 21 (#4466) Automatic translation update for Sep 21 Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4466 --- dist/languages/ar.ts | 1211 +++++++++-------- dist/languages/ca.ts | 1049 +++++++------- dist/languages/cs.ts | 1049 +++++++------- dist/languages/da.ts | 1049 +++++++------- dist/languages/de.ts | 1049 +++++++------- dist/languages/el.ts | 1049 +++++++------- dist/languages/es.ts | 1051 +++++++------- dist/languages/fi.ts | 1049 +++++++------- dist/languages/fr.ts | 1049 +++++++------- dist/languages/hu.ts | 1049 +++++++------- dist/languages/id.ts | 1049 +++++++------- dist/languages/it.ts | 1049 +++++++------- dist/languages/ja_JP.ts | 1049 +++++++------- dist/languages/ko_KR.ts | 1049 +++++++------- dist/languages/nb.ts | 1049 +++++++------- dist/languages/nl.ts | 1049 +++++++------- dist/languages/pl.ts | 1049 +++++++------- dist/languages/pt_BR.ts | 1049 +++++++------- dist/languages/pt_PT.ts | 1049 +++++++------- dist/languages/ru_RU.ts | 1049 +++++++------- dist/languages/sv.ts | 1058 +++++++------- dist/languages/tr_TR.ts | 1049 +++++++------- dist/languages/uk.ts | 1049 +++++++------- dist/languages/vi.ts | 1049 +++++++------- dist/languages/vi_VN.ts | 1049 +++++++------- dist/languages/zh_CN.ts | 1100 ++++++++------- dist/languages/zh_TW.ts | 1049 +++++++------- .../app/src/main/res/values-es/strings.xml | 1 + .../app/src/main/res/values-ru/strings.xml | 9 + .../src/main/res/values-zh-rCN/strings.xml | 36 + .../src/main/res/values-zh-rTW/strings.xml | 39 +- 31 files changed, 14962 insertions(+), 13670 deletions(-) diff --git a/dist/languages/ar.ts b/dist/languages/ar.ts index cd37ef9739..bb259d2870 100644 --- a/dist/languages/ar.ts +++ b/dist/languages/ar.ts @@ -313,17 +313,17 @@ This would ban both their forum username and their IP address. Output Engine: - محرك الإخراج: + :محرك الإخراج Output Device: - جهاز الإخراج: + :جهاز الإخراج Input Device: - جهاز الإدخال: + :جهاز الإدخال @@ -333,7 +333,7 @@ This would ban both their forum username and their IP address. Volume: - الصوت: + :الصوت @@ -413,7 +413,7 @@ Can help reduce stuttering at lower framerates. Accuracy: - الدقة: + :الدقة @@ -424,12 +424,12 @@ Can help reduce stuttering at lower framerates. Backend: - الخلفية: + :الخلفية CPU Clocks - ترددات وحدة المعالجة المركزية + سرعات وحدة المعالجة المركزية @@ -528,7 +528,7 @@ Please note this may result in deadlocks and other race conditions. API: - واجهة برمجة التطبيقات: + :واجهة برمجة التطبيقات @@ -540,7 +540,7 @@ Vulkan يُنصح باستخدام Device: - جهاز: + :جهاز @@ -550,7 +550,7 @@ Vulkan يُنصح باستخدام Resolution: - الدقة: + :الدقة @@ -564,7 +564,7 @@ Options lower than 1X can cause artifacts. Window Adapting Filter: - مرشح تكييف النافذة: + :مرشح تكييف النافذة @@ -579,7 +579,7 @@ Options lower than 1X can cause artifacts. Anti-Aliasing Method: - طريقة مضاد التعرج: + :طريقة مضاد التعرج @@ -591,12 +591,22 @@ FXAA can produce a more stable picture in lower resolutions. يُمكن لـ FXAA إنتاج صورة أكثر ثباتًا بدقة أقل. - - Fullscreen Mode: - وضع ملء الشاشة: + + Enable post-processing effects + تفعيل تأثيرات المعالجة اللاحقة - + + Applies post-processing effects to the final image. + يُطبق تأثيرات ما بعد المعالجة على الصورة النهائية. + + + + Fullscreen Mode: + :وضع ملء الشاشة + + + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -605,12 +615,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp قد يوفر وضع ملء الشاشة الحصري أداءً أفضل ودعمًا أفضل لتقنيتي Freesync/Gsync. - + Aspect Ratio: - نسبة العرض إلى الارتفاع: + :نسبة العرض إلى الارتفاع - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -619,48 +629,48 @@ Also controls the aspect ratio of captured screenshots. كما يتحكم في نسبة العرض إلى الارتفاع للقطات الشاشة الملتقطة. - + Use persistent pipeline cache استخدام ذاكرة التخزين المؤقتة الدائمة للأنابيب - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. يسمح بحفظ التظليلات في وحدة التخزين لتحميلها بشكل أسرع عند تشغيل اللعبة في المرات التالية. لا يُقصد من تعطيله سوى تصحيح الأخطاء. - + Use asynchronous GPU emulation استخدم محاكاة وحدة معالجة الرسومات غير المتزامنة - + Uses an extra CPU thread for rendering. This option should always remain enabled. يستخدم خيط معالجة إضافي للمعالجة الرسومية. يجب أن يبقى هذا الخيار مُفعّلاً دائماً. - + NVDEC emulation: NVDEC محاكاة: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. يُحدد كيفية فك تشفير الفيديوهات.يمكن استخدام وحدة المعالجة المركزية CPU أو وحدة معالجة الرسومات GPU لفك التشفير، أو عدم فك التشفير إطلاقًا (شاشة سوداء على الفيديوهات).في معظم الحالات، يُوفر فك تشفير وحدة معالجة الرسومات GPU أفضل أداء. - + ASTC Decoding Method: ASTC طريقة فك تشفير: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -672,12 +682,12 @@ stuttering but may present artifacts. وحدة المعالجة المركزية بشكل غير متزامن: استخدمها لفك تشفير قوام ASTC عند الطلب. يزيل هذا الخيار تقطع فك تشفير ASTC، ولكنه قد يُظهر بعض العيوب. - + ASTC Recompression Method: ASTC طريقة إعادة ضغط: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -685,44 +695,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3: سيتم إعادة ضغط الصيغة الوسيطة إلى صيغة BC1 أو BC3، مما يوفر مساحة على ذاكرة الوصول العشوائي للفيديو VRAM ولكنه يُضعف جودة الصورة. - + Frame Pacing Mode (Vulkan only) (Vulkan فقط) وضع توقيت الإطارات - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. يتحكم في كيفية إدارة المحاكي لسرعة الإطارات لتقليل التقطع وجعل معدل الإطارات أكثر سلاسة واتساقًا. - + VRAM Usage Mode: VRAM وضع استهلاك: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. يُحدد ما إذا كان ينبغي على المُحاكي تفضيل توفير الذاكرة أو الاستفادة القصوى من ذاكرة الفيديو المُتاحة لتحسين الأداء. قد يؤثر الوضع المُكثّف على أداء تطبيقات أخرى، مثل برامج التسجيل. - + Skip CPU Inner Invalidation تخطي إبطال وحدة المعالجة المركزية الداخلية - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. يتخطى بعض عمليات إبطال ذاكرة التخزين المؤقتة أثناء تحديثات الذاكرة، مما يقلل من استخدام وحدة المعالجة المركزية ويحسّن زمن الوصول. قد يؤدي هذا إلى أعطال مؤقتة. - + VSync Mode: VSync وضع: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -733,12 +743,12 @@ Immediate (no synchronization) presents whatever is available and can exhibit te يُظهر الوضع الفوري (بدون مزامنة) كل ما هو متاح، وقد يُظهر تمزقًا. - + Sync Memory Operations مزامنة عمليات الذاكرة - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -747,44 +757,44 @@ Unreal Engine 4 games often see the most significant changes thereof. التغييرات الأكثر أهمية Unreal Engine 4 غالبًا ما تشهد ألعاب. - + Enable asynchronous presentation (Vulkan only) (Vulkan فقط) تمكين العرض التقديمي غير المتزامن - + Slightly improves performance by moving presentation to a separate CPU thread. تحسين الأداء بشكل طفيف عن طريق نقل العرض التقديمي إلى مؤشر ترابط منفصل في وحدة المعالجة المركزية. - + Force maximum clocks (Vulkan only) (Vulkan فقط) فرض الحد الأقصى للساعات - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. يعمل في الخلفية أثناء انتظار أوامر الرسومات لمنع وحدة معالجة الرسومات من خفض سرعة الساعة. - + Anisotropic Filtering: الترشيح المتباين الخواص: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. يتحكم بجودة عرض الملمس بزوايا مائلة. من الآمن ضبطه على 16x على معظم وحدات معالجة الرسومات. - + GPU Mode: وضع وحدة معالجة الرسومات: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -793,12 +803,12 @@ Particles tend to only render correctly with Accurate mode. لا تُعرض الجسيمات بشكل صحيح إلا في وضع «دقيق». - + DMA Accuracy: DMA دقة: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -807,12 +817,12 @@ Default follows the GPU Accuracy setting. يُتبع الإعداد الافتراضي إعداد «دقة وحدة معالجة الرسومات» - + GPU Fence Behavior: :سلوك حاجز وحدة معالجة الرسومات - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -827,56 +837,56 @@ Default follows the GPU Accuracy setting. الإعداد الافتراضي يتبع إعداد دقة وحدة معالجة الرسومات. - + Enable GPU buffer readback تفعيل قراءة مخزن وحدة معالجة الرسومات - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. يحافظ على البيانات المعدلة بواسطة وحدة معالجة الرسومات عن طريق قراءتها قبل رفعها. بعض الألعاب تحتاج هذا لعرض تأثيرات معينة بشكل صحيح. - + Enable asynchronous shader compilation تفعيل تجميع التظليل غير المتزامن - + May reduce shader stutter. قد يقلل من تقطع التظليل. - + GPU Clocks - سرعات معالج الرسوميات + سرعات وحدة معالجة الرسومات - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. يجعل اللعبة تعتقد أن عمل وحدة معالجة الرسومات ينتهي بشكل أسرع مما هو عليه في الواقع، لذلك تتوقف عن خفض الدقة ومسافة العرض لتتناسب مع سرعات جهاز Switch. - + GPU Unswizzle إلغاء ترتيب بيانات وحدة معالجة الرسومات - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. باستخدام حوسبة وحدة معالجة الرسومات BCn 3D يسرع فك تشفير نسيج. قم بتعطيله في حالة حدوث أعطال أو مشاكل في الرسومات. - + GPU Unswizzle Max Texture Size الحد الأقصى لحجم النسيج في وحدة معالجة الرسومات بعد إعادة ترتيب البيانات - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -885,48 +895,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size حجم تدفق إلغاء ترتيب بيانات وحدة معالجة الرسومات - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. يحدد الحد الأقصى لكمية بيانات النسيج (بالميغابايت) التي تتم معالجتها لكل إطار. يمكن أن تقلل القيم الأعلى من التقطع أثناء تحميل النسيج، ولكنها قد تؤثر على اتساق الإطارات. - + GPU Unswizzle Chunk Size حجم كتلة إلغاء ترتيب بيانات وحدة معالجة الرسومات - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. يُحدد هذا الخيار عدد شرائح العمق التي تتم معالجتها في عملية إرسال واحدة. زيادة هذا الخيار قد تُحسّن الإنتاجية على وحدات معالجة الرسومات المتطورة، ولكنها قد تُسبب أخطاء في إعادة تعيين وقت الاستجابة أو انقطاع الاتصال ببرنامج التشغيل على الأجهزة ذات المواصفات الأقل. - + Use Vulkan pipeline cache Vulkan استخدام ذاكرة التخزين المؤقتة لخط أنابيب - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. يُفعّل ذاكرة التخزين المؤقت لخطوط الأنابيب الخاصة ببائع وحدة معالجة الرسومات. بتخزين ملفات ذاكرة التخزين المؤقتة للخطوط الداخلية Vulkan يمكن أن يؤدي هذا الخيار إلى تحسين وقت تحميل التظليل بشكل كبير في الحالات التي لا يقوم فيها برنامج تشغيل. - + Enable Compute Pipelines (Intel Vulkan Only) (Intel Vulkan فقط) تمكين خطوط أنابيب الحوسبة - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -935,192 +945,192 @@ Compute pipelines are always enabled on all other drivers. خطوط أنابيب الحوسبة مفعلة دائمًا على جميع برامج التشغيل الأخرى. - + Enable Reactive Flushing تمكين التنظيف التفاعلي - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. يستخدم التنظيف التفاعلي بدلاً من التنظيف التنبئي، مما يسمح بمزامنة الذاكرة بشكل أكثر دقة. - + Sync to framerate of video playback المزامنة مع معدل الإطارات لتشغيل الفيديو - + Run the game at normal speed during video playback, even when the framerate is unlocked. قم بتشغيل اللعبة بالسرعة العادية أثناء تشغيل الفيديو، حتى عندما يكون معدل الإطارات مفتوحًا. - + Barrier feedback loops حلقات التغذية الراجعة للحواجز - + Improves rendering of transparency effects in specific games. يحسن عرض تأثيرات الشفافية في بعض الألعاب المحددة. - + Enable buffer history تمكين سجل التخزين المؤقت - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. يُتيح هذا الخيار الوصول إلى حالات التخزين المؤقت السابقة. وقد يُحسّن جودة العرض وثبات الأداء في بعض الألعاب. - + Fix bloom effects إصلاح تأثيرات التوهج - + Removes bloom in Burnout. يزيل التوهج في وضع الاحتراق. - + Enable Legacy Rescale Pass تفعيل ميزة إعادة التحجيم القديمة - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. قد يصلح مشاكل إعادة القياس في بعض الألعاب بالاعتماد على سلوك من التنفيذ السابق. حل لسلوك قديم يصلح تشوهات الخطوط على بطاقات AMD وIntel الرسومية، ووميض النسيج الرمادي على بطاقات Nvidia الرسومية في لعبة Luigi's Mansion 3. - + Extended Dynamic State الحالة الديناميكية الموسعة - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. يتحكم في عدد الميزات التي يمكن استخدامها في الحالة الديناميكية الموسعة.تسمح الحالات الأعلى بمزيد من الميزات ويمكن أن تزيد من الأداء، ولكنها قد تسبب مشكلات رسومية إضافية. - + Vertex Input Dynamic State حالة ديناميكية لإدخال الرأس - + Enables vertex input dynamic state feature for better quality and performance. يتيح ميزة الحالة الديناميكية لإدخال الرأس لتحسين الجودة والأداء. - + Sample Shading تظليل العينة - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. يسمح لمظلل الأجزاء بالتنفيذ لكل عينة في جزء متعدد العينات بدلاً من مرة واحدة لكل جزء. يحسن جودة الرسومات على حساب الأداء. القيم الأعلى تحسن الجودة ولكنها تقلل من الأداء. - + RNG Seed مولد الأرقام العشوائية - + Controls the seed of the random number generator. Mainly used for speedrunning. يتحكم في بذرة مولد الأرقام العشوائية. يُستخدم بشكل رئيسي في سباقات السرعة. - + Device Name اسم الجهاز - + The name of the console. اسم وحدة التحكم. - + Homebrew Args Homebrew وسائط - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). (noglsl -مثل) عند التشغيل Homebrew سطر الأوامر الوسائط المُمررة إلى - + Custom RTC Date: - المخصص RTC تاريخ: + :تاريخ التوقيت الحقيقي المخصص - + This option allows to change the clock of the console. Can be used to manipulate time in games. يتيح لك هذا الخيار تغيير ساعة وحدة التحكم. يمكن استخدامه للتحكم بالوقت في الألعاب. - + The number of seconds from the current unix time عدد الثواني من وقت يونكس الحالي - + Language: - اللغة: + :اللغة - + This option can be overridden when region setting is auto-select يمكن تجاوز هذا الخيار عند تحديد إعداد المنطقة تلقائيًا - + Region: - المنطقة: + :المنطقة - + The region of the console. منطقة وحدة التحكم. - + Time Zone: - المنطقة الزمنية: + :المنطقة الزمنية - + The time zone of the console. المنطقة الزمنية لوحدة التحكم. - + Sound Output Mode: - وضع إخراج الصوت: + :وضع إخراج الصوت - + Console Mode: - وضع وحدة التحكم: + :وضع وحدة التحكم - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1129,1042 +1139,1042 @@ Setting to Handheld can help improve performance for low end systems. يُمكن أن يُساعد الضبط على الوضع المحمول على تحسين أداء الأجهزة منخفضة المواصفات. - + Prompt for user profile on boot المطالبة بملف تعريف المستخدم عند التشغيل - + Useful if multiple people use the same PC. مفيد إذا كان هناك عدة أشخاص يستخدمون نفس الكمبيوتر. - + Pause when not in focus توقف عند عدم التركيز - + Pauses emulation when focusing on other windows. يوقف المحاكاة عند التركيز على نوافذ أخرى. - + Confirm before stopping emulation تأكيد قبل إيقاف المحاكاة - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. يتجاوز المطالبات التي تطلب تأكيد إيقاف المحاكاة. يؤدي تمكينه إلى تجاوز هذه المطالبات والخروج مباشرة من المحاكاة. - + Hide mouse on inactivity إخفاء الماوس عند عدم النشاط - + Hides the mouse after 2.5s of inactivity. يخفي الماوس بعد 2.5 ثانية من عدم النشاط. - + Disable controller applet تعطيل تطبيق التحكم - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. يُعطّل استخدام أداة التحكم في البرامج المُحاكاة قسرًا. عند محاولة أي برنامج فتح أداة التحكم، تُغلق فورًا. - + Check for updates التحقق من توفر التحديثات - + Whether or not to check for updates upon startup. ما إذا كان يجب التحقق من التحديثات عند بدء التشغيل أم لا. - + Enable Gamemode تمكين وضع اللعبة - + Force X11 as Graphics Backend كخلفية رسومات X11 فرض - + Custom frontend الواجهة الأمامية المخصصة - + Real applet تطبيق صغير حقيقي - + Never أبداً - + On Load عند التحميل - + Always دائماً - + CPU وحدة المعالجة المركزية - + GPU وحدة معالجة الرسومات - + CPU Asynchronous وحدة المعالجة المركزية غير المتزامنة - + Uncompressed (Best quality) Uncompressed (أفضل جودة) - + BC1 (Low quality) BC1 (جودة منخفضة) - + BC3 (Medium quality) BC3 (جودة متوسطة) - - + + Auto تلقائي - + 30 FPS 30 إطارًا في الثانية - + 60 FPS 60 إطارًا في الثانية - + 90 FPS 90 إطارًا في الثانية - + 120 FPS 120 إطارًا في الثانية - + Conservative محافظ - + Aggressive عدواني - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null لا شيء - + Fast سريع - - - + + + Accurate دقه - - - + + + Default افتراضي - + Unsafe (fast) غير آمن (سريع) - + Safe (stable) آمن (مستقر) - + Immediate فوري - + Balanced متوازن - + Strict صارم - + Unsafe غير آمن - + Paranoid (disables most optimizations) جنون العظمة (يعطل معظم التحسينات) - + Debugging تصحيح الأخطاء - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed نافذة بلا حدود - + Exclusive Fullscreen شاشة كاملة حصرية - + No Video Output لا يوجد إخراج فيديو - + CPU Video Decoding فك تشفير فيديو وحدة المعالجة المركزية - + GPU Video Decoding (Default) فك تشفير فيديو وحدة معالجة الرسومات (افتراضي) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [تجريبي] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [تجريبي] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [تجريبي] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [تجريبي] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [تجريبي] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution دقة فائقة للألعاب من سنابدراغون - + Snapdragon Game Super Resolution EdgeDir دقة فائقة للألعاب من سنابدراغون EdgeDir - + None لا شيء - + FXAA FXAA - + SMAA SMAA - + Default (16:9) (16:9) افتراضي - + Force 4:3 4:3 فرض - + Force 21:9 21:9 فرض - + Force 16:10 16:10 فرض - + Stretch to Window تمديد إلى النافذة - + Automatic تلقائي - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) اليابانية (日本語) - + American English الإنجليزية الأمريكية - + French (français) الفرنسية (français) - + German (Deutsch) الألمانية (Deutsch) - + Italian (italiano) الإيطالية (Italiano) - + Spanish (español) الإسبانية (español) - + Chinese الصينية - + Korean (한국어) الكورية (한국어) - + Dutch (Nederlands) الهولندية (Nederlands) - + Portuguese (português) البرتغالية (Português) - + Russian (Русский) الروسية (Русский) - + Taiwanese تايواني - + British English - الإنكليزية البريطانية + الإنجليزية البريطانية - + Canadian French الكندية الفرنسية - + Latin American Spanish أمريكا اللاتينية الإسبانية - + Simplified Chinese الصينية المبسطة - + Traditional Chinese (正體中文) الصينية التقليدية (正體中文) - + Brazilian Portuguese (português do Brasil) البرتغالية البرازيلية (português do Brasil) - + Polish (polska) البولندية (polska) - + Thai (แบบไทย) التايلاندية (แบบไทย) - - + + Japan اليابان - + USA الولايات المتحدة الأمريكية - + Europe أوروبا - + Australia أستراليا - + China الصين - + Korea كوريا - + Taiwan تايوان - + Auto (%1) Auto select time zone تلقائي (%1) - + Default (%1) Default time zone افتراضي (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba - Cuba + كوبا - + EET EET - + Egypt - Egypt + مصر - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - - - GMT - GMT - - - - GMT+0 - GMT+0 - - - - GMT-0 - GMT-0 - - GMT0 - GMT0 + GMT + توقيت غرينتش - Greenwich - Greenwich + GMT+0 + توقيت غرينتش +0 - Hongkong - Hongkong + GMT-0 + -0 توقيت غرينتش + GMT0 + 0 توقيت غرينتش + + + + Greenwich + غرينتش + + + + Hongkong + هونغ كونغ + + + HST HST - - - Iceland - Iceland - - - - Iran - Iran - - - - Israel - Israel - - Jamaica - Jamaica + Iceland + أيسلندا + + + + Iran + إيران + Israel + إسرائيل + + + + Jamaica + جامايكا + + + Kwajalein Kwajalein - + Libya - Libya + ليبيا - + MET - MET + توقيت وسط أوروبا - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland - Poland + بولندا - + Portugal - Portugal + البرتغال - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore - Singapore + سنغافورة - + Turkey - Turkey + تركيا - + UCT UCT - + Universal عالمي - + UTC UTC - + W-SU W-SU - + WET - WET + توقيت غرب أوروبا - + Zulu Zulu - + Mono أحادي - + Stereo مجسم - + Surround محيطي - + 4GB DRAM (Default) 4GB DRAM (افتراضي) - + 6GB DRAM (Unsafe) 6GB DRAM (غير آمنة) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (غير آمنة) - + 12GB DRAM (Unsafe) 12GB DRAM (غير آمنة) - + Docked الإرساء - + Handheld محمول - - + + Normal - طبيعي + قياسي - - + + Boost تعزيز - - + + Overclock كسر السرعة - + Always ask (Default) اسأل دائمًا (افتراضي) - + Only if game specifies not to stop فقط إذا حددت اللعبة عدم التوقف - + Never ask لا تسأل أبدا - + Very Small (16 MB) صغير جدًا (16 ميغابايت) - + Small (32 MB) صغير (32 ميغابايت) - + Normal (128 MB) قياسي (128 ميغابايت) - + Large (256 MB) كبير (256 ميغابايت) - + Very Large (512 MB) كبير جدًا (512 ميغابايت) - + Very Low (4 MB) منخفض جدًا (4 ميغابايت) - + Low (8 MB) منخفض (8 ميغابايت) - + Normal (16 MB) قياسي (16 ميغابايت) - + Medium (32 MB) متوسط (32 ميغابايت) - + High (64 MB) عالي (64 ميغابايت) - + Very Low (32) منخفض جدًا (32) - + Low (64) منخفض (64) - + Normal (128) قياسي (128) - + Medium (256) متوسط (256) - + High (512) عالي (512) - + Disabled معطل - + ExtendedDynamicState 1 الحالة الديناميكية الممتدة 1 - + ExtendedDynamicState 2 الحالة الديناميكية الممتدة 2 - + ExtendedDynamicState 3 الحالة الديناميكية الممتدة 3 - + Tree View عرض قائمة - + Grid View عرض شبكة @@ -2334,7 +2344,7 @@ When a program attempts to open the controller applet, it is immediately closed. Enable block linking - تمكين ربط الكتلة + تفعيل ربط الكتلة @@ -2756,7 +2766,7 @@ When a program attempts to open the controller applet, it is immediately closed. Debug Knobs: - أزرار تصحيح الأخطاء: + :أزرار تصحيح الأخطاء @@ -3096,7 +3106,7 @@ When a program attempts to open the controller applet, it is immediately closed. Choose an action for the save data directory: - اختر إجراءً لمجلد بيانات الحفظ: + :اختر إجراءً لمجلد بيانات الحفظ @@ -3264,33 +3274,38 @@ Would you like to delete the old save data? :لون الخلفية - + % FSR/SGSR sharpening percentage (e.g. 50%) % - + + Configure Effects... + إعداد التأثيرات... + + + Off معطل - + VSync Off VSync معطل - + Recommended مستحسن - + On مفعل - + VSync On VSync مفعل @@ -3410,7 +3425,7 @@ Would you like to delete the old save data? [waiting] - [انتظار] + [جارٍ الانتظار] @@ -3789,12 +3804,12 @@ Would you like to delete the old save data? Enable direct JoyCon driver - تمكين برنامج تشغيل جوي كون المباشر + تفعيل برنامج تشغيل جوي كون المباشر Enable direct Pro Controller driver [EXPERIMENTAL] - المباشر [تجريبي] Pro Controller تمكين برنامج تشغيل + المباشر [تجريبي] Pro Controller تفعيل برنامج تشغيل @@ -4327,7 +4342,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< [waiting] - [انتظار] + [جارٍ الانتظار] @@ -4337,7 +4352,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< Enter a profile name: - أدخل اسم ملف التعريف: + :أدخل اسم ملف التعريف @@ -4517,7 +4532,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< Testing - اختبار + جارٍ الاختبار @@ -4917,103 +4932,118 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. + تُطبق التغييرات فورًا أثناء سير اللعبة. - + Enable post-processing تفعيل المعالجة اللاحقة - + Preset: - الإعداد المسبق: + :الإعداد المسبق - + Apply تطبيق - + Reset Values إعادة تعيين القيم - + Return every effect to the values the preset ships with. إعادة كل تأثير إلى القيم التي تأتي بها الإعدادات المسبقة. - + Save As... حفظ باسم... - + Save Preset حفظ الإعداد المسبق - + Preset name: - اسم الإعداد المسبق: + :اسم الإعداد المسبق - - Delete - حذف + + Clear + مسح - + + Remove every effect in use and deselect the preset. + قم بإزالة جميع المؤثرات قيد الاستخدام وإلغاء تحديد الإعداد المسبق. + + + Add Effect إضافة تأثير - + + None + لا شيء + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + لا توجد تأثيرات قيد الاستخدام. اختر إعدادًا مسبقًا واضغط على تطبيق، أو أضف التأثيرات واحدًا تلو الآخر. + + + Custom chain. Pick a preset above and press Apply to replace it. سلسلة مخصصة. اختر إعدادًا مسبقًا أعلاه واضغط على تطبيق لاستبداله. - + Active preset: %1 (modified). Press Reset Values to go back to how it ships. الإعداد المسبق النشط: 1% (معدّل). اضغط على إعادة تعيين القيم للعودة إلى الإعدادات الافتراضية. - + Active preset: %1 الإعداد المسبق النشط: 1% - + Enabled تفعيل - + Disabled تعطيل - + Reset to defaults إعادة التعيين إلى الإعدادات الافتراضية - + Effect '%1' was not found. لم يتم العثور على التأثير '1%'. - + Effect failed to compile: %1 فشل تجميع التأثير: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -5269,7 +5299,7 @@ UUID: %2 [waiting] - [انتظار] + [جارٍ الانتظار]
@@ -5661,7 +5691,7 @@ Drag points to change position, or double-click table cells to edit values. English - الإنجليزية + English @@ -5982,7 +6012,7 @@ Drag points to change position, or double-click table cells to edit values. Connecting - الاتصال + جارٍ الاتصال @@ -7031,7 +7061,7 @@ Debug Message: - + &Pause &إيقاف مؤقت @@ -7182,7 +7212,7 @@ Debug Message: - + &Start &بدء @@ -7193,7 +7223,7 @@ Debug Message: - + R&ecord ت&سجيل @@ -7284,7 +7314,7 @@ Debug Message: - + None لا شيء @@ -7310,400 +7340,405 @@ Debug Message: &عرض دائري - + Small (32x32) صغير (32x32) - + Standard (64x64) قياسي (64x64) - + Large (128x128) كبير (128x128) - + Full Size (256x256) حجم كامل (256x256) - + Broken Vulkan Installation Detected Vulkan تم الكشف عن تلف في تثبيت - + Vulkan initialization failed during boot. أثناء التشغيل Vulkan فشل تهيئة. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping تشغيل لعبة - + Loading Web Applet... جارٍ تحميل تطبيق الويب... - - + + Disable Web Applet تعطيل تطبيق الويب - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) قد يؤدي تعطيل أداة الويب إلى سلوك غير محدد، ويجب استخدامه فقط مع لعبة Super Mario 3D All-Stars. هل أنت متأكد من رغبتك في تعطيل أداة الويب؟ (يمكن إعادة تفعيلها في إعدادات التصحيح.) - + The amount of shaders currently being built كمية التظليلات التي يتم بناؤها حاليًا - + The current selected resolution scaling multiplier. مضاعف قياس الدقة المحددة حالياً. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Switch سرعة المحاكاة الحالية. تشير القيم الأعلى أو الأقل من 100٪ إلى أن المحاكاة تعمل بشكل أسرع أو أبطأ من. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. عدد الإطارات في الثانية التي تعرضها اللعبة حاليًا. يختلف هذا العدد من لعبة إلى أخرى ومن مشهد إلى آخر. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. الوقت المستغرق لمحاكاة إطار على جهاز سويتش، بدون احتساب تحديد الإطارات أو المزامنة العمودية. لمحاكاة بسرعة كاملة، يجب أن يكون هذا في حدود 16.67 مللي ثانية كحد أقصى. - + Unmute إلغاء كتم الصوت - + Mute كتم الصوت - + Reset Volume إعادة تعيين مستوى الصوت - + + Configure Effects... + إعداد التأثيرات... + + + &Clear Recent Files &مسح الملفات الحديثة - + &Continue &متابعة - + Warning: Outdated Game Format تحذير: تنسيق اللعبة قديم - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. أنت تستخدم تنسيق مجلد ROM المُفكك لهذه اللعبة، وهو تنسيق قديم استُبدل بآخر مثل NCA وNAX وXCI وNSP. تفتقر مجلدات ROM المُفككة إلى الأيقونات والبيانات الوصفية ودعم التحديثات. <br>لتوضيح تنسيقات Switch المختلفة التي يدعمها Eden، يُرجى مراجعة دليل المستخدم. لن تظهر هذه الرسالة مرة أخرى. - - + + Error while loading ROM! ROM خطأ أثناء تحميل - + The ROM format is not supported. غير مدعوم ROM تنسيق. - + An error occurred initializing the video core. حدث خطأ أثناء تهيئة نواة الفيديو. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. عادةً ما يحدث هذا بسبب برامج تشغيل بطاقة الرسوميات GPU القديمة. يرجى الاطلاع على ملف السجل لمزيد من التفاصيل. انظر: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'> كيفية الوصول إلى ملفات السجل</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. حدث خطأ أثناء تحميل ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Discord/Stoat يرجى إعادة تحميل ملفاتك أو طلب المساعدة على - + An unknown error occurred. Please see the log for more details. حدث خطأ غير معروف. يرجى الاطلاع على السجل لمزيد من التفاصيل. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... جارٍ إغلاق البرنامج... - + Save Data بيانات الحفظ - + Mod Data بيانات التعديل - + Error Opening %1 Folder خطأ في فتح المجلد %1 - - + + Folder does not exist! المجلد غير موجود! - + Remove Installed Game Contents? إزالة محتويات اللعبة المثبتة؟ - + Remove Installed Game Update? إزالة تحديث اللعبة المثبت؟ - + Remove Installed Game DLC? إزالة المحتوى القابل للتنزيل المثبت للعبة؟ - + Remove Entry إزالة الإدخال - + Delete OpenGL Transferable Shader Cache? OpenGL Shader حذف ذاكرة التخزين المؤقتة القابلة للنقل لـ - + Delete Vulkan Transferable Shader Cache? Vulkan Shader حذف ذاكرة التخزين المؤقتة القابلة للنقل لـ - + Delete All Transferable Shader Caches? حذف جميع مخازن ذاكرة التظليل القابلة للنقل؟ - + Remove Custom Game Configuration? إزالة إعدادات اللعبة المخصص؟ - + Remove Cache Storage? إزالة ذاكرة التخزين المؤقتة؟ - + Remove File إزالة الملف - + Remove Play Time Data إزالة بيانات زمن اللعب - + Reset play time? إعادة تعيين زمن اللعب؟ - - + + RomFS Extraction Failed! RomFS فشل استخراج - + There was an error copying the RomFS files or the user cancelled the operation. أو قام المستخدم بإلغاء العملية RomFS حدث خطأ أثناء نسخ ملفات - + Full كامل - + Skeleton Skeleton - + Select RomFS Dump Mode RomFS حدد وضع تفريغ - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. الرجاء تحديد الطريقة التي تريد بها تفريغ RomFS. <br>سيتم نسخ جميع الملفات إلى المجلد الجديد في أثناء <br>قيام الهيكل العظمي بإنشاء بنية المجلد فقط. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root لا توجد مساحة فارغة كافية في %1 لاستخراج نظام الملفات RomFS. يُرجى تحرير مساحة أو اختيار مجلد تفريغ آخر من: المحاكاة > التكوين > النظام > نظام الملفات > تفريغ الجذر. - + Extracting RomFS... RomFS استخراج... - - + + Cancel إلغاء - + RomFS Extraction Succeeded! بنجاح RomFS تم استخراج! - + The operation completed successfully. تمت العملية بنجاح. - + Error Opening %1 خطأ في فتح %1 - + Select Directory حدد المجلد - + Properties خصائص - + The game properties could not be loaded. تعذر تحميل خصائص اللعبة. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. تشغيل الملف القابل للتنفيذ (%1)؛؛جميع الملفات (*.*) - + Load File تحميل الملف - + Open Extracted ROM Directory المستخرج ROM فتح ملف - + Invalid Directory Selected تم تحديد مجلد غير صالح - + The directory you have selected does not contain a 'main' file. لا يحتوي المجلد الذي حددته على ملف رئيسي - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files تثبيت الملفات - + %n file(s) remaining %n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية - + Installing file "%1"... تثبيت الملف ”%1“... - - + + Install Results نتائج التثبيت - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. لتجنب أي تعارضات محتملة، ننصح المستخدمين بعدم تثبيت الألعاب الأساسية على الذاكرة الداخلية. يرجى استخدام هذه الميزة فقط لتثبيت التحديثات والمحتوى القابل للتنزيل. - + %n file(s) were newly installed %n تم تثبيت ملف (ملفات) جديدة @@ -7715,7 +7750,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten %n تم استبدال ملف (ملفات) @@ -7727,7 +7762,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install %n فشل تثبيت ملف (ملفات) @@ -7739,314 +7774,324 @@ Please, only use this feature to install updates and DLC. - + System Application تطبيق النظام - + System Archive أرشيف النظام - + System Application Update تحديث تطبيق النظام - + Firmware Package (Type A) حزمة الفيرموير (النوع أ) - + Firmware Package (Type B) حزمة الفيرموير (النوع ب) - + Game لعبة - + Game Update تحديث اللعبة - + Game DLC الخاص باللعبة DLC الـ - + Delta Title Delta عنوان - + Select NCA Install Type... NCA حدد نوع تثبيت... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) يرجى تحديد نوع اللعبة التي ترغب في تثبيت NCA عليها: (في معظم الحالات، يكون الإعداد الافتراضي "لعبة" مناسبًا.) - + Failed to Install فشل التثبيت - + The title type you selected for the NCA is invalid. غير صالح NCA نوع العنوان الذي حددته لـ. - + File not found لم يتم العثور على الملف - + File "%1" not found لم يتم العثور على الملف "%1" - + OK موافق - + Function Disabled الوظيفة معطلة - + Compatibility list reporting is currently disabled. Check back later! تقارير قائمة التوافق معطلة حاليًا. يرجى التحقق لاحقًا! - + Error opening URL خطأ في فتح الرابط - + Unable to open the URL "%1". تعذر فتح الرابط ”%1“ - + TAS Recording TAS تسجيل - + Overwrite file of player 1? الكتابة فوق ملف اللاعب 1؟ - + Invalid config detected تم اكتشاف إعدادات غير صالح - + Handheld controller can't be used on docked mode. Pro controller will be selected. لا يمكن استخدام وحدة التحكم المحمولة في وضع الإرساء. سيتم اختيار وحدة تحكم احترافية. - - + + Amiibo أميبو - - + + The current amiibo has been removed تمت إزالة أميبو الحالي. - + Error خطأ - - + + The current game is not looking for amiibos اللعبة الحالية لا تبحث عن أميبو - + Amiibo File (%1);; All Files (*.*) جميع الملفات (%1)؛؛ ملف أميبو (*.*) - + Load Amiibo تحميل أميبو - + Error loading Amiibo data خطأ أثناء تحميل بيانات أميبو - + The selected file is not a valid amiibo الملف المحدد ليس أميبو صالح - + The selected file is already on use الملف المحدد قيد الاستخدام بالفعل - + An unknown error occurred حدث خطأ غير معروف - + No firmware available لا يوجد فيرموير متوفر - + Firmware Corrupted الفيرموير تالف - + Unknown applet تطبيق غير معروف - + Applet doesn't map to a known value. لا يرتبط التطبيق المصغر بقيمة معروفة. - + Record not found لم يتم العثور على السجل - + Applet not found. Please reinstall firmware. لم يتم العثور على التطبيق المصغر. يرجى إعادة تثبيت الفيرموير. - + Capture Screenshot التقاط لقطة شاشة - + PNG Image (*.png) PNG Image (*.png) - + TAS state: Running %1/%2 حالة TAS: تشغيل %1/%2 - + TAS state: Recording %1 حالة TAS: تسجيل %1 - + TAS state: Idle %1/%2 حالة TAS: خامل %1/%2 - + TAS State: Invalid حالة TAS: غير صالحة - + &Stop Running &إيقاف التشغيل - + Stop R&ecording إيقاف ال&تسجيل - + Building: %n shader(s) بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات) - + Scale: %1x %1 is the resolution scaling factor الدقة: %1x - + Speed: %1% / %2% السرعة: %1% / %2% - + Speed: %1% السرعة: %1% - + Game: %1 FPS اللعبة: %1 FPS - + Frame: %1 ms الإطار: %1 ms - + NO AA NO AA - + + NO FX + NO FX + + + + FX + FX + + + VOLUME: MUTE الصوت: كتم الصوت - + VOLUME: %1% Volume percentage (e.g. 50%) %1% :الصوت - + Derivation Components Missing مكونات الاشتقاق مفقودة - + Decryption keys are missing. Install them now? مفاتيح فك التشفير مفقودة. هل تريد تثبيتها الآن؟ - + Wayland Detected! Wayland تم الكشف عن - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8057,74 +8102,74 @@ Would you like to force it for future launches? هل ترغب في فرض استخدامه في عمليات التشغيل المستقبلية؟ - + Use X11 X11 استخدم - + Continue with Wayland Wayland متابعة مع - + Don't show again لا تعرض مرة أخرى - + Restart Required إعادة التشغيل مطلوبة - + Restart Eden to apply the X11 backend. X11 أعد تشغيل إيدن لتطبيق الخلفية - + Slow بطيء - + Turbo تيربو - + Unlocked إلغاء القفل - + Select RomFS Dump Target RomFS حدد هدف تفريغ - + Please select which RomFS you would like to dump. الذي تريد تفريغه RomFS الرجاء تحديد - + Are you sure you want to close Eden? هل أنت متأكد من أنك تريد إغلاق إيدن؟ - - - + + + Eden إيدن - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. هل أنت متأكد من أنك تريد إيقاف المحاكاة؟ سيتم فقدان أي تقدم لم يتم حفظه. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9249,7 +9294,7 @@ p, li { white-space: pre-wrap; } Creation Date - تاريخ الانشاء + تاريخ الإنشاء @@ -9294,7 +9339,7 @@ p, li { white-space: pre-wrap; } No game data present - لا توجد بيانات للعبة + لا توجد بيانات اللعبة @@ -9309,7 +9354,7 @@ p, li { white-space: pre-wrap; } Set nickname and owner: - تعيين الاسم المستعار والمالك + :تعيين الاسم المستعار والمالك @@ -9364,7 +9409,7 @@ p, li { white-space: pre-wrap; } Verification failed for the following files: %1 - فشل التحقق من الملفات التالية: + :فشل التحقق من الملفات التالية %1 @@ -9629,7 +9674,7 @@ OS reported error: %1 %1 To: %2 - تعذر ربط المجلد: + :تعذر ربط المجلد %1 To: %2 @@ -10528,7 +10573,7 @@ Please try again or contact the developer of the software. Select a user: - حدد مستخدمًا: + :حدد مستخدمًا diff --git a/dist/languages/ca.ts b/dist/languages/ca.ts index 6b9f560f4a..df14f1d565 100644 --- a/dist/languages/ca.ts +++ b/dist/languages/ca.ts @@ -569,70 +569,80 @@ FXAA can produce a more stable picture in lower resolutions. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Mode pantalla completa: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Relació d'aspecte: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Emulació NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -641,55 +651,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: Mode de sincronització vertical: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -697,79 +707,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: Filtrat anisotròpic: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: Mode de la GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Precisió DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -779,1327 +789,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Llavor de GNA - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Nom del dispositiu - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Idioma: - + This option can be overridden when region setting is auto-select - + Region: Regió: - + The region of the console. - + Time Zone: Zona horària: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: Mode de la consola - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ocultar el cursor del ratolí en cas d'inactivitat - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Activa el mode joc - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never Mai - + On Load - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservador - + Aggressive Agressiu - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Ensamblat d'ombrejadors, només NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, només AMD/Mesa) - + Null Nul - + Fast Ràpid - - - + + + Accurate Precís - - - + + + Default Valor predeterminat - + Unsafe (fast) Insegur (ràpid) - + Safe (stable) Segur (estable) - + Immediate - + Balanced Equilibrat - + Strict - + Unsafe Insegur - + Paranoid (disables most optimizations) Paranoic (desactiva la majoria d'optimitzacions) - + Debugging Depuració - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Finestra sense vores - + Exclusive Fullscreen Pantalla completa exclusiva - + No Video Output Sense sortida de vídeo - + CPU Video Decoding Descodificació de vídeo a la CPU - + GPU Video Decoding (Default) Descodificació de vídeo a la GPU (Valor predeterminat) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Veí més proper - + Bilinear Bilineal - + Bicubic Bicúbic - + Gaussian Gaussià - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution Super resolució AMD FidelityFX - + Area Àrea - + MMPX MMPX - + Zero-Tangent Tangència zero - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Cap - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Valor predeterminat (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 - + Stretch to Window Estirar a la finestra - + Automatic Automàtic - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonès (日本語) - + American English Anglès americà - + French (français) Francès (français) - + German (Deutsch) Alemany (Deutsch) - + Italian (italiano) Italià (italiano) - + Spanish (español) Castellà (español) - + Chinese Xinès - + Korean (한국어) Coreà (한국어) - + Dutch (Nederlands) Holandès (Nederlands) - + Portuguese (português) Portuguès (português) - + Russian (Русский) Rus (Русский) - + Taiwanese Taiwanès - + British English Anglès britànic - + Canadian French Francès canadenc - + Latin American Spanish Espanyol llatinoamericà - + Simplified Chinese Xinès simplificat - + Traditional Chinese (正體中文) Xinès tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portuguès brasiler (português do Brasil) - + Polish (polska) Polonès (polska) - + Thai (แบบไทย) Tailandès (แบบไทย) - - + + Japan Japó - + USA EUA - + Europe Europa - + Australia Austràlia - + China Xina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Per defecte (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islàndia - + Iran Iran - + Israel Isreal - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polònia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estèreo - + Surround Envoltant - + 4GB DRAM (Default) 4GB DRAM (Insegur) - + 6GB DRAM (Unsafe) 6GB DRAM (Insegur) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Insegur) - + 12GB DRAM (Unsafe) 12GB DRAM (Insegur) - + Docked Sobretaula - + Handheld Portàtil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop Tan sols si el joc especifica no parar - + Never ask No preguntar mai - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3198,33 +3208,38 @@ Would you like to delete the old save data? Color de fons: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off Apagat - + VSync Off Vsync Apagat - + Recommended Recomanat - + On Encés - + VSync On VSync Encés @@ -4845,102 +4860,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6955,7 +6985,7 @@ Debug Message: - + &Pause &Pausar @@ -7106,7 +7136,7 @@ Debug Message: - + &Start &Iniciar @@ -7117,7 +7147,7 @@ Debug Message: - + R&ecord E&nregistrar @@ -7208,7 +7238,7 @@ Debug Message: - + None Cap @@ -7234,722 +7264,737 @@ Debug Message: - + Small (32x32) Petit (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Desilenciar - + Mute Silenciar - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full Complet - + Skeleton Esquelet - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel Cancel·lar - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties Propietats - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File Carregar arxiu - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Instal·lar arxius - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game Joc - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK D'acord - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Escala: %1x - + Speed: %1% / %2% Velocitat: %1% / %2% - + Speed: %1% Velocitat: %1% - + Game: %1 FPS Joc: %1 FPS - + Frame: %1 ms Fotograma: %1 ms - + NO AA SENSE AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUMEN: %1% - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7957,74 +8002,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow Lent - + Turbo Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/cs.ts b/dist/languages/cs.ts index 875ade6480..3f2a2cffd9 100644 --- a/dist/languages/cs.ts +++ b/dist/languages/cs.ts @@ -569,70 +569,80 @@ FXAA can produce a more stable picture in lower resolutions. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Režim celé obrazovky: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Poměr stran: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -641,55 +651,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -697,79 +707,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: Anizotropní filtrování: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -779,1327 +789,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Název Zařízení - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Jazyk: - + This option can be overridden when region setting is auto-select - + Region: Region: - + The region of the console. - + Time Zone: Časové Pásmo: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Potvrzení před zastavením emulace - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Skrýt myš při neaktivitě - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Automatické - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Přesné - - - + + + Default Výchozí - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Nebezpečné - + Paranoid (disables most optimizations) Paranoidní (zakáže většinu optimizací) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Okno bez okrajů - + Exclusive Fullscreen Exkluzivní - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - + Bilinear Bilineární - + Bicubic - + Gaussian - + Lanczos - + ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Žádné - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Výchozí (16:9) - + Force 4:3 Vynutit 4:3 - + Force 21:9 Vynutit 21:9 - + Force 16:10 - + Stretch to Window Roztáhnout podle okna - + Automatic - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonština (日本語) - + American English - + French (français) Francouzština (français) - + German (Deutsch) Nemčina (Deutsch) - + Italian (italiano) Italština (Italiano) - + Spanish (español) Španělština (español) - + Chinese Čínština - + Korean (한국어) Korejština (한국어) - + Dutch (Nederlands) Holandština (Nederlands) - + Portuguese (português) Portugalština (português) - + Russian (Русский) Ruština (Русский) - + Taiwanese Tajwanština - + British English Britská Angličtina - + Canadian French Kanadská Francouzština - + Latin American Spanish Latinsko Americká Španělština - + Simplified Chinese Zjednodušená Čínština - + Traditional Chinese (正體中文) Tradiční Čínština (正體中文) - + Brazilian Portuguese (português do Brasil) Brazilská Portugalština (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonsko - + USA USA - + Europe Evropa - + Australia Austrálie - + China Čína - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Lybie - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polsko - + Portugal Portugalsko - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turecko - + UCT UCT - + Universal Univerzální - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Zadokovaná - + Handheld Příruční - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Vždy se zeptat (Výchozí) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3190,33 +3200,38 @@ Would you like to delete the old save data? Barva Pozadí: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off - + VSync Off - + Recommended - + On - + VSync On @@ -4837,102 +4852,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6945,7 +6975,7 @@ Debug Message: - + &Pause &Pauza @@ -7096,7 +7126,7 @@ Debug Message: - + &Start &Start @@ -7107,7 +7137,7 @@ Debug Message: - + R&ecord @@ -7198,7 +7228,7 @@ Debug Message: - + None @@ -7224,722 +7254,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7947,74 +7992,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/da.ts b/dist/languages/da.ts index 32ebbea332..d4dbe2fa31 100644 --- a/dist/languages/da.ts +++ b/dist/languages/da.ts @@ -571,70 +571,80 @@ FXAA can produce a more stable picture in lower resolutions. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Fuldskærmstilstand: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Skærmformat: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC-emulering: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +653,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -699,79 +709,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: Anisotropisk Filtrering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -781,1327 +791,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG-Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Region - + The region of the console. - + Time Zone: Tidszone - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Skjul mus ved inaktivitet - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Automatisk - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Nøjagtig - - - + + + Default Standard - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Usikker - + Paranoid (disables most optimizations) Paranoid (deaktiverer de fleste optimeringer) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Uindrammet Vindue - + Exclusive Fullscreen Eksklusiv Fuld Skærm - + No Video Output Ingen Video-Output - + CPU Video Decoding CPU-Video Afkodning - + GPU Video Decoding (Default) GPU-Video Afkodning (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75X (540p/810p) [EKSPERIMENTEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor Nærmeste Nabo - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gausisk - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tving 4:3 - + Force 21:9 Tving 21:9 - + Force 16:10 - + Stretch to Window Stræk til Vindue - + Automatic - + 2x - + 4x - + 8x - + 16x - + Japanese (日本語) Japansk (日本語) - + American English - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Hollandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwanesisk - + British English Britisk Engelsk - + Canadian French Candadisk Fransk - + Latin American Spanish Latinamerikansk Spansk - + Simplified Chinese Forenklet Kinesisk - + Traditional Chinese (正體中文) Traditionelt Kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliansk Portugisisk (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ægypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Tyrkiet - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokket - + Handheld Håndholdt - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3198,33 +3208,38 @@ Would you like to delete the old save data? Baggrundsfarve: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off - + VSync Off - + Recommended - + On - + VSync On @@ -4845,102 +4860,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6953,7 +6983,7 @@ Debug Message: - + &Pause @@ -7104,7 +7134,7 @@ Debug Message: - + &Start @@ -7115,7 +7145,7 @@ Debug Message: - + R&ecord @@ -7206,7 +7236,7 @@ Debug Message: - + None @@ -7232,722 +7262,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7955,74 +8000,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/de.ts b/dist/languages/de.ts index ee57558cee..0c142d2709 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -591,12 +591,22 @@ SMAA bietet die beste Bildqualität. FXAA liefert bei niedrigeren Auflösungen ein stabileres Bild. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Vollbild-Modus: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -605,12 +615,12 @@ Der randlose Modus bietet die beste Kompatibilität mit der Bildschirmtastatur, Der exklusive Vollbildmodus bietet möglicherweise eine bessere Leistung und eine bessere Freesync-/G-Sync-Unterstützung. - + Aspect Ratio: Seitenverhältnis: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -619,36 +629,36 @@ Die meisten Spiele unterstützen nur das Seitenverhältnis 16:9, sodass Anpassun Steuert außerdem das Seitenverhältnis der aufgenommenen Bildschirmfotos. - + Use persistent pipeline cache Persistenten Rohrleitungs-Cache verwenden - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Ermöglicht das Speichern von Shadern, um sie beim nächsten Spielstart schneller laden zu können. Die Deaktivierung ist ausschließlich für Fehlerbehebungszwecke vorgesehen. - + Use asynchronous GPU emulation Asynchrone GPU-Emulation verwenden - + Uses an extra CPU thread for rendering. This option should always remain enabled. Verwendet einen zusätzlichen CPU-Thread für das Rendern. Diese Option sollte immer aktiviert bleiben. - + NVDEC emulation: NVDEC-Emulation: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -657,12 +667,12 @@ Dabei kann entweder die CPU oder die GPU für die Dekodierung verwendet werden, In den meisten Fällen bietet die GPU-Dekodierung die beste Leistung. - + ASTC Decoding Method: ASTC-Dekodier-Methode: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -675,12 +685,12 @@ CPU asynchron: Die Dekodierung von ASTC-Texturen erfolgt bei Bedarf über die CP kann jedoch zu Artefakten führen. - + ASTC Recompression Method: ASTC-Rekompression-Methode: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -689,44 +699,44 @@ BC1/BC3: Das Zwischenformat wird wieder in das BC1- oder BC3-Format komprimiert, was VRAM spart, jedoch zu Einbußen bei der Bildqualität führt. - + Frame Pacing Mode (Vulkan only) Frame-Pacing-Modus (nur Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. Steuert, wie der Emulator das Frame-Pacing verwaltet, um Ruckeln zu reduzieren und die Bildrate flüssiger und gleichmäßiger zu gestalten. - + VRAM Usage Mode: VRAM-Nutzungs Modus: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Legt fest, ob der Emulator vorrangig Speicherplatz sparen oder den verfügbaren Grafikspeicher zur Leistungsoptimierung maximal ausnutzen soll. Der aggressive Modus kann die Leistung anderer Anwendungen, wie z. B. Aufnahmesoftware, beeinträchtigen. - + Skip CPU Inner Invalidation CPU-interne Invalidierung überspringen - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Überspringt bestimmte Cache-Invalidierungen auf CPU-Seite während Speicherupdates, reduziert die CPU-Auslastung und verbessert die Leistung. Dies verursacht vielleicht Abstürze. - + VSync Mode: VSync-Modus: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -737,12 +747,12 @@ Postkasten kann eine geringere Latenz als FIFO aufweisen und verursacht kein Tea Sofort (ohne Synchronisation) zeigt alles an, was verfügbar ist, und kann Tearing verursachen. - + Sync Memory Operations Speicheroperationen synchronisieren - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -751,44 +761,44 @@ Diese Option behebt Probleme in Spielen, kann jedoch zu Leistungseinbußen führ Bei Spielen mit Unreal Engine 4 sind die Auswirkungen oft am deutlichsten spürbar. - + Enable asynchronous presentation (Vulkan only) Aktiviere asynchrone Präsentation (Nur Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Verbessert die Leistung geringfügig, indem die Darstellung auf einen separaten CPU-Thread verlagert wird. - + Force maximum clocks (Vulkan only) Erzwinge Maximale Taktrate (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Lässt im Hintergrund die GPU Aufgaben erledigen während diese auf Grafikbefehle wartet, damit diese nicht herunter taktet. - + Anisotropic Filtering: Anisotrope Filterung: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Steuert die Qualität der Texturwiedergabe bei schrägen Blickwinkeln. Bei den meisten Grafikkarten kann dieser Wert bedenkenlos auf 16x eingestellt werden. - + GPU Mode: GPU-Modus: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -797,12 +807,12 @@ Die meisten Spiele werden im Modus Schnell in Ordnung gerendert, für einige ist Partikel werden in der Regel nur im Modus Akkurat korrekt gerendert. - + DMA Accuracy: DMA-Genauigkeit: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -811,12 +821,12 @@ Unsicher ist schneller, während Sicher stabiler ist und in manchen Spielen Prob Standard folgt der GPU-Genauigkeit Einstellung. - + GPU Fence Behavior: GPU-Zaunobjekt-Verhalten: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -831,56 +841,56 @@ Strikt ist die langsamste Option, kann aber Probleme beheben, die striktere Sync Standard folgt der GPU-Genauigkeit Einstellung. - + Enable GPU buffer readback GPU-Puffer-Rücklesung aktivieren - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. Bewahrt von der GPU modifizierte Pufferdaten, indem diese vor dem Hochladen zurückgelesen werden. Einige Spiele benötigen dies, um bestimmte Effekte korrekt darzustellen. - + Enable asynchronous shader compilation Aktiviere asynchrones Shader-Kompilieren - + May reduce shader stutter. Kann Shader-Ruckler reduzieren. - + GPU Clocks GPU-Takte - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. Führt dazu, dass das Spiel glaubt, die Arbeit der GPU würde früher fertig sein, als sie eigentlich ist. Dadurch hört das Spiel auf die Auflösung und Render-Distanz zu verringern um sich den Takten der Switch anzupassen. - + GPU Unswizzle GPU-Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Beschleunigt die Dekodierung von BCn-3D-Texturen mithilfe von GPU-Rechenleistung. Deaktiviere diese Option, falls Abstürze oder Grafikfehler auftreten. - + GPU Unswizzle Max Texture Size GPU-Unswizzle max. Texturgröße - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -889,48 +899,48 @@ Während die GPU für mittelgroße und große Texturen schneller ist, kann die C Passen Sie diesen Wert an, um das Gleichgewicht zwischen GPU-Beschleunigung und CPU-Overhead zu finden. - + GPU Unswizzle Stream Size GPU-Unswizzle-Streamgröße - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Legt die maximale Menge an Texturdaten (in MiB) fest, die pro Bild verarbeitet wird. Höhere Werte können Ruckeln beim Laden von Texturen verringern, können sich jedoch auf die Bildrate auswirken. - + GPU Unswizzle Chunk Size GPU-Unswizzle Chunk-Größe - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Legt die Anzahl der Tiefenschnitte fest, die in einem einzelnen Durchlauf verarbeitet werden. Eine Erhöhung dieses Werts kann den Durchsatz auf High-End-GPUs verbessern, bei schwächerer Hardware jedoch zu TDR- oder Treiber-Auszeiten führen. - + Use Vulkan pipeline cache Vulkan-Pipeline-Cache verwenden - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Aktiviert den herstellerspezifischen Pipeline-Cache der GPU. Diese Option kann die Ladezeit von Shadern erheblich verkürzen, wenn der Vulkan-Treiber die Pipeline-Cache-Dateien nicht intern speichert. - + Enable Compute Pipelines (Intel Vulkan Only) Aktiviere Compute-Pipelines (Nur Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -939,194 +949,194 @@ Diese Einstellung ist nur bei proprietären Intel-Treibern vorhanden und kann be Bei allen anderen Treibern sind die Rechen-Rohrleitungen immer aktiviert. - + Enable Reactive Flushing Aktiviere Reactives Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Benutzt Reactive-Flushing anstatt Predictive-Flushing, welches akkurateres Speicher-Synchronisieren erlaubt. - + Sync to framerate of video playback Synchronisiere mit Bildrate von Video-Wiedergaben - + Run the game at normal speed during video playback, even when the framerate is unlocked. Lasse das Spiel in der normalen Geschwindigkeit abspielen, trotz freigeschalteter Bildrate - + Barrier feedback loops Barrier-Feedback-Schleifen - + Improves rendering of transparency effects in specific games. Verbessert das Rendering von Transparenzeffekten in bestimmten Spielen. - + Enable buffer history Puffer-Verlauf aktivieren - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Ermöglicht den Zugriff auf frühere Pufferzustände. Diese Option kann in manchen Spielen die Darstellungsqualität und die Leistungsstabilität verbessern. - + Fix bloom effects Bloom-Effekte beheben - + Removes bloom in Burnout. Entfernt Bloom in Burnout. - + Enable Legacy Rescale Pass „Legacy Rescale Pass“ aktivieren - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Behebt möglicherweise Probleme mit der Skalierung in einigen Spielen, indem auf das Verhalten der vorherigen Implementierung zurückgegriffen wird. Eine Umgehungslösung für das alte Verhalten, die Linienartefakte auf AMD- und Intel-GPUs sowie graues Texturflackern auf Nvidia-GPUs in „Luigi’s Mansion 3“ behebt. - + Extended Dynamic State Erweiterter dynamischer Zustand - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Legt die Anzahl der Funktionen fest, die im erweiterten dynamischen Modus verwendet werden können. Höhere Stufen ermöglichen mehr Funktionen und können die Leistung steigern, können jedoch zusätzliche grafische Probleme verursachen. - + Vertex Input Dynamic State Dynamischer Zustand der Scheitelpunkteingabe - + Enables vertex input dynamic state feature for better quality and performance. Aktiviert die Funktion für den dynamischen Status der Scheitelpunkteingabe, um eine bessere Qualität und Leistung zu erzielen. - + Sample Shading Probe-Schattierung - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Ermöglicht es dem Fragment-Shader, pro Abtastwert in einem mehrfach abgetasteten Fragment ausgeführt zu werden, anstatt nur einmal pro Fragment. Verbessert die Grafikqualität auf Kosten der Leistung. Höhere Werte verbessern die Qualität, beeinträchtigen jedoch die Leistung. - + RNG Seed Startwert für den Zufallszahlengenerator - + Controls the seed of the random number generator. Mainly used for speedrunning. Steuert den Startwert des Zufallszahlengenerators. Wird hauptsächlich für Schnelldurchläufe verwendet. - + Device Name Gerätename - + The name of the console. Der Name der Konsole. - + Homebrew Args Homebrew-Argumente - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Befehlszeilenargumente, die beim Start an Homebrew übergeben werden (z. B. -noglsl). - + Custom RTC Date: Benutzerdefinierte Echtzeituhrdatum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Diese Option erlaubt die Änderung der Uhr der Konsole. Kann benutzt werden um Zeit in Spielen zu manipulieren. - + The number of seconds from the current unix time Die Anzahl der Sekunden seit dem aktuellen Unix-Zeitstempel - + Language: Sprache: - + This option can be overridden when region setting is auto-select Diese Option kann überschrieben werden, wenn die Regionseinstellung auf „Automatische Auswahl“ steht - + Region: Region: - + The region of the console. Die Region der Konsole. - + Time Zone: Zeitzone: - + The time zone of the console. Die Zeitzone der Konsole. - + Sound Output Mode: Tonausgangsmodus: - + Console Mode: Konsolenmodus: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1135,1042 +1145,1042 @@ Je nach dieser Einstellung ändern sich bei Spielen die Auflösung, die Detailst Die Einstellung auf „Handgerät“ kann dazu beitragen, die Leistung auf Systemen mit geringerer Leistung zu verbessern. - + Prompt for user profile on boot Beim Systemstart nach dem Benutzerprofil fragen - + Useful if multiple people use the same PC. Nützlich, wenn mehrere Personen denselben PC nutzen. - + Pause when not in focus Pausieren, wenn nicht im Fokus - + Pauses emulation when focusing on other windows. Pausiert die Emulation, wenn der Fokus auf andere Fenster wechselt. - + Confirm before stopping emulation Vor dem Stoppen der Emulation bestätigen - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Überschreibt die Abfragen zur Bestätigung des Beendens der Emulation. Wenn diese Option aktiviert ist, werden solche Abfragen umgangen und die Emulation wird direkt beendet. - + Hide mouse on inactivity Mauszeiger verbergen - + Hides the mouse after 2.5s of inactivity. Verbirgt den Mauszeiger nach 2,5 Sekunden Inaktivität. - + Disable controller applet Controller-Applet deaktivieren - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Deaktiviert die Verwendung des Controller-Applets in emulierten Programmen zwangsweise. Wenn ein Programm versucht, das Controller-Applet zu öffnen, wird es sofort geschlossen. - + Check for updates Auf Aktualisierungen überprüfen - + Whether or not to check for updates upon startup. Ob nach Aktualisierungen während des Startens gesucht werden soll. - + Enable Gamemode Spielmodus aktivieren - + Force X11 as Graphics Backend X11 als Grafik-Backend erzwingen - + Custom frontend Benutzerdefiniertes Frontend - + Real applet Echtes Applet - + Never Niemals - + On Load Beim Laden - + Always Immer - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asynchron - + Uncompressed (Best quality) Unkomprimiert (Beste Qualität) - + BC1 (Low quality) BC1 (Niedrige Qualität) - + BC3 (Medium quality) BC3 (Mittlere Qualität) - - + + Auto Auto - + 30 FPS 30 BpS - + 60 FPS 60 BpS - + 90 FPS 90 BpS - + 120 FPS 120 BpS - + Conservative Konservativ - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembler-Shader, nur NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (experimentell, nur AMD/Mesa) - + Null Null - + Fast Schnell - - - + + + Accurate Akkurat - - - + + + Default Vorgabe - + Unsafe (fast) Unsicher (schnell) - + Safe (stable) Sicher (stabil) - + Immediate Direkt - + Balanced Ausgeglichen - + Strict Strikt - + Unsafe Unsicher - + Paranoid (disables most optimizations) Paranoid (deaktiviert die meisten Optimierungen) - + Debugging Fehlerbehebung - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Rahmenloses Fenster - + Exclusive Fullscreen Exklusiver Vollbildmodus - + No Video Output Keine Videoausgabe - + CPU Video Decoding CPU Video Dekodierung - + GPU Video Decoding (Default) GPU Video Dekodierung (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5X (360p/540p) [EXPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75X (540p/810p) [EXPERIMENTELL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1,5X (1080p/1620p) [EXPERIMENTELL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest-Neighbor - + Bilinear Bilinear - + Bicubic Bikubisch - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super-Auflösung - + Area Bereich - + MMPX MMPX - + Zero-Tangent Nulltangente - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Spiel-Superauflösung - + Snapdragon Game Super Resolution EdgeDir Snapdragon Spiel-Superauflösung EdgeDir - + None Keiner - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Vorgabe (16:9) - + Force 4:3 4:3 erzwingen - + Force 21:9 21:9 erzwingen - + Force 16:10 16:10 erzwingen - + Stretch to Window Auf Fenster anpassen - + Automatic Automatisch - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japanisch (日本語) - + American English Amerikanisches Englisch - + French (français) Französisch (français) - + German (Deutsch) Deutsch (German) - + Italian (italiano) Italienisch (italiano) - + Spanish (español) Spanisch (español) - + Chinese Chinesisch - + Korean (한국어) Koreanisch (한국어) - + Dutch (Nederlands) Niederländisch (Nederlands) - + Portuguese (português) Portugiesisch (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanesisch - + British English Britisches Englisch - + Canadian French Kanadisches Französisch - + Latin American Spanish Lateinamerikanisches Spanisch - + Simplified Chinese Vereinfachtes Chinesisch - + Traditional Chinese (正體中文) Traditionelles Chinesisch (正體中文) - + Brazilian Portuguese (português do Brasil) Brasilianisches Portugiesisch (português do Brasil) - + Polish (polska) Polnisch (Polen) - + Thai (แบบไทย) Thailändisch (Thailändische Version) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatisch (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Ägypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkei - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Vorgabe) - + 6GB DRAM (Unsafe) 6GB DRAM (Unsicher) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Unsicher) - + 12GB DRAM (Unsafe) 12GB DRAM (Unsicher) - + Docked Angedockt - + Handheld Handgerät - - + + Normal Normal - - + + Boost Beschleunigung - - + + Overclock Übertaktung - + Always ask (Default) Immer fragen (Vorgabe) - + Only if game specifies not to stop Nur wenn ein Spiel vorgibt, nicht zu stoppen - + Never ask Niemals fragen - + Very Small (16 MB) Sehr klein (16 MB) - + Small (32 MB) Klein (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Groß (256 MB) - + Very Large (512 MB) Sehr groß (512 MB) - + Very Low (4 MB) Sehr niedrig (4 MB) - + Low (8 MB) Niedrig (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Mittel (32 MB) - + High (64 MB) Hoch (64 MB) - + Very Low (32) Sehr niedrig (32) - + Low (64) Niedrig (64) - + Normal (128) Normal (128) - + Medium (256) Mittel (256) - + High (512) Hoch (512) - + Disabled Deaktiviert - + ExtendedDynamicState 1 ErweiterterDynamischerZustand 1 - + ExtendedDynamicState 2 ErweiterterDynamischerZustand 2 - + ExtendedDynamicState 3 ErweiterterDynamischerZustand 3 - + Tree View Baumansicht - + Grid View Rasteransicht @@ -3282,33 +3292,38 @@ Möchtest du die alten Speicherdaten löschen? Hintergrundfarbe: - + % FSR/SGSR sharpening percentage (e.g. 50%) % - + + Configure Effects... + + + + Off Aus - + VSync Off Vsync Aus - + Recommended Empfohlen - + On An - + VSync On Vsync An @@ -4935,102 +4950,117 @@ Einmal gelöscht, können diese nicht wiederhergestellt werden. Bist du dir zu 1 - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -7047,7 +7077,7 @@ Fehlerbehebungs-Meldung: - + &Pause &Pause @@ -7198,7 +7228,7 @@ Fehlerbehebungs-Meldung: - + &Start &Start @@ -7209,7 +7239,7 @@ Fehlerbehebungs-Meldung: - + R&ecord Aufnahme @@ -7300,7 +7330,7 @@ Fehlerbehebungs-Meldung: - + None Keine @@ -7326,400 +7356,405 @@ Fehlerbehebungs-Meldung: &Karussellansicht - + Small (32x32) Klein (32x32) - + Standard (64x64) Standard (64x64) - + Large (128x128) Groß (128x128) - + Full Size (256x256) Volle Größe (256x256) - + Broken Vulkan Installation Detected Defekte Vulkan-Installation erkannt - + Vulkan initialization failed during boot. Initialisierung von Vulkan ist beim Systemstart fehlgeschlagen. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Spiel wird ausgeführt - + Loading Web Applet... Web-Applet wird geladen... - - + + Disable Web Applet Web-Applet deaktivieren - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Das Deaktivieren des Web-Applets kann zu unvorhersehbarem Verhalten führen und sollte nur bei „Super Mario 3D All-Stars“ verwendet werden. Möchtest du das Web-Applet wirklich deaktivieren? (Dies kann in den Fehlerbehebungs-Einstellungen wieder aktiviert werden.) - + The amount of shaders currently being built Die Anzahl der Shader, die derzeit erstellt werden - + The current selected resolution scaling multiplier. Der aktuell ausgewählte Skalierungsfaktor für die Auflösung. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Aktuelle Emulationsgeschwindigkeit. Werte über oder unter 100 % bedeuten, dass die Emulation schneller oder langsamer läuft als auf einer Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Wie viele Bilder pro Sekunde das Spiel derzeit anzeigt. Dies variiert von Spiel zu Spiel und von Szene zu Szene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Die Zeit, die für die Emulation eines Switch-Frames benötigt wird, ohne Berücksichtigung von Framelimiting oder V-Sync. Bei einer Emulation mit voller Geschwindigkeit sollte dieser Wert höchstens 16,67 ms betragen. - + Unmute Stummschaltung aufheben - + Mute Stummschalten - + Reset Volume Lautstärke zurücksetzen - + + Configure Effects... + + + + &Clear Recent Files &Zuletzt verwendete Dateien löschen - + &Continue &Fortfahren - + Warning: Outdated Game Format Warnung: Veraltetes Spielformat - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Du verwendest für dieses Spiel das dekontruierte ROM-Verzeichnisformat - ein veraltetes Format, das durch andere Formate wie NCA, NAX, XCI oder NSP abgelöst wurde. Dekonstruierten ROM-Verzeichnissen fehlen Symbole, Metadaten und die Unterstützung für Aktualisierungen. <br>Eine Erläuterung der verschiedenen Switch-Formate, die Eden unterstützt, findest du in unserem Benutzerhandbuch. Diese Meldung wird nicht erneut angezeigt. - - + + Error while loading ROM! Fehler beim Laden des ROMs! - + The ROM format is not supported. Das ROM-Format wird nicht unterstützt. - + An error occurred initializing the video core. Beim Initialisieren des Videokerns ist ein Fehler aufgetreten. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Fehler beim Laden des ROMs! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Bitte erstelle deine Dateien erneut oder bitte auf Discord/Stoat um Hilfe. - + An unknown error occurred. Please see the log for more details. Es ist ein unbekannter Fehler aufgetreten. Weitere Informationen findest du im Protokoll. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Software wird geschlossen... - + Save Data Speicherdaten - + Mod Data Mod-Daten - + Error Opening %1 Folder Fehler beim Öffnen des Ordners %1 - - + + Folder does not exist! Der Ordner existiert nicht! - + Remove Installed Game Contents? Installierte Spielinhalte entfernen? - + Remove Installed Game Update? Installierte Spielaktualisierung entfernen? - + Remove Installed Game DLC? Installiertes Spiel-DLC entfernen? - + Remove Entry Eintrag entfernen - + Delete OpenGL Transferable Shader Cache? Den übertragbaren Shader-Cache von OpenGL löschen? - + Delete Vulkan Transferable Shader Cache? Den übertragbaren Shader-Cache von Vulkan löschen? - + Delete All Transferable Shader Caches? Alle übertragbaren Shader-Caches löschen? - + Remove Custom Game Configuration? Benutzerdefinierte Spielkonfiguration entfernen? - + Remove Cache Storage? Cache-Speicher löschen? - + Remove File Datei entfernen - + Remove Play Time Data Wiedergabezeitdaten löschen - + Reset play time? Spielzeit zurücksetzen? - - + + RomFS Extraction Failed! RomFS-Extraktion fehlgeschlagen! - + There was an error copying the RomFS files or the user cancelled the operation. Beim Kopieren der RomFS-Dateien ist ein Fehler aufgetreten oder der Benutzer hat den Vorgang abgebrochen. - + Full Vollständig - + Skeleton Skelett - + Select RomFS Dump Mode RomFS-Auslesemodus auswählen - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Bitte wähle aus, wie das RomFS kopiert werden soll. <br>Vollständig kopiert alle Dateien in das neue Verzeichnis, während <br>Skelett lediglich die Verzeichnisstruktur erstellt. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Unter %1 ist nicht genügend Speicherplatz vorhanden, um das RomFS zu extrahieren. Bitte schaffe Speicherplatz oder wähle unter „Emulation > Konfigurieren > System > Dateisystem > Dump-Stammverzeichnis“ ein anderes Dump-Verzeichnis aus. - + Extracting RomFS... RomFS wird extrahiert... - - + + Cancel Abbrechen - + RomFS Extraction Succeeded! RomFS wurde erfolgreich extrahiert! - + The operation completed successfully. Der Vorgang wurde erfolgreich abgeschlossen. - + Error Opening %1 Fehler beim Öffnen von %1 - + Select Directory Verzeichnis auswählen - + Properties Eigenschaften - + The game properties could not be loaded. Die Spieleigenschaften konnten nicht geladen werden. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch-Ausführungsdatei (%1);;Alle Dateien (*.*) - + Load File Datei laden - + Open Extracted ROM Directory Verzeichnis mit dem extrahierten ROM öffnen - + Invalid Directory Selected Ungültiges Verzeichnis ausgewählt - + The directory you have selected does not contain a 'main' file. Das von dir ausgewählte Verzeichnis enthält keine „main“-Datei. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installierbare Switch-Dateien (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX-Kassetten-Image (*.xci) - + Install Files Dateien installieren - + %n file(s) remaining %n Datei(en) verbleiben%n Datei(en) verbleiben - + Installing file "%1"... Datei „%1“ wird installiert... - - + + Install Results Installationsergebnisse - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Um mögliche Konflikte zu vermeiden, raten wir davon ab, Basisspiele auf dem NAND-Speicher zu installieren. Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen und DLCs. - + %n file(s) were newly installed %n Datei(en) wurden neu installiert @@ -7727,7 +7762,7 @@ Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen - + %n file(s) were overwritten %n Datei(en) wurden überschrieben @@ -7735,7 +7770,7 @@ Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen - + %n file(s) failed to install %n Datei(en) konnten nicht installiert werden @@ -7743,314 +7778,324 @@ Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen - + System Application Systemanwendung - + System Archive Systemarchiv - + System Application Update System-Anwendungsaktualisierung - + Firmware Package (Type A) Firmware-Paket (Typ A) - + Firmware Package (Type B) Firmware-Paket (Typ B) - + Game Spiel - + Game Update Spielaktualisierung - + Game DLC Spiel-DLC - + Delta Title Delta-Titel - + Select NCA Install Type... NCA-Installationstyp auswählen... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Bitte wähle den Titeltyp aus, unter dem du diese NCA installieren möchtest: (In den meisten Fällen ist die Vorgabe „Spiel“ ausreichend.) - + Failed to Install Installation fehlgeschlagen - + The title type you selected for the NCA is invalid. Der von dir für die NCA ausgewählte Titel ist ungültig. - + File not found Datei nicht gefunden - + File "%1" not found Datei „%1“ nicht gefunden - + OK OK - + Function Disabled Funktion deaktiviert - + Compatibility list reporting is currently disabled. Check back later! Die Anzeige der Kompatibilitätsliste ist derzeit deaktiviert. Schaue später noch einmal vorbei! - + Error opening URL Fehler beim Öffnen der URL - + Unable to open the URL "%1". Die URL „%1“ kann nicht geöffnet werden. - + TAS Recording TAS-Aufnahme - + Overwrite file of player 1? Datei von Spieler 1 überschreiben? - + Invalid config detected Ungültige Konfiguration erkannt - + Handheld controller can't be used on docked mode. Pro controller will be selected. Der Handgerät-Controller kann im angedockten Modus nicht verwendet werden. Es wird der Pro-Controller ausgewählt. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Das aktuelle amiibo wurde entfernt - + Error Fehler - - + + The current game is not looking for amiibos Das aktuelle Spiel sucht nicht nach Amiibos - + Amiibo File (%1);; All Files (*.*) Amiibo-Datei (%1);; Alle Dateien (*.*) - + Load Amiibo Amiibo laden - + Error loading Amiibo data Fehler beim Laden der Amiibo-Daten - + The selected file is not a valid amiibo Die ausgewählte Datei ist kein gültiges amiibo - + The selected file is already on use Die ausgewählte Datei wird bereits verwendet - + An unknown error occurred Ein unbekannter Fehler ist aufgetreten - + No firmware available Keine Firmware verfügbar - + Firmware Corrupted Firmware beschädigt - + Unknown applet Unbekanntes Applet - + Applet doesn't map to a known value. „Applet“ lässt sich keinem bekannten Wert zuordnen. - + Record not found Aufnahme nicht gefunden - + Applet not found. Please reinstall firmware. Applet nicht gefunden. Bitte installiere die Firmware neu. - + Capture Screenshot Bildschirmfoto aufnehmen - + PNG Image (*.png) PNG-Bild (*.png) - + TAS state: Running %1/%2 TAS-Status: %1/%2 läuft - + TAS state: Recording %1 TAS-Status: %1 wird aufgenommen - + TAS state: Idle %1/%2 TAS-Status: Leerlauf %1/%2 - + TAS State: Invalid TAS-Status: Ungültig - + &Stop Running &Ausführung beenden - + Stop R&ecording Aufnahme beenden - + Building: %n shader(s) Erstellung: %n SchattiererErstelle: %n Shader - + Scale: %1x %1 is the resolution scaling factor Maßstab: 1:1 - + Speed: %1% / %2% Geschwindigkeit: %1% / %2% - + Speed: %1% Geschwindigkeit: %1% - + Game: %1 FPS Spiel: %1 FPS - + Frame: %1 ms Frame: %1 ms - + NO AA Kein AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE LAUTSTÄRKE: STUMM - + VOLUME: %1% Volume percentage (e.g. 50%) LAUTSTÄRKE: %1% - + Derivation Components Missing Ableitungskomponenten fehlen - + Decryption keys are missing. Install them now? Entschlüsselungsschlüssel fehlen. Möchtest du diese jetzt installieren? - + Wayland Detected! Wayland erkannt! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8061,74 +8106,74 @@ Es wird empfohlen, stattdessen X11 zu verwenden. Möchtest du dies für zukünftige Starts erzwingen? - + Use X11 X11 verwenden - + Continue with Wayland Mit Wayland fortfahren - + Don't show again Nicht mehr anzeigen - + Restart Required Neustart erforderlich - + Restart Eden to apply the X11 backend. Starte Eden neu, um das X11-Backend zu aktivieren. - + Slow Langsam - + Turbo Turbo - + Unlocked Entsperrt - + Select RomFS Dump Target RomFS-Ausleseziel auswählen - + Please select which RomFS you would like to dump. Bitte wähle aus, welches RomFS du auslesen möchtest. - + Are you sure you want to close Eden? Möchtest du Eden wirklich schließen? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Möchtest du die Emulation wirklich beenden? Alle nicht gespeicherten Fortschritte gehen dabei verloren. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/el.ts b/dist/languages/el.ts index 50ec19b094..c579eb7f72 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -571,70 +571,80 @@ FXAA can produce a more stable picture in lower resolutions. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Λειτουργία Πλήρους Οθόνης: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Αναλογία Απεικόνισης: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Εξομοίωση NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +653,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -699,79 +709,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: Ανισοτροπικό Φιλτράρισμα: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -781,1327 +791,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Περιφέρεια: - + The region of the console. - + Time Zone: Ζώνη Ώρας: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Απόκρυψη δρομέα ποντικιού στην αδράνεια - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Αυτόματη - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Ακριβής - - - + + + Default Προεπιλεγμένο - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Επισφαλής - + Paranoid (disables most optimizations) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Παραθυροποιημένο Χωρίς Όρια - + Exclusive Fullscreen Αποκλειστική Πλήρης Οθόνη - + No Video Output Χωρίς Έξοδο Βίντεο - + CPU Video Decoding Αποκωδικοποίηση Βίντεο CPU - + GPU Video Decoding (Default) Αποκωδικοποίηση Βίντεο GPU (Προεπιλογή) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ΠΕΙΡΑΜΑΤΙΚΟ] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor Πλησιέστερος Γείτονας - + Bilinear Διγραμμικό - + Bicubic Δικυβικό - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Κανένα - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Προεπιλογή (16:9) - + Force 4:3 Επιβολή 4:3 - + Force 21:9 Επιβολή 21:9 - + Force 16:10 Επιβολή 16:10 - + Stretch to Window Επέκταση στο Παράθυρο - + Automatic Αυτόματα - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Ιαπωνικά (日本語) - + American English - + French (français) Γαλλικά (Français) - + German (Deutsch) Γερμανικά (Deutsch) - + Italian (italiano) Ιταλικά (Italiano) - + Spanish (español) Ισπανικά (Español) - + Chinese Κινέζικα - + Korean (한국어) Κορεάτικα (한국어) - + Dutch (Nederlands) Ολλανδικά (Nederlands) - + Portuguese (português) Πορτογαλικά (Português) - + Russian (Русский) Ρώσικα (Русский) - + Taiwanese Ταϊβανέζικα - + British English Βρετανικά Αγγλικά - + Canadian French Καναδικά Γαλλικά - + Latin American Spanish Λατινοαμερικάνικα Ισπανικά - + Simplified Chinese Απλοποιημένα Κινέζικα - + Traditional Chinese (正體中文) Παραδοσιακά Κινέζικα (正體中文) - + Brazilian Portuguese (português do Brasil) Πορτογαλικά Βραζιλίας (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Ιαπωνία - + USA ΗΠΑ - + Europe Ευρώπη - + Australia Αυστραλία - + China Κίνα - + Korea Κορέα - + Taiwan Ταϊβάν - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Κούβα - + EET EET - + Egypt Αίγυπτος - + Eire - + EST EST - + EST5EDT EST5EDT - + GB - + GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Γκρήνουιτς - + Hongkong Χονγκ Κονγκ - + HST HST - + Iceland Ισλανδία - + Iran Ιράν - + Israel Ισραήλ - + Jamaica Ιαμαϊκή - + Kwajalein - + Libya Λιβύη - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Ναβάχο - + NZ - + NZ-CHAT - + Poland Πολωνία - + Portugal Πορτογαλία - + PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Σιγκαπούρη - + Turkey Τουρκία - + UCT UCT - + Universal Παγκόσμια - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu - + Mono Μονοφωνικό - + Stereo Στέρεοφωνικό - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3190,33 +3200,38 @@ Would you like to delete the old save data? Χρώμα Φόντου: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off - + VSync Off - + Recommended - + On - + VSync On @@ -4837,102 +4852,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6944,7 +6974,7 @@ Debug Message: - + &Pause &Παύση @@ -7095,7 +7125,7 @@ Debug Message: - + &Start &Έναρξη @@ -7106,7 +7136,7 @@ Debug Message: - + R&ecord @@ -7197,7 +7227,7 @@ Debug Message: - + None @@ -7223,722 +7253,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7946,74 +7991,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/es.ts b/dist/languages/es.ts index d12a8c2b36..1ae327cff0 100644 --- a/dist/languages/es.ts +++ b/dist/languages/es.ts @@ -592,12 +592,22 @@ SMAA ofrece mejor calidad. FXAA puede producir mejores resultados visuales en resoluciones bajas. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Modo pantalla completa: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -606,12 +616,12 @@ Ventana sin bordes ofrece la mejor compatibilidad con el teclado en pantalla que Pantalla completa exclusiva puede ofrecer mejor rendimiento y mejor soporte para FreeSync/G-Sync/VRR. - + Aspect Ratio: Relación de aspecto: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -620,36 +630,36 @@ La mayoría de los juegos solo admiten 16:9, por lo que se requieren modificacio También controla la relación de aspecto de las capturas de pantalla. - + Use persistent pipeline cache Usar el caché de canalización persistente - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permite almacenar los sombreadores para que carguen más rápido la próxima vez que inicies el juego. Desactivarlo solo está destinado para depuración. - + Use asynchronous GPU emulation Usar emulación asíncrona de la GPU - + Uses an extra CPU thread for rendering. This option should always remain enabled. Usa un hilo adicional de la CPU para el renderizado. Esta opción siempre debe permanecer activada. - + NVDEC emulation: Emulación NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -658,12 +668,12 @@ Puede usar la CPU, GPU o no descodificar (mostrará una pantalla en negro durant En la mayoría de casos, descodificar mediante la GPU es la mejor opción. - + ASTC Decoding Method: Modo descodificación ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -675,12 +685,12 @@ GPU: utiliza los sombreadores computables de la GPU para descodificar las textur CPU asíncrona: usa la CPU para descodificar las texturas ASTC bajo demanda. Elimina los tirones causados por la descodificación ASTC, pero puede generar errores visuales. - + ASTC Recompression Method: Modo recompresión ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -688,44 +698,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3: El formato intermedio será recomprimido a BC1 o BC3, lo que ahorra VRAM, pero degrada la calidad de la imagen. - + Frame Pacing Mode (Vulkan only) Modo de ritmo de fotogramas (solo Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. Controla cómo el emulador gestiona el ritmo de los fotogramas para reducir los tirones y hacer que la velocidad de los fotogramas sea más suave y consistente. - + VRAM Usage Mode: Modo de uso de la VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Selecciona si el emulador prefiere ahorrar memoria o maximizar el uso de memoria de video disponible para mejorar el rendimiento. El modo agresivo puede afectar al rendimiento de otras aplicaciones, como a los programas de grabación. - + Skip CPU Inner Invalidation Saltar invalidación interna de la CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Omite ciertas invalidaciones de caché durante las actualizaciones de memoria, reduciendo el uso de la CPU y mejorando la latencia. Esto puede causar bloqueos leves. - + VSync Mode: Modo VSync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -736,12 +746,12 @@ Mailbox ofrece menor latencia que FIFO y evita el tearing, aunque puede perder a Immediate (sin sincronización) muestra los fotogramas tan pronto están disponibles, pero puede generar desgarros de imagen. - + Sync Memory Operations Sincronizar operaciones de memoria - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -750,56 +760,56 @@ Esta opción arregla errores en los juegos, pero puede afectar negativamente al Los juegos con Unreal Engine 4 son con frecuencia los que muestran cambios significantes en esto. - + Enable asynchronous presentation (Vulkan only) Activar presentación asíncrona (solo Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Mejora el rendimiento ligeramente al usar un hilo de CPU adicional para la presentación. - + Force maximum clocks (Vulkan only) Forzar relojes al máximo (solo Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Ejecuta los procesos en segundo plano mientras se espera a las instrucciones gráficas para evitar que la GPU reduzca su velocidad de reloj. - + Anisotropic Filtering: Filtrado anisotrópico: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Controla la calidad del renderizado de texturas en ángulos oblicuos. Es seguro configurarlo en 16x en la mayoría de las GPU. - + GPU Mode: Modo de la GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Precisión de DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -808,12 +818,12 @@ Inseguro es más rápido, mientras que seguro es más estable y puede solucionar Predeterminado sigue el ajuste de la precisión de GPU. - + GPU Fence Behavior: Comportamiento de vallado de la GPU: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -823,55 +833,55 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback Activar la lectura del búfer de la GPU - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Activa la compilación de shaders asincrónicos - + May reduce shader stutter. Puede reducir los tirones causados por la carga de sombreadores. - + GPU Clocks Relojes de GPU - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle Desentrelazado de la GPU - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Acelera la decodificación de texturas 3D BCn mediante computación de la GPU. Desactívela si experimenta problemas o fallos gráficos. - + GPU Unswizzle Max Texture Size Tamaño máximo de textura de desentrelazado de la GPU - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -880,46 +890,46 @@ Aunque la GPU es más rápida para texturas medianas y grandes, la CPU puede ser Ajuste este valor para encontrar el equilibrio entre la aceleración de la GPU y la sobrecarga de la CPU. - + GPU Unswizzle Stream Size Tamaño del flujo de desentrelazado de la GPU - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Establece la cantidad máxima de datos de textura (en MiB) procesados ​​por cada fotograma. Valores más altos pueden reducir la distorsión durante la carga de texturas, pero pueden afectar a la consistencia de los fotogramas. - + GPU Unswizzle Chunk Size Tamaño del trozo de desentrelazado de la GPU - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Determina la cantidad de cortes de profundidad procesados ​​en un solo envío. Aumentar este valor puede mejorar el rendimiento en una GPU de gama alta, pero puede causar tirones y problemas en los tiempos de respuesta en hardware más modesto. - + Use Vulkan pipeline cache Usar caché de canalización de Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Activa la caché de canalización específica del fabricante. Esta opción puede mejorar los tiempos de cargas de sombreadores en el caso de que el controlador de Vulkan no lo almacene internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Activar la canalizaciones de cómputo (solo Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -928,194 +938,194 @@ Este ajuste solo existe para los controladores propietarios de Intel y puede cau En los demás controladores, la canalización de cómputo siempre está activada. - + Enable Reactive Flushing Activar limpieza reactiva - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa limpieza de memoria reactiva en vez de predictiva, permitiendo una sincronización de memoria más precisa. - + Sync to framerate of video playback Sincronizar a fotogramas de reproducción de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Ejecuta el juego a velocidad normal durante la reproducción de vídeos, incluso cuando no hay límite de fotogramas. - + Barrier feedback loops Bucles de feedback de barrera - + Improves rendering of transparency effects in specific games. Mejora la renderización de los efectos de transparencia en ciertos juegos. - + Enable buffer history Activar el historial del búfer - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Habilita el acceso a estados de búfer anteriores. Esta opción puede mejorar la calidad de renderizado y la consistencia en el rendimiento de algunos juegos. - + Fix bloom effects Arreglar efectos de resplandor - + Removes bloom in Burnout. Elimina el resplandor en Burnout. - + Enable Legacy Rescale Pass Activar el pase de reescalado heredado - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Puede arreglar los problemas de reescalado en algunos juegos confiando en el comportamiento de la implementación anterior. Solución alternativa de comportamiento heredado que corrige los artefactos de línea de la GPU AMD y el parpadeo de texturas gris de la GPU Nvidia en Luigis Mansion 3. - + Extended Dynamic State Estado dinámico extendido - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Controla el número de funciones que pueden ser usadas en el Estado Dinámico Extendido. Números más altos permiten úsar más funciones y pueden aumentar el rendimiento, pero tambén pueden causar errores gráficos. - + Vertex Input Dynamic State Estado dinámico de entrada de vértices - + Enables vertex input dynamic state feature for better quality and performance. Activa la función de estado dinámico de entrada de vértices para una mejor calidad y rendimiento. - + Sample Shading Sombreado de muestra - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permite que el sombreador de fragmentos se ejecute por muestra en un fragmento multimuestreado, en lugar de una sola vez por fragmento. Mejora la calidad de los gráficos a costa de rendimiento. Los valores más altos mejoran la calidad, pero reducen el rendimiento. - + RNG Seed Semilla de GNA - + Controls the seed of the random number generator. Mainly used for speedrunning. Controla la semilla del generador de números aleatorios. Usado principalmente para speedrunning. - + Device Name Nombre del dispositivo - + The name of the console. El nombre de la consola - + Homebrew Args Argumentos Homebrew - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Argumentos en la línea de comandos pasados al homebrew al ser lanzado (p.e. -noglsl). - + Custom RTC Date: Fecha Personalizada RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Esta opción permite cambiar el reloj de la consola. Puede ser usado para manipular el tiempo en juegos. - + The number of seconds from the current unix time Número de segundos de la hora actual de Unix - + Language: Idioma: - + This option can be overridden when region setting is auto-select Esta opción puede ser reemplazada cuando la configuración de región está en selección automática. - + Region: Región: - + The region of the console. La Región de la Consola. - + Time Zone: Zona horaria: - + The time zone of the console. La zona horaria de la consola. - + Sound Output Mode: Método de salida de sonido: - + Console Mode: Modo consola: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1124,1041 +1134,1041 @@ Los juegos cambiarán su resolución, detalles y compatibilidad con los mandos s Configurar el modo portátil puede mejorar el rendimiento en sistemas de gama baja. - + Prompt for user profile on boot Solicitud para perfil de usuario al arrancar - + Useful if multiple people use the same PC. Útil si múltiples personas usan la misma PC - + Pause when not in focus Pausar cuando la ventana no esté activa - + Pauses emulation when focusing on other windows. Pausa la emulación cuando otra ventana diferente está activa. - + Confirm before stopping emulation Confirmar detención - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Anula las solicitudes de confirmación para detener la emulación. Al habilitar esta opción, se omiten dichas solicitudes y se sale directamente de la emulación. - + Hide mouse on inactivity Ocultar el cursor por inactividad. - + Hides the mouse after 2.5s of inactivity. Oculta el mouse después de 2.5s de inactividad. - + Disable controller applet Desactivar applet de mandos - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Desactiva forzosamente el uso del applet del controlador en programas emulados. Cuando un programa intenta abrir el applet del controlador, se cierra inmediatamente. - + Check for updates Buscar actualizaciones - + Whether or not to check for updates upon startup. Si se deben buscar actualizaciones al iniciar o no. - + Enable Gamemode Activar Modo Juego - + Force X11 as Graphics Backend Forzar X11 como motor gráfico - + Custom frontend Interfaz personalizada - + Real applet Applet real - + Never Nunca - + On Load Al cargar - + Always Siempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU asíncrona - + Uncompressed (Best quality) Sin compresión (Mejor calidad) - + BC1 (Low quality) BC1 (Calidad baja) - + BC3 (Medium quality) BC3 (Calidad media) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservativo - + Aggressive Agresivo - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Ensamblado de sombreadores, solo NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, solo AMD/Mesa) - + Null Ninguno - + Fast Rápido - - - + + + Accurate Preciso - - - + + + Default Predeterminado - + Unsafe (fast) Inseguro (rápido) - + Safe (stable) Seguro (estable) - + Immediate Inmediato - + Balanced Balanceado - + Strict Estricto - + Unsafe Impreciso - + Paranoid (disables most optimizations) Paranoico (Deshabilita la mayoría de optimizaciones) - + Debugging Depuración - + Dynarmic DynARMic - + NCE NCE - + Borderless Windowed Ventana sin bordes - + Exclusive Fullscreen Pantalla completa - + No Video Output Sin salida de vídeo - + CPU Video Decoding Decodificación de vídeo en la CPU - + GPU Video Decoding (Default) Decodificación de vídeo en GPU (Por defecto) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] x0,5 (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] x0,75 (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) x1 (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] x1,5 (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) x2 (1440p/2160p) - + 3X (2160p/3240p) x3 (2160p/3240p) - + 4X (2880p/4320p) x4 (2880p/4320p) - + 5X (3600p/5400p) x5 (3600p/5400p) - + 6X (4320p/6480p) x6 (4320p/6480p) - + 7X (5040p/7560p) x7 (5040p/7560p) - + 8X (5760p/8640p) x8 (5760p/8640p) - + Nearest Neighbor Vecino más próximo - + Bilinear Bilineal - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution Super Resolución AMD FidelityFX - + Area Área - + MMPX MMPX - + Zero-Tangent Tangente cero - + B-Spline Ranura B - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Super resolución de juego Snapdragon - + Snapdragon Game Super Resolution EdgeDir Filo direcorio de super resolución de juego Snapdragon - + None Ninguno - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Predeterminado (16:9) - + Force 4:3 Forzar 4:3 - + Force 21:9 Forzar 21:9 - + Force 16:10 Forzar 16:10 - + Stretch to Window Estirar a la ventana - + Automatic Automático - + 2x x2 - + 4x x4 - + 8x x8 - + 16x x16 - + Japanese (日本語) Japonés (日本語) - + American English Inglés estadounidense - + French (français) Francés (français) - + German (Deutsch) Alemán (deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Español - + Chinese Chino - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandés (nederlands) - + Portuguese (português) Portugués (português) - + Russian (Русский) Ruso (Русский) - + Taiwanese Taiwanés - + British English Inglés británico - + Canadian French Francés canadiense - + Latin American Spanish Español latinoamericano - + Simplified Chinese Chino simplificado - + Traditional Chinese (正體中文) Chino tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugués brasileño (português do Brasil) - + Polish (polska) Polaco (polska) - + Thai (แบบไทย) Tailandés (แบบไทย) - - + + Japan Japón - + USA EEUU - + Europe Europa - + Australia Australia - + China China - + Korea Corea - + Taiwan Taiwán - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Predeterminada (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Irán - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquía - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulú - + Mono Mono - + Stereo Estéreo - + Surround Envolvente - + 4GB DRAM (Default) 4GB DRAM (Por defecto) - + 6GB DRAM (Unsafe) 6GB DRAM (Inseguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Sobremesa - + Handheld Portátil - - + + Normal Normal - - + + Boost Impulso - - + + Overclock Overclock - + Always ask (Default) Preguntar siempre (Por defecto) - + Only if game specifies not to stop Solo si el juego pide no ser cerrado - + Never ask Nunca preguntar - + Very Small (16 MB) Muy pequeño (16 MB) - + Small (32 MB) Pequeño (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muy grande (512 MB) - + Very Low (4 MB) Muy bajo (4 MB) - + Low (8 MB) Bajo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muy bajo (32) - + Low (64) Bajo (64) - + Normal (128) Normal (128) - + Medium (256) Medio (256) - + High (512) Alto (512) - + Disabled Desactivado - + ExtendedDynamicState 1 ModoDynamicoExtendido 1 - + ExtendedDynamicState 2 ModoDynamicoExtendido 2 - + ExtendedDynamicState 3 ModoDynamicoExtendido 3 - + Tree View Vista en árbol - + Grid View Vista en cuadrícula @@ -3270,33 +3280,38 @@ Would you like to delete the old save data? Color de fondo: - + % FSR/SGSR sharpening percentage (e.g. 50%) % - + + Configure Effects... + Configurar efectos... + + + Off Desactivado - + VSync Off VSync Desactivado - + Recommended Recomendado - + On Activado - + VSync On VSync Activado @@ -4922,102 +4937,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply Aplicar - + Reset Values Restablecer valores - + Return every effect to the values the preset ships with. - + Save As... Guardar como... - + Save Preset - + Preset name: - - Delete - Borrar + + Clear + - + + Remove every effect in use and deselect the preset. + + + + Add Effect Añadir efecto - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled Activado - + Disabled Desactivado - + Reset to defaults Restaurar los valores predeterminados - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -7035,7 +7065,7 @@ Mensaje de depuración: - + &Pause &Pausar @@ -7186,7 +7216,7 @@ Mensaje de depuración: - + &Start &Iniciar @@ -7197,7 +7227,7 @@ Mensaje de depuración: - + R&ecord G&rabar @@ -7288,7 +7318,7 @@ Mensaje de depuración: - + None Nada @@ -7314,400 +7344,405 @@ Mensaje de depuración: Vista de &carrusel - + Small (32x32) Pequeño (32x32) - + Standard (64x64) Estandar (64x64) - + Large (128x128) Grande (128x128) - + Full Size (256x256) Tamaño completo (256x256) - + Broken Vulkan Installation Detected Detectada instalación fallida de Vulkan - + Vulkan initialization failed during boot. La inicialización de Vulkan falló durante el arranque. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Ejecutando un juego - + Loading Web Applet... Cargando applet web... - - + + Disable Web Applet Desactivar applet web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Desactivar el applet web puede causar comportamientos inesperados y debería solo ser usado con Super Mario 3D All-Stars. ¿Está seguro de que quiere desactivar el applet web? (Puede ser activado en las ajustes de depuración.) - + The amount of shaders currently being built La cantidad de sombreadores que se están contruyendo actualmente - + The current selected resolution scaling multiplier. El multiplicador de escalado de resolución seleccionado actualmente. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocidad de emulación actual. Los valores superiores o inferiores al 100% indican que la emulación se ejecuta más rápida o más lenta que en una Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. La cantidad de fotogramas por segundo que muestra el juego actualmente. Esto varía según el juego y la escena. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tiempo empleado en emular un fotograma de la Switch, sin contar la limitación de fotogramas ni la sincronización vertical. Para una emulación a máxima velocidad, debería ser de 16,67 ms como máximo. - + Unmute Desilenciar - + Mute Silenciar - + Reset Volume Restablecer volumen - + + Configure Effects... + + + + &Clear Recent Files &Limpiar archivos recientes - + &Continue &Continuar - + Warning: Outdated Game Format Advertencia: formato del juego obsoleto - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Estás usando el formato de directorio ROM deconstruido para este juego, el cual es un formato obsoleto que ha sido reemplazado por otros como NCA, NAX, XCI o NSP. Los directorios ROM deconstruidos carecen de iconos, metadatos y compatibilidad con actualizaciones.<br>Para obtener una explicación de los distintos formatos de Switch compatibles con Eden, consulta nuestro manual de usuario. Este mensaje no volverá a aparecer de nuevo. - - + + Error while loading ROM! ¡Error al cargar la ROM! - + The ROM format is not supported. El formato de la ROM no está soportado. - + An error occurred initializing the video core. Se produjo un error al inicializar el núcleo de video. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. ¡Error al cargar la ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Por favor vuelva a volcar sus archivos, o pida ayuda en Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Ha ocurrido un error desconocido. Por favor mire el registro para más detalles. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Cerrando el programa... - + Save Data Datos de guardado - + Mod Data Datos del mod - + Error Opening %1 Folder Error abriendo la carpeta %1 - - + + Folder does not exist! ¡La carpeta no existe! - + Remove Installed Game Contents? ¿Eliminar el contenido instalado del juego? - + Remove Installed Game Update? ¿Eliminar la actualización instalada del juego? - + Remove Installed Game DLC? ¿Eliminar el contenido descargable instalado del juego? - + Remove Entry Eliminar entrada - + Delete OpenGL Transferable Shader Cache? ¿Desea eliminar el caché transferible de sombreadores de OpenGL? - + Delete Vulkan Transferable Shader Cache? ¿Desea eliminar el caché transferible de sombreadores de Vulkan? - + Delete All Transferable Shader Caches? ¿Desea eliminar todo el caché transferible de sombreadores? - + Remove Custom Game Configuration? ¿Borrar configuración personalizada del juego? - + Remove Cache Storage? ¿Borrar el almacenamiento de caché? - + Remove File Eliminar archivo - + Remove Play Time Data Eliminar datos del tiempo de juego - + Reset play time? ¿Reiniciar el tiempo de juego? - - + + RomFS Extraction Failed! ¡Fallo al extraer el RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Ocurrió un error al copiar los archivos de la RomFS o el usuario canceló la operación. - + Full Completo - + Skeleton Esqueleto - + Select RomFS Dump Mode Seleccione el método de volcado del RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Por favor selecciona como quieres que sea volcada la RomFS.<br>Completa copiará todos los archivos en el nuevo directorio mientras que <br>esqueleto solo creará la estructura de los directorios. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root No hay suficiente espacio libre en %1 para extraer la RomFS. Por favor libera espacio o selecciona un directorio de volcado diferente en Emulación > Configurar > Sistema > Sistema de archivos > Volcado raiz - + Extracting RomFS... Extrayendo el RomFS... - - + + Cancel Cancelar - + RomFS Extraction Succeeded! ¡La extracción del RomFS ha sido un éxito! - + The operation completed successfully. La operación se completó con éxito. - + Error Opening %1 Error al abrir %1 - + Select Directory Seleccionar directorio - + Properties Propiedades - + The game properties could not be loaded. No se pudieron cargar las propiedades del juego. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Ejecutable de Switch (%1);;Todos los archivos (*.*) - + Load File Cargar archivo - + Open Extracted ROM Directory Abrir directorio de la ROM extraída - + Invalid Directory Selected Seleccionado directorio inválido - + The directory you have selected does not contain a 'main' file. El directorio seleccionado no contiene un archivo 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Archivo de Switch instalable (*.nca *.nsp *.xci);;Archivo de contenido de Nintendo (*.nca);;Paquete de envío de Nintendo (*.nsp);;Imagen de cartucho NX (*.xci) - + Install Files Instalar archivos - + %n file(s) remaining %n archivo(s) restantes%n archivo(s) restantes%n archivo(s) restantes - + Installing file "%1"... Instalando el archivo "%1"... - - + + Install Results Resultados de la instalación - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Para evitar posibles conflictos, desaconsejamos instalar juegos base en la NAND. Por favor, use solo esta función para instalar actualizaciones y contenido descargable. - + %n file(s) were newly installed %n archivo(s) se instalaron recientemente @@ -7716,7 +7751,7 @@ Por favor, use solo esta función para instalar actualizaciones y contenido desc - + %n file(s) were overwritten %n archivo(s) fueron sobreescritos @@ -7725,7 +7760,7 @@ Por favor, use solo esta función para instalar actualizaciones y contenido desc - + %n file(s) failed to install fallo al instalar %n archivo(s) @@ -7734,314 +7769,324 @@ Por favor, use solo esta función para instalar actualizaciones y contenido desc - + System Application Aplicación del sistema - + System Archive Archivo del sistema - + System Application Update Actualización de la aplicación del sistema - + Firmware Package (Type A) Paquete de firmware (Tipo A) - + Firmware Package (Type B) Paquete de firmware (Tipo B) - + Game Juego - + Game Update Actualización del juego - + Game DLC Contenido descargable del juego - + Delta Title Título Delta - + Select NCA Install Type... Seleccione el tipo de instalación NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Seleccione el tipo de título en el que desea instalar este NCA: (En la mayoría de los casos, la opción predeterminada "Juego" es suficiente). - + Failed to Install Fallo al instalar - + The title type you selected for the NCA is invalid. El tipo de título que ha seleccionado para el NCA es inválido. - + File not found Archivo no encontrado - + File "%1" not found Archivo "%1" no encontrado - + OK Aceptar - + Function Disabled Función desactivada - + Compatibility list reporting is currently disabled. Check back later! Los informes de la lista de compatibilidad están deshabilitados. ¡Vuelva más tarde! - + Error opening URL Error abriendo URL - + Unable to open the URL "%1". No se pudo abrir URL "%1". - + TAS Recording Grabación TAS - + Overwrite file of player 1? ¿Sobrescribir el archivo del jugador 1? - + Invalid config detected Detectada configuración inválida - + Handheld controller can't be used on docked mode. Pro controller will be selected. El mando del modo portátil no puede usarse en el modo sobremesa. El mando pro será seleccionado en su lugar. - - + + Amiibo Amiibo - - + + The current amiibo has been removed El amiibo actual fue borrado - + Error Error - - + + The current game is not looking for amiibos El juego actual no está buscando amiibos - + Amiibo File (%1);; All Files (*.*) Archivo Amiibo (%1);; Todos los archivos (*.*) - + Load Amiibo Cargar Amiibo - + Error loading Amiibo data Error al cargar los datos del Amiibo - + The selected file is not a valid amiibo El archivo seleccionado no es un amiibo válido - + The selected file is already on use El archivo seleccionado se encuentra en uso - + An unknown error occurred Ha ocurrido un error desconocido - + No firmware available No hay firmware disponible - + Firmware Corrupted Firmware corrompido - + Unknown applet Applet desconocido - + Applet doesn't map to a known value. Applet no asigna a un valor conocido. - + Record not found Grabación no encontrada - + Applet not found. Please reinstall firmware. Apple no encontrado. Por favor vuelva a instalar el firmware. - + Capture Screenshot Captura de pantalla - + PNG Image (*.png) Imagen PNG (*.png) - + TAS state: Running %1/%2 Estado de TAS: Ejecutando %1/%2 - + TAS state: Recording %1 Estado de TAS: Grabando %1 - + TAS state: Idle %1/%2 Estado de TAS: Inactivo %1/%2 - + TAS State: Invalid Estado de TAS: Inválido - + &Stop Running &Parar de ejecutarse - + Stop R&ecording &Parar grabación - + Building: %n shader(s) Construyendo: %n sombreador(es)Construyendo: %n sombreador(es)Construyendo: %n sombreador(es) - + Scale: %1x %1 is the resolution scaling factor Escala: %1x - + Speed: %1% / %2% Velocidad: %1% / %2% - + Speed: %1% Velocidad: %1% - + Game: %1 FPS Juego: %1 FPS - + Frame: %1 ms Fotograma: %1 ms - + NO AA NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE VOLUMEN: SILENCIADO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUMEN: %1% - + Derivation Components Missing Componentes de derivación ausentes - + Decryption keys are missing. Install them now? Las claves de desencriptado están ausentes. ¿Desea instalarlas ahora? - + Wayland Detected! ¡Wayland detectado! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8052,74 +8097,74 @@ Se recomienda usar X11 en su lugar. ¿Le gustaría forzar a usarlo en futuras ejecuciones? - + Use X11 Usar X11 - + Continue with Wayland Continuar con Wayland - + Don't show again No mostrar de nuevo - + Restart Required Reinicio requerido - + Restart Eden to apply the X11 backend. Reinicie Eden para aplicar el motor X11. - + Slow Lento - + Turbo Turbo - + Unlocked Desbloqueado - + Select RomFS Dump Target Seleccione el destinatario para el volcado del RomFS - + Please select which RomFS you would like to dump. Por favor seleccione que RomFS desea volcar. - + Are you sure you want to close Eden? ¿Está seguro de que quiere cerrar Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. ¿Está seguro de que desea parar la emulación? Cualquier progreso sin guardar se perderá. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index 3c3ddc5354..bd5898a82f 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -571,70 +571,80 @@ FXAA can produce a more stable picture in lower resolutions. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +653,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -699,79 +709,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -781,1327 +791,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: - + The region of the console. - + Time Zone: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate - - - + + + Default - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe - + Paranoid (disables most optimizations) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed - + Exclusive Fullscreen - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - + Bilinear - + Bicubic - + Gaussian - + Lanczos - + ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None - + FXAA - + SMAA - + Default (16:9) - + Force 4:3 - + Force 21:9 - + Force 16:10 - + Stretch to Window - + Automatic - + 2x - + 4x - + 8x - + 16x - + Japanese (日本語) - + American English - + French (français) - + German (Deutsch) - + Italian (italiano) - + Spanish (español) - + Chinese - + Korean (한국어) - + Dutch (Nederlands) - + Portuguese (português) - + Russian (Русский) - + Taiwanese - + British English - + Canadian French - + Latin American Spanish - + Simplified Chinese - + Traditional Chinese (正體中文) - + Brazilian Portuguese (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan - + USA - + Europe - + Australia - + China - + Korea - + Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET - + CST6CDT - + Cuba - + EET - + Egypt - + Eire - + EST - + EST5EDT - + GB - + GB-Eire - + GMT - + GMT+0 - + GMT-0 - + GMT0 - + Greenwich - + Hongkong - + HST - + Iceland - + Iran - + Israel - + Jamaica - + Kwajalein - + Libya - + MET - + MST - + MST7MDT - + Navajo - + NZ - + NZ-CHAT - + Poland - + Portugal - + PRC - + PST8PDT - + ROC - + ROK - + Singapore - + Turkey - + UCT - + Universal - + UTC - + W-SU - + WET - + Zulu - + Mono - + Stereo - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked - + Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3169,33 +3179,38 @@ Would you like to delete the old save data? Taustan väri: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off - + VSync Off - + Recommended - + On - + VSync On @@ -4815,102 +4830,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6922,7 +6952,7 @@ Debug Message: - + &Pause &Pysäytä @@ -7073,7 +7103,7 @@ Debug Message: - + &Start &Käynnistä @@ -7084,7 +7114,7 @@ Debug Message: - + R&ecord @@ -7175,7 +7205,7 @@ Debug Message: - + None @@ -7201,722 +7231,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7924,74 +7969,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index fcee775250..5d9bb8908a 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -592,12 +592,22 @@ SMAA offre la meilleure qualité. FXAA peut produire une image plus stable à des résolutions plus faibles. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Mode Plein écran : - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -606,12 +616,12 @@ Sans bordure offre la meilleure compatibilité avec le clavier à l'écran Le mode plein écran exclusif peut offrir de meilleures performances et un meilleur support Freesync/Gsync. - + Aspect Ratio: Format : - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -620,35 +630,35 @@ La plupart des jeux ne supportent que le format 16:9, donc des modifications son Contrôle également le format des captures d’écran. - + Use persistent pipeline cache Conserver le cache du rendu graphique - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permet de sauvegarder les shaders sur le stockage pour un chargement plus rapide lors des démarrages ultérieurs du jeu. Le désactiver est uniquement destiné au débogage. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Émulation NVDEC : - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -657,12 +667,12 @@ Elles peuvent être décodées soit par le CPU, soit par le GPU, ou pas du tout Dans la plupart des cas, le décodage GPU offre les meilleures performances. - + ASTC Decoding Method: Méthode de décodage ASTC : - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -674,12 +684,12 @@ GPU : Utiliser les shaders de calcul du GPU pour décoder les textures ASTC (rec CPU asynchrone : Utiliser le CPU pour décoder les textures ASTC à la demande. Élimine les saccades liées au décodage ASTC, mais peut provoquer des artefacts. - + ASTC Recompression Method: Méthode de recompression ASTC : - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -687,44 +697,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3 : Le format intermédiaire sera recompressé en BC1 ou BC3, ce qui économise de la VRAM mais dégrade la qualité de l’image. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: Mode d'utilisation de la VRAM : - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Permet de choisir si l’émulateur doit privilégier la conservation de la mémoire ou utiliser au maximum la mémoire vidéo disponible pour les performances. Le mode agressif peut affecter les performances d’autres applications, comme les logiciels d’enregistrement. - + Skip CPU Inner Invalidation Ignorer l'invalidation interne du CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Ignore certaines invalidations de cache lors des mises à jour de la mémoire, réduisant l’utilisation du CPU et améliorant la latence. Cela peut provoquer des plantages légers. - + VSync Mode: Mode VSync : - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -735,12 +745,12 @@ Mailbox peut offrir une latence inférieure à FIFO et n’entraîne pas de déc Immediate (pas de synchronisation) affiche ce qui est disponible et peut provoquer du déchirement. - + Sync Memory Operations Synchroniser les opérations mémoire - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -749,68 +759,68 @@ Cette option corrige des problèmes dans les jeux, mais peut dégrader les perfo Les jeux Unreal Engine 4 sont souvent ceux qui bénéficient le plus de ce réglage. - + Enable asynchronous presentation (Vulkan only) Activer la présentation asynchrone (Vulkan uniquement) - + Slightly improves performance by moving presentation to a separate CPU thread. Améliore légèrement les performances en déplaçant la présentation vers un thread CPU séparé. - + Force maximum clocks (Vulkan only) Forcer la fréquence d'horloge maximale (Vulkan uniquement) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Les exécutions fonctionnent en arrière-plan en attendant les commandes graphiques pour empêcher le GPU de réduire sa vitesse de fréquence d'horloge. - + Anisotropic Filtering: Filtrage anisotropique : - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Contrôle la qualité du rendu des textures sous des angles obliques. Il est sûr de le régler à 16x sur la plupart des GPU. - + GPU Mode: Mode GPU : - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Précision du DMA : - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -820,100 +830,100 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Activer la compilation asynchrone des shaders - + May reduce shader stutter. Peut réduire les saccades dues aux shaders. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Utiliser le cache de pipeline Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Active le cache de pipeline spécifique au fournisseur de GPU. Cette option peut améliorer considérablement le temps de chargement des shaders dans les cas où le pilote Vulkan ne stocke pas les fichiers de cache de pipeline en interne. - + Enable Compute Pipelines (Intel Vulkan Only) Activer les pipelines de calcul (Vulkan sur Intel uniquement) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -922,95 +932,95 @@ Ce réglage n’existe que pour les pilotes propriétaires Intel et peut provoqu Les pipelines de calcul sont toujours activés sur tous les autres pilotes. - + Enable Reactive Flushing Activer le Vidage Réactif - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Utilise une purge réactive au lieu d'une purge prédictive, permettant une synchronisation de la mémoire plus précise. - + Sync to framerate of video playback Synchro la fréquence d'image de la relecture du vidéo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Éxécuter le jeu à une vitesse normale pendant la relecture du vidéo, même-ci la fréquence d'image est dévérouillée. - + Barrier feedback loops Boucles de rétroaction de barrière - + Improves rendering of transparency effects in specific games. Améliore le rendu des effets de transparence dans des jeux spécifiques. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State État dynamique étendu - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading Échantillonnage de shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permet au shader de fragments de s’exécuter pour chaque échantillon dans un fragment multi-échantillonné, au lieu d’une seule fois par fragment. @@ -1018,96 +1028,96 @@ Améliore la qualité graphique au prix de performances réduites. Des valeurs plus élevées améliorent la qualité mais dégradent les performances. - + RNG Seed Seed RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Contrôle la graine du générateur de nombres aléatoires. Principalement utilisé pour le speedrun. - + Device Name Nom de l'appareil - + The name of the console. Nom de la console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Date RTC personnalisée : - + This option allows to change the clock of the console. Can be used to manipulate time in games. Cette option permet de modifier l’horloge de la console. Peut être utilisée pour manipuler le temps dans les jeux. - + The number of seconds from the current unix time Nombre de secondes écoulées depuis le 1er janvier 1970. - + Language: Langue : - + This option can be overridden when region setting is auto-select Cette option peut être remplacée lorsque la région est sur auto. - + Region: Région : - + The region of the console. Région de la console. - + Time Zone: Fuseau horaire : - + The time zone of the console. Fuseau horaire de la console. - + Sound Output Mode: Mode de sortie sonore : - + Console Mode: Mode console : - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1116,1042 +1126,1042 @@ Les jeux adaptent leur résolution, leurs paramètres graphiques et les manettes Passer en mode Portable peut améliorer les performances sur les systèmes peu puissants. - + Prompt for user profile on boot Choisir l’utilisateur au démarrage. - + Useful if multiple people use the same PC. Utile si plusieurs personnes utilisent le même PC. - + Pause when not in focus Pause lorsque la fenêtre n’est pas active. - + Pauses emulation when focusing on other windows. Met l’émulation en pause dès que l’utilisateur change de fenêtre. - + Confirm before stopping emulation Confirmer avant d'arrêter l'émulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Ignore les demandes de confirmation pour arrêter l’émulation. L’activer permet de contourner ces confirmations et de quitter directement l’émulation. - + Hide mouse on inactivity Cacher la souris en cas d'inactivité - + Hides the mouse after 2.5s of inactivity. Cache le curseur après 2,5 secondes d’inactivité. - + Disable controller applet Désactiver l'applet du contrôleur - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Désactive de force le menu de configuration des manettes dans les programmes émulés. Lorsqu’un programme tente d’ouvrir ce menu, il est immédiatement fermé. - + Check for updates Rechercher des mises à jours - + Whether or not to check for updates upon startup. Vérifier ou non les mises à jour au démarrage. - + Enable Gamemode Activer le mode jeu - + Force X11 as Graphics Backend Forcer X11 comme moteur graphique - + Custom frontend Interface personnalisée - + Real applet Applet réel - + Never Jamais - + On Load Au chargement - + Always Toujours - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asynchrone - + Uncompressed (Best quality) Non compressé (Meilleure qualité) - + BC1 (Low quality) BC1 (Basse qualité) - + BC3 (Medium quality) BC3 (Qualité moyenne) - - + + Auto Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Conservateur - + Aggressive Agressif - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Nul - + Fast Rapide - - - + + + Accurate Précis - - - + + + Default Par défaut - + Unsafe (fast) Insecure (rapide) - + Safe (stable) Sûr (stable) - + Immediate - + Balanced Moyen - + Strict - + Unsafe Risqué - + Paranoid (disables most optimizations) Paranoïaque (désactive la plupart des optimisations) - + Debugging Débogage - + Dynarmic Dynamique - + NCE NCE - + Borderless Windowed Fenêtré sans bordure - + Exclusive Fullscreen Plein écran exclusif - + No Video Output Pas de sortie vidéo - + CPU Video Decoding Décodage Vidéo sur le CPU - + GPU Video Decoding (Default) Décodage Vidéo sur le GPU (par défaut) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPÉRIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPÉRIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1,25X (900p/1350p) [EXPÉRIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPÉRIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Plus proche voisin - + Bilinear Bilinéaire - + Bicubic Bicubique - + Gaussian Gaussien - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area (Par zone) - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Aucun - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Par défaut (16:9) - + Force 4:3 Forcer le 4:3 - + Force 21:9 Forcer le 21:9 - + Force 16:10 Forcer le 16:10 - + Stretch to Window Étirer à la fenêtre - + Automatic Automatique - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonais (日本語) - + American English Anglais Américain - + French (français) Français (français) - + German (Deutsch) Allemand (Deutsch) - + Italian (italiano) Italien (italiano) - + Spanish (español) Espagnol (español) - + Chinese Chinois - + Korean (한국어) Coréen (한국어) - + Dutch (Nederlands) Néerlandais (Nederlands) - + Portuguese (português) Portugais (português) - + Russian (Русский) Russe (Русский) - + Taiwanese Taïwanais - + British English Anglais Britannique - + Canadian French Français Canadien - + Latin American Spanish Espagnol d'Amérique Latine - + Simplified Chinese Chinois Simplifié - + Traditional Chinese (正體中文) Chinois Traditionnel (正體中文) - + Brazilian Portuguese (português do Brasil) Portugais Brésilien (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japon - + USA É.-U.A. - + Europe Europe - + Australia Australie - + China Chine - + Korea Corée - + Taiwan Taïwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Par défaut (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Égypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islande - + Iran Iran - + Israel Israël - + Jamaica Jamaïque - + Kwajalein Kwajalein - + Libya Libye - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Pologne - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapour - + Turkey Turquie - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stéréo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Par défaut) - + 6GB DRAM (Unsafe) 6 GB DRAM (Risqué) - + 8GB DRAM 8GO DRAM - + 10GB DRAM (Unsafe) 10GO DRAM (Insecure) - + 12GB DRAM (Unsafe) 12GO DRAM (Insecure) - + Docked Mode TV - + Handheld Mode Portable - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Toujours demander (par défaut) - + Only if game specifies not to stop Uniquement si le jeu précise de ne pas s'arrêter - + Never ask Jamais demander - + Very Small (16 MB) Très petit (16Mo) - + Small (32 MB) Petit (32Mo) - + Normal (128 MB) Normal (128Mo) - + Large (256 MB) Large (256Mo) - + Very Large (512 MB) Très large (512Mo) - + Very Low (4 MB) Très faible (4 Mo) - + Low (8 MB) Faible (8 Mo) - + Normal (16 MB) Normal (16 Mo) - + Medium (32 MB) Moyen (32 Mo) - + High (64 MB) Élevé (64 Mo) - + Very Low (32) Très faible (32) - + Low (64) Faible (64) - + Normal (128) Normal (128) - + Medium (256) Moyen (256) - + High (512) Élevé (512) - + Disabled Désactivé - + ExtendedDynamicState 1 État dynamique étendu 1 - + ExtendedDynamicState 2 État dynamique étendu 2 - + ExtendedDynamicState 3 État dynamique étendu 3 - + Tree View Vue en liste - + Grid View Vue en grille @@ -3251,33 +3261,38 @@ Would you like to delete the old save data? Couleur de l’arrière plan : - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off Désactivé - + VSync Off VSync Désactivée - + Recommended Recommandé - + On Activé - + VSync On VSync Activée @@ -4899,102 +4914,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -7012,7 +7042,7 @@ Message de débogage : - + &Pause &Pause @@ -7163,7 +7193,7 @@ Message de débogage : - + &Start &Démarrer @@ -7174,7 +7204,7 @@ Message de débogage : - + R&ecord En&registrer @@ -7265,7 +7295,7 @@ Message de débogage : - + None Aucun @@ -7291,722 +7321,737 @@ Message de débogage : - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Remettre le son - + Mute Couper le son - + Reset Volume Réinitialiser le volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue &Continuer - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... Fermeture du logiciel... - + Save Data Données de sauvegarde - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? Réinitialiser le temps de jeu ? - - + + RomFS Extraction Failed! L'extraction de la RomFS a échoué ! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel Annuler - + RomFS Extraction Succeeded! Extraction de la RomFS réussi ! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties Propriétés - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game Jeu - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install Échec de l'installation - + The title type you selected for the NCA is invalid. - + File not found Fichier non trouvé - + File "%1" not found - + OK OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed - + Error Erreur - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo Charger un Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted Firmware corrompu - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE VOLUME : MUET - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! Wayland détecté ! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8014,74 +8059,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/hu.ts b/dist/languages/hu.ts index 11f04195b9..2b5a634afa 100644 --- a/dist/languages/hu.ts +++ b/dist/languages/hu.ts @@ -572,12 +572,22 @@ FXAA can produce a more stable picture in lower resolutions. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Teljes képernyős mód: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -586,47 +596,47 @@ A borderless (szegély nélküli) biztosítja a legjobb kompatibilitást a képe Az exkluzív teljes képernyő jobb teljesítményt és jobb Freesync/Gsync támogatást kínálhat. - + Aspect Ratio: Képarány: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Lehetővé teszi az árnyékolók tárolását a gyorsabb betöltés érdekében a következő játékindításokkor. Kikapcsolása csak hibakeresésre szolgál. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC emuláció: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -635,12 +645,12 @@ A dekódoláshoz használhatja a CPU-t vagy a GPU-t, vagy egyáltalán nem vége A legtöbb esetben a GPU dekódolás nyújtja a legjobb teljesítményt. - + ASTC Decoding Method: ASTC dekódoló módszer: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -649,55 +659,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: ASTC újraszűrési módszer: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: VRAM használati mód: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: VSync mód: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -705,79 +715,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Aszinkron prezentálás engedélyezése (csak Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Kicsit javítja a teljesítményt azáltal, hogy a megjelenítést külön CPU szálra helyezi át. - + Force maximum clocks (Vulkan only) Maximális órajelek kényszerítése (csak Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. A háttérben fut, miközben várja a grafikai parancsokat, hogy a GPU ne csökkentse az órajelét. - + Anisotropic Filtering: Anizotropikus szűrés: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -787,1327 +797,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Vulkan pipeline gyorsítótár használata. - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Reaktív ürítés használata - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Reaktív ürítést használ a prediktív ürítés helyett, ami pontosabb memóriaszinkronizálást tesz lehetővé. - + Sync to framerate of video playback Szinkronizálás a videolejátszás képkockasebességéhez - + Run the game at normal speed during video playback, even when the framerate is unlocked. A játék futtatása normál sebességgel videolejátszás közben, még akkor is, ha a képkockasebesség fel van oldva. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. Javítja az átlátszósági effektek megjelenítését bizonyos játékokban. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Eszköznév - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Egyéni RTC dátum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Nyelv: - + This option can be overridden when region setting is auto-select - + Region: Régió: - + The region of the console. - + Time Zone: Időzóna: - + The time zone of the console. - + Sound Output Mode: Hangkimeneti mód: - + Console Mode: Konzol mód: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Emuláció leállításának megerősítése - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Egér elrejtése inaktivitáskor - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Vezérlő applet letiltása - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Játékmód engedélyezése - + Force X11 as Graphics Backend - + Custom frontend Egyéni frontend - + Real applet Valódi applet - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU aszinkron - + Uncompressed (Best quality) Tömörítetlen (legjobb minőség) - + BC1 (Low quality) BC1 (alacsony minőség) - + BC3 (Medium quality) BC3 (közepes minőség) - - + + Auto Automatikus - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Takarékos - + Aggressive Aggresszív - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Pontos - - - + + + Default Alapértelmezett - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Nem biztonságos - + Paranoid (disables most optimizations) Paranoid (a legtöbb optimalizálást letiltja) - + Debugging - + Dynarmic Dinamikus - + NCE NCE - + Borderless Windowed Szegély nélküli ablak - + Exclusive Fullscreen Exkluzív teljes képernyő - + No Video Output Nincs videokimenet - + CPU Video Decoding CPU videódekódolás - + GPU Video Decoding (Default) GPU videódekódolás (alapértelmezett) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [KÍSÉRLETI] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [KÍSÉRLETI] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [KÍSÉRLETI] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Legközelebbi szomszéd - + Bilinear Bilineáris - + Bicubic Bikubikus - + Gaussian Gauss-féle - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nincs - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Alapértelmezett (16:9) - + Force 4:3 4:3 kényszerítése - + Force 21:9 21:9 kényszerítése - + Force 16:10 16:10 kényszerítése - + Stretch to Window Ablakhoz nyújtás - + Automatic Automatikus - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japán (日本語) - + American English Amerikai angol - + French (français) Francia (français) - + German (Deutsch) Német (Deutsch) - + Italian (italiano) Olasz (italiano) - + Spanish (español) Spanyol (español) - + Chinese Kínai - + Korean (한국어) Koreai (한국어) - + Dutch (Nederlands) Holland (Nederlands) - + Portuguese (português) Portugál (português) - + Russian (Русский) Orosz (Русский) - + Taiwanese Tajvani - + British English Brit Angol - + Canadian French Kanadai francia - + Latin American Spanish Latin-amerikai spanyol - + Simplified Chinese Egyszerűsített kínai - + Traditional Chinese (正體中文) Hagyományos kínai (正體中文) - + Brazilian Portuguese (português do Brasil) Brazíliai portugál (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japán - + USA USA - + Europe Európa - + Australia Ausztrália - + China Kína - + Korea Korea - + Taiwan Tajvan - + Auto (%1) Auto select time zone Automatikus (%1) - + Default (%1) Default time zone Alapértelmezett (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egyiptom - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Izland - + Iran Irán - + Israel Izrael - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navahó - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Lengyelország - + Portugal Portugália - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Szingapúr - + Turkey Törökország - + UCT UCT - + Universal Univerzális - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Sztereó - + Surround Térhangzás - + 4GB DRAM (Default) 4GB DRAM (Alapértelmezett) - + 6GB DRAM (Unsafe) 6GB DRAM (Nem biztonságos) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokkolt - + Handheld Kézi - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Mindig kérdezz rá (alapértelmezett) - + Only if game specifies not to stop Csak akkor, ha a játék kifejezetten kéri a folytatást. - + Never ask Soha ne kérdezz rá - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3180,33 +3190,38 @@ Would you like to delete the old save data? Háttérszín: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off Ki - + VSync Off VSync Ki - + Recommended Ajánlott - + On Be - + VSync On VSync Be @@ -4828,102 +4843,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6938,7 +6968,7 @@ Debug Message: - + &Pause &Szünet @@ -7089,7 +7119,7 @@ Debug Message: - + &Start &Indítás @@ -7100,7 +7130,7 @@ Debug Message: - + R&ecord F&elvétel @@ -7191,7 +7221,7 @@ Debug Message: - + None @@ -7217,722 +7247,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7940,74 +7985,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/id.ts b/dist/languages/id.ts index 30f30a8c1d..f2ae975eca 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -583,12 +583,22 @@ FXAA can produce a more stable picture in lower resolutions. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Mode Layar Penuh: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -597,47 +607,47 @@ Borderless menawarkan kompatibilitas terbaik dengan keyboard di layar yang dimin Layar penuh eksklusif mungkin menawarkan performa yang lebih baik dan dukungan Freesync/Gsync yang lebih baik. - + Aspect Ratio: Rasio Aspek: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Memungkinkan penyimpanan shader untuk mempercepat pengambilan pada saat game berikutnya dimulai. Menonaktifkannya hanya dimaksudkan untuk debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Emulasi NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -646,12 +656,12 @@ Ini dapat menggunakan CPU atau GPU untuk dekode, atau tidak melakukan dekode sam Dalam kebanyakan kasus, dekode GPU memberikan kinerja terbaik. - + ASTC Decoding Method: ASTC Metode Dekoding: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -660,55 +670,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: ASTC Metode Pemampatan Ulang: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: Mode Penggunaan VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation Abaikan Invalidasi Internal CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: Mode Sinkronisasi Vertikal - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -716,79 +726,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations Sinkronisasi Operasi Memori - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Aktifkan presentasi asinkron (hanya Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Meningkatkan kinerja sedikit dengan memindahkan presentasi ke thread CPU terpisah. - + Force maximum clocks (Vulkan only) Paksa jam maximum (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Berjalan bekerja di latar belakang sambil menunggu perintah grafis untuk mencegah GPU agar tidak menurunkan kecepatan jamnya. - + Anisotropic Filtering: Anisotropic Filtering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: Mode GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Akurasi DMA - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -798,1328 +808,1328 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Gunakan kompilasi shader asinkron - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Gunakan pipeline cache Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Memungkinkan cache pipeline spesifik vendor GPU. Opsi ini dapat meningkatkan waktu pemuatan shader secara signifikan dalam kasus di mana driver Vulkan tidak menyimpan file cache pipeline secara internal. - + Enable Compute Pipelines (Intel Vulkan Only) Aktifkan Pipa Komputasi (Hanya Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Aktifkan Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Menggunakan pemadatan reaktif alih-alih pemadatan prediktif, memungkinkan sinkronisasi memori yang lebih akurat. - + Sync to framerate of video playback Sinkronkan dengan kecepatan pemutaran video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Jalankan permainan dengan kecepatan normal selama pemutaran video, bahkan ketika framerate tidak terkunci. - + Barrier feedback loops Loop umpan balik penghalang - + Improves rendering of transparency effects in specific games. Meningkatkan rendering efek transparansi dalam game tertentu. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects Perbaiki efek bloom - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading Pencahayaan Sampel - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Benih RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Nama Perangkat - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Tanggal RTC Kustom: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Bahasa - + This option can be overridden when region setting is auto-select - + Region: Wilayah: - + The region of the console. - + Time Zone: Zona Waktu: - + The time zone of the console. - + Sound Output Mode: Mode keluaran suara. - + Console Mode: Mode Konsol - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Konfirmasi sebelum menghentikan emulasi - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Sembunyikan mouse saat tidak aktif - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Nonaktifkan aplikasi pengontrol - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates Cek Pembaruan - + Whether or not to check for updates upon startup. - + Enable Gamemode Aktifkan Mode Permainan - + Force X11 as Graphics Backend - + Custom frontend Tampilan depan kustom - + Real applet Aplikasi nyata - + Never Tidak Pernah - + On Load - + Always Selalu - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU sinkron - + Uncompressed (Best quality) Tidak terkompresi (Kualitas Terbaik) - + BC1 (Low quality) BC1 (Kualitas rendah) - + BC3 (Medium quality) BC3 (Kualitas sedang) - - + + Auto Otomatis - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Konservatif - + Aggressive Agresif - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast Cepat - - - + + + Accurate Akurat - - - + + + Default Bawaan - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced Seimbang - + Strict - + Unsafe Berbahaya - + Paranoid (disables most optimizations) Paranoid (menonaktifkan sebagian besar optimasi) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Layar Tanpa Batas - + Exclusive Fullscreen Layar Penuh Eksklusif - + No Video Output Tidak ada Keluaran Suara - + CPU Video Decoding Penguraian Video menggunakan CPU - + GPU Video Decoding (Default) Penguraian Video menggunakan GPU (Bawaan) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EKSPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EKSPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EKSPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Biliner - + Bicubic Bikubik - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Tak ada - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Bawaan (16:9) - + Force 4:3 Paksa 4:3 - + Force 21:9 Paksa 21:9 - + Force 16:10 Paksa 16:10 - + Stretch to Window Regangkan ke Layar - + Automatic Otomatis - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Jepang (日本語) - + American English Bahasa Inggris Amerika - + French (français) Prancis (français) - + German (Deutsch) Jerman (Deutsch) - + Italian (italiano) Italia (italiano) - + Spanish (español) Spanyol (español) - + Chinese Cina - + Korean (한국어) Korea (한국어) - + Dutch (Nederlands) Belanda (Nederlands) - + Portuguese (português) Portugis (português) - + Russian (Русский) Rusia (Русский) - + Taiwanese Taiwan - + British English Inggris Britania - + Canadian French Prancis Kanada - + Latin American Spanish Spanyol Amerika Latin - + Simplified Chinese Cina Sederhana - + Traditional Chinese (正體中文) Cina Tradisional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugis Brazil (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Jepang - + USA USA - + Europe Eropa - + Australia Australia - + China Tiongkok - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Bawaan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Mesir - + Eire Éire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Éire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polandia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turki - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Bawaan) - + 6GB DRAM (Unsafe) 6GB DRAM (Tidak Aman) - + 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Tidak Aman) - + 12GB DRAM (Unsafe) 12GB DRAM (Tidak Aman) - + Docked Terpasang - + Handheld Jinjing - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Selalu tanyakan (Bawaan) - + Only if game specifies not to stop Hanya jika permainan menentukan untuk tidak berhenti - + Never ask Jangan pernah bertanya - + Very Small (16 MB) Sangat Kecil (16 MB) - + Small (32 MB) Kecil (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Sedang (256) - + High (512) Tinggi (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3218,33 +3228,38 @@ Would you like to delete the old save data? Warna Latar: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off Mati - + VSync Off VSync Mati - + Recommended Direkomendasikan - + On Nyala - + VSync On VSync Aktif @@ -4865,102 +4880,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6972,7 +7002,7 @@ Debug Message: - + &Pause &Jeda @@ -7123,7 +7153,7 @@ Debug Message: - + &Start &Mulai @@ -7134,7 +7164,7 @@ Debug Message: - + R&ecord R&ekam @@ -7225,7 +7255,7 @@ Debug Message: - + None @@ -7251,722 +7281,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7974,74 +8019,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/it.ts b/dist/languages/it.ts index bb485065c8..caac64d9ed 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -592,12 +592,22 @@ SMAA offre la migliore qualità. FXAA può produrre un'immagine più stabile nelle risoluzioni più basse. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Modalità schermo intero: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -606,12 +616,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp "Schermo intero esclusivo" può offrire prestazioni maggiori e un supporto migliore al Freesync/Gsync. - + Aspect Ratio: Rapporto d'aspetto: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -620,36 +630,36 @@ La maggior parte dei giochi supporta solo 16:9, quindi le mod sono necessarie pe Controlla anche il rapporto d'aspetto degli screenshot. - + Use persistent pipeline cache Usa la cache persistente delle pipeline - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permette di salvare gli shader su disco per velocizzarne il caricamento negli avvii successivi del gioco. Disabilitarla ha senso solo quando si effettua il debug. - + Use asynchronous GPU emulation Abilita l'emulazione asincrona della GPU - + Uses an extra CPU thread for rendering. This option should always remain enabled. Utilizza un thread aggiuntivo della CPU per il rendering. Quest'opzione dovrebbe sempre rimanere abilitata. - + NVDEC emulation: Emulazione NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -658,12 +668,12 @@ In most cases, GPU decoding provides the best performance. Nella maggior parte dei casi, la decodifica tramite GPU fornisce prestazioni migliori. - + ASTC Decoding Method: Metodo di decodifica ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -675,12 +685,12 @@ GPU: Usa i compute shader della GPU per decodificare le texture ASTC (consigliat CPU (Asincrono): Usa la CPU per decodificare le texture ASTC se richiesto. Elimina lo stuttering causato dalla decodifica ma potrebbe generare artefatti visivi. - + ASTC Recompression Method: Metodo di ricompressione ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -688,44 +698,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3: Il formato intermedio sarà ricompresso nel formato BC1 o BC3, risparmiando VRAM ma peggiorando la qualità visiva. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: Modalità di utilizzo della VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Determina se l'emulatore dovrebbe risparmiare memoria o utilizzarne il più possibile per massimizzare le prestazioni. La modalità aggressiva potrebbe impattare sulle prestazioni di altre applicazioni, come i programmi di registrazione. - + Skip CPU Inner Invalidation Salta invalidamento interno CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Salta alcuni invalidamenti della cache durante gli aggiornamenti della memoria, riducendo l'uso della CPU e migliorando la latenza. Questo potrebbe causare soft-crash. - + VSync Mode: Modalità VSync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -736,12 +746,12 @@ Mailbox può avere una latenza minore di FIFO e non ha tearing ma potrebbe perde Immediate (no sincronizzazione) mostra tutto il disponibile, quindi anche tearing. - + Sync Memory Operations Sincronizza operazioni di memoria - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -750,68 +760,68 @@ Questa opzione dovrebbe risolvere problemi in alcuni giochi, ma potrebbe ridurre I giochi con Unreal Engine 4 sembrano essere i più colpiti. - + Enable asynchronous presentation (Vulkan only) Abilita la presentazione asincrona (solo Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Migliora di poco le prestazioni spostando la presentazione su un thread della CPU separato. - + Force maximum clocks (Vulkan only) Forza clock massimi (solo Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Esegue del lavoro in background durante l'attesa dei comandi grafici per evitare che la GPU diminuisca la sua velocità di clock. - + Anisotropic Filtering: Filtro anisotropico: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Controlla la qualità del rendering delle texture negli angoli obliqui. Si può utilizzare in modo sicuro al 16x su quasi tutte le GPU. - + GPU Mode: Modalità GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Precisione DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -821,100 +831,100 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Abilita la compilazione asincrona degli shader - + May reduce shader stutter. Può ridurre i fenomeni di stuttering (scatti) causati dagli shader. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Usa la cache delle pipeline di Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Abilita la cache delle pipeline specifica del produttore della GPU. Quest'opzione può ridurre di molto i tempi di caricamento degli shader nei casi in cui il driver Vulkan non memorizza la cache delle pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Abilita le compute pipeline (solo per Vulkan su Intel) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -923,192 +933,192 @@ Quest'impostazione esiste solo per i driver proprietari Intel e potrebbe fa Le compute pipelines sono sempre attivate su tutti gli altri drivers. - + Enable Reactive Flushing Abilita il flushing reattivo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Utilizza il flushing reattivo invece di quello predittivo, al fine di ottenere una sincronizzazione della memoria più accurata. - + Sync to framerate of video playback Sincronizza il framerate a quello del video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Esegue il gioco a velocità normale durante le cutscene, anche quando il framerate è sbloccato. - + Barrier feedback loops Barrier feedback loops - + Improves rendering of transparency effects in specific games. Migliora il rendering degli effetti di trasparenza in alcuni giochi. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State Stato dinamico esteso - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Controlla il numero di funzionalità che possono essere usate con lo stato dinamico esteso. Gli stati più alti consentono più funzionalità e possono migliorare le prestazioni, ma possono causare ulteriori problemi grafici. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading Sample shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permette al fragment shader di eseguire per campione in un frammento multi-campione invece che una volta per frammento. Migliora la qualità grafica a scapito delle prestazioni. Alti valori migliorano la qualità ma peggiorano le prestazioni. - + RNG Seed Seed RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Controlla il seme del generatore di numeri casuali. Principalmente utilizzato per le speedrun. - + Device Name Nome del dispositivo - + The name of the console. Il nome della console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Data RTC personalizzata: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Quest'opzione permette di modificare l'orologio della console. Può essere usato per manipolare il tempo nei giochi. - + The number of seconds from the current unix time Il numero di secondi dal tempo Unix attuale - + Language: Lingua: - + This option can be overridden when region setting is auto-select Può essere rimpiazzato se il fuso orario della Regione è impostato su Auto - + Region: Regione: - + The region of the console. La regione della console. - + Time Zone: Fuso orario: - + The time zone of the console. Il fuso orario della console. - + Sound Output Mode: Modalità di output del suono: - + Console Mode: Modalità console: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1117,1042 +1127,1042 @@ I giochi ne terranno conto e modificheranno la risoluzione, i dettagli e i contr Impostare l'opzione su "Portatile" può aiutare a migliorare le prestazioni sui sistemi meno potenti. - + Prompt for user profile on boot Scegli il profilo utente all'avvio - + Useful if multiple people use the same PC. Utile se più persone utilizzano lo stesso PC. - + Pause when not in focus Metti in pausa quando la finestra non è in primo piano - + Pauses emulation when focusing on other windows. Mette in pausa l'emulazione quando altre finestre sono in primo piano. - + Confirm before stopping emulation Chiedi conferma prima di arrestare l'emulazione - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Sovrascrive le richieste di conferma per fermare l'emulazione. Abilitarla bypassa queste richieste e l'emulazione cesserà immediatamente. - + Hide mouse on inactivity Nascondi il puntatore del mouse se inattivo - + Hides the mouse after 2.5s of inactivity. Nasconde il mouse dopo 2,5 secondi di inattività. - + Disable controller applet Disabilita l'applet controller - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Disabilita forzatamente l'uso dell'applet del controller nei programmi emulati. Quando un programma proverà ad aprire l'applet del controller, quest'ultimo verrà immediatamente chiuso. - + Check for updates Controlla la presenza di aggiornamenti - + Whether or not to check for updates upon startup. Determina se controllare o meno la presenza di aggiornamenti all'avvio. - + Enable Gamemode Abilita Gamemode - + Force X11 as Graphics Backend Forza l'uso del back-end grafico X11 - + Custom frontend Frontend personalizzato - + Real applet Applet reale - + Never Mai - + On Load Al caricamento - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU (Asincrono) - + Uncompressed (Best quality) Nessuna compressione (qualità migliore) - + BC1 (Low quality) BC1 (qualità bassa) - + BC3 (Medium quality) BC3 (qualità media) - - + + Auto Automatico - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservativa - + Aggressive Aggressiva - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (shader assembly, solo NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (sperimentale, solo AMD/MESA) - + Null Nullo - + Fast Veloce - - - + + + Accurate Accurata - - - + + + Default Predefinito - + Unsafe (fast) Non sicuro (veloce) - + Safe (stable) Sicuro (stabile) - + Immediate - + Balanced Bilanciata - + Strict - + Unsafe Non sicura - + Paranoid (disables most optimizations) Paranoica (disabilita la maggior parte delle ottimizzazioni) - + Debugging Debug - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Finestra senza bordi - + Exclusive Fullscreen Schermo intero esclusivo - + No Video Output Nessun output video - + CPU Video Decoding Decodifica video CPU - + GPU Video Decoding (Default) Decodifica video GPU (predefinita) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [SPERIMENTALE] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [SPERIMENTALE] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [SPERIMENTALE] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [SPERIMENTALE] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [SPERIMENTALE] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest neighbor - + Bilinear Bilineare - + Bicubic Bicubico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nessuna - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Predefinito (16:9) - + Force 4:3 Forza 4:3 - + Force 21:9 Forza 21:9 - + Force 16:10 Forza 16:10 - + Stretch to Window Allunga a finestra - + Automatic Automatico - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Giapponese (日本語) - + American English Inglese americano - + French (français) Francese (français) - + German (Deutsch) Tedesco (Deutsch) - + Italian (italiano) Italiano - + Spanish (español) Spagnolo (español) - + Chinese Cinese - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Olandese (Nederlands) - + Portuguese (português) Portoghese (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanese - + British English Inglese britannico - + Canadian French Francese canadese - + Latin American Spanish Spagnolo latino-americano - + Simplified Chinese Cinese semplificato - + Traditional Chinese (正體中文) Cinese tradizionale (正體中文) - + Brazilian Portuguese (português do Brasil) Portoghese brasiliano (português do Brasil) - + Polish (polska) Polacco (polska) - + Thai (แบบไทย) Thailandese (แบบไทย) - - + + Japan Giappone - + USA USA - + Europe Europa - + Australia Australia - + China Cina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatico (%1) - + Default (%1) Default time zone Predefinito (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egitto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islanda - + Iran Iran - + Israel Israele - + Jamaica Giamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portogallo - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turchia - + UCT UCT - + Universal Universale - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Predefinito) - + 6GB DRAM (Unsafe) 6GB DRAM (Non sicuro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Non sicuro) - + 12GB DRAM (Unsafe) 12GB DRAM (Non sicuro) - + Docked Dock - + Handheld Portatile - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Chiedi sempre (Predefinito) - + Only if game specifies not to stop Solo se il gioco richiede di non essere arrestato - + Never ask Non chiedere mai - + Very Small (16 MB) Molto piccola (16 MB) - + Small (32 MB) Piccola (32 MB) - + Normal (128 MB) Normale (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Molto grande (512 MB) - + Very Low (4 MB) Molto bassa (4 MB) - + Low (8 MB) Bassa (8 MB) - + Normal (16 MB) Normale (16 MB) - + Medium (32 MB) Media (32 MB) - + High (64 MB) Alta (64 MB) - + Very Low (32) Molto basso (32) - + Low (64) Basso (64) - + Normal (128) Normale (128) - + Medium (256) Medio (256) - + High (512) Alto (512) - + Disabled Disabilitato - + ExtendedDynamicState 1 Stato dinamico esteso 1 - + ExtendedDynamicState 2 Stato dinamico esteso 2 - + ExtendedDynamicState 3 Stato dinamico esteso 3 - + Tree View Vista ad albero - + Grid View Vista a griglia @@ -3262,33 +3272,38 @@ Vuoi cancellare i dati precedenti? Colore dello sfondo: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off Disattivato - + VSync Off VSync disattivato - + Recommended Consigliata - + On Attivato - + VSync On VSync attivato @@ -4919,102 +4934,117 @@ Una volta rimosse, non potranno più essere recuperate. Sei assolutamente sicuro - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -7032,7 +7062,7 @@ Messaggio debug: - + &Pause &Pausa @@ -7183,7 +7213,7 @@ Messaggio debug: - + &Start &Avvia @@ -7194,7 +7224,7 @@ Messaggio debug: - + R&ecord R&egistra @@ -7285,7 +7315,7 @@ Messaggio debug: - + None Nessuno @@ -7311,400 +7341,405 @@ Messaggio debug: - + Small (32x32) Piccola (32x32) - + Standard (64x64) Normale (64x64) - + Large (128x128) Grande (128x128) - + Full Size (256x256) Intera (256x256) - + Broken Vulkan Installation Detected Rilevata installazione di Vulkan non funzionante - + Vulkan initialization failed during boot. L'inizializzazione di Vulkan è fallita durante l'avvio. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Gioco in esecuzione - + Loading Web Applet... Caricamento dell'applet web... - - + + Disable Web Applet Disabilita l'applet web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Disabilitare l'applet web potrebbe causare dei comportamenti indesiderati e andrebbe fatto solo con Super Mario 3D All-Stars. Sei sicuro di voler procedere? (Puoi riabilitarlo quando vuoi nelle impostazioni di debug.) - + The amount of shaders currently being built Il numero di shader in fase di compilazione - + The current selected resolution scaling multiplier. Il moltiplicatore attuale della risoluzione. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocità attuale dell'emulazione. Valori più alti o più bassi di 100% indicano che l'emulazione sta funzionando più velocemente o lentamente rispetto a una Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Il numero di fotogrammi al secondo che il gioco sta attualmente renderizzando. Può variare in base al gioco e alla situazione. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tempo necessario per emulare un fotogramma della Switch, senza tenere conto del limite al framerate o del V-Sync. Per un'emulazione alla massima velocità, il valore non dovrebbe essere superiore a 16.67 ms. - + Unmute Riattiva - + Mute Silenzia - + Reset Volume Reimposta volume - + + Configure Effects... + + + + &Clear Recent Files &Cancella i file recenti - + &Continue &Continua - + Warning: Outdated Game Format Attenzione: Formato del gioco obsoleto - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Stai usando una cartella contenente una ROM decostruita per avviare questo gioco, che è un formato obsoleto e sostituito da NCA, NAX, XCI o NSP. Le ROM decostruite non hanno icone né metadati e non supportano gli aggiornamenti.<br>Per una spiegazione sui vari formati della console Switch supportati da Eden, consulta il manuale utente. Non riceverai di nuovo questo avviso. - - + + Error while loading ROM! Errore nel caricamento della ROM! - + The ROM format is not supported. Il formato della ROM non è supportato. - + An error occurred initializing the video core. Errore durante l'inizializzazione del componente video di base - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Errore nel caricamento della ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Esegui un nuovo dump dei tuoi file o chiedi aiuto su Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Si è verificato un errore sconosciuto. Consulta il log per maggiori dettagli. - - + + (64-bit) (64 bit) - - + + (32-bit) (32 bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Chiusura del software in corso... - + Save Data Dati di salvataggio - + Mod Data Dati delle mod - + Error Opening %1 Folder Impossibile aprire la cartella %1 - - + + Folder does not exist! La cartella non esiste! - + Remove Installed Game Contents? Rimuovere il contenuto del gioco installato? - + Remove Installed Game Update? Rimuovere l'aggiornamento installato? - + Remove Installed Game DLC? Rimuovere il DLC installato? - + Remove Entry Rimuovi voce - + Delete OpenGL Transferable Shader Cache? Vuoi rimuovere la cache trasferibile degli shader OpenGL? - + Delete Vulkan Transferable Shader Cache? Vuoi rimuovere la cache trasferibile degli shader Vulkan? - + Delete All Transferable Shader Caches? Vuoi rimuovere tutte le cache trasferibili degli shader? - + Remove Custom Game Configuration? Rimuovere la configurazione personalizzata del gioco? - + Remove Cache Storage? Rimuovere la cache del gioco? - + Remove File Rimuovi file - + Remove Play Time Data Reimposta il tempo di gioco - + Reset play time? Vuoi reimpostare il tempo di gioco? - - + + RomFS Extraction Failed! Estrazione RomFS fallita! - + There was an error copying the RomFS files or the user cancelled the operation. Si è verificato un errore durante la copia dei file del RomFS o l'operazione è stata annullata dall'utente. - + Full Completa - + Skeleton Cartelle - + Select RomFS Dump Mode Seleziona la modalità di estrazione del RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Seleziona come vorresti estrarre il RomFS. <br>La modalità Completa copierà tutti i file in una nuova cartella mentre<br>la modalità Cartelle creerà solamente la struttura delle cartelle. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Non c'è abbastanza spazio disponibile in %1 per estrarre il RomFS. Libera lo spazio o seleziona una cartella di estrazione diversa in Emulazione > Configura > Sistema > File system > Cartella di estrazione - + Extracting RomFS... Estrazione RomFS in corso... - - + + Cancel Annulla - + RomFS Extraction Succeeded! Estrazione RomFS riuscita! - + The operation completed successfully. L'operazione è stata completata con successo. - + Error Opening %1 Impossibile aprire %1 - + Select Directory Seleziona cartella - + Properties Proprietà - + The game properties could not be loaded. Non è stato possibile caricare le proprietà del gioco. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Eseguibile Switch (%1);;Tutti i file (*.*) - + Load File Carica file - + Open Extracted ROM Directory Apri la cartella della ROM estratta - + Invalid Directory Selected Cartella selezionata non valida - + The directory you have selected does not contain a 'main' file. La cartella che hai selezionato non contiene un file "main". - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) File Switch installabili (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Installa file - + %n file(s) remaining %n file rimanente%n di file rimanenti%n file rimanenti - + Installing file "%1"... Installazione del file "%1"... - - + + Install Results Risultati dell'installazione - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Per evitare possibli conflitti, sconsigliamo di installare i giochi base su NAND. Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) were newly installed %n nuovo file è stato installato @@ -7713,7 +7748,7 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) were overwritten %n file è stato sovrascritto @@ -7722,7 +7757,7 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) failed to install %n file non è stato installato a causa di errori @@ -7731,314 +7766,324 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + System Application Applicazione di sistema - + System Archive Archivio di sistema - + System Application Update Aggiornamento di un'applicazione di sistema - + Firmware Package (Type A) Pacchetto firmware (tipo A) - + Firmware Package (Type B) Pacchetto firmware (tipo B) - + Game Gioco - + Game Update Aggiornamento di gioco - + Game DLC DLC - + Delta Title Titolo delta - + Select NCA Install Type... Seleziona il tipo di installazione NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Seleziona il tipo del file NCA da installare: (Nella maggior parte dei casi, il valore predefinito "Gioco" va bene) - + Failed to Install Installazione fallita - + The title type you selected for the NCA is invalid. Il tipo che hai selezionato per il file NCA non è valido. - + File not found File non trovato - + File "%1" not found File "%1" non trovato - + OK OK - + Function Disabled Funzionalità disabilitata - + Compatibility list reporting is currently disabled. Check back later! La segnalazione della compatibilità è al momento disabilitata. Torna a controllare più avanti! - + Error opening URL Impossibile aprire l'URL - + Unable to open the URL "%1". Non è stato possibile aprire l'URL "%1". - + TAS Recording Registrazione TAS - + Overwrite file of player 1? Vuoi sovrascrivere il file del giocatore 1? - + Invalid config detected Rilevata configurazione non valida - + Handheld controller can't be used on docked mode. Pro controller will be selected. Il controller portatile non può essere utilizzato in modalità dock. Verrà selezionato il controller Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed L'Amiibo corrente è stato rimosso - + Error Errore - - + + The current game is not looking for amiibos Il gioco in uso non è alla ricerca di Amiibo - + Amiibo File (%1);; All Files (*.*) File Amiibo (%1);; Tutti i file (*.*) - + Load Amiibo Carica Amiibo - + Error loading Amiibo data Impossibile caricare i dati dell'Amiibo - + The selected file is not a valid amiibo Il file selezionato non è un Amiibo valido - + The selected file is already on use Il file selezionato è già in uso - + An unknown error occurred Si è verificato un errore sconosciuto - + No firmware available Nessun firmware disponibile - + Firmware Corrupted Firmware corrotto - + Unknown applet Applet sconosciuto - + Applet doesn't map to a known value. L'applet non è associato a un valore noto. - + Record not found Non trovato - + Applet not found. Please reinstall firmware. Applet non trovato. Reinstalla il firmware. - + Capture Screenshot Cattura screenshot - + PNG Image (*.png) Immagine PNG (*.png) - + TAS state: Running %1/%2 Stato TAS: In esecuzione (%1/%2) - + TAS state: Recording %1 Stato TAS: Registrazione in corso (%1) - + TAS state: Idle %1/%2 Stato TAS: In attesa (%1/%2) - + TAS State: Invalid Stato TAS: Non valido - + &Stop Running &Interrompi esecuzione - + Stop R&ecording Interrompi r&egistrazione - + Building: %n shader(s) Compilazione di %n shaderCompilazione di %n shaderCompilazione di %n shader - + Scale: %1x %1 is the resolution scaling factor Risoluzione: %1x - + Speed: %1% / %2% Velocità: %1% / %2% - + Speed: %1% Velocità: %1% - + Game: %1 FPS Gioco: %1 FPS - + Frame: %1 ms Frame: %1 ms - + NO AA NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE VOLUME: MUTO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + Derivation Components Missing Componenti di derivazione mancanti - + Decryption keys are missing. Install them now? Chiavi di crittografia mancanti. Vuoi installarle ora? - + Wayland Detected! Wayland rilevato! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8049,74 +8094,74 @@ Si consiglia invece di usare X11. Vuoi forzare l'uso di quest'ultimo per i prossimi avvii? - + Use X11 Usa X11 - + Continue with Wayland Continua con Wayland - + Don't show again Non mostrare di nuovo - + Restart Required Riavvio richiesto - + Restart Eden to apply the X11 backend. Riavvia Eden per usare il back-end X11. - + Slow Lento - + Turbo Turbo - + Unlocked Sbloccato - + Select RomFS Dump Target Seleziona RomFS da estrarre - + Please select which RomFS you would like to dump. Seleziona quale RomFS vorresti estrarre. - + Are you sure you want to close Eden? Sei sicuro di voler uscire da Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Sei sicuro di voler arrestare l'emulazione? Tutti i progressi non salvati verranno perduti. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index 01de70d2b2..8aa2c78060 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -571,70 +571,80 @@ FXAA can produce a more stable picture in lower resolutions. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: フルスクリーンモード: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: アスペクト比: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC エミュレーション: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: ASTC デコード方式: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +653,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: ASTC 再圧縮方式: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: 垂直同期: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -702,79 +712,79 @@ Mailbox は FIFO よりも遅延が小さくティアリングがありません Immediate (no synchronization) は表示可能なものをすべて表示し, ティアリング発生の可能性があります. - + Sync Memory Operations メモリ操作の同期 - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) 非同期プレゼンテーション (Vulkan のみ) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) 最大クロック強制 (Vulkan のみ) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. GPUのクロックスピードを下げないように、グラフィックコマンドを待っている間、バックグラウンドで作業を実行させます。 - + Anisotropic Filtering: 異方性フィルタリング: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: GPUモード: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: DMA精度: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -784,1327 +794,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Vulkan パイプラインキャッシュを使用 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) コンピュート・パイプラインの有効化(インテル Vulkan のみ) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback ビデオ再生のフレームレートに同期する - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. 特定のゲームにおける透明エフェクトのレンダリングを改善します。 - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed 乱数シード値の変更 - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name デバイス名 - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: 言語: - + This option can be overridden when region setting is auto-select - + Region: 地域: - + The region of the console. - + Time Zone: タイムゾーン: - + The time zone of the console. - + Sound Output Mode: 音声出力モード: - + Console Mode: コンソールモード: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation エミュレーションを停止する前に確認する - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity 非アクティブ時にマウスカーソルを隠す - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet コントローラーアプレットの無効化 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 非同期 - + Uncompressed (Best quality) 圧縮しない (最高品質) - + BC1 (Low quality) BC1 (低品質) - + BC3 (Medium quality) BC3 (中品質) - - + + Auto 自動 - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (アセンブリシェーダー、NVIDIA のみ) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V(実験的、AMD/Mesaのみ) - + Null - + Fast - - - + + + Accurate 正確 - - - + + + Default デフォルト - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe 不安定 - + Paranoid (disables most optimizations) パラノイド (ほとんどの最適化を無効化) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed ボーダーレスウィンドウ - + Exclusive Fullscreen 排他的フルスクリーン - + No Video Output ビデオ出力しない - + CPU Video Decoding ビデオをCPUでデコード - + GPU Video Decoding (Default) ビデオをGPUでデコード (デフォルト) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [実験的] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [実験的] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [実験的] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area - + MMPX MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None なし - + FXAA FXAA - + SMAA SMAA - + Default (16:9) デフォルト (16:9) - + Force 4:3 強制 4:3 - + Force 21:9 強制 21:9 - + Force 16:10 強制 16:10 - + Stretch to Window ウィンドウに合わせる - + Automatic 自動 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日本語 - + American English アメリカ英語 - + French (français) フランス語 (français) - + German (Deutsch) ドイツ語 (Deutsch) - + Italian (italiano) イタリア語 (italiano) - + Spanish (español) スペイン語 (español) - + Chinese 中国語 - + Korean (한국어) 韓国語 (한국어) - + Dutch (Nederlands) オランダ語 (Nederlands) - + Portuguese (português) ポルトガル語 (português) - + Russian (Русский) ロシア語 (Русский) - + Taiwanese 台湾語 - + British English イギリス英語 - + Canadian French カナダフランス語 - + Latin American Spanish ラテンアメリカスペイン語 - + Simplified Chinese 簡体字中国語 - + Traditional Chinese (正體中文) 繁体字中国語 (正體中文) - + Brazilian Portuguese (português do Brasil) ブラジルポルトガル語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA アメリカ - + Europe ヨーロッパ - + Australia オーストラリア - + China 中国 - + Korea 韓国 - + Taiwan 台湾 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 既定 (%1) - + CET 中央ヨーロッパ時間 - + CST6CDT CST6CDT - + Cuba キューバ - + EET 東ヨーロッパ標準時 - + Egypt エジプト - + Eire アイルランド - + EST アメリカ東部標準時 - + EST5EDT EST5EDT - + GB GB - + GB-Eire イギリス-アイルランド - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich グリニッジ - + Hongkong 香港 - + HST ハワイ標準時 - + Iceland アイスランド - + Iran イラン - + Israel イスラエル - + Jamaica ジャマイカ - + Kwajalein クェゼリン - + Libya リビア - + MET 中東時間 - + MST MST - + MST7MDT MST7MDT - + Navajo ナバホ - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland ポーランド - + Portugal ポルトガル - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore シンガポール - + Turkey トルコ - + UCT UCT - + Universal ユニバーサル - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu ズールー - + Mono モノラル - + Stereo ステレオ - + Surround サラウンド - + 4GB DRAM (Default) 4GB DRAM (デフォルト) - + 6GB DRAM (Unsafe) 6GB DRAM (不安定) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld 携帯モード - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) 常に確認する (デフォルト) - + Only if game specifies not to stop ゲームが停止しないように指定しているときのみ - + Never ask 確認しない - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled 無効 - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3204,33 +3214,38 @@ Would you like to delete the old save data? 背景色: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off オフ - + VSync Off VSync オフ - + Recommended 推奨 - + On オン - + VSync On VSync オン @@ -4851,102 +4866,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6961,7 +6991,7 @@ Debug Message: - + &Pause 中断(&P) @@ -7112,7 +7142,7 @@ Debug Message: - + &Start 実行(&S) @@ -7123,7 +7153,7 @@ Debug Message: - + R&ecord 記録(&R) @@ -7214,7 +7244,7 @@ Debug Message: - + None @@ -7240,722 +7270,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7963,74 +8008,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index ecb5a29660..e636dc2030 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -594,12 +594,22 @@ SMAA는 최고의 화질을 제공합니다. FXAA는 저해상도에서 더 안정적인 화면을 구현할 수 있습니다. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: 전체 화면 모드: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -608,12 +618,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp 전체 화면 전용 모드는 더 나은 성능과 FreeSync/GSync 지원을 제공할 수 있습니다. - + Aspect Ratio: 화면 비율: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -622,36 +632,36 @@ Also controls the aspect ratio of captured screenshots. 또한 캡처된 스크린샷의 화면 비율도 제어합니다. - + Use persistent pipeline cache 지속적 파이프라인 캐시 사용 - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. 셰이더를 저장소에 저장하여 다음 게임 실행 시 더 빠르게 불러올 수 있도록 합니다. 이 옵션을 비활성화하는 것은 디버깅 목적으로만 사용하세요. - + Use asynchronous GPU emulation 비동기 GPU 에뮬레이션 사용 - + Uses an extra CPU thread for rendering. This option should always remain enabled. 렌더링에 추가 CPU 스레드를 사용합니다. 이 옵션은 항상 활성화된 상태로 유지해야 합니다. - + NVDEC emulation: NVDEC 에뮬레이션: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -660,12 +670,12 @@ In most cases, GPU decoding provides the best performance. 대부분의 경우 GPU 디코딩이 가장 좋은 성능을 제공합니다. - + ASTC Decoding Method: ASTC 디코딩 방식: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -677,12 +687,12 @@ GPU: GPU의 컴퓨트 셰이더를 사용하여 ASTC 텍스처를 디코딩합 CPU 비동기: 필요에 따라 CPU를 사용하여 ASTC 텍스처를 디코딩합니다. ASTC 디코딩으로 인한 끊김 현상이 없어지지만, 아티팩트가 발생할 수 있습니다. - + ASTC Recompression Method: ASTC 재압축 방식: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -691,44 +701,44 @@ BC1/BC3: 중간 형식은 BC1 또는 BC3 형식으로 재압축되어 VRAM을 절약하지만 이미지 품질이 저하됩니다. - + Frame Pacing Mode (Vulkan only) 프레임 페이싱 모드(Vulkan 전용) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. 에뮬레이터가 프레임 페이싱을 관리하는 방식을 제어하여 끊김 현상을 줄이고 프레임 속도를 더욱 부드럽고 일관되게 만듭니다. - + VRAM Usage Mode: VRAM 사용 모드: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. 에뮬레이터가 메모리를 절약할지, 아니면 사용 가능한 비디오 메모리를 최대한 활용하여 성능을 향상시킬지 선택합니다. 적극적 모드는 녹화 소프트웨어와 같은 다른 애플리케이션의 성능에 영향을 줄 수 있습니다. - + Skip CPU Inner Invalidation CPU 내부 무효화 건너뛰기 - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. 메모리 업데이트 중 특정 캐시 무효화를 건너뛰어 CPU 사용량을 줄이고 지연 시간을 개선합니다. 하지만 이로 인해 소프트 크래시가 발생할 수 있습니다. - + VSync Mode: 수직 동기화 모드: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -739,12 +749,12 @@ Mailbox는 FIFO보다 지연 시간이 짧고 화면 찢김 현상이 없지만 즉각적(동기화 없음)는 사용 가능한 모든 화면을 표시하며 화면 찢김 현상이 발생할 수 있습니다. - + Sync Memory Operations 메모리 작업 동기화 - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -753,44 +763,44 @@ Unreal Engine 4 games often see the most significant changes thereof. 대개 언리얼 엔진 4 게임에서 이러한 변경 사항이 가장 두드러지게 나타납니다. - + Enable asynchronous presentation (Vulkan only) 비동기 프레젠테이션 활성화(Vulkan 전용) - + Slightly improves performance by moving presentation to a separate CPU thread. 프레젠테이션을 별도의 CPU 스레드로 이동시켜 성능을 약간 향상시킵니다. - + Force maximum clocks (Vulkan only) 최대 클럭 강제 적용(Vulkan 전용) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. 그래픽 명령을 기다리는 동안 백그라운드에서 작업을 실행하여 GPU 클럭 속도가 저하되는 것을 방지합니다. - + Anisotropic Filtering: 비등방성 필터링: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. 비스듬한 각도에서의 텍스처 렌더링 품질을 제어합니다. 대부분의 GPU에서 16x로 설정해도 안전합니다. - + GPU Mode: GPU 모드: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -799,12 +809,12 @@ Particles tend to only render correctly with Accurate mode. 특히 조각들은 정확 모드에서만 제대로 렌더링되는 경향이 있습니다. - + DMA Accuracy: DMA 정확도: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -813,12 +823,12 @@ Default follows the GPU Accuracy setting. 기본값은 GPU 정확도 설정을 따릅니다. - + GPU Fence Behavior: GPU 펜스 동작: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -833,56 +843,56 @@ Default follows the GPU Accuracy setting. 기본값은 GPU 정확도 설정을 따릅니다. - + Enable GPU buffer readback GPU 버퍼 되읽기 활성화 - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. 수정된 GPU 데이터를 업로드하기 전에 다시 읽어들여 보존합니다. 일부 게임에서는 특정 효과를 제대로 렌더링하기 위해 이 기능이 필요합니다. - + Enable asynchronous shader compilation 비동기 셰이더 컴파일 활성화 - + May reduce shader stutter. 셰이더 끊김 현상을 줄일 수 있습니다. - + GPU Clocks GPU 클럭 - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. 게임이 GPU 작업이 실제보다 더 빨리 완료된다고 착각하게 만들어, 스위치의 클럭 속도에 맞추기 위해 해상도와 렌더 거리를 낮추는 작업을 중단하게 합니다. - + GPU Unswizzle GPU 언스위즐 - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. GPU 컴퓨팅을 사용하여 BCn 3D 텍스처 디코딩을 가속화합니다. 충돌이나 그래픽 결함이 발생하는 경우 이 기능을 비활성화하세요. - + GPU Unswizzle Max Texture Size GPU 언스위즐 최대 텍스처 크기 - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -891,48 +901,48 @@ GPU는 중간 및 큰 크기의 텍스처에서 더 빠르지만, 매우 작은 이 값을 조정하여 GPU 가속과 CPU 오버헤드 간의 균형을 찾으세요. - + GPU Unswizzle Stream Size GPU 언스위즐 스트림 크기 - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. 프레임당 처리할 최대 텍스처 데이터 양(MiB 단위)을 설정합니다. 값이 높을수록 텍스처 로딩 중 끊김 현상을 줄일 수 있지만 프레임 일관성에 영향을 미칠 수 있습니다. - + GPU Unswizzle Chunk Size GPU 언스위즐 청크 크기 - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. 단일 디스패치에서 처리할 깊이 슬라이스 수를 결정합니다. 이 값을 높이면 고성능 GPU에서 처리량이 향상될 수 있지만, 성능이 낮은 하드웨어에서는 TDR 오류나 드라이버 시간 초과가 발생할 수 있습니다. - + Use Vulkan pipeline cache Vulkan 파이프라인 캐시 사용 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. GPU 제조사별 파이프라인 캐시를 활성화합니다. 이 옵션은 Vulkan 드라이버가 파이프라인 캐시 파일을 내부에 저장하지 않는 경우 셰이더 로딩 시간을 크게 향상시킬 수 있습니다. - + Enable Compute Pipelines (Intel Vulkan Only) 컴퓨트 파이프라인 활성화(인텔 Vulkan 전용) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -941,194 +951,194 @@ Compute pipelines are always enabled on all other drivers. 다른 모든 드라이버에서는 컴퓨트 파이프라인이 항상 활성화됩니다. - + Enable Reactive Flushing 반응형 플러싱 활성화 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 예측형 플러싱 대신 반응형 플러싱을 사용하여 보다 정확한 메모리 동기화를 가능하게 합니다. - + Sync to framerate of video playback 비디오 재생 프레임 속도에 동기화 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 프레임률 제한이 해제된 경우에도 비디오 재생 중에는 게임을 정상 속도로 실행합니다. - + Barrier feedback loops 피드백 루프 차단 - + Improves rendering of transparency effects in specific games. 특정 게임에서 투명 효과 렌더링을 개선합니다. - + Enable buffer history 버퍼 기록 활성화 - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. 이전 버퍼 상태에 접근할 수 있도록 합니다. 이 옵션은 일부 게임에서 렌더링 품질과 성능 일관성을 향상시킬 수 있습니다. - + Fix bloom effects 블룸 효과 수정 - + Removes bloom in Burnout. Burnout에서의 블룸 현상을 제거합니다. - + Enable Legacy Rescale Pass 기존 크기 조정 무시 활성화 - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. 이전 구현의 동작을 활용하여 일부 게임에서 발생하는 크기 조정 문제를 해결할 수 있습니다. 루이지 맨션 3에서 발생했던 AMD 및 인텔 GPU의 선 아티팩트 현상과 Nvidia GPU의 회색 텍스처 깜빡임 현상을 해결하는 기존 반응에 대한 예비 해결책입니다. - + Extended Dynamic State 확장된 동적 상태 - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. 확장된 동적 상태에서 사용할 수 있는 기능의 수를 제어합니다. 상태 수가 많을수록 더 많은 기능을 사용할 수 있고 성능이 향상될 수 있지만, 추가적인 그래픽 문제가 발생할 수 있습니다. - + Vertex Input Dynamic State 정점 입력 동적 상태 - + Enables vertex input dynamic state feature for better quality and performance. 정점 입력의 동적 상태 기능을 활성화하여 품질과 성능을 향상시킵니다. - + Sample Shading 샘플 셰이딩 - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. 조각 셰이더가 다중샘플 조각에서 한 번당 한 조각이 아닌 샘플별로 실행될 수 있도록 합니다. 성능 저하를 감수하고 그래픽 품질을 향상시킵니다. 값이 높을수록 품질은 향상되지만 성능은 저하됩니다. - + RNG Seed RNG 시드 - + Controls the seed of the random number generator. Mainly used for speedrunning. 난수 생성기의 시드 값을 제어합니다. 주로 스피드런에 사용됩니다. - + Device Name 장치 이름 - + The name of the console. 콘솔의 이름 - + Homebrew Args 홈브루 인수 - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). 홈브루 실행 시 전달되는 명령줄 인수(예: -noglsl). - + Custom RTC Date: 사용자 지정 RTC 날짜: - + This option allows to change the clock of the console. Can be used to manipulate time in games. 이 옵션을 사용하면 콘솔의 시간을 변경할 수 있습니다. 게임 내 시간을 조작하는 데 사용할 수 있습니다. - + The number of seconds from the current unix time 현재 unix 시간으로부터 경과한 초 수 - + Language: 언어: - + This option can be overridden when region setting is auto-select 이 옵션은 지역 설정이 자동 선택으로 되어 있을 경우 번복될 수 있습니다. - + Region: 지역: - + The region of the console. 콘솔의 지역 - + Time Zone: 시간대: - + The time zone of the console. 콘솔의 시간대 - + Sound Output Mode: 소리 출력 모드: - + Console Mode: 콘솔 모드: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1137,1042 +1147,1042 @@ Setting to Handheld can help improve performance for low end systems. 휴대 모드로 설정하면 저사양 시스템의 성능을 향상시키는 데 도움이 될 수 있습니다. - + Prompt for user profile on boot 부팅 시 유저 프로필 입력 요청 - + Useful if multiple people use the same PC. 여러 사람이 같은 PC를 사용할 때 유용합니다. - + Pause when not in focus 초점이 맞지 않을 때 일시 중지 - + Pauses emulation when focusing on other windows. 다른 창에 초점을 맞출 때 에뮬레이션을 일시 중지합니다. - + Confirm before stopping emulation 에뮬레이션을 중지하기 전에 확인 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. 에뮬레이션 중지를 확인하는 메시지를 무시합니다. 이 옵션을 활성화하면 이러한 메시지를 건너뛰고 에뮬레이션을 바로 종료합니다. - + Hide mouse on inactivity 마우스 커서가 비활동 상태일 때 숨기기 - + Hides the mouse after 2.5s of inactivity. 마우스 커서가 2.5초 동안 활동이 없으면 숨깁니다. - + Disable controller applet 컨트롤러 애플릿 비활성화 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. 에뮬레이트된 프로그램에서 컨트롤러 애플릿 사용을 강제적으로 비활성화합니다. 프로그램이 컨트롤러 애플릿을 열려고 하면 즉시 닫힙니다. - + Check for updates 업데이트 확인 - + Whether or not to check for updates upon startup. 시작 시 업데이트를 확인할지 여부. - + Enable Gamemode 게임 모드 활성화 - + Force X11 as Graphics Backend X11을 그래픽 백엔드로 강제 설정 - + Custom frontend 사용자 정의 프론트엔드 - + Real applet 실제 애플릿 - + Never 안 함 - + On Load 로드 시 - + Always 항상 - + CPU CPU - + GPU GPU - + CPU Asynchronous 비동기 CPU - + Uncompressed (Best quality) 비압축(최고 품질) - + BC1 (Low quality) BC1(저품질) - + BC3 (Medium quality) BC3(중간 품질) - - + + Auto 자동 - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative 소극적 - + Aggressive 적극적 - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM(어셈블리 셰이더, NVIDIA 전용) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V(실험적, AMD/Mesa 전용) - + Null Null - + Fast 고속 - - - + + + Accurate 정확 - - - + + + Default 기본값 - + Unsafe (fast) 불안전(빠름) - + Safe (stable) 안전(안정적) - + Immediate 즉시 - + Balanced 균형 - + Strict 염격 - + Unsafe 불안전 - + Paranoid (disables most optimizations) 편집증적(대부분의 최적화를 비활성화함) - + Debugging 디버깅 - + Dynarmic 동적 - + NCE NCE - + Borderless Windowed 테두리 없는 창 - + Exclusive Fullscreen 독점 전체 화면 - + No Video Output 비디오 출력 없음 - + CPU Video Decoding CPU 비디오 디코딩 - + GPU Video Decoding (Default) GPU 비디오 디코딩(기본값) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [실험적] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [실험적] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [실험적] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [실험적] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [실험적] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 최단입점 - + Bilinear 쌍선형 - + Bicubic 쌍입방 - + Gaussian 가우시안 - + Lanczos 란초스 - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area 영역 - + MMPX MMPX - + Zero-Tangent 제로탄젠트 - + B-Spline B-스플라인 - + Mitchell 미첼 - + Spline-1 스플라인-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None 없음 - + FXAA FXAA - + SMAA SMAA - + Default (16:9) 기본(16:9) - + Force 4:3 강제 4:3 - + Force 21:9 강제 21:9 - + Force 16:10 강제 16:10 - + Stretch to Window 화면 늘리기 - + Automatic 자동 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 일본어(日本語) - + American English 미국식 영어 - + French (français) 프랑스어(français) - + German (Deutsch) 독일어(Deutsch) - + Italian (italiano) 이탈리아어(italiano) - + Spanish (español) 스페인어(español) - + Chinese 중국어 - + Korean (한국어) 한국어(Korean) - + Dutch (Nederlands) 네덜란드어(Nederlands) - + Portuguese (português) 포르투갈어(português) - + Russian (Русский) 러시아어(Русский) - + Taiwanese 대만어 - + British English 영국식 영어 - + Canadian French 캐나다 프랑스어 - + Latin American Spanish 라틴아메리카 스페인어 - + Simplified Chinese 중국어 간체 - + Traditional Chinese (正體中文) 중국어 번체(正體中文) - + Brazilian Portuguese (português do Brasil) 브라질 포르투갈어(português do Brasil) - + Polish (polska) 폴란드어(polska) - + Thai (แบบไทย) 태국어(แบบไทย) - - + + Japan 일본 - + USA 미국 - + Europe 유럽 - + Australia 호주 - + China 중국 - + Korea 대한민국 - + Taiwan 대만 - + Auto (%1) Auto select time zone 자동(%1) - + Default (%1) Default time zone 기본(%1) - + CET CET - + CST6CDT CST6CDT - + Cuba 쿠바 - + EET EET - + Egypt 이집트 - + Eire 아일랜드 - + EST EST - + EST5EDT EST5EDT - + GB 영국 - + GB-Eire 영국-아일랜드 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 그리니치 - + Hongkong 홍콩 - + HST HST - + Iceland 아이슬란드 - + Iran 이란 - + Israel 이스라엘 - + Jamaica 자메이카 - + Kwajalein 콰잘레인 - + Libya 리비아 - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo 나바호 - + NZ 뉴질랜드 - + NZ-CHAT 뉴질랜드-채텀 - + Poland 폴란드 - + Portugal 포르투갈 - + PRC 중국 - + PST8PDT PST8PDT - + ROC 대만 - + ROK 대한민국 - + Singapore 싱가포르 - + Turkey 터키 - + UCT UCT - + Universal 세계 - + UTC UTC - + W-SU 모스크바 - + WET WET - + Zulu Zulu - + Mono 모노 - + Stereo 스테레오 - + Surround 서라운드 - + 4GB DRAM (Default) 4GB DRAM(기본값) - + 6GB DRAM (Unsafe) 6GB DRAM(불안전) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM(불안전) - + 12GB DRAM (Unsafe) 12GB DRAM(불안전) - + Docked 독 모드 - + Handheld 휴대 모드 - - + + Normal 보통 - - + + Boost 부스트 - - + + Overclock 오버클럭 - + Always ask (Default) 항상 묻기(기본값) - + Only if game specifies not to stop 게임에서 멈추지 말라고 명시한 경우에만 - + Never ask 절대 묻지 않음 - + Very Small (16 MB) 아주 작은 크기(16 MB) - + Small (32 MB) 작은 크기(32 MB) - + Normal (128 MB) 보통 크기(128 MB) - + Large (256 MB) 큰 크기(256 MB) - + Very Large (512 MB) 아주 큰 크기(512 MB) - + Very Low (4 MB) 매우 낮은 크기(4 MB) - + Low (8 MB) 낮은 크기(8 MB) - + Normal (16 MB) 보통 크기(16 MB) - + Medium (32 MB) 중간 크기(32 MB) - + High (64 MB) 높은 크기(64 MB) - + Very Low (32) 매우 낮은 크기(32) - + Low (64) 낮은 크기(64) - + Normal (128) 보통 크기(128) - + Medium (256) 보통(256) - + High (512) 빠름(512) - + Disabled 비활성화됨 - + ExtendedDynamicState 1 확장된 동적 상태 1 - + ExtendedDynamicState 2 확장된 동적 상태 2 - + ExtendedDynamicState 3 확장된 동적 상태 3 - + Tree View 트리 보기 - + Grid View 격자 보기 @@ -3284,33 +3294,38 @@ Would you like to delete the old save data? 배경색: - + % FSR/SGSR sharpening percentage (e.g. 50%) % - + + Configure Effects... + + + + Off 끔 - + VSync Off 수직 동기화 끔 - + Recommended 권장 - + On 켬 - + VSync On 수직 동기화 켬 @@ -4936,102 +4951,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -7049,7 +7079,7 @@ Debug Message: - + &Pause 일시중지(&P) @@ -7200,7 +7230,7 @@ Debug Message: - + &Start 시작(&S) @@ -7211,7 +7241,7 @@ Debug Message: - + R&ecord 기록(&e) @@ -7302,7 +7332,7 @@ Debug Message: - + None 없음 @@ -7328,728 +7358,743 @@ Debug Message: 캐러셀 보기(&C) - + Small (32x32) 작은 크기(32x32) - + Standard (64x64) 기본 크기(64x64) - + Large (128x128) 큰 크기(128x128) - + Full Size (256x256) 전체 크기(256x256) - + Broken Vulkan Installation Detected 손상된 Vulkan 설치가 발견됨 - + Vulkan initialization failed during boot. 부팅 중 Vulkan 초기화에 실패했습니다. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping 게임 실행 중 - + Loading Web Applet... 웹 애플릿을 불러오는 중... - - + + Disable Web Applet 웹 애플릿 비활성화 - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) 웹 애플릿을 비활성화하면 예기치 않은 동작이 발생할 수 있으며 슈퍼 마리오 3D 컬렉션에서만 사용해야 합니다. 웹 애플릿을 비활성화하겠습니까? (디버그 설정에서 다시 활성화할 수 있습니다.) - + The amount of shaders currently being built 현재 구축 중인 셰이더 수 - + The current selected resolution scaling multiplier. 현재 선택된 해상도 조정 배율입니다. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. 현재 에뮬레이션 속도입니다. 100%보다 높거나 낮은 값은 에뮬레이션이 스위치보다 빠르거나 느리게 실행되고 있음을 나타냅니다. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. 현재 게임이 표시하는 초당 프레임 수입니다. 이 값은 게임 및 장면에 따라 다릅니다. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 프레임 제한이나 수직 동기화를 제외하고 스위치 프레임을 에뮬레이션하는 데 걸리는 시간입니다. 최고 속도 에뮬레이션의 경우 최대 16.67 밀리초입니다. - + Unmute 음소거 해제 - + Mute 음소거 - + Reset Volume 볼륨 재설정 - + + Configure Effects... + + + + &Clear Recent Files 최근 파일 지우기(&C) - + &Continue 재개(&C) - + Warning: Outdated Game Format 경고: 구식 게임 형식입니다 - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. 현재 이 게임에 대해 구형 형식인 분해된 ROM 디렉터리 형식을 사용하고 있습니다. 이 형식은 NCA, NAX, XCI 또는 NSP와 같은 다른 형식으로 대체되었습니다. 분해된 ROM 디렉터리에는 아이콘, 메타데이터 및 업데이트 지원 기능이 없습니다.<br>Eden에서 지원하는 다양한 스위치 형식에 대한 자세한 내용은 사용자 설명서를 참조해 주세요. 이 메시지는 다시 표시되지 않습니다. - - + + Error while loading ROM! ROM 불러오는 중 오류 발생! - + The ROM format is not supported. 해당 ROM 형식은 지원되지 않습니다. - + An error occurred initializing the video core. 비디오 코어 초기화 중 오류가 발생했습니다. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. ROM 불러오는 중 오류 발생! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>파일을 다시 덤프하거나 디스코드/Stoat에서 도움을 요청해 주세요. - + An unknown error occurred. Please see the log for more details. 알 수 없는 오류가 발생했습니다. 자세한 내용은 로그를 참조해 주세요. - - + + (64-bit) (64비트) - - + + (32-bit) (32비트) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... 소프트웨어 닫는 중... - + Save Data 저장 데이터 - + Mod Data 모드 데이터 - + Error Opening %1 Folder %1 폴더 여는 중 오류 발생 - - + + Folder does not exist! 폴더가 존재하지 않습니다! - + Remove Installed Game Contents? 설치된 게임 콘텐츠를 제거하겠습니까? - + Remove Installed Game Update? 설치된 게임 업데이트를 제거하겠습니까? - + Remove Installed Game DLC? 설치된 게임 DLC를 제거하겠습니까? - + Remove Entry 항목 제거 - + Delete OpenGL Transferable Shader Cache? OpenGL 이동 가능한 셰이더 캐시를 삭제하겠습니까? - + Delete Vulkan Transferable Shader Cache? Vulkan 이동 가능한 셰이더 캐시를 삭제하겠습니까? - + Delete All Transferable Shader Caches? 이동 가능한 셰이더 캐시를 모두 삭제하겠습니까? - + Remove Custom Game Configuration? 사용자 지정 게임 구성을 제거하겠습니까? - + Remove Cache Storage? 캐시 저장소를 제거하겠습니까? - + Remove File 파일 제거 - + Remove Play Time Data 플레이 시간 데이터 제거 - + Reset play time? 플레이 시간을 재설정하겠습니까? - - + + RomFS Extraction Failed! RomFS 추출 실패! - + There was an error copying the RomFS files or the user cancelled the operation. RomFS 파일을 복사하는 중에 오류가 발생했거나 사용자가 작업을 취소했습니다. - + Full 전체 - + Skeleton 뼈대 - + Select RomFS Dump Mode RomFS 덤프 모드 선택 - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. RomFS 덤프 방식을 선택해 주세요. 전체를 선택하면 모든 파일이 새 디렉터리로 복사되고, 뼈대를 선택하면 디렉터리 구조만 생성됩니다. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root %1 위치에 RomFS를 추출할 수 있는 여유 공간이 부족합니다. 공간을 확보하거나 에뮬레이션 > 구성 > 시스템 > 파일 시스템 > 덤프 경로에서 다른 덤프 디렉터리를 선택해 주세요. - + Extracting RomFS... RomFS 추출 중... - - + + Cancel 취소 - + RomFS Extraction Succeeded! RomFS 추출 성공! - + The operation completed successfully. 작업이 성공적으로 완료되었습니다. - + Error Opening %1 %1을(를) 여는 중 오류 발생 - + Select Directory 디렉터리 선택 - + Properties 속성 - + The game properties could not be loaded. 게임 속성을 불러올 수 없습니다. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. 스위치 실행 파일(%1);;모든 파일(*.*) - + Load File 파일 불러오기 - + Open Extracted ROM Directory 추출된 ROM 디렉터리 열기 - + Invalid Directory Selected 유효하지 않은 디렉터리 선택됨 - + The directory you have selected does not contain a 'main' file. 선택한 디렉터리에는 'main' 파일이 없습니다. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) 설치 가능한 스위치 파일(*.nca, *.nsp, *.xci);;닌텐도 콘텐츠 아카이브(*.nca);;닌텐도 제출 패키지(*.nsp);;NX 카트리지 이미지(*.xci) - + Install Files 파일 설치 - + %n file(s) remaining %n개 파일 남음 - + Installing file "%1"... "%1" 파일 설치 중... - - + + Install Results 설치 결과 - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. 잠재적인 충돌을 방지하기 위해 저희는 사용자가 기본 게임을 NAND에 설치하는 것은 권장하지 않습니다. 이 기능은 업데이트 및 DLC 설치에만 사용해 주세요. - + %n file(s) were newly installed %n개 파일이 새로 설치됨 - + %n file(s) were overwritten %n개 파일이 덮어쓰기됨 - + %n file(s) failed to install %n개 파일 설치 실패 - + System Application 시스템 애플리케이션 - + System Archive 시스템 아카이브 - + System Application Update 시스템 애플리케이션 업데이트 - + Firmware Package (Type A) 펌웨어 패키지(A타입) - + Firmware Package (Type B) 펌웨어 패키지(B타입) - + Game 게임 - + Game Update 게임 업데이트 - + Game DLC 게임 DLC - + Delta Title 델타 타이틀 - + Select NCA Install Type... NCA 설치 유형 선택... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) 이 NCA를 설치할 타이틀 유형을 선택해 주세요: (대부분의 경우 기본값인 '게임'을 선택하면 됩니다.) - + Failed to Install 설치 실패 - + The title type you selected for the NCA is invalid. NCA에 대해 선택한 타이틀 유형이 유효하지 않습니다. - + File not found 파일을 찾을 수 없음 - + File "%1" not found "%1" 파일을 찾을 수 없음 - + OK 확인 - + Function Disabled 기능 비활성화됨 - + Compatibility list reporting is currently disabled. Check back later! 호환성 목록 보고 옵션이 현재 비활성화되어 있습니다. 나중에 다시 확인해 주세요! - + Error opening URL URL 여는 중 오류 발생 - + Unable to open the URL "%1". "%1" URL을 열 수 없습니다. - + TAS Recording TAS 녹화 - + Overwrite file of player 1? 플레이어 1의 파일을 덮어쓰겠습니까? - + Invalid config detected 무효한 구성이 발견됨 - + Handheld controller can't be used on docked mode. Pro controller will be selected. 휴대 모드 컨트롤러는 독 모드에서 사용할 수 없습니다. Pro 컨트롤러로 선택됩니다. - - + + Amiibo Amiibo - - + + The current amiibo has been removed 현재 amiibo가 제거됨 - + Error 오류 - - + + The current game is not looking for amiibos 현재 게임은 amiibo를 찾고 있지 않습니다 - + Amiibo File (%1);; All Files (*.*) Amiibo 파일(%1);; 모든 파일(*.*) - + Load Amiibo Amiibo 불러오기 - + Error loading Amiibo data Amiibo 데이터 불러오는 중 오류 발생 - + The selected file is not a valid amiibo 선택한 파일은 유효한 amiibo가 아닙니다 - + The selected file is already on use 선택한 파일은 이미 사용 중입니다 - + An unknown error occurred 알 수 없는 오류 발생 - + No firmware available 사용 가능한 펌웨어 없음 - + Firmware Corrupted 펌웨어 손상됨 - + Unknown applet 알 수 없는 애플릿 - + Applet doesn't map to a known value. 애플릿이 알려진 값에 매핑되지 않습니다. - + Record not found 기록을 찾을 수 없음 - + Applet not found. Please reinstall firmware. 애플릿을 찾을 수 없습니다. 펌웨어를 다시 설치해 주세요. - + Capture Screenshot 스크린샷 캡처 - + PNG Image (*.png) PNG 이미지(*.png) - + TAS state: Running %1/%2 TAS 상태: %1/%2 실행 중 - + TAS state: Recording %1 TAS 상태: %1 녹화 중 - + TAS state: Idle %1/%2 TAS 상태: %1/%2 유휴 - + TAS State: Invalid TAS 상태: 무효 - + &Stop Running 실행 중지(&S) - + Stop R&ecording 녹화 중지(&e) - + Building: %n shader(s) 구축 중: %n개 셰이더 - + Scale: %1x %1 is the resolution scaling factor 크기: %1x - + Speed: %1% / %2% 속도: %1% / %2% - + Speed: %1% 속도: %1% - + Game: %1 FPS 게임: %1 FPS - + Frame: %1 ms 프레임: %1 밀리초 - + NO AA AA 없음 - + + NO FX + + + + + FX + + + + VOLUME: MUTE 볼륨: 음소거 - + VOLUME: %1% Volume percentage (e.g. 50%) 볼륨: %1% - + Derivation Components Missing 파생 구성 요소 누락 - + Decryption keys are missing. Install them now? 복호화 키가 없습니다. 지금 설치하겠습니까? - + Wayland Detected! Wayland 발견됨! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8060,74 +8105,74 @@ Would you like to force it for future launches? 향후 출시를 위해 Wayland 사용을 강제하겠습니까? - + Use X11 X11 사용 - + Continue with Wayland Wayland와 계속 - + Don't show again 다시 보지 않기 - + Restart Required 재시작이 필요함 - + Restart Eden to apply the X11 backend. X11 백엔드를 적용하려면 Eden을 다시 시작하세요. - + Slow 저속 - + Turbo 터보 - + Unlocked 제한 해제 - + Select RomFS Dump Target RomFS 덤프 대상 선택 - + Please select which RomFS you would like to dump. 덤프할 RomFS를 선택하세요. - + Are you sure you want to close Eden? 정말 Eden을 닫겠습니까? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. 정말 에뮬레이션을 중지하겠습니까? 저장되지 않은 진행 상황은 모두 손실됩니다. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index 5b5d8d6ba4..0965db5041 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -571,70 +571,80 @@ FXAA can produce a more stable picture in lower resolutions. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Fullskjermmodus: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Bildeforhold: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC-emulering: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +653,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: VSync-modus: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -699,79 +709,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Aktiver asynkron presentasjon (kun Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) Tving maksikal klokkehastighet (kun Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Kjører arbeid i bakgrunnen mens den venter på grafikkommandoer for å forhindre at GPU-en senker klokkehastigheten. - + Anisotropic Filtering: Anisotropisk filtrering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: GPU-modus: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: DMA-nøyaktighet: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -781,1327 +791,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Bruk Vulkan-rørledningsbuffer - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Aktiver Reaktiv Tømming - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback Synkroniser med bildefrekvensen for videoavspilling - + Run the game at normal speed during video playback, even when the framerate is unlocked. Kjør spillet i normal hastighet under videoavspilling, selv når bildefrekvensen er låst opp. - + Barrier feedback loops Tilbakekoblingssløyfer for barrierer - + Improves rendering of transparency effects in specific games. Forbedrer gjengivelsen av transparenseffekter i spesifikke spill. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG-frø - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Enhetsnavn - + The name of the console. Konsollens navn. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Selvvalgt RTC-dato: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Språk: - + This option can be overridden when region setting is auto-select - + Region: Region: - + The region of the console. Konsollens region. - + Time Zone: Tidssone: - + The time zone of the console. Konsollens tidssone. - + Sound Output Mode: Lydutdatamodus: - + Console Mode: Konsollmodus: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Bekreft før stopping av emulering - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Gjem mus under inaktivitet - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Deaktiver kontroller-appleten - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates Se etter oppdateringer - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never Aldri - + On Load - + Always Alltid - + CPU CPU - + GPU Skjermkort - + CPU Asynchronous - + Uncompressed (Best quality) Ukomprimert (Best kvalitet) - + BC1 (Low quality) BC1 (Lav kvalitet) - + BC3 (Medium quality) BC3 (Middels kvalitet) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (eksperimentelt, kun AMD/Mesa) - + Null Null - + Fast Rask - - - + + + Accurate Nøyaktig - - - + + + Default Standard - + Unsafe (fast) Utrygg (raskt) - + Safe (stable) Trygg (stabil) - + Immediate - + Balanced Balansert - + Strict - + Unsafe Utrygt - + Paranoid (disables most optimizations) Paranoid (deaktiverer de fleste optimaliseringer) - + Debugging - + Dynarmic - + NCE NCE - + Borderless Windowed Rammeløst vindu - + Exclusive Fullscreen Eksklusiv fullskjerm - + No Video Output Ingen videoutdata - + CPU Video Decoding CPU-videodekoding - + GPU Video Decoding (Default) GPU-videodekoding (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0,25× (180p/270p) [EKSPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5× (360p/540p) [EKSPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75× (540p/810p) [EKSPERIMENTELL] - + 1X (720p/1080p) 1× (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1,25× (900p/1350p) [EKSPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1,5× (1080p/1620p) [EKSPERIMENTELL] - + 2X (1440p/2160p) 2× (1440p/2160p) - + 3X (2160p/3240p) 3× (2160p/3240p) - + 4X (2880p/4320p) 4× (2880p/4320p) - + 5X (3600p/5400p) 5× (3600p/5400p) - + 6X (4320p/6480p) 6× (4320p/6480p) - + 7X (5040p/7560p) 7× (5040p/7560p) - + 8X (5760p/8640p) 8× (5760p/8640p) - + Nearest Neighbor Nærmeste nabo - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gaussisk - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Område - + MMPX MMPX - + Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tving 4:3 - + Force 21:9 Tving 21:9 - + Force 16:10 Tving 16:10 - + Stretch to Window Strekk til vinduet - + Automatic Automatisk - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japansk (日本語) - + American English Amerikansk engelsk - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Nederlandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwansk - + British English Britisk engelsk - + Canadian French Kanadisk fransk - + Latin American Spanish Latinamerikansk spansk - + Simplified Chinese Forenklet kinesisk - + Traditional Chinese (正體中文) Tradisjonell kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisisk (português do Brasil) - + Polish (polska) Polsk (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australia - + China Folkerepublikken Kina - + Korea Korea - + Taiwan Taiwan (Republikken Kina) - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET Sentraleuropeisk tid - + CST6CDT CST6CDT - + Cuba Cuba - + EET Østeuropeisk tid - + Egypt Egypt - + Eire Republikken Irland - + EST EST - + EST5EDT EST5EDT - + GB Storbritannia - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC Folkerepublikken Kina - + PST8PDT PST8PDT - + ROC Taiwan (Republikken Kina) - + ROK Sør-Korea - + Singapore Singapore - + Turkey Tyrkia - + UCT UCT - + Universal Universalt - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (Utrygt) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (Utrygt) - + 12GB DRAM (Unsafe) 12 GB DRAM (Utrygt) - + Docked I dokking - + Handheld Håndholdt - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Spør alltid (Standard) - + Only if game specifies not to stop - + Never ask Aldri spør - + Very Small (16 MB) Veldig liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Veldig stor (512 MB) - + Very Low (4 MB) Veldig lav (4 MB) - + Low (8 MB) Lav (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Middels (32 MB) - + High (64 MB) Høy (64 MB) - + Very Low (32) Svært lav (32) - + Low (64) Lav (64) - + Normal (128) Normal (128) - + Medium (256) Middels (256) - + High (512) Høy (512) - + Disabled Skrudd av - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3201,33 +3211,38 @@ Would you like to delete the old save data? Bakgrunnsfarge: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off Av - + VSync Off VSync Av - + Recommended Anbefalt - + On På - + VSync On VSync På @@ -4849,102 +4864,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6958,7 +6988,7 @@ Debug Message: - + &Pause &Pause @@ -7109,7 +7139,7 @@ Debug Message: - + &Start &Start @@ -7120,7 +7150,7 @@ Debug Message: - + R&ecord T&a opp @@ -7211,7 +7241,7 @@ Debug Message: - + None Ingen @@ -7237,722 +7267,737 @@ Debug Message: - + Small (32x32) Liten (32x32) - + Standard (64x64) Standard (64x64) - + Large (128x128) Stor (128x128) - + Full Size (256x256) Full størrelse (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Kjører et spill - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Slå på lyd - + Mute Demp - + Reset Volume Tilbakestill volum - + + Configure Effects... + + + + &Clear Recent Files &Tøm nylige filer - + &Continue &Fortsett - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... Lukker programvare ... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! Mappen finnes ikke! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File Fjern fil - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full Full - + Skeleton Skjelett - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... Utvinner RomFS... - - + + Cancel Avbryt - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory Velg mappe - + Properties Egenskaper - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... Installerer filen «%1» ... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application Systemapp - + System Archive Systemarkiv - + System Application Update - + Firmware Package (Type A) Fastvarepakke (Type A) - + Firmware Package (Type B) Fastvarepakke (Type B) - + Game Spill - + Game Update Spilloppdatering - + Game DLC Spill-DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found Filen ble ikke funnet - + File "%1" not found - + OK OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL Feil under åpning av URL - + Unable to open the URL "%1". - + TAS Recording TAS-opptak - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo amiibo - - + + The current amiibo has been removed - + Error Feil - - + + The current game is not looking for amiibos Det nåværende spillet ser ikke etter amiiboer - + Amiibo File (%1);; All Files (*.*) amiibo-fil (%1);; Alle filer (*.*) - + Load Amiibo Last inn amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available Ingen fastvare tilgjengelig - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot Ta skjermklipp - + PNG Image (*.png) PNG-bilde (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Hastighet: %1% / %2% - + Speed: %1% Hastighet: %1% - + Game: %1 FPS Spill: %1 FPS - + Frame: %1 ms Ramme: %1 ms - + NO AA INGEN AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE VOLUM: DEMP - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUM: %1% - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7960,74 +8005,74 @@ Would you like to force it for future launches? - + Use X11 Bruk X11 - + Continue with Wayland - + Don't show again Ikke vis igjen - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow Treg - + Turbo Turbo - + Unlocked Ubegrenset - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index 3e2831b876..6a6f9b21b3 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -578,70 +578,80 @@ FXAA can produce a more stable picture in lower resolutions. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Volledig scherm modus: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Aspect Ratio: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC-emulatie: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: ASTC Decodeer Methode: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -650,55 +660,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: VSync-modus: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -706,79 +716,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Schakel asynchrone presentatie in (alleen Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) Forceer maximale klokken (alleen Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Werkt op de achtergrond terwijl er wordt gewacht op grafische opdrachten om te voorkomen dat de GPU zijn kloksnelheid verlaagt. - + Anisotropic Filtering: Anisotrope Filtering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -788,1327 +798,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Gebruik Vulkan-pijplijn-cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Schakel Reactive Flushing In - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Apparaatnaam - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Aangepaste RTC Datum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Taal: - + This option can be overridden when region setting is auto-select - + Region: Regio: - + The region of the console. - + Time Zone: Tijdzone: - + The time zone of the console. - + Sound Output Mode: Geluidsuitvoermodus: - + Console Mode: Console Modus: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Bevestig voordat u de emulatie stopt - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Verberg muis wanneer inactief - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Controller-applet uitschakelen - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) BC1 (Lage Kwaliteit) - + BC3 (Medium quality) BC3 (Gemiddelde kwaliteit) - - + + Auto Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Accuraat - - - + + + Default Standaard - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Onveilig - + Paranoid (disables most optimizations) Paranoid (schakelt de meeste optimalisaties uit) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Randloos Venster - + Exclusive Fullscreen Exclusief Volledig Scherm - + No Video Output Geen Video-uitvoer - + CPU Video Decoding CPU Videodecodering - + GPU Video Decoding (Default) GPU Videodecodering (Standaard) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTEEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTEEL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Geen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standaart (16:9) - + Force 4:3 Forceer 4:3 - + Force 21:9 Forceer 21:9 - + Force 16:10 Forceer 16:10 - + Stretch to Window Uitrekken naar Venster - + Automatic Automatisch - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japans (日本語) - + American English Amerikaans-Engels - + French (français) Frans (Français) - + German (Deutsch) Duits (Deutsch) - + Italian (italiano) Italiaans (italiano) - + Spanish (español) Spaans (Español) - + Chinese Chinees - + Korean (한국어) Koreaans (한국어) - + Dutch (Nederlands) Nederlands (Nederlands) - + Portuguese (português) Portugees (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanese - + British English Brits-Engels - + Canadian French Canadees-Frans - + Latin American Spanish Latijns-Amerikaans Spaans - + Simplified Chinese Vereenvoudigd Chinees - + Traditional Chinese (正體中文) Traditioneel Chinees (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliaans-Portugees (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australië - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standaard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Ijsland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libië - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkije - + UCT UCT - + Universal Universeel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3196,33 +3206,38 @@ Would you like to delete the old save data? Achtergrondkleur: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off Uit - + VSync Off VSync Uit - + Recommended Aanbevolen - + On Aan - + VSync On VSync Aan @@ -4844,102 +4859,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6954,7 +6984,7 @@ Debug Message: - + &Pause &Onderbreken @@ -7105,7 +7135,7 @@ Debug Message: - + &Start &Start @@ -7116,7 +7146,7 @@ Debug Message: - + R&ecord Opnemen @@ -7207,7 +7237,7 @@ Debug Message: - + None @@ -7233,722 +7263,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7956,74 +8001,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/pl.ts b/dist/languages/pl.ts index 14da962f1a..6ab9b388b4 100644 --- a/dist/languages/pl.ts +++ b/dist/languages/pl.ts @@ -592,12 +592,22 @@ SMAA oferuje najlepszą jakość. FXAA może zapewnić stabilniejszy obraz w niższych rozdzielczościach. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Tryb Pełnoekranowy: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -606,12 +616,12 @@ Tryb bez ramek zapewnia najlepszą zgodność z klawiaturą ekranową wymaganą Pełny ekran wyłączny może oferować lepszą wydajność i lepsze wsparcie FreeSync/G-Sync. - + Aspect Ratio: Format obrazu: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -620,35 +630,35 @@ Większość gier obsługuje wyłącznie 16:9, więc inne proporcje wymagają mo Kontroluje także proporcje przechwytywanych zrzutów ekranu. - + Use persistent pipeline cache Używaj trwałej pamięci podręcznej (cache) potoków - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Pozwala zapisywać shadery w pamięci masowej, aby przyspieszyć ładowanie przy kolejnych uruchomieniach gry. Wyłączanie tej opcji jest przeznaczone do debugowania. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Emulacja NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -657,12 +667,12 @@ Dekodowanie może być wykonywane przez CPU albo GPU, albo może być całkowici W większości przypadków najlepszą wydajność zapewnia dekodowanie na GPU. - + ASTC Decoding Method: Metoda dekodowania ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -674,12 +684,12 @@ GPU: użyj shaderów obliczeniowych GPU do dekodowania tekstur ASTC (zalecane). CPU asynchronicznie: użyj CPU do dekodowania na żądanie. Eliminuje zacięcia podczas dekodowania ASTC, ale może powodować artefakty. - + ASTC Recompression Method: Metoda rekompresji ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -687,44 +697,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3: format pośredni zostanie ponownie skompresowany do BC1 lub BC3 — oszczędza VRAM kosztem jakości obrazu. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: Tryb wykorzystania VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Określa, czy emulator ma oszczędzać pamięć, czy maksymalnie wykorzystywać dostępną pamięć wideo dla wydajności. Tryb agresywny może pogorszyć działanie innych aplikacji, np. oprogramowania do nagrywania. - + Skip CPU Inner Invalidation Pomiń wewnętrzne unieważnienie procesora CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Pomija niektóre unieważnienia pamięci podręcznej po stronie CPU podczas aktualizacji pamięci, zmniejszając użycie CPU i poprawiając jego wydajność. Może powodować błędy lub awarie w niektórych grach. - + VSync Mode: Tryb synchronizacji pionowej: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -735,12 +745,12 @@ Mailbox może mieć niższe opóźnienia niż FIFO i nie powoduje tearingu, ale Immediate (bez synchronizacji) wyświetla wszystko, co jest dostępne, i może powodować tearing. - + Sync Memory Operations Synchronizuj operacje pamięci - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -748,68 +758,68 @@ Unreal Engine 4 games often see the most significant changes thereof. Gry z Unreal Engine 4 mogą być najbardziej dotknięte. - + Enable asynchronous presentation (Vulkan only) Włącz asynchroniczną prezentację (tylko Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Nieznacznie poprawia wydajność, przenosząc prezentację na oddzielny wątek CPU. - + Force maximum clocks (Vulkan only) Wymuś maksymalne zegary (Tylko Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Uruchamia pracę w tle podczas oczekiwania na komendy graficzne aby GPU nie obniżało taktowania. - + Anisotropic Filtering: Filtrowanie anizotropowe: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Steruje jakością renderowania tekstur pod ostrymi kątami. Na większości GPU bezpieczną wartością jest 16x. - + GPU Mode: Tryb GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Dokładność DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -819,100 +829,100 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Włącz asynchroniczną kompilację shaderów - + May reduce shader stutter. Może zmniejszyć zacięcia spowodowane kompilacją shaderów. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Użyj pamięci podręcznej strumienia dla Vulkana - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Włącza specyficzną dla producenta GPU pamięć podręczną potoków. Ta opcja może znacząco skrócić czas ładowania shaderów w przypadkach, gdy sterownik Vulkan nie przechowuje wewnętrznie plików pamięci podręcznej potoków. - + Enable Compute Pipelines (Intel Vulkan Only) Włącz potoki obliczeniowe (tylko Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -921,192 +931,192 @@ To ustawienie istnieje wyłącznie dla sterowników Intela i może spowodować b Na wszystkich pozostałych sterownikach potoki obliczeniowe są zawsze włączone. - + Enable Reactive Flushing Włącz reaktywne opróżnianie buforów - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Używa opróżniania reaktywnego zamiast predykcyjnego, co umożliwia dokładniejsze synchronizowanie pamięci. - + Sync to framerate of video playback Synchronizuj do liczby klatek odtwarzanego wideo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Uruchamiaj grę z normalną prędkością podczas odtwarzania wideo, nawet przy odblokowanej liczbie klatek na sekundę. - + Barrier feedback loops Pętle sprzężenia zwrotnego barier - + Improves rendering of transparency effects in specific games. Poprawia renderowanie efektów przezroczystości w niektórych grach. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State Rozszerzony stan dynamiczny - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Kontroluje liczbę funkcji, które mogą być używane w Extended Dynamic State. Wyższe poziomy pozwalają na użycie większej liczby funkcji i mogą zwiększyć wydajność, ale mogą powodować dodatkowe problemy z grafiką. - + Vertex Input Dynamic State Dynamiczny stan wejścia wierzchołków - + Enables vertex input dynamic state feature for better quality and performance. Włącza funkcję dynamicznego stanu wejścia wierzchołków, poprawiając jakość i wydajność. - + Sample Shading Cieniowanie próbkowe - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Pozwala wykonywać shader fragmentów dla każdej próbki we fragmencie wielokrotnie próbkowanym zamiast raz dla każdego fragmentu. Poprawia jakość grafiki kosztem wydajności. Wyższe wartości poprawiają jakość, ale obniżają wydajność. - + RNG Seed Ziarno RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Ustala ziarno generatora liczb losowych. Głównie używane do speedrunów. - + Device Name Nazwa urządzenia - + The name of the console. The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Własna data RTC - + This option allows to change the clock of the console. Can be used to manipulate time in games. Ta opcja pozwala zmienić zegar konsoli. Może służyć do manipulowania czasem w grach. - + The number of seconds from the current unix time Liczba sekund od bieżącego czasu Unix - + Language: Język: - + This option can be overridden when region setting is auto-select Ta opcja może zostać nadpisana, gdy ustawienie regionu to automatyczny wybór. - + Region: Region: - + The region of the console. Region konsoli. - + Time Zone: Strefa czasowa: - + The time zone of the console. Strefa czasowa konsoli. - + Sound Output Mode: Tryb wyjścia dźwięku: - + Console Mode: Tryb konsoli - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1115,1042 +1125,1042 @@ W zależności od tego ustawienia gry zmienią swoją rozdzielczość, szczegó Ustawienie na Handheld może poprawić wydajność na słabszych komputerach. - + Prompt for user profile on boot Pytaj o profil użytkownika przy uruchomieniu. - + Useful if multiple people use the same PC. Przydatne, gdy z tego samego PC korzysta wiele osób. - + Pause when not in focus Wstrzymuj, gdy okno nie jest aktywne - + Pauses emulation when focusing on other windows. Wstrzymuje emulację po przełączeniu na inne okna. - + Confirm before stopping emulation Potwierdzaj przed zatrzymaniem emulacji - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Nadpisuje monity z prośbą o potwierdzenie zatrzymania emulacji. Włączenie powoduje pominięcie takich monitów i bezpośrednie wyjście z emulacji. - + Hide mouse on inactivity Ukryj mysz przy braku aktywności - + Hides the mouse after 2.5s of inactivity. Ukrywa kursor po 2,5 s bezczynności. - + Disable controller applet Wyłącz aplet kontrolera - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Wymusza wyłączenie użycia apletu kontrolera w oprogramowaniu uruchamianym w emulacji. Jeśli emulowane oprogramowanie próbuje otworzyć aplet kontrolera, jest on natychmiast zamykany. - + Check for updates Sprawdź aktualizacje - + Whether or not to check for updates upon startup. Czy sprawdzać aktualizacje przy uruchomieniu. - + Enable Gamemode Włącz Tryb gry - + Force X11 as Graphics Backend Wymuś X11 jako backend grafiki - + Custom frontend Niestandardowy frontend - + Real applet Prawdziwy aplet - + Never Nigdy - + On Load Przy wczytywaniu - + Always Zawsze - + CPU CPU - + GPU GPU - + CPU Asynchronous Asynchroniczne CPU - + Uncompressed (Best quality) Brak (najlepsza jakość) - + BC1 (Low quality) BC1 (niska jakość) - + BC3 (Medium quality) BC3 (średnia jakość) - - + + Auto Automatyczny - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Konserwatywny - + Aggressive Agresywny - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast Szybkie - - - + + + Accurate Dokładny - - - + + + Default Domyślny - + Unsafe (fast) Niezalecane (szybkie) - + Safe (stable) Bezpieczne (stabilne) - + Immediate - + Balanced Zrównoważony - + Strict - + Unsafe Niebezpieczny - + Paranoid (disables most optimizations) Paranoiczne (wyłącza większość optymalizacji) - + Debugging Debugowanie - + Dynarmic Dynamiczny - + NCE NCE - + Borderless Windowed W oknie (Bezramkowy) - + Exclusive Fullscreen Exclusive Fullscreen - + No Video Output Brak wyjścia wideo - + CPU Video Decoding Dekodowanie Wideo przez CPU - + GPU Video Decoding (Default) Dekodowanie Wideo przez GPU (Domyślne) - + 0.25X (180p/270p) [EXPERIMENTAL] 0,25x (180p/270p) [EKSPERYMENTALNE] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5x (360p/540p) [EKSPERYMENTALNE] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EKSPERYMENTALNE] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EKSPERYMENTALNE] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [Ekperymentalnie] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Najbliższy sąsiadujący - + Bilinear Bilinearny - + Bicubic Bikubiczny - + Gaussian Kulisty - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Obszar - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Żadna (wyłączony) - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Domyślne (16:9) - + Force 4:3 Wymuś 4:3 - + Force 21:9 Wymuś 21:9 - + Force 16:10 Wymuś 16:10 - + Stretch to Window Rozciągnij do Okna - + Automatic Automatyczne - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japoński (日本語) - + American English Angielski Amerykański - + French (français) Francuski (français) - + German (Deutsch) Niemiecki (Niemcy) - + Italian (italiano) Włoski (italiano) - + Spanish (español) Hiszpański (español) - + Chinese Chiński - + Korean (한국어) Koreański (한국어) - + Dutch (Nederlands) Duński (Holandia) - + Portuguese (português) Portugalski (português) - + Russian (Русский) Rosyjski (Русский) - + Taiwanese Tajwański - + British English Angielski Brytyjski - + Canadian French Fancuski (Kanada) - + Latin American Spanish Hiszpański (Latin American) - + Simplified Chinese Chiński (Uproszczony) - + Traditional Chinese (正體中文) Chiński tradycyjny (正體中文) - + Brazilian Portuguese (português do Brasil) Portugalski (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonia - + USA USA - + Europe Europa - + Australia Australia - + China Chiny - + Korea Korea - + Taiwan Tajwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Domyślne (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipt - + Eire Irlandia - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Izrael - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polska - + Portugal Portugalia - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turcja - + UCT UCT - + Universal Uniwersalny - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Domyślne) - + 6GB DRAM (Unsafe) 6GB DRAM (NIebezpieczne) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (NIebezpieczne) - + 12GB DRAM (Unsafe) 12GB DRAM (NIebezpieczne) - + Docked Zadokowany - + Handheld Przenośnie - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Zawsze pytaj (Domyślne) - + Only if game specifies not to stop Tylko jeśli gra określa, aby nie zatrzymywać - + Never ask Nie pytaj więcej - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Średnie (256) - + High (512) Wysokie (512) - + Disabled Wyłączone - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3260,33 +3270,38 @@ Czy chcesz usunąć stare dane zapisu? Kolor tła - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off Wyłączone - + VSync Off VSync wyłączony - + Recommended Zalecane - + On Włączone - + VSync On VSync aktywny @@ -4908,102 +4923,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -7021,7 +7051,7 @@ Komunikat debugowania: - + &Pause &Pauza @@ -7172,7 +7202,7 @@ Komunikat debugowania: - + &Start &Start @@ -7183,7 +7213,7 @@ Komunikat debugowania: - + R&ecord &Nagraj @@ -7274,7 +7304,7 @@ Komunikat debugowania: - + None Żadna (wyłączony) @@ -7300,401 +7330,406 @@ Komunikat debugowania: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected Wykryto uszkodzoną instalację Vulkan - + Vulkan initialization failed during boot. Inicjalizacja Vulkana nie powiodła się podczas uruchamiania. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Gra uruchomiona - + Loading Web Applet... Ładowanie apletu internetowego... - - + + Disable Web Applet Wyłącz Aplet sieciowy - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Wyłączenie apletu sieciowego może prowadzić do nieprzewidywalnego działania i powinno być używane wyłącznie z Super Mario 3D All-Stars. Na pewno chcesz wyłączyć aplet sieciowy? (Tę opcję można ponownie włączyć w ustawieniach debugowania). - + The amount of shaders currently being built Liczba shaderów aktualnie budowanych - + The current selected resolution scaling multiplier. Aktualnie wybrany mnożnik skalowania rozdzielczości. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Bieżąca prędkość emulacji. Wartości wyższe lub niższe niż 100% oznaczają, że emulacja działa odpowiednio szybciej lub wolniej niż na Switchu. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Liczba klatek na sekundę aktualnie wyświetlanych przez grę. Wartość ta zależy od gry oraz od konkretnej sceny. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Czas potrzebny na emulację jednej klatki Switcha, bez uwzględniania ogranicznika klatek i synchronizacji pionowej. Dla emulacji z pełną prędkością powinno to być maksymalnie 16,67 ms. - + Unmute Wyłącz wyciszenie - + Mute Wycisz - + Reset Volume Zresetuj głośność - + + Configure Effects... + + + + &Clear Recent Files &Usuń Ostatnie pliki - + &Continue &Kontynuuj - + Warning: Outdated Game Format Ostrzeżenie: Nieaktualny format gry - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Używasz dla tej gry formatu katalogu zdekonstruowanego ROM-u, który jest przestarzały i został zastąpiony innymi formatami, takimi jak NCA, NAX, XCI czy NSP. Katalogi takich ROM-ów nie zawierają ikon, metadanych ani nie obsługują aktualizacji.<br>Aby uzyskać wyjaśnienie dotyczące różnych formatów Switcha obsługiwanych przez Eden, zajrzyj do naszego podręcznika użytkownika. Ten komunikat nie zostanie wyświetlony ponownie. - - + + Error while loading ROM! Błąd podczas wczytywania ROMu! - + The ROM format is not supported. Ten format ROMu nie jest wspierany. - + An error occurred initializing the video core. Wystąpił błąd podczas inicjowania rdzenia wideo. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Błąd podczas wczytywania ROMu! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Proszę ponownie zrzucić pliki lub poprosić o pomoc na Discordzie/Stoat. - + An unknown error occurred. Please see the log for more details. Wystąpił nieznany błąd. Więcej informacji można znaleźć w pliku log. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Zamykanie aplikacji... - + Save Data Zapis danych - + Mod Data Dane modów - + Error Opening %1 Folder Błąd podczas otwierania folderu %1 - - + + Folder does not exist! Folder nie istnieje! - + Remove Installed Game Contents? Usunąć zainstalowaną zawartość gry? - + Remove Installed Game Update? Usunąć zainstalowaną aktualizację gry? - + Remove Installed Game DLC? Usunąć zainstalowane DLC gry? - + Remove Entry Usuń wpis - + Delete OpenGL Transferable Shader Cache? Usunąć przenośną pamięć podręczną shaderów OpenGL? - + Delete Vulkan Transferable Shader Cache? Usunąć przenośną pamięć podręczną shaderów Vulkan? - + Delete All Transferable Shader Caches? Usunąć wszystkie przenośne pamięci podręczne shaderów? - + Remove Custom Game Configuration? Usunąć niestandardową konfigurację gry? - + Remove Cache Storage? Usunąć pamięć podręczną? - + Remove File Usuń plik - + Remove Play Time Data Usuń dane czasu gry - + Reset play time? Zresetować czas gry? - - + + RomFS Extraction Failed! Wyodrębnianie RomFS nie powiodło się! - + There was an error copying the RomFS files or the user cancelled the operation. Wystąpił błąd podczas kopiowania plików RomFS lub użytkownik przerwał operację. - + Full Pełny - + Skeleton Szkielet - + Select RomFS Dump Mode Wybierz tryb zrzutu RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Wybierz sposób wykonania zrzutu RomFS. <br>Tryb „Pełny” skopiuje wszystkie pliki do nowego katalogu, <br>natomiast „Szkielet” utworzy jedynie strukturę katalogów. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Nie ma wystarczająco miejsca w %1 aby wyodrębnić RomFS. Zwolnij trochę miejsca, albo zmień ścieżkę zrzutu RomFs w Emulacja > Konfiguruj > System > System Plików > Źródło Zrzutu - + Extracting RomFS... Wypakowywanie RomFS... - - + + Cancel Anuluj - + RomFS Extraction Succeeded! Wypakowanie RomFS zakończone pomyślnie! - + The operation completed successfully. Operacja zakończona pomyślnie. - + Error Opening %1 Błąd podczas otwierania %1 - + Select Directory Wybierz folder - + Properties Właściwości - + The game properties could not be loaded. Właściwości tej gry nie mogły zostać załadowane. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Plik wykonywalny Switcha (%1);;Wszystkie pliki (*.*) - + Load File Załaduj plik - + Open Extracted ROM Directory Otwórz folder wypakowanego ROMu - + Invalid Directory Selected Wybrano niewłaściwy folder - + The directory you have selected does not contain a 'main' file. Wybrany folder nie zawiera 'głównego' pliku. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Instalacyjne pliki Switch'a (*.nca *.nsp *.xci);;Archiwum zawartości Nintendo (*.nca);;Pakiet poddany Nintendo (*.nsp);;Obraz z kartridża NX (*.xci) - + Install Files Zainstaluj pliki - + %n file(s) remaining Pozostał %n plikPozostały %n plikiPozostało %n plikówPozostało %n plików - + Installing file "%1"... Instalowanie pliku "%1"... - - + + Install Results Wynik instalacji - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Aby uniknąć ewentualnych konfliktów, odradzamy użytkownikom instalowanie gier na NAND. Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + %n file(s) were newly installed %n plik został nowo zainstalowany @@ -7704,7 +7739,7 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + %n file(s) were overwritten %n plik został nadpisany @@ -7714,7 +7749,7 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + %n file(s) failed to install Nie udało się zainstalować %n pliku @@ -7724,314 +7759,324 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + System Application Aplikacja systemowa - + System Archive Archiwum systemu - + System Application Update Aktualizacja aplikacji systemowej - + Firmware Package (Type A) Paczka systemowa (Typ A) - + Firmware Package (Type B) Paczka systemowa (Typ B) - + Game Gra - + Game Update Aktualizacja gry - + Game DLC Dodatek do gry - + Delta Title Tytuł Delta - + Select NCA Install Type... Wybierz typ instalacji NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Wybierz typ tytułu, do którego chcesz zainstalować ten NCA, jako: (W większości przypadków domyślna "gra" jest w porządku.) - + Failed to Install Instalacja nieudana - + The title type you selected for the NCA is invalid. Typ tytułu wybrany dla NCA jest nieprawidłowy. - + File not found Nie znaleziono pliku - + File "%1" not found Nie znaleziono pliku "%1" - + OK OK - + Function Disabled Funkcja wyłączona - + Compatibility list reporting is currently disabled. Check back later! Zgłaszanie do listy kompatybilności jest obecnie wyłączone. Spróbuj ponownie później! - + Error opening URL Błąd otwierania adresu URL - + Unable to open the URL "%1". Nie można otworzyć adresu URL "%1". - + TAS Recording Nagrywanie TAS - + Overwrite file of player 1? Nadpisać plik gracza 1? - + Invalid config detected Wykryto nieprawidłową konfigurację - + Handheld controller can't be used on docked mode. Pro controller will be selected. Nie można używać kontrolera handheld w trybie zadokowanym. Zostanie wybrany kontroler Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Amiibo zostało "zdjęte" - + Error Błąd - - + + The current game is not looking for amiibos Ta gra nie szuka amiibo - + Amiibo File (%1);; All Files (*.*) Plik Amiibo (%1);;Wszyskie pliki (*.*) - + Load Amiibo Zamontuj Amiibo - + Error loading Amiibo data Błąd podczas ładowania danych Amiibo - + The selected file is not a valid amiibo Wybrany plik nie jest poprawnym amiibo - + The selected file is already on use Wybrany plik jest już w użyciu - + An unknown error occurred Wystąpił nieznany błąd - + No firmware available Brak dostępnego firmware'u - + Firmware Corrupted Uszkodzony Firmware - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot Zrób zrzut ekranu - + PNG Image (*.png) Obrazek PNG (*.png) - + TAS state: Running %1/%2 Status TAS: Działa %1%2 - + TAS state: Recording %1 Status TAS: Nagrywa %1 - + TAS state: Idle %1/%2 Status TAS: Bezczynny %1%2 - + TAS State: Invalid Status TAS: Niepoprawny - + &Stop Running &Wyłącz - + Stop R&ecording Przestań &Nagrywać - + Building: %n shader(s) Budowanie: %n shaderBudowanie: %n shaderyBudowanie: %n shaderówBudowanie: %n shaderów - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Prędkość: %1% / %2% - + Speed: %1% Prędkość: %1% - + Game: %1 FPS Gra: %1 FPS - + Frame: %1 ms Klatka: %1 ms - + NO AA BEZ AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE Głośność: Wyciszony - + VOLUME: %1% Volume percentage (e.g. 50%) Głośność: %1% - + Derivation Components Missing Brak komponentów wyprowadzania - + Decryption keys are missing. Install them now? - + Wayland Detected! Wykryto Waylanda! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8041,74 +8086,74 @@ Zaleca się zamiast tego używać X11. Czy chcesz wymusić jego użycie przy przyszłych uruchomieniach? - + Use X11 Używaj X11 - + Continue with Wayland Kontynuuj z Waylandem - + Don't show again Nie pokazuj ponownie - + Restart Required Wymagane ponowne uruchomienie - + Restart Eden to apply the X11 backend. Uruchom ponownie Edena, aby zastosować backend X11. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target Wybierz cel zrzutu RomFS - + Please select which RomFS you would like to dump. Proszę wybrać RomFS, jakie chcesz zrzucić. - + Are you sure you want to close Eden? Czy na pewno chcesz zamknąć Edena? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Czy na pewno chcesz zatrzymać emulację? Wszystkie niezapisane postępy zostaną utracone. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index 36b5181730..7113730221 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -590,12 +590,22 @@ SMAA oferece a melhor qualidade. FXAA pode produzir uma imagem mais estável em resoluções mais baixas. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Tela Cheia - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -604,12 +614,12 @@ Sem borda oferece a melhor compatibilidade com o teclado na tela que alguns jogo Tela cheia exclusiva pode oferecer melhor desempenho e melhor suporte a Freesync/Gsync. - + Aspect Ratio: Proporção do Ecrã: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -618,36 +628,36 @@ A maioria dos jogos suporta apenas 16:9, sendo necessárias modificações para Também controla a proporção das capturas de tela. - + Use persistent pipeline cache Usar cache persistente de pipeline - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permite guardar os shaders para carregar os jogos nas execuções seguintes. Desabiltar essa opção só serve para propósitos de depuração. - + Use asynchronous GPU emulation Usar emulação assíncrona de GPU - + Uses an extra CPU thread for rendering. This option should always remain enabled. Usa uma thread de CPU extra para renderização. Esta opção deve estar sempre habilitada. - + NVDEC emulation: Emulação NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -656,12 +666,12 @@ Tanto a CPU quanto a GPU podem ser utilizadas para decodificação, ou não deco Na maioria dos casos, a decodificação pela GPU fornece um melhor desempenho. - + ASTC Decoding Method: Método de Decodificação ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -674,56 +684,56 @@ CPU Assíncrona: Usa a CPU para decodificar texturas ASTC sob demanda. Elimina t mas pode apresentar artefatos visuais. - + ASTC Recompression Method: Método de Recompressão ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. A maioria das GPUs não suporta texturas ASTC e precisa descompactá-las para um formato intermediário: RGBA8.BC1/BC3: O formato intermediário será recomprimido para BC1 ou BC3, economizando VRAM mas degradando a qualidade da imagem. - + Frame Pacing Mode (Vulkan only) Modo de Ritmo de Quadros (apenas Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. Controle como o emulador gerencia o ritmo de quadros para reduzir travamentos (engasgos) e deixar a taxa de quadros mais suave e consistente. - + VRAM Usage Mode: Modo de Uso da VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Define se o emulador deve priorizar a economia de memória ou fazer o uso máximo da memória de vídeo disponível para melhorar o desempenho. O modo agressivo pode impactar a performance de outros aplicativos, como softwares de gravação. - + Skip CPU Inner Invalidation Ignorar invalidação interna da CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Ignora certas invalidações de cache durante atualizações de memória, reduzindo o uso da CPU e melhorando a latência. Isso pode causar travamentos leves. - + VSync Mode: Modo de Sincronização vertical: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -734,12 +744,12 @@ Mailbox pode ter menor latência que FIFO e não apresenta cortes, mas pode perd Immediate (sem sincronização) exibe o que estiver disponível e pode apresentar cortes. - + Sync Memory Operations Sincronizar operações de memória - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -748,68 +758,68 @@ Esta opção corrige problemas em diversos jogos, mas pode reduzir o desempenho. Jogos baseados na Unreal Engine 4 costumam apresentar as mudanças mais significativas. - + Enable asynchronous presentation (Vulkan only) Ativar apresentação assíncrona (Somente Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Melhora ligeiramente o desempenho ao mover a apresentação para uma thread de CPU separada. - + Force maximum clocks (Vulkan only) Forçar clock máximo (somente Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Executa trabalho em segundo plano aguardando pelos comandos gráficos para evitar a GPU de reduzir seu clock. - + Anisotropic Filtering: Filtro Anisotrópico: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Controla a qualidade da renderização de texturas em ângulos oblíquos. Seguro definir em 16x na maioria das GPUs. - + GPU Mode: Modo da GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Precisão do DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -819,55 +829,55 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Ativar compilação assíncrona de shaders - + May reduce shader stutter. Pode reduzir travamentos de shaders. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Acelera a decodificação de texturas 3D BCn usando processamento da GPU. Desative se ocorrerem travamentos ou falhas gráficas. - + GPU Unswizzle Max Texture Size Tamanho Máximo de Textura para GPU Unswizzle - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -876,48 +886,48 @@ A GPU é mais rápida para texturas médias e grandes, mas a CPU pode ser mais e Ajuste para encontrar o equilíbrio entre aceleração da GPU e sobrecarga da CPU. - + GPU Unswizzle Stream Size Tamanho do Fluxo de GPU Unswizzle - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Define a quantidade máxima de dados de textura (em MiB) processados por quadro. Valores mais altos podem reduzir travamentos durante o carregamento de texturas, mas podem afetar a consistência dos quadros. - + GPU Unswizzle Chunk Size Tamanho do Bloco de GPU Unswizzle - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Determina o número de fatias de profundidade processadas em uma única execução. Aumentar esse valor pode melhorar o desempenho em GPUs avançadas, mas pode causar TDR ou tempo limite do driver em hardwares mais fracos. - + Use Vulkan pipeline cache Utilizar cache de pipeline do Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Habilita o cache de pipeline da fabricante da GPU. Esta opção pode melhorar o tempo de carregamento de shaders significantemente em casos onde o driver Vulkan não armazena o cache de pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Habilitar Pipeline de Computação (Somente Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -926,194 +936,194 @@ Esta configuração existe apenas para drivers proprietários da Intel e pode ca Pipelines de computação estão sempre habilitados em outros drivers. - + Enable Reactive Flushing Habilitar Flushing Reativo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa flushing reativo ao invés de flushing preditivo, permitindo mais precisão na sincronização da memória. - + Sync to framerate of video playback Sincronizar com o framerate da reprodução de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Executa o jogo na velocidade normal durante a reprodução de vídeo, mesmo se o framerate estiver desbloqueado. - + Barrier feedback loops Ciclos de feedback de barreira - + Improves rendering of transparency effects in specific games. Melhora a renderização de efeitos de transparência em jogos específicos. - + Enable buffer history Ativar histórico de buffer - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Permite acesso a estados anteriores do buffer. Esta opção pode melhorar a qualidade de renderização e a consistência de desempenho em alguns jogos. - + Fix bloom effects Corrigir efeitos de bloom - + Removes bloom in Burnout. Remove o bloom no Burnout. - + Enable Legacy Rescale Pass Ativar Passagem de Redimensionamento Legada - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Pode corrigir problemas de redimensionamento em alguns jogos, baseando-se no comportamento da implementação anterior. Solução legada que corrige artefatos de linha em GPUs AMD e Intel, e cintilação de texturas cinzas em GPUs Nvidia no Luigi's Mansion 3. - + Extended Dynamic State Estado Dinâmico Estendido - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Controla o número de recursos que podem ser usados no Estado Dinâmico Estendido. Estados mais altos permitem mais recursos e podem aumentar o desempenho, mas também podem causar problemas gráficos adicionais. - + Vertex Input Dynamic State Estado Dinâmico de Entrada de Vértices - + Enables vertex input dynamic state feature for better quality and performance. Ativa o recurso de estado dinâmico de entrada de vértices para melhor qualidade e desempenho. - + Sample Shading Sombreamento por Amostragem - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permite que o shader de fragmento seja processado por cada amostra em fragmentos multiamostrados, em vez de uma única vez por fragmento. Melhora a qualidade gráfica ao custo de desempenho. Valores mais altos aumentam a qualidade, mas reduzem a performance. - + RNG Seed Semente de RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Controla a semente do gerador de números aleatórios. Usado principalmente em speedruns. - + Device Name Nome do Dispositivo - + The name of the console. O nome do console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Data personalizada do RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Esta opção permite alterar o relógio do console. Pode ser usada para manipular o tempo nos jogos. - + The number of seconds from the current unix time Número de segundos a partir do tempo Unix atual - + Language: Idioma: - + This option can be overridden when region setting is auto-select Esta opção pode ser substituída quando a configuração de região estiver em seleção automática - + Region: Região: - + The region of the console. A região do console. - + Time Zone: Fuso Horário: - + The time zone of the console. O fuso horário do console. - + Sound Output Mode: Modo de saída de som - + Console Mode: Modo Console: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1122,1042 +1132,1042 @@ Os jogos ajustarão resolução, detalhes e controladores suportados conforme es Definir como Portátil pode ajudar a melhorar o desempenho em sistemas mais fracos. - + Prompt for user profile on boot Solicitar perfil de usuário na inicialização - + Useful if multiple people use the same PC. Útil se várias pessoas usam o mesmo PC. - + Pause when not in focus Pausar quando não estiver em foco - + Pauses emulation when focusing on other windows. Pausa a emulação ao focar em outras janelas. - + Confirm before stopping emulation Confirmar antes de parar a emulação - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Substitui as confirmações ao parar a emulação. Ao ativar, ignora esses avisos e encerra diretamente a emulação. - + Hide mouse on inactivity Esconder rato quando inactivo. - + Hides the mouse after 2.5s of inactivity. Oculta o mouse após 2,5s de inatividade. - + Disable controller applet Desabilitar applet de controle - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Desativa forçadamente o uso do applet de controle em programas emulados. Quando um programa tenta abrir o applet, ele é imediatamente fechado. - + Check for updates Verificar atualizações - + Whether or not to check for updates upon startup. Define se deve verificar atualizações na inicialização. - + Enable Gamemode Habilitar Gamemode - + Force X11 as Graphics Backend Forçar X11 como backend gráfico - + Custom frontend Frontend customizado - + Real applet Applet real - + Never Nunca - + On Load Ao carregar - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor Qualidade) - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - - + + Auto Automático - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservador - + Aggressive Agressivo - + Vulkan Vulcano - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Shaders em Assembly, apenas NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, apenas AMD/Mesa) - + Null Nenhum - + Fast Rápido - - - + + + Accurate Preciso - - - + + + Default Padrão - + Unsafe (fast) Inseguro (rápido) - + Safe (stable) Seguro (estável) - + Immediate - + Balanced Balanceado - + Strict - + Unsafe Inseguro - + Paranoid (disables most optimizations) Paranoia (desativa a maioria das otimizações) - + Debugging Depuração - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela sem bordas - + Exclusive Fullscreen Tela cheia exclusiva - + No Video Output Sem saída de vídeo - + CPU Video Decoding Decodificação de vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de vídeo pela GPU (Padrão) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Área - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à Janela - + Automatic Automático - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) Polonês (polska) - + Thai (แบบไทย) Tailandês (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egito - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irã - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polônia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Ancorado - + Handheld Portátil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - + Very Small (16 MB) Muito Pequeno (16 MB) - + Small (32 MB) Pequeno (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muito Grande (512 MB) - + Very Low (4 MB) Muito Baixo (4 MB) - + Low (8 MB) Baixo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Médio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muito Baixo (32) - + Low (64) Baixo (64) - + Normal (128) Normal (128) - + Medium (256) Médio (256) - + High (512) Alto (512) - + Disabled Desativado - + ExtendedDynamicState 1 Estado Dinâmico Estendido 1 - + ExtendedDynamicState 2 Estado Dinâmico Estendido 2 - + ExtendedDynamicState 3 Estado Dinâmico Estendido 3 - + Tree View Visualização em Árvore - + Grid View Visualização em Grade @@ -3262,33 +3272,38 @@ Gostaria de deletar o salvamento antigo? Cor de fundo: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off Desligado - + VSync Off Sincronização vertical desligada - + Recommended Recomendado - + On Ligado - + VSync On Sincronização vertical ligada @@ -4915,102 +4930,117 @@ Uma vez deletado, esses NÃO podem ser recuperados. Você tem 100% de certeza qu - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -7028,7 +7058,7 @@ Mensagem de Depuração: - + &Pause &Pausa @@ -7179,7 +7209,7 @@ Mensagem de Depuração: - + &Start &Começar @@ -7190,7 +7220,7 @@ Mensagem de Depuração: - + R&ecord G&ravar @@ -7281,7 +7311,7 @@ Mensagem de Depuração: - + None Nenhum @@ -7307,723 +7337,738 @@ Mensagem de Depuração: - + Small (32x32) Pequeno (32x32) - + Standard (64x64) Padrão (64x64) - + Large (128x128) Grande (128x128) - + Full Size (256x256) Tamanho completo (256x256) - + Broken Vulkan Installation Detected Detectada Instalação Defeituosa do Vulkan - + Vulkan initialization failed during boot. Inicialização do Vulkan falhou durante o boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Rodando um jogo - + Loading Web Applet... Carregando Applet Web... - - + + Disable Web Applet Desativar Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Desativar o Applet Web pode problemas indefinidos e deverá apenas ser usando com o Super Mario 3D All-Stars. Você tem certeza que quer desativar o Applet Web? (Isso pode ser reativado nas Configurações de Depuração.) - + The amount of shaders currently being built A Quantidade total de Shaders está sendo atualmente construída - + The current selected resolution scaling multiplier. A atual multiplicação de escala de resolução selecionada. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocidade atual da emulação. Valores altos ou mais baixo que 100% indicam que o emulador está rodando mais rápido ou mais lento que um Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Quantos quadros por segundo o jogo está mostrando atualmente. Isto varia de jogo para jogo e de cena a cena. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory Selecionar Diretório - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory Abrir o Diretório da ROM extraída - + Invalid Directory Selected Diretório selecionado inválido - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed O Amiibo atual foi removido - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8031,74 +8076,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/pt_PT.ts b/dist/languages/pt_PT.ts index beef4e100c..e637008132 100644 --- a/dist/languages/pt_PT.ts +++ b/dist/languages/pt_PT.ts @@ -573,12 +573,22 @@ FXAA can produce a more stable picture in lower resolutions. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Tela Cheia - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -587,47 +597,47 @@ Sem borda oferece a melhor compatibilidade com o teclado na tela que alguns jogo Tela cheia exclusiva pode oferecer melhor performance e melhor suporte a Freesync/Gsync. - + Aspect Ratio: Proporção do Ecrã: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Permite guardar os shaders para carregar os jogos nas execuções seguintes. Desabiltar essa opção só serve para propósitos de depuração. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Emulação NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -636,12 +646,12 @@ Tanto a CPU quanto a GPU podem ser utilizadas para decodificação, ou não deco Na maioria dos casos, a decodificação pela GPU fornece uma melhor performance. - + ASTC Decoding Method: Método de Decodificação ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -650,55 +660,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: Método de Recompressão ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: Modo de Uso da VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: Modo de Sincronização vertical: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -706,79 +716,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Ativar apresentação assíncrona (Somente Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Melhora ligeiramente o desempenho ao mover a apresentação para uma thread de CPU separada. - + Force maximum clocks (Vulkan only) Forçar clock máximo (somente Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Executa trabalho em segundo plano aguardando pelos comandos gráficos para evitar a GPU de reduzir seu clock. - + Anisotropic Filtering: Filtro Anisotrópico: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -788,1328 +798,1328 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Utilizar cache de pipeline do Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Habilita o cache de pipeline da fabricante da GPU. Esta opção pode melhorar o tempo de carregamento de shaders significantemente em casos onde o driver Vulkan não armazena o cache de pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Habilitar Pipeline de Computação (Somente Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Habilitar Flushing Reativo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa flushing reativo ao invés de flushing preditivo, permitindo mais precisão na sincronização da memória. - + Sync to framerate of video playback Sincronizar com o framerate da reprodução de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Executa o jogo na velocidade normal durante a reprodução de vídeo, mesmo se o framerate estiver desbloqueado. - + Barrier feedback loops Ciclos de feedback de barreira - + Improves rendering of transparency effects in specific games. Melhora a renderização de efeitos de transparência em jogos específicos. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Semente de RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Nome do Dispositivo - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Data personalizada do RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Idioma: - + This option can be overridden when region setting is auto-select - + Region: Região: - + The region of the console. - + Time Zone: Fuso Horário: - + The time zone of the console. - + Sound Output Mode: Modo de saída de som - + Console Mode: Modo Console: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Confirmar antes de parar a emulação - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Esconder rato quando inactivo. - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Desabilitar miniaplicativo de controle - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Habilitar Gamemode - + Force X11 as Graphics Backend - + Custom frontend Frontend customizado - + Real applet Miniaplicativo real - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor Q - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - - + + Auto Automático - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Conservador - + Aggressive Agressivo - + Vulkan Vulcano - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Nenhum (desativado) - + Fast - - - + + + Accurate Preciso - - - + + + Default Padrão - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Inseguro - + Paranoid (disables most optimizations) Paranoia (desativa a maioria das otimizações) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela sem bordas - + Exclusive Fullscreen Tela cheia exclusiva - + No Video Output Sem saída de vídeo - + CPU Video Decoding Decodificação de vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de vídeo pela GPU (Padrão) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à Janela - + Automatic Automático - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irão - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polónia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Ancorado - + Handheld Portátil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3201,33 +3211,38 @@ Would you like to delete the old save data? Cor de fundo: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off Desligado - + VSync Off Sincronização vertical desligada - + Recommended Recomendado - + On Ligado - + VSync On Sincronização vertical ligada @@ -4849,102 +4864,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6959,7 +6989,7 @@ Debug Message: - + &Pause &Pausa @@ -7110,7 +7140,7 @@ Debug Message: - + &Start &Começar @@ -7121,7 +7151,7 @@ Debug Message: - + R&ecord G&ravar @@ -7212,7 +7242,7 @@ Debug Message: - + None @@ -7238,722 +7268,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7961,74 +8006,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 9488e6f43b..5d0bfe8ea0 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -592,12 +592,22 @@ SMAA обеспечивает лучшее качество. FXAA может давать более стабильное изображение на низком разрешении. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Полноэкранный режим: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -606,12 +616,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp Эксклюзивный полноэкранный режим может иметь лучшую производительность и лучшую поддержку Freesync/G-Sync. - + Aspect Ratio: Соотношение сторон: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -620,35 +630,35 @@ Also controls the aspect ratio of captured screenshots. Также управляет соотношением сторон скриншотов. - + Use persistent pipeline cache Использовать постоянный кэш конвейера - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Позволяет сохранять шейдеры на диск для более быстрой загрузки при последующем запуске игры. Отключение этой функции предназначено только для отладки. - + Use asynchronous GPU emulation Использовать асинхронную эмуляцию GPU - + Uses an extra CPU thread for rendering. This option should always remain enabled. Использует дополнительный поток CPU для рендеринга. Эта опция всегда должна оставаться включенной. - + NVDEC emulation: Эмуляция NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -657,12 +667,12 @@ In most cases, GPU decoding provides the best performance. В большинстве случаев декодирование с использованием ГП обеспечивает лучшую производительность. - + ASTC Decoding Method: Метод декодирования ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -674,12 +684,12 @@ GPU: использовать вычислительные шейдеры ГП Асинхронный CPU: использовать ЦП для декодирования текстур ASTC по мере необходимости. Устраняет фризы при декодировании ASTC, но может вызывать артефакты. - + ASTC Recompression Method: Метод пересжатия ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -687,44 +697,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3: промежуточный формат будет перекодирован в BC1 или BC3, экономя видеопамять, но снижая качество изображения. - + Frame Pacing Mode (Vulkan only) Режим стабилизации кадров (только Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. Определяет способ управления выводом кадров для уменьшения подергиваний и повышения плавности и стабильности частоты кадров. - + VRAM Usage Mode: Режим VRAM: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Определяет, должен ли эмулятор экономить память или использовать всю доступную видеопамять для повышения производительности. Агрессивный режим может негативно сказаться на производительности других приложений, например программ записи. - + Skip CPU Inner Invalidation Пропуск внутренней инвалидизации CPU - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Пропускает некоторые операции сброса кэша при обновлении памяти, снижая нагрузку на ЦП и уменьшая задержку. Может вызывать сбои в работе игр. - + VSync Mode: Режим VSync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -735,12 +745,12 @@ Mailbox может обеспечивать меньшую задержку, ч Immediate (без синхронизации) выводит все доступные кадры и может иметь разрывы. - + Sync Memory Operations Синхронизация операций памяти - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -749,56 +759,56 @@ Unreal Engine 4 games often see the most significant changes thereof. Игры на Unreal Engine 4 чаще всего демонстрируют заметные изменения. - + Enable asynchronous presentation (Vulkan only) Включить асинхронный вывод (только Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Немного повышает производительность, перенося вывод кадра в отдельный поток CPU. - + Force maximum clocks (Vulkan only) Принудительно зафиксировать максимальную тактовую частоту (только для Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Выполняет фоновые операции во время ожидания графических команд, предотвращая снижение тактовой частоты GPU. - + Anisotropic Filtering: Анизотропная фильтрация: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Управляет качеством отображения текстур под наклонными углами. На большинстве GPU безопасно использовать значение 16x. - + GPU Mode: Режим GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. Управляет режимом эмуляции ГПУ. Большинство игр нормально отображаются в режиме Быстрый, но для некоторых требуется режим Точный. Частицы обычно корректно отображаются только в режиме Точный. - + DMA Accuracy: Точность DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -807,12 +817,12 @@ Default follows the GPU Accuracy setting. По умолчанию соответствует настройке точности ГПУ. - + GPU Fence Behavior: Поведение барьеров ГПУ: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -827,56 +837,56 @@ Default follows the GPU Accuracy setting. По умолчанию соответствует настройке точности ГПУ. - + Enable GPU buffer readback Включить обратное чтение буфера ГПУ - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. Сохраняет измененные ГПУ данные путем чтения их обратно перед выгрузками. Некоторые игры требуют этого, чтобы рендерить определенные эффекты правильно. - + Enable asynchronous shader compilation Включить асинхронную компиляцию шейдеров - + May reduce shader stutter. Может уменьшить фризы, вызванные компиляцией шейдеров. - + GPU Clocks Частоты GPU - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. Заставляет игру думать, что GPU завершает свою работу быстрее, чем на самом деле, чтобы она перестала подстраиваться под частоты Switch, понижать разрешение и дальность прорисовки. - + GPU Unswizzle GPU-десвиззлинг (GPU Unswizzle) - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Ускоряет декодирование 3D-текстур BCn с использованием вычислений GPU. Отключите при возникновении сбоев или графических артефактов. - + GPU Unswizzle Max Texture Size Максимальный размер текстур для GPU-десвиззлинга - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -885,48 +895,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size Размер потока GPU-десвиззлинга - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Задает максимальный объем данных текстур (в МиБ), обрабатываемый за кадр. Более высокие значения могут уменьшить подергивания при загрузке текстур, но это может повлиять на стабильность кадров. - + GPU Unswizzle Chunk Size Размер блока GPU-десвиззлинга - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Определяет количество слоев глубины, обрабатываемых за один вызов. Увеличение этого значения может повысить пропускную способность на производительных GPU, но на слабом оборудовании способно вызвать TDR или тайм-ауты драйвера. - + Use Vulkan pipeline cache Использовать кэш конвейеров Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Включает кэш конвейеров, зависящий от производителя GPU. Эта опция может значительно ускорить загрузку шейдеров в тех случаях, когда драйвер Vulkan не сохраняет такие файлы кэша внутри себя. - + Enable Compute Pipelines (Intel Vulkan Only) Включить вычислительные конвейеры (только для Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -935,194 +945,194 @@ Compute pipelines are always enabled on all other drivers. На остальных драйверах вычислительные конвейеры всегда включены. - + Enable Reactive Flushing Включить реактивный сброс - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Использует реактивный сброс (Reactive Flushing) вместо прогнозирующего, обеспечивая более точную синхронизацию памяти. - + Sync to framerate of video playback Синхронизировать с частотой кадров видео - + Run the game at normal speed during video playback, even when the framerate is unlocked. Поддерживать нормальную скорость игры во время воспроизведения видео, даже если частота кадров разблокирована. - + Barrier feedback loops Циклы обратной связи барьеров - + Improves rendering of transparency effects in specific games. Улучшает отрисовку эффектов прозрачности в некоторых играх. - + Enable buffer history Включить историю буфера - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Предоставляет доступ к предыдущим состояниям буфера. В некоторых играх может повысить качество рендеринга и стабильность производительности. - + Fix bloom effects Исправить эффекты bloom - + Removes bloom in Burnout. Удаляет эффект bloom в игре Burnout. - + Enable Legacy Rescale Pass Включить устаревший режим масштабирования - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Может исправить проблемы масштабирования в некоторых играх, используя поведение предыдущей реализации. Это обходное решение устраняет артефакты линий на GPU AMD и Intel, а также мерцание серых текстур на GPU Nvidia в Luigis Mansion 3. - + Extended Dynamic State Расширенное динамическое состояние (Extended Dynamic State) - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Определяет количество функций, доступных в Extended Dynamic State. Более высокие значения позволяют использовать больше функций и иногда повышают производительность, но могут вызвать дополнительные графические проблемы. - + Vertex Input Dynamic State Динамическое состояние ввода вершин (Vertex Input Dynamic State) - + Enables vertex input dynamic state feature for better quality and performance. Включает функцию динамического состояния ввода вершин для улучшения качества и производительности. - + Sample Shading Множественное затенение (Sample Shading) - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Позволяет фрагментному шейдеру выполняться для каждого сэмпла в мультисемплированном фрагменте вместо одного раза. Повышает качество графики за счет снижения производительности. Более высокие значения повышают качество, но сильнее снижают производительность. - + RNG Seed Сид RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Задает начальное значение генератора случайных чисел. В основном используется для спидранов. - + Device Name Название устройства - + The name of the console. Имя консоли. - + Homebrew Args Аргументы Homebrew - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Аргументы командной строки при запуске homebrew (например, -noglsl). - + Custom RTC Date: Пользовательская RTC-дата: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Позволяет изменить системные часы консоли. Может использоваться для изменения времени в играх. - + The number of seconds from the current unix time Количество секунд от текущего UNIX-времени. - + Language: Язык: - + This option can be overridden when region setting is auto-select Эта настройка может быть переопределена при автоматическом выборе региона. - + Region: Регион: - + The region of the console. Регион консоли. - + Time Zone: Часовой пояс: - + The time zone of the console. Часовой пояс консоли. - + Sound Output Mode: Режим вывода звука: - + Console Mode: Консольный режим: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1131,1042 +1141,1042 @@ Setting to Handheld can help improve performance for low end systems. Установка в портативный режим может повысить производительность на слабых системах. - + Prompt for user profile on boot Запрашивать профиль пользователя при запуске игры - + Useful if multiple people use the same PC. Полезно, если одним ПК пользуются несколько человек. - + Pause when not in focus Приостанавливать, если окно не активно - + Pauses emulation when focusing on other windows. Приостанавливает эмуляцию при переключении на другие окна. - + Confirm before stopping emulation Запрашивать подтверждение перед остановкой эмуляции - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Убирает запросы на подтверждение остановки эмуляции. При включении этой настройки эмуляция завершается сразу, без подтверждения. - + Hide mouse on inactivity Скрывать курсор при бездействии - + Hides the mouse after 2.5s of inactivity. Скрывает курсор мыши после 2,5 секунд бездействия. - + Disable controller applet Отключить апплет контроллера - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Принудительно отключает использование апплета контроллера в эмулируемых программах. При попытке открыть апплет он сразу закрывается. - + Check for updates Проверять обновления - + Whether or not to check for updates upon startup. Проверять обновления при запуске. - + Enable Gamemode Включить режим игры - + Force X11 as Graphics Backend Принудительно использовать X11 как графический бэкенд - + Custom frontend Собственный интерфейс эмулятора - + Real applet Приложение из прошивки - + Never Никогда - + On Load При загрузке - + Always Всегда - + CPU CPU - + GPU GPU - + CPU Asynchronous Асинхронный CPU - + Uncompressed (Best quality) Без сжатия (наилучшее качество) - + BC1 (Low quality) BC1 (низкое качество) - + BC3 (Medium quality) BC3 (среднее качество) - - + + Auto Авто - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Консервативный - + Aggressive Агрессивный - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (ассемблерные шейдеры, только для NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (экспериментальный, только для AMD/Mesa) - + Null Null - + Fast Производительность - - - + + + Accurate Точность - - - + + + Default По умолчанию - + Unsafe (fast) Небезопасно (быстро) - + Safe (stable) Безопасно (стабильно) - + Immediate Мгновенный - + Balanced Баланс - + Strict Строгий - + Unsafe Небезопасно - + Paranoid (disables most optimizations) Параноик (отключает большинство оптимизаций) - + Debugging Отладка - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Безрамочный режим - + Exclusive Fullscreen Эксклюзивный полноэкранный - + No Video Output Отсутствие видеовыхода - + CPU Video Decoding Декодирование видео на CPU - + GPU Video Decoding (Default) Декодирование видео на GPU (По умолчанию) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [Экспериментально] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [Экспериментально] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [Экспериментально] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [ЭКПЕРИМЕНТАЛЬНО] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [Экспериментально] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Ближайший сосед (Nearest Neighbor) - + Bilinear Билинейный - + Bicubic Бикубический - + Gaussian По Гауссу - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX™️ Super Resolution - + Area Область (Area) - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Никакой - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Стандартное (16:9) - + Force 4:3 Принудительно 4:3 - + Force 21:9 Принудительно 21:9 - + Force 16:10 Принудительно 16:10 - + Stretch to Window Растянуть до окна - + Automatic Автоматически - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Японский (日本語) - + American English Американский английский - + French (français) Французский (français) - + German (Deutsch) Немецкий (Deutsch) - + Italian (italiano) Итальянский (italiano) - + Spanish (español) Испанский (español) - + Chinese Китайский - + Korean (한국어) Корейский (한국어) - + Dutch (Nederlands) Голландский (Nederlands) - + Portuguese (português) Португальский (português) - + Russian (Русский) Русский - + Taiwanese Тайваньский - + British English Британский английский - + Canadian French Канадский французский - + Latin American Spanish Латиноамериканский испанский - + Simplified Chinese Упрощённый китайский - + Traditional Chinese (正體中文) Традиционный китайский (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильский португальский (português do Brasil) - + Polish (polska) Польский (polska) - + Thai (แบบไทย) Тайский (แบบไทย) - - + + Japan Япония - + USA США - + Europe Европа - + Australia Австралия - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Авто (%1) - + Default (%1) Default time zone По умолчанию (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Египет - + Eire Эйре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Эйре - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвич - + Hongkong Гонконг - + HST HST - + Iceland Исландия - + Iran Иран - + Israel Израиль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Ливия - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польша - + Portugal Португалия - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сингапур - + Turkey Турция - + UCT UCT - + Universal Универсальный - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулу - + Mono Моно - + Stereo Стерео - + Surround Объемный звук - + 4GB DRAM (Default) 4 ГБ ОЗУ (По умолчанию) - + 6GB DRAM (Unsafe) 6 ГБ ОЗУ (Небезопасно) - + 8GB DRAM 8 ГБ ОЗУ - + 10GB DRAM (Unsafe) 10 ГБ ОЗУ (Небезопасно) - + 12GB DRAM (Unsafe) 12 ГБ ОЗУ (Небезопасно) - + Docked В док-станции - + Handheld Портативный - - + + Normal Нормальная - - + + Boost Ускоренная - - + + Overclock Разгон - + Always ask (Default) Всегда спрашивать (По умолчанию) - + Only if game specifies not to stop Только если игра указывает не останавливать - + Never ask Никогда не спрашивать - + Very Small (16 MB) Очень маленький (16 МБ) - + Small (32 MB) Маленький (32 МБ) - + Normal (128 MB) Нормальный (128 МБ) - + Large (256 MB) Большой (256 МБ) - + Very Large (512 MB) Очень большой (512 МБ) - + Very Low (4 MB) Очень низкий (4 МБ) - + Low (8 MB) Низкий (8 МБ) - + Normal (16 MB) Нормальный (16 МБ) - + Medium (32 MB) Средний (32 МБ) - + High (64 MB) Высокий (64 МБ) - + Very Low (32) Очень низкий (32) - + Low (64) Низкий (64) - + Normal (128) Нормальный (128) - + Medium (256) Средний (256) - + High (512) Высокий (512) - + Disabled Отключено - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View Древовидный - + Grid View Сетчатый @@ -3278,33 +3288,38 @@ Would you like to delete the old save data? Цвет фона: - + % FSR/SGSR sharpening percentage (e.g. 50%) % - + + Configure Effects... + + + + Off Отключена - + VSync Off VSync Off - + Recommended Рекомендуется - + On Включена - + VSync On VSync On @@ -4932,102 +4947,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -7045,7 +7075,7 @@ Debug Message: - + &Pause &Пауза @@ -7196,7 +7226,7 @@ Debug Message: - + &Start &Запустить @@ -7207,7 +7237,7 @@ Debug Message: - + R&ecord З&апись @@ -7298,7 +7328,7 @@ Debug Message: - + None Никакой @@ -7324,400 +7354,405 @@ Debug Message: &В Виде Карусели - + Small (32x32) Маленький (32х32) - + Standard (64x64) Стандартный (64х64) - + Large (128x128) Большой (128х128) - + Full Size (256x256) Полноразмерный (256х256) - + Broken Vulkan Installation Detected Обнаружена поврежденная установка Vulkan - + Vulkan initialization failed during boot. Не удалось выполнить инициализацию Vulkan во время загрузки. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Запущена игра - + Loading Web Applet... Загрузка веб-апплета... - - + + Disable Web Applet Отключить веб-апплет - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Отключение веб-апплета может привести к неожиданному поведению и должно использоваться только, если вы хотите запустить Super Mario 3D All-Stars. Вы уверены, что хотите отключить веб-апплет? (Его можно снова включить в настройках отладки.) - + The amount of shaders currently being built Количество создаваемых шейдеров на данный момент - + The current selected resolution scaling multiplier. Текущий выбранный множитель масштабирования разрешения. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Текущая скорость эмуляции. Значения выше или ниже 100% указывают на то, что эмуляция идет быстрее или медленнее, чем на Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Количество кадров в секунду в данный момент. Значение будет различаться между играми и сценами. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Время, которое нужно для эмуляции одного кадра Switch, не принимая во внимание ограничение FPS или вертикальную синхронизацию. Для эмуляции в полной скорости значение должно быть не больше 16,67 мс. - + Unmute Включить звук - + Mute Выключить звук - + Reset Volume Сбросить громкость - + + Configure Effects... + + + + &Clear Recent Files &Очистить недавние файлы - + &Continue &Продолжить - + Warning: Outdated Game Format Предупреждение: устаревший формат игры - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Для этой игры вы используете разархивированный формат ROM'а, который является устаревшим и был заменен другими, такими как NCA, NAX, XCI или NSP. В разархивированных каталогах ROM'а отсутствуют иконки, метаданные и поддержка обновлений.<br><br>Для получения информации о различных форматах Switch, поддерживаемых Eden, ознакомьтесь с руководством пользователя. Это сообщение больше не будет отображаться. - - + + Error while loading ROM! Ошибка при загрузке ROM'а! - + The ROM format is not supported. Формат ROM'а не поддерживается. - + An error occurred initializing the video core. Произошла ошибка при инициализации видеоядра. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Ошибка при загрузке ROM'а! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Пожалуйста, пересоздайте дампы ваших файлов или обратитесь за помощью в Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Произошла неизвестная ошибка. Пожалуйста, проверьте журнал для подробностей. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Закрываем программу... - + Save Data Сохранения - + Mod Data Данные модов - + Error Opening %1 Folder Ошибка при открытии папки %1 - - + + Folder does not exist! Папка не существует! - + Remove Installed Game Contents? Удалить установленное содержимое игр? - + Remove Installed Game Update? Удалить установленное обновление игры? - + Remove Installed Game DLC? Удалить установленные DLC игры? - + Remove Entry Удалить запись - + Delete OpenGL Transferable Shader Cache? Удалить переносной кэш шейдеров OpenGL? - + Delete Vulkan Transferable Shader Cache? Удалить переносной кэш шейдеров Vulkan? - + Delete All Transferable Shader Caches? Удалить весь переносной кэш шейдеров? - + Remove Custom Game Configuration? Удалить пользовательскую настройку игры? - + Remove Cache Storage? Удалить кэш-хранилище? - + Remove File Удалить файл - + Remove Play Time Data Удалить данные игрового времени - + Reset play time? Сбросить время игры? - - + + RomFS Extraction Failed! Не удалось извлечь RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Произошла ошибка при копировании файлов RomFS или пользователь отменил операцию. - + Full Полный - + Skeleton Скелет - + Select RomFS Dump Mode Выберите режим дампа RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Пожалуйста, выберите, как вы хотите выполнить дамп RomFS. <br>Полный скопирует все файлы в новую папку, в то время как <br>скелет создаст только структуру папок. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root В %1 недостаточно свободного места для извлечения RomFS. Пожалуйста, освободите место или выберите другую папку для дампа в Эмуляция > Параметры > Система > Файловая система > Корень дампа - + Extracting RomFS... Извлечение RomFS... - - + + Cancel Отмена - + RomFS Extraction Succeeded! Извлечение RomFS прошло успешно! - + The operation completed successfully. Операция выполнена успешно. - + Error Opening %1 Ошибка при открытии %1 - + Select Directory Выбрать папку - + Properties Свойства - + The game properties could not be loaded. Не удалось загрузить свойства игры. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Исполняемый файл Switch (%1);;Все файлы (*.*) - + Load File Загрузить файл - + Open Extracted ROM Directory Открыть папку извлеченного ROM'а - + Invalid Directory Selected Выбрана недопустимая папка - + The directory you have selected does not contain a 'main' file. Папка, которую вы выбрали, не содержит файла 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Устанавливаемый файл Switch (*.nca *.nsp *.xci);;Архив контента Nintendo (*.nca);;Пакет подачи Nintendo (*.nsp);;Образ картриджа NX (*.xci) - + Install Files Установить файлы - + %n file(s) remaining %n файл(ов) осталось%n файл(ов) осталось%n файл(ов) осталось%n файл(ов) осталось - + Installing file "%1"... Установка "%1"... - - + + Install Results Результаты - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Чтобы избежать возможных конфликтов, мы не рекомендуем пользователям устанавливать игры в NAND. Пожалуйста, используйте эту функцию только для установки обновлений и DLC. - + %n file(s) were newly installed %n файл(ов) были установлены недавно @@ -7727,7 +7762,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten %n файл(ов) были перезаписаны @@ -7737,7 +7772,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install %n файл(ов) не удалось установить @@ -7747,314 +7782,324 @@ Please, only use this feature to install updates and DLC. - + System Application Системное приложение - + System Archive Системный архив - + System Application Update Обновление системного приложения - + Firmware Package (Type A) Пакет прошивки (Тип А) - + Firmware Package (Type B) Пакет прошивки (Тип Б) - + Game Игра - + Game Update Обновление игры - + Game DLC DLC игры - + Delta Title Дельта-титул - + Select NCA Install Type... Выберите тип установки NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Пожалуйста, выберите тип приложения, который вы хотите установить для этого NCA: (В большинстве случаев, подходит стандартный выбор «Игра».) - + Failed to Install Ошибка установки - + The title type you selected for the NCA is invalid. Тип приложения, который вы выбрали для NCA, недействителен. - + File not found Файл не найден - + File "%1" not found Файл "%1" не найден - + OK ОК - + Function Disabled Функция отключена - + Compatibility list reporting is currently disabled. Check back later! Отправка отчетов о совместимости временно отключена. Доступ будет восстановлен позднее! - + Error opening URL Ошибка при открытии URL - + Unable to open the URL "%1". Не удалось открыть URL: "%1". - + TAS Recording Запись TAS - + Overwrite file of player 1? Перезаписать файл игрока 1? - + Invalid config detected Обнаружена недопустимая конфигурация - + Handheld controller can't be used on docked mode. Pro controller will be selected. Портативный контроллер не может быть использован в режиме док-станции. Будет выбран контроллер Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Текущий amiibo был удален - + Error Ошибка - - + + The current game is not looking for amiibos Текущая игра не ищет amiibo - + Amiibo File (%1);; All Files (*.*) Файл Amiibo (%1);; Все Файлы (*.*) - + Load Amiibo Загрузить Amiibo - + Error loading Amiibo data Ошибка загрузки данных Amiibo - + The selected file is not a valid amiibo Выбранный файл не является допустимым amiibo - + The selected file is already on use Выбранный файл уже используется - + An unknown error occurred Произошла неизвестная ошибка - + No firmware available Прошивка недоступна - + Firmware Corrupted Прошивка повреждена - + Unknown applet Неизвестный апплет - + Applet doesn't map to a known value. Апплет не соответствует ни одному известному значению. - + Record not found Запись не найдена - + Applet not found. Please reinstall firmware. Апплет не найден. Пожалуйста, переустановите прошивку. - + Capture Screenshot Сделать скриншот - + PNG Image (*.png) Изображение PNG (*.png) - + TAS state: Running %1/%2 Состояние TAS: Выполняется %1/%2 - + TAS state: Recording %1 Состояние TAS: Записывается %1 - + TAS state: Idle %1/%2 Состояние TAS: Простой %1/%2 - + TAS State: Invalid Состояние TAS: Неверное - + &Stop Running &Остановка - + Stop R&ecording &Закончить запись - + Building: %n shader(s) Компиляция %n шейдер(ов)Компиляция %n шейдер(ов)Компиляция %n шейдер(ов)Компиляция %n шейдер(ов) - + Scale: %1x %1 is the resolution scaling factor Масштаб: %1x - + Speed: %1% / %2% Скорость: %1% / %2% - + Speed: %1% Скорость: %1% - + Game: %1 FPS Игра: %1 FPS - + Frame: %1 ms Кадр: %1 мс - + NO AA БЕЗ СГЛАЖИВАНИЯ - + + NO FX + + + + + FX + + + + VOLUME: MUTE ГРОМКОСТЬ: ЗАГЛУШЕНА - + VOLUME: %1% Volume percentage (e.g. 50%) ГРОМКОСТЬ: %1% - + Derivation Components Missing Отсутствуют необходимые компоненты - + Decryption keys are missing. Install them now? Ключи дешифрования отсутствуют. Хотите установить их? - + Wayland Detected! Обнаружен Wayland! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8065,74 +8110,74 @@ Would you like to force it for future launches? Хотите включить X11 для последующих запусков? - + Use X11 Использовать X11 - + Continue with Wayland Продолжить с Wayland - + Don't show again Больше не показывать - + Restart Required Требуется перезапуск - + Restart Eden to apply the X11 backend. Перезапустите Eden, чтобы применить X11. - + Slow Замедлено - + Turbo Турбо - + Unlocked Разблокировано - + Select RomFS Dump Target Выбор цели для дампа RomFS - + Please select which RomFS you would like to dump. Выберите RomFS, который вы хотите извлечь. - + Are you sure you want to close Eden? Вы уверены, что хотите закрыть Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Вы уверены, что хотите остановить эмуляцию? Любой несохраненный прогресс будет потерян. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index d916eb4d86..1b20b42158 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -594,12 +594,22 @@ SMAA erbjuder den bästa kvaliteten. FXAA kan ge en stabilare bild i lägre upplösningar. - + + Enable post-processing effects + Aktivera efterbehandlingseffekter + + + + Applies post-processing effects to the final image. + Tillämpar efterbehandlingseffekter på den slutliga bilden. + + + Fullscreen Mode: Helskärmsläge: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -608,12 +618,12 @@ Borderless ger bäst kompatibilitet med skärmtangentbordet som vissa spel kräv Exklusiv helskärm kan ge bättre prestanda och bättre stöd för Freesync/Gsync. - + Aspect Ratio: Bildförhållande: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -622,36 +632,36 @@ De flesta spel stöder endast 16:9, så modifieringar krävs för att få andra Kontrollerar även bildförhållandet för tagna skärmdumpar. - + Use persistent pipeline cache Använd permanent pipeline-cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Gör det möjligt att spara shaders i lagringsutrymmet för snabbare laddning vid nästa spelstart. Att inaktivera detta är endast avsett för felsökning. - + Use asynchronous GPU emulation Använd asynkron GPU-emulering - + Uses an extra CPU thread for rendering. This option should always remain enabled. Använder en extra CPU-tråd för rendering. Detta alternativ bör alltid vara aktiverat. - + NVDEC emulation: NVDEC-emulering: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -660,12 +670,12 @@ Den kan antingen använda CPU eller GPU för avkodning, eller inte utföra någo I de flesta fall ger GPU-avkodning bäst prestanda. - + ASTC Decoding Method: ASTC-avkodningsmetod: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -678,12 +688,12 @@ CPU asynkront: Använd CPU:n för att avkoda ASTC-texturer vid behov. Eliminerar men kan ge artefakter. - + ASTC Recompression Method: ASTC-återkomprimeringsmetod: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -692,44 +702,44 @@ BC1/BC3: Det mellanliggande formatet kommer att komprimeras om till BC1- eller B vilket sparar VRAM men försämrar bildkvaliteten. - + Frame Pacing Mode (Vulkan only) Frame Pacing Mode (endast Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. Styr hur emulatorn hanterar bildhastigheten för att minska hackighet och göra bildfrekvensen jämnare och mer konsekvent. - + VRAM Usage Mode: VRAM-användningsläge: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Väljer om emulatorn ska prioritera att spara minne eller utnyttja tillgängligt videominne maximalt för prestanda. Aggressivt läge kan påverka prestandan hos andra program, till exempel inspelningsprogram. - + Skip CPU Inner Invalidation Hoppa över CPU:ns interna ogiltigförklaring - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Hoppar över vissa cache-ogiltigförklaringar under minnesuppdateringar, vilket minskar CPU-användningen och förbättrar latensen. Detta kan orsaka mjuka krascher. - + VSync Mode: VSync-läge: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -740,61 +750,58 @@ Mailbox kan ha lägre latens än FIFO och uppvisar inte tearing, men kan tappa b Immediate (ingen synkronisering) visar allt som är tillgängligt och kan uppvisa tearing. - + Sync Memory Operations Synkronisera minnesoperationer - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. Kontrollerar datakonsistens mellan beräknings- och minnesoperationer. - Det här alternativet åtgärdar problem i spel, men kan försämra prestandan. - Unreal Engine 4-spel upplever ofta de mest betydande förändringarna av detta. - + Enable asynchronous presentation (Vulkan only) Aktivera asynkron presentation (endast Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Förbättrar prestandan något genom att flytta presentationen till en separat CPU-tråd. - + Force maximum clocks (Vulkan only) Tvinga fram maximal klockfrekvens (endast Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Körs i bakgrunden i väntan på grafikkommandon för att förhindra att GPU:n sänker sin klockhastighet. - + Anisotropic Filtering: Anisotropisk filtrering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Kontrollerar kvaliteten på texturrendering vid sneda vinklar. - Säker att ställa in på 16x på de flesta GPU:er. - + GPU Mode: GPU-läge: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -803,12 +810,12 @@ De flesta spel återges bra med Snabb, men Exakt krävs fortfarande för vissa. Partiklar återges ofta korrekt endast i läget Exakt. - + DMA Accuracy: DMA-noggrannhet: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -817,12 +824,12 @@ Osäker är snabbare, medan Säker är stabilare och kan lösa problem i vissa s Standard följer inställningen för GPU-noggrannhet. - + GPU Fence Behavior: Beteende för GPU-staket: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -837,56 +844,56 @@ Strikt är långsammast, men kan lösa problem som kräver striktare synkroniser Standard följer inställningen för GPU-noggrannhet. - + Enable GPU buffer readback Aktivera återläsning av GPU-buffert - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. Bevarar data som ändrats av GPU:n genom att läsa tillbaka dem före uppladdning. Vissa spel kräver detta för att vissa effekter ska återges korrekt. - + Enable asynchronous shader compilation Aktivera asynkron shaderkompilering - + May reduce shader stutter. Kan minska shader-hackighet. - + GPU Clocks GPU-klockfrekvenser - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. Får spelet att tro att GPU-arbetet avslutas snabbare än det gör, så att det slutar sänka upplösning och ritaravstånd för att passa Switch-klockfrekvenserna. - + GPU Unswizzle GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Accelererar avkodning av BCn 3D-texturer med hjälp av GPU-beräkningar. Inaktivera om du upplever krascher eller grafiska fel. - + GPU Unswizzle Max Texture Size Maximal texturstorlek för GPU Unswizzle - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -895,48 +902,48 @@ GPU är snabbare för medelstora och stora texturer, men CPU kan vara effektivar Justera detta för att hitta balansen mellan GPU-acceleration och CPU-överbelastning. - + GPU Unswizzle Stream Size Strömstorlek för GPU Unswizzle - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Ställer in den maximala mängden texturdata (i MiB) som bearbetas per bildruta. Högre värden kan minska hackighet under texturinläsning men kan påverka bildrutans konsistens. - + GPU Unswizzle Chunk Size Chunk-storlek för GPU Unswizzle - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Bestämmer antalet djupskivor som bearbetas i en enda sändning. Att öka detta kan förbättra genomströmningen på avancerade GPU:er, men kan orsaka TDR eller drivrutinstidsgränser på svagare hårdvara. - + Use Vulkan pipeline cache Använda Vulkan pipeline-cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Aktiverar GPU-leverantörsspecifik pipeline-cache. Det här alternativet kan förbättra laddningstiden för shaders avsevärt i fall där Vulkan-drivrutinen inte lagrar pipeline-cache-filer internt. - + Enable Compute Pipelines (Intel Vulkan Only) Aktivera compute pipelines (endast Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -945,194 +952,194 @@ Denna inställning finns endast för Intels egna drivrutiner och kan orsaka kras Beräkningspipelines är alltid aktiverade på alla andra drivrutiner. - + Enable Reactive Flushing Aktivera Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Använder reaktiv rensning i stället för prediktiv rensning, vilket ger mer exakt minnessynkning. - + Sync to framerate of video playback Synkronisera med bildfrekvensen för videouppspelning - + Run the game at normal speed during video playback, even when the framerate is unlocked. Kör spelet i normal hastighet under videouppspelning, även när bildfrekvensen är upplåst. - + Barrier feedback loops Återkopplingsloopar för barriärer - + Improves rendering of transparency effects in specific games. Förbättrar renderingen av transparenseffekter i vissa spel. - + Enable buffer history Aktivera bufferthistorik - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Aktiverar åtkomst till tidigare bufferttillstånd. Det här alternativet kan förbättra renderingskvaliteten och prestandakonsistensen i vissa spel. - + Fix bloom effects Korrigera bloom-effekter - + Removes bloom in Burnout. Tar bort bloom i Burnout. - + Enable Legacy Rescale Pass Aktivera äldre omskalningspass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Kan åtgärda skalningsproblem i vissa spel genom att förlita sig på beteendet från den tidigare implementeringen. Äldre beteende som åtgärdar linjeartefakter på AMD- och Intel-GPU:er och grå texturflimmer på Nvidia-GPU:er i Luigis Mansion 3. - + Extended Dynamic State Utökad dynamisk status - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Kontrollerar antalet funktioner som kan användas i utökat dynamiskt tillstånd. Högre tillstånd möjliggör fler funktioner och kan öka prestandan, men kan orsaka ytterligare grafiska problem. - + Vertex Input Dynamic State Dynamiskt tillstånd för vertexinmatning - + Enables vertex input dynamic state feature for better quality and performance. Aktiverar funktionen för dynamiskt tillstånd för vertexinmatning för bättre kvalitet och prestanda. - + Sample Shading Provskuggning - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Tillåter fragment-shadern att exekveras per prov i ett multisamplade fragment istället för en gång per fragment. Förbättrar grafikens kvalitet på bekostnad av prestanda. Högre värden förbättrar kvaliteten men försämrar prestandan. - + RNG Seed RNG-frö - + Controls the seed of the random number generator. Mainly used for speedrunning. Att kontrollera fröet till slumptalsgeneratorn. Används främst för speedrunning. - + Device Name Enhetsnamn - + The name of the console. Konsolens namn. - + Homebrew Args Homebrew-argument - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Kommandoradsargument som skickas till homebrew vid start (t.ex. -noglsl). - + Custom RTC Date: Anpassat RTC-datum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Med det här alternativet kan du ändra klockan på konsolen. Kan användas för att manipulera tiden i spel. - + The number of seconds from the current unix time Antalet sekunder från aktuell Unix-tid - + Language: Språk: - + This option can be overridden when region setting is auto-select Det här alternativet kan åsidosättas när regioninställningen är automatiskt vald. - + Region: Region: - + The region of the console. Konsolens region. - + Time Zone: Tidszon: - + The time zone of the console. Konsolens tidszon. - + Sound Output Mode: Ljudutmatningsläge: - + Console Mode: Konsolläge: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1141,1042 +1148,1042 @@ Spel ändrar upplösning, detaljer och stödda kontroller beroende på denna ins Inställningen Handhållen kan förbättra prestandan för enklare system. - + Prompt for user profile on boot Fråga efter användarprofil vid uppstart - + Useful if multiple people use the same PC. Användbart om flera personer använder samma dator. - + Pause when not in focus Pausa när inte i fokus - + Pauses emulation when focusing on other windows. Pausar emulering när fokus är på andra fönster. - + Confirm before stopping emulation Bekräfta innan emuleringen stoppas - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Åsidosätter frågor om att bekräfta att emuleringen ska avslutas. Om du aktiverar den hoppar du över sådana uppmaningar och avslutar emuleringen direkt. - + Hide mouse on inactivity Dölj musen vid inaktivitet - + Hides the mouse after 2.5s of inactivity. Döljer musen efter 2,5 sekunders inaktivitet. - + Disable controller applet Inaktivera kontroller-appleten - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Inaktiverar med tvång användningen av kontrollerappletten i emulerade program. När ett program försöker öppna kontrollerappletten stängs den omedelbart. - + Check for updates Leta efter uppdateringar - + Whether or not to check for updates upon startup. Om uppdateringar ska sökas vid start eller inte. - + Enable Gamemode Aktivera Gamemode - + Force X11 as Graphics Backend Tvinga X11 som grafikbackend - + Custom frontend Anpassad frontend - + Real applet Verklig applet - + Never Aldrig - + On Load Vid inläsning - + Always Alltid - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU asynkron - + Uncompressed (Best quality) Okomprimerad (bästa kvalitet) - + BC1 (Low quality) BC1 (låg kvalitet) - + BC3 (Medium quality) BC3 (medelhög kvalitet) - - + + Auto Auto - + 30 FPS 30 bilder/s - + 60 FPS 60 bilder/s - + 90 FPS 90 bilder/s - + 120 FPS 120 bilder/s - + Conservative Konservativ - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembly Shaders, endast NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimentell, endast AMD/Mesa) - + Null Null - + Fast Snabb - - - + + + Accurate Exakt - - - + + + Default Standard - + Unsafe (fast) Osäker (snabb) - + Safe (stable) Säker (stabil) - + Immediate Omedelbar - + Balanced Balanserad - + Strict Strikt - + Unsafe Inte säker - + Paranoid (disables most optimizations) Paranoid (inaktiverar de flesta optimeringar) - + Debugging Felsökning - + Dynarmic Dynarmisk - + NCE NCE - + Borderless Windowed Ramlöst fönsterläge - + Exclusive Fullscreen Exklusiv helskärm - + No Video Output Ingen videoutgång - + CPU Video Decoding CPU-videoavkodning - + GPU Video Decoding (Default) GPU videoavkodning (standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTELL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTELL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Närmsta granne - + Bilinear Bilinjär - + Bicubic Bikubisk - + Gaussian Gaussisk - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Område - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tvinga 4:3 - + Force 21:9 Tvinga 21:9 - + Force 16:10 Tvinga 16:10 - + Stretch to Window Sträck ut till fönster - + Automatic Automatiskt - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japanska (日本語) - + American English Amerikansk engelska - + French (français) Franska (français) - + German (Deutsch) Tyska (Deutsch) - + Italian (italiano) Italienska (italiano) - + Spanish (español) Spanska (español) - + Chinese Kinesiska - + Korean (한국어) Koreanska (한국어) - + Dutch (Nederlands) Nederländska (Nederlands) - + Portuguese (português) Portugisiska (português) - + Russian (Русский) Ryska (Русский) - + Taiwanese Taiwanesiska - + British English Brittisk engelska - + Canadian French Kanadensisk franska - + Latin American Spanish Latinamerikansk spanska - + Simplified Chinese Förenklad kinesiska - + Traditional Chinese (正體中文) Traditionell kinesiska (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisiska (português do Brasil) - + Polish (polska) Polska (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egypten - + Eire Irland - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irland - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkiet - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET VÅT - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (osäker) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (osäker) - + 12GB DRAM (Unsafe) 12 GB DRAM (osäker) - + Docked Dockad - + Handheld Handhållen - - + + Normal Normal - - + + Boost Förstärk - - + + Overclock Överklocka - + Always ask (Default) Fråga alltid (standard) - + Only if game specifies not to stop Endast om spelet anger att det inte ska stoppas - + Never ask Fråga aldrig - + Very Small (16 MB) Mycket liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Mycket stor (512 MB) - + Very Low (4 MB) Mycket låg (4 MB) - + Low (8 MB) Låg (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medium (32 MB) - + High (64 MB) Hög (64 MB) - + Very Low (32) Mycket låg (32) - + Low (64) Låg (64) - + Normal (128) Normal (128) - + Medium (256) Medium (256) - + High (512) Hög (512) - + Disabled Inaktiverad - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View Trädvy - + Grid View Rutnätsvy @@ -3288,33 +3295,38 @@ Vill du ta bort gammalt sparat data? Bakgrundsfärg: - + % FSR/SGSR sharpening percentage (e.g. 50%) % - + + Configure Effects... + Konfigurera effekter... + + + Off Av - + VSync Off VSync Av - + Recommended Rekommenderad - + On På - + VSync On VSync På @@ -4941,103 +4953,118 @@ När de har tagits bort kan de INTE återställas. Är du 100% säker på att du - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. - ReShade FX-effekter läses in från mappen post_shaders i Eden-datakatalogen. Ändringar tillämpas direkt medan ett spel körs. + Changes apply immediately while a game is running. + Ändringarna tillämpas omedelbart medan ett spel körs. - + Enable post-processing Aktivera efterbearbetning - + Preset: Förinställning: - + Apply Tillämpa - + Reset Values Återställ värden - + Return every effect to the values the preset ships with. Återställ varje effekt till de värden som förinställningen levereras med. - + Save As... Spara som… - + Save Preset Spara förinställning - + Preset name: Förinställningsnamn: - - Delete - Ta bort + + Clear + Rensa - + + Remove every effect in use and deselect the preset. + Ta bort alla använda effekter och avmarkera förinställningen. + + + Add Effect Lägg till effekt - + + None + Ingen + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Inga effekter används. Välj en förinställning och tryck på Verkställ, eller lägg till effekter en i taget. + + + Custom chain. Pick a preset above and press Apply to replace it. Anpassad kedja. Välj en förinställning ovan och tryck på Tillämpa för att ersätta den. - + Active preset: %1 (modified). Press Reset Values to go back to how it ships. Aktiv förinställning: %1 (ändrad). Tryck på Återställ värden för att återgå till ursprungsvärdena. - + Active preset: %1 Aktiv förinställning: %1 - + Enabled Aktiverad - + Disabled Inaktiverad - + Reset to defaults Återställ standardvärden - + Effect '%1' was not found. Effekten ”%1” hittades inte. - + Effect failed to compile: %1 Effekten kunde inte kompileras: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. Inga användbara ReShade FX-effekter hittades. Placera .fx-filer i mappen post_shaders. @@ -7055,7 +7082,7 @@ Felsökningsmeddelande: - + &Pause &Paus @@ -7206,7 +7233,7 @@ Felsökningsmeddelande: - + &Start &Starta @@ -7217,7 +7244,7 @@ Felsökningsmeddelande: - + R&ecord Spela &in @@ -7308,7 +7335,7 @@ Felsökningsmeddelande: - + None Ingen @@ -7334,400 +7361,405 @@ Felsökningsmeddelande: &Karusellvy - + Small (32x32) Liten (32x32) - + Standard (64x64) Standard (64x64) - + Large (128x128) Stor (128x128) - + Full Size (256x256) Full storlek (256x256) - + Broken Vulkan Installation Detected Felaktig Vulkan-installation upptäcktes - + Vulkan initialization failed during boot. Vulkan-initialiseringen misslyckades under uppstarten. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Kör ett spel - + Loading Web Applet... Läser in webbapplet... - - + + Disable Web Applet Inaktivera webbapplet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Att inaktivera webbappletten kan leda till odefinierat beteende och bör endast användas med Super Mario 3D All-Stars. Är du säker på att du vill inaktivera webbappletten? (Detta kan återaktiveras i felsökningsinställningarna.) - + The amount of shaders currently being built Antalet shaders som för närvarande byggs - + The current selected resolution scaling multiplier. Den aktuella valda multiplikatorn för upplösningsskalning. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Aktuell emuleringshastighet. Värden högre eller lägre än 100% indikerar att emuleringen körs snabbare eller långsammare än en Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Hur många bildrutor per sekund spelet för närvarande visar. Detta varierar från spel till spel och från scen till scen. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tid som krävs för att emulera en Switch-bildruta, exklusive bildbegränsning eller v-synkronisering. För emulering i full hastighet bör detta vara högst 16,67 ms. - + Unmute Aktivera ljud - + Mute Tyst - + Reset Volume Återställ volym - + + Configure Effects... + Konfigurera effekter... + + + &Clear Recent Files &Töm tidigare filer - + &Continue &Fortsätt - + Warning: Outdated Game Format Varning: Föråldrat spelformat - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Du använder det dekonstruerade ROM-katalogformatet för detta spel, vilket är ett föråldrat format som har ersatts av andra format såsom NCA, NAX, XCI eller NSP. Dekonstruerade ROM-kataloger saknar ikoner, metadata och uppdateringsstöd.<br> För en förklaring av de olika Switch-format som Eden har stöd för, se vår användarhandbok. Detta meddelande kommer inte att visas igen. - - + + Error while loading ROM! Fel vid inläsning av ROM! - + The ROM format is not supported. ROM-formatet stöds inte. - + An error occurred initializing the video core. Ett fel uppstod vid initialiseringen av videokärnan. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. Detta orsakas vanligtvis av inaktuella grafikdrivrutiner. Se loggen för mer information. Se: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>Så här kommer du åt loggfiler</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Fel vid inläsning av ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Dumpa dina filer igen eller fråga på Discord/Stoat för hjälp. - + An unknown error occurred. Please see the log for more details. Ett okänt fel har uppstått. Se loggen för mer information. - - + + (64-bit) (64-bitar) - - + + (32-bit) (32-bitar) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Stänger programvara... - + Save Data Sparat data - + Mod Data Mod-data - + Error Opening %1 Folder Fel vid öppning av mappen %1 - - + + Folder does not exist! Mappen finns inte! - + Remove Installed Game Contents? Ta bort installerat spelinnehåll? - + Remove Installed Game Update? Ta bort installerad speluppdatering? - + Remove Installed Game DLC? Ta bort installerat spel-DLC? - + Remove Entry Ta bort post - + Delete OpenGL Transferable Shader Cache? Ta bort OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? Ta bort Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? Ta bort alla Transferable Shader Caches? - + Remove Custom Game Configuration? Ta bort anpassad spelkonfiguration? - + Remove Cache Storage? Ta bort cachelagring? - + Remove File Ta bort fil - + Remove Play Time Data Ta bort data om speltid - + Reset play time? Nollställ speltid? - - + + RomFS Extraction Failed! Extrahering av RomFS misslyckades! - + There was an error copying the RomFS files or the user cancelled the operation. Det uppstod ett fel vid kopieringen av RomFS-filerna eller så avbröt användaren åtgärden. - + Full Fullständigt - + Skeleton Skelett - + Select RomFS Dump Mode Välj dumpläge för RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Välj hur du vill att RomFS ska dumpas. <br>Fullständigt kopierar alla filer till den nya katalogen, medan <br>skelett endast skapar katalogstrukturen. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Det finns inte tillräckligt med ledigt utrymme på %1 för att extrahera RomFS. Frigör utrymme eller välj en annan dumpkatalog under Emulering > Konfigurera > System > Filsystem > Dumprot. - + Extracting RomFS... Extraherar RomFS... - - + + Cancel Avbryt - + RomFS Extraction Succeeded! Extrahering av RomFS lyckades! - + The operation completed successfully. Operationen slutfördes. - + Error Opening %1 Fel vid öppning av %1 - + Select Directory Välj katalog - + Properties Egenskaper - + The game properties could not be loaded. Spelegenskaperna kunde inte läsas in. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Körbar Switch-fil (%1);;Alla filer (*.*) - + Load File Läs in fil - + Open Extracted ROM Directory Öppna katalog för extraherad ROM - + Invalid Directory Selected Ogiltig katalog valdes - + The directory you have selected does not contain a 'main' file. Den katalog du har valt innehåller ingen ”main”-fil. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installerbar Switch-fil (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Installera filer - + %n file(s) remaining %n fil återstår%n filer återstår - + Installing file "%1"... Installerar filen "%1"... - - + + Install Results Installationsresultat - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. För att undvika eventuella konflikter avråder vi användare från att installera basspel på NAND. Använd endast denna funktion för att installera uppdateringar och DLC. - + %n file(s) were newly installed %n ny fil installerades @@ -7735,7 +7767,7 @@ Använd endast denna funktion för att installera uppdateringar och DLC. - + %n file(s) were overwritten %n fil skrevs över @@ -7743,7 +7775,7 @@ Använd endast denna funktion för att installera uppdateringar och DLC. - + %n file(s) failed to install %n fil gick inte att installera @@ -7751,314 +7783,324 @@ Använd endast denna funktion för att installera uppdateringar och DLC. - + System Application Systemapplikation - + System Archive Systemarkiv - + System Application Update Uppdatering för systemapplikation - + Firmware Package (Type A) Firmware-paket (Type A) - + Firmware Package (Type B) Firmware-paket (Type B) - + Game Spel - + Game Update Speluppdatering - + Game DLC DLC för spel - + Delta Title Deltatitel - + Select NCA Install Type... Välj NCA-installationstyp... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Välj vilken typ av titel du vill installera denna NCA som: (I de flesta fall är standardinställningen ”Spel” tillräcklig.) - + Failed to Install Misslyckades med att installera - + The title type you selected for the NCA is invalid. Den titeltypen du valt för NCA är ogiltig. - + File not found Filen hittades inte - + File "%1" not found Filen "%1" hittades inte - + OK Ok - + Function Disabled Funktion inaktiverad - + Compatibility list reporting is currently disabled. Check back later! Rapportering till kompatibilitetslistan är för närvarande inaktiverad. Kom tillbaka senare! - + Error opening URL Fel vid öppning av URL - + Unable to open the URL "%1". Det går inte att öppna URL:en ”%1”. - + TAS Recording TAS-inspelning - + Overwrite file of player 1? Skriv över fil för spelare 1? - + Invalid config detected Ogiltig konfiguration upptäcktes - + Handheld controller can't be used on docked mode. Pro controller will be selected. Handhållen kontroller kan inte användas i dockat läge. Pro-kontrollern kommer att väljas. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Den aktuella amiibo har tagits bort. - + Error Fel - - + + The current game is not looking for amiibos Det aktuella spelet letar inte efter amiibos - + Amiibo File (%1);; All Files (*.*) Amiibo-fil (%1);; Alla filer (*.*) - + Load Amiibo Läs in Amiibo - + Error loading Amiibo data Fel vid läsning av Amiibo-data - + The selected file is not a valid amiibo Den valda filen är inte en giltig amiibo. - + The selected file is already on use Den valda filen används redan - + An unknown error occurred Ett okänt fel uppstod - + No firmware available Ingen firmware tillgänglig - + Firmware Corrupted Firmware är skadat - + Unknown applet Okänd applet - + Applet doesn't map to a known value. Appleten mappar inte till ett känt värde. - + Record not found Posten hittades inte - + Applet not found. Please reinstall firmware. Appleten hittades inte. Installera om fast programvara. - + Capture Screenshot Ta skärmbild - + PNG Image (*.png) PNG-bild (*.png) - + TAS state: Running %1/%2 TAS-tillstånd: Kör %1/%2 - + TAS state: Recording %1 TAS-tillstånd: Spelar in %1 - + TAS state: Idle %1/%2 TAS-tillstånd: Overksam %1/%2 - + TAS State: Invalid TAS-tillstånd: Ogiltig - + &Stop Running &Stoppa körning - + Stop R&ecording Stoppa i&nspelning - + Building: %n shader(s) Bygger: %n shaderBygger: %n shaders - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Hastighet: %1% / %2% - + Speed: %1% Hastighet: %1% - + Game: %1 FPS Spel: %1 bilder/s - + Frame: %1 ms Bildruta: %1 ms - + NO AA NO AA - + + NO FX + INGA FX + + + + FX + FX + + + VOLUME: MUTE VOLYM: TYST - + VOLUME: %1% Volume percentage (e.g. 50%) VOLYM: %1% - + Derivation Components Missing Deriveringskomponenter saknas - + Decryption keys are missing. Install them now? Avkrypteringsnycklar saknas. Installera dem nu? - + Wayland Detected! Wayland upptäcktes! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8069,74 +8111,74 @@ Det rekommenderas att använda X11 istället. Vill du tvinga det för framtida starter? - + Use X11 Använd X11 - + Continue with Wayland Fortsätt med Wayland - + Don't show again Visa inte igen - + Restart Required Omstart krävs - + Restart Eden to apply the X11 backend. Starta om Eden för att tillämpa X11-backend. - + Slow Långsam - + Turbo Turbo - + Unlocked Upplåst - + Select RomFS Dump Target Välj RomFS-dumpmål - + Please select which RomFS you would like to dump. Välj vilken RomFS du vill dumpa. - + Are you sure you want to close Eden? Är du säker på att du vill stänga Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Är du säker på att du vill stoppa emuleringen? Alla osparade framsteg kommer att gå förlorade. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9442,7 +9484,7 @@ p, li { white-space: pre-wrap; } UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - OVÄNTADE PROBLEM KAN UPPSTÅ OM DU INTE LÄSER DETTA! <br>Eden har upptäckt följande sparningskataloger utan bifogade profiler:<br>%1<br><br>Följande profiler är giltiga:<br>%2<br><br>Klicka på ”OK” för att öppna din sparningsmapp och fixa dina profiler.<br>Tips: kopiera innehållet i den största eller senast ändrade mappen till en annan plats, ta bort alla övergivna profiler och flytta det kopierade innehållet till den giltiga profilen.<br><br>Fortfarande förvirrad? Se hjälpsidan<a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>.<br> + OVÄNTADE PROBLEM KAN UPPSTÅ OM DU INTE LÄSER DETTA!<br>Eden har upptäckt följande sparningskataloger utan bifogade profiler:<br>%1<br><br>Följande profiler är giltiga:<br>%2<br><br>Klicka på ”OK” för att öppna din sparningsmapp och fixa dina profiler.<br>Tips: kopiera innehållet i den största eller senast ändrade mappen till en annan plats, ta bort alla övergivna profiler och flytta det kopierade innehållet till den giltiga profilen.<br><br>Fortfarande förvirrad? Se <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>hjälpsidan</a>.<br> diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index 1aea55d216..d200ff2994 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -585,24 +585,34 @@ FXAA can produce a more stable picture in lower resolutions. Kullanılacak kenar yumuşatma yöntemi. SMAA en iyi kaliteyi sunar. FXAA, düşük çözünürlüklerde daha kararlı bir görüntü oluşturabilir. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Tam Ekran Modu: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. Pencereyi tam ekranda işlemek için kullanılan yöntem. Sınırsız, bazı oyunların giriş için istediği ekran klavyesi ile en iyi uyumluluğu sunar. Özel tam ekran, daha iyi performans ve daha iyi Freesync/Gsync desteği sağlayabilir. - + Aspect Ratio: En-Boy Oranı: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -611,46 +621,46 @@ Also controls the aspect ratio of captured screenshots. Ayrıca, yakalanan ekran görüntülerinin en-boy oranını da kontrol eder. - + Use persistent pipeline cache Kalıcı işlem hattı önbelleğini kullan - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Gölgelendiriclerin sonraki oyun açılışlarında daha hızlı yüklenmesi için depolama alanına kaydedilmesine olanak tanır. Devre dışı bırakılması yalnızca hata ayıklama amaçlıdır. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC emülasyonu: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. Videoların nasıl çözüleceğini belirtir. Kod çözme için CPU veya GPU kullanabilir veya hiç kod çözme işlemi yapmayabilir (videolarda siyah ekran). Çoğu durumda GPU ile kod çözme en iyi performansı sağlar. - + ASTC Decoding Method: ASTC Kod Çözme Yöntemi - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -659,55 +669,55 @@ stuttering but may present artifacts. Bu seçenek ASTC dokularının nasıl çözüleceğini kontrol eder. CPU: Kod çözme için işlemciyi kullanır. GPU: ASTC dokularını çözmek için GPU'nun hesaplama gölgelendiricilerini kullanır (önerilir). CPU Asenkron: ASTC dokularını talep üzerine çözmek için işlemciyi kullanır. ASTC kod çözme kaynaklı takılmaları giderir ancak görsel bozulmalara neden olabilir. - + ASTC Recompression Method: ASTC Yeniden Sıkıştırma Yöntemi - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. Çoğu GPU, ASTC dokuları için doğrudan desteğe sahip değildir ve bir ara formata (RGBA8) açılmalıdır. BC1/BC3: Ara format BC1 veya BC3 formatında yeniden sıkıştırılarak VRAM tasarrufu sağlar ancak görüntü kalitesini düşürür. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: VRAM Kullanım Modu - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Emülatörün belleği korumayı mı yoksa performans için mevcut video belleğini maksimum düzeyde kullanmayı mı tercih edeceğini seçer. Agresif mod, kayıt yazılımları gibi diğer uygulamaların performansını etkileyebilir. - + Skip CPU Inner Invalidation CPU Geçersiz Kılma'yı Atla - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Bellek güncellemeleri sırasında belirli önbellek geçersiz kılma işlemlerini atlayarak işlemci kullanımını azaltır ve gecikmeyi iyileştirir. Bu, hafif çökmelere neden olabilir. - + VSync Mode: VSync Modu: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -715,79 +725,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te FIFO (VSync) kare düşürmez veya yırtılma göstermez ancak ekran yenileme hızıyla sınırlıdır. FIFO Relaxed, yavaşlamadan toparlanırken yırtılmaya izin verir. Mailbox, FIFO'dan daha düşük gecikmeye sahip olabilir ve yırtılma yapmaz ancak kare düşürebilir. Immediate (senkronizasyon yok), mevcut olanı anında sunar ve yırtılmalara neden olabilir. - + Sync Memory Operations Bellek İşlemlerini Senkronize Et - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. Hesaplama ve bellek işlemleri arasında veri tutarlılığı sağlar. Bu seçenek oyunlardaki sorunları giderir ancak performansı düşürebilir. Unreal Engine 4 oyunları genellikle bundan en önemli ölçüde etkilenenlerdir. - + Enable asynchronous presentation (Vulkan only) Asenkron sunumu etkinleştir (Yalnızca Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Sunum işlemini ayrı bir işlemci iş parçacığına taşıyarak performansı biraz artırır. - + Force maximum clocks (Vulkan only) En yüksek hızı zorla (Yalnızca Vulkan için) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Grafik komutlarını beklerken GPU'nun hızının düşmesini engellemek için arka planda görev yürütür - + Anisotropic Filtering: Anisotropic Filtering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Eğik açılardaki doku oluşturma kalitesini kontrol eder. Çoğu grafik kartında 16x olarak ayarlanması güvenlidir. - + GPU Mode: Grafik Kartı Modu - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: DMA Doğruluğu: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -797,1328 +807,1328 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Asenkron gölgelendirici derlemeyi etkinleştir - + May reduce shader stutter. Gölgelendirici/shader takılmalarını azaltabilir. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Vulkan pipeline önbelleği kullan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Grafik kartı üreticisine özel işlem hattı önbelleğini etkinleştirir. Bu seçenek, Vulkan sürücüsünün işlem hattı önbellek dosyalarını dahili olarak saklamadığı durumlarda gölgelendirici yükleme süresini önemli ölçüde iyileştirebilir. - + Enable Compute Pipelines (Intel Vulkan Only) Hesaplama İşlem Hatlarını Etkinleştir (Yalnızca Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. Bazı oyunlar için gereklidir. Bu ayar yalnızca Intel'in tescilli sürücüleri için mevcuttur ve etkinleştirilirse çökmeye neden olabilir. Hesaplama işlem hatları diğer tüm sürücülerde her zaman etkindir. - + Enable Reactive Flushing Reaktif Temizlemeyi Etkinleştir - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Tahminli temizleme yerine reaktif temizleme kullanarak daha doğru bellek senkronizasyonu sağlar. - + Sync to framerate of video playback Video oynatma kare hızına senkronize et - + Run the game at normal speed during video playback, even when the framerate is unlocked. Kare hızı kilidi açık olsa bile video oynatımı sırasında oyunu normal hızda çalıştırır. - + Barrier feedback loops Bariyer geri besleme döngüleri - + Improves rendering of transparency effects in specific games. Belirli oyunlarda şeffaflık efektlerinin oluşturulmasını iyileştirir. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State Genişletilmiş Dinamik Durum - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Genişletilmiş Dinamik Durumda kullanılabilecek özelliklerin sayısını kontrol eder. Daha yüksek durumlar daha fazla özelliğe izin verir ve performansı artırabilir, ancak ek grafik sorunlarına neden olabilir. - + Vertex Input Dynamic State Vertex Dinamik Durumu - + Enables vertex input dynamic state feature for better quality and performance. Daha iyi kalite ve performans için Vertex dinamik durum özelliğini etkinleştirir. - + Sample Shading Örnek Gölgelendirme - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Parça gölgelendiricinin, her parça için bir kez yerine çoklu örneklenmiş bir parçadaki her örnek için yürütülmesine olanak tanır. Performans pahasına grafik kalitesini artırır. Daha yüksek değerler kaliteyi artırır ancak performansı düşürür. - + RNG Seed RNG çekirdeği - + Controls the seed of the random number generator. Mainly used for speedrunning. Rastgele sayı üretecinin tohumunu kontrol eder. Esas olarak hızlı bitirme denemeleri için kullanılır. - + Device Name Cihaz İsmi - + The name of the console. Konsolun adı - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Özel RTC Tarihi - + This option allows to change the clock of the console. Can be used to manipulate time in games. Bu seçenek konsolun saatini değiştirmeye olanak tanır. Oyunlarda zamanı manipüle etmek için kullanılabilir. - + The number of seconds from the current unix time Mevcut unix zamanından itibaren saniye sayısı - + Language: Dil: - + This option can be overridden when region setting is auto-select Bölge ayarı otomatik seçim olduğunda bu seçenek geçersiz kılınabilir. - + Region: Bölge: - + The region of the console. Konsolun bölgesi - + Time Zone: Saat Dilimi: - + The time zone of the console. Konsolun saat dilimi - + Sound Output Mode: Ses Çıkış Modu: - + Console Mode: Konsol Modu: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. Konsolun Yerleşik veya El Modunda olup olmadığını seçer. Oyunlar bu ayara bağlı olarak çözünürlüklerini, detaylarını ve desteklenen kontrolcülerini değiştirecektir. El Moduna ayarlamak, düşük seviyeli sistemler için performansı artırmaya yardımcı olabilir. - + Prompt for user profile on boot Açılışta kullanıcı profili için sor - + Useful if multiple people use the same PC. Aynı bilgisayarı birden fazla kişi kullanıyorsa yararlıdır. - + Pause when not in focus Odaklı değilken duraklat - + Pauses emulation when focusing on other windows. Diğer pencerelere odaklanıldığında emülasyonu duraklatır. - + Confirm before stopping emulation Emülasyonu durdurmadan önce onayla - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Emülasyonu durdurma onayı isteklerini/istemlerini geçersiz kılar. Etkinleştirildiğinde, bu tür istekleri/istemleri atlar ve emülasyonu doğrudan/dirket olarak kapatır. - + Hide mouse on inactivity Hareketsizlik durumunda imleci gizle - + Hides the mouse after 2.5s of inactivity. 2,5 saniye hareketsizlikten sonra fareyi gizler. - + Disable controller applet Kontrolcü aplikasyonunu devre dışı bırak - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Emüle edilen programlarda kontrolcü aplikasyonunun kullanımını zorla devre dışı bırakır. Bir program kontrolcü aplikasyonunu açmaya çalıştığında, aplikasyon anında kapatılır. - + Check for updates Güncellemeleri Kontrol Et - + Whether or not to check for updates upon startup. Başlangıçta güncellemelerin kontrol edilip edilmeyeceği. - + Enable Gamemode Oyun Modunu/Gamemode Etkinleştir - + Force X11 as Graphics Backend Grafik arka ucu olarak X11'i zorla - + Custom frontend Özel ön yüz - + Real applet Gerçek aplikasyon - + Never Asla - + On Load Yüklemede - + Always Her zaman - + CPU CPU - + GPU GPU - + CPU Asynchronous Asenkron CPU - + Uncompressed (Best quality) Sıkıştırılmamış (En iyi kalite) - + BC1 (Low quality) BC1 (Düşük kalite) - + BC3 (Medium quality) BC3 (Orta kalite) - - + + Auto Otomatik - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Muhafazakar - + Aggressive Agresif - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Boş - + Fast Hızlı - - - + + + Accurate Doğru - - - + + + Default Varsayılan - + Unsafe (fast) Güvenli Değil (hızlı) - + Safe (stable) Güvenli (Stabil) - + Immediate - + Balanced Dengeli - + Strict - + Unsafe Güvensiz - + Paranoid (disables most optimizations) Paranoya (çoğu optimizasyonu kapatır) - + Debugging Hata ayıklama - + Dynarmic Dinamik - + NCE NCE - + Borderless Windowed Kenarlıksız Tam Ekran - + Exclusive Fullscreen Ayrılmış Tam Ekran - + No Video Output Video Çıkışı Yok - + CPU Video Decoding CPU Video Decoding - + GPU Video Decoding (Default) GPU Video Decoding (Varsayılan) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [DENEYSEL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [DENEYSEL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [DENEYSEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [DENEYSEL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [DENEYSEL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor En Yakın Komşu Algoritması - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gausyen - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Süper Çözünürlük - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Yok - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Varsayılan (16:9) - + Force 4:3 4:3'e Zorla - + Force 21:9 21:9'a Zorla - + Force 16:10 16:10'a Zorla - + Stretch to Window Ekrana Sığdır - + Automatic Otomatik - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonca (日本語) - + American English Amerikan İngilizcesi - + French (français) Fransızca (français) - + German (Deutsch) Almanca (Deutsch) - + Italian (italiano) İtalyanca (italiano) - + Spanish (español) İspanyolca (español) - + Chinese Çince - + Korean (한국어) Korece (한국어) - + Dutch (Nederlands) Flemenkçe (Nederlands) - + Portuguese (português) Portekizce (português) - + Russian (Русский) Rusça (Русский) - + Taiwanese Tayvanca - + British English İngiliz İngilizcesi - + Canadian French Kanada Fransızcası - + Latin American Spanish Latin Amerika İspanyolcası - + Simplified Chinese Basitleştirilmiş Çince - + Traditional Chinese (正體中文) Geleneksel Çince (正體中文) - + Brazilian Portuguese (português do Brasil) Brezilya Portekizcesi (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonya - + USA ABD - + Europe Avrupa - + Australia Avustralya - + China Çin - + Korea Kore - + Taiwan Tayvan - + Auto (%1) Auto select time zone Otomatik (%1) - + Default (%1) Default time zone Varsayılan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Küba - + EET EET - + Egypt Mısır - + Eire İrlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-İrlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 MT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland İzlanda - + Iran İran - + Israel İsrail - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navaho - + NZ Yeni Zelanda - + NZ-CHAT Chatham Adaları - + Poland Polonya - + Portugal Portekiz - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkiye - + UCT UCT - + Universal Evrensel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Varsayılan) - + 6GB DRAM (Unsafe) 6GB DRAM (Güvenli Değil) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Güvenli Değil) - + 12GB DRAM (Unsafe) 12GB DRAM (Güvenli Değil) - + Docked Dock Modu Aktif - + Handheld Taşınabilir - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Her zaman sor (Varsayılan) - + Only if game specifies not to stop Sadece oyun durdurulmamasını belirtirse - + Never ask Asla sorma - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Orta (256) - + High (512) Yüksek (512) - + Disabled Devre Dışı - + ExtendedDynamicState 1 Genişletilmiş Dinamik Durum 1 - + ExtendedDynamicState 2 Genişletilmiş Dinamik Durum 2 - + ExtendedDynamicState 3 Genişletilmiş Dinamik Durum 3 - + Tree View - + Grid View @@ -3228,33 +3238,38 @@ Eski kayıt verilerini silmek ister misiniz? Arkaplan Rengi: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off Kapalı - + VSync Off VSync Kapalı - + Recommended Önerilen - + On Açık - + VSync On Vsync Açık @@ -4876,102 +4891,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6986,7 +7016,7 @@ Debug Message: - + &Pause &Duraklat @@ -7137,7 +7167,7 @@ Debug Message: - + &Start B&aşlat @@ -7148,7 +7178,7 @@ Debug Message: - + R&ecord K&aydet @@ -7239,7 +7269,7 @@ Debug Message: - + None @@ -7265,722 +7295,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected Bozuk Vulkan Kurulumu Algılandı - + Vulkan initialization failed during boot. Açılış sırasında Vulkan başlatma işlemi başarısız oldu. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Bir oyun çalıştırılıyor - + Loading Web Applet... Web Uygulaması Yükleniyor... - - + + Disable Web Applet Web Uygulamasını Devre Dışı Bırak - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Sesi aç - + Mute Sessize al - + Reset Volume Sesi Sıfırla - + + Configure Effects... + + + + &Clear Recent Files &Son Dosyaları Temizle - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL URL açılırken hata oluştu - + Unable to open the URL "%1". - + TAS Recording TAS İşlemi Kaydı - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Mevcut Amiibo kaldırıldı - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted Donanım Yazılımı/Firmware Bozuk - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 TAS durumu: %1/%2 Çalışıyor - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Ölçek: %1x - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7988,74 +8033,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/uk.ts b/dist/languages/uk.ts index ecaec4fa23..055787457d 100644 --- a/dist/languages/uk.ts +++ b/dist/languages/uk.ts @@ -593,12 +593,22 @@ SMAA забезпечує найкращу якість. FXAA може створювати стабільніше зображення при низьких роздільностях. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Повноекранний режим: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -607,12 +617,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp «Ексклюзивний повноекранний» може надати кращі продуктивність і підтримку Freesync/Gsync. - + Aspect Ratio: Співвідношення сторін: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -621,36 +631,36 @@ Also controls the aspect ratio of captured screenshots. Також керує співвідношеням сторін знімків екрана. - + Use persistent pipeline cache Використовувати стійкий кеш конвеєра - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. Дозволяє зберігати шейдери на накопичувачі для швидшого завантаження під час наступних запусків гри. Вимкнення цього налаштування задумане лише для зневадження. - + Use asynchronous GPU emulation Використовувати асинхронну емуляцію ГП - + Uses an extra CPU thread for rendering. This option should always remain enabled. Використовує додатковий потік ЦП для візуалізації. Це налаштування повинно завжди залишатися увімкненим. - + NVDEC emulation: Емуляція NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -659,12 +669,12 @@ In most cases, GPU decoding provides the best performance. У більшості випадків декодування за допомогою ГП забезпечує найкращу продуктивність. - + ASTC Decoding Method: Метод декодування ASTC: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -676,12 +686,12 @@ stuttering but may present artifacts. Асинхронно ЦП: Використання ЦП для декодування ASTC-текстур по мірі їх викликів. Повністю усуває затримки декодування ASTC ціною проблем з візуалізацією, поки текстури декодуються. - + ASTC Recompression Method: Метод перестиснення ASTC: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -689,44 +699,44 @@ BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, BC1/BC3: Проміжний формат буде перепаковано у формат BC1 або BC3 для збереження відеопам’яті, але це негатривно вплине на якість зображення. - + Frame Pacing Mode (Vulkan only) Режим виведення кадрів (лише Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. Керує тим, як емулятор виконує виведення кадрів, щоб зменшити затримки й забезпечити плавнішу й стабільнішу частоту кадрів. - + VRAM Usage Mode: Режим використання відеопам’яті: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. Це налаштування вибирає, чи повинен емулятор надавати перевагу заощадженню пам’яті, чи по максимуму використовувати доступну відеопам’ять задля продуктивності. Режим «Агресивно» може вплинути на продуктивність інших застосунків, як-от засоби запису. - + Skip CPU Inner Invalidation Пропускати внутрішнє анулювання ЦП - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. Пропускає деякі анулювання кешу під час оновлень пам’яті, зменшуючи використання ЦП й виправляючи затримки. Це може спричинити збої. - + VSync Mode: Режим вертикальної синхронізації: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -737,12 +747,12 @@ Mailbox може мати меншу затримку, ніж FIFO, і не ма Immediate (без синхронізації) показує всі кадри й може створювати розриви. - + Sync Memory Operations Синхронізувати операції з пам’яттю - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -751,44 +761,44 @@ Unreal Engine 4 games often see the most significant changes thereof. Ігри на Unreal Engine 4 часто зазнають найзначніших змін. - + Enable asynchronous presentation (Vulkan only) Увімкнути асинхронне подання (лише Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Трохи покращує продуктивність завдяки переміщенню подання на окремий потік ЦП. - + Force maximum clocks (Vulkan only) Примусово максимальна тактова частота (лише Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Виконує роботу у фоновому режимі в очікуванні графічних команд, не даючи змоги ГП знижувати тактову частоту. - + Anisotropic Filtering: Анізотропна фільтрація: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Керує якістю візуалізації текстур під непрямими кутами. Для більшості ГП можна вільно вибирати 16x. - + GPU Mode: Режим ГП: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -797,24 +807,24 @@ Particles tend to only render correctly with Accurate mode. Частинки зазвичай правильно візуалізуються лише з режимом «Точно». - + DMA Accuracy: Точність DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -824,55 +834,55 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation Увімкнути асинхронну компіляцію шейдерів - + May reduce shader stutter. Може зменшити шейдерні затримки. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle Розпакування за допомогою ГП - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Прискорює декодування 3D-текстур BCn застосовуючи обчислення за допомогою ГП. Вимкніть у разі збоїв або проблем із графікою. - + GPU Unswizzle Max Texture Size Максимальний розмір текстур для розпакування за допомогою ГП - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -881,48 +891,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size Розмір потоку розпакування за допомогою ГП - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Встановлює максимальний обсяг даних текстур (у МіБ) для обробки на кадр. Вищі значення здатні зменшити затримки під час завантаження текстур, але можуть вплинути на стабільність кадрів. - + GPU Unswizzle Chunk Size Розмір блоків розпакування за допомогою ГП - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Визначає кількість зрізів глибини, оброблених за одне відправлення. Збільшення здатне покращити пропускну здатність на потужних ГП, але може призвести до TDR або затримок драйвера зі слабшим устаткуванням. - + Use Vulkan pipeline cache Використовувати кеш конвеєра Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Вмикає особливий для різних виробників ГП кеш конвеєра. Це налаштування може значно зменшити час завантаження шейдерів у випадках, коли драйвер Vulkan не зберігає власний кеш конвеєра. - + Enable Compute Pipelines (Intel Vulkan Only) Увімкнути обчислювальні конвеєри (лише Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -931,194 +941,194 @@ Compute pipelines are always enabled on all other drivers. Обчислювальні конвеєри завжди увімкнені у всіх інших драйверах. - + Enable Reactive Flushing Увімкнути реактивне очищення - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Використовує реактивне очищення замість прогнозованого, забезпечуючи точнішу синхронізацію пам’яті. - + Sync to framerate of video playback Синхронізувати частоту кадрів з відтворенням відео - + Run the game at normal speed during video playback, even when the framerate is unlocked. Відтворювати гру з нормальною швидкістю під час відтворення відео навіть при розблокованій частоті кадрів. - + Barrier feedback loops Бар’єрні цикли відгуку - + Improves rendering of transparency effects in specific games. Покращує візуалізацію ефектів прозорості в деяких іграх. - + Enable buffer history Увімкнути історію буфера - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Вмикає доступ до попередніх станів буфера. Цей параметр може покращити якість візуалізації та стабільну продуктивність у деяких іграх. - + Fix bloom effects Виправити ефекти світіння - + Removes bloom in Burnout. Прибирає світіння в Burnout. - + Enable Legacy Rescale Pass Увімкнути застаріле масштабування - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Може виправити проблеми з масштабуванням в іграх, покладаючись на поведінку з попередньої імплементації. Застаріле масштабування виправляє артефакти з лініями на ГП від AMD та Intel, а також сіре блимання текстур на ГП від Nvidia в Luigis Mansion 3. - + Extended Dynamic State Розширений динамічний стан - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Керує кількістю функцій, які можна використовувати в «Розширеному динамічному стані». Вищі значення допускають більше функцій і можуть збільшити продуктивність, але можуть спричинити додаткові проблеми з графікою. - + Vertex Input Dynamic State Динамічний стан введення вершин - + Enables vertex input dynamic state feature for better quality and performance. Вмикає можливість динамічного стану введення вершин для кращих якості й продуктивності. - + Sample Shading Шейдинг зразків - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Дозволяє виконувати фрагмент шейдера для кожного зразка в багатозразковому фрагменті замість одного разу для кожного фрагмента. Покращує якість графікі ціною втрати продуктивності. Вищі значення покращують якість, але погіршують продуктивність. - + RNG Seed Початкове значення RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Керує початковим значення генератора випадкових чисел. Зазвичай використовується в спідранах. - + Device Name Назва пристрою - + The name of the console. Назва консолі. - + Homebrew Args Параметри запуску Homebrew - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Параметри командного рядка, що передаються Homebrew при запуску (як-от noglsl). - + Custom RTC Date: Користувацька дата RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Це налаштування дозволяє змінити час годинника консолі. Можна використовувати для маніпуляцій із часом в іграх. - + The number of seconds from the current unix time Кількість секунд від поточного unix-часу. - + Language: Мова: - + This option can be overridden when region setting is auto-select Це налаштування може перевизначитися, якщо налаштування регіону вибирається автоматично - + Region: Регіон: - + The region of the console. Регіон консолі. - + Time Zone: Часовий пояс: - + The time zone of the console. Часовий пояс консолі. - + Sound Output Mode: Режим виведення звуку: - + Console Mode: Режим консолі: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1127,1042 +1137,1042 @@ Setting to Handheld can help improve performance for low end systems. Налаштування «Портативний» може покращити продуктивність на слабких системах. - + Prompt for user profile on boot Запитувати профіль користувача під час запуску - + Useful if multiple people use the same PC. Корисно, якщо одним комп’ютером користуються кілька користувачів. - + Pause when not in focus Призупиняти, якщо не у фокусі - + Pauses emulation when focusing on other windows. Призупиняє емуляцію при фокусування на інших вікнах. - + Confirm before stopping emulation Підтверджувати зупинку емуляції - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Перевизначає запити на підтвердження зупинки емуляції. Увімкнення обходить такі запити й одразу зупиняє емуляцію. - + Hide mouse on inactivity Приховувати курсор миші при бездіяльності - + Hides the mouse after 2.5s of inactivity. Приховує курсор миші після 2,5 с її бездіяльності. - + Disable controller applet Вимкнути аплет контролера - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Примусово вимикає використання в емульованих програмах аплета контролера. Якщо програма спробує відкрити аплет контролера, він одразу закриється. - + Check for updates Перевіряти оновлення - + Whether or not to check for updates upon startup. Чи перевіряти оновлення при запуску. - + Enable Gamemode Увімкнути ігровий режим - + Force X11 as Graphics Backend Примусово використовувати X11 як графічний бекенд - + Custom frontend Користувацький фронтенд - + Real applet Справжній аплет - + Never Ніколи - + On Load При завантаженні - + Always Завжди - + CPU ЦП - + GPU ГП - + CPU Asynchronous Асинхронно ЦП - + Uncompressed (Best quality) Без стиснення (Найкраща якість) - + BC1 (Low quality) ВС1 (Низька якість) - + BC3 (Medium quality) ВС3 (Середня якість) - - + + Auto Автоматично - + 30 FPS 30 к/с - + 60 FPS 60 к/с - + 90 FPS 90 к/с - + 120 FPS 120 к/с - + Conservative Заощадження - + Aggressive Агресивно - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (асемблерні шейдери, лише NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (експериментально, лише AMD/Mesa) - + Null Нічого - + Fast Швидко - - - + + + Accurate Точно - - - + + + Default Стандартно - + Unsafe (fast) Небезпечно (швидко) - + Safe (stable) Безпечно (стабільно) - + Immediate - + Balanced Збалансовано - + Strict - + Unsafe Небезпечно - + Paranoid (disables most optimizations) Параноїк (вимикає більшість оптимізацій) - + Debugging Зневадження - + Dynarmic Динамічно - + NCE NCE - + Borderless Windowed Безрамкове вікно - + Exclusive Fullscreen Ексклюзивний повноекранний - + No Video Output Виведення відео відсутнє - + CPU Video Decoding Декодування відео на ЦП - + GPU Video Decoding (Default) Декодування відео на ГП (стандатно) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [ЕКСПЕРИМЕНТАЛЬНО] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [ЕКСПЕРИМЕНТАЛЬНО] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ЕКСПЕРИМЕНТАЛЬНО] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [ЕКСПЕРИМЕНТАЛЬНО] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [ЕКСПЕРИМЕНТАЛЬНО] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Найближчий сусід - + Bilinear Білінійний - + Bicubic Бікубічний - + Gaussian Ґаусса - + Lanczos Ланцоша - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Області - + MMPX MMPX - + Zero-Tangent Нульовий тангенс - + B-Spline B-Spline - + Mitchell Мітчелла - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Немає - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Стандартно (16:9) - + Force 4:3 Примусово 4:3 - + Force 21:9 Примусово 21:9 - + Force 16:10 Примусово 16:10 - + Stretch to Window Розтягнути до вікна - + Automatic Автоматично - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Японська (日本語) - + American English Американська англійська - + French (français) Французька (français) - + German (Deutsch) Німецька (Deutsch) - + Italian (italiano) Італійська (italiano) - + Spanish (español) Іспанська (español) - + Chinese Китайська - + Korean (한국어) Корейська (한국어) - + Dutch (Nederlands) Нідерландська (Nederlands) - + Portuguese (português) Португальська (português) - + Russian (Русский) Російська (Русский) - + Taiwanese Тайванська - + British English Британська англійська - + Canadian French Канадська французька - + Latin American Spanish Латиноамериканська іспанська - + Simplified Chinese Спрощена китайська - + Traditional Chinese (正體中文) Традиційна китайська (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильська португальська (português do Brasil) - + Polish (polska) Польська (polska) - + Thai (แบบไทย) Тайська (แบบไทย) - - + + Japan Японія - + USA США - + Europe Європа - + Australia Австралія - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Автоматично (%1) - + Default (%1) Default time zone Стандартно (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Єгипет - + Eire Ейре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвіч - + Hongkong Гонконг - + HST HST - + Iceland Ісландія - + Iran Іран - + Israel Ізраїль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Лівія - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польща - + Portugal Португалія - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сінгапур - + Turkey Туреччина - + UCT UCT - + Universal Універсальний - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулу - + Mono Моно - + Stereo Стерео - + Surround Об’ємний - + 4GB DRAM (Default) 4GB DRAM (стандартно) - + 6GB DRAM (Unsafe) 6GB DRAM (небезпечно) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (небезпечно) - + 12GB DRAM (Unsafe) 12GB DRAM (небезпечно) - + Docked У докстанції - + Handheld Портативний - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Завжди запитувати (стандартно) - + Only if game specifies not to stop Лише якщо гра вказує не зупиняти - + Never ask Ніколи не запитувати - + Very Small (16 MB) Дуже малий (16 МБ) - + Small (32 MB) Малий (32 МБ) - + Normal (128 MB) Нормальний (128 МБ) - + Large (256 MB) Великий (256 МБ) - + Very Large (512 MB) Дуже великий (512 МБ) - + Very Low (4 MB) Дуже низький (4 МБ) - + Low (8 MB) Низький (8 МБ) - + Normal (16 MB) Нормальний (16 МБ) - + Medium (32 MB) Середній (32 МБ) - + High (64 MB) Високий (64 МБ) - + Very Low (32) Дуже низький (32) - + Low (64) Низький (64) - + Normal (128) Нормальний (128) - + Medium (256) Середньо (256) - + High (512) Високо (512) - + Disabled Вимкнено - + ExtendedDynamicState 1 Розширений динамічний стан 1 - + ExtendedDynamicState 2 Розширений динамічний стан 2 - + ExtendedDynamicState 3 Розширений динамічний стан 3 - + Tree View Дерево вибору - + Grid View Таблиця @@ -3274,33 +3284,38 @@ Would you like to delete the old save data? Колір тла: - + % FSR/SGSR sharpening percentage (e.g. 50%) % - + + Configure Effects... + + + + Off Вимкнено - + VSync Off Вертикальну синхронізацію вимкнено - + Recommended Рекомендовано - + On Увімкнено - + VSync On Вертикальну синхронізацію увімкнено @@ -4927,102 +4942,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -7040,7 +7070,7 @@ Debug Message: - + &Pause [&P] Призупинити @@ -7191,7 +7221,7 @@ Debug Message: - + &Start [&S] Запустити @@ -7202,7 +7232,7 @@ Debug Message: - + R&ecord [&E] Запис @@ -7293,7 +7323,7 @@ Debug Message: - + None Жодного @@ -7319,400 +7349,405 @@ Debug Message: - + Small (32x32) Маленький (32х32) - + Standard (64x64) Стандартний (64х64) - + Large (128x128) Великий (128х128) - + Full Size (256x256) Повнорозмірний (256х256) - + Broken Vulkan Installation Detected Виявлено пошкоджене встановлення Vulkan - + Vulkan initialization failed during boot. Не вдалося ініціалізувати Vulkan під час запуску. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Запущено гру - + Loading Web Applet... Завантаження вебаплета... - - + + Disable Web Applet Вимкнути вебаплет - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Вимкнення вебапплета може призвести до несподіваної поведінки, і це слід робити лише для Super Mario 3D All-Stars. Ви впевнені, що хочете вимкнути вебапплет? (Його можна знову увімкнути в налаштуваннях зневадження.) - + The amount of shaders currently being built Кількість наразі створених шейдерів - + The current selected resolution scaling multiplier. Наразі вибраний множник масштабування роздільності. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Поточна швидкість емуляції. Значення вище або нижче 100% вказують на те, що емуляція йде швидше або повільніше, ніж на Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Частота кадрів, яку наразі показує гра. Значення змінюватиметься залежно від гри та з кожною сценою. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Час, потрібний для емуляції 1 кадру Switch, не враховуючи обмеження частоти кадрів або вертикальну синхронізацію. Для повношвидкісної емуляції значення повинно бути не вище 16,67 мс. - + Unmute Увімкнути звук - + Mute Вимкнути звук - + Reset Volume Скинути гучність - + + Configure Effects... + + + + &Clear Recent Files [&C] Очистити нещодавні файли - + &Continue [&C] Продовжити - + Warning: Outdated Game Format Увага: Застарілий формат гри - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Для цієї гри ви використовуєте формат теки з деконструйованим ROM, який є застарілим форматом, заміненим на інші, як-от NCA, NAX, XCI, або NSP. У тек із деконструйованими ROM немає значків, метаданих, а також вони не підтримують оновлення.<br>Для подробиць стосовно різноманітних форматів Switch, які підтримує Eden, ознайомтеся з нашим посібником користувача. Це повідомлення не буде показано знову. - - + + Error while loading ROM! Помилка під час завантаження ROM! - + The ROM format is not supported. Непідтримуваний формат ROM. - + An error occurred initializing the video core. Сталася помилка під час ініціалізації відеоядра. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Помилка під час завантаження ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Створіть новий дамп файлів або зверніться по допомогу в Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Сталася невідома помилка. Ознайомтеся з журналом, щоб дізнатися подробиці. - - + + (64-bit) (64-бітовий) - - + + (32-bit) (32-бітовий) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Закриття програмного засобу... - + Save Data Дані збережень - + Mod Data Дані модів - + Error Opening %1 Folder Помилка під час відкриття теки «%1» - - + + Folder does not exist! Теки не існує! - + Remove Installed Game Contents? Вилучити встановлений вміст гри? - + Remove Installed Game Update? Вилучити встановлені оновлення гри? - + Remove Installed Game DLC? Вилучити встановлені доповнення гри? - + Remove Entry Вилучити запис - + Delete OpenGL Transferable Shader Cache? Видалити переміщуваний кеш шейдерів OpenGL? - + Delete Vulkan Transferable Shader Cache? Видалити переміщуваний кеш шейдерів Vulkan? - + Delete All Transferable Shader Caches? Видалити весь переміщуваний кеш шейдерів? - + Remove Custom Game Configuration? Вилучити користувацькі налаштування гри? - + Remove Cache Storage? Вилучити сховище кешу? - + Remove File Вилучити файл - + Remove Play Time Data Вилучити дані награного часу - + Reset play time? Скинути награний час? - - + + RomFS Extraction Failed! Не вдалося видобути RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Під час копіювання файлів RomFS сталася помилка або користувач скасував операцію. - + Full Повний - + Skeleton Скелет - + Select RomFS Dump Mode Виберіть режим створення дампу RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Виберіть, як ви хочете виконати дамп RomFS <br>Повний скопіює всі файли до нової теки, тоді як <br>скелет створить лише структуру тек. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root За адресою «%1» недостатньо вільного місця для видобування RomFS. Звільніть місце або виберіть іншу теку для створення дампу в «Емуляція» → «Налаштувати» → «Система» → «Файлова система» → «Коренева тека дампів». - + Extracting RomFS... Видобування RomFS... - - + + Cancel Скасувати - + RomFS Extraction Succeeded! RomFS видобуто успішно! - + The operation completed successfully. Операцію успішно виконано. - + Error Opening %1 Помилка під час відкриття «%1» - + Select Directory Вибрати теку - + Properties Властивості - + The game properties could not be loaded. Неможливо завантажити властивості гри. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Виконуваний файл Switch (%1);;Усі файли (*.*) - + Load File Завантажити файл - + Open Extracted ROM Directory Відкрити теку видобутого ROM - + Invalid Directory Selected Вибрано неправильну теку - + The directory you have selected does not contain a 'main' file. Вибрана тека не містить файлу «main». - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Встановлюваний файл Switch (*.nca, *.nsp, *.xci);;Архів вмісту Nintendo (*.nca);;Пакет подання Nintendo (*.nsp);;Образ картриджа NX (*.xci) - + Install Files Встановити файли - + %n file(s) remaining Лишився 1 файлЛишилося %n файлиЛишилося %n файлівЛишилося %n файлів - + Installing file "%1"... Встановлення файлу «%1»... - - + + Install Results Результати встановлення - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Щоб уникнути можливих конфліктів, ми не радимо користувачам встановлювати ігри в NAND. Користуйтеся цією функцією лише для встановлення оновлень і доповнень. - + %n file(s) were newly installed Щойно встановлено %n файл @@ -7722,7 +7757,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten Перезаписано %n файл @@ -7732,7 +7767,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install Не вдалося встановити %n файл @@ -7742,314 +7777,324 @@ Please, only use this feature to install updates and DLC. - + System Application Системний застосунок - + System Archive Системний архів - + System Application Update Оновлення системного застосунку - + Firmware Package (Type A) Пакет прошивки (Тип А) - + Firmware Package (Type B) Пакет прошивки (Тип Б) - + Game Гра - + Game Update Оновлення гри - + Game DLC Доповнення гри - + Delta Title Проєкт «Дельта» - + Select NCA Install Type... Виберіть тип встановлення NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Виберіть тип проєкту, який ви хочете встановити для цього NCA: (У більшості випадків підходить стандартний вибір «Гра».) - + Failed to Install Не вдалося встановити - + The title type you selected for the NCA is invalid. Тип проєкту, який ви вибрали для NCA, неправильний. - + File not found Файл не виявлено - + File "%1" not found Файл «%1» не виявлено - + OK Гаразд - + Function Disabled Функцію вимкнену - + Compatibility list reporting is currently disabled. Check back later! Звітування для переліку сумісності наразі вимкнено. Зазирніть пізніше! - + Error opening URL Помилка під час відкриття URL - + Unable to open the URL "%1". Не вдалося відкрити URL: «%1». - + TAS Recording Записування TAS - + Overwrite file of player 1? Перезаписати файл гравця 1? - + Invalid config detected Виявлено неправильне налаштування - + Handheld controller can't be used on docked mode. Pro controller will be selected. Портативний контролер неможливо використовувати в режимі докстанції. Буде вибрано контролер Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Поточний amiibo вилучено - + Error Помилка - - + + The current game is not looking for amiibos Поточна гра не очікує amiibo - + Amiibo File (%1);; All Files (*.*) Файл amiibo (%1);; Усі файли (*.*) - + Load Amiibo Завантажити amiibo - + Error loading Amiibo data Помилка під час завантаження даних amiibo - + The selected file is not a valid amiibo Вибраний файл не є дійсним amiibo - + The selected file is already on use Вибраний файл уже використовується - + An unknown error occurred Сталася невідома помилка - + No firmware available Немає доступних прошивок - + Firmware Corrupted Прошивка пошкоджена - + Unknown applet Невідомий аплет - + Applet doesn't map to a known value. Аплет не призначено до відомого значення. - + Record not found Запис не виявлено - + Applet not found. Please reinstall firmware. Аплет не виявлено. Перевстановіть прошивку. - + Capture Screenshot Зробити знімок екрана - + PNG Image (*.png) Зображення PNG (*.png) - + TAS state: Running %1/%2 Стан TAS: Працює %1/%2 - + TAS state: Recording %1 Стан TAS: Триває запис %1 - + TAS state: Idle %1/%2 Стан TAS: Бездіяльність %1/%2 - + TAS State: Invalid Стан TAS: Неправильний - + &Stop Running [&S] Зупинити - + Stop R&ecording [&E] Зупинити запис - + Building: %n shader(s) Компіляція: %n шейдерКомпіляція: %n шейдериКомпіляція: %n шейдерівКомпіляція: %n шейдерів - + Scale: %1x %1 is the resolution scaling factor Масштаб: %1x - + Speed: %1% / %2% Швидкість: %1% / %2% - + Speed: %1% Швидкість: %1% - + Game: %1 FPS Гра: %1 к/с - + Frame: %1 ms Кадр: %1 мс - + NO AA БЕЗ ЗГЛАДЖУВАННЯ - + + NO FX + + + + + FX + + + + VOLUME: MUTE ГУЧНІСТЬ: ВИМКНЕНО - + VOLUME: %1% Volume percentage (e.g. 50%) ГУЧНІСТЬ: %1% - + Derivation Components Missing Відсутні компоненти виведення - + Decryption keys are missing. Install them now? Відсутні ключі шифрування. Встановити їх зараз? - + Wayland Detected! Виявлено Wayland! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8060,74 +8105,74 @@ Would you like to force it for future launches? Хочете примусово увімкнути його для наступних запусків? - + Use X11 Використовувати X11 - + Continue with Wayland Продовжити з Wayland - + Don't show again Не показувати знову - + Restart Required Потрібен перезапуск - + Restart Eden to apply the X11 backend. Перезапуск Eden для застосування бекенду X11. - + Slow Сповільнення - + Turbo Прискорення - + Unlocked Розблоковано - + Select RomFS Dump Target Виберіть розташування для створення дампу RomFS - + Please select which RomFS you would like to dump. Виберіть, який дамп RomFS ви хочете створити. - + Are you sure you want to close Eden? Ви впевнені, що хочете закрити Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Ви впевнені, що хочете зупинити емуляцію? Увесь незбережений поступ буде втрачено. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/vi.ts b/dist/languages/vi.ts index 2fc96b21fe..a65e346ea0 100644 --- a/dist/languages/vi.ts +++ b/dist/languages/vi.ts @@ -571,70 +571,80 @@ FXAA can produce a more stable picture in lower resolutions. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Chế độ toàn màn hình: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Tỉ lệ khung hình: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Giả lập NVDEC: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +653,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: Chế độ Vsync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -699,79 +709,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Bật hiển thị bất đồng bộ (chỉ cho Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) Buộc chạy ở xung nhịp tối đa (chỉ cho Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Chạy các công việc trong nền trong khi đang chờ lệnh đồ họa để giữ cho GPU không giảm xung nhịp. - + Anisotropic Filtering: Lọc bất đẳng hướng: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -781,1327 +791,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Dùng bộ nhớ đệm pipeline Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Bật xả tương ứng - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback Đồng bộ hóa với tốc độ khung hình khi phát video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Chạy game với tốc độ bình thường trong quá trình phát video, ngay cả khi tốc độ khung hình được mở khóa. - + Barrier feedback loops Vòng lặp phản hồi rào cản - + Improves rendering of transparency effects in specific games. Cải thiện hiệu quả kết xuất của hiệu ứng trong suốt trong một số game. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Hạt giống RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Tên thiết bị - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Vùng: - + The region of the console. - + Time Zone: Múi giờ: - + The time zone of the console. - + Sound Output Mode: Chế độ đầu ra âm thanh: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ẩn con trỏ chuột khi không dùng - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Vô hiệu hoá applet tay cầm - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) Không nén (Chất lượng tốt nhất) - + BC1 (Low quality) BC1 (Chất lượng thấp) - + BC3 (Medium quality) BC3 (Chất lượng trung bình) - - + + Auto Tự động - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Chính xác - - - + + + Default Mặc định - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Không an toàn - + Paranoid (disables most optimizations) Paranoid (vô hiệu hoá hầu hết sự tối ưu) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Cửa sổ không viền - + Exclusive Fullscreen Toàn màn hình - + No Video Output Không có đầu ra video - + CPU Video Decoding Giải mã video bằng CPU - + GPU Video Decoding (Default) Giải mã video bằng GPU (Mặc định) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [THỬ NGHIỆM] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [THỬ NGHIỆM] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Không có - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Mặc định (16:9) - + Force 4:3 Dùng 4:3 - + Force 21:9 Dùng 21:9 - + Force 16:10 Dùng 16:10 - + Stretch to Window Mở rộng đến cửa sổ - + Automatic Tự động - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Español) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Nederlands) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh Anh - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Tây Ban Nha Mỹ Latinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha Brasil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3201,33 +3211,38 @@ Would you like to delete the old save data? Màu nền: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off Tắt - + VSync Off Tắt Vsync - + Recommended Đề xuất - + On Bật - + VSync On Bật Vsync @@ -4849,102 +4864,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6959,7 +6989,7 @@ Debug Message: - + &Pause &Tạm dừng @@ -7110,7 +7140,7 @@ Debug Message: - + &Start &Bắt đầu @@ -7121,7 +7151,7 @@ Debug Message: - + R&ecord G&hi lại @@ -7212,7 +7242,7 @@ Debug Message: - + None @@ -7238,722 +7268,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7961,74 +8006,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index e81053b393..3dd8f18281 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -571,70 +571,80 @@ FXAA can produce a more stable picture in lower resolutions. - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: Chế độ Toàn màn hình: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. - + Aspect Ratio: Tỉ lệ khung hình: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: Giả lập NVDEC - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. - + ASTC Decoding Method: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -643,55 +653,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: Chế độ Vsync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -699,79 +709,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Bật hiển thị bất đồng bộ (chỉ dành cho Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) Buộc chạy ở xung nhịp tối đa (chỉ Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Chạy các công việc trong nền trong khi đang chờ lệnh đồ họa để giữ cho GPU không giảm xung nhịp. - + Anisotropic Filtering: Bộ lọc góc nghiêng: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -781,1327 +791,1327 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Dùng Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Bật xả tương ứng - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback Đồng bộ hóa với tốc độ khung hình khi phát video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Chạy game với tốc độ bình thường trong quá trình phát video, ngay cả khi tốc độ khung hình được mở khóa. - + Barrier feedback loops Vòng lặp phản hồi rào cản - + Improves rendering of transparency effects in specific games. Cải thiện hiệu quả hiển thị của hiệu ứng trong suốt trong một số trò chơi. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Hạt giống RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Tên thiết bị - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Vùng: - + The region of the console. - + Time Zone: Múi giờ: - + The time zone of the console. - + Sound Output Mode: Chế độ đầu ra âm thanh - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ẩn con trỏ chuột khi không dùng - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Vô hiệu hoá applet tay cầm - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) Không nén (Chất lượng tốt nhất) - + BC1 (Low quality) BC1 (Chất lượng thấp) - + BC3 (Medium quality) BC3 (Chất lượng trung bình) - - + + Auto Tự động - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Tuyệt đối - - - + + + Default Mặc định - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe Tương đối - + Paranoid (disables most optimizations) Paranoid (vô hiệu hoá hầu hết sự tối ưu) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Cửa sổ không viền - + Exclusive Fullscreen Toàn màn hình - + No Video Output Không Video Đầu Ra - + CPU Video Decoding Giải mã video bằng CPU - + GPU Video Decoding (Default) Giải mã video bằng GPU (Mặc định) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [THỬ NGHIỆM] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [THỬ NGHIỆM] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian ScaleForce - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Trống - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Mặc định (16:9) - + Force 4:3 Dùng 4:3 - + Force 21:9 Dùng 21:9 - + Force 16:10 Dung 16:10 - + Stretch to Window Kéo dãn đến cửa sổ phần mềm - + Automatic Tự động - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Spanish) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Dutch) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh UK (British English) - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Mỹ La-tinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha của người Brazil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Châu Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Chế độ cắm TV - + Handheld Cầm tay - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3201,33 +3211,38 @@ Would you like to delete the old save data? Màu nền: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off Tắt - + VSync Off Tắt Vsync - + Recommended Đề xuất - + On Bật - + VSync On Bật Vsync @@ -4849,102 +4864,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6959,7 +6989,7 @@ Debug Message: - + &Pause &Tạm dừng @@ -7110,7 +7140,7 @@ Debug Message: - + &Start &Bắt đầu @@ -7121,7 +7151,7 @@ Debug Message: - + R&ecord G&hi @@ -7212,7 +7242,7 @@ Debug Message: - + None @@ -7238,722 +7268,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7961,74 +8006,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index 2321ff89e0..29ff0fe772 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -594,12 +594,22 @@ SMAA 提供最佳质量。 FXAA 可以在较低分辨率下产生更稳定的画面。 - + + Enable post-processing effects + 开启后处理效果 + + + + Applies post-processing effects to the final image. + 给最终图像加上后处理效果。 + + + Fullscreen Mode: 全屏模式: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -608,12 +618,12 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp 独占全屏提供更好的性能和 Freesync/Gsync 支持。 - + Aspect Ratio: 屏幕纵横比: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. @@ -622,36 +632,36 @@ Also controls the aspect ratio of captured screenshots. 此设置同时控制捕获截图的高宽比。 - + Use persistent pipeline cache 使用持久管道缓存 - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. 将生成的着色器保存到硬盘,提高后续游戏过程中的着色器加载速度。 请仅在调试时禁用此项。 - + Use asynchronous GPU emulation 使用异步 GPU 模拟 - + Uses an extra CPU thread for rendering. This option should always remain enabled. 使用额外的 CPU 线程进行渲染。 此选项应始终保持启用状态。 - + NVDEC emulation: NVDEC 模拟方式: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -660,12 +670,12 @@ In most cases, GPU decoding provides the best performance. 大多数情况下,使用 GPU 解码将提供最好的性能。 - + ASTC Decoding Method: ASTC 纹理解码方式: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -678,12 +688,12 @@ CPU 异步模拟:使用 CPU 在 ASTC 纹理到达时对其进行解码。 消除 ASTC 解码带来的卡顿,但在解码时可能出现渲染问题。 - + ASTC Recompression Method: ASTC 纹理重压缩方式: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. @@ -692,44 +702,44 @@ BC1/BC3: 中间格式将被重新压缩为 BC1 或 BC3 格式,从而节省显存 但会降低图像质量。 - + Frame Pacing Mode (Vulkan only) 帧同步模式 (仅限 Vulkan) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. 控制模拟器如何管理帧同步,以减少卡顿,使帧率表现更加平稳顺滑。 - + VRAM Usage Mode: VRAM 使用模式: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. 选择模拟器是应优先节省内存还是最大限度地使用可用视频内存以提高性能。 激进模式可能会影响诸如录屏软件等其他应用程序的性能,。 - + Skip CPU Inner Invalidation 跳过 CPU 内部失效处理 - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. 在内存更新期间跳过某些缓存失效,从而降低 CPU 使用率并改善延迟。这可能导致软件崩溃。 - + VSync Mode: 垂直同步模式: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -740,12 +750,12 @@ Mailbox 的延迟可能比 FIFO 低且不会导致撕裂,但可能会丢帧。 Immediate (不同步) 会呈现全部可用内容,并可能出现撕裂。 - + Sync Memory Operations 同步内存操作 - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -754,44 +764,44 @@ Unreal Engine 4 games often see the most significant changes thereof. 虚幻 4 引擎的游戏通常会看到最显著的变化。 - + Enable asynchronous presentation (Vulkan only) 启用异步帧提交 (仅限 Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. 将帧提交移动到单独的 CPU 线程,略微提高性能。 - + Force maximum clocks (Vulkan only) 强制最大时钟 (仅限 Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. 在后台运行的同时等待图形命令,以防止 GPU 降低时钟速度。 - + Anisotropic Filtering: 各向异性过滤: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. 控制在斜角下纹理渲染的质量。 大多数 GPU 上设置为 16 倍是安全的。 - + GPU Mode: GPU 模式: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -799,12 +809,12 @@ Particles tend to only render correctly with Accurate mode. 大多数游戏在“快速”模式下渲染效果良好,但有些游戏仍需使用“精确”模式。而粒子效果通常只有在“精确”模式下才能正确渲染。 - + DMA Accuracy: DMA 精度: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -813,12 +823,12 @@ Default follows the GPU Accuracy setting. 默认使用 GPU 精度设置。 - + GPU Fence Behavior: GPU 围栏行为: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -833,55 +843,55 @@ Default follows the GPU Accuracy setting. 默认遵循 GPU “精确”设定。 - + Enable GPU buffer readback 开启 GPU 缓冲区回读 - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. 通过在上传前读取来保留 GPU 修改的数据。 某些游戏需要这样才能正确渲染某些效果。 - + Enable asynchronous shader compilation 开启异步着色器编译 - + May reduce shader stutter. 可能减少着色器卡顿。 - + GPU Clocks GPU 时钟频率 - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. 通过让游戏误以为 GPU 的处理速度比实际更快,以避免游戏为了适应 Switch 的时钟频率而降低分辨率和渲染距离。 - + GPU Unswizzle GPU 还原 - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. 利用 GPU 计算来加速 BCn 格式 3D 纹理的解码。如果遇到崩溃或画面花屏,请禁用此项。 - + GPU Unswizzle Max Texture Size GPU 还原最大纹理尺寸 - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -890,48 +900,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size GPU 还原流大小 - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. 设置每帧处理的纹理数据最大量(单位:MiB)。 较高的数值可以减少纹理加载时的卡顿,但可能会影响帧率的稳定性(即造成帧时间波动)。 - + GPU Unswizzle Chunk Size GPU 还原块大小 - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. 确定在单次调度(Dispatch)中处理的深度切片(Depth Slices)数量。 增加此数值可以提高高端 GPU 的吞吐量(处理效率),但在性能较弱的硬件上可能会引发 TDR(驱动程序重置)或驱动超时。 - + Use Vulkan pipeline cache 启用 Vulkan 管线缓存 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. 启用 GPU 供应商专用的管线缓存。 在 Vulkan 驱动程序内部不存储管线缓存的情况下,此选项可显著提高着色器加载速度。 - + Enable Compute Pipelines (Intel Vulkan Only) 启用计算管线 (仅限 Intel 显卡 Vulkan 模式) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -940,193 +950,193 @@ Compute pipelines are always enabled on all other drivers. 在所有其他驱动程序上始终启用计算管线。 - + Enable Reactive Flushing 启用反应性刷新 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 使用反应性刷新取代预测性刷新,从而更精确地同步内存。 - + Sync to framerate of video playback 播放视频时帧率同步 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 在视频播放期间以正常速度运行游戏,即使帧率未锁定。 - + Barrier feedback loops 屏障反馈环路 - + Improves rendering of transparency effects in specific games. 改进某些游戏中透明效果的渲染。 - + Enable buffer history 启用缓冲区历史 - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. 允许访问之前的缓冲状态。 这个选项可能会提升某些游戏的渲染质量和性能一致性。 - + Fix bloom effects 修复泛光效果 - + Removes bloom in Burnout. 去除《火爆狂飙》中的泛光特效。 - + Enable Legacy Rescale Pass 启用旧版缩放 - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. 通过依赖之前实现的行为,可能会修复部分游戏的缩放重叠问题。 修复 AMD 和 Intel 显卡上的线条伪影,以及《路易斯洋楼3》中 Nvidia 显卡的灰色纹理闪烁的遗留行为变通方法。 - + Extended Dynamic State 扩展动态状态 - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. 控制在扩展动态状态中可使用的函数数量。更高的数值允许启用更多功能,并可能提升性能,但同时也可能导致额外的图形问题。 - + Vertex Input Dynamic State 顶点输入动态状态 - + Enables vertex input dynamic state feature for better quality and performance. 开启顶点输入动态状态功能来获得更好的质量和性能。 - + Sample Shading 采样着色 - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. 允许片段着色器在多重采样的片段中每个样本执行一次而不是每个片段执行一次。可以提高图形质量,但会降低性能。 更高的值可以提高质量但会降低性能。 - + RNG Seed 随机数生成器种子 - + Controls the seed of the random number generator. Mainly used for speedrunning. 控制随机数生成器的种子。 主要用于竞速游戏。 - + Device Name 设备名称 - + The name of the console. 主机的数量。 - + Homebrew Args 自制软件参数 - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). 启动 homebrew 时需要传递的命令行参数 (例如 -noglsl)。 - + Custom RTC Date: 自定义系统时间: - + This option allows to change the clock of the console. Can be used to manipulate time in games. 此选项允许更改控制台的时钟。 可用于操纵游戏中的时间。 - + The number of seconds from the current unix time 来自当前 unix 时间的秒数。 - + Language: 语言: - + This option can be overridden when region setting is auto-select 当区域设置为自动选择时可以使用此选项替代。 - + Region: 地区: - + The region of the console. 主机的区域。 - + Time Zone: 时区: - + The time zone of the console. 主机的时区。 - + Sound Output Mode: 声音输出模式: - + Console Mode: 控制台模式: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1135,1042 +1145,1042 @@ Setting to Handheld can help improve performance for low end systems. 将设置为掌机模式可以帮助低端系统提高性能。 - + Prompt for user profile on boot 启动时提示选择用户账户 - + Useful if multiple people use the same PC. 在多人使用相同的 PC 时有效。 - + Pause when not in focus 在丢失焦点时暂停 - + Pauses emulation when focusing on other windows. 当焦点位于其它窗口时暂停模拟器。 - + Confirm before stopping emulation 停止模拟时需要确认 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. 替代提示以确认停止模拟。 启用它将绕过此类提示并直接退出模拟。 - + Hide mouse on inactivity 自动隐藏鼠标光标 - + Hides the mouse after 2.5s of inactivity. 在 2.5 秒无活动后隐藏鼠标。 - + Disable controller applet 禁用控制器小程序 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. 强制禁止在模拟程序中使用控制器小程序。 当程序尝试打开控制器小程序时,它会立即被关闭。 - + Check for updates 检查更新 - + Whether or not to check for updates upon startup. 在启动时是否检查更新。 - + Enable Gamemode 启用游戏模式 - + Force X11 as Graphics Backend 强制使用 X11 作为图形后端 - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - + Never 永不 - + On Load 加载时 - + Always 总是 - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不压缩 (最高质量) - + BC1 (Low quality) BC1 (低质量) - + BC3 (Medium quality) BC3 (中等质量) - - + + Auto 自动 - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative 保守模式 - + Aggressive 激进模式 - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (汇编着色器,仅限 NVIDIA 显卡) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (实验性,仅限 AMD/Mesa) - + Null 无 - + Fast 高速 - - - + + + Accurate 高精度 - - - + + + Default 系统默认 - + Unsafe (fast) 不安全(快速) - + Safe (stable) 安全(稳定) - + Immediate 即时 - + Balanced 平衡 - + Strict 严格 - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Debugging 调试 - + Dynarmic 动态编译 - + NCE 本机代码执行 - + Borderless Windowed 无边框窗口 - + Exclusive Fullscreen 独占全屏 - + No Video Output 无视频输出 - + CPU Video Decoding CPU 视频解码 - + GPU Video Decoding (Default) GPU 视频解码 (默认) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [实验性] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [实验性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [实验性] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [实验性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 近邻取样 - + Bilinear 双线性过滤 - + Bicubic 双三线过滤 - + Gaussian 高斯模糊 - + Lanczos Lanczos - + ScaleForce 强制缩放 - + AMD FidelityFX Super Resolution AMD FidelityFX 超级分辨率 - + Area 区域 - + MMPX MMPX - + Zero-Tangent 零切线 - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution 骁龙游戏超级分辨率 - + Snapdragon Game Super Resolution EdgeDir 骁龙游戏超级分辨率 EdgeDir - + None 无 - + FXAA 快速近似抗锯齿 - + SMAA 子像素形态学抗锯齿 - + Default (16:9) 默认 (16:9) - + Force 4:3 强制 4:3 - + Force 21:9 强制 21:9 - + Force 16:10 强制 16:10 - + Stretch to Window 拉伸窗口 - + Automatic 自动 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日语 (日本語) - + American English 美式英语 - + French (français) 法语 (français) - + German (Deutsch) 德语 (Deutsch) - + Italian (italiano) 意大利语 (italiano) - + Spanish (español) 西班牙语 (español) - + Chinese 中文 - + Korean (한국어) 韩语 (한국어) - + Dutch (Nederlands) 荷兰语 (Nederlands) - + Portuguese (português) 葡萄牙语 (português) - + Russian (Русский) 俄语 (Русский) - + Taiwanese 台湾中文 - + British English 英式英语 - + Canadian French 加拿大法语 - + Latin American Spanish 拉美西班牙语 - + Simplified Chinese 简体中文 - + Traditional Chinese (正體中文) 繁体中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙语 (português do Brasil) - + Polish (polska) 波兰语(波兰语) - + Thai (แบบไทย) 泰语 - - + + Japan 日本 - + USA 美国 - + Europe 欧洲 - + Australia 澳大利亚 - + China 中国 - + Korea 韩国 - + Taiwan 台湾地区 - + Auto (%1) Auto select time zone 自动 (%1) - + Default (%1) Default time zone 默认 (%1) - + CET 欧洲中部时间 - + CST6CDT 古巴标准时间&古巴夏令时 - + Cuba 古巴 - + EET 东欧时间 - + Egypt 埃及 - + Eire 爱尔兰 - + EST 东部标准时间 - + EST5EDT 东部标准时间&东部夏令时 - + GB 英国 - + GB-Eire 英国-爱尔兰时间 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 美国夏威夷时间 - + Iceland 冰岛 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙买加 - + Kwajalein 夸贾林环礁 - + Libya 利比亚 - + MET 中欧时间 - + MST 山区标准时间 (北美) - + MST7MDT 山区标准时间&山区夏令时 (北美) - + Navajo 纳瓦霍 - + NZ 新西兰时间 - + NZ-CHAT NZ-CHAT - + Poland 波兰 - + Portugal 葡萄牙 - + PRC 中国标准时间 - + PST8PDT 太平洋标准时间&太平洋夏令时 - + ROC 台湾时间 - + ROK 韩国时间 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界时间 - + UTC 协调世界时 - + W-SU 欧洲-莫斯科时间 - + WET 西欧时间 - + Zulu 祖鲁 - + Mono 单声道 - + Stereo 立体声 - + Surround 环绕声 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (不安全) - + 12GB DRAM (Unsafe) 12GB DRAM (不安全) - + Docked 主机模式 - + Handheld 掌机模式 - - + + Normal 正常 - - + + Boost 升频 - - + + Overclock 超频 - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - + Very Small (16 MB) 很小 (16 MB) - + Small (32 MB) 较小 (32 MB) - + Normal (128 MB) 正常 (128 MB) - + Large (256 MB) 较大 (256 MB) - + Very Large (512 MB) 很大 (512 MB) - + Very Low (4 MB) 很低 (4 MB) - + Low (8 MB) 低 (8 MB) - + Normal (16 MB) 正常 (16 MB) - + Medium (32 MB) 中 (32 MB) - + High (64 MB) 高 (64 MB) - + Very Low (32) 很低 (32) - + Low (64) 低 (64) - + Normal (128) 正常 (128) - + Medium (256) 中(256) - + High (512) 高(512) - + Disabled 禁用 - + ExtendedDynamicState 1 扩展动态状态 1 - + ExtendedDynamicState 2 扩展动态状态 2 - + ExtendedDynamicState 3 扩展动态状态 3 - + Tree View 树景视图 - + Grid View 网格视图 @@ -3270,33 +3280,38 @@ Would you like to delete the old save data? 背景颜色: - + % FSR/SGSR sharpening percentage (e.g. 50%) % - + + Configure Effects... + 配置效果... + + + Off 关闭 - + VSync Off 垂直同步关 - + Recommended 推荐 - + On 开启 - + VSync On 垂直同步开 @@ -4918,108 +4933,124 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t Post-Processing Effects - + 后处理效果 - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. - + Changes apply immediately while a game is running. + 更改会在游戏运行时立即生效。 - + Enable post-processing - + 开启后处理 - + Preset: - + 预设: - + Apply - + 应用 - + Reset Values - + 重置值 - + Return every effect to the values the preset ships with. - + 把每个效果恢复到预设的默认值 - + Save As... - + 另存为... - + Save Preset - + 保存预设 - + Preset name: - + 预设名称: - - Delete - + + Clear + 清除 - + + Remove every effect in use and deselect the preset. + 移除所有使用中的效果并取消选择预设。 + + + Add Effect - + 添加效果 - - Custom chain. Pick a preset above and press Apply to replace it. - + + None + 无 + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + 没有使用中的效果。请选择一个预设并点击应用,或一个一个地添加效果。 + Custom chain. Pick a preset above and press Apply to replace it. + 自定义链。选择上面的预设并点击应用替换它。 + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + 活动的预设: %1 (已修改)。按重置值可以恢复出厂设置。 - + Active preset: %1 - + 活动的预设: %1 - + Enabled - + 开启 - + Disabled - + 关闭 - + Reset to defaults - + 重置为默认值 - + Effect '%1' was not found. - + 找不到效果 '%1'。 - + Effect failed to compile: %1 - + 编译效果失败: +%1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. - + 找不到可用的 ReShade FX 效果。请将 .fx 文件放到 post_shaders 文件夹中。 @@ -7033,7 +7064,7 @@ Debug Message: - + &Pause 暂停 (&P) @@ -7135,7 +7166,7 @@ Debug Message: &User Handbook - + 用户手册(&U) @@ -7184,7 +7215,7 @@ Debug Message: - + &Start 开始 (&S) @@ -7195,7 +7226,7 @@ Debug Message: - + R&ecord 录制 (&E) @@ -7286,7 +7317,7 @@ Debug Message: - + None 无 @@ -7304,7 +7335,7 @@ Debug Message: Post-Processing &Shaders... - + 后处理效果着色器(&S)... @@ -7312,727 +7343,742 @@ Debug Message: 轮播视图(&C) - + Small (32x32) 小 (32x32) - + Standard (64x64) 标准 (64x64) - + Large (128x128) 大 (128x128) - + Full Size (256x256) 最大 (256x256) - + Broken Vulkan Installation Detected 检测到损坏的 Vulkan 安装 - + Vulkan initialization failed during boot. 在启动时初始化 Vulkan 失败。 - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping 运行游戏 - + Loading Web Applet... 正在加载 Web 小程序... - - + + Disable Web Applet 禁用 Web 小程序 - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) 禁用网页小程序可能会导致未定义的行为并且应仅在 超级马里奥 3D 全明星中使用。您确定要禁用网页小程序吗? (这可以在调试设置中重新启用。) - + The amount of shaders currently being built 当前正在构建的着色器数量 - + The current selected resolution scaling multiplier. 当前选择的分辨率缩放倍数。 - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. 当前模拟速度。高于或低于 100% 的数值表示模拟运行比 Switch 快或慢。 - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. 游戏当前显示的每秒帧数。这个数值会因游戏和场景的不同而有所变化。 - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 模拟 Switch 一帧所需的时间,不包括帧限制或垂直同步。为了全速模拟这个时间最多应为 16.67 毫秒。 - + Unmute 取消静音 - + Mute 静音 - + Reset Volume 重置音量 - + + Configure Effects... + 配置效果... + + + &Clear Recent Files 清除最近的文件(&C) - + &Continue 继续(&C) - + Warning: Outdated Game Format 警告: 游戏格式过时 - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. 您正在为此游戏使用解包 ROM 目录格式,这是一种已过时的格式,它已被 NCA、NAX、XCI 或 NSP 等其他格式取代。解包 ROM 目录缺少图标、元数据和更新支持。<br>有关 Eden 支持的各种 Switch 格式的说明请查阅我们的用户手册。此消息将不再显示。 - - + + Error while loading ROM! 加载 ROM 时出错! - + The ROM format is not supported. 不支持该 ROM 格式。 - + An error occurred initializing the video core. 初始化视频核心时发生错误。 - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + 这通常是因为过时的 GPU 驱动所导致的。具体情况请查看日志。请查阅: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>如何访问日志文件</a>。 - + Error while loading ROM! %1 %1 signifies a numeric error code. 加载 ROM 时出错! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>请重新导出您的文件,或在 Discord/Stoat 上寻求帮助。 - + An unknown error occurred. Please see the log for more details. 发生未知错误。请查看日志以获取更多详情。 - - + + (64-bit) (64 位) - - + + (32-bit) (32 位) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... 正在关闭软件... - + Save Data 存档数据 - + Mod Data Mod 数据 - + Error Opening %1 Folder 打开 %1 文件夹出错 - - + + Folder does not exist! 文件夹不存在! - + Remove Installed Game Contents? 是否移除已安装的游戏内容? - + Remove Installed Game Update? 是否移除已安装的游戏更新? - + Remove Installed Game DLC? 是否移除已安装的游戏 DLC? - + Remove Entry 删除条目 - + Delete OpenGL Transferable Shader Cache? 要删除 OpenGL 可传输着色器缓存吗? - + Delete Vulkan Transferable Shader Cache? 要删除 Vulkan 可传输着色器缓存吗? - + Delete All Transferable Shader Caches? 删除所有可传输的着色器缓存? - + Remove Custom Game Configuration? 是否移除自定义游戏配置? - + Remove Cache Storage? 要清除缓存存储吗? - + Remove File 删除文件 - + Remove Play Time Data 删除游戏时间数据 - + Reset play time? 要重置播放时间吗? - - + + RomFS Extraction Failed! RomFS 提取失败! - + There was an error copying the RomFS files or the user cancelled the operation. 复制 RomFS 文件时出错或用户取消了操作。 - + Full 完整 - + Skeleton 结构 - + Select RomFS Dump Mode 选择 RomFS 转储模式 - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. 请选择您希望如何导出 RomFS。<br>&quot;完整&quot; 将把所有文件复制到新的目录中,而<br>&quot;结构&quot; 仅会创建目录结构。</br></br> - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root %1 的可用空间不足,无法提取 RomFS。请释放空间或在模拟 > 配置 > 系统 > 文件系统 > 转储根目录,中选择其它目录 - + Extracting RomFS... 正在提取 RomFS... - - + + Cancel 取消 - + RomFS Extraction Succeeded! RomFS 提取成功! - + The operation completed successfully. 操作已成功完成。 - + Error Opening %1 打开 %1 时出错 - + Select Directory 选择目录 - + Properties 属性 - + The game properties could not be loaded. 无法加载游戏属性。 - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch 可执行文件 (%1);;所有文件 (*.*) - + Load File 加载文件 - + Open Extracted ROM Directory 打开已提取的 ROM 目录 - + Invalid Directory Selected 选择的目录无效 - + The directory you have selected does not contain a 'main' file. 您选择的目录不包含 'main' 文件。 - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) 可安装的 Switch 文件 (*.nca *.nsp *.xci);;任天堂内容档案 (*.nca);;任天堂提交包 (*.nsp);;NX 卡带镜像 (*.xci) - + Install Files 安装文件 - + %n file(s) remaining 剩余 %n 个文件 - + Installing file "%1"... 正在安装文件 "%1"... - - + + Install Results 安装结果 - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. 为了避免可能的冲突,我们不鼓励用户将基础游戏安装到 NAND。 请仅使用此功能来安装更新和 DLC。 - + %n file(s) were newly installed 已新安装 %n 个文件 - + %n file(s) were overwritten 已覆盖了 %n 个文件 - + %n file(s) failed to install %n 个文件安装失败 - + System Application 系统应用 - + System Archive 系统档案 - + System Application Update 系统应用更新 - + Firmware Package (Type A) 固件包 (类型 A) - + Firmware Package (Type B) 固件包 (类型 B) - + Game 游戏 - + Game Update 游戏更新 - + Game DLC 游戏可下载内容 - + Delta Title Delta 标题 - + Select NCA Install Type... 选择 NCA 安装类型... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) 请选择您希望将此 NCA 安装为的标题类型: (在大多数情况下,默认的 '游戏' 就可以。) - + Failed to Install 安装失败 - + The title type you selected for the NCA is invalid. 您为 NCA 选择的标题类型无效。 - + File not found 找不到文件 - + File "%1" not found 未找到文件 "%1" - + OK 确定 - + Function Disabled 功能已被关闭 - + Compatibility list reporting is currently disabled. Check back later! 兼容性列表报告目前已被禁用。请稍后再查看! - + Error opening URL 打开网址出错 - + Unable to open the URL "%1". 无法打开 URL "%1"。 - + TAS Recording TAS 录像 - + Overwrite file of player 1? 要覆盖玩家 1 的文件吗? - + Invalid config detected 检测到无效配置 - + Handheld controller can't be used on docked mode. Pro controller will be selected. 手柄在主机模式下无法使用。将选择 Pro 手柄。 - - + + Amiibo Amiibo - - + + The current amiibo has been removed 当前的 amiibo 已被移除 - + Error 错误 - - + + The current game is not looking for amiibos 当前游戏不支持寻找 amiibo - + Amiibo File (%1);; All Files (*.*) Amiibo 文件 (%1);; 所有文件 (*.*) - + Load Amiibo 读取 Amiibo - + Error loading Amiibo data 加载 Amiibo 数据出错 - + The selected file is not a valid amiibo 所选文件不是有效的 amiibo - + The selected file is already on use 所选文件正在使用中 - + An unknown error occurred 发生未知错误 - + No firmware available 没有可用的固件 - + Firmware Corrupted 固件已损坏 - + Unknown applet 未知小程序 - + Applet doesn't map to a known value. 无法识别该小程序对应的值。 - + Record not found 找不到记录程序 - + Applet not found. Please reinstall firmware. 找不到小程序。请重新安装固件。 - + Capture Screenshot 截取屏幕截图 - + PNG Image (*.png) PNG 图像 (*.png) - + TAS state: Running %1/%2 TAS 状态: 正在运行 %1/%2 - + TAS state: Recording %1 TAS 状态: 正在录制 %1 - + TAS state: Idle %1/%2 TAS 状态: 空闲 %1/%2 - + TAS State: Invalid TAS 状态: 无效 - + &Stop Running 停止运行(&S) - + Stop R&ecording 停止录制(&A) - + Building: %n shader(s) 正在编译:%n 个着色器 - + Scale: %1x %1 is the resolution scaling factor 缩放: %1x - + Speed: %1% / %2% 速度: %1% / %2% - + Speed: %1% 速度: %1% - + Game: %1 FPS 游戏: %1 FPS - + Frame: %1 ms 帧: %1 ms - + NO AA 无 AA - + + NO FX + 无 FX + + + + FX + FX + + + VOLUME: MUTE 音量: 静音 - + VOLUME: %1% Volume percentage (e.g. 50%) 音量: %1% - + Derivation Components Missing 缺少派生组件 - + Decryption keys are missing. Install them now? 缺少解密密钥。现在安装吗? - + Wayland Detected! 检测到 Wayland! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8043,74 +8089,74 @@ Would you like to force it for future launches? 您想要在未来的启动中强制执行吗? - + Use X11 使用 X11 - + Continue with Wayland 继续使用 Wayland - + Don't show again 不再显示 - + Restart Required 需要重新启动 - + Restart Eden to apply the X11 backend. 重新启动 Eden 以应用 X11 后端。 - + Slow 慢速 - + Turbo 加速 - + Unlocked 解锁 - + Select RomFS Dump Target 选择 RomFS 转储目标 - + Please select which RomFS you would like to dump. 请选择您想要转储的 RomFS。 - + Are you sure you want to close Eden? 您确实要关闭 Eden 吗? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. 您确定要停止模拟吗?任何未保存的进度将会丢失。 - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -9313,7 +9359,7 @@ p, li { white-space: pre-wrap; } This game may require firmware to function properly, and you don't have any installed. Please install firmware before launching, or press "OK" to launch anyways. - + 这个游戏可能需要固件才能正常运行,但您还没有安装任何固件。请在启动前安装固件,或者按 “确定” 继续启动。 diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index 3aa6892ac9..50b1b30118 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -592,12 +592,22 @@ SMAA的品質最佳 FXAA在低解析度下可以產生較穩定的畫面 - + + Enable post-processing effects + + + + + Applies post-processing effects to the final image. + + + + Fullscreen Mode: 全螢幕模式: - + The method used to render the window in fullscreen. Borderless offers the best compatibility with the on-screen keyboard that some games request for input. Exclusive fullscreen may offer better performance and better Freesync/Gsync support. @@ -606,47 +616,47 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp 獨佔全螢幕將提供更好的性能以及更佳的FreeSync/G-Sync支援 - + Aspect Ratio: 長寬比: - + Stretches the renderer to fit the specified aspect ratio. Most games only support 16:9, so modifications are required to get other ratios. Also controls the aspect ratio of captured screenshots. - + Use persistent pipeline cache - + Allows saving shaders to storage for faster loading on following game boots. Disabling it is only intended for debugging. 將產生的著色器快取儲存至硬碟,讓遊戲在後續過程中不需再次產生以提高速度 建議僅在偵錯時才停用此選項 - + Use asynchronous GPU emulation - + Uses an extra CPU thread for rendering. This option should always remain enabled. - + NVDEC emulation: NVDEC 模擬: - + Specifies how videos should be decoded. It can either use the CPU or the GPU for decoding, or perform no decoding at all (black screen on videos). In most cases, GPU decoding provides the best performance. @@ -655,12 +665,12 @@ In most cases, GPU decoding provides the best performance. GPU解碼在大多數情況下提供最好的性能 - + ASTC Decoding Method: ASTC解碼方式: - + This option controls how ASTC textures should be decoded. CPU: Use the CPU for decoding. GPU: Use the GPU's compute shaders to decode ASTC textures (recommended). @@ -669,55 +679,55 @@ stuttering but may present artifacts. - + ASTC Recompression Method: ASTC重新壓縮方式: - + Most GPUs lack support for ASTC textures and must decompress to anintermediate format: RGBA8. BC1/BC3: The intermediate format will be recompressed to BC1 or BC3 format, saving VRAM but degrading image quality. - + Frame Pacing Mode (Vulkan only) - + Controls how the emulator manages frame pacing to reduce stuttering and make the frame rate smoother and more consistent. - + VRAM Usage Mode: VRAM 使用模式: - + Selects whether the emulator should prefer to conserve memory or make maximum usage of available video memory for performance. Aggressive mode may impact performance of other applications such as recording software. - + Skip CPU Inner Invalidation 跳過CPU內部失效處理 - + Skips certain cache invalidations during memory updates, reducing CPU usage and improving latency. This may cause soft-crashes. - + VSync Mode: 垂直同步: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -725,79 +735,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations 同步記憶體操作 - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) 啟用非同步顯示(僅限Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. 透過將畫面顯示移至獨立的CPU執行緒來略微提升性能。 - + Force maximum clocks (Vulkan only) 強制使用最大時脈(僅限Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. 在等待圖形命令時於背景執行任務以防GPU降低時脈 - + Anisotropic Filtering: 各向異性過濾: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -807,1328 +817,1328 @@ Default follows the GPU Accuracy setting. - + Enable GPU buffer readback - + Preserves GPU-modified data by reading it back before uploading. Some games require this to render certain effects properly. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache 启用 Vulkan 管线缓存 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. 启用 GPU 供应商专用的管线缓存。 在 Vulkan 驱动程序内部不存储管线缓存的情况下,此选项可显著提高着色器加载速度。 - + Enable Compute Pipelines (Intel Vulkan Only) 启用计算管线 (仅限 Intel 显卡 Vulkan 模式) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing 启用反应性刷新 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 使用反应性刷新取代预测性刷新,从而更精确地同步内存。 - + Sync to framerate of video playback 播放视频时帧率同步 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 在视频播放期间以正常速度运行游戏,即使帧率未锁定。 - + Barrier feedback loops 屏障反馈循环 - + Improves rendering of transparency effects in specific games. 改进某些游戏中透明效果的渲染。 - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed 隨機種子 - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name 裝置名稱 - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: 自定义系统时间: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: 语言: - + This option can be overridden when region setting is auto-select - + Region: 區域: - + The region of the console. - + Time Zone: 時區: - + The time zone of the console. - + Sound Output Mode: 音訊輸出模式: - + Console Mode: 控制台模式: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation 停止模拟时需要确认 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity 滑鼠閒置時自動隱藏 - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet 禁用控制器程序 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode 启用游戏模式 - + Force X11 as Graphics Backend - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不壓縮 (最高品質) - + BC1 (Low quality) BC1 (低品質) - + BC3 (Medium quality) BC3 (中品質) - - + + Auto 自動 - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative 保守模式(节省 VRAM) - + Aggressive 激进模式 - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null 無 - + Fast - - - + + + Accurate 高精度 - - - + + + Default 預設 - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Strict - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed 無邊框視窗 - + Exclusive Fullscreen 全螢幕獨占 - + No Video Output 無視訊輸出 - + CPU Video Decoding CPU 視訊解碼 - + GPU Video Decoding (Default) GPU 視訊解碼(預設) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [實驗性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [實驗性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 最近鄰 - + Bilinear 雙線性 - + Bicubic 雙立方 - + Gaussian 高斯 - + Lanczos - + ScaleForce 強制縮放 - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None 無 - + FXAA FXAA - + SMAA SMAA - + Default (16:9) 預設 (16:9) - + Force 4:3 強制 4:3 - + Force 21:9 強制 21:9 - + Force 16:10 強制 16:10 - + Stretch to Window 延伸視窗 - + Automatic 自動 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日文 (日本語) - + American English 美式英语 - + French (français) 法文 (français) - + German (Deutsch) 德文 (Deutsch) - + Italian (italiano) 義大利文 (italiano) - + Spanish (español) 西班牙文 (español) - + Chinese 中文 - + Korean (한국어) 韓文 (한국어) - + Dutch (Nederlands) 荷蘭文 (Nederlands) - + Portuguese (português) 葡萄牙文 (português) - + Russian (Русский) 俄文 (Русский) - + Taiwanese 台灣中文 - + British English 英式英文 - + Canadian French 加拿大法文 - + Latin American Spanish 拉丁美洲西班牙文 - + Simplified Chinese 簡體中文 - + Traditional Chinese (正體中文) 正體中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA 美國 - + Europe 歐洲 - + Australia 澳洲 - + China 中國 - + Korea 南韓 - + Taiwan 台灣 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 預設 (%1) - + CET 中歐 - + CST6CDT CST6CDT - + Cuba 古巴 - + EET EET - + Egypt 埃及 - + Eire 愛爾蘭 - + EST 北美東部 - + EST5EDT EST5EDT - + GB GB - + GB-Eire 英國-愛爾蘭 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 夏威夷 - + Iceland 冰島 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙買加 - + Kwajalein 瓜加林環礁 - + Libya 利比亞 - + MET 中歐 - + MST 北美山區 - + MST7MDT MST7MDT - + Navajo 納瓦霍 - + NZ 紐西蘭 - + NZ-CHAT 紐西蘭-查塔姆群島 - + Poland 波蘭 - + Portugal 葡萄牙 - + PRC 中國 - + PST8PDT 太平洋 - + ROC 臺灣 - + ROK 韓國 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界 - + UTC UTC - + W-SU 莫斯科 - + WET 西歐 - + Zulu 協調世界時 - + Mono 單聲道 - + Stereo 立體聲 - + Surround 環繞音效 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked TV - + Handheld 掌機模式 - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -3227,33 +3237,38 @@ Would you like to delete the old save data? 背景顏色: - + % FSR/SGSR sharpening percentage (e.g. 50%) - + + Configure Effects... + + + + Off 關閉 - + VSync Off 垂直同步關 - + Recommended 推薦 - + On 開啟 - + VSync On 垂直同步開 @@ -4875,102 +4890,117 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t - ReShade FX effects are loaded from the post_shaders folder in the Eden data directory. Changes apply immediately while a game is running. + Changes apply immediately while a game is running. - + Enable post-processing - + Preset: - + Apply - + Reset Values - + Return every effect to the values the preset ships with. - + Save As... - + Save Preset - + Preset name: - - Delete + + Clear - + + Remove every effect in use and deselect the preset. + + + + Add Effect - - Custom chain. Pick a preset above and press Apply to replace it. + + None + + + + + No effects in use. Pick a preset and press Apply, or add effects one by one. + Custom chain. Pick a preset above and press Apply to replace it. + + + + Active preset: %1 (modified). Press Reset Values to go back to how it ships. - + Active preset: %1 - + Enabled - + Disabled - + Reset to defaults - + Effect '%1' was not found. - + Effect failed to compile: %1 - + No usable ReShade FX effects were found. Place .fx files in the post_shaders folder. @@ -6984,7 +7014,7 @@ Debug Message: - + &Pause 暫停(&P) @@ -7135,7 +7165,7 @@ Debug Message: - + &Start 開始(&S) @@ -7146,7 +7176,7 @@ Debug Message: - + R&ecord 錄製 (&E) @@ -7237,7 +7267,7 @@ Debug Message: - + None @@ -7263,722 +7293,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + + Configure Effects... + + + + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + + NO FX + + + + + FX + + + + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7986,74 +8031,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index 448d55b92b..3444ccaa71 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -289,6 +289,7 @@ Obtenedor de controladores de la GPU Gestor de controladores de la GPU Instale los controladores alternativos para obtener un posible mejor rendimiento o precisión + Añadir efecto Abrir lista Cerrar lista Restablecer a predeterminado diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 7a4b6cf91e..7bfe003317 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -318,6 +318,13 @@ Целевая частота кадров Выберите значение под ваш дисплей. Множитель подстроится сам, чтобы его держать, и откатит изменения, если игра начнёт тормозить. Использовать фиксированный множитель + Вкл. + Выкл. + Фикс. + Авто + Включите или выключите генерацию кадров и выберите множитель кадров. + Генерация кадров с заданной частотой кадров. Множитель регулируется автоматически. + Разрешение, используемое для оценки движения между кадрами. Меньшие значения экономят время ГПУ. Целевой размер очереди кадров Сколько готовых кадров может ожидать перед выводом на экран. Более длинные очереди сглаживают скачки ГПУ ценой задержки ввода. Минимальная задержка (Без буферизации) @@ -328,12 +335,14 @@ Разрешение оценки движения Разрешение прохода оптического потока в долях от выходного разрешения. Его понижение — самый дешёвый способ вернуть производительность. Генерация кадров недоступна + В этом ГПУ драйвере отсутствует поддержка модели памяти Vulkan или половинной точности (float16), которая требуется шейдерам Lossless Scaling. Опционально. Укажите свой Lossless.dll для включения генерации кадров позже. Установить Lossless.dll Для генерации кадров требуется ваша собственная легальная копия Lossless.dll из Lossless Scaling Выбрать другой файл Lossless.dll Генерация кадров Поддерживается + Не поддерживается (нет модели памяти Vulkan или float16) Предоставьте свою копию Lossless.dll для включения генерации кадров Установлена Не установлена diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index 193d00c3d1..2f41b5d65a 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -1,6 +1,7 @@ + 本软件可以运行用于 Nintendo Switch 游戏机的游戏。不包含任何游戏或密钥。

在您开始之前, 请定位您设备存储上的 prod.keys ]]> 文件。

了解更多]]>
错误与注意事项 当发生错误时显示通知。 未授予通知权限! @@ -290,6 +291,25 @@ GPU驱动获取器 GPU 驱动管理器 安装替代的驱动程序以获得更好的性能和精度 + 后处理效果 + 在渲染完成后应用 ReShade FX 效果 + 配置此游戏的效果链 + 添加效果 + 移除 + 打开列表 + 关闭列表 + 移除效果 + 预设已激活。在开始游戏前可以在后处理效果中编辑它。 + 数值已从原始预设被更改。 + 预设 + 新建预设 + 把您加载的效果及当前数值保存为一个预设,以便今后选用。 + 请给预设起一个不含等号的名称。 + 无预设 + 删除预设 + 重置预设值 + 重置为默认值 + 找不到效果。请在此文件中放置 .fx 文件: 帧生成 配置针对此游戏的帧生成设定 设定要在使用无损缩放渲染的帧之间应用的插帧。启用后强制采用FIFO呈现模式 。 @@ -304,6 +324,13 @@ 60 FPS 90 FPS 120 FPS + 开 + 关 + 固定 + 自动 + 打开或关闭帧生成并选择帧生成倍数。 + 生成帧到目标帧率。倍率会自动调整。 + 用来估算帧间运动的分辨率。较低的值可以节省 GPU 时间。 帧队列目标 在显示之前有多少已完成渲染的帧正在等待。较大的队列可以缓解 GPU 突发的压力,但会增加输入延迟。 最低延迟 (无缓冲) @@ -314,12 +341,14 @@ 运动预估分辨率 光流通道的分辨率,以输出的比例表示。降低它是提升性能最经济的做法。 帧生成不可用 + 这个 GPU 驱动缺少 Lossless Scaling 着色器所需的 Vulkan 内存模型或半精度 (float16) 支持。 作为可选项。请提供您自己的 Lossless.dll 以便在之后可以启用帧生成。 安装 Lossless.dll 帧生成需要您自己从 Lossless Scaling 获得合法的 Lossless.dll 副本 选择其它 Lossless.dll 副本 帧生成 支持 + 不支持 (无 Vulkan 内存模型或 float16) 无损缩放 提供您自己的 Lossless.dll 文件以启用帧生成 已安装 @@ -611,6 +640,11 @@ 日志记录 按行刷新调试日志 在每行写入时刷新调试日志,使在崩溃或冻结时调试更容易。 + 开启扩展日志 + 将最大日志文件大小从 100 MiB 提升至 1GiB。 + 日志筛选器 + 控制 Eden 的日志类别。例如: *:Info Service.LM:Debug + GPU 日志 日志等级 @@ -894,6 +928,8 @@ ROM 文件不存在 游戏需要固件 + + 正在搜索游戏... 未找到标题ID的游戏: %1$s diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 0a1c3ba4c2..5db1e31a2b 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -229,7 +229,7 @@ 遊戲目錄新增成功 檢查更新 在Eden啟動時檢查有無新版本並選擇是否要下載與安裝更新 - 偵測到新版本 + 發現新版本 有更新可供安裝:%1$s\n\n您要進行更新嗎? 下載更新中 更新下載失敗 @@ -1020,9 +1020,40 @@ 6GB (不穩定) 8GB (不穩定) + + 正常 + 加速 + 超頻 + + + 正常 + 加速 + 超頻 + + + 極小 (16MB) + 小(32MB) + 正常(128MB) + 大(256MB) + 極大(512MB) + + + 極小(4MB) + 小(8MB) + 正常(16MB) + 中(32MB) + 大(64MB) + + + 極小(32) + 小(64) + 正常(128) + 中(256) + 大(512) + - 攝氏度 - 華氏度 + 攝氏 + 華氏 B @@ -1035,6 +1066,8 @@ 無 + + 效能 準確 From 3266c20e3f27a459449b77214182be3f0332e8f4 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Wed, 23 Sep 2026 00:36:47 +0200 Subject: [PATCH 075/128] [ips_layer] read magic from IPS file and fix EOF check (#4469) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- PatchIPS was reading the magic bytes from the target file instead of the IPS patch, and IsEOF used a strict > comparison that never matched for 3-byte IPS EOF markers. This caused IPS patches to be silently skipped, breaking the Russian localization mod for Persona 5. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4469 Reviewed-by: lizzie Reviewed-by: CamilleLaVey --- src/core/file_sys/ips_layer.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/core/file_sys/ips_layer.cpp b/src/core/file_sys/ips_layer.cpp index 5a0ddb44f8..32e9041017 100644 --- a/src/core/file_sys/ips_layer.cpp +++ b/src/core/file_sys/ips_layer.cpp @@ -35,19 +35,22 @@ static IPSFileType IdentifyMagic(std::span magic) { } static bool IsEOF(IPSFileType type, std::span magic) { - return (type == IPSFileType::IPS && magic.size() > 3 && std::memcmp(magic.data(), "EOF", 3) == 0) - || (type == IPSFileType::IPS32 && magic.size() > 4 && std::memcmp(magic.data(), "EEOF", 4) == 0); + return (type == IPSFileType::IPS && magic.size() >= 3 && std::memcmp(magic.data(), "EOF", 3) == 0) + || (type == IPSFileType::IPS32 && magic.size() >= 4 && std::memcmp(magic.data(), "EEOF", 4) == 0); } VirtualFile PatchIPS(const VirtualFile& in, const VirtualFile& ips) { if (in == nullptr || ips == nullptr) return nullptr; - auto in_data = in->ReadAllBytes(); - auto const type = IdentifyMagic(in_data); + const auto type = IdentifyMagic(ips->ReadBytes(0x5)); if (type == IPSFileType::Error) return nullptr; + auto in_data = in->ReadAllBytes(); + if (in_data.size() == 0) + return nullptr; + std::vector temp(type == IPSFileType::IPS ? 3 : 4); u64 offset = 5; // After header while (ips->Read(temp.data(), temp.size(), offset) == temp.size()) { From 38df54edfe7b861d0a0a1ee305836049a39d42ef Mon Sep 17 00:00:00 2001 From: Exverge Date: Wed, 23 Sep 2026 13:52:29 +0200 Subject: [PATCH 076/128] [common/sparse_large_vector] decommit unused pages + fix first page in zeroed region (#4471) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Fixes a bug where the first page of a zeroed out region would not be properly zeroed, and now frees unused memory. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4471 Reviewed-by: lizzie Reviewed-by: MaranBr --- src/common/sparse_large_vector.cpp | 15 +++++++++++++++ src/common/sparse_large_vector.h | 20 +++++++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/common/sparse_large_vector.cpp b/src/common/sparse_large_vector.cpp index ce6455a235..745575a880 100644 --- a/src/common/sparse_large_vector.cpp +++ b/src/common/sparse_large_vector.cpp @@ -96,6 +96,21 @@ bool CommitVectorPage(uintptr_t addr, bool write) noexcept { #ifndef MAP_NOCORE #define MAP_NOCORE 0 #endif +#ifndef MADV_FREE +#define MADV_FREE MADV_DONTNEED +#endif + +void DecommitVectorPage(uintptr_t base) noexcept { +#if defined(_WIN32) + VirtualFree(reinterpret_cast(base), HostPageSize, MEM_DECOMMIT); +#elif defined(__linux__) + // Linux's MADV_DONTNEED zeros out pages for us + madvise(reinterpret_cast(base), HostPageSize, MADV_DONTNEED); +#else + madvise(reinterpret_cast(base), HostPageSize, MADV_FREE); + std::memset(reinterpret_cast(base), 0, HostPageSize); +#endif +} void* AllocateMemoryPages(std::size_t size) noexcept { if (auto page = HostPageSize; size % page != 0) { diff --git a/src/common/sparse_large_vector.h b/src/common/sparse_large_vector.h index dad3aea97e..86f0be7866 100644 --- a/src/common/sparse_large_vector.h +++ b/src/common/sparse_large_vector.h @@ -35,6 +35,7 @@ const u64 HostPageMask = ~(HostPageSize - 1); void* AllocateMemoryPages(std::size_t size) noexcept; void FreeMemoryPages(void* base, std::size_t size) noexcept; +void DecommitVectorPage(uintptr_t base) noexcept; /// A large page-aligned buffer that has optimized memory usage for zero-writes. template @@ -114,7 +115,7 @@ public: const u64 end_page = AlignUp(base, HostPageSize); const u64 first_size = (std::min)(end_page, end) - base; - if (IsCommittedPage(start / sizeof(T))) { + if (IsCommittedPage(start)) { std::memset(reinterpret_cast(base), 0, first_size); } @@ -124,11 +125,16 @@ public: base = end_page; for (u64 page = base; page < end; page += HostPageSize) { - if (!IsCommittedPage((page - reinterpret_cast(base_ptr)) / sizeof(T))) { + auto index = (page - reinterpret_cast(base_ptr)) / sizeof(T); + if (!IsCommittedPage(index)) { continue; } - std::memset(reinterpret_cast(page), 0, (std::min)( HostPageSize, end - page)); + if (end - page >= HostPageSize) { + DecommitPage(index); + } else { + std::memset(reinterpret_cast(page), 0, end - page); + } } } @@ -183,6 +189,14 @@ private: committed_pages[page_index >> 6].fetch_or(1ULL << (page_index & 63), std::memory_order_release); } + constexpr void DecommitPage(std::size_t index) noexcept { + auto page_index = (index * sizeof(T)) >> HostPageBits; + auto page = reinterpret_cast(base_ptr + index) & HostPageMask; + + committed_pages[page_index >> 6].fetch_and(~(1ULL << (page_index & 63)), std::memory_order_release); + DecommitVectorPage(page); + } + std::size_t alloc_size{}; T* base_ptr{}; From a25e32676fd3da5b66600e15045dfa699d93d989 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 23 Sep 2026 14:39:12 +0200 Subject: [PATCH 077/128] [hle] Use correct `audren:d` service framework (#4472) Trivial change. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4472 Reviewed-by: MaranBr Reviewed-by: Maufeat --- src/core/hle/service/audio/audio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/hle/service/audio/audio.cpp b/src/core/hle/service/audio/audio.cpp index 6caf794caa..fde766a275 100644 --- a/src/core/hle/service/audio/audio.cpp +++ b/src/core/hle/service/audio/audio.cpp @@ -191,7 +191,7 @@ void LoopProcess(Core::System& system) { server_manager->RegisterNamedService("audout:d", std::make_shared(system), 30); server_manager->RegisterNamedService("audin:d", std::make_shared(system), 30); server_manager->RegisterNamedService("audrec:d", std::make_shared(system), 30); - server_manager->RegisterNamedService("audren:d", std::make_shared(system), 30); + server_manager->RegisterNamedService("audren:d", std::make_shared(system), 30); server_manager->RegisterNamedService("audin:u", std::make_shared(system), 30); server_manager->RegisterNamedService("audin:a", std::make_shared(system), 30); From 3d37a816c6adc2708a7be70f5a7fbe0af36b8227 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 23 Sep 2026 14:51:18 +0200 Subject: [PATCH 078/128] [glsl] fix clang 23 build error for unused function `SetDefinition` (#4389) Reported by @gixel > unused function template SetDefinition in: src/shader_recompiler/backend/glsl/emit_glsl.cpp:32:6: error: unused function template 'SetDefinition' [-Werror,-Wunused-template] - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4389 Reviewed-by: MaranBr Reviewed-by: Maufeat --- .../backend/glsl/emit_glsl.cpp | 25 +++++-------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/src/shader_recompiler/backend/glsl/emit_glsl.cpp b/src/shader_recompiler/backend/glsl/emit_glsl.cpp index 66ecfc9f74..8ec180bc42 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -28,11 +31,6 @@ struct FuncTraits { using ArgType = std::tuple_element_t>; }; -template -void SetDefinition(EmitContext& ctx, IR::Inst* inst, Args... args) { - inst->SetDefinition(func(ctx, std::forward(args)...)); -} - template auto Arg(EmitContext& ctx, const IR::Value& arg) { if constexpr (std::is_same_v) { @@ -53,21 +51,10 @@ auto Arg(EmitContext& ctx, const IR::Value& arg) { template void Invoke(EmitContext& ctx, IR::Inst* inst, std::index_sequence) { using Traits = FuncTraits; - if constexpr (std::is_same_v) { - if constexpr (is_first_arg_inst) { - SetDefinition( - ctx, inst, *inst, - Arg>(ctx, inst->Arg(I))...); - } else { - SetDefinition( - ctx, inst, Arg>(ctx, inst->Arg(I))...); - } + if constexpr (is_first_arg_inst) { + func(ctx, *inst, Arg>(ctx, inst->Arg(I))...); } else { - if constexpr (is_first_arg_inst) { - func(ctx, *inst, Arg>(ctx, inst->Arg(I))...); - } else { - func(ctx, Arg>(ctx, inst->Arg(I))...); - } + func(ctx, Arg>(ctx, inst->Arg(I))...); } } From 278f411dad6e8a52747994888f8778b277f6d953 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 23 Sep 2026 14:51:51 +0200 Subject: [PATCH 079/128] [frontend] Unify cmdline parsing (#4424) Addresses #4383. Makes it so both the Qt and SDL frontends now share the same options (bar `-hlaunch` and `-qlaunch`). Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4424 Reviewed-by: MaranBr Reviewed-by: Maufeat --- docs/user/CommandLine.md | 54 ++++++---- src/core/CMakeLists.txt | 5 + src/core/launch_params.cpp | 205 ++++++++++++++++++++++++++++++++++++ src/core/launch_params.h | 43 ++++++++ src/yuzu/main_window.cpp | 86 ++++----------- src/yuzu_cmd/CMakeLists.txt | 3 - src/yuzu_cmd/yuzu.cpp | 204 +++-------------------------------- 7 files changed, 319 insertions(+), 281 deletions(-) create mode 100644 src/core/launch_params.cpp create mode 100644 src/core/launch_params.h diff --git a/docs/user/CommandLine.md b/docs/user/CommandLine.md index b8d71ac61f..a63a41a27c 100644 --- a/docs/user/CommandLine.md +++ b/docs/user/CommandLine.md @@ -1,32 +1,44 @@ # User Handbook - Command Line -There are two main applications, an SDL-based app (`eden-cli`) and a Qt based app (`eden`); both accept command line arguments. - -## eden +There are two main applications, an SDL-based app (`eden-cli`) and a Qt based app (`eden`); both accept the same command line arguments. - `./eden `: Running with a single argument and nothing else, will make the emulator look for the given file and load it, this behavior is similar to `eden-cli`; allows dragging and dropping games into the application. -- `-g `: Alternate way to specify what to load, overrides. However let it be noted that arguments that use `-` will be treated as options/ignored, if your game, for some reason, starts with `-`, in order to safely handle it you may need to specify it as an argument. -- `-f`: Use fullscreen. -- `-u `: Select the index of the user to load as. -- `-input-profile `: Specifies input profile name to use (for player #0 only). +- `--debug/-d`: Enter debug mode, allow gdb stub at port `1234` +- `--config/-c`: Specify alternate configuration file. +- `--fullscreen/-f`: Use fullscreen. +- `--help/-h`: Display help. +- `--game/-g `: Alternate way to specify what to load, overrides. However let it be noted that arguments that use `-` will be treated as options/ignored, if your game, for some reason, starts with `-`, in order to safely handle it you may need to specify it as an argument. +- `--multiplayer/-m`: Specify multiplayer options. +- `--program/-p`: Specify the program arguments to pass (optional). +- `--user/-u `: Specify the user index. +- `--version/-v`: Display version and quit. +- `--input-profile/-i `: Specifies input profile name to use (for player #0 only). +- `--null-render/-n`: Forces the usage of the "Null" render backend irrespective of settings. +- `--filter/-x`: Sets the debug log filter irrespective of settings. +- `--singlecore/-s`: Forces single-core regardless of settings. + +Only the Qt frontend supports the following arguments: + - `-qlaunch`: Launch QLaunch. - `-hlaunch`: Launch homebrew launcher `nx-hbloader`. - Requires a copy of Atmosphere to be extracted onto `sdmc`. - This is a shorthand for `/sdmc/atmosphere/hbl.nsp`. - `-setup`: Launch setup applet. -## eden-cli +`eden` (provided with `--room`), and `eden-room` supports the following options as well: -- `--debug/-d`: Enter debug mode, allow gdb stub at port `1234` -- `--config/-c`: Specify alternate configuration file. -- `--fullscreen/-f`: Set fullscreen. -- `--help/-h`: Display help. -- `--game/-g`: Specify the game to run. -- `--multiplayer/-m`: Specify multiplayer options. -- `--program/-p`: Specify the program arguments to pass (optional). -- `--user/-u`: Specify the user index. -- `--version/-v`: Display version and quit. -- `--input-profile/-i`: Specifies input profile name to use (for player #0 only). -- `--null-render/-n`: Forces the usage of the "Null" render backend irrespective of settings. -- `--filter/-x`: Sets the debug log filter irrespective of settings. -- `--singlecore/-s`: Forces single-core regardless of settings. +- `-n/--room-name`: The name of the room. +- `-d/--room-description`: The room description. +- `-s/--bind-address`: The bind address for the room. +- `-p/--port`: The port used for the room. +- `-m/--max-members`: The maximum number of players for this room. +- `-w/--password`: The password for the room. +- `-g/--preferred-game`: The preferred game for this room. +- `-i/--preferred-game-id`: The preferred game-id for this room. +- `-u/--username`: The username used for announce. +- `-t/--token`: The token used for announce. +- `-a/--web-api-url`: yuzu Web API url. +- `-b/--ban-list-file`: The file for storing the room ban list. +- `-l/--log-file`: The file for storing the room log. +- `-h/--help`: Display this help and exit. +- `-v/--version`: Output version information and exit. diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 5f9e9bd654..31f9931d3a 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -23,6 +23,8 @@ add_library(core STATIC core_timing.h cpu_manager.cpp cpu_manager.h + launch_params.cpp + launch_params.h crypto/aes_util.cpp crypto/aes_util.h crypto/ctr_encryption_layer.cpp @@ -1203,6 +1205,9 @@ endif() target_include_directories(core PRIVATE ${OPUS_INCLUDE_DIRS}) target_link_libraries(core PUBLIC common PRIVATE audio_core hid_core network video_core nx_tzdb tz) +if (MSVC) + target_link_libraries(core PRIVATE getopt) +endif() if (BOOST_NO_HEADERS) target_link_libraries(core PUBLIC Boost::container Boost::heap Boost::asio Boost::process Boost::crc) diff --git a/src/core/launch_params.cpp b/src/core/launch_params.cpp new file mode 100644 index 0000000000..a0483226ec --- /dev/null +++ b/src/core/launch_params.cpp @@ -0,0 +1,205 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include + +#include "common/assert.h" +#include "common/logging.h" +#include "common/settings.h" +#include "common/string_util.h" +#include "common/scm_rev.h" +#include "core/core.h" +#include "core/hle/service/acc/profile_manager.h" +#include "core/launch_params.h" + +#undef _UNICODE +#include +#ifndef _MSC_VER +#include +#endif + +namespace Core { +LaunchParams ParseLaunchParams(Core::System& system, int argc, char *argv[], wchar_t *argv_w[]) noexcept { + LaunchParams p{}; + + int option_index = 0; + static struct option long_options[] = { + // clang-format off + {"debug", no_argument, 0, 'd'}, + {"config", required_argument, 0, 'c'}, + {"fullscreen", no_argument, 0, 'f'}, + {"help", no_argument, 0, 'h'}, + {"game", required_argument, 0, 'g'}, + {"multiplayer", required_argument, 0, 'm'}, + {"program", optional_argument, 0, 'p'}, + {"user", required_argument, 0, 'u'}, + {"version", no_argument, 0, 'v'}, + {"input-profile", no_argument, 0, 'i'}, + {"null-render", no_argument, 0, 'n'}, + {"singlecore", no_argument, 0, 's'}, + {"filter", no_argument, 0, 'x'}, + {0, 0, 0, 0}, + // clang-format on + }; + + while (optind < argc) { + if (int arg = getopt_long(argc, argv, "dc:fhg:m:p:u:vinsx", long_options, &option_index); arg != -1) { + switch (char(arg)) { + case 'd': + p.override_gdb_port = uint16_t(atoi(optarg)); + break; + case 'c': + p.config_path = optarg; + break; + case 'f': + p.fullscreen = true; + LOG_INFO(Frontend, "Starting in fullscreen mode..."); + break; + case 'h': + p.print_help = true; + break; + case 'g': + p.filepath = std::string(optarg); + break; + case 'i': { + p.input_profile = std::string(optarg); + break; + } + case 'm': { + p.use_multiplayer = true; + const std::string str_arg(optarg); + // regex to check if the format is nickname:password@ip:port + // with optional :password + const std::regex re("^([^:]+)(?::(.+))?@([^:]+)(?::([0-9]+))?$"); + if (std::regex_match(str_arg, re)) { + std::smatch match; + std::regex_search(str_arg, match, re); + ASSERT(match.size() == 5); + p.nickname = match[1]; + p.password = match[2]; + p.address = match[3]; + if (!match[4].str().empty()) { + p.port = u16(std::strtoul(match[4].str().c_str(), nullptr, 0)); + } + std::regex nickname_re("^[a-zA-Z0-9._\\- ]+$"); + ASSERT(std::regex_match(p.nickname, nickname_re) && "Nickname is not valid. Must be 4 to 20 alphanumeric characters"); + ASSERT(!p.address.empty() && "Address is empty"); + } + break; + } + case 'p': + p.program_args = argv[optind]; + ++optind; + break; + case 'u': { + // Launch game with a specific user + bool argument_ok = isdigit(optarg[0]); + p.selected_user = atoi(optarg); + if (!argument_ok) { + // try to look it up by username, only finds the first username that matches. + auto const user_idx = system.GetProfileManager().GetUserIndex(optarg); + if (user_idx != std::nullopt) { + p.selected_user = user_idx.value(); + } else { + LOG_ERROR(Frontend, "Invalid user argument '{}'", optarg); + break; + } + } + if (system.GetProfileManager().UserExistsIndex(*p.selected_user)) { + Settings::values.current_user = s32(*p.selected_user); + } else { + LOG_ERROR(Frontend, "Selected user {} doesn't exist", *p.selected_user); + } + break; + } + case 'v': + p.print_version = true; + break; + case 'n': + p.force_null_render = true; + break; + case 's': + p.force_single_core = true; + break; + case 'x': + p.log_filter = argv[optind]; + ++optind; + break; + } + } else { + // only kept due to shortcuts made by Qt frontend which use "-qlaunch" + if (strcmp(argv[optind], "-hlaunch") == 0) { + p.launch_hlaunch = true; + } else if (strcmp(argv[optind], "-qlaunch") == 0) { + p.launch_qlaunch = true; + } else if (strcmp(argv[optind], "-setup") == 0) { + p.launch_setup = true; + } else { + // qt feeds utf8 data, sdl frontend feeds raw utf16 data +#ifdef _WIN32 + p.filepath = argv_w != nullptr + ? Common::UTF16ToUTF8(argv_w[optind]) + : argv[optind]; +#else + p.filepath = argv[optind]; +#endif + } + optind++; + } + } + p.argv0 = argv[0]; + return p; +} + +void ApplyLaunchParams(LaunchParams const& lp) noexcept { + // apply the log_filter setting + // the logger was initialized before and doesn't pick up the filter on its own + Common::Log::Filter filter{}; + filter.ParseFilterString(lp.log_filter.value_or(Settings::values.log_filter.GetValue())); + Common::Log::SetGlobalFilter(filter); + + if (!lp.program_args.empty()) { + Settings::values.program_args = lp.program_args; + } + if (!lp.input_profile.empty()) { + auto& players = Settings::values.players.GetValue(); + players[0].profile_name = lp.input_profile; + } + if (lp.selected_user.has_value()) { + Settings::values.current_user = std::clamp(*lp.selected_user, 0, 7); + } + if (lp.override_gdb_port.has_value()) { + Settings::values.use_gdbstub = true; + Settings::values.gdbstub_port = *lp.override_gdb_port; + } + if (lp.force_single_core) { + Settings::values.use_multi_core = false; + } + if (lp.force_null_render) { + Settings::values.renderer_backend = Settings::RendererBackend::Null; + } + + if (lp.print_version) { + LOG_INFO(Frontend, "Eden {} {}", Common::g_scm_branch, Common::g_scm_desc); + } + if (lp.print_help) { + LOG_INFO(Frontend, + "Usage: {}" + " [options] \n" + "-c, --config Load the specified configuration file\n" + "-f, --fullscreen Start in fullscreen mode\n" + "-g, --game File path of the game to load\n" + "-h, --help Display this help and exit\n" + "-m, --multiplayer=nick:password@address:port" + " Nickname, password, address and port for multiplayer\n" + "-p, --program Pass following string as arguments to executable\n" + "-u, --user Select a specific user profile from 0 to 7\n" + "-d, --debug Run the GDB stub on a port from 1 to 65535\n" + "-v, --version Output version information and exit\n", + lp.argv0 + ); + } +} + +} diff --git a/src/core/launch_params.h b/src/core/launch_params.h new file mode 100644 index 0000000000..4da30fc1c2 --- /dev/null +++ b/src/core/launch_params.h @@ -0,0 +1,43 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include +#include "common/common_types.h" +#include "network/room.h" + +namespace Core { + +class System; +struct LaunchParams { + std::string argv0{}; + std::string filepath{}; + std::string nickname{}; + std::string password{}; + std::string address{}; + std::string input_profile{}; + std::string program_args{}; + std::optional config_path{}; + std::optional selected_user{}; + std::optional override_gdb_port{}; + std::optional log_filter{}; + u16 port = Network::DefaultRoomPort; + bool use_multiplayer = false; + bool fullscreen = false; + bool force_null_render = false; + bool force_single_core = false; + // print + bool print_version = false; + bool print_help = false; + // qt + bool launch_hlaunch = false; + bool launch_qlaunch = false; + bool launch_setup = false; +}; + +LaunchParams ParseLaunchParams(Core::System& system, int argc, char *argv[], wchar_t *argv_w[]) noexcept; +void ApplyLaunchParams(LaunchParams const& lp) noexcept; + +} diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 1d579239a1..e2807e80ff 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -3,6 +3,7 @@ // Static Qt on macOS doesn't use Vulkan // Other platforms do, and thus have conflicting VulkanMemoryAllocator symbols +#include "core/launch_params.h" #if defined(QT_STATICPLUGIN) && !defined(__APPLE__) #undef VMA_IMPLEMENTATION #endif @@ -515,79 +516,28 @@ MainWindow::MainWindow(bool has_broken_vulkan) // to prevent the UI from blowing up. UpdateUITheme(); - QStringList args = QApplication::arguments(); + if (QStringList args = QApplication::arguments(); args.size() >= 2) { + QList qba{}; + for (auto const& e : args) + qba.push_back(e.toUtf8()); + std::vector args_cstr{}; + for (auto& e : qba) + args_cstr.push_back(e.data()); - if (args.size() < 2) { - return; - } + auto const lp = Core::ParseLaunchParams(*QtCommon::system, args_cstr.size(), args_cstr.data(), nullptr); - QString game_path; - bool should_launch_qlaunch = false; - bool should_launch_hlaunch = false; - bool should_launch_setup = false; - bool has_gamepath = false; - bool is_fullscreen = false; - - // Preserves drag/drop functionality - for (int i = 1; i < args.size(); ++i) { - if (args[i] == QStringLiteral("-f")) { - // Launch game in fullscreen mode - is_fullscreen = true; - } else if (args[i] == QStringLiteral("-u") && i < args.size() - 1) { - // Launch game with a specific user - int user_arg_idx = ++i; - bool argument_ok; - std::size_t selected_user = args[user_arg_idx].toUInt(&argument_ok); - if (!argument_ok) { - // try to look it up by username, only finds the first username that matches. - std::string const user_arg_str = args[user_arg_idx].toStdString(); - auto const user_idx = - QtCommon::system->GetProfileManager().GetUserIndex(user_arg_str); - if (user_idx != std::nullopt) { - selected_user = user_idx.value(); - } else { - LOG_ERROR(Frontend, "Invalid user argument '{}'", user_arg_str); - continue; - } - } - if (QtCommon::system->GetProfileManager().UserExistsIndex(selected_user)) { - Settings::values.current_user = s32(selected_user); - user_flag_cmd_line = true; - } else { - LOG_ERROR(Frontend, "Selected user {} doesn't exist", selected_user); - } - } else if (args[i] == QStringLiteral("-g") && i < args.size() - 1) { - // Launch game at path - game_path = args[++i]; - has_gamepath = true; - } else if (args[i] == QStringLiteral("-input-profile") && i < args.size() - 1) { - auto& players = Settings::values.players.GetValue(); - players[0].profile_name = args[++i].toStdString(); - } else if (args[i] == QStringLiteral("-qlaunch")) { - should_launch_qlaunch = true; - } else if (args[i] == QStringLiteral("-hlaunch")) { - should_launch_hlaunch = true; - } else if (args[i] == QStringLiteral("-setup")) { - should_launch_setup = true; - } else { - game_path = args[i]; - has_gamepath = true; + // Override fullscreen setting if gamepath or argument is provided + if (!lp.filepath.empty() || lp.fullscreen) { + ui->action_Fullscreen->setChecked(lp.fullscreen); } - } - // Override fullscreen setting if gamepath or argument is provided - if (has_gamepath || is_fullscreen) { - ui->action_Fullscreen->setChecked(is_fullscreen); - } - - if (should_launch_setup) { - LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::Starter), std::nullopt); - } else { - if (!game_path.isEmpty()) { - BootGame(game_path, ApplicationAppletParameters()); - } else if (should_launch_qlaunch) { + if (!lp.filepath.empty()) { + BootGame(QString::fromStdString(lp.filepath), ApplicationAppletParameters()); + } else if (lp.launch_setup) { + LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::Starter), std::nullopt); + } else if (lp.launch_qlaunch) { LaunchFirmwareApplet(u64(Service::AM::AppletProgramId::QLaunch), std::nullopt); - } else if (should_launch_hlaunch) { + } else if (lp.launch_hlaunch) { std::filesystem::path const sd_dir = Common::FS::GetEdenPathString(Common::FS::EdenPath::SDMCDir); auto const hbl_path = (sd_dir / "atmosphere" / "hbl.nsp").string(); diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index 09a9bd6da1..17a1545167 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -42,9 +42,6 @@ target_link_libraries(yuzu-cmd PRIVATE common core input_common frontend_common if (ENABLE_OPENGL) target_link_libraries(yuzu-cmd PRIVATE glad) endif() -if (MSVC) - target_link_libraries(yuzu-cmd PRIVATE getopt) -endif() target_link_libraries(yuzu-cmd PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) create_resource("../../dist/eden.bmp" "yuzu_cmd/yuzu_icon.h" "yuzu_icon") diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index a161418289..473a5b1014 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -10,6 +10,7 @@ #include #include #include "common/settings_enums.h" +#include "core/launch_params.h" #ifdef __EMSCRIPTEN__ #include #endif @@ -52,12 +53,6 @@ #include "common/windows/timer_resolution.h" #endif -#undef _UNICODE -#include -#ifndef _MSC_VER -#include -#endif - #ifdef _WIN32 extern "C" { // tells Nvidia and AMD drivers to use the dedicated GPU by default on laptops with switchable @@ -67,25 +62,6 @@ __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1; } #endif -static void PrintHelp(const char* argv0) { - std::cout << "Usage: " << argv0 - << " [options] \n" - "-c, --config Load the specified configuration file\n" - "-f, --fullscreen Start in fullscreen mode\n" - "-g, --game File path of the game to load\n" - "-h, --help Display this help and exit\n" - "-m, --multiplayer=nick:password@address:port" - " Nickname, password, address and port for multiplayer\n" - "-p, --program Pass following string as arguments to executable\n" - "-u, --user Select a specific user profile from 0 to 7\n" - "-d, --debug Run the GDB stub on a port from 1 to 65535\n" - "-v, --version Output version information and exit\n"; -} - -static void PrintVersion() { - std::cout << "Eden " << Common::g_scm_branch << " " << Common::g_scm_desc << std::endl; -} - static void OnStateChanged(const Network::RoomMember::State& state) { switch (state) { case Network::RoomMember::State::Idle: @@ -208,168 +184,18 @@ extern "C" SDL_AppResult SDL_AppInit(void **appstate, int argc, char **argv) { LOG_CRITICAL(Frontend, "Failed to get command line arguments"); return SDL_APP_FAILURE; } -#endif - std::string filepath; - std::optional config_path{}; - std::string program_args; - std::optional selected_user{}; - std::optional override_gdb_port{}; - bool use_multiplayer = false; - bool fullscreen = false; - bool force_null_render = false; - bool force_single_core = false; - std::string nickname{}; - std::string password{}; - std::string address{}; - std::string input_profile{}; - std::optional log_filter{}; - u16 port = Network::DefaultRoomPort; - - static struct option long_options[] = { - // clang-format off - {"debug", no_argument, 0, 'd'}, - {"config", required_argument, 0, 'c'}, - {"fullscreen", no_argument, 0, 'f'}, - {"help", no_argument, 0, 'h'}, - {"game", required_argument, 0, 'g'}, - {"multiplayer", required_argument, 0, 'm'}, - {"program", optional_argument, 0, 'p'}, - {"user", required_argument, 0, 'u'}, - {"version", no_argument, 0, 'v'}, - {"input-profile", no_argument, 0, 'i'}, - {"null-render", no_argument, 0, 'n'}, - {"singlecore", no_argument, 0, 's'}, - {"filter", no_argument, 0, 'x'}, - {0, 0, 0, 0}, - // clang-format on - }; - - while (optind < argc) { - int arg = getopt_long(argc, argv, "g:fhvcip::c:u:d:", long_options, &option_index); - if (arg != -1) { - switch (char(arg)) { - case 'd': - override_gdb_port = uint16_t(atoi(optarg)); - break; - case 'c': - config_path = optarg; - break; - case 'f': - fullscreen = true; - LOG_INFO(Frontend, "Starting in fullscreen mode..."); - break; - case 'h': - PrintHelp(argv[0]); - return SDL_APP_FAILURE; - case 'g': - filepath = std::string(optarg); - break; - case 'i': { - input_profile = std::string(optarg); - break; - } - case 'm': { - use_multiplayer = true; - const std::string str_arg(optarg); - // regex to check if the format is nickname:password@ip:port - // with optional :password - const std::regex re("^([^:]+)(?::(.+))?@([^:]+)(?::([0-9]+))?$"); - if (!std::regex_match(str_arg, re)) { - std::cout << "Wrong format for option --multiplayer\n"; - PrintHelp(argv[0]); - return SDL_APP_FAILURE; - } - - std::smatch match; - std::regex_search(str_arg, match, re); - ASSERT(match.size() == 5); - nickname = match[1]; - password = match[2]; - address = match[3]; - if (!match[4].str().empty()) { - port = u16(std::strtoul(match[4].str().c_str(), nullptr, 0)); - } - std::regex nickname_re("^[a-zA-Z0-9._\\- ]+$"); - if (!std::regex_match(nickname, nickname_re)) { - LOG_ERROR(Frontend, "Nickname is not valid. Must be 4 to 20 alphanumeric characters"); - return SDL_APP_FAILURE; - } - if (address.empty()) { - LOG_ERROR(Frontend, "Address to room must not be empty"); - return SDL_APP_FAILURE; - } - break; - } - case 'p': - program_args = argv[optind]; - ++optind; - break; - case 'u': - selected_user = atoi(optarg); - break; - case 'v': - PrintVersion(); - return SDL_APP_FAILURE; - case 'n': - force_null_render = true; - break; - case 's': - force_single_core = true; - break; - case 'x': - log_filter = argv[optind]; - ++optind; - break; - } - } else { -#ifdef _WIN32 - filepath = Common::UTF16ToUTF8(argv_w[optind]); #else - filepath = argv[optind]; + wchar_t **argv_w = nullptr; #endif - optind++; - } - } - - SdlConfig config{config_path}; - - // apply the log_filter setting - // the logger was initialized before and doesn't pick up the filter on its own - Common::Log::Filter filter; - filter.ParseFilterString(log_filter.value_or(Settings::values.log_filter.GetValue())); - Common::Log::SetGlobalFilter(filter); - - if (!program_args.empty()) { - Settings::values.program_args = program_args; - } - - if (!input_profile.empty()) { - auto& players = Settings::values.players.GetValue(); - players[0].profile_name = input_profile; - } - - if (selected_user.has_value()) { - Settings::values.current_user = std::clamp(*selected_user, 0, 7); - } - - if (override_gdb_port.has_value()) { - Settings::values.use_gdbstub = true; - Settings::values.gdbstub_port = *override_gdb_port; - } - - if (force_single_core) { - Settings::values.use_multi_core = false; - } - - if (force_null_render) { - Settings::values.renderer_backend = Settings::RendererBackend::Null; - } - + Core::LaunchParams lp = Core::ParseLaunchParams(state->system, argc, argv, argv_w); #ifdef _WIN32 LocalFree(argv_w); #endif + SdlConfig config{lp.config_path}; - if (filepath.empty()) { + Core::ApplyLaunchParams(lp); + + if (lp.filepath.empty()) { LOG_CRITICAL(Frontend, "Failed to load ROM: No ROM specified"); return SDL_APP_FAILURE; } @@ -386,14 +212,14 @@ extern "C" SDL_AppResult SDL_AppInit(void **appstate, int argc, char **argv) { case Settings::RendererBackend::OpenGL_GLSL: case Settings::RendererBackend::OpenGL_GLASM: case Settings::RendererBackend::OpenGL_SPIRV: - state->emu_window = std::make_unique(&input_subsystem, state->system, fullscreen); + state->emu_window = std::make_unique(&input_subsystem, state->system, lp.fullscreen); break; #endif case Settings::RendererBackend::Vulkan: - state->emu_window = std::make_unique(&input_subsystem, state->system, fullscreen); + state->emu_window = std::make_unique(&input_subsystem, state->system, lp.fullscreen); break; case Settings::RendererBackend::Null: - state->emu_window = std::make_unique(&input_subsystem, state->system, fullscreen); + state->emu_window = std::make_unique(&input_subsystem, state->system, lp.fullscreen); break; default: LOG_CRITICAL(Frontend, "Invalid renderer backend"); @@ -413,12 +239,12 @@ extern "C" SDL_AppResult SDL_AppInit(void **appstate, int argc, char **argv) { Service::AM::FrontendAppletParameters load_parameters{ .applet_id = Service::AM::AppletId::Application, }; - const Core::SystemResultStatus load_result = state->system.Load(*state->emu_window, filepath, load_parameters); + const Core::SystemResultStatus load_result = state->system.Load(*state->emu_window, lp.filepath, load_parameters); switch (load_result) { case Core::SystemResultStatus::Success: break; // Expected case case Core::SystemResultStatus::ErrorGetLoader: - LOG_CRITICAL(Frontend, "Failed to obtain loader for {}!", filepath); + LOG_CRITICAL(Frontend, "Failed to obtain loader for {}!", lp.filepath); return SDL_APP_FAILURE; case Core::SystemResultStatus::ErrorLoader: LOG_CRITICAL(Frontend, "Failed to load ROM!"); @@ -440,14 +266,14 @@ extern "C" SDL_AppResult SDL_AppInit(void **appstate, int argc, char **argv) { return SDL_APP_FAILURE; } - if (use_multiplayer) { + if (lp.use_multiplayer) { if (auto member = Network::GetRoomMember().lock()) { member->BindOnChatMessageReceived(OnMessageReceived); member->BindOnStatusMessageReceived(OnStatusMessageReceived); member->BindOnStateChanged(OnStateChanged); member->BindOnError(OnNetworkError); - LOG_DEBUG(Network, "Start connection to {}:{} with nickname {}", address, port, nickname); - member->Join(nickname, address.c_str(), port, 0, Network::NoPreferredIP, password); + LOG_DEBUG(Network, "Start connection to {}:{} with nickname {}", lp.address, lp.port, lp.nickname); + member->Join(lp.nickname, lp.address.c_str(), lp.port, 0, Network::NoPreferredIP, lp.password); } else { LOG_ERROR(Network, "Could not access RoomMember"); return SDL_APP_FAILURE; From cb73a4dcc7710a7fea1643797b17e39858f4ae6a Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Thu, 24 Sep 2026 02:48:46 +0200 Subject: [PATCH 080/128] [renderer_vulkan] Skip post-processing on applet layers (#4474) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Detect applet layers via the absence of the Recording bit in layer_stack_mask (only AppletId::Application sets it) and skip PostProcessChain creation and application for them. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4474 Reviewed-by: CamilleLaVey Reviewed-by: lizzie --- src/video_core/renderer_vulkan/present/layer.cpp | 11 +++++++++-- src/video_core/renderer_vulkan/present/layer.h | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp index 1868142f51..6d3e7721f6 100644 --- a/src/video_core/renderer_vulkan/present/layer.cpp +++ b/src/video_core/renderer_vulkan/present/layer.cpp @@ -98,7 +98,10 @@ void Layer::ConfigureDraw(const Device& device, PresentPushConstants* out_push_c RefreshResources(device, framebuffer); SetAntiAliasPass(device); #ifdef HAS_RESHADE - SetPostProcessPass(device); + const bool is_applet = + (framebuffer.layer_stack_mask & Service::Nvnflinger::LayerStackBit( + Service::Nvnflinger::LayerStackId::Recording)) == 0; + SetPostProcessPass(device, is_applet); #endif // Finish any pending renderpass @@ -228,7 +231,11 @@ void Layer::SetAntiAliasPass(const Device& device) { } #ifdef HAS_RESHADE -void Layer::SetPostProcessPass(const Device& device) { +void Layer::SetPostProcessPass(const Device& device, bool is_applet) { + if (is_applet) { + post_process.reset(); + return; + } const VkExtent2D render_area{ .width = Settings::values.resolution_info.ScaleUp(raw_width), .height = Settings::values.resolution_info.ScaleUp(raw_height), diff --git a/src/video_core/renderer_vulkan/present/layer.h b/src/video_core/renderer_vulkan/present/layer.h index f290ba5bb4..b965ef7c49 100644 --- a/src/video_core/renderer_vulkan/present/layer.h +++ b/src/video_core/renderer_vulkan/present/layer.h @@ -70,7 +70,7 @@ private: void RefreshResources(const Device& device, const Tegra::FramebufferConfig& framebuffer); void SetAntiAliasPass(const Device& device); #ifdef HAS_RESHADE - void SetPostProcessPass(const Device& device); + void SetPostProcessPass(const Device& device, bool is_applet); #endif void ReleaseRawImages(); From dbeb73ee011416cffc6c203945f5ccc6b90621f6 Mon Sep 17 00:00:00 2001 From: xbzk Date: Thu, 24 Sep 2026 18:44:14 +0200 Subject: [PATCH 081/128] [video_core] cpu buffer fix + kepler uploads / maxwell macro dirty tracking fixes (#4473) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Aimed to fix two known UE5 crashes: Kepler uploads and Maxwell macros, both caused by CPU/GPU races due dirty tracking issues. Kepler ComputeInline: preserved dirty tracking across dma continuations and async readback. Maxwell macros: preserved gpu owned subranges during page granular cpu uploads. DiscardWrite: stopped clearing neighboring macro arguments by rounding up ranges. DMA Step: improved continuation aware dirty sampling. To the Ender Magnolia crew (maybe 1 or 2 persons): This will fix the dash crash, and the random / shackled beast vaper crashes. There are some more UE5 issues to go next. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4473 Reviewed-by: lizzie Reviewed-by: MaranBr --- src/video_core/buffer_cache/buffer_cache.h | 23 ++++++++++++++-------- src/video_core/dma_pusher.cpp | 15 +++++++++----- src/video_core/engines/kepler_compute.cpp | 15 ++++++++++---- src/video_core/engines/kepler_compute.h | 2 ++ 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 4c345dd213..576f20c4e7 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -121,7 +121,7 @@ void BufferCache

::UnmapGPUMemory(size_t as_id, GPUVAddr gpu_addr, size_t size template void BufferCache

::WriteMemory(DAddr device_addr, u64 size) { - if (memory_tracker.IsRegionGpuModified(device_addr, size)) { + if (IsRegionGpuModified(device_addr, size)) { ClearDownload(device_addr, size); gpu_modified_ranges.Subtract(device_addr, size); } @@ -311,11 +311,8 @@ std::pair BufferCache

::ObtainCPUBuffer( MarkWrittenBuffer(buffer_id, device_addr, size); break; case ObtainBufferOperation::DiscardWrite: { - const DAddr device_addr_start = Common::AlignDown(device_addr, 64); - const DAddr device_addr_end = Common::AlignUp(device_addr + size, 64); - const size_t new_size = device_addr_end - device_addr_start; - ClearDownload(device_addr_start, new_size); - gpu_modified_ranges.Subtract(device_addr_start, new_size); + ClearDownload(device_addr, size); + gpu_modified_ranges.Subtract(device_addr, size); break; } default: @@ -1742,14 +1739,24 @@ bool BufferCache

::SynchronizeBuffer(Buffer& buffer, DAddr device_addr, u32 si u64 total_size_bytes = 0; u64 largest_copy = 0; const DAddr buffer_start = buffer.cpu_addr_cached; - memory_tracker.ForEachUploadRange(device_addr, size, [&](u64 device_addr_out, u64 range_size) { + const auto add_upload = [&](DAddr start, DAddr end) { + if (start == end) return; + const u64 range_size = end - start; upload_copies.push_back(BufferCopy{ .src_offset = total_size_bytes, - .dst_offset = device_addr_out - buffer_start, + .dst_offset = start - buffer_start, .size = range_size, }); total_size_bytes += range_size; largest_copy = (std::max)(largest_copy, range_size); + }; + memory_tracker.ForEachUploadRange(device_addr, size, [&](u64 device_addr_out, u64 range_size) { + DAddr upload_start = device_addr_out; + gpu_modified_ranges.ForEachInRange(device_addr_out, range_size, [&](DAddr gpu_start, DAddr gpu_end) { + add_upload(upload_start, gpu_start); + upload_start = gpu_end; + }); + add_upload(upload_start, device_addr_out + range_size); }); if (total_size_bytes == 0) { return true; diff --git a/src/video_core/dma_pusher.cpp b/src/video_core/dma_pusher.cpp index 2417659f09..2c0ba007ef 100644 --- a/src/video_core/dma_pusher.cpp +++ b/src/video_core/dma_pusher.cpp @@ -16,7 +16,7 @@ namespace Tegra { constexpr u32 MacroRegistersStart = 0xE00; -[[maybe_unused]] constexpr u32 ComputeInline = 0x6D; +constexpr u32 ComputeInline = 0x6D; DmaPusher::DmaPusher(Core::System& system_, MemoryManager& memory_manager_, Control::ChannelState& channel_state_) : system{system_} @@ -73,11 +73,16 @@ bool DmaPusher::Step() { synced = false; } - if (header.size > 0 && dma_state.method >= MacroRegistersStart && subchannels[dma_state.subchannel]) { - subchannels[dma_state.subchannel]->current_dirty = memory_manager.IsMemoryDirty(dma_state.dma_get, header.size * sizeof(u32)); - } - if (header.size > 0) { + if (subchannels[dma_state.subchannel] && dma_state.method_count) { + const auto engine = subchannel_type[dma_state.subchannel]; + const bool kepler_payload = engine == Engines::EngineTypes::KeplerCompute && dma_state.method == ComputeInline && dma_state.non_incrementing; + const bool macro_payload = engine == Engines::EngineTypes::Maxwell3D && dma_state.method >= MacroRegistersStart; + if (kepler_payload || macro_payload) { + const size_t words = std::min(dma_state.method_count, header.size); + subchannels[dma_state.subchannel]->current_dirty = memory_manager.IsMemoryDirty(dma_state.dma_get, words * sizeof(u32)); + } + } const bool use_safe = Settings::IsDMALevelDefault() ? Settings::IsGPULevelHigh() : Settings::IsDMALevelSafe(); if (use_safe) { Tegra::Memory::GpuGuestMemoryheaders(memory_manager, dma_state.dma_get, header.size, &command_headers); diff --git a/src/video_core/engines/kepler_compute.cpp b/src/video_core/engines/kepler_compute.cpp index 1ef6e0fc0d..96a12539a2 100644 --- a/src/video_core/engines/kepler_compute.cpp +++ b/src/video_core/engines/kepler_compute.cpp @@ -49,13 +49,16 @@ void KeplerCompute::CallMethod(Core::System& system, u32 method, u32 method_argu case KEPLER_COMPUTE_REG_INDEX(exec_upload): { UploadInfo info{.upload_address = upload_address, .exec_address = upload_state.ExecTargetAddress(), - .copy_size = upload_state.GetUploadSize()}; + .copy_size = upload_state.GetUploadSize(), + .was_dirty = upload_dirty}; uploads.push_back(info); upload_state.ProcessExec(regs.exec_upload.linear != 0); break; } case KEPLER_COMPUTE_REG_INDEX(data_upload): { upload_address = current_dma_segment; + upload_dirty = current_dirty; + current_dirty = false; upload_state.ProcessData(method_argument, is_last_call); break; } @@ -64,9 +67,11 @@ void KeplerCompute::CallMethod(Core::System& system, u32 method, u32 method_argu for (auto& data : uploads) { const GPUVAddr offset = data.exec_address - launch_desc_loc; - if (offset / sizeof(u32) == LAUNCH_REG_INDEX(grid_dim_x) && - memory_manager.IsMemoryDirty(data.upload_address, data.copy_size)) { - indirect_compute = {data.upload_address}; + if (offset / sizeof(u32) == LAUNCH_REG_INDEX(grid_dim_x)) { + const bool source_dirty = memory_manager.IsMemoryDirty(data.upload_address, data.copy_size); + if (data.was_dirty || source_dirty) { + indirect_compute = {data.upload_address}; + } } } uploads.clear(); @@ -83,6 +88,8 @@ void KeplerCompute::CallMultiMethod(Core::System& system, u32 method, const u32* switch (method) { case KEPLER_COMPUTE_REG_INDEX(data_upload): upload_address = current_dma_segment; + upload_dirty = current_dirty; + current_dirty = false; upload_state.ProcessData(base_start, amount); return; default: diff --git a/src/video_core/engines/kepler_compute.h b/src/video_core/engines/kepler_compute.h index 4f7242f804..078d3d45be 100644 --- a/src/video_core/engines/kepler_compute.h +++ b/src/video_core/engines/kepler_compute.h @@ -226,11 +226,13 @@ private: VideoCore::RasterizerInterface* rasterizer = nullptr; Upload::State upload_state; GPUVAddr upload_address; + bool upload_dirty{}; struct UploadInfo { GPUVAddr upload_address; GPUVAddr exec_address; u32 copy_size; + bool was_dirty; }; std::vector uploads; std::optional indirect_compute{}; From 99bf8cf51afb7b367cb5003f11a797499c71d13c Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Fri, 25 Sep 2026 05:29:08 +0200 Subject: [PATCH 082/128] [am, renderer_vulkan] Fix overlay darkening and SGSR black screen on applets (#4475) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- - Overlay applet: use IsOverlayOpenLocked to pick the Z-index, so the darkening background is only layered above the game while the overlay is open. - Vulkan: skip the SGSR pass for applet layers to avoid presenting a black frame. - Partial revert fix crashes in games on UE with the overlay applet enabled. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4475 Reviewed-by: CamilleLaVey Reviewed-by: lizzie --- src/core/hle/service/am/window_system.cpp | 2 +- src/hid_core/resources/npad/npad.cpp | 23 +++++++++++-------- .../renderer_vulkan/present/layer.cpp | 13 +++++++---- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/core/hle/service/am/window_system.cpp b/src/core/hle/service/am/window_system.cpp index 3858791430..fbb1a57efd 100644 --- a/src/core/hle/service/am/window_system.cpp +++ b/src/core/hle/service/am/window_system.cpp @@ -517,7 +517,7 @@ void WindowSystem::UpdateAppletStateLocked(Applet* applet, bool is_foreground, b // Layer ordering. Composition sorts back-to-front. Now with enums for calrity. s32 z_index = Background; if (is_overlay) { - z_index = Overlay; + z_index = this->IsOverlayOpenLocked(*applet) ? Overlay : Background; } else if (inherited_foreground) { z_index = is_obscured ? Foreground : ForegroundVisible; } diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index c67f839df1..2b04e2c670 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp @@ -45,6 +45,19 @@ NPad::NPad(Core::HID::HIDCore& hid_core_, KernelHelpers::ServiceContext& service AbstractPad{hid_core_.kernel}, }} { + for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; ++aruid_index) { + for (std::size_t i = 0; i < controller_data[aruid_index].size(); ++i) { + auto& controller = controller_data[aruid_index][i]; + controller.device = hid_core.GetEmulatedControllerByIndex(i); + Core::HID::ControllerUpdateCallback engine_callback{ + .on_change = [this, i, kernel = &hid_core.kernel](Core::HID::ControllerTriggerType type) { + ControllerUpdate(*kernel, type, i); + }, + .is_npad_service = true, + }; + controller.callback_key = controller.device->SetCallback(engine_callback); + } + } for (std::size_t i = 0; i < abstracted_pads.size(); ++i) { abstracted_pads[i].SetNpadId(IndexToNpadIdType(i)); } @@ -93,16 +106,6 @@ Result NPad::Activate(u64 aruid) { for (std::size_t i = 0; i < controller_data[aruid_index].size(); ++i) { auto& controller = controller_data[aruid_index][i]; controller.shared_memory = &data->shared_memory_format->npad.npad_entry[i].internal_state; - controller.device = hid_core.GetEmulatedControllerByIndex(i); - if (!controller.callback_key) { - Core::HID::ControllerUpdateCallback engine_callback{ - .on_change = [this, i](Core::HID::ControllerTriggerType type) { - ControllerUpdate(hid_core.kernel, type, i); - }, - .is_npad_service = true, - }; - controller.callback_key = controller.device->SetCallback(engine_callback); - } } // Prefill controller buffers diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp index 6d3e7721f6..9f4aaf390f 100644 --- a/src/video_core/renderer_vulkan/present/layer.cpp +++ b/src/video_core/renderer_vulkan/present/layer.cpp @@ -94,13 +94,13 @@ void Layer::ConfigureDraw(const Device& device, PresentPushConstants* out_push_c const u32 scaled_width = texture_info ? texture_info->scaled_width : texture_width; const u32 scaled_height = texture_info ? texture_info->scaled_height : texture_height; const bool use_accelerated = texture_info.has_value(); + const bool is_applet = + (framebuffer.layer_stack_mask & Service::Nvnflinger::LayerStackBit( + Service::Nvnflinger::LayerStackId::Recording)) == 0; RefreshResources(device, framebuffer); SetAntiAliasPass(device); #ifdef HAS_RESHADE - const bool is_applet = - (framebuffer.layer_stack_mask & Service::Nvnflinger::LayerStackBit( - Service::Nvnflinger::LayerStackId::Recording)) == 0; SetPostProcessPass(device, is_applet); #endif @@ -141,8 +141,11 @@ void Layer::ConfigureDraw(const Device& device, PresentPushConstants* out_push_c source_image_view = fsr->Draw(device, scheduler, image_index, source_image, source_image_view, render_extent, crop_rect); crop_rect = {0, 0, 1, 1}; } else if (auto* sgsr = std::get_if(&sr_filter)) { - source_image_view = sgsr->Draw(device, scheduler, image_index, source_image, source_image_view, render_extent, crop_rect); - crop_rect = {0, 0, 1, 1}; + if (!is_applet) { + source_image_view = sgsr->Draw(device, scheduler, image_index, source_image, + source_image_view, render_extent, crop_rect); + crop_rect = {0, 0, 1, 1}; + } } SetMatrixData(device, *out_push_constants, layout); From bebc19da3253f13ceb5abfe8560cdbdc32ea7d8a Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 25 Sep 2026 07:54:49 +0200 Subject: [PATCH 083/128] [common] Use `std::make_unique_for_overwrite` in ScratchBuffer, remove polyfill (#4432) Original `make_unique_for_overwrite.h` is well defined acc. to standard https://en.cppreference.com/cpp/memory/unique_ptr/make_unique, but by now most libc++ supports the function, so no need for polyfill. Test that this didn't break anything (for example, Megaman game that has video at the start), or anything using VIC/IPC. Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4432 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey --- src/common/CMakeLists.txt | 1 - src/common/make_unique_for_overwrite.h | 27 ------------------- src/common/scratch_buffer.h | 12 ++++----- src/core/file_sys/vfs/vfs_real.cpp | 7 +++-- src/core/file_sys/vfs/vfs_real.h | 11 ++++---- .../hle/service/psc/ovln/receiver_service.cpp | 4 +-- 6 files changed, 16 insertions(+), 46 deletions(-) delete mode 100644 src/common/make_unique_for_overwrite.h diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 94da1724df..0517f0b9e1 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -76,7 +76,6 @@ add_library( logging.h lz4_compression.cpp lz4_compression.h - make_unique_for_overwrite.h math_util.h memory_detect.cpp memory_detect.h diff --git a/src/common/make_unique_for_overwrite.h b/src/common/make_unique_for_overwrite.h deleted file mode 100644 index 17f81bba4a..0000000000 --- a/src/common/make_unique_for_overwrite.h +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include - -namespace Common { - -template - requires(!std::is_array_v) -std::unique_ptr make_unique_for_overwrite() { - return std::unique_ptr(new T); -} - -template - requires std::is_unbounded_array_v -std::unique_ptr make_unique_for_overwrite(std::size_t n) { - return std::unique_ptr(new std::remove_extent_t[n]); -} - -template - requires std::is_bounded_array_v -void make_unique_for_overwrite(Args&&...) = delete; - -} // namespace Common diff --git a/src/common/scratch_buffer.h b/src/common/scratch_buffer.h index 8c1f566301..929a65609a 100644 --- a/src/common/scratch_buffer.h +++ b/src/common/scratch_buffer.h @@ -8,8 +8,7 @@ #include #include - -#include "common/make_unique_for_overwrite.h" +#include namespace Common { @@ -38,8 +37,9 @@ public: ScratchBuffer() = default; explicit ScratchBuffer(size_type initial_capacity) - : last_requested_size{initial_capacity}, buffer_capacity{initial_capacity}, - buffer{Common::make_unique_for_overwrite(initial_capacity)} {} + : last_requested_size{initial_capacity} + , buffer_capacity{initial_capacity} + , buffer{std::make_unique_for_overwrite(initial_capacity)} {} ~ScratchBuffer() = default; ScratchBuffer(const ScratchBuffer&) = delete; @@ -64,7 +64,7 @@ public: /// The previously held data will remain intact. void resize(size_type size) { if (size > buffer_capacity) { - auto new_buffer = Common::make_unique_for_overwrite(size); + auto new_buffer = std::make_unique_for_overwrite(size); std::memcpy(new_buffer.get(), buffer.get(), buffer_capacity * sizeof(T)); buffer = std::move(new_buffer); buffer_capacity = size; @@ -77,7 +77,7 @@ public: void resize_destructive(size_type size) { if (size > buffer_capacity) { buffer_capacity = size; - buffer = Common::make_unique_for_overwrite(buffer_capacity); + buffer = std::make_unique_for_overwrite(buffer_capacity); } last_requested_size = size; } diff --git a/src/core/file_sys/vfs/vfs_real.cpp b/src/core/file_sys/vfs/vfs_real.cpp index b04f832cd3..14e0caad3c 100644 --- a/src/core/file_sys/vfs/vfs_real.cpp +++ b/src/core/file_sys/vfs/vfs_real.cpp @@ -109,8 +109,7 @@ VirtualFile RealVfsFilesystem::OpenFileFromEntry(std::string_view path_, std::op auto reference = std::make_unique(); this->InsertReferenceIntoListLocked(*reference); - auto file = std::shared_ptr( - new RealVfsFile(*this, std::move(reference), path, perms, size, std::move(parent_path))); + auto file = std::make_shared(*this, std::move(reference), path, perms, size, std::move(parent_path)); cache[path] = file; return file; @@ -177,7 +176,7 @@ bool RealVfsFilesystem::DeleteFile(std::string_view path_) { VirtualDir RealVfsFilesystem::OpenDirectory(std::string_view path_, OpenMode perms) { const auto path = FS::SanitizePath(path_, FS::DirectorySeparator::PlatformDefault); - return std::shared_ptr(new RealVfsDirectory(*this, path, perms)); + return std::make_shared(*this, path, perms); } VirtualDir RealVfsFilesystem::CreateDirectory(std::string_view path_, OpenMode perms) { @@ -185,7 +184,7 @@ VirtualDir RealVfsFilesystem::CreateDirectory(std::string_view path_, OpenMode p if (!FS::CreateDirs(path)) { return nullptr; } - return std::shared_ptr(new RealVfsDirectory(*this, path, perms)); + return std::make_shared(*this, path, perms); } VirtualDir RealVfsFilesystem::CopyDirectory(std::string_view old_path_, diff --git a/src/core/file_sys/vfs/vfs_real.h b/src/core/file_sys/vfs/vfs_real.h index 672126d7ba..a97f7d32ea 100644 --- a/src/core/file_sys/vfs/vfs_real.h +++ b/src/core/file_sys/vfs/vfs_real.h @@ -82,6 +82,9 @@ class RealVfsFile : public VfsFile { friend class RealVfsFilesystem; public: + RealVfsFile(RealVfsFilesystem& base, std::unique_ptr reference, + const std::string& path, OpenMode perms = OpenMode::Read, + std::optional size = {}, std::optional parent_path = {}); ~RealVfsFile() override; std::string GetName() const override; @@ -95,9 +98,6 @@ public: bool Rename(std::string_view name) override; private: - RealVfsFile(RealVfsFilesystem& base, std::unique_ptr reference, - const std::string& path, OpenMode perms = OpenMode::Read, - std::optional size = {}, std::optional parent_path = {}); RealVfsFilesystem& base; std::unique_ptr reference; @@ -113,6 +113,8 @@ class RealVfsDirectory : public VfsDirectory { friend class RealVfsFilesystem; public: + RealVfsDirectory(RealVfsFilesystem& base, const std::string& path, + OpenMode perms = OpenMode::Read); ~RealVfsDirectory() override; VirtualFile GetFileRelative(std::string_view relative_path) const override; @@ -138,9 +140,6 @@ public: std::map> GetEntries() const override; private: - RealVfsDirectory(RealVfsFilesystem& base, const std::string& path, - OpenMode perms = OpenMode::Read); - template std::vector> IterateEntries() const; diff --git a/src/core/hle/service/psc/ovln/receiver_service.cpp b/src/core/hle/service/psc/ovln/receiver_service.cpp index d869325181..3b0b180725 100644 --- a/src/core/hle/service/psc/ovln/receiver_service.cpp +++ b/src/core/hle/service/psc/ovln/receiver_service.cpp @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -24,7 +24,7 @@ IReceiverService::~IReceiverService() = default; Result IReceiverService::OpenReceiver(Out> out_receiver) { LOG_DEBUG(Service_PSC, "called"); - *out_receiver = std::shared_ptr(new IReceiver(system)); + *out_receiver = std::make_shared(system); R_SUCCEED(); } From 87d2f03c39bc441055d593a7913f63a017795359 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Sat, 26 Sep 2026 02:21:45 +0200 Subject: [PATCH 084/128] [hid_core] Code cleanup (#4461) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- This is just a code cleanup. This is no longer necessary due to commit #4457. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4461 Reviewed-by: lizzie --- src/hid_core/frontend/emulated_controller.cpp | 22 ++++--------------- src/hid_core/frontend/emulated_controller.h | 2 -- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/src/hid_core/frontend/emulated_controller.cpp b/src/hid_core/frontend/emulated_controller.cpp index 1092970ee8..7b4af13232 100644 --- a/src/hid_core/frontend/emulated_controller.cpp +++ b/src/hid_core/frontend/emulated_controller.cpp @@ -761,9 +761,6 @@ void EmulatedController::StartMotionCalibration() { } void EmulatedController::SetButton(const Common::Input::CallbackStatus& callback, std::size_t index, Common::UUID uuid) { - const auto player_index = Service::HID::NpadIdTypeToIndex(npad_id_type); - const auto& player = Settings::values.players.GetValue()[player_index]; - if (index >= controller.button_values.size()) { return; } @@ -916,21 +913,10 @@ void EmulatedController::SetButton(const Common::Input::CallbackStatus& callback break; } - if (!is_connected) { - if (npad_type == NpadStyleIndex::Handheld) { - if (npad_id_type == NpadIdType::Handheld) { - Connect(); - controller_connected[player_index] = true; - } - } else if (npad_type != NpadStyleIndex::Handheld) { - if (npad_id_type == NpadIdType::Player1) { - Connect(); - controller_connected[player_index] = true; - } else if (player.connected && !controller_connected[player_index]) { - Connect(); - controller_connected[player_index] = true; - } - } + const auto player_index = Service::HID::NpadIdTypeToIndex(npad_id_type); + const auto& player = Settings::values.players.GetValue()[player_index]; + if (player.connected) { + Connect(); } TriggerOnChange(ControllerTriggerType::Button, true); diff --git a/src/hid_core/frontend/emulated_controller.h b/src/hid_core/frontend/emulated_controller.h index 7a2291b8a4..80ea633c63 100644 --- a/src/hid_core/frontend/emulated_controller.h +++ b/src/hid_core/frontend/emulated_controller.h @@ -22,7 +22,6 @@ #include "common/settings.h" #include "common/vector_math.h" #include "hid_core/frontend/motion_input.h" -#include "hid_core/hid_core.h" #include "hid_core/hid_types.h" #include "hid_core/irsensor/irs_types.h" @@ -585,7 +584,6 @@ private: std::array last_vibration_value{DEFAULT_VIBRATION_VALUE, DEFAULT_VIBRATION_VALUE}; std::array last_vibration_timepoint{}; - std::array controller_connected{}; // Atomically synched values std::atomic npad_type{HID::NpadStyleIndex::None}; From f273423b2b83f1a37cc7c1a7a92601f26e0c12ae Mon Sep 17 00:00:00 2001 From: MaranBr Date: Sat, 26 Sep 2026 05:01:27 +0200 Subject: [PATCH 085/128] [buffer_cache] Simplify GPU fence synchronization and remove GPU buffer readback (#4477) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- This is understood to improve GPU synchronization within the buffer cache in certain edge cases. GPU Fence Strict is no longer necessary. We now apply the stronger synchronization only in the specific case that actually requires it. The GPU Buffer Readback has been removed, as it is no longer needed following PR #4473. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4477 Reviewed-by: CamilleLaVey --- .../features/settings/model/BooleanSetting.kt | 1 - .../settings/model/view/SettingsItem.kt | 7 ---- .../settings/ui/SettingsFragmentPresenter.kt | 1 - .../app/src/main/res/values-ar/strings.xml | 3 -- .../app/src/main/res/values-de/strings.xml | 1 - .../app/src/main/res/values-es/strings.xml | 3 -- .../app/src/main/res/values-ru/strings.xml | 3 -- .../src/main/res/values-zh-rCN/strings.xml | 3 -- .../src/main/res/values-zh-rTW/strings.xml | 2 - .../app/src/main/res/values/arrays.xml | 1 - .../app/src/main/res/values/strings.xml | 3 -- src/common/settings.cpp | 4 -- src/common/settings.h | 10 +---- src/common/settings_enums.h | 2 +- src/qt_common/config/shared_translation.cpp | 5 +-- src/video_core/buffer_cache/buffer_cache.h | 39 +++++++++---------- .../buffer_cache/buffer_cache_base.h | 4 +- src/video_core/fence_manager.h | 2 +- src/video_core/query_cache/query_cache.h | 2 +- .../renderer_vulkan/vk_buffer_cache.cpp | 10 ++--- .../renderer_vulkan/vk_buffer_cache.h | 4 +- 21 files changed, 32 insertions(+), 78 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index ca3309245e..97be7f1bd9 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -30,7 +30,6 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"), ENABLE_BUFFER_HISTORY("enable_buffer_history"), USE_OPTIMIZED_VERTEX_BUFFERS("use_optimized_vertex_buffers"), - ENABLE_GPU_BUFFER_READBACK("enable_gpu_buffer_readback"), SYNC_MEMORY_OPERATIONS("sync_memory_operations"), BUFFER_REORDER_DISABLE("disable_buffer_reorder"), RENDERER_DEBUG("debug"), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 3f38831a17..366d3a8b3b 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -908,13 +908,6 @@ abstract class SettingsItem( descriptionId = R.string.enable_buffer_history_description ) ) - put( - SwitchSetting( - BooleanSetting.ENABLE_GPU_BUFFER_READBACK, - titleId = R.string.enable_gpu_buffer_readback, - descriptionId = R.string.enable_gpu_buffer_readback_description - ) - ) put( SwitchSetting( BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index ca282ba159..e9f818d9bc 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -549,7 +549,6 @@ class SettingsFragmentPresenter( add(BooleanSetting.RENDERER_FORCE_MAX_CLOCK.key) add(BooleanSetting.RENDERER_REACTIVE_FLUSHING.key) add(BooleanSetting.ENABLE_BUFFER_HISTORY.key) - add(BooleanSetting.ENABLE_GPU_BUFFER_READBACK.key) add(BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS.key) add(HeaderSetting(R.string.hacks)) diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 44f86d380f..fe8e1e0555 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -580,8 +580,6 @@ يحسن دقة العرض في بعض الألعاب على حساب الأداء. تمكين سجل التخزين المؤقت يُتيح هذا الخيار الوصول إلى حالات التخزين المؤقت السابقة. وقد يُحسّن جودة العرض وثبات الأداء في بعض الألعاب. - تفعيل قراءة مخزن وحدة معالجة الرسومات - يحافظ هذا النظام على بيانات المخزن المؤقت المُعدّلة بواسطة وحدة معالجة الرسومات عن طريق قراءتها مرة أخرى قبل التحميل. تتطلب بعض الألعاب ذلك لعرض بعض التأثيرات بشكل صحيح. قد يُسبب ذلك مشاكل إذا لم يتمكن الجهاز من التعامل مع عبء العمل الإضافي. مخازن الرؤوس المُحسّنة يُتيح ربطًا مُحسَّنًا لمخازن الرؤوس لتحسين الأداء. يتطلب برامج تشغيل Mesa 26.0+ Turnip/ برامج تشغيل QCOM. قد يتعطل على برامج تشغيل Turnip القديمة (25.3 وما دون). @@ -1099,7 +1097,6 @@ فوري متوازن دقيق - صارم محافظ عدواني diff --git a/src/android/app/src/main/res/values-de/strings.xml b/src/android/app/src/main/res/values-de/strings.xml index 6ed158fc72..8f6b691176 100644 --- a/src/android/app/src/main/res/values-de/strings.xml +++ b/src/android/app/src/main/res/values-de/strings.xml @@ -967,7 +967,6 @@ Wirklich fortfahren? Direkt Ausgewogen Genau - Strikt Konservativ Aggressiv diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index 3444ccaa71..72f8d74203 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -524,8 +524,6 @@ Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento. Activar el historial del búfer Permite el acceso al estado del búfer anterior. Esta opción puede mejorar la calidad de renderizado y la consistencia en el rendimiento de algunos juegos. - Activar la lectura del buffer de la GPU - Conserva los datos del búfer modificados por la GPU leyéndolos antes de subirlos.\nAlgunos juegos requieren esto para renderizar correctamente ciertos efectos.\nPuede causar problemas si el hardware no puede soportar la carga de trabajo adicional. Búferes de vértices optimizados Permite la optimización del enlace del búfer de vértices para un mejor rendimiento. Requiere controladores Mesa 26.0+ Turnip/ controladores QCOM. Fallará con controladores Turnip más antiguos (versión 25.3 o inferior). @@ -1038,7 +1036,6 @@ Inmediato Equilibrado Preciso - Estricto Conservador Agresivo diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 7bfe003317..912ce84caf 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -569,8 +569,6 @@ Повышение точности рендеринга в некоторых играх за счет снижения производительности. Включить историю буфера Позволяет обращаться к предыдущим состояниям буфера. Эта опция может повысить качество рендеринга и стабильность производительности в некоторых играх. - Включить обратное чтение буфера ГПУ - Сохраняет измененные ГПУ данные буфера путем чтения их обратно перед выгрузками. Некоторые игры требуют этого, чтобы рендерить определенные эффекты правильно. Может вызывать проблемы если оборудование не может обработать дополнительную рабочую нагрузку. Оптимизированные вершинные буферы Включает оптимизированную привязку вершинного буфера для повышения производительности. Требует Mesa Turnip 26.0+ / QCOM. Приводит к вылету на старых версиях драйверов Turnip (25.3 и ниже). @@ -1088,7 +1086,6 @@ Мгновенный Сбалансированный Точный - Строгий Консервативный Агрессивный diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index 2f41b5d65a..19f5f0aae7 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -570,8 +570,6 @@ 通过牺牲性能来提升某些游戏的渲染精度。 启用缓冲区历史 启用对先前缓冲区状态的访问。此选项可在某些游戏中提升渲染质量并保持性能的一致性。 - 启用 GPU 缓冲区回读 - 在上传前回读经由 GPU 修改过的缓冲区数据,以将其保留。一些游戏会用到这项设定以正确渲染某些效果。如果硬件无法处理额外的工作负载,则可能会导致问题。 优化顶点缓冲区 启用经过优化的顶点缓冲区绑定以提升性能。需要 Mesa 26.0 及以上版本的 Turnip 或 QCOM 驱动程序。若使用较旧版本的 Turnip 驱动 (25.3 及以下版本) 则会导致崩溃。 @@ -1089,7 +1087,6 @@ 即时 均衡 精确 - 严格 保守式 主动式 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 5db1e31a2b..044b7675de 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -561,8 +561,6 @@ 犧牲效能,以改善部分遊戲的轉譯準確度 啟用緩衝區歷史 允許存取先前的緩衝區狀態。此選項可能會改善部分遊戲的渲染品質與效能穩定性 - 啟用 GPU 緩衝區讀回 - 透過在上傳之前先將 GPU 修改過的緩衝區資料讀回來保存資料,部分遊戲需要啟用此功能才能正常渲染遊戲特效。如果硬體無法負荷可能會導致錯誤 最佳化頂點緩衝區 啟用最佳化的頂點緩衝區綁定。需要安裝 Mesa 26.0+ Turnip drivers/Qualcomm drivers。使用舊版 Turnip drivers 會導致當機 (25.3版和更低的版本) diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index b3aed5758c..be367a2fcf 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -558,7 +558,6 @@ @string/gpu_fence_behavior_immediate @string/gpu_fence_behavior_balanced @string/gpu_fence_behavior_accurate - @string/gpu_fence_behavior_strict 0 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 730f6bbade..5a587be351 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -586,8 +586,6 @@ Improves rendering accuracy in some games at the cost of performance. Enable buffer history Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - Enable GPU Buffer Readback - Preserves GPU-modified buffer data by reading it back before uploads. Some games require this to render certain effects properly. May cause issues if the hardware cannot handle the additional workload. Optimized Vertex Buffers Enables optimized vertex buffer binding for improved performance. Requires Mesa 26.0+ Turnip drivers/ QCOM drivers. Will crash on older Turnip drivers (25.3 and below). @@ -1138,7 +1136,6 @@ Immediate Balanced Accurate - Strict CPU diff --git a/src/common/settings.cpp b/src/common/settings.cpp index bc46b61bb4..3f5154026e 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -178,10 +178,6 @@ bool IsGPUFenceBehaviorAccurate() { return values.gpu_fence_behavior.GetValue() == GpuFenceBehavior::Accurate; } -bool IsGPUFenceBehaviorStrict() { - return values.gpu_fence_behavior.GetValue() == GpuFenceBehavior::Strict; -} - bool IsFastmemEnabled() { if (values.cpu_accuracy.GetValue() == Settings::CpuAccuracy::Debugging) return bool(values.cpuopt_fastmem); diff --git a/src/common/settings.h b/src/common/settings.h index c1c2d4f0df..5d66f49ebd 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -525,7 +525,7 @@ struct Values { SwitchableSetting gpu_fence_behavior{linkage, GpuFenceBehavior::Default, GpuFenceBehavior::Default, - GpuFenceBehavior::Strict, + GpuFenceBehavior::Accurate, "gpu_fence_behavior", Category::RendererAdvanced, Specialization::Default, @@ -655,13 +655,6 @@ struct Values { SwitchableSetting rescale_hack{linkage, false, "rescale_hack", Category::RendererHacks}; - SwitchableSetting enable_gpu_buffer_readback{linkage, - false, - "enable_gpu_buffer_readback", - Category::RendererAdvanced, - Specialization::Default, - true, - true}; SwitchableSetting use_asynchronous_shaders{linkage, false, "use_asynchronous_shaders", Category::RendererHacks}; @@ -979,7 +972,6 @@ bool IsDMALevelSafe(); bool IsGPUFenceBehaviorDefault(); bool IsGPUFenceBehaviorBalanced(); bool IsGPUFenceBehaviorAccurate(); -bool IsGPUFenceBehaviorStrict(); bool IsFastmemEnabled(); void SetNceEnabled(bool is_64bit); diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index 4b406f4c35..55acb0ae8c 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -137,7 +137,7 @@ ENUM(VramUsageMode, Conservative, Aggressive); ENUM(RendererBackend, OpenGL_GLSL, Vulkan, Null, OpenGL_GLASM, OpenGL_SPIRV); ENUM(GpuAccuracy, Low, High); ENUM(DmaAccuracy, Default, Unsafe, Safe); -ENUM(GpuFenceBehavior, Default, Immediate, Balanced, Accurate, Strict); +ENUM(GpuFenceBehavior, Default, Immediate, Balanced, Accurate); ENUM(CpuBackend, Dynarmic, Nce); ENUM(CpuAccuracy, Auto, Accurate, Unsafe, Paranoid, Debugging); ENUM(CpuClock, Normal, Boost, Overclock) diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index 4ef97c602a..d61c84e278 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -226,9 +226,7 @@ std::unique_ptr InitializeTranslations(QObject* parent) { INSERT(Settings, dma_accuracy, tr("DMA Accuracy:"), tr("Controls the DMA read mode.\nUnsafe is faster, while Safe is more stable and can fix issues in some games.\nDefault follows the GPU Accuracy setting.")); INSERT(Settings, gpu_fence_behavior, tr("GPU Fence Behavior:"), - tr("Controls the GPU fence synchronization behavior.\nImmediate is the fastest option, but can introduce some issues.\nBalanced offers better compatibility and may fix issues in some games.\nAccurate further improves compatibility at the cost of some performance.\nStrict is the slowest option, but can fix issues that require stricter synchronization.\nDefault follows the GPU Accuracy setting.")); - INSERT(Settings, enable_gpu_buffer_readback, tr("Enable GPU buffer readback"), - tr("Preserves GPU-modified data by reading it back before uploading.\nSome games require this to render certain effects properly.")); + tr("Controls the GPU fence synchronization behavior.\nImmediate is the fastest option, but can introduce some issues.\nBalanced offers better compatibility and may fix issues in some games.\nAccurate further improves compatibility at the cost of some performance.\nDefault follows the GPU Mode setting.")); INSERT(Settings, use_asynchronous_shaders, tr("Enable asynchronous shader compilation"), tr("May reduce shader stutter.")); INSERT(Settings, gpu_clock, tr("GPU Clocks"), @@ -442,7 +440,6 @@ std::unique_ptr ComboboxEnumeration(QObject* parent) { PAIR(GpuFenceBehavior, Immediate, tr("Immediate")), PAIR(GpuFenceBehavior, Balanced, tr("Balanced")), PAIR(GpuFenceBehavior, Accurate, tr("Accurate")), - PAIR(GpuFenceBehavior, Strict, tr("Strict")), }}); translations->insert( {Settings::EnumMetadata::Index(), diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 576f20c4e7..9a5d6f322a 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -249,6 +249,10 @@ bool BufferCache

::DMACopy(GPUVAddr src_address, GPUVAddr dest_address, u64 am runtime.CopyBuffer(dest_buffer, src_buffer, copies, true); if (has_new_downloads) { memory_tracker.MarkRegionAsGpuModified(*cpu_dest_address, amount); + const bool should_sync = Settings::IsGPUFenceBehaviorBalanced() || Settings::IsGPUFenceBehaviorAccurate(); + if (should_sync) { + runtime.Finish(); + } } Tegra::Memory::DeviceGuestMemoryScoped @@ -1230,7 +1234,7 @@ void BufferCache

::BindHostComputeStorageBuffers() { buffer.MarkUsage(offset, size); if (is_written) { - MarkWrittenBuffer(binding.buffer_id, binding.device_addr, size); + MarkWrittenBuffer(binding.buffer_id, binding.device_addr, size, true); } if constexpr (NEEDS_BIND_STORAGE_INDEX) { @@ -1516,10 +1520,12 @@ void BufferCache

::UpdateComputeTextureBuffers() { } template -void BufferCache

::MarkWrittenBuffer(BufferId buffer_id, DAddr device_addr, u32 size) { +void BufferCache

::MarkWrittenBuffer(BufferId buffer_id, DAddr device_addr, u32 size, bool needs_sync) { if constexpr (!IS_OPENGL) { - Buffer& buffer = slot_buffers[buffer_id]; - buffer.setWriteTick(runtime.CurrentTick()); + if (needs_sync) { + Buffer& buffer = slot_buffers[buffer_id]; + buffer.setWriteTick(runtime.CurrentTick()); + } } memory_tracker.MarkRegionAsGpuModified(device_addr, size); gpu_modified_ranges.Add(device_addr, size); @@ -1535,8 +1541,11 @@ BufferId BufferCache

::FindBuffer(DAddr device_addr, u32 size, bool sparse_com const BufferId buffer_id = page_table[page]; if (buffer_id) { Buffer& buffer = slot_buffers[buffer_id]; - WaitForGpuFenceIfNeeded(buffer); if (buffer.IsInBounds(device_addr, size)) { + const bool should_sync = Settings::IsGPUFenceBehaviorAccurate(); + if (should_sync) { + SynchronizeBufferWrites(buffer); + } bool usable = true; if constexpr (requires { buffer.IsSparseCompatible(); }) { if (sparse_compatible && !buffer.IsSparseCompatible()) { @@ -1552,17 +1561,11 @@ BufferId BufferCache

::FindBuffer(DAddr device_addr, u32 size, bool sparse_com } template -void BufferCache

::WaitForGpuFenceIfNeeded(Buffer& buffer) { +void BufferCache

::SynchronizeBufferWrites(Buffer& buffer) { if constexpr (!IS_OPENGL) { - const bool gpu_fence_accurate = Settings::IsGPUFenceBehaviorAccurate(); - const bool gpu_fence_strict = Settings::IsGPUFenceBehaviorStrict(); - if (gpu_fence_accurate || gpu_fence_strict) { - const u64 gpu_tick_delay = gpu_fence_strict ? 0 : 3; - const u64 buffer_tick = buffer.getWriteTick(); - const u64 gpu_tick = runtime.KnownGpuTick(); - if (buffer_tick > gpu_tick + gpu_tick_delay) { - runtime.Wait(buffer_tick); - } + const u64 buffer_tick = buffer.getWriteTick(); + if (!runtime.IsFree(buffer_tick)) { + runtime.Wait(buffer_tick); } } } @@ -1795,9 +1798,6 @@ void BufferCache

::ImmediateUploadMemory([[maybe_unused]] Buffer& buffer, if (immediate_buffer.empty()) { immediate_buffer = ImmediateBuffer(largest_copy); } - if (Settings::values.enable_gpu_buffer_readback.GetValue()) { - DownloadBufferMemory(buffer, device_addr, copy.size); - } device_memory.ReadBlockUnsafe(device_addr, immediate_buffer.data(), copy.size); upload_span = immediate_buffer.subspan(0, copy.size); } @@ -1816,9 +1816,6 @@ void BufferCache

::MappedUploadMemory([[maybe_unused]] Buffer& buffer, for (BufferCopy& copy : copies) { u8* const src_pointer = staging_pointer.data() + copy.src_offset; const DAddr device_addr = buffer.CpuAddr() + copy.dst_offset; - if (Settings::values.enable_gpu_buffer_readback.GetValue()) { - DownloadBufferMemory(buffer, device_addr, copy.size); - } device_memory.ReadBlockUnsafe(device_addr, src_pointer, copy.size); // Apply the staging offset copy.src_offset += upload_staging.offset; diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h index 0dbb368c47..26bf3dd9ed 100644 --- a/src/video_core/buffer_cache/buffer_cache_base.h +++ b/src/video_core/buffer_cache/buffer_cache_base.h @@ -430,11 +430,11 @@ private: void UpdateComputeTextureBuffers(); - void MarkWrittenBuffer(BufferId buffer_id, DAddr device_addr, u32 size); + void MarkWrittenBuffer(BufferId buffer_id, DAddr device_addr, u32 size, bool needs_sync = false); [[nodiscard]] BufferId FindBuffer(DAddr device_addr, u32 size, bool sparse_compatible); - void WaitForGpuFenceIfNeeded(Buffer& buffer); + void SynchronizeBufferWrites(Buffer& buffer); [[nodiscard]] OverlapResult ResolveOverlaps(DAddr device_addr, u32 wanted_size); diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h index 885c714025..776c01e3fa 100644 --- a/src/video_core/fence_manager.h +++ b/src/video_core/fence_manager.h @@ -72,7 +72,7 @@ public: } void SignalFence(std::function&& func) { - const bool delay_fence = Settings::IsGPUFenceBehaviorDefault() ? Settings::IsGPULevelHigh() : Settings::IsGPUFenceBehaviorBalanced() || Settings::IsGPUFenceBehaviorAccurate() || Settings::IsGPUFenceBehaviorStrict(); + const bool delay_fence = Settings::IsGPUFenceBehaviorDefault() ? Settings::IsGPULevelHigh() : Settings::IsGPUFenceBehaviorBalanced() || Settings::IsGPUFenceBehaviorAccurate(); const bool should_flush = ShouldFlush(); if constexpr (!can_async_check) { TryReleasePendingFences(); diff --git a/src/video_core/query_cache/query_cache.h b/src/video_core/query_cache/query_cache.h index 5404dec943..b8c1bc4f45 100644 --- a/src/video_core/query_cache/query_cache.h +++ b/src/video_core/query_cache/query_cache.h @@ -260,7 +260,7 @@ void QueryCacheBase::CounterReport(GPUVAddr addr, QueryType counter_type }; u8* pointer = impl->device_memory.template GetPointer(cpu_addr); u8* pointer_timestamp = impl->device_memory.template GetPointer(cpu_addr + 8); - bool is_synced = (Settings::IsGPUFenceBehaviorDefault() ? !Settings::IsGPULevelHigh() : !Settings::IsGPUFenceBehaviorBalanced() && !Settings::IsGPUFenceBehaviorAccurate() && !Settings::IsGPUFenceBehaviorStrict()) && is_fence; + bool is_synced = (Settings::IsGPUFenceBehaviorDefault() ? !Settings::IsGPULevelHigh() : !Settings::IsGPUFenceBehaviorBalanced() && !Settings::IsGPUFenceBehaviorAccurate()) && is_fence; std::function operation([this, is_synced, streamer, query_base = query, query_location, pointer, pointer_timestamp] { if (True(query_base->flags & QueryFlagBits::IsInvalidated)) { diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 958f3b2a2e..1a33189bf8 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp @@ -419,15 +419,15 @@ void BufferCacheRuntime::TickFrame(Common::SlotVector& slot_buffers) noe } u64 BufferCacheRuntime::CurrentTick() { - return scheduler.GetMasterSemaphore().CurrentTick(); + return scheduler.CurrentTick(); } -u64 BufferCacheRuntime::KnownGpuTick() { - return scheduler.GetMasterSemaphore().KnownGpuTick(); +bool BufferCacheRuntime::IsFree(u64 tick) { + return scheduler.IsFree(tick); } -void BufferCacheRuntime::Wait(u64 buffer_tick) { - scheduler.Wait(buffer_tick); +void BufferCacheRuntime::Wait(u64 tick) { + scheduler.Wait(tick); } void BufferCacheRuntime::Finish() { diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index fbd8c2e753..fff1f8164d 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h @@ -112,9 +112,9 @@ public: u64 CurrentTick(); - u64 KnownGpuTick(); + bool IsFree(u64 tick); - void Wait(u64 buffer_tick); + void Wait(u64 tick); void Finish(); From 37fe9119526c03ca064166130cc983c55b9a9e86 Mon Sep 17 00:00:00 2001 From: Exverge Date: Sat, 26 Sep 2026 16:02:35 +0200 Subject: [PATCH 086/128] [common/sparse_large_vector] correct Win32 exception handler (#4481) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Adds mutex to prevent multiple threads from accessing the vector at the same time and corrects the Windows exception handler to use the correct faulting address used by the exception handler (previously used the instruction address instead of the fault address) and properly shifts the stored values for the handler. Fixes weird compiler-specific bugs on Windows Co-authored-by: bruno Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4481 Reviewed-by: lizzie Reviewed-by: MaranBr --- src/common/sparse_large_vector.cpp | 46 ++++++++++++++++++++---------- src/common/sparse_large_vector.h | 27 +++++++++++------- 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/src/common/sparse_large_vector.cpp b/src/common/sparse_large_vector.cpp index 745575a880..eee8ff6d18 100644 --- a/src/common/sparse_large_vector.cpp +++ b/src/common/sparse_large_vector.cpp @@ -6,6 +6,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #ifdef _WIN32 +#include #include #include #else @@ -20,32 +21,36 @@ namespace Common { #ifdef _WIN32 static std::vector> vector_regions {}; +static std::mutex vector_regions_mutex {}; // Workaround for handling non-commited memory accessed by Dynarmic; usually result of an error static LONG WINAPI FakePageFaultHandler(PEXCEPTION_POINTERS info) { DWORD code = info->ExceptionRecord->ExceptionCode; - u64 exception_addr = reinterpret_cast(info->ExceptionRecord->ExceptionAddress); + u64 exception_addr = reinterpret_cast(info->ExceptionRecord->ExceptionInformation[1]); - if (code != EXCEPTION_ACCESS_VIOLATION) { + if (code != EXCEPTION_ACCESS_VIOLATION || info->ExceptionRecord->ExceptionInformation[0] == 1) { // Not our problem return EXCEPTION_CONTINUE_SEARCH; } u64 addr = 0, addr2 = 0; - for (auto region: vector_regions) { - auto addr_shifted = exception_addr >> HostPageBits; - if (region.first <= addr_shifted && addr_shifted <= region.second) { - addr = addr_shifted; - } + { + std::lock_guard lock(vector_regions_mutex); + for (auto region: vector_regions) { + auto addr_shifted = exception_addr >> HostPageBits; + if (region.first <= addr_shifted && addr_shifted <= region.second) { + addr = addr_shifted; + } - // Page-boundary accesses - if (auto addr_ = (exception_addr + 0x40) >> HostPageBits; addr_ != addr_shifted && region.first <= addr_ && addr_ <= region.second) { - addr2 = addr_; - } + // Page-boundary accesses + if (auto addr_ = (exception_addr + 0x40) >> HostPageBits; addr_ != addr_shifted && region.first <= addr_ && addr_ <= region.second) { + addr2 = addr_; + } - if (addr != 0 || addr2 != 0) { - break; + if (addr != 0 || addr2 != 0) { + break; + } } } @@ -77,8 +82,16 @@ bool CommitVectorPage(uintptr_t addr, bool write) noexcept { auto res = VirtualQuery(reinterpret_cast(addr), &info, sizeof(info)); if (res == 0) { LOG_CRITICAL(HW_Memory, "Failed to query large buffer region at {:#x} with error {}, will try committing anyway", addr, GetLastError()); + } else if (info.State == MEM_COMMIT) { + DWORD old_protect {}; + auto perm = write ? PAGE_READWRITE : PAGE_READONLY; + if (!VirtualProtect(reinterpret_cast(addr), HostPageSize, perm, &old_protect)) { + LOG_ERROR(HW_Memory, "Failed to change permissions of large buffer region at {:#x}, error {}", addr, GetLastError()); + return false; + } + return true; } else if (info.State != MEM_RESERVE) { - LOG_ERROR(HW_Memory, "Tried to commit an unreserved large buffer region at {:#x} that is not mapped or is already committed (state {:#x})", addr, info.State); + LOG_ERROR(HW_Memory, "Tried to commit an unreserved large buffer region at {:#x} that is not mapped (state {:#x})", addr, info.State); return false; } @@ -123,7 +136,8 @@ void* AllocateMemoryPages(std::size_t size) noexcept { void* base = VirtualAlloc(nullptr, size, MEM_RESERVE, PAGE_READWRITE); if (base != nullptr) { - vector_regions.emplace_back(reinterpret_cast(base), reinterpret_cast(base) + size); + std::lock_guard lock(vector_regions_mutex); + vector_regions.emplace_back(reinterpret_cast(base) >> HostPageBits, (reinterpret_cast(base) + size) >> HostPageBits); static std::once_flag flag; std::call_once(flag, []() { AddVectoredExceptionHandler(1, FakePageFaultHandler); }); @@ -149,6 +163,8 @@ void FreeMemoryPages(void* base, [[maybe_unused]] std::size_t size) noexcept { if (!base) return; #ifdef _WIN32 + std::lock_guard lock(vector_regions_mutex); + std::erase_if(vector_regions, [base](const auto& r) {return r.first == reinterpret_cast(base); }); ASSERT(VirtualFree(base, 0, MEM_RELEASE)); #else ASSERT(munmap(base, size) == 0); diff --git a/src/common/sparse_large_vector.h b/src/common/sparse_large_vector.h index 86f0be7866..8496c28cef 100644 --- a/src/common/sparse_large_vector.h +++ b/src/common/sparse_large_vector.h @@ -28,9 +28,9 @@ constexpr u64 HostPageBits = 12; constexpr u64 HostPageMask = ~(HostPageSize - 1); bool CommitVectorPage(uintptr_t addr, bool write) noexcept; #else -const u64 HostPageSize = sysconf(_SC_PAGESIZE); -const u64 HostPageBits = std::countr_zero(HostPageSize); -const u64 HostPageMask = ~(HostPageSize - 1); +inline const u64 HostPageSize = sysconf(_SC_PAGESIZE); +inline const u64 HostPageBits = std::countr_zero(HostPageSize); +inline const u64 HostPageMask = ~(HostPageSize - 1); #endif void* AllocateMemoryPages(std::size_t size) noexcept; @@ -81,8 +81,8 @@ public: UNREACHABLE_MSG("Out of bounds RW access on SparseLargeVector @ {}", index); } - if (!IsCommittedPage(index)) { - CommitPage(index); + if (!IsCommittedPage(index) && !CommitPage(index)) { + UNREACHABLE_MSG("Cannot access SparseLargeVector index {} with RW permission", index); } return base_ptr[index]; } @@ -103,9 +103,8 @@ public: LOG_CRITICAL(Common_Memory, "Out of bounds write on SparseLargeVector @ {}", index); return; } - if (!IsCommittedPage(index)) - CommitPage(index); - base_ptr[index] = value; + if (IsCommittedPage(index) || CommitPage(index)) + base_ptr[index] = value; } void ZeroRegion(std::size_t start, std::size_t end_) noexcept { @@ -177,16 +176,22 @@ private: return (val >> (page & 63)) & 1; } - constexpr void CommitPage(std::size_t index) noexcept { + constexpr bool CommitPage(std::size_t index) noexcept { auto page_index = (index * sizeof(T)) >> HostPageBits; auto page = reinterpret_cast(base_ptr + index) & HostPageMask; #if defined(_WIN32) - CommitVectorPage(page, true); + if (!CommitVectorPage(page, true)) { + return false; + } #else - mprotect(reinterpret_cast(page), HostPageSize, PROT_READ | PROT_WRITE); + if (mprotect(reinterpret_cast(page), HostPageSize, PROT_READ | PROT_WRITE) != 0) { + LOG_ERROR(Common_Memory, "Failed to commit large buffer region at index {}, error {}", index, strerror(errno)); + return false; + } #endif committed_pages[page_index >> 6].fetch_or(1ULL << (page_index & 63), std::memory_order_release); + return true; } constexpr void DecommitPage(std::size_t index) noexcept { From 815325cceca948030cf476dce7c46d901e4e4df5 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Sun, 27 Sep 2026 12:48:45 +0200 Subject: [PATCH 087/128] [loader] add ZBIC (zstd variant) NSO decompression support for Switch 22.0+ (#4482) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- A new NSO compression method was introduced in Switch 22.0.0. This is a customized variant of zstd and is used when NSO flags have bit 7 set. Key characteristics: - ZSTD_MAGICNUMBER is set to 0x4349425A (b'ZBIC') instead of 0xFD2FB528 - ZSTD_LEGACY_SUPPORT is set to 0 - ZSTD_TRACE is set to 1, zstd version used is 1.5.7 (10507) - FSE_readNCount is replaced with a BIC (Binary Interpolative Coding) version which improves compression of entropy tables significantly Source: https://switchbrew.org/wiki/22.0.0 Implementation: - Detect ZBIC segments via NSO flag bit 7 (NsoFlags_UseZbicCompression) and/or ZBIC magic scan in nso.cpp - Fall back to LZ4 when ZBIC is not detected or returns unexpected size - Handle segment 0 alternate offset (0x100 vs 0x108) for both ZBIC and LZ4 References: - Atmosphère loader/strat zstd-zbic integration: https://github.com/Atmosphere-NX/Atmosphere/commit/082115187a0509cb6b8a757de639a4e4741b8712 - nxdumptool ZBIC segment compression support: https://github.com/DarkMatterCore/nxdumptool/commit/441e5c0904f29427987433be4eb057a2843d222a - STORM_SWITCH ZBIC implementation: https://github.com/ReiKatari/STORM_SWITCH/commit/1e09eb82b760aaf340b810031400991c0740c091 Tested with firmware 23.0.0 and ZBIC-compressed NSOs. Co-authored-by: xbzk Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4482 Reviewed-by: CamilleLaVey Reviewed-by: lizzie Reviewed-by: Maufeat --- cpmfile.json | 5 ++++ externals/CMakeLists.txt | 5 ++++ src/common/CMakeLists.txt | 6 +++++ src/common/zbic_compression.cpp | 46 +++++++++++++++++++++++++++++++++ src/common/zbic_compression.h | 15 +++++++++++ src/core/loader/nso.cpp | 35 ++++++++++++++++++++++--- src/core/loader/nso.h | 6 +++++ 7 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 src/common/zbic_compression.cpp create mode 100644 src/common/zbic_compression.h diff --git a/cpmfile.json b/cpmfile.json index f574bf5668..616235f27a 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -333,6 +333,11 @@ "repo": "herumi/xbyak", "version": "v7.40.1" }, + "zbic": { + "hash": "fbe2f37986377d7f0d96ae3224c80b5971df6e8b6961f68061f1975ebb2e8cb78f07b90f014b007be4023dbf5513581504e7f7d61a5237cb2a8a7a61ae11e482", + "repo": "kinnay/zbic", + "version": "11b08f2712264bbed731545085cbd9702096ceb7" + }, "zlib": { "hash": "16fea4df307a68cf0035858abe2fd550250618a97590e202037acd18a666f57afc10f8836cbbd472d54a0e76539d0e558cb26f059d53de52ff90634bbf4f47d4", "min_version": "1.2", diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index a211b7f013..cb1deceb96 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -48,6 +48,11 @@ if (NOT TARGET stb::headers) add_library(stb::headers ALIAS stb) endif() +AddJsonPackage(NAME zbic DOWNLOAD_ONLY) +set(ZBIC_INCLUDE_DIR + "${zbic_SOURCE_DIR}/src" + PARENT_SCOPE) + # ItaniumDemangle (Windows only) if (WIN32 AND NOT TARGET LLVM::Demangle) add_library(demangle demangle/ItaniumDemangle.cpp) diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 0517f0b9e1..5d1b30a549 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -137,6 +137,8 @@ add_library( uuid.cpp uuid.h vector_math.h + zbic_compression.cpp + zbic_compression.h zstd_compression.cpp zstd_compression.h fs/ryujinx_compat.h fs/ryujinx_compat.cpp @@ -147,6 +149,10 @@ add_library( net/net.h net/net.cpp container/unordered_map.h container/unordered_set.h) +set_source_files_properties(zbic_compression.cpp PROPERTIES + INCLUDE_DIRECTORIES "${ZBIC_INCLUDE_DIR}" + COMPILE_OPTIONS "$<$:-Wno-unused-function;-Wno-missing-declarations;-Wno-shadow>") + if(WIN32) target_sources(common PRIVATE windows/timer_resolution.cpp windows/timer_resolution.h) diff --git a/src/common/zbic_compression.cpp b/src/common/zbic_compression.cpp new file mode 100644 index 0000000000..5e0e4d947b --- /dev/null +++ b/src/common/zbic_compression.cpp @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include + +#include "common/zbic_compression.h" + +#define ZSTD_ZBIC_SUPPORT 1 +#define ZSTDLIB_VISIBLE static +#define ZSTDLIB_HIDDEN static +#define ZSTDERRORLIB_VISIBLE static +#define ZSTDERRORLIB_HIDDEN static +#undef ZSTD_MULTITHREAD + +#if defined(__ANDROID__) +#undef _GNU_SOURCE +#endif + +#include "zstd.h" +#define g_ZSTD_threading_useless_symbol g_ZSTD_zbic_threading_useless_symbol +#include "zstd.c" +#undef g_ZSTD_threading_useless_symbol + +namespace Common::Compression { + +bool IsZBIC(std::span src) { + if (src.size() < sizeof(u32)) { + return false; + } + u32 magic = 0; + std::memcpy(&magic, src.data(), sizeof(u32)); + return magic == ZSTD_MAGICNUMBER; // 0x4349425A ("ZBIC") +} + +int DecompressDataZBIC(std::span dst, std::span src) { + if (dst.empty() || src.empty()) { + return -1; + } + const size_t res = ZSTD_decompress(dst.data(), dst.size(), src.data(), src.size()); + if (ZSTD_isError(res)) { + return -1; + } + return static_cast(res); +} + +} // namespace Common::Compression diff --git a/src/common/zbic_compression.h b/src/common/zbic_compression.h new file mode 100644 index 0000000000..c36a559388 --- /dev/null +++ b/src/common/zbic_compression.h @@ -0,0 +1,15 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include "common/common_types.h" + +namespace Common::Compression { + +[[nodiscard]] bool IsZBIC(std::span src); + +[[nodiscard]] int DecompressDataZBIC(std::span dst, std::span src); + +} // namespace Common::Compression diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index 0a3dc5885b..ea1d1c9ecd 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp @@ -7,12 +7,14 @@ #include #include #include +#include #include #include "common/common_funcs.h" #include "common/hex_util.h" #include "common/logging.h" #include "common/lz4_compression.h" +#include "common/zbic_compression.h" #include "common/settings.h" #include "common/swap.h" #include "core/core.h" @@ -104,11 +106,36 @@ std::optional AppLoader_NSO::LoadModule(Kernel::KProcess& process, Core:: for (std::size_t i = 0; i < nso_header.segments.size(); ++i) { nso_file.Read(compressed_data.data(), nso_header.segments_compressed_size[i], nso_header.segments[i].offset); if (nso_header.IsSegmentCompressed(i)) { - int r = Common::Compression::DecompressDataLZ4(decompressed_size.data(), nso_header.segments[i].size, compressed_data.data(), nso_header.segments_compressed_size[i]); - ASSERT(r == int(nso_header.segments[i].size)); - std::memcpy(codeset.memory.data() + module_start + nso_header.segments[i].location, decompressed_size.data(), nso_header.segments[i].size); + if (nso_header.IsZBICCompressed()) { + // ZBIC compression + const int r = Common::Compression::DecompressDataZBIC( + std::span{decompressed_size}.first(nso_header.segments[i].size), + std::span{compressed_data}.first(nso_header.segments_compressed_size[i]) + ); + ASSERT(r > 0); + } else { + // LZ4 compression + int r = Common::Compression::DecompressDataLZ4( + decompressed_size.data(), + nso_header.segments[i].size, + compressed_data.data(), + nso_header.segments_compressed_size[i] + ); + ASSERT(r == int(nso_header.segments[i].size)); + } + + std::memcpy( + codeset.memory.data() + module_start + nso_header.segments[i].location, + decompressed_size.data(), + nso_header.segments[i].size + ); } else { - std::memcpy(codeset.memory.data() + module_start + nso_header.segments[i].location, compressed_data.data(), nso_header.segments[i].size); + // Not compressed + std::memcpy( + codeset.memory.data() + module_start + nso_header.segments[i].location, + compressed_data.data(), + nso_header.segments[i].size + ); } codeset.segments[i].addr = module_start + nso_header.segments[i].location; codeset.segments[i].offset = module_start + nso_header.segments[i].location; diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h index 6356697e33..4a373edd07 100644 --- a/src/core/loader/nso.h +++ b/src/core/loader/nso.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -58,6 +61,9 @@ struct NSOHeader { std::array segment_hashes; bool IsSegmentCompressed(size_t segment_num) const; + bool IsZBICCompressed() const { + return ((flags >> 7) & 1) != 0; + } }; static_assert(sizeof(NSOHeader) == 0x100, "NSOHeader has incorrect size."); static_assert(std::is_trivially_copyable_v, "NSOHeader must be trivially copyable."); From a82f31a310c5dc7cae50c47b3306510a24cc36a6 Mon Sep 17 00:00:00 2001 From: xbzk Date: Wed, 30 Sep 2026 00:57:23 +0200 Subject: [PATCH 088/128] [settings,qt] merge of "disable controller applet" toggle with "controller applet mode" picker (#4498) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Small good simplification to nuke a toggle which costed me almost an entire day of work when fixing controller applet issues: There were two settings related to Controller applet: -"disable controller applet", which is a boolean toggle; -"controller configuration" applet mode, which is a "Real"/"Custom" picker; All i did was to nuke the toggle and add a third option "Disabled" to the picker. Users which used the disable toggle will have to pick Disabled; Real/Custom settings wont be affected since their indexes remains. All options tested against diablo 3. All working as intended. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4498 Reviewed-by: lizzie Reviewed-by: MaranBr --- src/common/settings_enums.h | 2 +- src/qt_common/config/shared_translation.cpp | 4 +--- src/qt_common/config/uisettings.h | 2 -- src/yuzu/configuration/configure_applets.h | 4 +++- src/yuzu/configuration/shared_widget.cpp | 12 ++++++++---- src/yuzu/main_window.cpp | 2 +- 6 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/common/settings_enums.h b/src/common/settings_enums.h index 55acb0ae8c..eaf3ec541d 100644 --- a/src/common/settings_enums.h +++ b/src/common/settings_enums.h @@ -150,7 +150,7 @@ ENUM(ScalingFilter, NearestNeighbor, Bilinear, Bicubic, Gaussian, Lanczos, Scale ENUM(AntiAliasing, None, Fxaa, Smaa); ENUM(AspectRatio, R16_9, R4_3, R21_9, R16_10, Stretch); ENUM(ConsoleMode, Handheld, Docked); -ENUM(AppletMode, HLE, LLE); +ENUM(AppletMode, HLE, LLE, Disabled); ENUM(SpirvOptimizeMode, Never, OnLoad, Always); ENUM(GpuClock, Normal, Boost, Overclock) ENUM(GpuUnswizzleSize, VerySmall, Small, Normal, Large, VeryLarge) diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index d61c84e278..29fbd32de5 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -342,9 +342,6 @@ std::unique_ptr InitializeTranslations(QObject* parent) { "it bypasses such prompts and directly exits the emulation.")); INSERT(UISettings, hide_mouse, tr("Hide mouse on 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"), tr("Whether or not to check for updates upon startup.")); @@ -380,6 +377,7 @@ std::unique_ptr ComboboxEnumeration(QObject* parent) { { PAIR(AppletMode, HLE, tr("Custom frontend")), PAIR(AppletMode, LLE, tr("Real applet")), + PAIR(AppletMode, Disabled, tr("Disabled")), }}); translations->insert({Settings::EnumMetadata::Index(), diff --git a/src/qt_common/config/uisettings.h b/src/qt_common/config/uisettings.h index 794d1a029b..a790cfcc22 100644 --- a/src/qt_common/config/uisettings.h +++ b/src/qt_common/config/uisettings.h @@ -127,8 +127,6 @@ struct Values { Setting hide_mouse{ linkage, true, "hideInactiveMouse", Category::UiGeneral, Settings::Specialization::Default, true, true}; - Setting controller_applet_disabled{linkage, false, "disableControllerApplet", - Category::UiGeneral}; // Set when Vulkan is known to crash the application bool has_broken_vulkan = false; diff --git a/src/yuzu/configuration/configure_applets.h b/src/yuzu/configuration/configure_applets.h index 54f494d2f1..b794b49e0b 100644 --- a/src/yuzu/configuration/configure_applets.h +++ b/src/yuzu/configuration/configure_applets.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 @@ -8,7 +11,6 @@ class QCheckBox; class QLineEdit; -class QComboBox; class QDateTimeEdit; namespace Core { class System; diff --git a/src/yuzu/configuration/shared_widget.cpp b/src/yuzu/configuration/shared_widget.cpp index 0f59ee23a6..5e8e04be58 100644 --- a/src/yuzu/configuration/shared_widget.cpp +++ b/src/yuzu/configuration/shared_widget.cpp @@ -140,7 +140,12 @@ QWidget* Widget::CreateCombobox(std::function& serializer, if (combobox_enumerations.contains(type)) { enumeration = &combobox_enumerations.at(type); for (const auto& [id, name] : *enumeration) { - combobox->addItem(name); + if (type == Settings::EnumMetadata::Index() && + id == static_cast(Settings::AppletMode::Disabled) && + setting.Id() != Settings::values.controller_applet_mode.Id()) { + continue; + } + combobox->addItem(name, id); } } else { return combobox; @@ -158,9 +163,8 @@ QWidget* Widget::CreateCombobox(std::function& serializer, const u32 setting_value = std::strtoul(setting.ToString().c_str(), nullptr, 0); combobox->setCurrentIndex(find_index(setting_value)); - serializer = [this, enumeration]() { - int current = combobox->currentIndex(); - return std::to_string(enumeration->at(current).first); + serializer = [this]() { + return std::to_string(combobox->currentData().toUInt()); }; restore_func = [this, find_index]() { diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index e2807e80ff..60bfbae5cd 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -1786,7 +1786,7 @@ bool MainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPar QtCommon::system->SetFrontendAppletSet({ std::make_unique(*this), // Amiibo Settings - (UISettings::values.controller_applet_disabled.GetValue() == true) + (Settings::values.controller_applet_mode.GetValue() == Settings::AppletMode::Disabled) ? nullptr : std::make_unique(*this), // Controller Selector std::make_unique(*this), // Error Display From 3f78512c83fca84a36bb450a10043b368830f8b0 Mon Sep 17 00:00:00 2001 From: xbzk Date: Wed, 30 Sep 2026 00:58:29 +0200 Subject: [PATCH 089/128] [ro] add TLS patching for runtime NROs (#4492) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Aimed to fix Biomutant which stucks in a bootloop due to guest being unable to reach correct thread local storage (TLS) This fixes runtime NRO loading by properly patching the guest TLS (TPIDR_EL0) path. Steps: -Read the loaded NRO image into a temporary buffer. -Run the NCE patcher on it. -Produce a patch section / relocated code. -Map that patch section as executable memory in the target process. Game still has intermittent visual issues which can be solved with GPU level accurate, but that causes a huge performance drop in exchange. Someone else will resume this one. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4492 Reviewed-by: CamilleLaVey Reviewed-by: lizzie --- src/core/hle/service/ro/ro.cpp | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/core/hle/service/ro/ro.cpp b/src/core/hle/service/ro/ro.cpp index 13de9f96c8..b847811fe5 100644 --- a/src/core/hle/service/ro/ro.cpp +++ b/src/core/hle/service/ro/ro.cpp @@ -16,6 +16,10 @@ #include "core/hle/service/ro/ro_types.h" #include "core/hle/service/server_manager.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 { @@ -386,7 +390,7 @@ public: R_SUCCEED(); } - Result MapManualLoadModuleMemory(u64* out_address, size_t context_id, u64 nro_address, + Result MapManualLoadModuleMemory(Kernel::KernelCore& kernel, u64* out_address, size_t context_id, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) { // Get context. ProcessContext* context = this->GetContextById(context_id); @@ -421,7 +425,31 @@ public: R_TRY(context->ValidateNro(std::addressof(nro_info->module_id), std::addressof(rx_size), std::addressof(ro_size), std::addressof(rw_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 image(total_size); + memory.ReadBlock(nro_info->base_address, image.data(), rx_size); + + Kernel::CodeSet::Segment code{.size = static_cast(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. R_TRY(SetNroPerms(context->GetProcess(), nro_info->base_address, rx_size, ro_size, rw_size + bss_size)); @@ -531,7 +559,7 @@ public: Result MapManualLoadModuleMemory(Out out_load_address, ClientProcessId client_pid, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) { R_TRY(m_ro->ValidateProcess(m_context_id, *client_pid)); - R_RETURN(m_ro->MapManualLoadModuleMemory(out_load_address.Get(), m_context_id, nro_address, + R_RETURN(m_ro->MapManualLoadModuleMemory(system.Kernel(), out_load_address.Get(), m_context_id, nro_address, nro_size, bss_address, bss_size)); } From f8b76511041bb54070c52d1d09ea07d8108c592a Mon Sep 17 00:00:00 2001 From: Eden CI Date: Wed, 30 Sep 2026 02:00:44 +0200 Subject: [PATCH 090/128] [dist, android] Update translations from Transifex for Sep 28 (#4494) Automatic translation update for Sep 28 Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4494 Reviewed-by: MaranBr --- dist/languages/ar.ts | 928 ++++++++++++++++++++-------------------- dist/languages/ca.ts | 895 +++++++++++++++++++------------------- dist/languages/cs.ts | 895 +++++++++++++++++++------------------- dist/languages/da.ts | 895 +++++++++++++++++++------------------- dist/languages/de.ts | 903 +++++++++++++++++++------------------- dist/languages/el.ts | 895 +++++++++++++++++++------------------- dist/languages/es.ts | 895 +++++++++++++++++++------------------- dist/languages/fi.ts | 895 +++++++++++++++++++------------------- dist/languages/fr.ts | 895 +++++++++++++++++++------------------- dist/languages/hu.ts | 895 +++++++++++++++++++------------------- dist/languages/id.ts | 895 +++++++++++++++++++------------------- dist/languages/it.ts | 895 +++++++++++++++++++------------------- dist/languages/ja_JP.ts | 895 +++++++++++++++++++------------------- dist/languages/ko_KR.ts | 903 +++++++++++++++++++------------------- dist/languages/nb.ts | 895 +++++++++++++++++++------------------- dist/languages/nl.ts | 895 +++++++++++++++++++------------------- dist/languages/pl.ts | 895 +++++++++++++++++++------------------- dist/languages/pt_BR.ts | 895 +++++++++++++++++++------------------- dist/languages/pt_PT.ts | 895 +++++++++++++++++++------------------- dist/languages/ru_RU.ts | 903 +++++++++++++++++++------------------- dist/languages/sv.ts | 903 +++++++++++++++++++------------------- dist/languages/tr_TR.ts | 895 +++++++++++++++++++------------------- dist/languages/uk.ts | 895 +++++++++++++++++++------------------- dist/languages/vi.ts | 895 +++++++++++++++++++------------------- dist/languages/vi_VN.ts | 895 +++++++++++++++++++------------------- dist/languages/zh_CN.ts | 903 +++++++++++++++++++------------------- dist/languages/zh_TW.ts | 895 +++++++++++++++++++------------------- 27 files changed, 11874 insertions(+), 12364 deletions(-) diff --git a/dist/languages/ar.ts b/dist/languages/ar.ts index bb259d2870..9a735c85be 100644 --- a/dist/languages/ar.ts +++ b/dist/languages/ar.ts @@ -564,7 +564,7 @@ Options lower than 1X can cause artifacts. Window Adapting Filter: - :مرشح تكييف النافذة + :مرشح التكيف مع النافذة @@ -617,7 +617,7 @@ Exclusive fullscreen may offer better performance and better Freesync/Gsync supp Aspect Ratio: - :نسبة العرض إلى الارتفاع + :نسبة الأبعاد @@ -779,7 +779,7 @@ Unreal Engine 4 games often see the most significant changes thereof. Anisotropic Filtering: - الترشيح المتباين الخواص: + :الترشيح متباين الخواص @@ -791,7 +791,7 @@ Safe to set at 16x on most GPUs. GPU Mode: - وضع وحدة معالجة الرسومات: + :وضع وحدة معالجة الرسومات @@ -827,66 +827,52 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. - يتحكم في سلوك تزامن حاجز وحدة معالجة الرسوميات. -الخيار الفوري هو الأسرع، لكنه قد يسبب بعض المشاكل. -الوضع المتوازن يوفر توافقًا أفضل وقد يحل بعض المشاكل في بعض الألعاب. -الدقة تحسّن التوافق أكثر مقابل بعض الأداء. -الوضع الصارم هو الخيار الأبطأ، لكنه يمكن أن يصلح المشاكل التي تتطلب مزامنة أكثر صرامة. -الإعداد الافتراضي يتبع إعداد دقة وحدة معالجة الرسومات. +Default follows the GPU Mode setting. + يتحكم في سلوك مزامنة حاجز وحدة معالجة الرسومات. +يُعد الخيار فوري الأسرع، لكنه قد يتسبب في بعض المشكلات. +يوفر الخيار متوازن توافقًا أفضل وقد يعمل على حل المشكلات في بعض الألعاب. +يعمل الخيار دقيق على تحسين التوافق بشكل أكبر على حساب بعض الأداء. +يتبع الخيار افتراضي إعداد وضع وحدة معالجة الرسومات. - Enable GPU buffer readback - تفعيل قراءة مخزن وحدة معالجة الرسومات - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - يحافظ على البيانات المعدلة بواسطة وحدة معالجة الرسومات عن طريق قراءتها قبل رفعها. -بعض الألعاب تحتاج هذا لعرض تأثيرات معينة بشكل صحيح. - - - Enable asynchronous shader compilation تفعيل تجميع التظليل غير المتزامن - + May reduce shader stutter. قد يقلل من تقطع التظليل. - + GPU Clocks سرعات وحدة معالجة الرسومات - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. يجعل اللعبة تعتقد أن عمل وحدة معالجة الرسومات ينتهي بشكل أسرع مما هو عليه في الواقع، لذلك تتوقف عن خفض الدقة ومسافة العرض لتتناسب مع سرعات جهاز Switch. - + GPU Unswizzle إلغاء ترتيب بيانات وحدة معالجة الرسومات - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. باستخدام حوسبة وحدة معالجة الرسومات BCn 3D يسرع فك تشفير نسيج. قم بتعطيله في حالة حدوث أعطال أو مشاكل في الرسومات. - + GPU Unswizzle Max Texture Size الحد الأقصى لحجم النسيج في وحدة معالجة الرسومات بعد إعادة ترتيب البيانات - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -895,48 +881,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size حجم تدفق إلغاء ترتيب بيانات وحدة معالجة الرسومات - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. يحدد الحد الأقصى لكمية بيانات النسيج (بالميغابايت) التي تتم معالجتها لكل إطار. يمكن أن تقلل القيم الأعلى من التقطع أثناء تحميل النسيج، ولكنها قد تؤثر على اتساق الإطارات. - + GPU Unswizzle Chunk Size حجم كتلة إلغاء ترتيب بيانات وحدة معالجة الرسومات - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. يُحدد هذا الخيار عدد شرائح العمق التي تتم معالجتها في عملية إرسال واحدة. زيادة هذا الخيار قد تُحسّن الإنتاجية على وحدات معالجة الرسومات المتطورة، ولكنها قد تُسبب أخطاء في إعادة تعيين وقت الاستجابة أو انقطاع الاتصال ببرنامج التشغيل على الأجهزة ذات المواصفات الأقل. - + Use Vulkan pipeline cache Vulkan استخدام ذاكرة التخزين المؤقتة لخط أنابيب - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. يُفعّل ذاكرة التخزين المؤقت لخطوط الأنابيب الخاصة ببائع وحدة معالجة الرسومات. بتخزين ملفات ذاكرة التخزين المؤقتة للخطوط الداخلية Vulkan يمكن أن يؤدي هذا الخيار إلى تحسين وقت تحميل التظليل بشكل كبير في الحالات التي لا يقوم فيها برنامج تشغيل. - + Enable Compute Pipelines (Intel Vulkan Only) (Intel Vulkan فقط) تمكين خطوط أنابيب الحوسبة - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -945,192 +931,192 @@ Compute pipelines are always enabled on all other drivers. خطوط أنابيب الحوسبة مفعلة دائمًا على جميع برامج التشغيل الأخرى. - + Enable Reactive Flushing تمكين التنظيف التفاعلي - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. يستخدم التنظيف التفاعلي بدلاً من التنظيف التنبئي، مما يسمح بمزامنة الذاكرة بشكل أكثر دقة. - + Sync to framerate of video playback المزامنة مع معدل الإطارات لتشغيل الفيديو - + Run the game at normal speed during video playback, even when the framerate is unlocked. قم بتشغيل اللعبة بالسرعة العادية أثناء تشغيل الفيديو، حتى عندما يكون معدل الإطارات مفتوحًا. - + Barrier feedback loops حلقات التغذية الراجعة للحواجز - + Improves rendering of transparency effects in specific games. يحسن عرض تأثيرات الشفافية في بعض الألعاب المحددة. - + Enable buffer history تمكين سجل التخزين المؤقت - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. يُتيح هذا الخيار الوصول إلى حالات التخزين المؤقت السابقة. وقد يُحسّن جودة العرض وثبات الأداء في بعض الألعاب. - + Fix bloom effects إصلاح تأثيرات التوهج - + Removes bloom in Burnout. يزيل التوهج في وضع الاحتراق. - + Enable Legacy Rescale Pass تفعيل ميزة إعادة التحجيم القديمة - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. قد يصلح مشاكل إعادة القياس في بعض الألعاب بالاعتماد على سلوك من التنفيذ السابق. حل لسلوك قديم يصلح تشوهات الخطوط على بطاقات AMD وIntel الرسومية، ووميض النسيج الرمادي على بطاقات Nvidia الرسومية في لعبة Luigi's Mansion 3. - + Extended Dynamic State الحالة الديناميكية الموسعة - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. يتحكم في عدد الميزات التي يمكن استخدامها في الحالة الديناميكية الموسعة.تسمح الحالات الأعلى بمزيد من الميزات ويمكن أن تزيد من الأداء، ولكنها قد تسبب مشكلات رسومية إضافية. - + Vertex Input Dynamic State حالة ديناميكية لإدخال الرأس - + Enables vertex input dynamic state feature for better quality and performance. يتيح ميزة الحالة الديناميكية لإدخال الرأس لتحسين الجودة والأداء. - + Sample Shading تظليل العينة - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. يسمح لمظلل الأجزاء بالتنفيذ لكل عينة في جزء متعدد العينات بدلاً من مرة واحدة لكل جزء. يحسن جودة الرسومات على حساب الأداء. القيم الأعلى تحسن الجودة ولكنها تقلل من الأداء. - + RNG Seed مولد الأرقام العشوائية - + Controls the seed of the random number generator. Mainly used for speedrunning. يتحكم في بذرة مولد الأرقام العشوائية. يُستخدم بشكل رئيسي في سباقات السرعة. - + Device Name اسم الجهاز - + The name of the console. اسم وحدة التحكم. - + Homebrew Args Homebrew وسائط - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). (noglsl -مثل) عند التشغيل Homebrew سطر الأوامر الوسائط المُمررة إلى - + Custom RTC Date: :تاريخ التوقيت الحقيقي المخصص - + This option allows to change the clock of the console. Can be used to manipulate time in games. يتيح لك هذا الخيار تغيير ساعة وحدة التحكم. يمكن استخدامه للتحكم بالوقت في الألعاب. - + The number of seconds from the current unix time عدد الثواني من وقت يونكس الحالي - + Language: :اللغة - + This option can be overridden when region setting is auto-select يمكن تجاوز هذا الخيار عند تحديد إعداد المنطقة تلقائيًا - + Region: :المنطقة - + The region of the console. منطقة وحدة التحكم. - + Time Zone: :المنطقة الزمنية - + The time zone of the console. المنطقة الزمنية لوحدة التحكم. - + Sound Output Mode: :وضع إخراج الصوت - + Console Mode: :وضع وحدة التحكم - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1139,1042 +1125,1037 @@ Setting to Handheld can help improve performance for low end systems. يُمكن أن يُساعد الضبط على الوضع المحمول على تحسين أداء الأجهزة منخفضة المواصفات. - + Prompt for user profile on boot المطالبة بملف تعريف المستخدم عند التشغيل - + Useful if multiple people use the same PC. مفيد إذا كان هناك عدة أشخاص يستخدمون نفس الكمبيوتر. - + Pause when not in focus توقف عند عدم التركيز - + Pauses emulation when focusing on other windows. يوقف المحاكاة عند التركيز على نوافذ أخرى. - + Confirm before stopping emulation تأكيد قبل إيقاف المحاكاة - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. يتجاوز المطالبات التي تطلب تأكيد إيقاف المحاكاة. يؤدي تمكينه إلى تجاوز هذه المطالبات والخروج مباشرة من المحاكاة. - + Hide mouse on inactivity إخفاء الماوس عند عدم النشاط - + Hides the mouse after 2.5s of inactivity. يخفي الماوس بعد 2.5 ثانية من عدم النشاط. - + Disable controller applet تعطيل تطبيق التحكم - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. يُعطّل استخدام أداة التحكم في البرامج المُحاكاة قسرًا. عند محاولة أي برنامج فتح أداة التحكم، تُغلق فورًا. - + Check for updates التحقق من توفر التحديثات - + Whether or not to check for updates upon startup. ما إذا كان يجب التحقق من التحديثات عند بدء التشغيل أم لا. - + Enable Gamemode تمكين وضع اللعبة - + Force X11 as Graphics Backend كخلفية رسومات X11 فرض - + Custom frontend الواجهة الأمامية المخصصة - + Real applet تطبيق صغير حقيقي - + Never أبداً - + On Load عند التحميل - + Always دائماً - + CPU وحدة المعالجة المركزية - + GPU وحدة معالجة الرسومات - + CPU Asynchronous وحدة المعالجة المركزية غير المتزامنة - + Uncompressed (Best quality) Uncompressed (أفضل جودة) - + BC1 (Low quality) BC1 (جودة منخفضة) - + BC3 (Medium quality) BC3 (جودة متوسطة) - - + + Auto تلقائي - + 30 FPS 30 إطارًا في الثانية - + 60 FPS 60 إطارًا في الثانية - + 90 FPS 90 إطارًا في الثانية - + 120 FPS 120 إطارًا في الثانية - + Conservative محافظ - + Aggressive عدواني - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null لا شيء - + Fast سريع - - - + + + Accurate دقه - - - + + + Default افتراضي - + Unsafe (fast) غير آمن (سريع) - + Safe (stable) آمن (مستقر) - + Immediate فوري - + Balanced متوازن - - Strict - صارم - - - + Unsafe غير آمن - + Paranoid (disables most optimizations) جنون العظمة (يعطل معظم التحسينات) - + Debugging تصحيح الأخطاء - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed نافذة بلا حدود - + Exclusive Fullscreen شاشة كاملة حصرية - + No Video Output لا يوجد إخراج فيديو - + CPU Video Decoding فك تشفير فيديو وحدة المعالجة المركزية - + GPU Video Decoding (Default) فك تشفير فيديو وحدة معالجة الرسومات (افتراضي) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [تجريبي] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [تجريبي] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [تجريبي] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [تجريبي] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [تجريبي] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution دقة فائقة للألعاب من سنابدراغون - + Snapdragon Game Super Resolution EdgeDir دقة فائقة للألعاب من سنابدراغون EdgeDir - + None لا شيء - + FXAA FXAA - + SMAA SMAA - + Default (16:9) (16:9) افتراضي - + Force 4:3 4:3 فرض - + Force 21:9 21:9 فرض - + Force 16:10 16:10 فرض - + Stretch to Window تمديد إلى النافذة - + Automatic تلقائي - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) اليابانية (日本語) - + American English الإنجليزية الأمريكية - + French (français) الفرنسية (français) - + German (Deutsch) الألمانية (Deutsch) - + Italian (italiano) الإيطالية (Italiano) - + Spanish (español) الإسبانية (español) - + Chinese الصينية - + Korean (한국어) الكورية (한국어) - + Dutch (Nederlands) الهولندية (Nederlands) - + Portuguese (português) البرتغالية (Português) - + Russian (Русский) الروسية (Русский) - + Taiwanese تايواني - + British English الإنجليزية البريطانية - + Canadian French الكندية الفرنسية - + Latin American Spanish أمريكا اللاتينية الإسبانية - + Simplified Chinese الصينية المبسطة - + Traditional Chinese (正體中文) الصينية التقليدية (正體中文) - + Brazilian Portuguese (português do Brasil) البرتغالية البرازيلية (português do Brasil) - + Polish (polska) البولندية (polska) - + Thai (แบบไทย) التايلاندية (แบบไทย) - - + + Japan اليابان - + USA الولايات المتحدة الأمريكية - + Europe أوروبا - + Australia أستراليا - + China الصين - + Korea كوريا - + Taiwan تايوان - + Auto (%1) Auto select time zone تلقائي (%1) - + Default (%1) Default time zone افتراضي (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba كوبا - + EET EET - + Egypt مصر - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT توقيت غرينتش - + GMT+0 توقيت غرينتش +0 - + GMT-0 -0 توقيت غرينتش - + GMT0 0 توقيت غرينتش - + Greenwich غرينتش - + Hongkong هونغ كونغ - + HST HST - + Iceland أيسلندا - + Iran إيران - + Israel إسرائيل - + Jamaica جامايكا - + Kwajalein Kwajalein - + Libya ليبيا - + MET توقيت وسط أوروبا - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland بولندا - + Portugal البرتغال - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore سنغافورة - + Turkey تركيا - + UCT UCT - + Universal عالمي - + UTC UTC - + W-SU W-SU - + WET توقيت غرب أوروبا - + Zulu Zulu - + Mono أحادي - + Stereo مجسم - + Surround محيطي - + 4GB DRAM (Default) 4GB DRAM (افتراضي) - + 6GB DRAM (Unsafe) 6GB DRAM (غير آمنة) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (غير آمنة) - + 12GB DRAM (Unsafe) 12GB DRAM (غير آمنة) - + Docked الإرساء - + Handheld محمول - - + + Normal قياسي - - + + Boost تعزيز - - + + Overclock كسر السرعة - + Always ask (Default) اسأل دائمًا (افتراضي) - + Only if game specifies not to stop فقط إذا حددت اللعبة عدم التوقف - + Never ask لا تسأل أبدا - + Very Small (16 MB) صغير جدًا (16 ميغابايت) - + Small (32 MB) صغير (32 ميغابايت) - + Normal (128 MB) قياسي (128 ميغابايت) - + Large (256 MB) كبير (256 ميغابايت) - + Very Large (512 MB) كبير جدًا (512 ميغابايت) - + Very Low (4 MB) منخفض جدًا (4 ميغابايت) - + Low (8 MB) منخفض (8 ميغابايت) - + Normal (16 MB) قياسي (16 ميغابايت) - + Medium (32 MB) متوسط (32 ميغابايت) - + High (64 MB) عالي (64 ميغابايت) - + Very Low (32) منخفض جدًا (32) - + Low (64) منخفض (64) - + Normal (128) قياسي (128) - + Medium (256) متوسط (256) - + High (512) عالي (512) - + Disabled معطل - + ExtendedDynamicState 1 الحالة الديناميكية الممتدة 1 - + ExtendedDynamicState 2 الحالة الديناميكية الممتدة 2 - + ExtendedDynamicState 3 الحالة الديناميكية الممتدة 3 - + Tree View عرض قائمة - + Grid View عرض شبكة @@ -5008,12 +4989,12 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t Active preset: %1 (modified). Press Reset Values to go back to how it ships. - الإعداد المسبق النشط: 1% (معدّل). اضغط على إعادة تعيين القيم للعودة إلى الإعدادات الافتراضية. + الإعداد المسبق النشط: %1 (معدّل). اضغط على إعادة تعيين القيم للعودة إلى الإعدادات الافتراضية. Active preset: %1 - الإعداد المسبق النشط: 1% + الإعداد المسبق النشط: %1 @@ -7061,7 +7042,7 @@ Debug Message: - + &Pause &إيقاف مؤقت @@ -7212,7 +7193,7 @@ Debug Message: - + &Start &بدء @@ -7223,7 +7204,7 @@ Debug Message: - + R&ecord ت&سجيل @@ -7314,7 +7295,7 @@ Debug Message: - + None لا شيء @@ -7340,405 +7321,406 @@ Debug Message: &عرض دائري - + Small (32x32) صغير (32x32) - + Standard (64x64) قياسي (64x64) - + Large (128x128) كبير (128x128) - + Full Size (256x256) حجم كامل (256x256) - + Broken Vulkan Installation Detected Vulkan تم الكشف عن تلف في تثبيت - + Vulkan initialization failed during boot. أثناء التشغيل Vulkan فشل تهيئة. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping تشغيل لعبة - + Loading Web Applet... جارٍ تحميل تطبيق الويب... - - + + Disable Web Applet تعطيل تطبيق الويب - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) قد يؤدي تعطيل أداة الويب إلى سلوك غير محدد، ويجب استخدامه فقط مع لعبة Super Mario 3D All-Stars. هل أنت متأكد من رغبتك في تعطيل أداة الويب؟ (يمكن إعادة تفعيلها في إعدادات التصحيح.) - + The amount of shaders currently being built كمية التظليلات التي يتم بناؤها حاليًا - + The current selected resolution scaling multiplier. مضاعف قياس الدقة المحددة حالياً. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Switch سرعة المحاكاة الحالية. تشير القيم الأعلى أو الأقل من 100٪ إلى أن المحاكاة تعمل بشكل أسرع أو أبطأ من. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. عدد الإطارات في الثانية التي تعرضها اللعبة حاليًا. يختلف هذا العدد من لعبة إلى أخرى ومن مشهد إلى آخر. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. الوقت المستغرق لمحاكاة إطار على جهاز سويتش، بدون احتساب تحديد الإطارات أو المزامنة العمودية. لمحاكاة بسرعة كاملة، يجب أن يكون هذا في حدود 16.67 مللي ثانية كحد أقصى. - + Unmute إلغاء كتم الصوت - + Mute كتم الصوت - + Reset Volume إعادة تعيين مستوى الصوت - + Configure Effects... إعداد التأثيرات... - + &Clear Recent Files &مسح الملفات الحديثة - + &Continue &متابعة - + Warning: Outdated Game Format تحذير: تنسيق اللعبة قديم - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. أنت تستخدم تنسيق مجلد ROM المُفكك لهذه اللعبة، وهو تنسيق قديم استُبدل بآخر مثل NCA وNAX وXCI وNSP. تفتقر مجلدات ROM المُفككة إلى الأيقونات والبيانات الوصفية ودعم التحديثات. <br>لتوضيح تنسيقات Switch المختلفة التي يدعمها Eden، يُرجى مراجعة دليل المستخدم. لن تظهر هذه الرسالة مرة أخرى. - - + + Error while loading ROM! ROM خطأ أثناء تحميل - + The ROM format is not supported. غير مدعوم ROM تنسيق. - + An error occurred initializing the video core. حدث خطأ أثناء تهيئة نواة الفيديو. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - عادةً ما يحدث هذا بسبب برامج تشغيل بطاقة الرسوميات GPU القديمة. يرجى الاطلاع على ملف السجل لمزيد من التفاصيل. انظر: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'> كيفية الوصول إلى ملفات السجل</a>. + عادةً ما يحدث هذا بسبب برامج تشغيل وحدة معالجة الرسومات القديمة. يرجى الاطلاع على السجل لمزيد من التفاصيل. انظر: +<a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>كيفية الوصول إلى ملفات السجلات</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. حدث خطأ أثناء تحميل ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Discord/Stoat يرجى إعادة تحميل ملفاتك أو طلب المساعدة على - + An unknown error occurred. Please see the log for more details. حدث خطأ غير معروف. يرجى الاطلاع على السجل لمزيد من التفاصيل. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... جارٍ إغلاق البرنامج... - + Save Data بيانات الحفظ - + Mod Data بيانات التعديل - + Error Opening %1 Folder خطأ في فتح المجلد %1 - - + + Folder does not exist! المجلد غير موجود! - + Remove Installed Game Contents? إزالة محتويات اللعبة المثبتة؟ - + Remove Installed Game Update? إزالة تحديث اللعبة المثبت؟ - + Remove Installed Game DLC? إزالة المحتوى القابل للتنزيل المثبت للعبة؟ - + Remove Entry إزالة الإدخال - + Delete OpenGL Transferable Shader Cache? OpenGL Shader حذف ذاكرة التخزين المؤقتة القابلة للنقل لـ - + Delete Vulkan Transferable Shader Cache? Vulkan Shader حذف ذاكرة التخزين المؤقتة القابلة للنقل لـ - + Delete All Transferable Shader Caches? حذف جميع مخازن ذاكرة التظليل القابلة للنقل؟ - + Remove Custom Game Configuration? إزالة إعدادات اللعبة المخصص؟ - + Remove Cache Storage? إزالة ذاكرة التخزين المؤقتة؟ - + Remove File إزالة الملف - + Remove Play Time Data إزالة بيانات زمن اللعب - + Reset play time? إعادة تعيين زمن اللعب؟ - - + + RomFS Extraction Failed! RomFS فشل استخراج - + There was an error copying the RomFS files or the user cancelled the operation. أو قام المستخدم بإلغاء العملية RomFS حدث خطأ أثناء نسخ ملفات - + Full كامل - + Skeleton Skeleton - + Select RomFS Dump Mode RomFS حدد وضع تفريغ - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. الرجاء تحديد الطريقة التي تريد بها تفريغ RomFS. <br>سيتم نسخ جميع الملفات إلى المجلد الجديد في أثناء <br>قيام الهيكل العظمي بإنشاء بنية المجلد فقط. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root لا توجد مساحة فارغة كافية في %1 لاستخراج نظام الملفات RomFS. يُرجى تحرير مساحة أو اختيار مجلد تفريغ آخر من: المحاكاة > التكوين > النظام > نظام الملفات > تفريغ الجذر. - + Extracting RomFS... RomFS استخراج... - - + + Cancel إلغاء - + RomFS Extraction Succeeded! بنجاح RomFS تم استخراج! - + The operation completed successfully. تمت العملية بنجاح. - + Error Opening %1 خطأ في فتح %1 - + Select Directory حدد المجلد - + Properties خصائص - + The game properties could not be loaded. تعذر تحميل خصائص اللعبة. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. تشغيل الملف القابل للتنفيذ (%1)؛؛جميع الملفات (*.*) - + Load File تحميل الملف - + Open Extracted ROM Directory المستخرج ROM فتح ملف - + Invalid Directory Selected تم تحديد مجلد غير صالح - + The directory you have selected does not contain a 'main' file. لا يحتوي المجلد الذي حددته على ملف رئيسي - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files تثبيت الملفات - + %n file(s) remaining %n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية%n ملف (ملفات) متبقية - + Installing file "%1"... تثبيت الملف ”%1“... - - + + Install Results نتائج التثبيت - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. لتجنب أي تعارضات محتملة، ننصح المستخدمين بعدم تثبيت الألعاب الأساسية على الذاكرة الداخلية. يرجى استخدام هذه الميزة فقط لتثبيت التحديثات والمحتوى القابل للتنزيل. - + %n file(s) were newly installed %n تم تثبيت ملف (ملفات) جديدة @@ -7750,7 +7732,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten %n تم استبدال ملف (ملفات) @@ -7762,7 +7744,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install %n فشل تثبيت ملف (ملفات) @@ -7774,324 +7756,324 @@ Please, only use this feature to install updates and DLC. - + System Application تطبيق النظام - + System Archive أرشيف النظام - + System Application Update تحديث تطبيق النظام - + Firmware Package (Type A) حزمة الفيرموير (النوع أ) - + Firmware Package (Type B) حزمة الفيرموير (النوع ب) - + Game لعبة - + Game Update تحديث اللعبة - + Game DLC الخاص باللعبة DLC الـ - + Delta Title Delta عنوان - + Select NCA Install Type... NCA حدد نوع تثبيت... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) يرجى تحديد نوع اللعبة التي ترغب في تثبيت NCA عليها: (في معظم الحالات، يكون الإعداد الافتراضي "لعبة" مناسبًا.) - + Failed to Install فشل التثبيت - + The title type you selected for the NCA is invalid. غير صالح NCA نوع العنوان الذي حددته لـ. - + File not found لم يتم العثور على الملف - + File "%1" not found لم يتم العثور على الملف "%1" - + OK موافق - + Function Disabled الوظيفة معطلة - + Compatibility list reporting is currently disabled. Check back later! تقارير قائمة التوافق معطلة حاليًا. يرجى التحقق لاحقًا! - + Error opening URL خطأ في فتح الرابط - + Unable to open the URL "%1". تعذر فتح الرابط ”%1“ - + TAS Recording TAS تسجيل - + Overwrite file of player 1? الكتابة فوق ملف اللاعب 1؟ - + Invalid config detected تم اكتشاف إعدادات غير صالح - + Handheld controller can't be used on docked mode. Pro controller will be selected. لا يمكن استخدام وحدة التحكم المحمولة في وضع الإرساء. سيتم اختيار وحدة تحكم احترافية. - - + + Amiibo أميبو - - + + The current amiibo has been removed تمت إزالة أميبو الحالي. - + Error خطأ - - + + The current game is not looking for amiibos اللعبة الحالية لا تبحث عن أميبو - + Amiibo File (%1);; All Files (*.*) جميع الملفات (%1)؛؛ ملف أميبو (*.*) - + Load Amiibo تحميل أميبو - + Error loading Amiibo data خطأ أثناء تحميل بيانات أميبو - + The selected file is not a valid amiibo الملف المحدد ليس أميبو صالح - + The selected file is already on use الملف المحدد قيد الاستخدام بالفعل - + An unknown error occurred حدث خطأ غير معروف - + No firmware available لا يوجد فيرموير متوفر - + Firmware Corrupted الفيرموير تالف - + Unknown applet تطبيق غير معروف - + Applet doesn't map to a known value. لا يرتبط التطبيق المصغر بقيمة معروفة. - + Record not found لم يتم العثور على السجل - + Applet not found. Please reinstall firmware. لم يتم العثور على التطبيق المصغر. يرجى إعادة تثبيت الفيرموير. - + Capture Screenshot التقاط لقطة شاشة - + PNG Image (*.png) PNG Image (*.png) - + TAS state: Running %1/%2 حالة TAS: تشغيل %1/%2 - + TAS state: Recording %1 حالة TAS: تسجيل %1 - + TAS state: Idle %1/%2 حالة TAS: خامل %1/%2 - + TAS State: Invalid حالة TAS: غير صالحة - + &Stop Running &إيقاف التشغيل - + Stop R&ecording إيقاف ال&تسجيل - + Building: %n shader(s) بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات)بناء: %n تظليل(ات) - + Scale: %1x %1 is the resolution scaling factor الدقة: %1x - + Speed: %1% / %2% السرعة: %1% / %2% - + Speed: %1% السرعة: %1% - + Game: %1 FPS - اللعبة: %1 FPS + اللعبة: %1 إطاراً في الثانية - + Frame: %1 ms الإطار: %1 ms - + NO AA NO AA - + NO FX NO FX - + FX FX - + VOLUME: MUTE الصوت: كتم الصوت - + VOLUME: %1% Volume percentage (e.g. 50%) %1% :الصوت - + Derivation Components Missing مكونات الاشتقاق مفقودة - + Decryption keys are missing. Install them now? مفاتيح فك التشفير مفقودة. هل تريد تثبيتها الآن؟ - + Wayland Detected! Wayland تم الكشف عن - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8102,74 +8084,74 @@ Would you like to force it for future launches? هل ترغب في فرض استخدامه في عمليات التشغيل المستقبلية؟ - + Use X11 X11 استخدم - + Continue with Wayland Wayland متابعة مع - + Don't show again لا تعرض مرة أخرى - + Restart Required إعادة التشغيل مطلوبة - + Restart Eden to apply the X11 backend. X11 أعد تشغيل إيدن لتطبيق الخلفية - + Slow بطيء - + Turbo تيربو - + Unlocked إلغاء القفل - + Select RomFS Dump Target RomFS حدد هدف تفريغ - + Please select which RomFS you would like to dump. الذي تريد تفريغه RomFS الرجاء تحديد - + Are you sure you want to close Eden? هل أنت متأكد من أنك تريد إغلاق إيدن؟ - - - + + + Eden إيدن - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. هل أنت متأكد من أنك تريد إيقاف المحاكاة؟ سيتم فقدان أي تقدم لم يتم حفظه. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? @@ -8688,7 +8670,7 @@ p, li { white-space: pre-wrap; } FPS - معدل الإطارات في الثانية + إطار في الثانية @@ -8698,7 +8680,7 @@ p, li { white-space: pre-wrap; } %1 fps - %1 معدل الإطارات في الثانية + %1 إطار في الثانية diff --git a/dist/languages/ca.ts b/dist/languages/ca.ts index df14f1d565..01653df505 100644 --- a/dist/languages/ca.ts +++ b/dist/languages/ca.ts @@ -784,1332 +784,1315 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Llavor de GNA - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Nom del dispositiu - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Idioma: - + This option can be overridden when region setting is auto-select - + Region: Regió: - + The region of the console. - + Time Zone: Zona horària: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: Mode de la consola - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ocultar el cursor del ratolí en cas d'inactivitat - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Activa el mode joc - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never Mai - + On Load - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservador - + Aggressive Agressiu - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Ensamblat d'ombrejadors, només NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, només AMD/Mesa) - + Null Nul - + Fast Ràpid - - - + + + Accurate Precís - - - + + + Default Valor predeterminat - + Unsafe (fast) Insegur (ràpid) - + Safe (stable) Segur (estable) - + Immediate - + Balanced Equilibrat - - Strict - - - - + Unsafe Insegur - + Paranoid (disables most optimizations) Paranoic (desactiva la majoria d'optimitzacions) - + Debugging Depuració - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Finestra sense vores - + Exclusive Fullscreen Pantalla completa exclusiva - + No Video Output Sense sortida de vídeo - + CPU Video Decoding Descodificació de vídeo a la CPU - + GPU Video Decoding (Default) Descodificació de vídeo a la GPU (Valor predeterminat) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Veí més proper - + Bilinear Bilineal - + Bicubic Bicúbic - + Gaussian Gaussià - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution Super resolució AMD FidelityFX - + Area Àrea - + MMPX MMPX - + Zero-Tangent Tangència zero - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Cap - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Valor predeterminat (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 - + Stretch to Window Estirar a la finestra - + Automatic Automàtic - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonès (日本語) - + American English Anglès americà - + French (français) Francès (français) - + German (Deutsch) Alemany (Deutsch) - + Italian (italiano) Italià (italiano) - + Spanish (español) Castellà (español) - + Chinese Xinès - + Korean (한국어) Coreà (한국어) - + Dutch (Nederlands) Holandès (Nederlands) - + Portuguese (português) Portuguès (português) - + Russian (Русский) Rus (Русский) - + Taiwanese Taiwanès - + British English Anglès britànic - + Canadian French Francès canadenc - + Latin American Spanish Espanyol llatinoamericà - + Simplified Chinese Xinès simplificat - + Traditional Chinese (正體中文) Xinès tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portuguès brasiler (português do Brasil) - + Polish (polska) Polonès (polska) - + Thai (แบบไทย) Tailandès (แบบไทย) - - + + Japan Japó - + USA EUA - + Europe Europa - + Australia Austràlia - + China Xina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Per defecte (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islàndia - + Iran Iran - + Israel Isreal - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polònia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estèreo - + Surround Envoltant - + 4GB DRAM (Default) 4GB DRAM (Insegur) - + 6GB DRAM (Unsafe) 6GB DRAM (Insegur) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Insegur) - + 12GB DRAM (Unsafe) 12GB DRAM (Insegur) - + Docked Sobretaula - + Handheld Portàtil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop Tan sols si el joc especifica no parar - + Never ask No preguntar mai - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6985,7 +6968,7 @@ Debug Message: - + &Pause &Pausar @@ -7136,7 +7119,7 @@ Debug Message: - + &Start &Iniciar @@ -7147,7 +7130,7 @@ Debug Message: - + R&ecord E&nregistrar @@ -7238,7 +7221,7 @@ Debug Message: - + None Cap @@ -7264,737 +7247,737 @@ Debug Message: - + Small (32x32) Petit (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Desilenciar - + Mute Silenciar - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full Complet - + Skeleton Esquelet - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel Cancel·lar - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties Propietats - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File Carregar arxiu - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Instal·lar arxius - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game Joc - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK D'acord - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Escala: %1x - + Speed: %1% / %2% Velocitat: %1% / %2% - + Speed: %1% Velocitat: %1% - + Game: %1 FPS Joc: %1 FPS - + Frame: %1 ms Fotograma: %1 ms - + NO AA SENSE AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUMEN: %1% - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8002,74 +7985,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow Lent - + Turbo Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/cs.ts b/dist/languages/cs.ts index 3f2a2cffd9..b4a990d3f4 100644 --- a/dist/languages/cs.ts +++ b/dist/languages/cs.ts @@ -784,1332 +784,1315 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Název Zařízení - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Jazyk: - + This option can be overridden when region setting is auto-select - + Region: Region: - + The region of the console. - + Time Zone: Časové Pásmo: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Potvrzení před zastavením emulace - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Skrýt myš při neaktivitě - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Automatické - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Přesné - - - + + + Default Výchozí - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - - Strict - - - - + Unsafe Nebezpečné - + Paranoid (disables most optimizations) Paranoidní (zakáže většinu optimizací) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Okno bez okrajů - + Exclusive Fullscreen Exkluzivní - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - + Bilinear Bilineární - + Bicubic - + Gaussian - + Lanczos - + ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Žádné - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Výchozí (16:9) - + Force 4:3 Vynutit 4:3 - + Force 21:9 Vynutit 21:9 - + Force 16:10 - + Stretch to Window Roztáhnout podle okna - + Automatic - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonština (日本語) - + American English - + French (français) Francouzština (français) - + German (Deutsch) Nemčina (Deutsch) - + Italian (italiano) Italština (Italiano) - + Spanish (español) Španělština (español) - + Chinese Čínština - + Korean (한국어) Korejština (한국어) - + Dutch (Nederlands) Holandština (Nederlands) - + Portuguese (português) Portugalština (português) - + Russian (Русский) Ruština (Русский) - + Taiwanese Tajwanština - + British English Britská Angličtina - + Canadian French Kanadská Francouzština - + Latin American Spanish Latinsko Americká Španělština - + Simplified Chinese Zjednodušená Čínština - + Traditional Chinese (正體中文) Tradiční Čínština (正體中文) - + Brazilian Portuguese (português do Brasil) Brazilská Portugalština (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonsko - + USA USA - + Europe Evropa - + Australia Austrálie - + China Čína - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Lybie - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polsko - + Portugal Portugalsko - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turecko - + UCT UCT - + Universal Univerzální - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Zadokovaná - + Handheld Příruční - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Vždy se zeptat (Výchozí) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6975,7 +6958,7 @@ Debug Message: - + &Pause &Pauza @@ -7126,7 +7109,7 @@ Debug Message: - + &Start &Start @@ -7137,7 +7120,7 @@ Debug Message: - + R&ecord @@ -7228,7 +7211,7 @@ Debug Message: - + None @@ -7254,737 +7237,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7992,74 +7975,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/da.ts b/dist/languages/da.ts index d4dbe2fa31..a1ad0d6597 100644 --- a/dist/languages/da.ts +++ b/dist/languages/da.ts @@ -786,1332 +786,1315 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG-Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Region - + The region of the console. - + Time Zone: Tidszone - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Skjul mus ved inaktivitet - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Automatisk - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Nøjagtig - - - + + + Default Standard - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - - Strict - - - - + Unsafe Usikker - + Paranoid (disables most optimizations) Paranoid (deaktiverer de fleste optimeringer) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Uindrammet Vindue - + Exclusive Fullscreen Eksklusiv Fuld Skærm - + No Video Output Ingen Video-Output - + CPU Video Decoding CPU-Video Afkodning - + GPU Video Decoding (Default) GPU-Video Afkodning (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75X (540p/810p) [EKSPERIMENTEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor Nærmeste Nabo - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gausisk - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tving 4:3 - + Force 21:9 Tving 21:9 - + Force 16:10 - + Stretch to Window Stræk til Vindue - + Automatic - + 2x - + 4x - + 8x - + 16x - + Japanese (日本語) Japansk (日本語) - + American English - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Hollandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwanesisk - + British English Britisk Engelsk - + Canadian French Candadisk Fransk - + Latin American Spanish Latinamerikansk Spansk - + Simplified Chinese Forenklet Kinesisk - + Traditional Chinese (正體中文) Traditionelt Kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliansk Portugisisk (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ægypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Tyrkiet - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokket - + Handheld Håndholdt - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6983,7 +6966,7 @@ Debug Message: - + &Pause @@ -7134,7 +7117,7 @@ Debug Message: - + &Start @@ -7145,7 +7128,7 @@ Debug Message: - + R&ecord @@ -7236,7 +7219,7 @@ Debug Message: - + None @@ -7262,737 +7245,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8000,74 +7983,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/de.ts b/dist/languages/de.ts index 0c142d2709..d6b1fdbcb5 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -831,66 +831,48 @@ Standard folgt der GPU-Genauigkeit Einstellung. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. - Steuert das GPU-Zaunobjekt-Synchronisations-Verhalten. -Direkt ist die schnellste Option, kann aber zu Problemen führen. -Ausbalanciert bietet bessere Kompatibilität und kann in manchen Spielen Probleme beheben. -Genau bietet noch bessere Kompatibilität auf Kosten von etwas Leisung. -Strikt ist die langsamste Option, kann aber Probleme beheben, die striktere Synchronisation erfordern. -Standard folgt der GPU-Genauigkeit Einstellung. +Default follows the GPU Mode setting. + - Enable GPU buffer readback - GPU-Puffer-Rücklesung aktivieren - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - Bewahrt von der GPU modifizierte Pufferdaten, indem diese vor dem Hochladen zurückgelesen werden. -Einige Spiele benötigen dies, um bestimmte Effekte korrekt darzustellen. - - - Enable asynchronous shader compilation Aktiviere asynchrones Shader-Kompilieren - + May reduce shader stutter. Kann Shader-Ruckler reduzieren. - + GPU Clocks GPU-Takte - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. Führt dazu, dass das Spiel glaubt, die Arbeit der GPU würde früher fertig sein, als sie eigentlich ist. Dadurch hört das Spiel auf die Auflösung und Render-Distanz zu verringern um sich den Takten der Switch anzupassen. - + GPU Unswizzle GPU-Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Beschleunigt die Dekodierung von BCn-3D-Texturen mithilfe von GPU-Rechenleistung. Deaktiviere diese Option, falls Abstürze oder Grafikfehler auftreten. - + GPU Unswizzle Max Texture Size GPU-Unswizzle max. Texturgröße - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -899,48 +881,48 @@ Während die GPU für mittelgroße und große Texturen schneller ist, kann die C Passen Sie diesen Wert an, um das Gleichgewicht zwischen GPU-Beschleunigung und CPU-Overhead zu finden. - + GPU Unswizzle Stream Size GPU-Unswizzle-Streamgröße - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Legt die maximale Menge an Texturdaten (in MiB) fest, die pro Bild verarbeitet wird. Höhere Werte können Ruckeln beim Laden von Texturen verringern, können sich jedoch auf die Bildrate auswirken. - + GPU Unswizzle Chunk Size GPU-Unswizzle Chunk-Größe - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Legt die Anzahl der Tiefenschnitte fest, die in einem einzelnen Durchlauf verarbeitet werden. Eine Erhöhung dieses Werts kann den Durchsatz auf High-End-GPUs verbessern, bei schwächerer Hardware jedoch zu TDR- oder Treiber-Auszeiten führen. - + Use Vulkan pipeline cache Vulkan-Pipeline-Cache verwenden - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Aktiviert den herstellerspezifischen Pipeline-Cache der GPU. Diese Option kann die Ladezeit von Shadern erheblich verkürzen, wenn der Vulkan-Treiber die Pipeline-Cache-Dateien nicht intern speichert. - + Enable Compute Pipelines (Intel Vulkan Only) Aktiviere Compute-Pipelines (Nur Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -949,194 +931,194 @@ Diese Einstellung ist nur bei proprietären Intel-Treibern vorhanden und kann be Bei allen anderen Treibern sind die Rechen-Rohrleitungen immer aktiviert. - + Enable Reactive Flushing Aktiviere Reactives Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Benutzt Reactive-Flushing anstatt Predictive-Flushing, welches akkurateres Speicher-Synchronisieren erlaubt. - + Sync to framerate of video playback Synchronisiere mit Bildrate von Video-Wiedergaben - + Run the game at normal speed during video playback, even when the framerate is unlocked. Lasse das Spiel in der normalen Geschwindigkeit abspielen, trotz freigeschalteter Bildrate - + Barrier feedback loops Barrier-Feedback-Schleifen - + Improves rendering of transparency effects in specific games. Verbessert das Rendering von Transparenzeffekten in bestimmten Spielen. - + Enable buffer history Puffer-Verlauf aktivieren - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Ermöglicht den Zugriff auf frühere Pufferzustände. Diese Option kann in manchen Spielen die Darstellungsqualität und die Leistungsstabilität verbessern. - + Fix bloom effects Bloom-Effekte beheben - + Removes bloom in Burnout. Entfernt Bloom in Burnout. - + Enable Legacy Rescale Pass „Legacy Rescale Pass“ aktivieren - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Behebt möglicherweise Probleme mit der Skalierung in einigen Spielen, indem auf das Verhalten der vorherigen Implementierung zurückgegriffen wird. Eine Umgehungslösung für das alte Verhalten, die Linienartefakte auf AMD- und Intel-GPUs sowie graues Texturflackern auf Nvidia-GPUs in „Luigi’s Mansion 3“ behebt. - + Extended Dynamic State Erweiterter dynamischer Zustand - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Legt die Anzahl der Funktionen fest, die im erweiterten dynamischen Modus verwendet werden können. Höhere Stufen ermöglichen mehr Funktionen und können die Leistung steigern, können jedoch zusätzliche grafische Probleme verursachen. - + Vertex Input Dynamic State Dynamischer Zustand der Scheitelpunkteingabe - + Enables vertex input dynamic state feature for better quality and performance. Aktiviert die Funktion für den dynamischen Status der Scheitelpunkteingabe, um eine bessere Qualität und Leistung zu erzielen. - + Sample Shading Probe-Schattierung - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Ermöglicht es dem Fragment-Shader, pro Abtastwert in einem mehrfach abgetasteten Fragment ausgeführt zu werden, anstatt nur einmal pro Fragment. Verbessert die Grafikqualität auf Kosten der Leistung. Höhere Werte verbessern die Qualität, beeinträchtigen jedoch die Leistung. - + RNG Seed Startwert für den Zufallszahlengenerator - + Controls the seed of the random number generator. Mainly used for speedrunning. Steuert den Startwert des Zufallszahlengenerators. Wird hauptsächlich für Schnelldurchläufe verwendet. - + Device Name Gerätename - + The name of the console. Der Name der Konsole. - + Homebrew Args Homebrew-Argumente - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Befehlszeilenargumente, die beim Start an Homebrew übergeben werden (z. B. -noglsl). - + Custom RTC Date: Benutzerdefinierte Echtzeituhrdatum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Diese Option erlaubt die Änderung der Uhr der Konsole. Kann benutzt werden um Zeit in Spielen zu manipulieren. - + The number of seconds from the current unix time Die Anzahl der Sekunden seit dem aktuellen Unix-Zeitstempel - + Language: Sprache: - + This option can be overridden when region setting is auto-select Diese Option kann überschrieben werden, wenn die Regionseinstellung auf „Automatische Auswahl“ steht - + Region: Region: - + The region of the console. Die Region der Konsole. - + Time Zone: Zeitzone: - + The time zone of the console. Die Zeitzone der Konsole. - + Sound Output Mode: Tonausgangsmodus: - + Console Mode: Konsolenmodus: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1145,1042 +1127,1037 @@ Je nach dieser Einstellung ändern sich bei Spielen die Auflösung, die Detailst Die Einstellung auf „Handgerät“ kann dazu beitragen, die Leistung auf Systemen mit geringerer Leistung zu verbessern. - + Prompt for user profile on boot Beim Systemstart nach dem Benutzerprofil fragen - + Useful if multiple people use the same PC. Nützlich, wenn mehrere Personen denselben PC nutzen. - + Pause when not in focus Pausieren, wenn nicht im Fokus - + Pauses emulation when focusing on other windows. Pausiert die Emulation, wenn der Fokus auf andere Fenster wechselt. - + Confirm before stopping emulation Vor dem Stoppen der Emulation bestätigen - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Überschreibt die Abfragen zur Bestätigung des Beendens der Emulation. Wenn diese Option aktiviert ist, werden solche Abfragen umgangen und die Emulation wird direkt beendet. - + Hide mouse on inactivity Mauszeiger verbergen - + Hides the mouse after 2.5s of inactivity. Verbirgt den Mauszeiger nach 2,5 Sekunden Inaktivität. - + Disable controller applet Controller-Applet deaktivieren - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Deaktiviert die Verwendung des Controller-Applets in emulierten Programmen zwangsweise. Wenn ein Programm versucht, das Controller-Applet zu öffnen, wird es sofort geschlossen. - + Check for updates Auf Aktualisierungen überprüfen - + Whether or not to check for updates upon startup. Ob nach Aktualisierungen während des Startens gesucht werden soll. - + Enable Gamemode Spielmodus aktivieren - + Force X11 as Graphics Backend X11 als Grafik-Backend erzwingen - + Custom frontend Benutzerdefiniertes Frontend - + Real applet Echtes Applet - + Never Niemals - + On Load Beim Laden - + Always Immer - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asynchron - + Uncompressed (Best quality) Unkomprimiert (Beste Qualität) - + BC1 (Low quality) BC1 (Niedrige Qualität) - + BC3 (Medium quality) BC3 (Mittlere Qualität) - - + + Auto Auto - + 30 FPS 30 BpS - + 60 FPS 60 BpS - + 90 FPS 90 BpS - + 120 FPS 120 BpS - + Conservative Konservativ - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembler-Shader, nur NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (experimentell, nur AMD/Mesa) - + Null Null - + Fast Schnell - - - + + + Accurate Akkurat - - - + + + Default Vorgabe - + Unsafe (fast) Unsicher (schnell) - + Safe (stable) Sicher (stabil) - + Immediate Direkt - + Balanced Ausgeglichen - - Strict - Strikt - - - + Unsafe Unsicher - + Paranoid (disables most optimizations) Paranoid (deaktiviert die meisten Optimierungen) - + Debugging Fehlerbehebung - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Rahmenloses Fenster - + Exclusive Fullscreen Exklusiver Vollbildmodus - + No Video Output Keine Videoausgabe - + CPU Video Decoding CPU Video Dekodierung - + GPU Video Decoding (Default) GPU Video Dekodierung (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5X (360p/540p) [EXPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75X (540p/810p) [EXPERIMENTELL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1,5X (1080p/1620p) [EXPERIMENTELL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest-Neighbor - + Bilinear Bilinear - + Bicubic Bikubisch - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super-Auflösung - + Area Bereich - + MMPX MMPX - + Zero-Tangent Nulltangente - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Spiel-Superauflösung - + Snapdragon Game Super Resolution EdgeDir Snapdragon Spiel-Superauflösung EdgeDir - + None Keiner - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Vorgabe (16:9) - + Force 4:3 4:3 erzwingen - + Force 21:9 21:9 erzwingen - + Force 16:10 16:10 erzwingen - + Stretch to Window Auf Fenster anpassen - + Automatic Automatisch - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japanisch (日本語) - + American English Amerikanisches Englisch - + French (français) Französisch (français) - + German (Deutsch) Deutsch (German) - + Italian (italiano) Italienisch (italiano) - + Spanish (español) Spanisch (español) - + Chinese Chinesisch - + Korean (한국어) Koreanisch (한국어) - + Dutch (Nederlands) Niederländisch (Nederlands) - + Portuguese (português) Portugiesisch (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanesisch - + British English Britisches Englisch - + Canadian French Kanadisches Französisch - + Latin American Spanish Lateinamerikanisches Spanisch - + Simplified Chinese Vereinfachtes Chinesisch - + Traditional Chinese (正體中文) Traditionelles Chinesisch (正體中文) - + Brazilian Portuguese (português do Brasil) Brasilianisches Portugiesisch (português do Brasil) - + Polish (polska) Polnisch (Polen) - + Thai (แบบไทย) Thailändisch (Thailändische Version) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatisch (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Ägypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkei - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Vorgabe) - + 6GB DRAM (Unsafe) 6GB DRAM (Unsicher) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Unsicher) - + 12GB DRAM (Unsafe) 12GB DRAM (Unsicher) - + Docked Angedockt - + Handheld Handgerät - - + + Normal Normal - - + + Boost Beschleunigung - - + + Overclock Übertaktung - + Always ask (Default) Immer fragen (Vorgabe) - + Only if game specifies not to stop Nur wenn ein Spiel vorgibt, nicht zu stoppen - + Never ask Niemals fragen - + Very Small (16 MB) Sehr klein (16 MB) - + Small (32 MB) Klein (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Groß (256 MB) - + Very Large (512 MB) Sehr groß (512 MB) - + Very Low (4 MB) Sehr niedrig (4 MB) - + Low (8 MB) Niedrig (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Mittel (32 MB) - + High (64 MB) Hoch (64 MB) - + Very Low (32) Sehr niedrig (32) - + Low (64) Niedrig (64) - + Normal (128) Normal (128) - + Medium (256) Mittel (256) - + High (512) Hoch (512) - + Disabled Deaktiviert - + ExtendedDynamicState 1 ErweiterterDynamischerZustand 1 - + ExtendedDynamicState 2 ErweiterterDynamischerZustand 2 - + ExtendedDynamicState 3 ErweiterterDynamischerZustand 3 - + Tree View Baumansicht - + Grid View Rasteransicht @@ -7077,7 +7054,7 @@ Fehlerbehebungs-Meldung: - + &Pause &Pause @@ -7228,7 +7205,7 @@ Fehlerbehebungs-Meldung: - + &Start &Start @@ -7239,7 +7216,7 @@ Fehlerbehebungs-Meldung: - + R&ecord Aufnahme @@ -7330,7 +7307,7 @@ Fehlerbehebungs-Meldung: - + None Keine @@ -7356,405 +7333,405 @@ Fehlerbehebungs-Meldung: &Karussellansicht - + Small (32x32) Klein (32x32) - + Standard (64x64) Standard (64x64) - + Large (128x128) Groß (128x128) - + Full Size (256x256) Volle Größe (256x256) - + Broken Vulkan Installation Detected Defekte Vulkan-Installation erkannt - + Vulkan initialization failed during boot. Initialisierung von Vulkan ist beim Systemstart fehlgeschlagen. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Spiel wird ausgeführt - + Loading Web Applet... Web-Applet wird geladen... - - + + Disable Web Applet Web-Applet deaktivieren - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Das Deaktivieren des Web-Applets kann zu unvorhersehbarem Verhalten führen und sollte nur bei „Super Mario 3D All-Stars“ verwendet werden. Möchtest du das Web-Applet wirklich deaktivieren? (Dies kann in den Fehlerbehebungs-Einstellungen wieder aktiviert werden.) - + The amount of shaders currently being built Die Anzahl der Shader, die derzeit erstellt werden - + The current selected resolution scaling multiplier. Der aktuell ausgewählte Skalierungsfaktor für die Auflösung. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Aktuelle Emulationsgeschwindigkeit. Werte über oder unter 100 % bedeuten, dass die Emulation schneller oder langsamer läuft als auf einer Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Wie viele Bilder pro Sekunde das Spiel derzeit anzeigt. Dies variiert von Spiel zu Spiel und von Szene zu Szene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Die Zeit, die für die Emulation eines Switch-Frames benötigt wird, ohne Berücksichtigung von Framelimiting oder V-Sync. Bei einer Emulation mit voller Geschwindigkeit sollte dieser Wert höchstens 16,67 ms betragen. - + Unmute Stummschaltung aufheben - + Mute Stummschalten - + Reset Volume Lautstärke zurücksetzen - + Configure Effects... - + &Clear Recent Files &Zuletzt verwendete Dateien löschen - + &Continue &Fortfahren - + Warning: Outdated Game Format Warnung: Veraltetes Spielformat - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Du verwendest für dieses Spiel das dekontruierte ROM-Verzeichnisformat - ein veraltetes Format, das durch andere Formate wie NCA, NAX, XCI oder NSP abgelöst wurde. Dekonstruierten ROM-Verzeichnissen fehlen Symbole, Metadaten und die Unterstützung für Aktualisierungen. <br>Eine Erläuterung der verschiedenen Switch-Formate, die Eden unterstützt, findest du in unserem Benutzerhandbuch. Diese Meldung wird nicht erneut angezeigt. - - + + Error while loading ROM! Fehler beim Laden des ROMs! - + The ROM format is not supported. Das ROM-Format wird nicht unterstützt. - + An error occurred initializing the video core. Beim Initialisieren des Videokerns ist ein Fehler aufgetreten. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Fehler beim Laden des ROMs! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Bitte erstelle deine Dateien erneut oder bitte auf Discord/Stoat um Hilfe. - + An unknown error occurred. Please see the log for more details. Es ist ein unbekannter Fehler aufgetreten. Weitere Informationen findest du im Protokoll. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Software wird geschlossen... - + Save Data Speicherdaten - + Mod Data Mod-Daten - + Error Opening %1 Folder Fehler beim Öffnen des Ordners %1 - - + + Folder does not exist! Der Ordner existiert nicht! - + Remove Installed Game Contents? Installierte Spielinhalte entfernen? - + Remove Installed Game Update? Installierte Spielaktualisierung entfernen? - + Remove Installed Game DLC? Installiertes Spiel-DLC entfernen? - + Remove Entry Eintrag entfernen - + Delete OpenGL Transferable Shader Cache? Den übertragbaren Shader-Cache von OpenGL löschen? - + Delete Vulkan Transferable Shader Cache? Den übertragbaren Shader-Cache von Vulkan löschen? - + Delete All Transferable Shader Caches? Alle übertragbaren Shader-Caches löschen? - + Remove Custom Game Configuration? Benutzerdefinierte Spielkonfiguration entfernen? - + Remove Cache Storage? Cache-Speicher löschen? - + Remove File Datei entfernen - + Remove Play Time Data Wiedergabezeitdaten löschen - + Reset play time? Spielzeit zurücksetzen? - - + + RomFS Extraction Failed! RomFS-Extraktion fehlgeschlagen! - + There was an error copying the RomFS files or the user cancelled the operation. Beim Kopieren der RomFS-Dateien ist ein Fehler aufgetreten oder der Benutzer hat den Vorgang abgebrochen. - + Full Vollständig - + Skeleton Skelett - + Select RomFS Dump Mode RomFS-Auslesemodus auswählen - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Bitte wähle aus, wie das RomFS kopiert werden soll. <br>Vollständig kopiert alle Dateien in das neue Verzeichnis, während <br>Skelett lediglich die Verzeichnisstruktur erstellt. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Unter %1 ist nicht genügend Speicherplatz vorhanden, um das RomFS zu extrahieren. Bitte schaffe Speicherplatz oder wähle unter „Emulation > Konfigurieren > System > Dateisystem > Dump-Stammverzeichnis“ ein anderes Dump-Verzeichnis aus. - + Extracting RomFS... RomFS wird extrahiert... - - + + Cancel Abbrechen - + RomFS Extraction Succeeded! RomFS wurde erfolgreich extrahiert! - + The operation completed successfully. Der Vorgang wurde erfolgreich abgeschlossen. - + Error Opening %1 Fehler beim Öffnen von %1 - + Select Directory Verzeichnis auswählen - + Properties Eigenschaften - + The game properties could not be loaded. Die Spieleigenschaften konnten nicht geladen werden. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch-Ausführungsdatei (%1);;Alle Dateien (*.*) - + Load File Datei laden - + Open Extracted ROM Directory Verzeichnis mit dem extrahierten ROM öffnen - + Invalid Directory Selected Ungültiges Verzeichnis ausgewählt - + The directory you have selected does not contain a 'main' file. Das von dir ausgewählte Verzeichnis enthält keine „main“-Datei. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installierbare Switch-Dateien (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX-Kassetten-Image (*.xci) - + Install Files Dateien installieren - + %n file(s) remaining %n Datei(en) verbleiben%n Datei(en) verbleiben - + Installing file "%1"... Datei „%1“ wird installiert... - - + + Install Results Installationsergebnisse - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Um mögliche Konflikte zu vermeiden, raten wir davon ab, Basisspiele auf dem NAND-Speicher zu installieren. Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen und DLCs. - + %n file(s) were newly installed %n Datei(en) wurden neu installiert @@ -7762,7 +7739,7 @@ Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen - + %n file(s) were overwritten %n Datei(en) wurden überschrieben @@ -7770,7 +7747,7 @@ Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen - + %n file(s) failed to install %n Datei(en) konnten nicht installiert werden @@ -7778,324 +7755,324 @@ Bitte nutze diese Funktion ausschließlich zur Installation von Aktualisierungen - + System Application Systemanwendung - + System Archive Systemarchiv - + System Application Update System-Anwendungsaktualisierung - + Firmware Package (Type A) Firmware-Paket (Typ A) - + Firmware Package (Type B) Firmware-Paket (Typ B) - + Game Spiel - + Game Update Spielaktualisierung - + Game DLC Spiel-DLC - + Delta Title Delta-Titel - + Select NCA Install Type... NCA-Installationstyp auswählen... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Bitte wähle den Titeltyp aus, unter dem du diese NCA installieren möchtest: (In den meisten Fällen ist die Vorgabe „Spiel“ ausreichend.) - + Failed to Install Installation fehlgeschlagen - + The title type you selected for the NCA is invalid. Der von dir für die NCA ausgewählte Titel ist ungültig. - + File not found Datei nicht gefunden - + File "%1" not found Datei „%1“ nicht gefunden - + OK OK - + Function Disabled Funktion deaktiviert - + Compatibility list reporting is currently disabled. Check back later! Die Anzeige der Kompatibilitätsliste ist derzeit deaktiviert. Schaue später noch einmal vorbei! - + Error opening URL Fehler beim Öffnen der URL - + Unable to open the URL "%1". Die URL „%1“ kann nicht geöffnet werden. - + TAS Recording TAS-Aufnahme - + Overwrite file of player 1? Datei von Spieler 1 überschreiben? - + Invalid config detected Ungültige Konfiguration erkannt - + Handheld controller can't be used on docked mode. Pro controller will be selected. Der Handgerät-Controller kann im angedockten Modus nicht verwendet werden. Es wird der Pro-Controller ausgewählt. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Das aktuelle amiibo wurde entfernt - + Error Fehler - - + + The current game is not looking for amiibos Das aktuelle Spiel sucht nicht nach Amiibos - + Amiibo File (%1);; All Files (*.*) Amiibo-Datei (%1);; Alle Dateien (*.*) - + Load Amiibo Amiibo laden - + Error loading Amiibo data Fehler beim Laden der Amiibo-Daten - + The selected file is not a valid amiibo Die ausgewählte Datei ist kein gültiges amiibo - + The selected file is already on use Die ausgewählte Datei wird bereits verwendet - + An unknown error occurred Ein unbekannter Fehler ist aufgetreten - + No firmware available Keine Firmware verfügbar - + Firmware Corrupted Firmware beschädigt - + Unknown applet Unbekanntes Applet - + Applet doesn't map to a known value. „Applet“ lässt sich keinem bekannten Wert zuordnen. - + Record not found Aufnahme nicht gefunden - + Applet not found. Please reinstall firmware. Applet nicht gefunden. Bitte installiere die Firmware neu. - + Capture Screenshot Bildschirmfoto aufnehmen - + PNG Image (*.png) PNG-Bild (*.png) - + TAS state: Running %1/%2 TAS-Status: %1/%2 läuft - + TAS state: Recording %1 TAS-Status: %1 wird aufgenommen - + TAS state: Idle %1/%2 TAS-Status: Leerlauf %1/%2 - + TAS State: Invalid TAS-Status: Ungültig - + &Stop Running &Ausführung beenden - + Stop R&ecording Aufnahme beenden - + Building: %n shader(s) Erstellung: %n SchattiererErstelle: %n Shader - + Scale: %1x %1 is the resolution scaling factor Maßstab: 1:1 - + Speed: %1% / %2% Geschwindigkeit: %1% / %2% - + Speed: %1% Geschwindigkeit: %1% - + Game: %1 FPS Spiel: %1 FPS - + Frame: %1 ms Frame: %1 ms - + NO AA Kein AA - + NO FX - + FX - + VOLUME: MUTE LAUTSTÄRKE: STUMM - + VOLUME: %1% Volume percentage (e.g. 50%) LAUTSTÄRKE: %1% - + Derivation Components Missing Ableitungskomponenten fehlen - + Decryption keys are missing. Install them now? Entschlüsselungsschlüssel fehlen. Möchtest du diese jetzt installieren? - + Wayland Detected! Wayland erkannt! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8106,74 +8083,74 @@ Es wird empfohlen, stattdessen X11 zu verwenden. Möchtest du dies für zukünftige Starts erzwingen? - + Use X11 X11 verwenden - + Continue with Wayland Mit Wayland fortfahren - + Don't show again Nicht mehr anzeigen - + Restart Required Neustart erforderlich - + Restart Eden to apply the X11 backend. Starte Eden neu, um das X11-Backend zu aktivieren. - + Slow Langsam - + Turbo Turbo - + Unlocked Entsperrt - + Select RomFS Dump Target RomFS-Ausleseziel auswählen - + Please select which RomFS you would like to dump. Bitte wähle aus, welches RomFS du auslesen möchtest. - + Are you sure you want to close Eden? Möchtest du Eden wirklich schließen? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Möchtest du die Emulation wirklich beenden? Alle nicht gespeicherten Fortschritte gehen dabei verloren. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/el.ts b/dist/languages/el.ts index c579eb7f72..a9a5dd9012 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -786,1332 +786,1315 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Περιφέρεια: - + The region of the console. - + Time Zone: Ζώνη Ώρας: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Απόκρυψη δρομέα ποντικιού στην αδράνεια - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Αυτόματη - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Ακριβής - - - + + + Default Προεπιλεγμένο - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - - Strict - - - - + Unsafe Επισφαλής - + Paranoid (disables most optimizations) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Παραθυροποιημένο Χωρίς Όρια - + Exclusive Fullscreen Αποκλειστική Πλήρης Οθόνη - + No Video Output Χωρίς Έξοδο Βίντεο - + CPU Video Decoding Αποκωδικοποίηση Βίντεο CPU - + GPU Video Decoding (Default) Αποκωδικοποίηση Βίντεο GPU (Προεπιλογή) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ΠΕΙΡΑΜΑΤΙΚΟ] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor Πλησιέστερος Γείτονας - + Bilinear Διγραμμικό - + Bicubic Δικυβικό - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Κανένα - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Προεπιλογή (16:9) - + Force 4:3 Επιβολή 4:3 - + Force 21:9 Επιβολή 21:9 - + Force 16:10 Επιβολή 16:10 - + Stretch to Window Επέκταση στο Παράθυρο - + Automatic Αυτόματα - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Ιαπωνικά (日本語) - + American English - + French (français) Γαλλικά (Français) - + German (Deutsch) Γερμανικά (Deutsch) - + Italian (italiano) Ιταλικά (Italiano) - + Spanish (español) Ισπανικά (Español) - + Chinese Κινέζικα - + Korean (한국어) Κορεάτικα (한국어) - + Dutch (Nederlands) Ολλανδικά (Nederlands) - + Portuguese (português) Πορτογαλικά (Português) - + Russian (Русский) Ρώσικα (Русский) - + Taiwanese Ταϊβανέζικα - + British English Βρετανικά Αγγλικά - + Canadian French Καναδικά Γαλλικά - + Latin American Spanish Λατινοαμερικάνικα Ισπανικά - + Simplified Chinese Απλοποιημένα Κινέζικα - + Traditional Chinese (正體中文) Παραδοσιακά Κινέζικα (正體中文) - + Brazilian Portuguese (português do Brasil) Πορτογαλικά Βραζιλίας (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Ιαπωνία - + USA ΗΠΑ - + Europe Ευρώπη - + Australia Αυστραλία - + China Κίνα - + Korea Κορέα - + Taiwan Ταϊβάν - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Κούβα - + EET EET - + Egypt Αίγυπτος - + Eire - + EST EST - + EST5EDT EST5EDT - + GB - + GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Γκρήνουιτς - + Hongkong Χονγκ Κονγκ - + HST HST - + Iceland Ισλανδία - + Iran Ιράν - + Israel Ισραήλ - + Jamaica Ιαμαϊκή - + Kwajalein - + Libya Λιβύη - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Ναβάχο - + NZ - + NZ-CHAT - + Poland Πολωνία - + Portugal Πορτογαλία - + PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Σιγκαπούρη - + Turkey Τουρκία - + UCT UCT - + Universal Παγκόσμια - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu - + Mono Μονοφωνικό - + Stereo Στέρεοφωνικό - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6974,7 +6957,7 @@ Debug Message: - + &Pause &Παύση @@ -7125,7 +7108,7 @@ Debug Message: - + &Start &Έναρξη @@ -7136,7 +7119,7 @@ Debug Message: - + R&ecord @@ -7227,7 +7210,7 @@ Debug Message: - + None @@ -7253,737 +7236,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7991,74 +7974,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/es.ts b/dist/languages/es.ts index 1ae327cff0..949145a741 100644 --- a/dist/languages/es.ts +++ b/dist/languages/es.ts @@ -828,60 +828,48 @@ Predeterminado sigue el ajuste de la precisión de GPU. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - Activar la lectura del búfer de la GPU - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation Activa la compilación de shaders asincrónicos - + May reduce shader stutter. Puede reducir los tirones causados por la carga de sombreadores. - + GPU Clocks Relojes de GPU - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle Desentrelazado de la GPU - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Acelera la decodificación de texturas 3D BCn mediante computación de la GPU. Desactívela si experimenta problemas o fallos gráficos. - + GPU Unswizzle Max Texture Size Tamaño máximo de textura de desentrelazado de la GPU - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -890,46 +878,46 @@ Aunque la GPU es más rápida para texturas medianas y grandes, la CPU puede ser Ajuste este valor para encontrar el equilibrio entre la aceleración de la GPU y la sobrecarga de la CPU. - + GPU Unswizzle Stream Size Tamaño del flujo de desentrelazado de la GPU - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Establece la cantidad máxima de datos de textura (en MiB) procesados ​​por cada fotograma. Valores más altos pueden reducir la distorsión durante la carga de texturas, pero pueden afectar a la consistencia de los fotogramas. - + GPU Unswizzle Chunk Size Tamaño del trozo de desentrelazado de la GPU - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Determina la cantidad de cortes de profundidad procesados ​​en un solo envío. Aumentar este valor puede mejorar el rendimiento en una GPU de gama alta, pero puede causar tirones y problemas en los tiempos de respuesta en hardware más modesto. - + Use Vulkan pipeline cache Usar caché de canalización de Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Activa la caché de canalización específica del fabricante. Esta opción puede mejorar los tiempos de cargas de sombreadores en el caso de que el controlador de Vulkan no lo almacene internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Activar la canalizaciones de cómputo (solo Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -938,194 +926,194 @@ Este ajuste solo existe para los controladores propietarios de Intel y puede cau En los demás controladores, la canalización de cómputo siempre está activada. - + Enable Reactive Flushing Activar limpieza reactiva - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa limpieza de memoria reactiva en vez de predictiva, permitiendo una sincronización de memoria más precisa. - + Sync to framerate of video playback Sincronizar a fotogramas de reproducción de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Ejecuta el juego a velocidad normal durante la reproducción de vídeos, incluso cuando no hay límite de fotogramas. - + Barrier feedback loops Bucles de feedback de barrera - + Improves rendering of transparency effects in specific games. Mejora la renderización de los efectos de transparencia en ciertos juegos. - + Enable buffer history Activar el historial del búfer - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Habilita el acceso a estados de búfer anteriores. Esta opción puede mejorar la calidad de renderizado y la consistencia en el rendimiento de algunos juegos. - + Fix bloom effects Arreglar efectos de resplandor - + Removes bloom in Burnout. Elimina el resplandor en Burnout. - + Enable Legacy Rescale Pass Activar el pase de reescalado heredado - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Puede arreglar los problemas de reescalado en algunos juegos confiando en el comportamiento de la implementación anterior. Solución alternativa de comportamiento heredado que corrige los artefactos de línea de la GPU AMD y el parpadeo de texturas gris de la GPU Nvidia en Luigis Mansion 3. - + Extended Dynamic State Estado dinámico extendido - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Controla el número de funciones que pueden ser usadas en el Estado Dinámico Extendido. Números más altos permiten úsar más funciones y pueden aumentar el rendimiento, pero tambén pueden causar errores gráficos. - + Vertex Input Dynamic State Estado dinámico de entrada de vértices - + Enables vertex input dynamic state feature for better quality and performance. Activa la función de estado dinámico de entrada de vértices para una mejor calidad y rendimiento. - + Sample Shading Sombreado de muestra - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permite que el sombreador de fragmentos se ejecute por muestra en un fragmento multimuestreado, en lugar de una sola vez por fragmento. Mejora la calidad de los gráficos a costa de rendimiento. Los valores más altos mejoran la calidad, pero reducen el rendimiento. - + RNG Seed Semilla de GNA - + Controls the seed of the random number generator. Mainly used for speedrunning. Controla la semilla del generador de números aleatorios. Usado principalmente para speedrunning. - + Device Name Nombre del dispositivo - + The name of the console. El nombre de la consola - + Homebrew Args Argumentos Homebrew - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Argumentos en la línea de comandos pasados al homebrew al ser lanzado (p.e. -noglsl). - + Custom RTC Date: Fecha Personalizada RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Esta opción permite cambiar el reloj de la consola. Puede ser usado para manipular el tiempo en juegos. - + The number of seconds from the current unix time Número de segundos de la hora actual de Unix - + Language: Idioma: - + This option can be overridden when region setting is auto-select Esta opción puede ser reemplazada cuando la configuración de región está en selección automática. - + Region: Región: - + The region of the console. La Región de la Consola. - + Time Zone: Zona horaria: - + The time zone of the console. La zona horaria de la consola. - + Sound Output Mode: Método de salida de sonido: - + Console Mode: Modo consola: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1134,1041 +1122,1036 @@ Los juegos cambiarán su resolución, detalles y compatibilidad con los mandos s Configurar el modo portátil puede mejorar el rendimiento en sistemas de gama baja. - + Prompt for user profile on boot Solicitud para perfil de usuario al arrancar - + Useful if multiple people use the same PC. Útil si múltiples personas usan la misma PC - + Pause when not in focus Pausar cuando la ventana no esté activa - + Pauses emulation when focusing on other windows. Pausa la emulación cuando otra ventana diferente está activa. - + Confirm before stopping emulation Confirmar detención - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Anula las solicitudes de confirmación para detener la emulación. Al habilitar esta opción, se omiten dichas solicitudes y se sale directamente de la emulación. - + Hide mouse on inactivity Ocultar el cursor por inactividad. - + Hides the mouse after 2.5s of inactivity. Oculta el mouse después de 2.5s de inactividad. - + Disable controller applet Desactivar applet de mandos - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Desactiva forzosamente el uso del applet del controlador en programas emulados. Cuando un programa intenta abrir el applet del controlador, se cierra inmediatamente. - + Check for updates Buscar actualizaciones - + Whether or not to check for updates upon startup. Si se deben buscar actualizaciones al iniciar o no. - + Enable Gamemode Activar Modo Juego - + Force X11 as Graphics Backend Forzar X11 como motor gráfico - + Custom frontend Interfaz personalizada - + Real applet Applet real - + Never Nunca - + On Load Al cargar - + Always Siempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU asíncrona - + Uncompressed (Best quality) Sin compresión (Mejor calidad) - + BC1 (Low quality) BC1 (Calidad baja) - + BC3 (Medium quality) BC3 (Calidad media) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservativo - + Aggressive Agresivo - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Ensamblado de sombreadores, solo NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, solo AMD/Mesa) - + Null Ninguno - + Fast Rápido - - - + + + Accurate Preciso - - - + + + Default Predeterminado - + Unsafe (fast) Inseguro (rápido) - + Safe (stable) Seguro (estable) - + Immediate Inmediato - + Balanced Balanceado - - Strict - Estricto - - - + Unsafe Impreciso - + Paranoid (disables most optimizations) Paranoico (Deshabilita la mayoría de optimizaciones) - + Debugging Depuración - + Dynarmic DynARMic - + NCE NCE - + Borderless Windowed Ventana sin bordes - + Exclusive Fullscreen Pantalla completa - + No Video Output Sin salida de vídeo - + CPU Video Decoding Decodificación de vídeo en la CPU - + GPU Video Decoding (Default) Decodificación de vídeo en GPU (Por defecto) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] x0,5 (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] x0,75 (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) x1 (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] x1,5 (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) x2 (1440p/2160p) - + 3X (2160p/3240p) x3 (2160p/3240p) - + 4X (2880p/4320p) x4 (2880p/4320p) - + 5X (3600p/5400p) x5 (3600p/5400p) - + 6X (4320p/6480p) x6 (4320p/6480p) - + 7X (5040p/7560p) x7 (5040p/7560p) - + 8X (5760p/8640p) x8 (5760p/8640p) - + Nearest Neighbor Vecino más próximo - + Bilinear Bilineal - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution Super Resolución AMD FidelityFX - + Area Área - + MMPX MMPX - + Zero-Tangent Tangente cero - + B-Spline Ranura B - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Super resolución de juego Snapdragon - + Snapdragon Game Super Resolution EdgeDir Filo direcorio de super resolución de juego Snapdragon - + None Ninguno - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Predeterminado (16:9) - + Force 4:3 Forzar 4:3 - + Force 21:9 Forzar 21:9 - + Force 16:10 Forzar 16:10 - + Stretch to Window Estirar a la ventana - + Automatic Automático - + 2x x2 - + 4x x4 - + 8x x8 - + 16x x16 - + Japanese (日本語) Japonés (日本語) - + American English Inglés estadounidense - + French (français) Francés (français) - + German (Deutsch) Alemán (deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Español - + Chinese Chino - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandés (nederlands) - + Portuguese (português) Portugués (português) - + Russian (Русский) Ruso (Русский) - + Taiwanese Taiwanés - + British English Inglés británico - + Canadian French Francés canadiense - + Latin American Spanish Español latinoamericano - + Simplified Chinese Chino simplificado - + Traditional Chinese (正體中文) Chino tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugués brasileño (português do Brasil) - + Polish (polska) Polaco (polska) - + Thai (แบบไทย) Tailandés (แบบไทย) - - + + Japan Japón - + USA EEUU - + Europe Europa - + Australia Australia - + China China - + Korea Corea - + Taiwan Taiwán - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Predeterminada (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Irán - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquía - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulú - + Mono Mono - + Stereo Estéreo - + Surround Envolvente - + 4GB DRAM (Default) 4GB DRAM (Por defecto) - + 6GB DRAM (Unsafe) 6GB DRAM (Inseguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Sobremesa - + Handheld Portátil - - + + Normal Normal - - + + Boost Impulso - - + + Overclock Overclock - + Always ask (Default) Preguntar siempre (Por defecto) - + Only if game specifies not to stop Solo si el juego pide no ser cerrado - + Never ask Nunca preguntar - + Very Small (16 MB) Muy pequeño (16 MB) - + Small (32 MB) Pequeño (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muy grande (512 MB) - + Very Low (4 MB) Muy bajo (4 MB) - + Low (8 MB) Bajo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muy bajo (32) - + Low (64) Bajo (64) - + Normal (128) Normal (128) - + Medium (256) Medio (256) - + High (512) Alto (512) - + Disabled Desactivado - + ExtendedDynamicState 1 ModoDynamicoExtendido 1 - + ExtendedDynamicState 2 ModoDynamicoExtendido 2 - + ExtendedDynamicState 3 ModoDynamicoExtendido 3 - + Tree View Vista en árbol - + Grid View Vista en cuadrícula @@ -7065,7 +7048,7 @@ Mensaje de depuración: - + &Pause &Pausar @@ -7216,7 +7199,7 @@ Mensaje de depuración: - + &Start &Iniciar @@ -7227,7 +7210,7 @@ Mensaje de depuración: - + R&ecord G&rabar @@ -7318,7 +7301,7 @@ Mensaje de depuración: - + None Nada @@ -7344,405 +7327,405 @@ Mensaje de depuración: Vista de &carrusel - + Small (32x32) Pequeño (32x32) - + Standard (64x64) Estandar (64x64) - + Large (128x128) Grande (128x128) - + Full Size (256x256) Tamaño completo (256x256) - + Broken Vulkan Installation Detected Detectada instalación fallida de Vulkan - + Vulkan initialization failed during boot. La inicialización de Vulkan falló durante el arranque. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Ejecutando un juego - + Loading Web Applet... Cargando applet web... - - + + Disable Web Applet Desactivar applet web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Desactivar el applet web puede causar comportamientos inesperados y debería solo ser usado con Super Mario 3D All-Stars. ¿Está seguro de que quiere desactivar el applet web? (Puede ser activado en las ajustes de depuración.) - + The amount of shaders currently being built La cantidad de sombreadores que se están contruyendo actualmente - + The current selected resolution scaling multiplier. El multiplicador de escalado de resolución seleccionado actualmente. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocidad de emulación actual. Los valores superiores o inferiores al 100% indican que la emulación se ejecuta más rápida o más lenta que en una Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. La cantidad de fotogramas por segundo que muestra el juego actualmente. Esto varía según el juego y la escena. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tiempo empleado en emular un fotograma de la Switch, sin contar la limitación de fotogramas ni la sincronización vertical. Para una emulación a máxima velocidad, debería ser de 16,67 ms como máximo. - + Unmute Desilenciar - + Mute Silenciar - + Reset Volume Restablecer volumen - + Configure Effects... - + &Clear Recent Files &Limpiar archivos recientes - + &Continue &Continuar - + Warning: Outdated Game Format Advertencia: formato del juego obsoleto - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Estás usando el formato de directorio ROM deconstruido para este juego, el cual es un formato obsoleto que ha sido reemplazado por otros como NCA, NAX, XCI o NSP. Los directorios ROM deconstruidos carecen de iconos, metadatos y compatibilidad con actualizaciones.<br>Para obtener una explicación de los distintos formatos de Switch compatibles con Eden, consulta nuestro manual de usuario. Este mensaje no volverá a aparecer de nuevo. - - + + Error while loading ROM! ¡Error al cargar la ROM! - + The ROM format is not supported. El formato de la ROM no está soportado. - + An error occurred initializing the video core. Se produjo un error al inicializar el núcleo de video. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. ¡Error al cargar la ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Por favor vuelva a volcar sus archivos, o pida ayuda en Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Ha ocurrido un error desconocido. Por favor mire el registro para más detalles. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Cerrando el programa... - + Save Data Datos de guardado - + Mod Data Datos del mod - + Error Opening %1 Folder Error abriendo la carpeta %1 - - + + Folder does not exist! ¡La carpeta no existe! - + Remove Installed Game Contents? ¿Eliminar el contenido instalado del juego? - + Remove Installed Game Update? ¿Eliminar la actualización instalada del juego? - + Remove Installed Game DLC? ¿Eliminar el contenido descargable instalado del juego? - + Remove Entry Eliminar entrada - + Delete OpenGL Transferable Shader Cache? ¿Desea eliminar el caché transferible de sombreadores de OpenGL? - + Delete Vulkan Transferable Shader Cache? ¿Desea eliminar el caché transferible de sombreadores de Vulkan? - + Delete All Transferable Shader Caches? ¿Desea eliminar todo el caché transferible de sombreadores? - + Remove Custom Game Configuration? ¿Borrar configuración personalizada del juego? - + Remove Cache Storage? ¿Borrar el almacenamiento de caché? - + Remove File Eliminar archivo - + Remove Play Time Data Eliminar datos del tiempo de juego - + Reset play time? ¿Reiniciar el tiempo de juego? - - + + RomFS Extraction Failed! ¡Fallo al extraer el RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Ocurrió un error al copiar los archivos de la RomFS o el usuario canceló la operación. - + Full Completo - + Skeleton Esqueleto - + Select RomFS Dump Mode Seleccione el método de volcado del RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Por favor selecciona como quieres que sea volcada la RomFS.<br>Completa copiará todos los archivos en el nuevo directorio mientras que <br>esqueleto solo creará la estructura de los directorios. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root No hay suficiente espacio libre en %1 para extraer la RomFS. Por favor libera espacio o selecciona un directorio de volcado diferente en Emulación > Configurar > Sistema > Sistema de archivos > Volcado raiz - + Extracting RomFS... Extrayendo el RomFS... - - + + Cancel Cancelar - + RomFS Extraction Succeeded! ¡La extracción del RomFS ha sido un éxito! - + The operation completed successfully. La operación se completó con éxito. - + Error Opening %1 Error al abrir %1 - + Select Directory Seleccionar directorio - + Properties Propiedades - + The game properties could not be loaded. No se pudieron cargar las propiedades del juego. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Ejecutable de Switch (%1);;Todos los archivos (*.*) - + Load File Cargar archivo - + Open Extracted ROM Directory Abrir directorio de la ROM extraída - + Invalid Directory Selected Seleccionado directorio inválido - + The directory you have selected does not contain a 'main' file. El directorio seleccionado no contiene un archivo 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Archivo de Switch instalable (*.nca *.nsp *.xci);;Archivo de contenido de Nintendo (*.nca);;Paquete de envío de Nintendo (*.nsp);;Imagen de cartucho NX (*.xci) - + Install Files Instalar archivos - + %n file(s) remaining %n archivo(s) restantes%n archivo(s) restantes%n archivo(s) restantes - + Installing file "%1"... Instalando el archivo "%1"... - - + + Install Results Resultados de la instalación - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Para evitar posibles conflictos, desaconsejamos instalar juegos base en la NAND. Por favor, use solo esta función para instalar actualizaciones y contenido descargable. - + %n file(s) were newly installed %n archivo(s) se instalaron recientemente @@ -7751,7 +7734,7 @@ Por favor, use solo esta función para instalar actualizaciones y contenido desc - + %n file(s) were overwritten %n archivo(s) fueron sobreescritos @@ -7760,7 +7743,7 @@ Por favor, use solo esta función para instalar actualizaciones y contenido desc - + %n file(s) failed to install fallo al instalar %n archivo(s) @@ -7769,324 +7752,324 @@ Por favor, use solo esta función para instalar actualizaciones y contenido desc - + System Application Aplicación del sistema - + System Archive Archivo del sistema - + System Application Update Actualización de la aplicación del sistema - + Firmware Package (Type A) Paquete de firmware (Tipo A) - + Firmware Package (Type B) Paquete de firmware (Tipo B) - + Game Juego - + Game Update Actualización del juego - + Game DLC Contenido descargable del juego - + Delta Title Título Delta - + Select NCA Install Type... Seleccione el tipo de instalación NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Seleccione el tipo de título en el que desea instalar este NCA: (En la mayoría de los casos, la opción predeterminada "Juego" es suficiente). - + Failed to Install Fallo al instalar - + The title type you selected for the NCA is invalid. El tipo de título que ha seleccionado para el NCA es inválido. - + File not found Archivo no encontrado - + File "%1" not found Archivo "%1" no encontrado - + OK Aceptar - + Function Disabled Función desactivada - + Compatibility list reporting is currently disabled. Check back later! Los informes de la lista de compatibilidad están deshabilitados. ¡Vuelva más tarde! - + Error opening URL Error abriendo URL - + Unable to open the URL "%1". No se pudo abrir URL "%1". - + TAS Recording Grabación TAS - + Overwrite file of player 1? ¿Sobrescribir el archivo del jugador 1? - + Invalid config detected Detectada configuración inválida - + Handheld controller can't be used on docked mode. Pro controller will be selected. El mando del modo portátil no puede usarse en el modo sobremesa. El mando pro será seleccionado en su lugar. - - + + Amiibo Amiibo - - + + The current amiibo has been removed El amiibo actual fue borrado - + Error Error - - + + The current game is not looking for amiibos El juego actual no está buscando amiibos - + Amiibo File (%1);; All Files (*.*) Archivo Amiibo (%1);; Todos los archivos (*.*) - + Load Amiibo Cargar Amiibo - + Error loading Amiibo data Error al cargar los datos del Amiibo - + The selected file is not a valid amiibo El archivo seleccionado no es un amiibo válido - + The selected file is already on use El archivo seleccionado se encuentra en uso - + An unknown error occurred Ha ocurrido un error desconocido - + No firmware available No hay firmware disponible - + Firmware Corrupted Firmware corrompido - + Unknown applet Applet desconocido - + Applet doesn't map to a known value. Applet no asigna a un valor conocido. - + Record not found Grabación no encontrada - + Applet not found. Please reinstall firmware. Apple no encontrado. Por favor vuelva a instalar el firmware. - + Capture Screenshot Captura de pantalla - + PNG Image (*.png) Imagen PNG (*.png) - + TAS state: Running %1/%2 Estado de TAS: Ejecutando %1/%2 - + TAS state: Recording %1 Estado de TAS: Grabando %1 - + TAS state: Idle %1/%2 Estado de TAS: Inactivo %1/%2 - + TAS State: Invalid Estado de TAS: Inválido - + &Stop Running &Parar de ejecutarse - + Stop R&ecording &Parar grabación - + Building: %n shader(s) Construyendo: %n sombreador(es)Construyendo: %n sombreador(es)Construyendo: %n sombreador(es) - + Scale: %1x %1 is the resolution scaling factor Escala: %1x - + Speed: %1% / %2% Velocidad: %1% / %2% - + Speed: %1% Velocidad: %1% - + Game: %1 FPS Juego: %1 FPS - + Frame: %1 ms Fotograma: %1 ms - + NO AA NO AA - + NO FX - + FX - + VOLUME: MUTE VOLUMEN: SILENCIADO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUMEN: %1% - + Derivation Components Missing Componentes de derivación ausentes - + Decryption keys are missing. Install them now? Las claves de desencriptado están ausentes. ¿Desea instalarlas ahora? - + Wayland Detected! ¡Wayland detectado! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8097,74 +8080,74 @@ Se recomienda usar X11 en su lugar. ¿Le gustaría forzar a usarlo en futuras ejecuciones? - + Use X11 Usar X11 - + Continue with Wayland Continuar con Wayland - + Don't show again No mostrar de nuevo - + Restart Required Reinicio requerido - + Restart Eden to apply the X11 backend. Reinicie Eden para aplicar el motor X11. - + Slow Lento - + Turbo Turbo - + Unlocked Desbloqueado - + Select RomFS Dump Target Seleccione el destinatario para el volcado del RomFS - + Please select which RomFS you would like to dump. Por favor seleccione que RomFS desea volcar. - + Are you sure you want to close Eden? ¿Está seguro de que quiere cerrar Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. ¿Está seguro de que desea parar la emulación? Cualquier progreso sin guardar se perderá. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index bd5898a82f..5918e93a67 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -786,1332 +786,1315 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: - + The region of the console. - + Time Zone: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate - - - + + + Default - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - - Strict - - - - + Unsafe - + Paranoid (disables most optimizations) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed - + Exclusive Fullscreen - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - + Bilinear - + Bicubic - + Gaussian - + Lanczos - + ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None - + FXAA - + SMAA - + Default (16:9) - + Force 4:3 - + Force 21:9 - + Force 16:10 - + Stretch to Window - + Automatic - + 2x - + 4x - + 8x - + 16x - + Japanese (日本語) - + American English - + French (français) - + German (Deutsch) - + Italian (italiano) - + Spanish (español) - + Chinese - + Korean (한국어) - + Dutch (Nederlands) - + Portuguese (português) - + Russian (Русский) - + Taiwanese - + British English - + Canadian French - + Latin American Spanish - + Simplified Chinese - + Traditional Chinese (正體中文) - + Brazilian Portuguese (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan - + USA - + Europe - + Australia - + China - + Korea - + Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET - + CST6CDT - + Cuba - + EET - + Egypt - + Eire - + EST - + EST5EDT - + GB - + GB-Eire - + GMT - + GMT+0 - + GMT-0 - + GMT0 - + Greenwich - + Hongkong - + HST - + Iceland - + Iran - + Israel - + Jamaica - + Kwajalein - + Libya - + MET - + MST - + MST7MDT - + Navajo - + NZ - + NZ-CHAT - + Poland - + Portugal - + PRC - + PST8PDT - + ROC - + ROK - + Singapore - + Turkey - + UCT - + Universal - + UTC - + W-SU - + WET - + Zulu - + Mono - + Stereo - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked - + Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6952,7 +6935,7 @@ Debug Message: - + &Pause &Pysäytä @@ -7103,7 +7086,7 @@ Debug Message: - + &Start &Käynnistä @@ -7114,7 +7097,7 @@ Debug Message: - + R&ecord @@ -7205,7 +7188,7 @@ Debug Message: - + None @@ -7231,737 +7214,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7969,74 +7952,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index 5d9bb8908a..70562e75f1 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -825,105 +825,93 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation Activer la compilation asynchrone des shaders - + May reduce shader stutter. Peut réduire les saccades dues aux shaders. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Utiliser le cache de pipeline Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Active le cache de pipeline spécifique au fournisseur de GPU. Cette option peut améliorer considérablement le temps de chargement des shaders dans les cas où le pilote Vulkan ne stocke pas les fichiers de cache de pipeline en interne. - + Enable Compute Pipelines (Intel Vulkan Only) Activer les pipelines de calcul (Vulkan sur Intel uniquement) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -932,95 +920,95 @@ Ce réglage n’existe que pour les pilotes propriétaires Intel et peut provoqu Les pipelines de calcul sont toujours activés sur tous les autres pilotes. - + Enable Reactive Flushing Activer le Vidage Réactif - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Utilise une purge réactive au lieu d'une purge prédictive, permettant une synchronisation de la mémoire plus précise. - + Sync to framerate of video playback Synchro la fréquence d'image de la relecture du vidéo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Éxécuter le jeu à une vitesse normale pendant la relecture du vidéo, même-ci la fréquence d'image est dévérouillée. - + Barrier feedback loops Boucles de rétroaction de barrière - + Improves rendering of transparency effects in specific games. Améliore le rendu des effets de transparence dans des jeux spécifiques. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State État dynamique étendu - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading Échantillonnage de shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permet au shader de fragments de s’exécuter pour chaque échantillon dans un fragment multi-échantillonné, au lieu d’une seule fois par fragment. @@ -1028,96 +1016,96 @@ Améliore la qualité graphique au prix de performances réduites. Des valeurs plus élevées améliorent la qualité mais dégradent les performances. - + RNG Seed Seed RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Contrôle la graine du générateur de nombres aléatoires. Principalement utilisé pour le speedrun. - + Device Name Nom de l'appareil - + The name of the console. Nom de la console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Date RTC personnalisée : - + This option allows to change the clock of the console. Can be used to manipulate time in games. Cette option permet de modifier l’horloge de la console. Peut être utilisée pour manipuler le temps dans les jeux. - + The number of seconds from the current unix time Nombre de secondes écoulées depuis le 1er janvier 1970. - + Language: Langue : - + This option can be overridden when region setting is auto-select Cette option peut être remplacée lorsque la région est sur auto. - + Region: Région : - + The region of the console. Région de la console. - + Time Zone: Fuseau horaire : - + The time zone of the console. Fuseau horaire de la console. - + Sound Output Mode: Mode de sortie sonore : - + Console Mode: Mode console : - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1126,1042 +1114,1037 @@ Les jeux adaptent leur résolution, leurs paramètres graphiques et les manettes Passer en mode Portable peut améliorer les performances sur les systèmes peu puissants. - + Prompt for user profile on boot Choisir l’utilisateur au démarrage. - + Useful if multiple people use the same PC. Utile si plusieurs personnes utilisent le même PC. - + Pause when not in focus Pause lorsque la fenêtre n’est pas active. - + Pauses emulation when focusing on other windows. Met l’émulation en pause dès que l’utilisateur change de fenêtre. - + Confirm before stopping emulation Confirmer avant d'arrêter l'émulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Ignore les demandes de confirmation pour arrêter l’émulation. L’activer permet de contourner ces confirmations et de quitter directement l’émulation. - + Hide mouse on inactivity Cacher la souris en cas d'inactivité - + Hides the mouse after 2.5s of inactivity. Cache le curseur après 2,5 secondes d’inactivité. - + Disable controller applet Désactiver l'applet du contrôleur - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Désactive de force le menu de configuration des manettes dans les programmes émulés. Lorsqu’un programme tente d’ouvrir ce menu, il est immédiatement fermé. - + Check for updates Rechercher des mises à jours - + Whether or not to check for updates upon startup. Vérifier ou non les mises à jour au démarrage. - + Enable Gamemode Activer le mode jeu - + Force X11 as Graphics Backend Forcer X11 comme moteur graphique - + Custom frontend Interface personnalisée - + Real applet Applet réel - + Never Jamais - + On Load Au chargement - + Always Toujours - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asynchrone - + Uncompressed (Best quality) Non compressé (Meilleure qualité) - + BC1 (Low quality) BC1 (Basse qualité) - + BC3 (Medium quality) BC3 (Qualité moyenne) - - + + Auto Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Conservateur - + Aggressive Agressif - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Nul - + Fast Rapide - - - + + + Accurate Précis - - - + + + Default Par défaut - + Unsafe (fast) Insecure (rapide) - + Safe (stable) Sûr (stable) - + Immediate - + Balanced Moyen - - Strict - - - - + Unsafe Risqué - + Paranoid (disables most optimizations) Paranoïaque (désactive la plupart des optimisations) - + Debugging Débogage - + Dynarmic Dynamique - + NCE NCE - + Borderless Windowed Fenêtré sans bordure - + Exclusive Fullscreen Plein écran exclusif - + No Video Output Pas de sortie vidéo - + CPU Video Decoding Décodage Vidéo sur le CPU - + GPU Video Decoding (Default) Décodage Vidéo sur le GPU (par défaut) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPÉRIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPÉRIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1,25X (900p/1350p) [EXPÉRIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPÉRIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Plus proche voisin - + Bilinear Bilinéaire - + Bicubic Bicubique - + Gaussian Gaussien - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area (Par zone) - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Aucun - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Par défaut (16:9) - + Force 4:3 Forcer le 4:3 - + Force 21:9 Forcer le 21:9 - + Force 16:10 Forcer le 16:10 - + Stretch to Window Étirer à la fenêtre - + Automatic Automatique - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonais (日本語) - + American English Anglais Américain - + French (français) Français (français) - + German (Deutsch) Allemand (Deutsch) - + Italian (italiano) Italien (italiano) - + Spanish (español) Espagnol (español) - + Chinese Chinois - + Korean (한국어) Coréen (한국어) - + Dutch (Nederlands) Néerlandais (Nederlands) - + Portuguese (português) Portugais (português) - + Russian (Русский) Russe (Русский) - + Taiwanese Taïwanais - + British English Anglais Britannique - + Canadian French Français Canadien - + Latin American Spanish Espagnol d'Amérique Latine - + Simplified Chinese Chinois Simplifié - + Traditional Chinese (正體中文) Chinois Traditionnel (正體中文) - + Brazilian Portuguese (português do Brasil) Portugais Brésilien (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japon - + USA É.-U.A. - + Europe Europe - + Australia Australie - + China Chine - + Korea Corée - + Taiwan Taïwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Par défaut (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Égypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islande - + Iran Iran - + Israel Israël - + Jamaica Jamaïque - + Kwajalein Kwajalein - + Libya Libye - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Pologne - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapour - + Turkey Turquie - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stéréo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Par défaut) - + 6GB DRAM (Unsafe) 6 GB DRAM (Risqué) - + 8GB DRAM 8GO DRAM - + 10GB DRAM (Unsafe) 10GO DRAM (Insecure) - + 12GB DRAM (Unsafe) 12GO DRAM (Insecure) - + Docked Mode TV - + Handheld Mode Portable - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Toujours demander (par défaut) - + Only if game specifies not to stop Uniquement si le jeu précise de ne pas s'arrêter - + Never ask Jamais demander - + Very Small (16 MB) Très petit (16Mo) - + Small (32 MB) Petit (32Mo) - + Normal (128 MB) Normal (128Mo) - + Large (256 MB) Large (256Mo) - + Very Large (512 MB) Très large (512Mo) - + Very Low (4 MB) Très faible (4 Mo) - + Low (8 MB) Faible (8 Mo) - + Normal (16 MB) Normal (16 Mo) - + Medium (32 MB) Moyen (32 Mo) - + High (64 MB) Élevé (64 Mo) - + Very Low (32) Très faible (32) - + Low (64) Faible (64) - + Normal (128) Normal (128) - + Medium (256) Moyen (256) - + High (512) Élevé (512) - + Disabled Désactivé - + ExtendedDynamicState 1 État dynamique étendu 1 - + ExtendedDynamicState 2 État dynamique étendu 2 - + ExtendedDynamicState 3 État dynamique étendu 3 - + Tree View Vue en liste - + Grid View Vue en grille @@ -7042,7 +7025,7 @@ Message de débogage : - + &Pause &Pause @@ -7193,7 +7176,7 @@ Message de débogage : - + &Start &Démarrer @@ -7204,7 +7187,7 @@ Message de débogage : - + R&ecord En&registrer @@ -7295,7 +7278,7 @@ Message de débogage : - + None Aucun @@ -7321,737 +7304,737 @@ Message de débogage : - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Remettre le son - + Mute Couper le son - + Reset Volume Réinitialiser le volume - + Configure Effects... - + &Clear Recent Files - + &Continue &Continuer - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... Fermeture du logiciel... - + Save Data Données de sauvegarde - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? Réinitialiser le temps de jeu ? - - + + RomFS Extraction Failed! L'extraction de la RomFS a échoué ! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel Annuler - + RomFS Extraction Succeeded! Extraction de la RomFS réussi ! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties Propriétés - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game Jeu - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install Échec de l'installation - + The title type you selected for the NCA is invalid. - + File not found Fichier non trouvé - + File "%1" not found - + OK OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed - + Error Erreur - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo Charger un Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted Firmware corrompu - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE VOLUME : MUET - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! Wayland détecté ! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8059,74 +8042,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/hu.ts b/dist/languages/hu.ts index 2b5a634afa..7e4617a12c 100644 --- a/dist/languages/hu.ts +++ b/dist/languages/hu.ts @@ -792,1332 +792,1315 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Vulkan pipeline gyorsítótár használata. - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Reaktív ürítés használata - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Reaktív ürítést használ a prediktív ürítés helyett, ami pontosabb memóriaszinkronizálást tesz lehetővé. - + Sync to framerate of video playback Szinkronizálás a videolejátszás képkockasebességéhez - + Run the game at normal speed during video playback, even when the framerate is unlocked. A játék futtatása normál sebességgel videolejátszás közben, még akkor is, ha a képkockasebesség fel van oldva. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. Javítja az átlátszósági effektek megjelenítését bizonyos játékokban. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Eszköznév - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Egyéni RTC dátum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Nyelv: - + This option can be overridden when region setting is auto-select - + Region: Régió: - + The region of the console. - + Time Zone: Időzóna: - + The time zone of the console. - + Sound Output Mode: Hangkimeneti mód: - + Console Mode: Konzol mód: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Emuláció leállításának megerősítése - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Egér elrejtése inaktivitáskor - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Vezérlő applet letiltása - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Játékmód engedélyezése - + Force X11 as Graphics Backend - + Custom frontend Egyéni frontend - + Real applet Valódi applet - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU aszinkron - + Uncompressed (Best quality) Tömörítetlen (legjobb minőség) - + BC1 (Low quality) BC1 (alacsony minőség) - + BC3 (Medium quality) BC3 (közepes minőség) - - + + Auto Automatikus - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Takarékos - + Aggressive Aggresszív - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Pontos - - - + + + Default Alapértelmezett - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - - Strict - - - - + Unsafe Nem biztonságos - + Paranoid (disables most optimizations) Paranoid (a legtöbb optimalizálást letiltja) - + Debugging - + Dynarmic Dinamikus - + NCE NCE - + Borderless Windowed Szegély nélküli ablak - + Exclusive Fullscreen Exkluzív teljes képernyő - + No Video Output Nincs videokimenet - + CPU Video Decoding CPU videódekódolás - + GPU Video Decoding (Default) GPU videódekódolás (alapértelmezett) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [KÍSÉRLETI] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [KÍSÉRLETI] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [KÍSÉRLETI] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Legközelebbi szomszéd - + Bilinear Bilineáris - + Bicubic Bikubikus - + Gaussian Gauss-féle - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nincs - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Alapértelmezett (16:9) - + Force 4:3 4:3 kényszerítése - + Force 21:9 21:9 kényszerítése - + Force 16:10 16:10 kényszerítése - + Stretch to Window Ablakhoz nyújtás - + Automatic Automatikus - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japán (日本語) - + American English Amerikai angol - + French (français) Francia (français) - + German (Deutsch) Német (Deutsch) - + Italian (italiano) Olasz (italiano) - + Spanish (español) Spanyol (español) - + Chinese Kínai - + Korean (한국어) Koreai (한국어) - + Dutch (Nederlands) Holland (Nederlands) - + Portuguese (português) Portugál (português) - + Russian (Русский) Orosz (Русский) - + Taiwanese Tajvani - + British English Brit Angol - + Canadian French Kanadai francia - + Latin American Spanish Latin-amerikai spanyol - + Simplified Chinese Egyszerűsített kínai - + Traditional Chinese (正體中文) Hagyományos kínai (正體中文) - + Brazilian Portuguese (português do Brasil) Brazíliai portugál (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japán - + USA USA - + Europe Európa - + Australia Ausztrália - + China Kína - + Korea Korea - + Taiwan Tajvan - + Auto (%1) Auto select time zone Automatikus (%1) - + Default (%1) Default time zone Alapértelmezett (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egyiptom - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Izland - + Iran Irán - + Israel Izrael - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navahó - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Lengyelország - + Portugal Portugália - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Szingapúr - + Turkey Törökország - + UCT UCT - + Universal Univerzális - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Sztereó - + Surround Térhangzás - + 4GB DRAM (Default) 4GB DRAM (Alapértelmezett) - + 6GB DRAM (Unsafe) 6GB DRAM (Nem biztonságos) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokkolt - + Handheld Kézi - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Mindig kérdezz rá (alapértelmezett) - + Only if game specifies not to stop Csak akkor, ha a játék kifejezetten kéri a folytatást. - + Never ask Soha ne kérdezz rá - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6968,7 +6951,7 @@ Debug Message: - + &Pause &Szünet @@ -7119,7 +7102,7 @@ Debug Message: - + &Start &Indítás @@ -7130,7 +7113,7 @@ Debug Message: - + R&ecord F&elvétel @@ -7221,7 +7204,7 @@ Debug Message: - + None @@ -7247,737 +7230,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -7985,74 +7968,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/id.ts b/dist/languages/id.ts index f2ae975eca..160fa812be 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -803,1333 +803,1316 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation Gunakan kompilasi shader asinkron - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Gunakan pipeline cache Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Memungkinkan cache pipeline spesifik vendor GPU. Opsi ini dapat meningkatkan waktu pemuatan shader secara signifikan dalam kasus di mana driver Vulkan tidak menyimpan file cache pipeline secara internal. - + Enable Compute Pipelines (Intel Vulkan Only) Aktifkan Pipa Komputasi (Hanya Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Aktifkan Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Menggunakan pemadatan reaktif alih-alih pemadatan prediktif, memungkinkan sinkronisasi memori yang lebih akurat. - + Sync to framerate of video playback Sinkronkan dengan kecepatan pemutaran video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Jalankan permainan dengan kecepatan normal selama pemutaran video, bahkan ketika framerate tidak terkunci. - + Barrier feedback loops Loop umpan balik penghalang - + Improves rendering of transparency effects in specific games. Meningkatkan rendering efek transparansi dalam game tertentu. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects Perbaiki efek bloom - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading Pencahayaan Sampel - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Benih RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Nama Perangkat - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Tanggal RTC Kustom: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Bahasa - + This option can be overridden when region setting is auto-select - + Region: Wilayah: - + The region of the console. - + Time Zone: Zona Waktu: - + The time zone of the console. - + Sound Output Mode: Mode keluaran suara. - + Console Mode: Mode Konsol - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Konfirmasi sebelum menghentikan emulasi - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Sembunyikan mouse saat tidak aktif - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Nonaktifkan aplikasi pengontrol - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates Cek Pembaruan - + Whether or not to check for updates upon startup. - + Enable Gamemode Aktifkan Mode Permainan - + Force X11 as Graphics Backend - + Custom frontend Tampilan depan kustom - + Real applet Aplikasi nyata - + Never Tidak Pernah - + On Load - + Always Selalu - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU sinkron - + Uncompressed (Best quality) Tidak terkompresi (Kualitas Terbaik) - + BC1 (Low quality) BC1 (Kualitas rendah) - + BC3 (Medium quality) BC3 (Kualitas sedang) - - + + Auto Otomatis - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Konservatif - + Aggressive Agresif - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast Cepat - - - + + + Accurate Akurat - - - + + + Default Bawaan - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced Seimbang - - Strict - - - - + Unsafe Berbahaya - + Paranoid (disables most optimizations) Paranoid (menonaktifkan sebagian besar optimasi) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Layar Tanpa Batas - + Exclusive Fullscreen Layar Penuh Eksklusif - + No Video Output Tidak ada Keluaran Suara - + CPU Video Decoding Penguraian Video menggunakan CPU - + GPU Video Decoding (Default) Penguraian Video menggunakan GPU (Bawaan) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EKSPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EKSPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EKSPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Biliner - + Bicubic Bikubik - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Tak ada - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Bawaan (16:9) - + Force 4:3 Paksa 4:3 - + Force 21:9 Paksa 21:9 - + Force 16:10 Paksa 16:10 - + Stretch to Window Regangkan ke Layar - + Automatic Otomatis - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Jepang (日本語) - + American English Bahasa Inggris Amerika - + French (français) Prancis (français) - + German (Deutsch) Jerman (Deutsch) - + Italian (italiano) Italia (italiano) - + Spanish (español) Spanyol (español) - + Chinese Cina - + Korean (한국어) Korea (한국어) - + Dutch (Nederlands) Belanda (Nederlands) - + Portuguese (português) Portugis (português) - + Russian (Русский) Rusia (Русский) - + Taiwanese Taiwan - + British English Inggris Britania - + Canadian French Prancis Kanada - + Latin American Spanish Spanyol Amerika Latin - + Simplified Chinese Cina Sederhana - + Traditional Chinese (正體中文) Cina Tradisional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugis Brazil (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Jepang - + USA USA - + Europe Eropa - + Australia Australia - + China Tiongkok - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Bawaan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Mesir - + Eire Éire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Éire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polandia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turki - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Bawaan) - + 6GB DRAM (Unsafe) 6GB DRAM (Tidak Aman) - + 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Tidak Aman) - + 12GB DRAM (Unsafe) 12GB DRAM (Tidak Aman) - + Docked Terpasang - + Handheld Jinjing - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Selalu tanyakan (Bawaan) - + Only if game specifies not to stop Hanya jika permainan menentukan untuk tidak berhenti - + Never ask Jangan pernah bertanya - + Very Small (16 MB) Sangat Kecil (16 MB) - + Small (32 MB) Kecil (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Sedang (256) - + High (512) Tinggi (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -7002,7 +6985,7 @@ Debug Message: - + &Pause &Jeda @@ -7153,7 +7136,7 @@ Debug Message: - + &Start &Mulai @@ -7164,7 +7147,7 @@ Debug Message: - + R&ecord R&ekam @@ -7255,7 +7238,7 @@ Debug Message: - + None @@ -7281,737 +7264,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8019,74 +8002,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/it.ts b/dist/languages/it.ts index caac64d9ed..c0b01945ad 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -826,105 +826,93 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation Abilita la compilazione asincrona degli shader - + May reduce shader stutter. Può ridurre i fenomeni di stuttering (scatti) causati dagli shader. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Usa la cache delle pipeline di Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Abilita la cache delle pipeline specifica del produttore della GPU. Quest'opzione può ridurre di molto i tempi di caricamento degli shader nei casi in cui il driver Vulkan non memorizza la cache delle pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Abilita le compute pipeline (solo per Vulkan su Intel) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -933,192 +921,192 @@ Quest'impostazione esiste solo per i driver proprietari Intel e potrebbe fa Le compute pipelines sono sempre attivate su tutti gli altri drivers. - + Enable Reactive Flushing Abilita il flushing reattivo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Utilizza il flushing reattivo invece di quello predittivo, al fine di ottenere una sincronizzazione della memoria più accurata. - + Sync to framerate of video playback Sincronizza il framerate a quello del video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Esegue il gioco a velocità normale durante le cutscene, anche quando il framerate è sbloccato. - + Barrier feedback loops Barrier feedback loops - + Improves rendering of transparency effects in specific games. Migliora il rendering degli effetti di trasparenza in alcuni giochi. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State Stato dinamico esteso - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Controlla il numero di funzionalità che possono essere usate con lo stato dinamico esteso. Gli stati più alti consentono più funzionalità e possono migliorare le prestazioni, ma possono causare ulteriori problemi grafici. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading Sample shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permette al fragment shader di eseguire per campione in un frammento multi-campione invece che una volta per frammento. Migliora la qualità grafica a scapito delle prestazioni. Alti valori migliorano la qualità ma peggiorano le prestazioni. - + RNG Seed Seed RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Controlla il seme del generatore di numeri casuali. Principalmente utilizzato per le speedrun. - + Device Name Nome del dispositivo - + The name of the console. Il nome della console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Data RTC personalizzata: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Quest'opzione permette di modificare l'orologio della console. Può essere usato per manipolare il tempo nei giochi. - + The number of seconds from the current unix time Il numero di secondi dal tempo Unix attuale - + Language: Lingua: - + This option can be overridden when region setting is auto-select Può essere rimpiazzato se il fuso orario della Regione è impostato su Auto - + Region: Regione: - + The region of the console. La regione della console. - + Time Zone: Fuso orario: - + The time zone of the console. Il fuso orario della console. - + Sound Output Mode: Modalità di output del suono: - + Console Mode: Modalità console: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1127,1042 +1115,1037 @@ I giochi ne terranno conto e modificheranno la risoluzione, i dettagli e i contr Impostare l'opzione su "Portatile" può aiutare a migliorare le prestazioni sui sistemi meno potenti. - + Prompt for user profile on boot Scegli il profilo utente all'avvio - + Useful if multiple people use the same PC. Utile se più persone utilizzano lo stesso PC. - + Pause when not in focus Metti in pausa quando la finestra non è in primo piano - + Pauses emulation when focusing on other windows. Mette in pausa l'emulazione quando altre finestre sono in primo piano. - + Confirm before stopping emulation Chiedi conferma prima di arrestare l'emulazione - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Sovrascrive le richieste di conferma per fermare l'emulazione. Abilitarla bypassa queste richieste e l'emulazione cesserà immediatamente. - + Hide mouse on inactivity Nascondi il puntatore del mouse se inattivo - + Hides the mouse after 2.5s of inactivity. Nasconde il mouse dopo 2,5 secondi di inattività. - + Disable controller applet Disabilita l'applet controller - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Disabilita forzatamente l'uso dell'applet del controller nei programmi emulati. Quando un programma proverà ad aprire l'applet del controller, quest'ultimo verrà immediatamente chiuso. - + Check for updates Controlla la presenza di aggiornamenti - + Whether or not to check for updates upon startup. Determina se controllare o meno la presenza di aggiornamenti all'avvio. - + Enable Gamemode Abilita Gamemode - + Force X11 as Graphics Backend Forza l'uso del back-end grafico X11 - + Custom frontend Frontend personalizzato - + Real applet Applet reale - + Never Mai - + On Load Al caricamento - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU (Asincrono) - + Uncompressed (Best quality) Nessuna compressione (qualità migliore) - + BC1 (Low quality) BC1 (qualità bassa) - + BC3 (Medium quality) BC3 (qualità media) - - + + Auto Automatico - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservativa - + Aggressive Aggressiva - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (shader assembly, solo NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (sperimentale, solo AMD/MESA) - + Null Nullo - + Fast Veloce - - - + + + Accurate Accurata - - - + + + Default Predefinito - + Unsafe (fast) Non sicuro (veloce) - + Safe (stable) Sicuro (stabile) - + Immediate - + Balanced Bilanciata - - Strict - - - - + Unsafe Non sicura - + Paranoid (disables most optimizations) Paranoica (disabilita la maggior parte delle ottimizzazioni) - + Debugging Debug - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Finestra senza bordi - + Exclusive Fullscreen Schermo intero esclusivo - + No Video Output Nessun output video - + CPU Video Decoding Decodifica video CPU - + GPU Video Decoding (Default) Decodifica video GPU (predefinita) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [SPERIMENTALE] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [SPERIMENTALE] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [SPERIMENTALE] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [SPERIMENTALE] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [SPERIMENTALE] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest neighbor - + Bilinear Bilineare - + Bicubic Bicubico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nessuna - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Predefinito (16:9) - + Force 4:3 Forza 4:3 - + Force 21:9 Forza 21:9 - + Force 16:10 Forza 16:10 - + Stretch to Window Allunga a finestra - + Automatic Automatico - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Giapponese (日本語) - + American English Inglese americano - + French (français) Francese (français) - + German (Deutsch) Tedesco (Deutsch) - + Italian (italiano) Italiano - + Spanish (español) Spagnolo (español) - + Chinese Cinese - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Olandese (Nederlands) - + Portuguese (português) Portoghese (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanese - + British English Inglese britannico - + Canadian French Francese canadese - + Latin American Spanish Spagnolo latino-americano - + Simplified Chinese Cinese semplificato - + Traditional Chinese (正體中文) Cinese tradizionale (正體中文) - + Brazilian Portuguese (português do Brasil) Portoghese brasiliano (português do Brasil) - + Polish (polska) Polacco (polska) - + Thai (แบบไทย) Thailandese (แบบไทย) - - + + Japan Giappone - + USA USA - + Europe Europa - + Australia Australia - + China Cina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatico (%1) - + Default (%1) Default time zone Predefinito (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egitto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islanda - + Iran Iran - + Israel Israele - + Jamaica Giamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portogallo - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turchia - + UCT UCT - + Universal Universale - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Predefinito) - + 6GB DRAM (Unsafe) 6GB DRAM (Non sicuro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Non sicuro) - + 12GB DRAM (Unsafe) 12GB DRAM (Non sicuro) - + Docked Dock - + Handheld Portatile - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Chiedi sempre (Predefinito) - + Only if game specifies not to stop Solo se il gioco richiede di non essere arrestato - + Never ask Non chiedere mai - + Very Small (16 MB) Molto piccola (16 MB) - + Small (32 MB) Piccola (32 MB) - + Normal (128 MB) Normale (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Molto grande (512 MB) - + Very Low (4 MB) Molto bassa (4 MB) - + Low (8 MB) Bassa (8 MB) - + Normal (16 MB) Normale (16 MB) - + Medium (32 MB) Media (32 MB) - + High (64 MB) Alta (64 MB) - + Very Low (32) Molto basso (32) - + Low (64) Basso (64) - + Normal (128) Normale (128) - + Medium (256) Medio (256) - + High (512) Alto (512) - + Disabled Disabilitato - + ExtendedDynamicState 1 Stato dinamico esteso 1 - + ExtendedDynamicState 2 Stato dinamico esteso 2 - + ExtendedDynamicState 3 Stato dinamico esteso 3 - + Tree View Vista ad albero - + Grid View Vista a griglia @@ -7062,7 +7045,7 @@ Messaggio debug: - + &Pause &Pausa @@ -7213,7 +7196,7 @@ Messaggio debug: - + &Start &Avvia @@ -7224,7 +7207,7 @@ Messaggio debug: - + R&ecord R&egistra @@ -7315,7 +7298,7 @@ Messaggio debug: - + None Nessuno @@ -7341,405 +7324,405 @@ Messaggio debug: - + Small (32x32) Piccola (32x32) - + Standard (64x64) Normale (64x64) - + Large (128x128) Grande (128x128) - + Full Size (256x256) Intera (256x256) - + Broken Vulkan Installation Detected Rilevata installazione di Vulkan non funzionante - + Vulkan initialization failed during boot. L'inizializzazione di Vulkan è fallita durante l'avvio. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Gioco in esecuzione - + Loading Web Applet... Caricamento dell'applet web... - - + + Disable Web Applet Disabilita l'applet web - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Disabilitare l'applet web potrebbe causare dei comportamenti indesiderati e andrebbe fatto solo con Super Mario 3D All-Stars. Sei sicuro di voler procedere? (Puoi riabilitarlo quando vuoi nelle impostazioni di debug.) - + The amount of shaders currently being built Il numero di shader in fase di compilazione - + The current selected resolution scaling multiplier. Il moltiplicatore attuale della risoluzione. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocità attuale dell'emulazione. Valori più alti o più bassi di 100% indicano che l'emulazione sta funzionando più velocemente o lentamente rispetto a una Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Il numero di fotogrammi al secondo che il gioco sta attualmente renderizzando. Può variare in base al gioco e alla situazione. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tempo necessario per emulare un fotogramma della Switch, senza tenere conto del limite al framerate o del V-Sync. Per un'emulazione alla massima velocità, il valore non dovrebbe essere superiore a 16.67 ms. - + Unmute Riattiva - + Mute Silenzia - + Reset Volume Reimposta volume - + Configure Effects... - + &Clear Recent Files &Cancella i file recenti - + &Continue &Continua - + Warning: Outdated Game Format Attenzione: Formato del gioco obsoleto - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Stai usando una cartella contenente una ROM decostruita per avviare questo gioco, che è un formato obsoleto e sostituito da NCA, NAX, XCI o NSP. Le ROM decostruite non hanno icone né metadati e non supportano gli aggiornamenti.<br>Per una spiegazione sui vari formati della console Switch supportati da Eden, consulta il manuale utente. Non riceverai di nuovo questo avviso. - - + + Error while loading ROM! Errore nel caricamento della ROM! - + The ROM format is not supported. Il formato della ROM non è supportato. - + An error occurred initializing the video core. Errore durante l'inizializzazione del componente video di base - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Errore nel caricamento della ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Esegui un nuovo dump dei tuoi file o chiedi aiuto su Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Si è verificato un errore sconosciuto. Consulta il log per maggiori dettagli. - - + + (64-bit) (64 bit) - - + + (32-bit) (32 bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Chiusura del software in corso... - + Save Data Dati di salvataggio - + Mod Data Dati delle mod - + Error Opening %1 Folder Impossibile aprire la cartella %1 - - + + Folder does not exist! La cartella non esiste! - + Remove Installed Game Contents? Rimuovere il contenuto del gioco installato? - + Remove Installed Game Update? Rimuovere l'aggiornamento installato? - + Remove Installed Game DLC? Rimuovere il DLC installato? - + Remove Entry Rimuovi voce - + Delete OpenGL Transferable Shader Cache? Vuoi rimuovere la cache trasferibile degli shader OpenGL? - + Delete Vulkan Transferable Shader Cache? Vuoi rimuovere la cache trasferibile degli shader Vulkan? - + Delete All Transferable Shader Caches? Vuoi rimuovere tutte le cache trasferibili degli shader? - + Remove Custom Game Configuration? Rimuovere la configurazione personalizzata del gioco? - + Remove Cache Storage? Rimuovere la cache del gioco? - + Remove File Rimuovi file - + Remove Play Time Data Reimposta il tempo di gioco - + Reset play time? Vuoi reimpostare il tempo di gioco? - - + + RomFS Extraction Failed! Estrazione RomFS fallita! - + There was an error copying the RomFS files or the user cancelled the operation. Si è verificato un errore durante la copia dei file del RomFS o l'operazione è stata annullata dall'utente. - + Full Completa - + Skeleton Cartelle - + Select RomFS Dump Mode Seleziona la modalità di estrazione del RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Seleziona come vorresti estrarre il RomFS. <br>La modalità Completa copierà tutti i file in una nuova cartella mentre<br>la modalità Cartelle creerà solamente la struttura delle cartelle. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Non c'è abbastanza spazio disponibile in %1 per estrarre il RomFS. Libera lo spazio o seleziona una cartella di estrazione diversa in Emulazione > Configura > Sistema > File system > Cartella di estrazione - + Extracting RomFS... Estrazione RomFS in corso... - - + + Cancel Annulla - + RomFS Extraction Succeeded! Estrazione RomFS riuscita! - + The operation completed successfully. L'operazione è stata completata con successo. - + Error Opening %1 Impossibile aprire %1 - + Select Directory Seleziona cartella - + Properties Proprietà - + The game properties could not be loaded. Non è stato possibile caricare le proprietà del gioco. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Eseguibile Switch (%1);;Tutti i file (*.*) - + Load File Carica file - + Open Extracted ROM Directory Apri la cartella della ROM estratta - + Invalid Directory Selected Cartella selezionata non valida - + The directory you have selected does not contain a 'main' file. La cartella che hai selezionato non contiene un file "main". - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) File Switch installabili (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Installa file - + %n file(s) remaining %n file rimanente%n di file rimanenti%n file rimanenti - + Installing file "%1"... Installazione del file "%1"... - - + + Install Results Risultati dell'installazione - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Per evitare possibli conflitti, sconsigliamo di installare i giochi base su NAND. Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) were newly installed %n nuovo file è stato installato @@ -7748,7 +7731,7 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) were overwritten %n file è stato sovrascritto @@ -7757,7 +7740,7 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + %n file(s) failed to install %n file non è stato installato a causa di errori @@ -7766,324 +7749,324 @@ Usa questa funzione solo per installare aggiornamenti e DLC. - + System Application Applicazione di sistema - + System Archive Archivio di sistema - + System Application Update Aggiornamento di un'applicazione di sistema - + Firmware Package (Type A) Pacchetto firmware (tipo A) - + Firmware Package (Type B) Pacchetto firmware (tipo B) - + Game Gioco - + Game Update Aggiornamento di gioco - + Game DLC DLC - + Delta Title Titolo delta - + Select NCA Install Type... Seleziona il tipo di installazione NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Seleziona il tipo del file NCA da installare: (Nella maggior parte dei casi, il valore predefinito "Gioco" va bene) - + Failed to Install Installazione fallita - + The title type you selected for the NCA is invalid. Il tipo che hai selezionato per il file NCA non è valido. - + File not found File non trovato - + File "%1" not found File "%1" non trovato - + OK OK - + Function Disabled Funzionalità disabilitata - + Compatibility list reporting is currently disabled. Check back later! La segnalazione della compatibilità è al momento disabilitata. Torna a controllare più avanti! - + Error opening URL Impossibile aprire l'URL - + Unable to open the URL "%1". Non è stato possibile aprire l'URL "%1". - + TAS Recording Registrazione TAS - + Overwrite file of player 1? Vuoi sovrascrivere il file del giocatore 1? - + Invalid config detected Rilevata configurazione non valida - + Handheld controller can't be used on docked mode. Pro controller will be selected. Il controller portatile non può essere utilizzato in modalità dock. Verrà selezionato il controller Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed L'Amiibo corrente è stato rimosso - + Error Errore - - + + The current game is not looking for amiibos Il gioco in uso non è alla ricerca di Amiibo - + Amiibo File (%1);; All Files (*.*) File Amiibo (%1);; Tutti i file (*.*) - + Load Amiibo Carica Amiibo - + Error loading Amiibo data Impossibile caricare i dati dell'Amiibo - + The selected file is not a valid amiibo Il file selezionato non è un Amiibo valido - + The selected file is already on use Il file selezionato è già in uso - + An unknown error occurred Si è verificato un errore sconosciuto - + No firmware available Nessun firmware disponibile - + Firmware Corrupted Firmware corrotto - + Unknown applet Applet sconosciuto - + Applet doesn't map to a known value. L'applet non è associato a un valore noto. - + Record not found Non trovato - + Applet not found. Please reinstall firmware. Applet non trovato. Reinstalla il firmware. - + Capture Screenshot Cattura screenshot - + PNG Image (*.png) Immagine PNG (*.png) - + TAS state: Running %1/%2 Stato TAS: In esecuzione (%1/%2) - + TAS state: Recording %1 Stato TAS: Registrazione in corso (%1) - + TAS state: Idle %1/%2 Stato TAS: In attesa (%1/%2) - + TAS State: Invalid Stato TAS: Non valido - + &Stop Running &Interrompi esecuzione - + Stop R&ecording Interrompi r&egistrazione - + Building: %n shader(s) Compilazione di %n shaderCompilazione di %n shaderCompilazione di %n shader - + Scale: %1x %1 is the resolution scaling factor Risoluzione: %1x - + Speed: %1% / %2% Velocità: %1% / %2% - + Speed: %1% Velocità: %1% - + Game: %1 FPS Gioco: %1 FPS - + Frame: %1 ms Frame: %1 ms - + NO AA NO AA - + NO FX - + FX - + VOLUME: MUTE VOLUME: MUTO - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUME: %1% - + Derivation Components Missing Componenti di derivazione mancanti - + Decryption keys are missing. Install them now? Chiavi di crittografia mancanti. Vuoi installarle ora? - + Wayland Detected! Wayland rilevato! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8094,74 +8077,74 @@ Si consiglia invece di usare X11. Vuoi forzare l'uso di quest'ultimo per i prossimi avvii? - + Use X11 Usa X11 - + Continue with Wayland Continua con Wayland - + Don't show again Non mostrare di nuovo - + Restart Required Riavvio richiesto - + Restart Eden to apply the X11 backend. Riavvia Eden per usare il back-end X11. - + Slow Lento - + Turbo Turbo - + Unlocked Sbloccato - + Select RomFS Dump Target Seleziona RomFS da estrarre - + Please select which RomFS you would like to dump. Seleziona quale RomFS vorresti estrarre. - + Are you sure you want to close Eden? Sei sicuro di voler uscire da Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Sei sicuro di voler arrestare l'emulazione? Tutti i progressi non salvati verranno perduti. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index 8aa2c78060..f16621c044 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -789,1332 +789,1315 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Vulkan パイプラインキャッシュを使用 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) コンピュート・パイプラインの有効化(インテル Vulkan のみ) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback ビデオ再生のフレームレートに同期する - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. 特定のゲームにおける透明エフェクトのレンダリングを改善します。 - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed 乱数シード値の変更 - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name デバイス名 - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: 言語: - + This option can be overridden when region setting is auto-select - + Region: 地域: - + The region of the console. - + Time Zone: タイムゾーン: - + The time zone of the console. - + Sound Output Mode: 音声出力モード: - + Console Mode: コンソールモード: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation エミュレーションを停止する前に確認する - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity 非アクティブ時にマウスカーソルを隠す - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet コントローラーアプレットの無効化 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 非同期 - + Uncompressed (Best quality) 圧縮しない (最高品質) - + BC1 (Low quality) BC1 (低品質) - + BC3 (Medium quality) BC3 (中品質) - - + + Auto 自動 - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (アセンブリシェーダー、NVIDIA のみ) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V(実験的、AMD/Mesaのみ) - + Null - + Fast - - - + + + Accurate 正確 - - - + + + Default デフォルト - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - - Strict - - - - + Unsafe 不安定 - + Paranoid (disables most optimizations) パラノイド (ほとんどの最適化を無効化) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed ボーダーレスウィンドウ - + Exclusive Fullscreen 排他的フルスクリーン - + No Video Output ビデオ出力しない - + CPU Video Decoding ビデオをCPUでデコード - + GPU Video Decoding (Default) ビデオをGPUでデコード (デフォルト) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [実験的] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [実験的] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [実験的] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area - + MMPX MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None なし - + FXAA FXAA - + SMAA SMAA - + Default (16:9) デフォルト (16:9) - + Force 4:3 強制 4:3 - + Force 21:9 強制 21:9 - + Force 16:10 強制 16:10 - + Stretch to Window ウィンドウに合わせる - + Automatic 自動 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日本語 - + American English アメリカ英語 - + French (français) フランス語 (français) - + German (Deutsch) ドイツ語 (Deutsch) - + Italian (italiano) イタリア語 (italiano) - + Spanish (español) スペイン語 (español) - + Chinese 中国語 - + Korean (한국어) 韓国語 (한국어) - + Dutch (Nederlands) オランダ語 (Nederlands) - + Portuguese (português) ポルトガル語 (português) - + Russian (Русский) ロシア語 (Русский) - + Taiwanese 台湾語 - + British English イギリス英語 - + Canadian French カナダフランス語 - + Latin American Spanish ラテンアメリカスペイン語 - + Simplified Chinese 簡体字中国語 - + Traditional Chinese (正體中文) 繁体字中国語 (正體中文) - + Brazilian Portuguese (português do Brasil) ブラジルポルトガル語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA アメリカ - + Europe ヨーロッパ - + Australia オーストラリア - + China 中国 - + Korea 韓国 - + Taiwan 台湾 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 既定 (%1) - + CET 中央ヨーロッパ時間 - + CST6CDT CST6CDT - + Cuba キューバ - + EET 東ヨーロッパ標準時 - + Egypt エジプト - + Eire アイルランド - + EST アメリカ東部標準時 - + EST5EDT EST5EDT - + GB GB - + GB-Eire イギリス-アイルランド - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich グリニッジ - + Hongkong 香港 - + HST ハワイ標準時 - + Iceland アイスランド - + Iran イラン - + Israel イスラエル - + Jamaica ジャマイカ - + Kwajalein クェゼリン - + Libya リビア - + MET 中東時間 - + MST MST - + MST7MDT MST7MDT - + Navajo ナバホ - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland ポーランド - + Portugal ポルトガル - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore シンガポール - + Turkey トルコ - + UCT UCT - + Universal ユニバーサル - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu ズールー - + Mono モノラル - + Stereo ステレオ - + Surround サラウンド - + 4GB DRAM (Default) 4GB DRAM (デフォルト) - + 6GB DRAM (Unsafe) 6GB DRAM (不安定) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld 携帯モード - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) 常に確認する (デフォルト) - + Only if game specifies not to stop ゲームが停止しないように指定しているときのみ - + Never ask 確認しない - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled 無効 - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6991,7 +6974,7 @@ Debug Message: - + &Pause 中断(&P) @@ -7142,7 +7125,7 @@ Debug Message: - + &Start 実行(&S) @@ -7153,7 +7136,7 @@ Debug Message: - + R&ecord 記録(&R) @@ -7244,7 +7227,7 @@ Debug Message: - + None @@ -7270,737 +7253,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8008,74 +7991,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index e636dc2030..881fe138d3 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -833,66 +833,48 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. - GPU 펜스 동기화 동작을 제어합니다. -즉시는 가장 빠른 옵션이지만 일부 문제가 발생할 수 있습니다. -균형은 호환성이 더 좋고 일부 게임에서 발생하는 문제를 해결할 수 있습니다. -정확은 성능 저하를 감수하고 호환성을 더욱 향상시킵니다. -엄격은 가장 느린 옵션이지만 더 엄격한 동기화가 필요한 문제를 해결할 수 있습니다. -기본값은 GPU 정확도 설정을 따릅니다. +Default follows the GPU Mode setting. + - Enable GPU buffer readback - GPU 버퍼 되읽기 활성화 - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - 수정된 GPU 데이터를 업로드하기 전에 다시 읽어들여 보존합니다. -일부 게임에서는 특정 효과를 제대로 렌더링하기 위해 이 기능이 필요합니다. - - - Enable asynchronous shader compilation 비동기 셰이더 컴파일 활성화 - + May reduce shader stutter. 셰이더 끊김 현상을 줄일 수 있습니다. - + GPU Clocks GPU 클럭 - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. 게임이 GPU 작업이 실제보다 더 빨리 완료된다고 착각하게 만들어, 스위치의 클럭 속도에 맞추기 위해 해상도와 렌더 거리를 낮추는 작업을 중단하게 합니다. - + GPU Unswizzle GPU 언스위즐 - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. GPU 컴퓨팅을 사용하여 BCn 3D 텍스처 디코딩을 가속화합니다. 충돌이나 그래픽 결함이 발생하는 경우 이 기능을 비활성화하세요. - + GPU Unswizzle Max Texture Size GPU 언스위즐 최대 텍스처 크기 - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -901,48 +883,48 @@ GPU는 중간 및 큰 크기의 텍스처에서 더 빠르지만, 매우 작은 이 값을 조정하여 GPU 가속과 CPU 오버헤드 간의 균형을 찾으세요. - + GPU Unswizzle Stream Size GPU 언스위즐 스트림 크기 - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. 프레임당 처리할 최대 텍스처 데이터 양(MiB 단위)을 설정합니다. 값이 높을수록 텍스처 로딩 중 끊김 현상을 줄일 수 있지만 프레임 일관성에 영향을 미칠 수 있습니다. - + GPU Unswizzle Chunk Size GPU 언스위즐 청크 크기 - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. 단일 디스패치에서 처리할 깊이 슬라이스 수를 결정합니다. 이 값을 높이면 고성능 GPU에서 처리량이 향상될 수 있지만, 성능이 낮은 하드웨어에서는 TDR 오류나 드라이버 시간 초과가 발생할 수 있습니다. - + Use Vulkan pipeline cache Vulkan 파이프라인 캐시 사용 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. GPU 제조사별 파이프라인 캐시를 활성화합니다. 이 옵션은 Vulkan 드라이버가 파이프라인 캐시 파일을 내부에 저장하지 않는 경우 셰이더 로딩 시간을 크게 향상시킬 수 있습니다. - + Enable Compute Pipelines (Intel Vulkan Only) 컴퓨트 파이프라인 활성화(인텔 Vulkan 전용) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -951,194 +933,194 @@ Compute pipelines are always enabled on all other drivers. 다른 모든 드라이버에서는 컴퓨트 파이프라인이 항상 활성화됩니다. - + Enable Reactive Flushing 반응형 플러싱 활성화 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 예측형 플러싱 대신 반응형 플러싱을 사용하여 보다 정확한 메모리 동기화를 가능하게 합니다. - + Sync to framerate of video playback 비디오 재생 프레임 속도에 동기화 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 프레임률 제한이 해제된 경우에도 비디오 재생 중에는 게임을 정상 속도로 실행합니다. - + Barrier feedback loops 피드백 루프 차단 - + Improves rendering of transparency effects in specific games. 특정 게임에서 투명 효과 렌더링을 개선합니다. - + Enable buffer history 버퍼 기록 활성화 - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. 이전 버퍼 상태에 접근할 수 있도록 합니다. 이 옵션은 일부 게임에서 렌더링 품질과 성능 일관성을 향상시킬 수 있습니다. - + Fix bloom effects 블룸 효과 수정 - + Removes bloom in Burnout. Burnout에서의 블룸 현상을 제거합니다. - + Enable Legacy Rescale Pass 기존 크기 조정 무시 활성화 - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. 이전 구현의 동작을 활용하여 일부 게임에서 발생하는 크기 조정 문제를 해결할 수 있습니다. 루이지 맨션 3에서 발생했던 AMD 및 인텔 GPU의 선 아티팩트 현상과 Nvidia GPU의 회색 텍스처 깜빡임 현상을 해결하는 기존 반응에 대한 예비 해결책입니다. - + Extended Dynamic State 확장된 동적 상태 - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. 확장된 동적 상태에서 사용할 수 있는 기능의 수를 제어합니다. 상태 수가 많을수록 더 많은 기능을 사용할 수 있고 성능이 향상될 수 있지만, 추가적인 그래픽 문제가 발생할 수 있습니다. - + Vertex Input Dynamic State 정점 입력 동적 상태 - + Enables vertex input dynamic state feature for better quality and performance. 정점 입력의 동적 상태 기능을 활성화하여 품질과 성능을 향상시킵니다. - + Sample Shading 샘플 셰이딩 - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. 조각 셰이더가 다중샘플 조각에서 한 번당 한 조각이 아닌 샘플별로 실행될 수 있도록 합니다. 성능 저하를 감수하고 그래픽 품질을 향상시킵니다. 값이 높을수록 품질은 향상되지만 성능은 저하됩니다. - + RNG Seed RNG 시드 - + Controls the seed of the random number generator. Mainly used for speedrunning. 난수 생성기의 시드 값을 제어합니다. 주로 스피드런에 사용됩니다. - + Device Name 장치 이름 - + The name of the console. 콘솔의 이름 - + Homebrew Args 홈브루 인수 - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). 홈브루 실행 시 전달되는 명령줄 인수(예: -noglsl). - + Custom RTC Date: 사용자 지정 RTC 날짜: - + This option allows to change the clock of the console. Can be used to manipulate time in games. 이 옵션을 사용하면 콘솔의 시간을 변경할 수 있습니다. 게임 내 시간을 조작하는 데 사용할 수 있습니다. - + The number of seconds from the current unix time 현재 unix 시간으로부터 경과한 초 수 - + Language: 언어: - + This option can be overridden when region setting is auto-select 이 옵션은 지역 설정이 자동 선택으로 되어 있을 경우 번복될 수 있습니다. - + Region: 지역: - + The region of the console. 콘솔의 지역 - + Time Zone: 시간대: - + The time zone of the console. 콘솔의 시간대 - + Sound Output Mode: 소리 출력 모드: - + Console Mode: 콘솔 모드: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1147,1042 +1129,1037 @@ Setting to Handheld can help improve performance for low end systems. 휴대 모드로 설정하면 저사양 시스템의 성능을 향상시키는 데 도움이 될 수 있습니다. - + Prompt for user profile on boot 부팅 시 유저 프로필 입력 요청 - + Useful if multiple people use the same PC. 여러 사람이 같은 PC를 사용할 때 유용합니다. - + Pause when not in focus 초점이 맞지 않을 때 일시 중지 - + Pauses emulation when focusing on other windows. 다른 창에 초점을 맞출 때 에뮬레이션을 일시 중지합니다. - + Confirm before stopping emulation 에뮬레이션을 중지하기 전에 확인 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. 에뮬레이션 중지를 확인하는 메시지를 무시합니다. 이 옵션을 활성화하면 이러한 메시지를 건너뛰고 에뮬레이션을 바로 종료합니다. - + Hide mouse on inactivity 마우스 커서가 비활동 상태일 때 숨기기 - + Hides the mouse after 2.5s of inactivity. 마우스 커서가 2.5초 동안 활동이 없으면 숨깁니다. - + Disable controller applet 컨트롤러 애플릿 비활성화 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. 에뮬레이트된 프로그램에서 컨트롤러 애플릿 사용을 강제적으로 비활성화합니다. 프로그램이 컨트롤러 애플릿을 열려고 하면 즉시 닫힙니다. - + Check for updates 업데이트 확인 - + Whether or not to check for updates upon startup. 시작 시 업데이트를 확인할지 여부. - + Enable Gamemode 게임 모드 활성화 - + Force X11 as Graphics Backend X11을 그래픽 백엔드로 강제 설정 - + Custom frontend 사용자 정의 프론트엔드 - + Real applet 실제 애플릿 - + Never 안 함 - + On Load 로드 시 - + Always 항상 - + CPU CPU - + GPU GPU - + CPU Asynchronous 비동기 CPU - + Uncompressed (Best quality) 비압축(최고 품질) - + BC1 (Low quality) BC1(저품질) - + BC3 (Medium quality) BC3(중간 품질) - - + + Auto 자동 - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative 소극적 - + Aggressive 적극적 - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM(어셈블리 셰이더, NVIDIA 전용) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V(실험적, AMD/Mesa 전용) - + Null Null - + Fast 고속 - - - + + + Accurate 정확 - - - + + + Default 기본값 - + Unsafe (fast) 불안전(빠름) - + Safe (stable) 안전(안정적) - + Immediate 즉시 - + Balanced 균형 - - Strict - 염격 - - - + Unsafe 불안전 - + Paranoid (disables most optimizations) 편집증적(대부분의 최적화를 비활성화함) - + Debugging 디버깅 - + Dynarmic 동적 - + NCE NCE - + Borderless Windowed 테두리 없는 창 - + Exclusive Fullscreen 독점 전체 화면 - + No Video Output 비디오 출력 없음 - + CPU Video Decoding CPU 비디오 디코딩 - + GPU Video Decoding (Default) GPU 비디오 디코딩(기본값) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [실험적] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [실험적] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [실험적] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [실험적] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [실험적] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 최단입점 - + Bilinear 쌍선형 - + Bicubic 쌍입방 - + Gaussian 가우시안 - + Lanczos 란초스 - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area 영역 - + MMPX MMPX - + Zero-Tangent 제로탄젠트 - + B-Spline B-스플라인 - + Mitchell 미첼 - + Spline-1 스플라인-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None 없음 - + FXAA FXAA - + SMAA SMAA - + Default (16:9) 기본(16:9) - + Force 4:3 강제 4:3 - + Force 21:9 강제 21:9 - + Force 16:10 강제 16:10 - + Stretch to Window 화면 늘리기 - + Automatic 자동 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 일본어(日本語) - + American English 미국식 영어 - + French (français) 프랑스어(français) - + German (Deutsch) 독일어(Deutsch) - + Italian (italiano) 이탈리아어(italiano) - + Spanish (español) 스페인어(español) - + Chinese 중국어 - + Korean (한국어) 한국어(Korean) - + Dutch (Nederlands) 네덜란드어(Nederlands) - + Portuguese (português) 포르투갈어(português) - + Russian (Русский) 러시아어(Русский) - + Taiwanese 대만어 - + British English 영국식 영어 - + Canadian French 캐나다 프랑스어 - + Latin American Spanish 라틴아메리카 스페인어 - + Simplified Chinese 중국어 간체 - + Traditional Chinese (正體中文) 중국어 번체(正體中文) - + Brazilian Portuguese (português do Brasil) 브라질 포르투갈어(português do Brasil) - + Polish (polska) 폴란드어(polska) - + Thai (แบบไทย) 태국어(แบบไทย) - - + + Japan 일본 - + USA 미국 - + Europe 유럽 - + Australia 호주 - + China 중국 - + Korea 대한민국 - + Taiwan 대만 - + Auto (%1) Auto select time zone 자동(%1) - + Default (%1) Default time zone 기본(%1) - + CET CET - + CST6CDT CST6CDT - + Cuba 쿠바 - + EET EET - + Egypt 이집트 - + Eire 아일랜드 - + EST EST - + EST5EDT EST5EDT - + GB 영국 - + GB-Eire 영국-아일랜드 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 그리니치 - + Hongkong 홍콩 - + HST HST - + Iceland 아이슬란드 - + Iran 이란 - + Israel 이스라엘 - + Jamaica 자메이카 - + Kwajalein 콰잘레인 - + Libya 리비아 - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo 나바호 - + NZ 뉴질랜드 - + NZ-CHAT 뉴질랜드-채텀 - + Poland 폴란드 - + Portugal 포르투갈 - + PRC 중국 - + PST8PDT PST8PDT - + ROC 대만 - + ROK 대한민국 - + Singapore 싱가포르 - + Turkey 터키 - + UCT UCT - + Universal 세계 - + UTC UTC - + W-SU 모스크바 - + WET WET - + Zulu Zulu - + Mono 모노 - + Stereo 스테레오 - + Surround 서라운드 - + 4GB DRAM (Default) 4GB DRAM(기본값) - + 6GB DRAM (Unsafe) 6GB DRAM(불안전) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM(불안전) - + 12GB DRAM (Unsafe) 12GB DRAM(불안전) - + Docked 독 모드 - + Handheld 휴대 모드 - - + + Normal 보통 - - + + Boost 부스트 - - + + Overclock 오버클럭 - + Always ask (Default) 항상 묻기(기본값) - + Only if game specifies not to stop 게임에서 멈추지 말라고 명시한 경우에만 - + Never ask 절대 묻지 않음 - + Very Small (16 MB) 아주 작은 크기(16 MB) - + Small (32 MB) 작은 크기(32 MB) - + Normal (128 MB) 보통 크기(128 MB) - + Large (256 MB) 큰 크기(256 MB) - + Very Large (512 MB) 아주 큰 크기(512 MB) - + Very Low (4 MB) 매우 낮은 크기(4 MB) - + Low (8 MB) 낮은 크기(8 MB) - + Normal (16 MB) 보통 크기(16 MB) - + Medium (32 MB) 중간 크기(32 MB) - + High (64 MB) 높은 크기(64 MB) - + Very Low (32) 매우 낮은 크기(32) - + Low (64) 낮은 크기(64) - + Normal (128) 보통 크기(128) - + Medium (256) 보통(256) - + High (512) 빠름(512) - + Disabled 비활성화됨 - + ExtendedDynamicState 1 확장된 동적 상태 1 - + ExtendedDynamicState 2 확장된 동적 상태 2 - + ExtendedDynamicState 3 확장된 동적 상태 3 - + Tree View 트리 보기 - + Grid View 격자 보기 @@ -7079,7 +7056,7 @@ Debug Message: - + &Pause 일시중지(&P) @@ -7230,7 +7207,7 @@ Debug Message: - + &Start 시작(&S) @@ -7241,7 +7218,7 @@ Debug Message: - + R&ecord 기록(&e) @@ -7332,7 +7309,7 @@ Debug Message: - + None 없음 @@ -7358,743 +7335,743 @@ Debug Message: 캐러셀 보기(&C) - + Small (32x32) 작은 크기(32x32) - + Standard (64x64) 기본 크기(64x64) - + Large (128x128) 큰 크기(128x128) - + Full Size (256x256) 전체 크기(256x256) - + Broken Vulkan Installation Detected 손상된 Vulkan 설치가 발견됨 - + Vulkan initialization failed during boot. 부팅 중 Vulkan 초기화에 실패했습니다. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping 게임 실행 중 - + Loading Web Applet... 웹 애플릿을 불러오는 중... - - + + Disable Web Applet 웹 애플릿 비활성화 - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) 웹 애플릿을 비활성화하면 예기치 않은 동작이 발생할 수 있으며 슈퍼 마리오 3D 컬렉션에서만 사용해야 합니다. 웹 애플릿을 비활성화하겠습니까? (디버그 설정에서 다시 활성화할 수 있습니다.) - + The amount of shaders currently being built 현재 구축 중인 셰이더 수 - + The current selected resolution scaling multiplier. 현재 선택된 해상도 조정 배율입니다. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. 현재 에뮬레이션 속도입니다. 100%보다 높거나 낮은 값은 에뮬레이션이 스위치보다 빠르거나 느리게 실행되고 있음을 나타냅니다. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. 현재 게임이 표시하는 초당 프레임 수입니다. 이 값은 게임 및 장면에 따라 다릅니다. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 프레임 제한이나 수직 동기화를 제외하고 스위치 프레임을 에뮬레이션하는 데 걸리는 시간입니다. 최고 속도 에뮬레이션의 경우 최대 16.67 밀리초입니다. - + Unmute 음소거 해제 - + Mute 음소거 - + Reset Volume 볼륨 재설정 - + Configure Effects... - + &Clear Recent Files 최근 파일 지우기(&C) - + &Continue 재개(&C) - + Warning: Outdated Game Format 경고: 구식 게임 형식입니다 - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. 현재 이 게임에 대해 구형 형식인 분해된 ROM 디렉터리 형식을 사용하고 있습니다. 이 형식은 NCA, NAX, XCI 또는 NSP와 같은 다른 형식으로 대체되었습니다. 분해된 ROM 디렉터리에는 아이콘, 메타데이터 및 업데이트 지원 기능이 없습니다.<br>Eden에서 지원하는 다양한 스위치 형식에 대한 자세한 내용은 사용자 설명서를 참조해 주세요. 이 메시지는 다시 표시되지 않습니다. - - + + Error while loading ROM! ROM 불러오는 중 오류 발생! - + The ROM format is not supported. 해당 ROM 형식은 지원되지 않습니다. - + An error occurred initializing the video core. 비디오 코어 초기화 중 오류가 발생했습니다. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. ROM 불러오는 중 오류 발생! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>파일을 다시 덤프하거나 디스코드/Stoat에서 도움을 요청해 주세요. - + An unknown error occurred. Please see the log for more details. 알 수 없는 오류가 발생했습니다. 자세한 내용은 로그를 참조해 주세요. - - + + (64-bit) (64비트) - - + + (32-bit) (32비트) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... 소프트웨어 닫는 중... - + Save Data 저장 데이터 - + Mod Data 모드 데이터 - + Error Opening %1 Folder %1 폴더 여는 중 오류 발생 - - + + Folder does not exist! 폴더가 존재하지 않습니다! - + Remove Installed Game Contents? 설치된 게임 콘텐츠를 제거하겠습니까? - + Remove Installed Game Update? 설치된 게임 업데이트를 제거하겠습니까? - + Remove Installed Game DLC? 설치된 게임 DLC를 제거하겠습니까? - + Remove Entry 항목 제거 - + Delete OpenGL Transferable Shader Cache? OpenGL 이동 가능한 셰이더 캐시를 삭제하겠습니까? - + Delete Vulkan Transferable Shader Cache? Vulkan 이동 가능한 셰이더 캐시를 삭제하겠습니까? - + Delete All Transferable Shader Caches? 이동 가능한 셰이더 캐시를 모두 삭제하겠습니까? - + Remove Custom Game Configuration? 사용자 지정 게임 구성을 제거하겠습니까? - + Remove Cache Storage? 캐시 저장소를 제거하겠습니까? - + Remove File 파일 제거 - + Remove Play Time Data 플레이 시간 데이터 제거 - + Reset play time? 플레이 시간을 재설정하겠습니까? - - + + RomFS Extraction Failed! RomFS 추출 실패! - + There was an error copying the RomFS files or the user cancelled the operation. RomFS 파일을 복사하는 중에 오류가 발생했거나 사용자가 작업을 취소했습니다. - + Full 전체 - + Skeleton 뼈대 - + Select RomFS Dump Mode RomFS 덤프 모드 선택 - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. RomFS 덤프 방식을 선택해 주세요. 전체를 선택하면 모든 파일이 새 디렉터리로 복사되고, 뼈대를 선택하면 디렉터리 구조만 생성됩니다. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root %1 위치에 RomFS를 추출할 수 있는 여유 공간이 부족합니다. 공간을 확보하거나 에뮬레이션 > 구성 > 시스템 > 파일 시스템 > 덤프 경로에서 다른 덤프 디렉터리를 선택해 주세요. - + Extracting RomFS... RomFS 추출 중... - - + + Cancel 취소 - + RomFS Extraction Succeeded! RomFS 추출 성공! - + The operation completed successfully. 작업이 성공적으로 완료되었습니다. - + Error Opening %1 %1을(를) 여는 중 오류 발생 - + Select Directory 디렉터리 선택 - + Properties 속성 - + The game properties could not be loaded. 게임 속성을 불러올 수 없습니다. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. 스위치 실행 파일(%1);;모든 파일(*.*) - + Load File 파일 불러오기 - + Open Extracted ROM Directory 추출된 ROM 디렉터리 열기 - + Invalid Directory Selected 유효하지 않은 디렉터리 선택됨 - + The directory you have selected does not contain a 'main' file. 선택한 디렉터리에는 'main' 파일이 없습니다. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) 설치 가능한 스위치 파일(*.nca, *.nsp, *.xci);;닌텐도 콘텐츠 아카이브(*.nca);;닌텐도 제출 패키지(*.nsp);;NX 카트리지 이미지(*.xci) - + Install Files 파일 설치 - + %n file(s) remaining %n개 파일 남음 - + Installing file "%1"... "%1" 파일 설치 중... - - + + Install Results 설치 결과 - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. 잠재적인 충돌을 방지하기 위해 저희는 사용자가 기본 게임을 NAND에 설치하는 것은 권장하지 않습니다. 이 기능은 업데이트 및 DLC 설치에만 사용해 주세요. - + %n file(s) were newly installed %n개 파일이 새로 설치됨 - + %n file(s) were overwritten %n개 파일이 덮어쓰기됨 - + %n file(s) failed to install %n개 파일 설치 실패 - + System Application 시스템 애플리케이션 - + System Archive 시스템 아카이브 - + System Application Update 시스템 애플리케이션 업데이트 - + Firmware Package (Type A) 펌웨어 패키지(A타입) - + Firmware Package (Type B) 펌웨어 패키지(B타입) - + Game 게임 - + Game Update 게임 업데이트 - + Game DLC 게임 DLC - + Delta Title 델타 타이틀 - + Select NCA Install Type... NCA 설치 유형 선택... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) 이 NCA를 설치할 타이틀 유형을 선택해 주세요: (대부분의 경우 기본값인 '게임'을 선택하면 됩니다.) - + Failed to Install 설치 실패 - + The title type you selected for the NCA is invalid. NCA에 대해 선택한 타이틀 유형이 유효하지 않습니다. - + File not found 파일을 찾을 수 없음 - + File "%1" not found "%1" 파일을 찾을 수 없음 - + OK 확인 - + Function Disabled 기능 비활성화됨 - + Compatibility list reporting is currently disabled. Check back later! 호환성 목록 보고 옵션이 현재 비활성화되어 있습니다. 나중에 다시 확인해 주세요! - + Error opening URL URL 여는 중 오류 발생 - + Unable to open the URL "%1". "%1" URL을 열 수 없습니다. - + TAS Recording TAS 녹화 - + Overwrite file of player 1? 플레이어 1의 파일을 덮어쓰겠습니까? - + Invalid config detected 무효한 구성이 발견됨 - + Handheld controller can't be used on docked mode. Pro controller will be selected. 휴대 모드 컨트롤러는 독 모드에서 사용할 수 없습니다. Pro 컨트롤러로 선택됩니다. - - + + Amiibo Amiibo - - + + The current amiibo has been removed 현재 amiibo가 제거됨 - + Error 오류 - - + + The current game is not looking for amiibos 현재 게임은 amiibo를 찾고 있지 않습니다 - + Amiibo File (%1);; All Files (*.*) Amiibo 파일(%1);; 모든 파일(*.*) - + Load Amiibo Amiibo 불러오기 - + Error loading Amiibo data Amiibo 데이터 불러오는 중 오류 발생 - + The selected file is not a valid amiibo 선택한 파일은 유효한 amiibo가 아닙니다 - + The selected file is already on use 선택한 파일은 이미 사용 중입니다 - + An unknown error occurred 알 수 없는 오류 발생 - + No firmware available 사용 가능한 펌웨어 없음 - + Firmware Corrupted 펌웨어 손상됨 - + Unknown applet 알 수 없는 애플릿 - + Applet doesn't map to a known value. 애플릿이 알려진 값에 매핑되지 않습니다. - + Record not found 기록을 찾을 수 없음 - + Applet not found. Please reinstall firmware. 애플릿을 찾을 수 없습니다. 펌웨어를 다시 설치해 주세요. - + Capture Screenshot 스크린샷 캡처 - + PNG Image (*.png) PNG 이미지(*.png) - + TAS state: Running %1/%2 TAS 상태: %1/%2 실행 중 - + TAS state: Recording %1 TAS 상태: %1 녹화 중 - + TAS state: Idle %1/%2 TAS 상태: %1/%2 유휴 - + TAS State: Invalid TAS 상태: 무효 - + &Stop Running 실행 중지(&S) - + Stop R&ecording 녹화 중지(&e) - + Building: %n shader(s) 구축 중: %n개 셰이더 - + Scale: %1x %1 is the resolution scaling factor 크기: %1x - + Speed: %1% / %2% 속도: %1% / %2% - + Speed: %1% 속도: %1% - + Game: %1 FPS 게임: %1 FPS - + Frame: %1 ms 프레임: %1 밀리초 - + NO AA AA 없음 - + NO FX - + FX - + VOLUME: MUTE 볼륨: 음소거 - + VOLUME: %1% Volume percentage (e.g. 50%) 볼륨: %1% - + Derivation Components Missing 파생 구성 요소 누락 - + Decryption keys are missing. Install them now? 복호화 키가 없습니다. 지금 설치하겠습니까? - + Wayland Detected! Wayland 발견됨! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8105,74 +8082,74 @@ Would you like to force it for future launches? 향후 출시를 위해 Wayland 사용을 강제하겠습니까? - + Use X11 X11 사용 - + Continue with Wayland Wayland와 계속 - + Don't show again 다시 보지 않기 - + Restart Required 재시작이 필요함 - + Restart Eden to apply the X11 backend. X11 백엔드를 적용하려면 Eden을 다시 시작하세요. - + Slow 저속 - + Turbo 터보 - + Unlocked 제한 해제 - + Select RomFS Dump Target RomFS 덤프 대상 선택 - + Please select which RomFS you would like to dump. 덤프할 RomFS를 선택하세요. - + Are you sure you want to close Eden? 정말 Eden을 닫겠습니까? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. 정말 에뮬레이션을 중지하겠습니까? 저장되지 않은 진행 상황은 모두 손실됩니다. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index 0965db5041..5d77604547 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -786,1332 +786,1315 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Bruk Vulkan-rørledningsbuffer - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Aktiver Reaktiv Tømming - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback Synkroniser med bildefrekvensen for videoavspilling - + Run the game at normal speed during video playback, even when the framerate is unlocked. Kjør spillet i normal hastighet under videoavspilling, selv når bildefrekvensen er låst opp. - + Barrier feedback loops Tilbakekoblingssløyfer for barrierer - + Improves rendering of transparency effects in specific games. Forbedrer gjengivelsen av transparenseffekter i spesifikke spill. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG-frø - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Enhetsnavn - + The name of the console. Konsollens navn. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Selvvalgt RTC-dato: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Språk: - + This option can be overridden when region setting is auto-select - + Region: Region: - + The region of the console. Konsollens region. - + Time Zone: Tidssone: - + The time zone of the console. Konsollens tidssone. - + Sound Output Mode: Lydutdatamodus: - + Console Mode: Konsollmodus: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Bekreft før stopping av emulering - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Gjem mus under inaktivitet - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Deaktiver kontroller-appleten - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates Se etter oppdateringer - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never Aldri - + On Load - + Always Alltid - + CPU CPU - + GPU Skjermkort - + CPU Asynchronous - + Uncompressed (Best quality) Ukomprimert (Best kvalitet) - + BC1 (Low quality) BC1 (Lav kvalitet) - + BC3 (Medium quality) BC3 (Middels kvalitet) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (eksperimentelt, kun AMD/Mesa) - + Null Null - + Fast Rask - - - + + + Accurate Nøyaktig - - - + + + Default Standard - + Unsafe (fast) Utrygg (raskt) - + Safe (stable) Trygg (stabil) - + Immediate - + Balanced Balansert - - Strict - - - - + Unsafe Utrygt - + Paranoid (disables most optimizations) Paranoid (deaktiverer de fleste optimaliseringer) - + Debugging - + Dynarmic - + NCE NCE - + Borderless Windowed Rammeløst vindu - + Exclusive Fullscreen Eksklusiv fullskjerm - + No Video Output Ingen videoutdata - + CPU Video Decoding CPU-videodekoding - + GPU Video Decoding (Default) GPU-videodekoding (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0,25× (180p/270p) [EKSPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5× (360p/540p) [EKSPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75× (540p/810p) [EKSPERIMENTELL] - + 1X (720p/1080p) 1× (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1,25× (900p/1350p) [EKSPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1,5× (1080p/1620p) [EKSPERIMENTELL] - + 2X (1440p/2160p) 2× (1440p/2160p) - + 3X (2160p/3240p) 3× (2160p/3240p) - + 4X (2880p/4320p) 4× (2880p/4320p) - + 5X (3600p/5400p) 5× (3600p/5400p) - + 6X (4320p/6480p) 6× (4320p/6480p) - + 7X (5040p/7560p) 7× (5040p/7560p) - + 8X (5760p/8640p) 8× (5760p/8640p) - + Nearest Neighbor Nærmeste nabo - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gaussisk - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Område - + MMPX MMPX - + Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tving 4:3 - + Force 21:9 Tving 21:9 - + Force 16:10 Tving 16:10 - + Stretch to Window Strekk til vinduet - + Automatic Automatisk - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japansk (日本語) - + American English Amerikansk engelsk - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Nederlandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwansk - + British English Britisk engelsk - + Canadian French Kanadisk fransk - + Latin American Spanish Latinamerikansk spansk - + Simplified Chinese Forenklet kinesisk - + Traditional Chinese (正體中文) Tradisjonell kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisisk (português do Brasil) - + Polish (polska) Polsk (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australia - + China Folkerepublikken Kina - + Korea Korea - + Taiwan Taiwan (Republikken Kina) - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET Sentraleuropeisk tid - + CST6CDT CST6CDT - + Cuba Cuba - + EET Østeuropeisk tid - + Egypt Egypt - + Eire Republikken Irland - + EST EST - + EST5EDT EST5EDT - + GB Storbritannia - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC Folkerepublikken Kina - + PST8PDT PST8PDT - + ROC Taiwan (Republikken Kina) - + ROK Sør-Korea - + Singapore Singapore - + Turkey Tyrkia - + UCT UCT - + Universal Universalt - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (Utrygt) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (Utrygt) - + 12GB DRAM (Unsafe) 12 GB DRAM (Utrygt) - + Docked I dokking - + Handheld Håndholdt - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Spør alltid (Standard) - + Only if game specifies not to stop - + Never ask Aldri spør - + Very Small (16 MB) Veldig liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Veldig stor (512 MB) - + Very Low (4 MB) Veldig lav (4 MB) - + Low (8 MB) Lav (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Middels (32 MB) - + High (64 MB) Høy (64 MB) - + Very Low (32) Svært lav (32) - + Low (64) Lav (64) - + Normal (128) Normal (128) - + Medium (256) Middels (256) - + High (512) Høy (512) - + Disabled Skrudd av - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6988,7 +6971,7 @@ Debug Message: - + &Pause &Pause @@ -7139,7 +7122,7 @@ Debug Message: - + &Start &Start @@ -7150,7 +7133,7 @@ Debug Message: - + R&ecord T&a opp @@ -7241,7 +7224,7 @@ Debug Message: - + None Ingen @@ -7267,737 +7250,737 @@ Debug Message: - + Small (32x32) Liten (32x32) - + Standard (64x64) Standard (64x64) - + Large (128x128) Stor (128x128) - + Full Size (256x256) Full størrelse (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Kjører et spill - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Slå på lyd - + Mute Demp - + Reset Volume Tilbakestill volum - + Configure Effects... - + &Clear Recent Files &Tøm nylige filer - + &Continue &Fortsett - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... Lukker programvare ... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! Mappen finnes ikke! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File Fjern fil - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full Full - + Skeleton Skjelett - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... Utvinner RomFS... - - + + Cancel Avbryt - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory Velg mappe - + Properties Egenskaper - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... Installerer filen «%1» ... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application Systemapp - + System Archive Systemarkiv - + System Application Update - + Firmware Package (Type A) Fastvarepakke (Type A) - + Firmware Package (Type B) Fastvarepakke (Type B) - + Game Spill - + Game Update Spilloppdatering - + Game DLC Spill-DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found Filen ble ikke funnet - + File "%1" not found - + OK OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL Feil under åpning av URL - + Unable to open the URL "%1". - + TAS Recording TAS-opptak - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo amiibo - - + + The current amiibo has been removed - + Error Feil - - + + The current game is not looking for amiibos Det nåværende spillet ser ikke etter amiiboer - + Amiibo File (%1);; All Files (*.*) amiibo-fil (%1);; Alle filer (*.*) - + Load Amiibo Last inn amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available Ingen fastvare tilgjengelig - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot Ta skjermklipp - + PNG Image (*.png) PNG-bilde (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Hastighet: %1% / %2% - + Speed: %1% Hastighet: %1% - + Game: %1 FPS Spill: %1 FPS - + Frame: %1 ms Ramme: %1 ms - + NO AA INGEN AA - + NO FX - + FX - + VOLUME: MUTE VOLUM: DEMP - + VOLUME: %1% Volume percentage (e.g. 50%) VOLUM: %1% - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8005,74 +7988,74 @@ Would you like to force it for future launches? - + Use X11 Bruk X11 - + Continue with Wayland - + Don't show again Ikke vis igjen - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow Treg - + Turbo Turbo - + Unlocked Ubegrenset - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index 6a6f9b21b3..02b1520724 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -793,1332 +793,1315 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Gebruik Vulkan-pijplijn-cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Schakel Reactive Flushing In - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Apparaatnaam - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Aangepaste RTC Datum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Taal: - + This option can be overridden when region setting is auto-select - + Region: Regio: - + The region of the console. - + Time Zone: Tijdzone: - + The time zone of the console. - + Sound Output Mode: Geluidsuitvoermodus: - + Console Mode: Console Modus: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Bevestig voordat u de emulatie stopt - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Verberg muis wanneer inactief - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Controller-applet uitschakelen - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) BC1 (Lage Kwaliteit) - + BC3 (Medium quality) BC3 (Gemiddelde kwaliteit) - - + + Auto Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Accuraat - - - + + + Default Standaard - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - - Strict - - - - + Unsafe Onveilig - + Paranoid (disables most optimizations) Paranoid (schakelt de meeste optimalisaties uit) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Randloos Venster - + Exclusive Fullscreen Exclusief Volledig Scherm - + No Video Output Geen Video-uitvoer - + CPU Video Decoding CPU Videodecodering - + GPU Video Decoding (Default) GPU Videodecodering (Standaard) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTEEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTEEL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Geen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standaart (16:9) - + Force 4:3 Forceer 4:3 - + Force 21:9 Forceer 21:9 - + Force 16:10 Forceer 16:10 - + Stretch to Window Uitrekken naar Venster - + Automatic Automatisch - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japans (日本語) - + American English Amerikaans-Engels - + French (français) Frans (Français) - + German (Deutsch) Duits (Deutsch) - + Italian (italiano) Italiaans (italiano) - + Spanish (español) Spaans (Español) - + Chinese Chinees - + Korean (한국어) Koreaans (한국어) - + Dutch (Nederlands) Nederlands (Nederlands) - + Portuguese (português) Portugees (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanese - + British English Brits-Engels - + Canadian French Canadees-Frans - + Latin American Spanish Latijns-Amerikaans Spaans - + Simplified Chinese Vereenvoudigd Chinees - + Traditional Chinese (正體中文) Traditioneel Chinees (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliaans-Portugees (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australië - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standaard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Ijsland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libië - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkije - + UCT UCT - + Universal Universeel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6984,7 +6967,7 @@ Debug Message: - + &Pause &Onderbreken @@ -7135,7 +7118,7 @@ Debug Message: - + &Start &Start @@ -7146,7 +7129,7 @@ Debug Message: - + R&ecord Opnemen @@ -7237,7 +7220,7 @@ Debug Message: - + None @@ -7263,737 +7246,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8001,74 +7984,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/pl.ts b/dist/languages/pl.ts index 6ab9b388b4..8e76bb191e 100644 --- a/dist/languages/pl.ts +++ b/dist/languages/pl.ts @@ -824,105 +824,93 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation Włącz asynchroniczną kompilację shaderów - + May reduce shader stutter. Może zmniejszyć zacięcia spowodowane kompilacją shaderów. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Użyj pamięci podręcznej strumienia dla Vulkana - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Włącza specyficzną dla producenta GPU pamięć podręczną potoków. Ta opcja może znacząco skrócić czas ładowania shaderów w przypadkach, gdy sterownik Vulkan nie przechowuje wewnętrznie plików pamięci podręcznej potoków. - + Enable Compute Pipelines (Intel Vulkan Only) Włącz potoki obliczeniowe (tylko Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -931,192 +919,192 @@ To ustawienie istnieje wyłącznie dla sterowników Intela i może spowodować b Na wszystkich pozostałych sterownikach potoki obliczeniowe są zawsze włączone. - + Enable Reactive Flushing Włącz reaktywne opróżnianie buforów - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Używa opróżniania reaktywnego zamiast predykcyjnego, co umożliwia dokładniejsze synchronizowanie pamięci. - + Sync to framerate of video playback Synchronizuj do liczby klatek odtwarzanego wideo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Uruchamiaj grę z normalną prędkością podczas odtwarzania wideo, nawet przy odblokowanej liczbie klatek na sekundę. - + Barrier feedback loops Pętle sprzężenia zwrotnego barier - + Improves rendering of transparency effects in specific games. Poprawia renderowanie efektów przezroczystości w niektórych grach. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State Rozszerzony stan dynamiczny - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Kontroluje liczbę funkcji, które mogą być używane w Extended Dynamic State. Wyższe poziomy pozwalają na użycie większej liczby funkcji i mogą zwiększyć wydajność, ale mogą powodować dodatkowe problemy z grafiką. - + Vertex Input Dynamic State Dynamiczny stan wejścia wierzchołków - + Enables vertex input dynamic state feature for better quality and performance. Włącza funkcję dynamicznego stanu wejścia wierzchołków, poprawiając jakość i wydajność. - + Sample Shading Cieniowanie próbkowe - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Pozwala wykonywać shader fragmentów dla każdej próbki we fragmencie wielokrotnie próbkowanym zamiast raz dla każdego fragmentu. Poprawia jakość grafiki kosztem wydajności. Wyższe wartości poprawiają jakość, ale obniżają wydajność. - + RNG Seed Ziarno RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Ustala ziarno generatora liczb losowych. Głównie używane do speedrunów. - + Device Name Nazwa urządzenia - + The name of the console. The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Własna data RTC - + This option allows to change the clock of the console. Can be used to manipulate time in games. Ta opcja pozwala zmienić zegar konsoli. Może służyć do manipulowania czasem w grach. - + The number of seconds from the current unix time Liczba sekund od bieżącego czasu Unix - + Language: Język: - + This option can be overridden when region setting is auto-select Ta opcja może zostać nadpisana, gdy ustawienie regionu to automatyczny wybór. - + Region: Region: - + The region of the console. Region konsoli. - + Time Zone: Strefa czasowa: - + The time zone of the console. Strefa czasowa konsoli. - + Sound Output Mode: Tryb wyjścia dźwięku: - + Console Mode: Tryb konsoli - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1125,1042 +1113,1037 @@ W zależności od tego ustawienia gry zmienią swoją rozdzielczość, szczegó Ustawienie na Handheld może poprawić wydajność na słabszych komputerach. - + Prompt for user profile on boot Pytaj o profil użytkownika przy uruchomieniu. - + Useful if multiple people use the same PC. Przydatne, gdy z tego samego PC korzysta wiele osób. - + Pause when not in focus Wstrzymuj, gdy okno nie jest aktywne - + Pauses emulation when focusing on other windows. Wstrzymuje emulację po przełączeniu na inne okna. - + Confirm before stopping emulation Potwierdzaj przed zatrzymaniem emulacji - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Nadpisuje monity z prośbą o potwierdzenie zatrzymania emulacji. Włączenie powoduje pominięcie takich monitów i bezpośrednie wyjście z emulacji. - + Hide mouse on inactivity Ukryj mysz przy braku aktywności - + Hides the mouse after 2.5s of inactivity. Ukrywa kursor po 2,5 s bezczynności. - + Disable controller applet Wyłącz aplet kontrolera - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Wymusza wyłączenie użycia apletu kontrolera w oprogramowaniu uruchamianym w emulacji. Jeśli emulowane oprogramowanie próbuje otworzyć aplet kontrolera, jest on natychmiast zamykany. - + Check for updates Sprawdź aktualizacje - + Whether or not to check for updates upon startup. Czy sprawdzać aktualizacje przy uruchomieniu. - + Enable Gamemode Włącz Tryb gry - + Force X11 as Graphics Backend Wymuś X11 jako backend grafiki - + Custom frontend Niestandardowy frontend - + Real applet Prawdziwy aplet - + Never Nigdy - + On Load Przy wczytywaniu - + Always Zawsze - + CPU CPU - + GPU GPU - + CPU Asynchronous Asynchroniczne CPU - + Uncompressed (Best quality) Brak (najlepsza jakość) - + BC1 (Low quality) BC1 (niska jakość) - + BC3 (Medium quality) BC3 (średnia jakość) - - + + Auto Automatyczny - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Konserwatywny - + Aggressive Agresywny - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast Szybkie - - - + + + Accurate Dokładny - - - + + + Default Domyślny - + Unsafe (fast) Niezalecane (szybkie) - + Safe (stable) Bezpieczne (stabilne) - + Immediate - + Balanced Zrównoważony - - Strict - - - - + Unsafe Niebezpieczny - + Paranoid (disables most optimizations) Paranoiczne (wyłącza większość optymalizacji) - + Debugging Debugowanie - + Dynarmic Dynamiczny - + NCE NCE - + Borderless Windowed W oknie (Bezramkowy) - + Exclusive Fullscreen Exclusive Fullscreen - + No Video Output Brak wyjścia wideo - + CPU Video Decoding Dekodowanie Wideo przez CPU - + GPU Video Decoding (Default) Dekodowanie Wideo przez GPU (Domyślne) - + 0.25X (180p/270p) [EXPERIMENTAL] 0,25x (180p/270p) [EKSPERYMENTALNE] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5x (360p/540p) [EKSPERYMENTALNE] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EKSPERYMENTALNE] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EKSPERYMENTALNE] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [Ekperymentalnie] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Najbliższy sąsiadujący - + Bilinear Bilinearny - + Bicubic Bikubiczny - + Gaussian Kulisty - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Obszar - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Żadna (wyłączony) - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Domyślne (16:9) - + Force 4:3 Wymuś 4:3 - + Force 21:9 Wymuś 21:9 - + Force 16:10 Wymuś 16:10 - + Stretch to Window Rozciągnij do Okna - + Automatic Automatyczne - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japoński (日本語) - + American English Angielski Amerykański - + French (français) Francuski (français) - + German (Deutsch) Niemiecki (Niemcy) - + Italian (italiano) Włoski (italiano) - + Spanish (español) Hiszpański (español) - + Chinese Chiński - + Korean (한국어) Koreański (한국어) - + Dutch (Nederlands) Duński (Holandia) - + Portuguese (português) Portugalski (português) - + Russian (Русский) Rosyjski (Русский) - + Taiwanese Tajwański - + British English Angielski Brytyjski - + Canadian French Fancuski (Kanada) - + Latin American Spanish Hiszpański (Latin American) - + Simplified Chinese Chiński (Uproszczony) - + Traditional Chinese (正體中文) Chiński tradycyjny (正體中文) - + Brazilian Portuguese (português do Brasil) Portugalski (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonia - + USA USA - + Europe Europa - + Australia Australia - + China Chiny - + Korea Korea - + Taiwan Tajwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Domyślne (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipt - + Eire Irlandia - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Izrael - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polska - + Portugal Portugalia - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turcja - + UCT UCT - + Universal Uniwersalny - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Domyślne) - + 6GB DRAM (Unsafe) 6GB DRAM (NIebezpieczne) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (NIebezpieczne) - + 12GB DRAM (Unsafe) 12GB DRAM (NIebezpieczne) - + Docked Zadokowany - + Handheld Przenośnie - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Zawsze pytaj (Domyślne) - + Only if game specifies not to stop Tylko jeśli gra określa, aby nie zatrzymywać - + Never ask Nie pytaj więcej - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Średnie (256) - + High (512) Wysokie (512) - + Disabled Wyłączone - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View - + Grid View @@ -7051,7 +7034,7 @@ Komunikat debugowania: - + &Pause &Pauza @@ -7202,7 +7185,7 @@ Komunikat debugowania: - + &Start &Start @@ -7213,7 +7196,7 @@ Komunikat debugowania: - + R&ecord &Nagraj @@ -7304,7 +7287,7 @@ Komunikat debugowania: - + None Żadna (wyłączony) @@ -7330,406 +7313,406 @@ Komunikat debugowania: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected Wykryto uszkodzoną instalację Vulkan - + Vulkan initialization failed during boot. Inicjalizacja Vulkana nie powiodła się podczas uruchamiania. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Gra uruchomiona - + Loading Web Applet... Ładowanie apletu internetowego... - - + + Disable Web Applet Wyłącz Aplet sieciowy - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Wyłączenie apletu sieciowego może prowadzić do nieprzewidywalnego działania i powinno być używane wyłącznie z Super Mario 3D All-Stars. Na pewno chcesz wyłączyć aplet sieciowy? (Tę opcję można ponownie włączyć w ustawieniach debugowania). - + The amount of shaders currently being built Liczba shaderów aktualnie budowanych - + The current selected resolution scaling multiplier. Aktualnie wybrany mnożnik skalowania rozdzielczości. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Bieżąca prędkość emulacji. Wartości wyższe lub niższe niż 100% oznaczają, że emulacja działa odpowiednio szybciej lub wolniej niż na Switchu. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Liczba klatek na sekundę aktualnie wyświetlanych przez grę. Wartość ta zależy od gry oraz od konkretnej sceny. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Czas potrzebny na emulację jednej klatki Switcha, bez uwzględniania ogranicznika klatek i synchronizacji pionowej. Dla emulacji z pełną prędkością powinno to być maksymalnie 16,67 ms. - + Unmute Wyłącz wyciszenie - + Mute Wycisz - + Reset Volume Zresetuj głośność - + Configure Effects... - + &Clear Recent Files &Usuń Ostatnie pliki - + &Continue &Kontynuuj - + Warning: Outdated Game Format Ostrzeżenie: Nieaktualny format gry - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Używasz dla tej gry formatu katalogu zdekonstruowanego ROM-u, który jest przestarzały i został zastąpiony innymi formatami, takimi jak NCA, NAX, XCI czy NSP. Katalogi takich ROM-ów nie zawierają ikon, metadanych ani nie obsługują aktualizacji.<br>Aby uzyskać wyjaśnienie dotyczące różnych formatów Switcha obsługiwanych przez Eden, zajrzyj do naszego podręcznika użytkownika. Ten komunikat nie zostanie wyświetlony ponownie. - - + + Error while loading ROM! Błąd podczas wczytywania ROMu! - + The ROM format is not supported. Ten format ROMu nie jest wspierany. - + An error occurred initializing the video core. Wystąpił błąd podczas inicjowania rdzenia wideo. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Błąd podczas wczytywania ROMu! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Proszę ponownie zrzucić pliki lub poprosić o pomoc na Discordzie/Stoat. - + An unknown error occurred. Please see the log for more details. Wystąpił nieznany błąd. Więcej informacji można znaleźć w pliku log. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Zamykanie aplikacji... - + Save Data Zapis danych - + Mod Data Dane modów - + Error Opening %1 Folder Błąd podczas otwierania folderu %1 - - + + Folder does not exist! Folder nie istnieje! - + Remove Installed Game Contents? Usunąć zainstalowaną zawartość gry? - + Remove Installed Game Update? Usunąć zainstalowaną aktualizację gry? - + Remove Installed Game DLC? Usunąć zainstalowane DLC gry? - + Remove Entry Usuń wpis - + Delete OpenGL Transferable Shader Cache? Usunąć przenośną pamięć podręczną shaderów OpenGL? - + Delete Vulkan Transferable Shader Cache? Usunąć przenośną pamięć podręczną shaderów Vulkan? - + Delete All Transferable Shader Caches? Usunąć wszystkie przenośne pamięci podręczne shaderów? - + Remove Custom Game Configuration? Usunąć niestandardową konfigurację gry? - + Remove Cache Storage? Usunąć pamięć podręczną? - + Remove File Usuń plik - + Remove Play Time Data Usuń dane czasu gry - + Reset play time? Zresetować czas gry? - - + + RomFS Extraction Failed! Wyodrębnianie RomFS nie powiodło się! - + There was an error copying the RomFS files or the user cancelled the operation. Wystąpił błąd podczas kopiowania plików RomFS lub użytkownik przerwał operację. - + Full Pełny - + Skeleton Szkielet - + Select RomFS Dump Mode Wybierz tryb zrzutu RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Wybierz sposób wykonania zrzutu RomFS. <br>Tryb „Pełny” skopiuje wszystkie pliki do nowego katalogu, <br>natomiast „Szkielet” utworzy jedynie strukturę katalogów. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Nie ma wystarczająco miejsca w %1 aby wyodrębnić RomFS. Zwolnij trochę miejsca, albo zmień ścieżkę zrzutu RomFs w Emulacja > Konfiguruj > System > System Plików > Źródło Zrzutu - + Extracting RomFS... Wypakowywanie RomFS... - - + + Cancel Anuluj - + RomFS Extraction Succeeded! Wypakowanie RomFS zakończone pomyślnie! - + The operation completed successfully. Operacja zakończona pomyślnie. - + Error Opening %1 Błąd podczas otwierania %1 - + Select Directory Wybierz folder - + Properties Właściwości - + The game properties could not be loaded. Właściwości tej gry nie mogły zostać załadowane. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Plik wykonywalny Switcha (%1);;Wszystkie pliki (*.*) - + Load File Załaduj plik - + Open Extracted ROM Directory Otwórz folder wypakowanego ROMu - + Invalid Directory Selected Wybrano niewłaściwy folder - + The directory you have selected does not contain a 'main' file. Wybrany folder nie zawiera 'głównego' pliku. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Instalacyjne pliki Switch'a (*.nca *.nsp *.xci);;Archiwum zawartości Nintendo (*.nca);;Pakiet poddany Nintendo (*.nsp);;Obraz z kartridża NX (*.xci) - + Install Files Zainstaluj pliki - + %n file(s) remaining Pozostał %n plikPozostały %n plikiPozostało %n plikówPozostało %n plików - + Installing file "%1"... Instalowanie pliku "%1"... - - + + Install Results Wynik instalacji - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Aby uniknąć ewentualnych konfliktów, odradzamy użytkownikom instalowanie gier na NAND. Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + %n file(s) were newly installed %n plik został nowo zainstalowany @@ -7739,7 +7722,7 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + %n file(s) were overwritten %n plik został nadpisany @@ -7749,7 +7732,7 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + %n file(s) failed to install Nie udało się zainstalować %n pliku @@ -7759,324 +7742,324 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - + System Application Aplikacja systemowa - + System Archive Archiwum systemu - + System Application Update Aktualizacja aplikacji systemowej - + Firmware Package (Type A) Paczka systemowa (Typ A) - + Firmware Package (Type B) Paczka systemowa (Typ B) - + Game Gra - + Game Update Aktualizacja gry - + Game DLC Dodatek do gry - + Delta Title Tytuł Delta - + Select NCA Install Type... Wybierz typ instalacji NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Wybierz typ tytułu, do którego chcesz zainstalować ten NCA, jako: (W większości przypadków domyślna "gra" jest w porządku.) - + Failed to Install Instalacja nieudana - + The title type you selected for the NCA is invalid. Typ tytułu wybrany dla NCA jest nieprawidłowy. - + File not found Nie znaleziono pliku - + File "%1" not found Nie znaleziono pliku "%1" - + OK OK - + Function Disabled Funkcja wyłączona - + Compatibility list reporting is currently disabled. Check back later! Zgłaszanie do listy kompatybilności jest obecnie wyłączone. Spróbuj ponownie później! - + Error opening URL Błąd otwierania adresu URL - + Unable to open the URL "%1". Nie można otworzyć adresu URL "%1". - + TAS Recording Nagrywanie TAS - + Overwrite file of player 1? Nadpisać plik gracza 1? - + Invalid config detected Wykryto nieprawidłową konfigurację - + Handheld controller can't be used on docked mode. Pro controller will be selected. Nie można używać kontrolera handheld w trybie zadokowanym. Zostanie wybrany kontroler Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Amiibo zostało "zdjęte" - + Error Błąd - - + + The current game is not looking for amiibos Ta gra nie szuka amiibo - + Amiibo File (%1);; All Files (*.*) Plik Amiibo (%1);;Wszyskie pliki (*.*) - + Load Amiibo Zamontuj Amiibo - + Error loading Amiibo data Błąd podczas ładowania danych Amiibo - + The selected file is not a valid amiibo Wybrany plik nie jest poprawnym amiibo - + The selected file is already on use Wybrany plik jest już w użyciu - + An unknown error occurred Wystąpił nieznany błąd - + No firmware available Brak dostępnego firmware'u - + Firmware Corrupted Uszkodzony Firmware - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot Zrób zrzut ekranu - + PNG Image (*.png) Obrazek PNG (*.png) - + TAS state: Running %1/%2 Status TAS: Działa %1%2 - + TAS state: Recording %1 Status TAS: Nagrywa %1 - + TAS state: Idle %1/%2 Status TAS: Bezczynny %1%2 - + TAS State: Invalid Status TAS: Niepoprawny - + &Stop Running &Wyłącz - + Stop R&ecording Przestań &Nagrywać - + Building: %n shader(s) Budowanie: %n shaderBudowanie: %n shaderyBudowanie: %n shaderówBudowanie: %n shaderów - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Prędkość: %1% / %2% - + Speed: %1% Prędkość: %1% - + Game: %1 FPS Gra: %1 FPS - + Frame: %1 ms Klatka: %1 ms - + NO AA BEZ AA - + NO FX - + FX - + VOLUME: MUTE Głośność: Wyciszony - + VOLUME: %1% Volume percentage (e.g. 50%) Głośność: %1% - + Derivation Components Missing Brak komponentów wyprowadzania - + Decryption keys are missing. Install them now? - + Wayland Detected! Wykryto Waylanda! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8086,74 +8069,74 @@ Zaleca się zamiast tego używać X11. Czy chcesz wymusić jego użycie przy przyszłych uruchomieniach? - + Use X11 Używaj X11 - + Continue with Wayland Kontynuuj z Waylandem - + Don't show again Nie pokazuj ponownie - + Restart Required Wymagane ponowne uruchomienie - + Restart Eden to apply the X11 backend. Uruchom ponownie Edena, aby zastosować backend X11. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target Wybierz cel zrzutu RomFS - + Please select which RomFS you would like to dump. Proszę wybrać RomFS, jakie chcesz zrzucić. - + Are you sure you want to close Eden? Czy na pewno chcesz zamknąć Edena? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Czy na pewno chcesz zatrzymać emulację? Wszystkie niezapisane postępy zostaną utracone. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index 7113730221..a180d00364 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -824,60 +824,48 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation Ativar compilação assíncrona de shaders - + May reduce shader stutter. Pode reduzir travamentos de shaders. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Acelera a decodificação de texturas 3D BCn usando processamento da GPU. Desative se ocorrerem travamentos ou falhas gráficas. - + GPU Unswizzle Max Texture Size Tamanho Máximo de Textura para GPU Unswizzle - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -886,48 +874,48 @@ A GPU é mais rápida para texturas médias e grandes, mas a CPU pode ser mais e Ajuste para encontrar o equilíbrio entre aceleração da GPU e sobrecarga da CPU. - + GPU Unswizzle Stream Size Tamanho do Fluxo de GPU Unswizzle - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Define a quantidade máxima de dados de textura (em MiB) processados por quadro. Valores mais altos podem reduzir travamentos durante o carregamento de texturas, mas podem afetar a consistência dos quadros. - + GPU Unswizzle Chunk Size Tamanho do Bloco de GPU Unswizzle - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Determina o número de fatias de profundidade processadas em uma única execução. Aumentar esse valor pode melhorar o desempenho em GPUs avançadas, mas pode causar TDR ou tempo limite do driver em hardwares mais fracos. - + Use Vulkan pipeline cache Utilizar cache de pipeline do Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Habilita o cache de pipeline da fabricante da GPU. Esta opção pode melhorar o tempo de carregamento de shaders significantemente em casos onde o driver Vulkan não armazena o cache de pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Habilitar Pipeline de Computação (Somente Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -936,194 +924,194 @@ Esta configuração existe apenas para drivers proprietários da Intel e pode ca Pipelines de computação estão sempre habilitados em outros drivers. - + Enable Reactive Flushing Habilitar Flushing Reativo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa flushing reativo ao invés de flushing preditivo, permitindo mais precisão na sincronização da memória. - + Sync to framerate of video playback Sincronizar com o framerate da reprodução de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Executa o jogo na velocidade normal durante a reprodução de vídeo, mesmo se o framerate estiver desbloqueado. - + Barrier feedback loops Ciclos de feedback de barreira - + Improves rendering of transparency effects in specific games. Melhora a renderização de efeitos de transparência em jogos específicos. - + Enable buffer history Ativar histórico de buffer - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Permite acesso a estados anteriores do buffer. Esta opção pode melhorar a qualidade de renderização e a consistência de desempenho em alguns jogos. - + Fix bloom effects Corrigir efeitos de bloom - + Removes bloom in Burnout. Remove o bloom no Burnout. - + Enable Legacy Rescale Pass Ativar Passagem de Redimensionamento Legada - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Pode corrigir problemas de redimensionamento em alguns jogos, baseando-se no comportamento da implementação anterior. Solução legada que corrige artefatos de linha em GPUs AMD e Intel, e cintilação de texturas cinzas em GPUs Nvidia no Luigi's Mansion 3. - + Extended Dynamic State Estado Dinâmico Estendido - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Controla o número de recursos que podem ser usados no Estado Dinâmico Estendido. Estados mais altos permitem mais recursos e podem aumentar o desempenho, mas também podem causar problemas gráficos adicionais. - + Vertex Input Dynamic State Estado Dinâmico de Entrada de Vértices - + Enables vertex input dynamic state feature for better quality and performance. Ativa o recurso de estado dinâmico de entrada de vértices para melhor qualidade e desempenho. - + Sample Shading Sombreamento por Amostragem - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permite que o shader de fragmento seja processado por cada amostra em fragmentos multiamostrados, em vez de uma única vez por fragmento. Melhora a qualidade gráfica ao custo de desempenho. Valores mais altos aumentam a qualidade, mas reduzem a performance. - + RNG Seed Semente de RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Controla a semente do gerador de números aleatórios. Usado principalmente em speedruns. - + Device Name Nome do Dispositivo - + The name of the console. O nome do console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Data personalizada do RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Esta opção permite alterar o relógio do console. Pode ser usada para manipular o tempo nos jogos. - + The number of seconds from the current unix time Número de segundos a partir do tempo Unix atual - + Language: Idioma: - + This option can be overridden when region setting is auto-select Esta opção pode ser substituída quando a configuração de região estiver em seleção automática - + Region: Região: - + The region of the console. A região do console. - + Time Zone: Fuso Horário: - + The time zone of the console. O fuso horário do console. - + Sound Output Mode: Modo de saída de som - + Console Mode: Modo Console: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1132,1042 +1120,1037 @@ Os jogos ajustarão resolução, detalhes e controladores suportados conforme es Definir como Portátil pode ajudar a melhorar o desempenho em sistemas mais fracos. - + Prompt for user profile on boot Solicitar perfil de usuário na inicialização - + Useful if multiple people use the same PC. Útil se várias pessoas usam o mesmo PC. - + Pause when not in focus Pausar quando não estiver em foco - + Pauses emulation when focusing on other windows. Pausa a emulação ao focar em outras janelas. - + Confirm before stopping emulation Confirmar antes de parar a emulação - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Substitui as confirmações ao parar a emulação. Ao ativar, ignora esses avisos e encerra diretamente a emulação. - + Hide mouse on inactivity Esconder rato quando inactivo. - + Hides the mouse after 2.5s of inactivity. Oculta o mouse após 2,5s de inatividade. - + Disable controller applet Desabilitar applet de controle - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Desativa forçadamente o uso do applet de controle em programas emulados. Quando um programa tenta abrir o applet, ele é imediatamente fechado. - + Check for updates Verificar atualizações - + Whether or not to check for updates upon startup. Define se deve verificar atualizações na inicialização. - + Enable Gamemode Habilitar Gamemode - + Force X11 as Graphics Backend Forçar X11 como backend gráfico - + Custom frontend Frontend customizado - + Real applet Applet real - + Never Nunca - + On Load Ao carregar - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor Qualidade) - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - - + + Auto Automático - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservador - + Aggressive Agressivo - + Vulkan Vulcano - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Shaders em Assembly, apenas NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, apenas AMD/Mesa) - + Null Nenhum - + Fast Rápido - - - + + + Accurate Preciso - - - + + + Default Padrão - + Unsafe (fast) Inseguro (rápido) - + Safe (stable) Seguro (estável) - + Immediate - + Balanced Balanceado - - Strict - - - - + Unsafe Inseguro - + Paranoid (disables most optimizations) Paranoia (desativa a maioria das otimizações) - + Debugging Depuração - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela sem bordas - + Exclusive Fullscreen Tela cheia exclusiva - + No Video Output Sem saída de vídeo - + CPU Video Decoding Decodificação de vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de vídeo pela GPU (Padrão) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Área - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à Janela - + Automatic Automático - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) Polonês (polska) - + Thai (แบบไทย) Tailandês (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egito - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irã - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polônia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Ancorado - + Handheld Portátil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - + Very Small (16 MB) Muito Pequeno (16 MB) - + Small (32 MB) Pequeno (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muito Grande (512 MB) - + Very Low (4 MB) Muito Baixo (4 MB) - + Low (8 MB) Baixo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Médio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muito Baixo (32) - + Low (64) Baixo (64) - + Normal (128) Normal (128) - + Medium (256) Médio (256) - + High (512) Alto (512) - + Disabled Desativado - + ExtendedDynamicState 1 Estado Dinâmico Estendido 1 - + ExtendedDynamicState 2 Estado Dinâmico Estendido 2 - + ExtendedDynamicState 3 Estado Dinâmico Estendido 3 - + Tree View Visualização em Árvore - + Grid View Visualização em Grade @@ -7058,7 +7041,7 @@ Mensagem de Depuração: - + &Pause &Pausa @@ -7209,7 +7192,7 @@ Mensagem de Depuração: - + &Start &Começar @@ -7220,7 +7203,7 @@ Mensagem de Depuração: - + R&ecord G&ravar @@ -7311,7 +7294,7 @@ Mensagem de Depuração: - + None Nenhum @@ -7337,738 +7320,738 @@ Mensagem de Depuração: - + Small (32x32) Pequeno (32x32) - + Standard (64x64) Padrão (64x64) - + Large (128x128) Grande (128x128) - + Full Size (256x256) Tamanho completo (256x256) - + Broken Vulkan Installation Detected Detectada Instalação Defeituosa do Vulkan - + Vulkan initialization failed during boot. Inicialização do Vulkan falhou durante o boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Rodando um jogo - + Loading Web Applet... Carregando Applet Web... - - + + Disable Web Applet Desativar Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Desativar o Applet Web pode problemas indefinidos e deverá apenas ser usando com o Super Mario 3D All-Stars. Você tem certeza que quer desativar o Applet Web? (Isso pode ser reativado nas Configurações de Depuração.) - + The amount of shaders currently being built A Quantidade total de Shaders está sendo atualmente construída - + The current selected resolution scaling multiplier. A atual multiplicação de escala de resolução selecionada. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Velocidade atual da emulação. Valores altos ou mais baixo que 100% indicam que o emulador está rodando mais rápido ou mais lento que um Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Quantos quadros por segundo o jogo está mostrando atualmente. Isto varia de jogo para jogo e de cena a cena. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory Selecionar Diretório - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory Abrir o Diretório da ROM extraída - + Invalid Directory Selected Diretório selecionado inválido - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed O Amiibo atual foi removido - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8076,74 +8059,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/pt_PT.ts b/dist/languages/pt_PT.ts index e637008132..ae1b0929d6 100644 --- a/dist/languages/pt_PT.ts +++ b/dist/languages/pt_PT.ts @@ -793,1333 +793,1316 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Utilizar cache de pipeline do Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Habilita o cache de pipeline da fabricante da GPU. Esta opção pode melhorar o tempo de carregamento de shaders significantemente em casos onde o driver Vulkan não armazena o cache de pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Habilitar Pipeline de Computação (Somente Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Habilitar Flushing Reativo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa flushing reativo ao invés de flushing preditivo, permitindo mais precisão na sincronização da memória. - + Sync to framerate of video playback Sincronizar com o framerate da reprodução de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Executa o jogo na velocidade normal durante a reprodução de vídeo, mesmo se o framerate estiver desbloqueado. - + Barrier feedback loops Ciclos de feedback de barreira - + Improves rendering of transparency effects in specific games. Melhora a renderização de efeitos de transparência em jogos específicos. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Semente de RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Nome do Dispositivo - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Data personalizada do RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Idioma: - + This option can be overridden when region setting is auto-select - + Region: Região: - + The region of the console. - + Time Zone: Fuso Horário: - + The time zone of the console. - + Sound Output Mode: Modo de saída de som - + Console Mode: Modo Console: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Confirmar antes de parar a emulação - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Esconder rato quando inactivo. - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Desabilitar miniaplicativo de controle - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Habilitar Gamemode - + Force X11 as Graphics Backend - + Custom frontend Frontend customizado - + Real applet Miniaplicativo real - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor Q - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - - + + Auto Automático - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Conservador - + Aggressive Agressivo - + Vulkan Vulcano - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Nenhum (desativado) - + Fast - - - + + + Accurate Preciso - - - + + + Default Padrão - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - - Strict - - - - + Unsafe Inseguro - + Paranoid (disables most optimizations) Paranoia (desativa a maioria das otimizações) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela sem bordas - + Exclusive Fullscreen Tela cheia exclusiva - + No Video Output Sem saída de vídeo - + CPU Video Decoding Decodificação de vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de vídeo pela GPU (Padrão) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à Janela - + Automatic Automático - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irão - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polónia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Ancorado - + Handheld Portátil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6989,7 +6972,7 @@ Debug Message: - + &Pause &Pausa @@ -7140,7 +7123,7 @@ Debug Message: - + &Start &Começar @@ -7151,7 +7134,7 @@ Debug Message: - + R&ecord G&ravar @@ -7242,7 +7225,7 @@ Debug Message: - + None @@ -7268,737 +7251,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8006,74 +7989,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 5d0bfe8ea0..c1276416b1 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -827,66 +827,48 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. - Управляет поведением синхронизации через барьеры ГПУ. -Мгновенный — самый быстрый вариант, но может вызывать некоторые проблемы. -Сбалансированный обеспечивает лучшую совместимость и может исправлять проблемы в некоторых играх. -Точный ещё больше повышает совместимость ценой некоторого снижения производительности. -Строгий — самый медленный вариант, но может исправлять проблемы, требующие более строгой синхронизации. -По умолчанию соответствует настройке точности ГПУ. +Default follows the GPU Mode setting. + - Enable GPU buffer readback - Включить обратное чтение буфера ГПУ - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - Сохраняет измененные ГПУ данные путем чтения их обратно перед выгрузками. -Некоторые игры требуют этого, чтобы рендерить определенные эффекты правильно. - - - Enable asynchronous shader compilation Включить асинхронную компиляцию шейдеров - + May reduce shader stutter. Может уменьшить фризы, вызванные компиляцией шейдеров. - + GPU Clocks Частоты GPU - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. Заставляет игру думать, что GPU завершает свою работу быстрее, чем на самом деле, чтобы она перестала подстраиваться под частоты Switch, понижать разрешение и дальность прорисовки. - + GPU Unswizzle GPU-десвиззлинг (GPU Unswizzle) - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Ускоряет декодирование 3D-текстур BCn с использованием вычислений GPU. Отключите при возникновении сбоев или графических артефактов. - + GPU Unswizzle Max Texture Size Максимальный размер текстур для GPU-десвиззлинга - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -895,48 +877,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size Размер потока GPU-десвиззлинга - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Задает максимальный объем данных текстур (в МиБ), обрабатываемый за кадр. Более высокие значения могут уменьшить подергивания при загрузке текстур, но это может повлиять на стабильность кадров. - + GPU Unswizzle Chunk Size Размер блока GPU-десвиззлинга - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Определяет количество слоев глубины, обрабатываемых за один вызов. Увеличение этого значения может повысить пропускную способность на производительных GPU, но на слабом оборудовании способно вызвать TDR или тайм-ауты драйвера. - + Use Vulkan pipeline cache Использовать кэш конвейеров Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Включает кэш конвейеров, зависящий от производителя GPU. Эта опция может значительно ускорить загрузку шейдеров в тех случаях, когда драйвер Vulkan не сохраняет такие файлы кэша внутри себя. - + Enable Compute Pipelines (Intel Vulkan Only) Включить вычислительные конвейеры (только для Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -945,194 +927,194 @@ Compute pipelines are always enabled on all other drivers. На остальных драйверах вычислительные конвейеры всегда включены. - + Enable Reactive Flushing Включить реактивный сброс - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Использует реактивный сброс (Reactive Flushing) вместо прогнозирующего, обеспечивая более точную синхронизацию памяти. - + Sync to framerate of video playback Синхронизировать с частотой кадров видео - + Run the game at normal speed during video playback, even when the framerate is unlocked. Поддерживать нормальную скорость игры во время воспроизведения видео, даже если частота кадров разблокирована. - + Barrier feedback loops Циклы обратной связи барьеров - + Improves rendering of transparency effects in specific games. Улучшает отрисовку эффектов прозрачности в некоторых играх. - + Enable buffer history Включить историю буфера - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Предоставляет доступ к предыдущим состояниям буфера. В некоторых играх может повысить качество рендеринга и стабильность производительности. - + Fix bloom effects Исправить эффекты bloom - + Removes bloom in Burnout. Удаляет эффект bloom в игре Burnout. - + Enable Legacy Rescale Pass Включить устаревший режим масштабирования - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Может исправить проблемы масштабирования в некоторых играх, используя поведение предыдущей реализации. Это обходное решение устраняет артефакты линий на GPU AMD и Intel, а также мерцание серых текстур на GPU Nvidia в Luigis Mansion 3. - + Extended Dynamic State Расширенное динамическое состояние (Extended Dynamic State) - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Определяет количество функций, доступных в Extended Dynamic State. Более высокие значения позволяют использовать больше функций и иногда повышают производительность, но могут вызвать дополнительные графические проблемы. - + Vertex Input Dynamic State Динамическое состояние ввода вершин (Vertex Input Dynamic State) - + Enables vertex input dynamic state feature for better quality and performance. Включает функцию динамического состояния ввода вершин для улучшения качества и производительности. - + Sample Shading Множественное затенение (Sample Shading) - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Позволяет фрагментному шейдеру выполняться для каждого сэмпла в мультисемплированном фрагменте вместо одного раза. Повышает качество графики за счет снижения производительности. Более высокие значения повышают качество, но сильнее снижают производительность. - + RNG Seed Сид RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Задает начальное значение генератора случайных чисел. В основном используется для спидранов. - + Device Name Название устройства - + The name of the console. Имя консоли. - + Homebrew Args Аргументы Homebrew - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Аргументы командной строки при запуске homebrew (например, -noglsl). - + Custom RTC Date: Пользовательская RTC-дата: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Позволяет изменить системные часы консоли. Может использоваться для изменения времени в играх. - + The number of seconds from the current unix time Количество секунд от текущего UNIX-времени. - + Language: Язык: - + This option can be overridden when region setting is auto-select Эта настройка может быть переопределена при автоматическом выборе региона. - + Region: Регион: - + The region of the console. Регион консоли. - + Time Zone: Часовой пояс: - + The time zone of the console. Часовой пояс консоли. - + Sound Output Mode: Режим вывода звука: - + Console Mode: Консольный режим: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1141,1042 +1123,1037 @@ Setting to Handheld can help improve performance for low end systems. Установка в портативный режим может повысить производительность на слабых системах. - + Prompt for user profile on boot Запрашивать профиль пользователя при запуске игры - + Useful if multiple people use the same PC. Полезно, если одним ПК пользуются несколько человек. - + Pause when not in focus Приостанавливать, если окно не активно - + Pauses emulation when focusing on other windows. Приостанавливает эмуляцию при переключении на другие окна. - + Confirm before stopping emulation Запрашивать подтверждение перед остановкой эмуляции - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Убирает запросы на подтверждение остановки эмуляции. При включении этой настройки эмуляция завершается сразу, без подтверждения. - + Hide mouse on inactivity Скрывать курсор при бездействии - + Hides the mouse after 2.5s of inactivity. Скрывает курсор мыши после 2,5 секунд бездействия. - + Disable controller applet Отключить апплет контроллера - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Принудительно отключает использование апплета контроллера в эмулируемых программах. При попытке открыть апплет он сразу закрывается. - + Check for updates Проверять обновления - + Whether or not to check for updates upon startup. Проверять обновления при запуске. - + Enable Gamemode Включить режим игры - + Force X11 as Graphics Backend Принудительно использовать X11 как графический бэкенд - + Custom frontend Собственный интерфейс эмулятора - + Real applet Приложение из прошивки - + Never Никогда - + On Load При загрузке - + Always Всегда - + CPU CPU - + GPU GPU - + CPU Asynchronous Асинхронный CPU - + Uncompressed (Best quality) Без сжатия (наилучшее качество) - + BC1 (Low quality) BC1 (низкое качество) - + BC3 (Medium quality) BC3 (среднее качество) - - + + Auto Авто - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Консервативный - + Aggressive Агрессивный - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (ассемблерные шейдеры, только для NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (экспериментальный, только для AMD/Mesa) - + Null Null - + Fast Производительность - - - + + + Accurate Точность - - - + + + Default По умолчанию - + Unsafe (fast) Небезопасно (быстро) - + Safe (stable) Безопасно (стабильно) - + Immediate Мгновенный - + Balanced Баланс - - Strict - Строгий - - - + Unsafe Небезопасно - + Paranoid (disables most optimizations) Параноик (отключает большинство оптимизаций) - + Debugging Отладка - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Безрамочный режим - + Exclusive Fullscreen Эксклюзивный полноэкранный - + No Video Output Отсутствие видеовыхода - + CPU Video Decoding Декодирование видео на CPU - + GPU Video Decoding (Default) Декодирование видео на GPU (По умолчанию) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [Экспериментально] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [Экспериментально] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [Экспериментально] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [ЭКПЕРИМЕНТАЛЬНО] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [Экспериментально] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Ближайший сосед (Nearest Neighbor) - + Bilinear Билинейный - + Bicubic Бикубический - + Gaussian По Гауссу - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX™️ Super Resolution - + Area Область (Area) - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Никакой - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Стандартное (16:9) - + Force 4:3 Принудительно 4:3 - + Force 21:9 Принудительно 21:9 - + Force 16:10 Принудительно 16:10 - + Stretch to Window Растянуть до окна - + Automatic Автоматически - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Японский (日本語) - + American English Американский английский - + French (français) Французский (français) - + German (Deutsch) Немецкий (Deutsch) - + Italian (italiano) Итальянский (italiano) - + Spanish (español) Испанский (español) - + Chinese Китайский - + Korean (한국어) Корейский (한국어) - + Dutch (Nederlands) Голландский (Nederlands) - + Portuguese (português) Португальский (português) - + Russian (Русский) Русский - + Taiwanese Тайваньский - + British English Британский английский - + Canadian French Канадский французский - + Latin American Spanish Латиноамериканский испанский - + Simplified Chinese Упрощённый китайский - + Traditional Chinese (正體中文) Традиционный китайский (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильский португальский (português do Brasil) - + Polish (polska) Польский (polska) - + Thai (แบบไทย) Тайский (แบบไทย) - - + + Japan Япония - + USA США - + Europe Европа - + Australia Австралия - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Авто (%1) - + Default (%1) Default time zone По умолчанию (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Египет - + Eire Эйре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Эйре - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвич - + Hongkong Гонконг - + HST HST - + Iceland Исландия - + Iran Иран - + Israel Израиль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Ливия - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польша - + Portugal Португалия - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сингапур - + Turkey Турция - + UCT UCT - + Universal Универсальный - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулу - + Mono Моно - + Stereo Стерео - + Surround Объемный звук - + 4GB DRAM (Default) 4 ГБ ОЗУ (По умолчанию) - + 6GB DRAM (Unsafe) 6 ГБ ОЗУ (Небезопасно) - + 8GB DRAM 8 ГБ ОЗУ - + 10GB DRAM (Unsafe) 10 ГБ ОЗУ (Небезопасно) - + 12GB DRAM (Unsafe) 12 ГБ ОЗУ (Небезопасно) - + Docked В док-станции - + Handheld Портативный - - + + Normal Нормальная - - + + Boost Ускоренная - - + + Overclock Разгон - + Always ask (Default) Всегда спрашивать (По умолчанию) - + Only if game specifies not to stop Только если игра указывает не останавливать - + Never ask Никогда не спрашивать - + Very Small (16 MB) Очень маленький (16 МБ) - + Small (32 MB) Маленький (32 МБ) - + Normal (128 MB) Нормальный (128 МБ) - + Large (256 MB) Большой (256 МБ) - + Very Large (512 MB) Очень большой (512 МБ) - + Very Low (4 MB) Очень низкий (4 МБ) - + Low (8 MB) Низкий (8 МБ) - + Normal (16 MB) Нормальный (16 МБ) - + Medium (32 MB) Средний (32 МБ) - + High (64 MB) Высокий (64 МБ) - + Very Low (32) Очень низкий (32) - + Low (64) Низкий (64) - + Normal (128) Нормальный (128) - + Medium (256) Средний (256) - + High (512) Высокий (512) - + Disabled Отключено - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View Древовидный - + Grid View Сетчатый @@ -7075,7 +7052,7 @@ Debug Message: - + &Pause &Пауза @@ -7226,7 +7203,7 @@ Debug Message: - + &Start &Запустить @@ -7237,7 +7214,7 @@ Debug Message: - + R&ecord З&апись @@ -7328,7 +7305,7 @@ Debug Message: - + None Никакой @@ -7354,405 +7331,405 @@ Debug Message: &В Виде Карусели - + Small (32x32) Маленький (32х32) - + Standard (64x64) Стандартный (64х64) - + Large (128x128) Большой (128х128) - + Full Size (256x256) Полноразмерный (256х256) - + Broken Vulkan Installation Detected Обнаружена поврежденная установка Vulkan - + Vulkan initialization failed during boot. Не удалось выполнить инициализацию Vulkan во время загрузки. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Запущена игра - + Loading Web Applet... Загрузка веб-апплета... - - + + Disable Web Applet Отключить веб-апплет - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Отключение веб-апплета может привести к неожиданному поведению и должно использоваться только, если вы хотите запустить Super Mario 3D All-Stars. Вы уверены, что хотите отключить веб-апплет? (Его можно снова включить в настройках отладки.) - + The amount of shaders currently being built Количество создаваемых шейдеров на данный момент - + The current selected resolution scaling multiplier. Текущий выбранный множитель масштабирования разрешения. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Текущая скорость эмуляции. Значения выше или ниже 100% указывают на то, что эмуляция идет быстрее или медленнее, чем на Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Количество кадров в секунду в данный момент. Значение будет различаться между играми и сценами. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Время, которое нужно для эмуляции одного кадра Switch, не принимая во внимание ограничение FPS или вертикальную синхронизацию. Для эмуляции в полной скорости значение должно быть не больше 16,67 мс. - + Unmute Включить звук - + Mute Выключить звук - + Reset Volume Сбросить громкость - + Configure Effects... - + &Clear Recent Files &Очистить недавние файлы - + &Continue &Продолжить - + Warning: Outdated Game Format Предупреждение: устаревший формат игры - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Для этой игры вы используете разархивированный формат ROM'а, который является устаревшим и был заменен другими, такими как NCA, NAX, XCI или NSP. В разархивированных каталогах ROM'а отсутствуют иконки, метаданные и поддержка обновлений.<br><br>Для получения информации о различных форматах Switch, поддерживаемых Eden, ознакомьтесь с руководством пользователя. Это сообщение больше не будет отображаться. - - + + Error while loading ROM! Ошибка при загрузке ROM'а! - + The ROM format is not supported. Формат ROM'а не поддерживается. - + An error occurred initializing the video core. Произошла ошибка при инициализации видеоядра. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Ошибка при загрузке ROM'а! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Пожалуйста, пересоздайте дампы ваших файлов или обратитесь за помощью в Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Произошла неизвестная ошибка. Пожалуйста, проверьте журнал для подробностей. - - + + (64-bit) (64-bit) - - + + (32-bit) (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Закрываем программу... - + Save Data Сохранения - + Mod Data Данные модов - + Error Opening %1 Folder Ошибка при открытии папки %1 - - + + Folder does not exist! Папка не существует! - + Remove Installed Game Contents? Удалить установленное содержимое игр? - + Remove Installed Game Update? Удалить установленное обновление игры? - + Remove Installed Game DLC? Удалить установленные DLC игры? - + Remove Entry Удалить запись - + Delete OpenGL Transferable Shader Cache? Удалить переносной кэш шейдеров OpenGL? - + Delete Vulkan Transferable Shader Cache? Удалить переносной кэш шейдеров Vulkan? - + Delete All Transferable Shader Caches? Удалить весь переносной кэш шейдеров? - + Remove Custom Game Configuration? Удалить пользовательскую настройку игры? - + Remove Cache Storage? Удалить кэш-хранилище? - + Remove File Удалить файл - + Remove Play Time Data Удалить данные игрового времени - + Reset play time? Сбросить время игры? - - + + RomFS Extraction Failed! Не удалось извлечь RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Произошла ошибка при копировании файлов RomFS или пользователь отменил операцию. - + Full Полный - + Skeleton Скелет - + Select RomFS Dump Mode Выберите режим дампа RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Пожалуйста, выберите, как вы хотите выполнить дамп RomFS. <br>Полный скопирует все файлы в новую папку, в то время как <br>скелет создаст только структуру папок. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root В %1 недостаточно свободного места для извлечения RomFS. Пожалуйста, освободите место или выберите другую папку для дампа в Эмуляция > Параметры > Система > Файловая система > Корень дампа - + Extracting RomFS... Извлечение RomFS... - - + + Cancel Отмена - + RomFS Extraction Succeeded! Извлечение RomFS прошло успешно! - + The operation completed successfully. Операция выполнена успешно. - + Error Opening %1 Ошибка при открытии %1 - + Select Directory Выбрать папку - + Properties Свойства - + The game properties could not be loaded. Не удалось загрузить свойства игры. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Исполняемый файл Switch (%1);;Все файлы (*.*) - + Load File Загрузить файл - + Open Extracted ROM Directory Открыть папку извлеченного ROM'а - + Invalid Directory Selected Выбрана недопустимая папка - + The directory you have selected does not contain a 'main' file. Папка, которую вы выбрали, не содержит файла 'main'. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Устанавливаемый файл Switch (*.nca *.nsp *.xci);;Архив контента Nintendo (*.nca);;Пакет подачи Nintendo (*.nsp);;Образ картриджа NX (*.xci) - + Install Files Установить файлы - + %n file(s) remaining %n файл(ов) осталось%n файл(ов) осталось%n файл(ов) осталось%n файл(ов) осталось - + Installing file "%1"... Установка "%1"... - - + + Install Results Результаты - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Чтобы избежать возможных конфликтов, мы не рекомендуем пользователям устанавливать игры в NAND. Пожалуйста, используйте эту функцию только для установки обновлений и DLC. - + %n file(s) were newly installed %n файл(ов) были установлены недавно @@ -7762,7 +7739,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten %n файл(ов) были перезаписаны @@ -7772,7 +7749,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install %n файл(ов) не удалось установить @@ -7782,324 +7759,324 @@ Please, only use this feature to install updates and DLC. - + System Application Системное приложение - + System Archive Системный архив - + System Application Update Обновление системного приложения - + Firmware Package (Type A) Пакет прошивки (Тип А) - + Firmware Package (Type B) Пакет прошивки (Тип Б) - + Game Игра - + Game Update Обновление игры - + Game DLC DLC игры - + Delta Title Дельта-титул - + Select NCA Install Type... Выберите тип установки NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Пожалуйста, выберите тип приложения, который вы хотите установить для этого NCA: (В большинстве случаев, подходит стандартный выбор «Игра».) - + Failed to Install Ошибка установки - + The title type you selected for the NCA is invalid. Тип приложения, который вы выбрали для NCA, недействителен. - + File not found Файл не найден - + File "%1" not found Файл "%1" не найден - + OK ОК - + Function Disabled Функция отключена - + Compatibility list reporting is currently disabled. Check back later! Отправка отчетов о совместимости временно отключена. Доступ будет восстановлен позднее! - + Error opening URL Ошибка при открытии URL - + Unable to open the URL "%1". Не удалось открыть URL: "%1". - + TAS Recording Запись TAS - + Overwrite file of player 1? Перезаписать файл игрока 1? - + Invalid config detected Обнаружена недопустимая конфигурация - + Handheld controller can't be used on docked mode. Pro controller will be selected. Портативный контроллер не может быть использован в режиме док-станции. Будет выбран контроллер Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Текущий amiibo был удален - + Error Ошибка - - + + The current game is not looking for amiibos Текущая игра не ищет amiibo - + Amiibo File (%1);; All Files (*.*) Файл Amiibo (%1);; Все Файлы (*.*) - + Load Amiibo Загрузить Amiibo - + Error loading Amiibo data Ошибка загрузки данных Amiibo - + The selected file is not a valid amiibo Выбранный файл не является допустимым amiibo - + The selected file is already on use Выбранный файл уже используется - + An unknown error occurred Произошла неизвестная ошибка - + No firmware available Прошивка недоступна - + Firmware Corrupted Прошивка повреждена - + Unknown applet Неизвестный апплет - + Applet doesn't map to a known value. Апплет не соответствует ни одному известному значению. - + Record not found Запись не найдена - + Applet not found. Please reinstall firmware. Апплет не найден. Пожалуйста, переустановите прошивку. - + Capture Screenshot Сделать скриншот - + PNG Image (*.png) Изображение PNG (*.png) - + TAS state: Running %1/%2 Состояние TAS: Выполняется %1/%2 - + TAS state: Recording %1 Состояние TAS: Записывается %1 - + TAS state: Idle %1/%2 Состояние TAS: Простой %1/%2 - + TAS State: Invalid Состояние TAS: Неверное - + &Stop Running &Остановка - + Stop R&ecording &Закончить запись - + Building: %n shader(s) Компиляция %n шейдер(ов)Компиляция %n шейдер(ов)Компиляция %n шейдер(ов)Компиляция %n шейдер(ов) - + Scale: %1x %1 is the resolution scaling factor Масштаб: %1x - + Speed: %1% / %2% Скорость: %1% / %2% - + Speed: %1% Скорость: %1% - + Game: %1 FPS Игра: %1 FPS - + Frame: %1 ms Кадр: %1 мс - + NO AA БЕЗ СГЛАЖИВАНИЯ - + NO FX - + FX - + VOLUME: MUTE ГРОМКОСТЬ: ЗАГЛУШЕНА - + VOLUME: %1% Volume percentage (e.g. 50%) ГРОМКОСТЬ: %1% - + Derivation Components Missing Отсутствуют необходимые компоненты - + Decryption keys are missing. Install them now? Ключи дешифрования отсутствуют. Хотите установить их? - + Wayland Detected! Обнаружен Wayland! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8110,74 +8087,74 @@ Would you like to force it for future launches? Хотите включить X11 для последующих запусков? - + Use X11 Использовать X11 - + Continue with Wayland Продолжить с Wayland - + Don't show again Больше не показывать - + Restart Required Требуется перезапуск - + Restart Eden to apply the X11 backend. Перезапустите Eden, чтобы применить X11. - + Slow Замедлено - + Turbo Турбо - + Unlocked Разблокировано - + Select RomFS Dump Target Выбор цели для дампа RomFS - + Please select which RomFS you would like to dump. Выберите RomFS, который вы хотите извлечь. - + Are you sure you want to close Eden? Вы уверены, что хотите закрыть Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Вы уверены, что хотите остановить эмуляцию? Любой несохраненный прогресс будет потерян. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index 1b20b42158..b5cfbaa063 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -834,66 +834,48 @@ Standard följer inställningen för GPU-noggrannhet. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. - Styr synkroniseringsbeteendet för GPU-staket. -Omedelbar är det snabbaste alternativet, men kan orsaka vissa problem. -Balanserad ger bättre kompatibilitet och kan lösa problem i vissa spel. -Exakt förbättrar kompatibiliteten ytterligare på bekostnad av viss prestanda. -Strikt är långsammast, men kan lösa problem som kräver striktare synkronisering. -Standard följer inställningen för GPU-noggrannhet. +Default follows the GPU Mode setting. + - Enable GPU buffer readback - Aktivera återläsning av GPU-buffert - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - Bevarar data som ändrats av GPU:n genom att läsa tillbaka dem före uppladdning. -Vissa spel kräver detta för att vissa effekter ska återges korrekt. - - - Enable asynchronous shader compilation Aktivera asynkron shaderkompilering - + May reduce shader stutter. Kan minska shader-hackighet. - + GPU Clocks GPU-klockfrekvenser - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. Får spelet att tro att GPU-arbetet avslutas snabbare än det gör, så att det slutar sänka upplösning och ritaravstånd för att passa Switch-klockfrekvenserna. - + GPU Unswizzle GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Accelererar avkodning av BCn 3D-texturer med hjälp av GPU-beräkningar. Inaktivera om du upplever krascher eller grafiska fel. - + GPU Unswizzle Max Texture Size Maximal texturstorlek för GPU Unswizzle - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -902,48 +884,48 @@ GPU är snabbare för medelstora och stora texturer, men CPU kan vara effektivar Justera detta för att hitta balansen mellan GPU-acceleration och CPU-överbelastning. - + GPU Unswizzle Stream Size Strömstorlek för GPU Unswizzle - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Ställer in den maximala mängden texturdata (i MiB) som bearbetas per bildruta. Högre värden kan minska hackighet under texturinläsning men kan påverka bildrutans konsistens. - + GPU Unswizzle Chunk Size Chunk-storlek för GPU Unswizzle - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Bestämmer antalet djupskivor som bearbetas i en enda sändning. Att öka detta kan förbättra genomströmningen på avancerade GPU:er, men kan orsaka TDR eller drivrutinstidsgränser på svagare hårdvara. - + Use Vulkan pipeline cache Använda Vulkan pipeline-cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Aktiverar GPU-leverantörsspecifik pipeline-cache. Det här alternativet kan förbättra laddningstiden för shaders avsevärt i fall där Vulkan-drivrutinen inte lagrar pipeline-cache-filer internt. - + Enable Compute Pipelines (Intel Vulkan Only) Aktivera compute pipelines (endast Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -952,194 +934,194 @@ Denna inställning finns endast för Intels egna drivrutiner och kan orsaka kras Beräkningspipelines är alltid aktiverade på alla andra drivrutiner. - + Enable Reactive Flushing Aktivera Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Använder reaktiv rensning i stället för prediktiv rensning, vilket ger mer exakt minnessynkning. - + Sync to framerate of video playback Synkronisera med bildfrekvensen för videouppspelning - + Run the game at normal speed during video playback, even when the framerate is unlocked. Kör spelet i normal hastighet under videouppspelning, även när bildfrekvensen är upplåst. - + Barrier feedback loops Återkopplingsloopar för barriärer - + Improves rendering of transparency effects in specific games. Förbättrar renderingen av transparenseffekter i vissa spel. - + Enable buffer history Aktivera bufferthistorik - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Aktiverar åtkomst till tidigare bufferttillstånd. Det här alternativet kan förbättra renderingskvaliteten och prestandakonsistensen i vissa spel. - + Fix bloom effects Korrigera bloom-effekter - + Removes bloom in Burnout. Tar bort bloom i Burnout. - + Enable Legacy Rescale Pass Aktivera äldre omskalningspass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Kan åtgärda skalningsproblem i vissa spel genom att förlita sig på beteendet från den tidigare implementeringen. Äldre beteende som åtgärdar linjeartefakter på AMD- och Intel-GPU:er och grå texturflimmer på Nvidia-GPU:er i Luigis Mansion 3. - + Extended Dynamic State Utökad dynamisk status - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Kontrollerar antalet funktioner som kan användas i utökat dynamiskt tillstånd. Högre tillstånd möjliggör fler funktioner och kan öka prestandan, men kan orsaka ytterligare grafiska problem. - + Vertex Input Dynamic State Dynamiskt tillstånd för vertexinmatning - + Enables vertex input dynamic state feature for better quality and performance. Aktiverar funktionen för dynamiskt tillstånd för vertexinmatning för bättre kvalitet och prestanda. - + Sample Shading Provskuggning - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Tillåter fragment-shadern att exekveras per prov i ett multisamplade fragment istället för en gång per fragment. Förbättrar grafikens kvalitet på bekostnad av prestanda. Högre värden förbättrar kvaliteten men försämrar prestandan. - + RNG Seed RNG-frö - + Controls the seed of the random number generator. Mainly used for speedrunning. Att kontrollera fröet till slumptalsgeneratorn. Används främst för speedrunning. - + Device Name Enhetsnamn - + The name of the console. Konsolens namn. - + Homebrew Args Homebrew-argument - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Kommandoradsargument som skickas till homebrew vid start (t.ex. -noglsl). - + Custom RTC Date: Anpassat RTC-datum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Med det här alternativet kan du ändra klockan på konsolen. Kan användas för att manipulera tiden i spel. - + The number of seconds from the current unix time Antalet sekunder från aktuell Unix-tid - + Language: Språk: - + This option can be overridden when region setting is auto-select Det här alternativet kan åsidosättas när regioninställningen är automatiskt vald. - + Region: Region: - + The region of the console. Konsolens region. - + Time Zone: Tidszon: - + The time zone of the console. Konsolens tidszon. - + Sound Output Mode: Ljudutmatningsläge: - + Console Mode: Konsolläge: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1148,1042 +1130,1037 @@ Spel ändrar upplösning, detaljer och stödda kontroller beroende på denna ins Inställningen Handhållen kan förbättra prestandan för enklare system. - + Prompt for user profile on boot Fråga efter användarprofil vid uppstart - + Useful if multiple people use the same PC. Användbart om flera personer använder samma dator. - + Pause when not in focus Pausa när inte i fokus - + Pauses emulation when focusing on other windows. Pausar emulering när fokus är på andra fönster. - + Confirm before stopping emulation Bekräfta innan emuleringen stoppas - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Åsidosätter frågor om att bekräfta att emuleringen ska avslutas. Om du aktiverar den hoppar du över sådana uppmaningar och avslutar emuleringen direkt. - + Hide mouse on inactivity Dölj musen vid inaktivitet - + Hides the mouse after 2.5s of inactivity. Döljer musen efter 2,5 sekunders inaktivitet. - + Disable controller applet Inaktivera kontroller-appleten - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Inaktiverar med tvång användningen av kontrollerappletten i emulerade program. När ett program försöker öppna kontrollerappletten stängs den omedelbart. - + Check for updates Leta efter uppdateringar - + Whether or not to check for updates upon startup. Om uppdateringar ska sökas vid start eller inte. - + Enable Gamemode Aktivera Gamemode - + Force X11 as Graphics Backend Tvinga X11 som grafikbackend - + Custom frontend Anpassad frontend - + Real applet Verklig applet - + Never Aldrig - + On Load Vid inläsning - + Always Alltid - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU asynkron - + Uncompressed (Best quality) Okomprimerad (bästa kvalitet) - + BC1 (Low quality) BC1 (låg kvalitet) - + BC3 (Medium quality) BC3 (medelhög kvalitet) - - + + Auto Auto - + 30 FPS 30 bilder/s - + 60 FPS 60 bilder/s - + 90 FPS 90 bilder/s - + 120 FPS 120 bilder/s - + Conservative Konservativ - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembly Shaders, endast NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimentell, endast AMD/Mesa) - + Null Null - + Fast Snabb - - - + + + Accurate Exakt - - - + + + Default Standard - + Unsafe (fast) Osäker (snabb) - + Safe (stable) Säker (stabil) - + Immediate Omedelbar - + Balanced Balanserad - - Strict - Strikt - - - + Unsafe Inte säker - + Paranoid (disables most optimizations) Paranoid (inaktiverar de flesta optimeringar) - + Debugging Felsökning - + Dynarmic Dynarmisk - + NCE NCE - + Borderless Windowed Ramlöst fönsterläge - + Exclusive Fullscreen Exklusiv helskärm - + No Video Output Ingen videoutgång - + CPU Video Decoding CPU-videoavkodning - + GPU Video Decoding (Default) GPU videoavkodning (standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTELL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTELL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Närmsta granne - + Bilinear Bilinjär - + Bicubic Bikubisk - + Gaussian Gaussisk - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Område - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tvinga 4:3 - + Force 21:9 Tvinga 21:9 - + Force 16:10 Tvinga 16:10 - + Stretch to Window Sträck ut till fönster - + Automatic Automatiskt - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japanska (日本語) - + American English Amerikansk engelska - + French (français) Franska (français) - + German (Deutsch) Tyska (Deutsch) - + Italian (italiano) Italienska (italiano) - + Spanish (español) Spanska (español) - + Chinese Kinesiska - + Korean (한국어) Koreanska (한국어) - + Dutch (Nederlands) Nederländska (Nederlands) - + Portuguese (português) Portugisiska (português) - + Russian (Русский) Ryska (Русский) - + Taiwanese Taiwanesiska - + British English Brittisk engelska - + Canadian French Kanadensisk franska - + Latin American Spanish Latinamerikansk spanska - + Simplified Chinese Förenklad kinesiska - + Traditional Chinese (正體中文) Traditionell kinesiska (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisiska (português do Brasil) - + Polish (polska) Polska (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egypten - + Eire Irland - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irland - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkiet - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET VÅT - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (osäker) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (osäker) - + 12GB DRAM (Unsafe) 12 GB DRAM (osäker) - + Docked Dockad - + Handheld Handhållen - - + + Normal Normal - - + + Boost Förstärk - - + + Overclock Överklocka - + Always ask (Default) Fråga alltid (standard) - + Only if game specifies not to stop Endast om spelet anger att det inte ska stoppas - + Never ask Fråga aldrig - + Very Small (16 MB) Mycket liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Mycket stor (512 MB) - + Very Low (4 MB) Mycket låg (4 MB) - + Low (8 MB) Låg (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medium (32 MB) - + High (64 MB) Hög (64 MB) - + Very Low (32) Mycket låg (32) - + Low (64) Låg (64) - + Normal (128) Normal (128) - + Medium (256) Medium (256) - + High (512) Hög (512) - + Disabled Inaktiverad - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View Trädvy - + Grid View Rutnätsvy @@ -7082,7 +7059,7 @@ Felsökningsmeddelande: - + &Pause &Paus @@ -7233,7 +7210,7 @@ Felsökningsmeddelande: - + &Start &Starta @@ -7244,7 +7221,7 @@ Felsökningsmeddelande: - + R&ecord Spela &in @@ -7335,7 +7312,7 @@ Felsökningsmeddelande: - + None Ingen @@ -7361,405 +7338,405 @@ Felsökningsmeddelande: &Karusellvy - + Small (32x32) Liten (32x32) - + Standard (64x64) Standard (64x64) - + Large (128x128) Stor (128x128) - + Full Size (256x256) Full storlek (256x256) - + Broken Vulkan Installation Detected Felaktig Vulkan-installation upptäcktes - + Vulkan initialization failed during boot. Vulkan-initialiseringen misslyckades under uppstarten. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Kör ett spel - + Loading Web Applet... Läser in webbapplet... - - + + Disable Web Applet Inaktivera webbapplet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Att inaktivera webbappletten kan leda till odefinierat beteende och bör endast användas med Super Mario 3D All-Stars. Är du säker på att du vill inaktivera webbappletten? (Detta kan återaktiveras i felsökningsinställningarna.) - + The amount of shaders currently being built Antalet shaders som för närvarande byggs - + The current selected resolution scaling multiplier. Den aktuella valda multiplikatorn för upplösningsskalning. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Aktuell emuleringshastighet. Värden högre eller lägre än 100% indikerar att emuleringen körs snabbare eller långsammare än en Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Hur många bildrutor per sekund spelet för närvarande visar. Detta varierar från spel till spel och från scen till scen. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Tid som krävs för att emulera en Switch-bildruta, exklusive bildbegränsning eller v-synkronisering. För emulering i full hastighet bör detta vara högst 16,67 ms. - + Unmute Aktivera ljud - + Mute Tyst - + Reset Volume Återställ volym - + Configure Effects... Konfigurera effekter... - + &Clear Recent Files &Töm tidigare filer - + &Continue &Fortsätt - + Warning: Outdated Game Format Varning: Föråldrat spelformat - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Du använder det dekonstruerade ROM-katalogformatet för detta spel, vilket är ett föråldrat format som har ersatts av andra format såsom NCA, NAX, XCI eller NSP. Dekonstruerade ROM-kataloger saknar ikoner, metadata och uppdateringsstöd.<br> För en förklaring av de olika Switch-format som Eden har stöd för, se vår användarhandbok. Detta meddelande kommer inte att visas igen. - - + + Error while loading ROM! Fel vid inläsning av ROM! - + The ROM format is not supported. ROM-formatet stöds inte. - + An error occurred initializing the video core. Ett fel uppstod vid initialiseringen av videokärnan. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. Detta orsakas vanligtvis av inaktuella grafikdrivrutiner. Se loggen för mer information. Se: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>Så här kommer du åt loggfiler</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Fel vid inläsning av ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Dumpa dina filer igen eller fråga på Discord/Stoat för hjälp. - + An unknown error occurred. Please see the log for more details. Ett okänt fel har uppstått. Se loggen för mer information. - - + + (64-bit) (64-bitar) - - + + (32-bit) (32-bitar) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Stänger programvara... - + Save Data Sparat data - + Mod Data Mod-data - + Error Opening %1 Folder Fel vid öppning av mappen %1 - - + + Folder does not exist! Mappen finns inte! - + Remove Installed Game Contents? Ta bort installerat spelinnehåll? - + Remove Installed Game Update? Ta bort installerad speluppdatering? - + Remove Installed Game DLC? Ta bort installerat spel-DLC? - + Remove Entry Ta bort post - + Delete OpenGL Transferable Shader Cache? Ta bort OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? Ta bort Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? Ta bort alla Transferable Shader Caches? - + Remove Custom Game Configuration? Ta bort anpassad spelkonfiguration? - + Remove Cache Storage? Ta bort cachelagring? - + Remove File Ta bort fil - + Remove Play Time Data Ta bort data om speltid - + Reset play time? Nollställ speltid? - - + + RomFS Extraction Failed! Extrahering av RomFS misslyckades! - + There was an error copying the RomFS files or the user cancelled the operation. Det uppstod ett fel vid kopieringen av RomFS-filerna eller så avbröt användaren åtgärden. - + Full Fullständigt - + Skeleton Skelett - + Select RomFS Dump Mode Välj dumpläge för RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Välj hur du vill att RomFS ska dumpas. <br>Fullständigt kopierar alla filer till den nya katalogen, medan <br>skelett endast skapar katalogstrukturen. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root Det finns inte tillräckligt med ledigt utrymme på %1 för att extrahera RomFS. Frigör utrymme eller välj en annan dumpkatalog under Emulering > Konfigurera > System > Filsystem > Dumprot. - + Extracting RomFS... Extraherar RomFS... - - + + Cancel Avbryt - + RomFS Extraction Succeeded! Extrahering av RomFS lyckades! - + The operation completed successfully. Operationen slutfördes. - + Error Opening %1 Fel vid öppning av %1 - + Select Directory Välj katalog - + Properties Egenskaper - + The game properties could not be loaded. Spelegenskaperna kunde inte läsas in. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Körbar Switch-fil (%1);;Alla filer (*.*) - + Load File Läs in fil - + Open Extracted ROM Directory Öppna katalog för extraherad ROM - + Invalid Directory Selected Ogiltig katalog valdes - + The directory you have selected does not contain a 'main' file. Den katalog du har valt innehåller ingen ”main”-fil. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Installerbar Switch-fil (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files Installera filer - + %n file(s) remaining %n fil återstår%n filer återstår - + Installing file "%1"... Installerar filen "%1"... - - + + Install Results Installationsresultat - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. För att undvika eventuella konflikter avråder vi användare från att installera basspel på NAND. Använd endast denna funktion för att installera uppdateringar och DLC. - + %n file(s) were newly installed %n ny fil installerades @@ -7767,7 +7744,7 @@ Använd endast denna funktion för att installera uppdateringar och DLC. - + %n file(s) were overwritten %n fil skrevs över @@ -7775,7 +7752,7 @@ Använd endast denna funktion för att installera uppdateringar och DLC. - + %n file(s) failed to install %n fil gick inte att installera @@ -7783,324 +7760,324 @@ Använd endast denna funktion för att installera uppdateringar och DLC. - + System Application Systemapplikation - + System Archive Systemarkiv - + System Application Update Uppdatering för systemapplikation - + Firmware Package (Type A) Firmware-paket (Type A) - + Firmware Package (Type B) Firmware-paket (Type B) - + Game Spel - + Game Update Speluppdatering - + Game DLC DLC för spel - + Delta Title Deltatitel - + Select NCA Install Type... Välj NCA-installationstyp... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Välj vilken typ av titel du vill installera denna NCA som: (I de flesta fall är standardinställningen ”Spel” tillräcklig.) - + Failed to Install Misslyckades med att installera - + The title type you selected for the NCA is invalid. Den titeltypen du valt för NCA är ogiltig. - + File not found Filen hittades inte - + File "%1" not found Filen "%1" hittades inte - + OK Ok - + Function Disabled Funktion inaktiverad - + Compatibility list reporting is currently disabled. Check back later! Rapportering till kompatibilitetslistan är för närvarande inaktiverad. Kom tillbaka senare! - + Error opening URL Fel vid öppning av URL - + Unable to open the URL "%1". Det går inte att öppna URL:en ”%1”. - + TAS Recording TAS-inspelning - + Overwrite file of player 1? Skriv över fil för spelare 1? - + Invalid config detected Ogiltig konfiguration upptäcktes - + Handheld controller can't be used on docked mode. Pro controller will be selected. Handhållen kontroller kan inte användas i dockat läge. Pro-kontrollern kommer att väljas. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Den aktuella amiibo har tagits bort. - + Error Fel - - + + The current game is not looking for amiibos Det aktuella spelet letar inte efter amiibos - + Amiibo File (%1);; All Files (*.*) Amiibo-fil (%1);; Alla filer (*.*) - + Load Amiibo Läs in Amiibo - + Error loading Amiibo data Fel vid läsning av Amiibo-data - + The selected file is not a valid amiibo Den valda filen är inte en giltig amiibo. - + The selected file is already on use Den valda filen används redan - + An unknown error occurred Ett okänt fel uppstod - + No firmware available Ingen firmware tillgänglig - + Firmware Corrupted Firmware är skadat - + Unknown applet Okänd applet - + Applet doesn't map to a known value. Appleten mappar inte till ett känt värde. - + Record not found Posten hittades inte - + Applet not found. Please reinstall firmware. Appleten hittades inte. Installera om fast programvara. - + Capture Screenshot Ta skärmbild - + PNG Image (*.png) PNG-bild (*.png) - + TAS state: Running %1/%2 TAS-tillstånd: Kör %1/%2 - + TAS state: Recording %1 TAS-tillstånd: Spelar in %1 - + TAS state: Idle %1/%2 TAS-tillstånd: Overksam %1/%2 - + TAS State: Invalid TAS-tillstånd: Ogiltig - + &Stop Running &Stoppa körning - + Stop R&ecording Stoppa i&nspelning - + Building: %n shader(s) Bygger: %n shaderBygger: %n shaders - + Scale: %1x %1 is the resolution scaling factor Skala: %1x - + Speed: %1% / %2% Hastighet: %1% / %2% - + Speed: %1% Hastighet: %1% - + Game: %1 FPS Spel: %1 bilder/s - + Frame: %1 ms Bildruta: %1 ms - + NO AA NO AA - + NO FX INGA FX - + FX FX - + VOLUME: MUTE VOLYM: TYST - + VOLUME: %1% Volume percentage (e.g. 50%) VOLYM: %1% - + Derivation Components Missing Deriveringskomponenter saknas - + Decryption keys are missing. Install them now? Avkrypteringsnycklar saknas. Installera dem nu? - + Wayland Detected! Wayland upptäcktes! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8111,74 +8088,74 @@ Det rekommenderas att använda X11 istället. Vill du tvinga det för framtida starter? - + Use X11 Använd X11 - + Continue with Wayland Fortsätt med Wayland - + Don't show again Visa inte igen - + Restart Required Omstart krävs - + Restart Eden to apply the X11 backend. Starta om Eden för att tillämpa X11-backend. - + Slow Långsam - + Turbo Turbo - + Unlocked Upplåst - + Select RomFS Dump Target Välj RomFS-dumpmål - + Please select which RomFS you would like to dump. Välj vilken RomFS du vill dumpa. - + Are you sure you want to close Eden? Är du säker på att du vill stänga Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Är du säker på att du vill stoppa emuleringen? Alla osparade framsteg kommer att gå förlorade. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index d200ff2994..7bb09e316e 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -802,1333 +802,1316 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation Asenkron gölgelendirici derlemeyi etkinleştir - + May reduce shader stutter. Gölgelendirici/shader takılmalarını azaltabilir. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Vulkan pipeline önbelleği kullan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Grafik kartı üreticisine özel işlem hattı önbelleğini etkinleştirir. Bu seçenek, Vulkan sürücüsünün işlem hattı önbellek dosyalarını dahili olarak saklamadığı durumlarda gölgelendirici yükleme süresini önemli ölçüde iyileştirebilir. - + Enable Compute Pipelines (Intel Vulkan Only) Hesaplama İşlem Hatlarını Etkinleştir (Yalnızca Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. Bazı oyunlar için gereklidir. Bu ayar yalnızca Intel'in tescilli sürücüleri için mevcuttur ve etkinleştirilirse çökmeye neden olabilir. Hesaplama işlem hatları diğer tüm sürücülerde her zaman etkindir. - + Enable Reactive Flushing Reaktif Temizlemeyi Etkinleştir - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Tahminli temizleme yerine reaktif temizleme kullanarak daha doğru bellek senkronizasyonu sağlar. - + Sync to framerate of video playback Video oynatma kare hızına senkronize et - + Run the game at normal speed during video playback, even when the framerate is unlocked. Kare hızı kilidi açık olsa bile video oynatımı sırasında oyunu normal hızda çalıştırır. - + Barrier feedback loops Bariyer geri besleme döngüleri - + Improves rendering of transparency effects in specific games. Belirli oyunlarda şeffaflık efektlerinin oluşturulmasını iyileştirir. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State Genişletilmiş Dinamik Durum - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Genişletilmiş Dinamik Durumda kullanılabilecek özelliklerin sayısını kontrol eder. Daha yüksek durumlar daha fazla özelliğe izin verir ve performansı artırabilir, ancak ek grafik sorunlarına neden olabilir. - + Vertex Input Dynamic State Vertex Dinamik Durumu - + Enables vertex input dynamic state feature for better quality and performance. Daha iyi kalite ve performans için Vertex dinamik durum özelliğini etkinleştirir. - + Sample Shading Örnek Gölgelendirme - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Parça gölgelendiricinin, her parça için bir kez yerine çoklu örneklenmiş bir parçadaki her örnek için yürütülmesine olanak tanır. Performans pahasına grafik kalitesini artırır. Daha yüksek değerler kaliteyi artırır ancak performansı düşürür. - + RNG Seed RNG çekirdeği - + Controls the seed of the random number generator. Mainly used for speedrunning. Rastgele sayı üretecinin tohumunu kontrol eder. Esas olarak hızlı bitirme denemeleri için kullanılır. - + Device Name Cihaz İsmi - + The name of the console. Konsolun adı - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Özel RTC Tarihi - + This option allows to change the clock of the console. Can be used to manipulate time in games. Bu seçenek konsolun saatini değiştirmeye olanak tanır. Oyunlarda zamanı manipüle etmek için kullanılabilir. - + The number of seconds from the current unix time Mevcut unix zamanından itibaren saniye sayısı - + Language: Dil: - + This option can be overridden when region setting is auto-select Bölge ayarı otomatik seçim olduğunda bu seçenek geçersiz kılınabilir. - + Region: Bölge: - + The region of the console. Konsolun bölgesi - + Time Zone: Saat Dilimi: - + The time zone of the console. Konsolun saat dilimi - + Sound Output Mode: Ses Çıkış Modu: - + Console Mode: Konsol Modu: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. Konsolun Yerleşik veya El Modunda olup olmadığını seçer. Oyunlar bu ayara bağlı olarak çözünürlüklerini, detaylarını ve desteklenen kontrolcülerini değiştirecektir. El Moduna ayarlamak, düşük seviyeli sistemler için performansı artırmaya yardımcı olabilir. - + Prompt for user profile on boot Açılışta kullanıcı profili için sor - + Useful if multiple people use the same PC. Aynı bilgisayarı birden fazla kişi kullanıyorsa yararlıdır. - + Pause when not in focus Odaklı değilken duraklat - + Pauses emulation when focusing on other windows. Diğer pencerelere odaklanıldığında emülasyonu duraklatır. - + Confirm before stopping emulation Emülasyonu durdurmadan önce onayla - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Emülasyonu durdurma onayı isteklerini/istemlerini geçersiz kılar. Etkinleştirildiğinde, bu tür istekleri/istemleri atlar ve emülasyonu doğrudan/dirket olarak kapatır. - + Hide mouse on inactivity Hareketsizlik durumunda imleci gizle - + Hides the mouse after 2.5s of inactivity. 2,5 saniye hareketsizlikten sonra fareyi gizler. - + Disable controller applet Kontrolcü aplikasyonunu devre dışı bırak - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Emüle edilen programlarda kontrolcü aplikasyonunun kullanımını zorla devre dışı bırakır. Bir program kontrolcü aplikasyonunu açmaya çalıştığında, aplikasyon anında kapatılır. - + Check for updates Güncellemeleri Kontrol Et - + Whether or not to check for updates upon startup. Başlangıçta güncellemelerin kontrol edilip edilmeyeceği. - + Enable Gamemode Oyun Modunu/Gamemode Etkinleştir - + Force X11 as Graphics Backend Grafik arka ucu olarak X11'i zorla - + Custom frontend Özel ön yüz - + Real applet Gerçek aplikasyon - + Never Asla - + On Load Yüklemede - + Always Her zaman - + CPU CPU - + GPU GPU - + CPU Asynchronous Asenkron CPU - + Uncompressed (Best quality) Sıkıştırılmamış (En iyi kalite) - + BC1 (Low quality) BC1 (Düşük kalite) - + BC3 (Medium quality) BC3 (Orta kalite) - - + + Auto Otomatik - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Muhafazakar - + Aggressive Agresif - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Boş - + Fast Hızlı - - - + + + Accurate Doğru - - - + + + Default Varsayılan - + Unsafe (fast) Güvenli Değil (hızlı) - + Safe (stable) Güvenli (Stabil) - + Immediate - + Balanced Dengeli - - Strict - - - - + Unsafe Güvensiz - + Paranoid (disables most optimizations) Paranoya (çoğu optimizasyonu kapatır) - + Debugging Hata ayıklama - + Dynarmic Dinamik - + NCE NCE - + Borderless Windowed Kenarlıksız Tam Ekran - + Exclusive Fullscreen Ayrılmış Tam Ekran - + No Video Output Video Çıkışı Yok - + CPU Video Decoding CPU Video Decoding - + GPU Video Decoding (Default) GPU Video Decoding (Varsayılan) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [DENEYSEL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [DENEYSEL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [DENEYSEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [DENEYSEL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [DENEYSEL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor En Yakın Komşu Algoritması - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gausyen - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Süper Çözünürlük - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Yok - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Varsayılan (16:9) - + Force 4:3 4:3'e Zorla - + Force 21:9 21:9'a Zorla - + Force 16:10 16:10'a Zorla - + Stretch to Window Ekrana Sığdır - + Automatic Otomatik - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonca (日本語) - + American English Amerikan İngilizcesi - + French (français) Fransızca (français) - + German (Deutsch) Almanca (Deutsch) - + Italian (italiano) İtalyanca (italiano) - + Spanish (español) İspanyolca (español) - + Chinese Çince - + Korean (한국어) Korece (한국어) - + Dutch (Nederlands) Flemenkçe (Nederlands) - + Portuguese (português) Portekizce (português) - + Russian (Русский) Rusça (Русский) - + Taiwanese Tayvanca - + British English İngiliz İngilizcesi - + Canadian French Kanada Fransızcası - + Latin American Spanish Latin Amerika İspanyolcası - + Simplified Chinese Basitleştirilmiş Çince - + Traditional Chinese (正體中文) Geleneksel Çince (正體中文) - + Brazilian Portuguese (português do Brasil) Brezilya Portekizcesi (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonya - + USA ABD - + Europe Avrupa - + Australia Avustralya - + China Çin - + Korea Kore - + Taiwan Tayvan - + Auto (%1) Auto select time zone Otomatik (%1) - + Default (%1) Default time zone Varsayılan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Küba - + EET EET - + Egypt Mısır - + Eire İrlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-İrlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 MT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland İzlanda - + Iran İran - + Israel İsrail - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navaho - + NZ Yeni Zelanda - + NZ-CHAT Chatham Adaları - + Poland Polonya - + Portugal Portekiz - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkiye - + UCT UCT - + Universal Evrensel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Varsayılan) - + 6GB DRAM (Unsafe) 6GB DRAM (Güvenli Değil) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Güvenli Değil) - + 12GB DRAM (Unsafe) 12GB DRAM (Güvenli Değil) - + Docked Dock Modu Aktif - + Handheld Taşınabilir - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Her zaman sor (Varsayılan) - + Only if game specifies not to stop Sadece oyun durdurulmamasını belirtirse - + Never ask Asla sorma - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Orta (256) - + High (512) Yüksek (512) - + Disabled Devre Dışı - + ExtendedDynamicState 1 Genişletilmiş Dinamik Durum 1 - + ExtendedDynamicState 2 Genişletilmiş Dinamik Durum 2 - + ExtendedDynamicState 3 Genişletilmiş Dinamik Durum 3 - + Tree View - + Grid View @@ -7016,7 +6999,7 @@ Debug Message: - + &Pause &Duraklat @@ -7167,7 +7150,7 @@ Debug Message: - + &Start B&aşlat @@ -7178,7 +7161,7 @@ Debug Message: - + R&ecord K&aydet @@ -7269,7 +7252,7 @@ Debug Message: - + None @@ -7295,737 +7278,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected Bozuk Vulkan Kurulumu Algılandı - + Vulkan initialization failed during boot. Açılış sırasında Vulkan başlatma işlemi başarısız oldu. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Bir oyun çalıştırılıyor - + Loading Web Applet... Web Uygulaması Yükleniyor... - - + + Disable Web Applet Web Uygulamasını Devre Dışı Bırak - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute Sesi aç - + Mute Sessize al - + Reset Volume Sesi Sıfırla - + Configure Effects... - + &Clear Recent Files &Son Dosyaları Temizle - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL URL açılırken hata oluştu - + Unable to open the URL "%1". - + TAS Recording TAS İşlemi Kaydı - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Mevcut Amiibo kaldırıldı - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted Donanım Yazılımı/Firmware Bozuk - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 TAS durumu: %1/%2 Çalışıyor - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor Ölçek: %1x - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8033,74 +8016,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/uk.ts b/dist/languages/uk.ts index 055787457d..4b7e94bfe9 100644 --- a/dist/languages/uk.ts +++ b/dist/languages/uk.ts @@ -829,60 +829,48 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation Увімкнути асинхронну компіляцію шейдерів - + May reduce shader stutter. Може зменшити шейдерні затримки. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle Розпакування за допомогою ГП - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Прискорює декодування 3D-текстур BCn застосовуючи обчислення за допомогою ГП. Вимкніть у разі збоїв або проблем із графікою. - + GPU Unswizzle Max Texture Size Максимальний розмір текстур для розпакування за допомогою ГП - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -891,48 +879,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size Розмір потоку розпакування за допомогою ГП - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Встановлює максимальний обсяг даних текстур (у МіБ) для обробки на кадр. Вищі значення здатні зменшити затримки під час завантаження текстур, але можуть вплинути на стабільність кадрів. - + GPU Unswizzle Chunk Size Розмір блоків розпакування за допомогою ГП - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Визначає кількість зрізів глибини, оброблених за одне відправлення. Збільшення здатне покращити пропускну здатність на потужних ГП, але може призвести до TDR або затримок драйвера зі слабшим устаткуванням. - + Use Vulkan pipeline cache Використовувати кеш конвеєра Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Вмикає особливий для різних виробників ГП кеш конвеєра. Це налаштування може значно зменшити час завантаження шейдерів у випадках, коли драйвер Vulkan не зберігає власний кеш конвеєра. - + Enable Compute Pipelines (Intel Vulkan Only) Увімкнути обчислювальні конвеєри (лише Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -941,194 +929,194 @@ Compute pipelines are always enabled on all other drivers. Обчислювальні конвеєри завжди увімкнені у всіх інших драйверах. - + Enable Reactive Flushing Увімкнути реактивне очищення - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Використовує реактивне очищення замість прогнозованого, забезпечуючи точнішу синхронізацію пам’яті. - + Sync to framerate of video playback Синхронізувати частоту кадрів з відтворенням відео - + Run the game at normal speed during video playback, even when the framerate is unlocked. Відтворювати гру з нормальною швидкістю під час відтворення відео навіть при розблокованій частоті кадрів. - + Barrier feedback loops Бар’єрні цикли відгуку - + Improves rendering of transparency effects in specific games. Покращує візуалізацію ефектів прозорості в деяких іграх. - + Enable buffer history Увімкнути історію буфера - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Вмикає доступ до попередніх станів буфера. Цей параметр може покращити якість візуалізації та стабільну продуктивність у деяких іграх. - + Fix bloom effects Виправити ефекти світіння - + Removes bloom in Burnout. Прибирає світіння в Burnout. - + Enable Legacy Rescale Pass Увімкнути застаріле масштабування - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. Може виправити проблеми з масштабуванням в іграх, покладаючись на поведінку з попередньої імплементації. Застаріле масштабування виправляє артефакти з лініями на ГП від AMD та Intel, а також сіре блимання текстур на ГП від Nvidia в Luigis Mansion 3. - + Extended Dynamic State Розширений динамічний стан - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Керує кількістю функцій, які можна використовувати в «Розширеному динамічному стані». Вищі значення допускають більше функцій і можуть збільшити продуктивність, але можуть спричинити додаткові проблеми з графікою. - + Vertex Input Dynamic State Динамічний стан введення вершин - + Enables vertex input dynamic state feature for better quality and performance. Вмикає можливість динамічного стану введення вершин для кращих якості й продуктивності. - + Sample Shading Шейдинг зразків - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Дозволяє виконувати фрагмент шейдера для кожного зразка в багатозразковому фрагменті замість одного разу для кожного фрагмента. Покращує якість графікі ціною втрати продуктивності. Вищі значення покращують якість, але погіршують продуктивність. - + RNG Seed Початкове значення RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Керує початковим значення генератора випадкових чисел. Зазвичай використовується в спідранах. - + Device Name Назва пристрою - + The name of the console. Назва консолі. - + Homebrew Args Параметри запуску Homebrew - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Параметри командного рядка, що передаються Homebrew при запуску (як-от noglsl). - + Custom RTC Date: Користувацька дата RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Це налаштування дозволяє змінити час годинника консолі. Можна використовувати для маніпуляцій із часом в іграх. - + The number of seconds from the current unix time Кількість секунд від поточного unix-часу. - + Language: Мова: - + This option can be overridden when region setting is auto-select Це налаштування може перевизначитися, якщо налаштування регіону вибирається автоматично - + Region: Регіон: - + The region of the console. Регіон консолі. - + Time Zone: Часовий пояс: - + The time zone of the console. Часовий пояс консолі. - + Sound Output Mode: Режим виведення звуку: - + Console Mode: Режим консолі: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1137,1042 +1125,1037 @@ Setting to Handheld can help improve performance for low end systems. Налаштування «Портативний» може покращити продуктивність на слабких системах. - + Prompt for user profile on boot Запитувати профіль користувача під час запуску - + Useful if multiple people use the same PC. Корисно, якщо одним комп’ютером користуються кілька користувачів. - + Pause when not in focus Призупиняти, якщо не у фокусі - + Pauses emulation when focusing on other windows. Призупиняє емуляцію при фокусування на інших вікнах. - + Confirm before stopping emulation Підтверджувати зупинку емуляції - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Перевизначає запити на підтвердження зупинки емуляції. Увімкнення обходить такі запити й одразу зупиняє емуляцію. - + Hide mouse on inactivity Приховувати курсор миші при бездіяльності - + Hides the mouse after 2.5s of inactivity. Приховує курсор миші після 2,5 с її бездіяльності. - + Disable controller applet Вимкнути аплет контролера - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. Примусово вимикає використання в емульованих програмах аплета контролера. Якщо програма спробує відкрити аплет контролера, він одразу закриється. - + Check for updates Перевіряти оновлення - + Whether or not to check for updates upon startup. Чи перевіряти оновлення при запуску. - + Enable Gamemode Увімкнути ігровий режим - + Force X11 as Graphics Backend Примусово використовувати X11 як графічний бекенд - + Custom frontend Користувацький фронтенд - + Real applet Справжній аплет - + Never Ніколи - + On Load При завантаженні - + Always Завжди - + CPU ЦП - + GPU ГП - + CPU Asynchronous Асинхронно ЦП - + Uncompressed (Best quality) Без стиснення (Найкраща якість) - + BC1 (Low quality) ВС1 (Низька якість) - + BC3 (Medium quality) ВС3 (Середня якість) - - + + Auto Автоматично - + 30 FPS 30 к/с - + 60 FPS 60 к/с - + 90 FPS 90 к/с - + 120 FPS 120 к/с - + Conservative Заощадження - + Aggressive Агресивно - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (асемблерні шейдери, лише NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (експериментально, лише AMD/Mesa) - + Null Нічого - + Fast Швидко - - - + + + Accurate Точно - - - + + + Default Стандартно - + Unsafe (fast) Небезпечно (швидко) - + Safe (stable) Безпечно (стабільно) - + Immediate - + Balanced Збалансовано - - Strict - - - - + Unsafe Небезпечно - + Paranoid (disables most optimizations) Параноїк (вимикає більшість оптимізацій) - + Debugging Зневадження - + Dynarmic Динамічно - + NCE NCE - + Borderless Windowed Безрамкове вікно - + Exclusive Fullscreen Ексклюзивний повноекранний - + No Video Output Виведення відео відсутнє - + CPU Video Decoding Декодування відео на ЦП - + GPU Video Decoding (Default) Декодування відео на ГП (стандатно) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [ЕКСПЕРИМЕНТАЛЬНО] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [ЕКСПЕРИМЕНТАЛЬНО] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ЕКСПЕРИМЕНТАЛЬНО] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [ЕКСПЕРИМЕНТАЛЬНО] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [ЕКСПЕРИМЕНТАЛЬНО] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Найближчий сусід - + Bilinear Білінійний - + Bicubic Бікубічний - + Gaussian Ґаусса - + Lanczos Ланцоша - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Області - + MMPX MMPX - + Zero-Tangent Нульовий тангенс - + B-Spline B-Spline - + Mitchell Мітчелла - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Немає - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Стандартно (16:9) - + Force 4:3 Примусово 4:3 - + Force 21:9 Примусово 21:9 - + Force 16:10 Примусово 16:10 - + Stretch to Window Розтягнути до вікна - + Automatic Автоматично - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Японська (日本語) - + American English Американська англійська - + French (français) Французька (français) - + German (Deutsch) Німецька (Deutsch) - + Italian (italiano) Італійська (italiano) - + Spanish (español) Іспанська (español) - + Chinese Китайська - + Korean (한국어) Корейська (한국어) - + Dutch (Nederlands) Нідерландська (Nederlands) - + Portuguese (português) Португальська (português) - + Russian (Русский) Російська (Русский) - + Taiwanese Тайванська - + British English Британська англійська - + Canadian French Канадська французька - + Latin American Spanish Латиноамериканська іспанська - + Simplified Chinese Спрощена китайська - + Traditional Chinese (正體中文) Традиційна китайська (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильська португальська (português do Brasil) - + Polish (polska) Польська (polska) - + Thai (แบบไทย) Тайська (แบบไทย) - - + + Japan Японія - + USA США - + Europe Європа - + Australia Австралія - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Автоматично (%1) - + Default (%1) Default time zone Стандартно (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Єгипет - + Eire Ейре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвіч - + Hongkong Гонконг - + HST HST - + Iceland Ісландія - + Iran Іран - + Israel Ізраїль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Лівія - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польща - + Portugal Португалія - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сінгапур - + Turkey Туреччина - + UCT UCT - + Universal Універсальний - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулу - + Mono Моно - + Stereo Стерео - + Surround Об’ємний - + 4GB DRAM (Default) 4GB DRAM (стандартно) - + 6GB DRAM (Unsafe) 6GB DRAM (небезпечно) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (небезпечно) - + 12GB DRAM (Unsafe) 12GB DRAM (небезпечно) - + Docked У докстанції - + Handheld Портативний - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Завжди запитувати (стандартно) - + Only if game specifies not to stop Лише якщо гра вказує не зупиняти - + Never ask Ніколи не запитувати - + Very Small (16 MB) Дуже малий (16 МБ) - + Small (32 MB) Малий (32 МБ) - + Normal (128 MB) Нормальний (128 МБ) - + Large (256 MB) Великий (256 МБ) - + Very Large (512 MB) Дуже великий (512 МБ) - + Very Low (4 MB) Дуже низький (4 МБ) - + Low (8 MB) Низький (8 МБ) - + Normal (16 MB) Нормальний (16 МБ) - + Medium (32 MB) Середній (32 МБ) - + High (64 MB) Високий (64 МБ) - + Very Low (32) Дуже низький (32) - + Low (64) Низький (64) - + Normal (128) Нормальний (128) - + Medium (256) Середньо (256) - + High (512) Високо (512) - + Disabled Вимкнено - + ExtendedDynamicState 1 Розширений динамічний стан 1 - + ExtendedDynamicState 2 Розширений динамічний стан 2 - + ExtendedDynamicState 3 Розширений динамічний стан 3 - + Tree View Дерево вибору - + Grid View Таблиця @@ -7070,7 +7053,7 @@ Debug Message: - + &Pause [&P] Призупинити @@ -7221,7 +7204,7 @@ Debug Message: - + &Start [&S] Запустити @@ -7232,7 +7215,7 @@ Debug Message: - + R&ecord [&E] Запис @@ -7323,7 +7306,7 @@ Debug Message: - + None Жодного @@ -7349,405 +7332,405 @@ Debug Message: - + Small (32x32) Маленький (32х32) - + Standard (64x64) Стандартний (64х64) - + Large (128x128) Великий (128х128) - + Full Size (256x256) Повнорозмірний (256х256) - + Broken Vulkan Installation Detected Виявлено пошкоджене встановлення Vulkan - + Vulkan initialization failed during boot. Не вдалося ініціалізувати Vulkan під час запуску. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping Запущено гру - + Loading Web Applet... Завантаження вебаплета... - - + + Disable Web Applet Вимкнути вебаплет - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) Вимкнення вебапплета може призвести до несподіваної поведінки, і це слід робити лише для Super Mario 3D All-Stars. Ви впевнені, що хочете вимкнути вебапплет? (Його можна знову увімкнути в налаштуваннях зневадження.) - + The amount of shaders currently being built Кількість наразі створених шейдерів - + The current selected resolution scaling multiplier. Наразі вибраний множник масштабування роздільності. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. Поточна швидкість емуляції. Значення вище або нижче 100% вказують на те, що емуляція йде швидше або повільніше, ніж на Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. Частота кадрів, яку наразі показує гра. Значення змінюватиметься залежно від гри та з кожною сценою. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. Час, потрібний для емуляції 1 кадру Switch, не враховуючи обмеження частоти кадрів або вертикальну синхронізацію. Для повношвидкісної емуляції значення повинно бути не вище 16,67 мс. - + Unmute Увімкнути звук - + Mute Вимкнути звук - + Reset Volume Скинути гучність - + Configure Effects... - + &Clear Recent Files [&C] Очистити нещодавні файли - + &Continue [&C] Продовжити - + Warning: Outdated Game Format Увага: Застарілий формат гри - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. Для цієї гри ви використовуєте формат теки з деконструйованим ROM, який є застарілим форматом, заміненим на інші, як-от NCA, NAX, XCI, або NSP. У тек із деконструйованими ROM немає значків, метаданих, а також вони не підтримують оновлення.<br>Для подробиць стосовно різноманітних форматів Switch, які підтримує Eden, ознайомтеся з нашим посібником користувача. Це повідомлення не буде показано знову. - - + + Error while loading ROM! Помилка під час завантаження ROM! - + The ROM format is not supported. Непідтримуваний формат ROM. - + An error occurred initializing the video core. Сталася помилка під час ініціалізації відеоядра. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. Помилка під час завантаження ROM! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>Створіть новий дамп файлів або зверніться по допомогу в Discord/Stoat. - + An unknown error occurred. Please see the log for more details. Сталася невідома помилка. Ознайомтеся з журналом, щоб дізнатися подробиці. - - + + (64-bit) (64-бітовий) - - + + (32-bit) (32-бітовий) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... Закриття програмного засобу... - + Save Data Дані збережень - + Mod Data Дані модів - + Error Opening %1 Folder Помилка під час відкриття теки «%1» - - + + Folder does not exist! Теки не існує! - + Remove Installed Game Contents? Вилучити встановлений вміст гри? - + Remove Installed Game Update? Вилучити встановлені оновлення гри? - + Remove Installed Game DLC? Вилучити встановлені доповнення гри? - + Remove Entry Вилучити запис - + Delete OpenGL Transferable Shader Cache? Видалити переміщуваний кеш шейдерів OpenGL? - + Delete Vulkan Transferable Shader Cache? Видалити переміщуваний кеш шейдерів Vulkan? - + Delete All Transferable Shader Caches? Видалити весь переміщуваний кеш шейдерів? - + Remove Custom Game Configuration? Вилучити користувацькі налаштування гри? - + Remove Cache Storage? Вилучити сховище кешу? - + Remove File Вилучити файл - + Remove Play Time Data Вилучити дані награного часу - + Reset play time? Скинути награний час? - - + + RomFS Extraction Failed! Не вдалося видобути RomFS! - + There was an error copying the RomFS files or the user cancelled the operation. Під час копіювання файлів RomFS сталася помилка або користувач скасував операцію. - + Full Повний - + Skeleton Скелет - + Select RomFS Dump Mode Виберіть режим створення дампу RomFS - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. Виберіть, як ви хочете виконати дамп RomFS <br>Повний скопіює всі файли до нової теки, тоді як <br>скелет створить лише структуру тек. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root За адресою «%1» недостатньо вільного місця для видобування RomFS. Звільніть місце або виберіть іншу теку для створення дампу в «Емуляція» → «Налаштувати» → «Система» → «Файлова система» → «Коренева тека дампів». - + Extracting RomFS... Видобування RomFS... - - + + Cancel Скасувати - + RomFS Extraction Succeeded! RomFS видобуто успішно! - + The operation completed successfully. Операцію успішно виконано. - + Error Opening %1 Помилка під час відкриття «%1» - + Select Directory Вибрати теку - + Properties Властивості - + The game properties could not be loaded. Неможливо завантажити властивості гри. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Виконуваний файл Switch (%1);;Усі файли (*.*) - + Load File Завантажити файл - + Open Extracted ROM Directory Відкрити теку видобутого ROM - + Invalid Directory Selected Вибрано неправильну теку - + The directory you have selected does not contain a 'main' file. Вибрана тека не містить файлу «main». - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) Встановлюваний файл Switch (*.nca, *.nsp, *.xci);;Архів вмісту Nintendo (*.nca);;Пакет подання Nintendo (*.nsp);;Образ картриджа NX (*.xci) - + Install Files Встановити файли - + %n file(s) remaining Лишився 1 файлЛишилося %n файлиЛишилося %n файлівЛишилося %n файлів - + Installing file "%1"... Встановлення файлу «%1»... - - + + Install Results Результати встановлення - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. Щоб уникнути можливих конфліктів, ми не радимо користувачам встановлювати ігри в NAND. Користуйтеся цією функцією лише для встановлення оновлень і доповнень. - + %n file(s) were newly installed Щойно встановлено %n файл @@ -7757,7 +7740,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) were overwritten Перезаписано %n файл @@ -7767,7 +7750,7 @@ Please, only use this feature to install updates and DLC. - + %n file(s) failed to install Не вдалося встановити %n файл @@ -7777,324 +7760,324 @@ Please, only use this feature to install updates and DLC. - + System Application Системний застосунок - + System Archive Системний архів - + System Application Update Оновлення системного застосунку - + Firmware Package (Type A) Пакет прошивки (Тип А) - + Firmware Package (Type B) Пакет прошивки (Тип Б) - + Game Гра - + Game Update Оновлення гри - + Game DLC Доповнення гри - + Delta Title Проєкт «Дельта» - + Select NCA Install Type... Виберіть тип встановлення NCA... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) Виберіть тип проєкту, який ви хочете встановити для цього NCA: (У більшості випадків підходить стандартний вибір «Гра».) - + Failed to Install Не вдалося встановити - + The title type you selected for the NCA is invalid. Тип проєкту, який ви вибрали для NCA, неправильний. - + File not found Файл не виявлено - + File "%1" not found Файл «%1» не виявлено - + OK Гаразд - + Function Disabled Функцію вимкнену - + Compatibility list reporting is currently disabled. Check back later! Звітування для переліку сумісності наразі вимкнено. Зазирніть пізніше! - + Error opening URL Помилка під час відкриття URL - + Unable to open the URL "%1". Не вдалося відкрити URL: «%1». - + TAS Recording Записування TAS - + Overwrite file of player 1? Перезаписати файл гравця 1? - + Invalid config detected Виявлено неправильне налаштування - + Handheld controller can't be used on docked mode. Pro controller will be selected. Портативний контролер неможливо використовувати в режимі докстанції. Буде вибрано контролер Pro. - - + + Amiibo Amiibo - - + + The current amiibo has been removed Поточний amiibo вилучено - + Error Помилка - - + + The current game is not looking for amiibos Поточна гра не очікує amiibo - + Amiibo File (%1);; All Files (*.*) Файл amiibo (%1);; Усі файли (*.*) - + Load Amiibo Завантажити amiibo - + Error loading Amiibo data Помилка під час завантаження даних amiibo - + The selected file is not a valid amiibo Вибраний файл не є дійсним amiibo - + The selected file is already on use Вибраний файл уже використовується - + An unknown error occurred Сталася невідома помилка - + No firmware available Немає доступних прошивок - + Firmware Corrupted Прошивка пошкоджена - + Unknown applet Невідомий аплет - + Applet doesn't map to a known value. Аплет не призначено до відомого значення. - + Record not found Запис не виявлено - + Applet not found. Please reinstall firmware. Аплет не виявлено. Перевстановіть прошивку. - + Capture Screenshot Зробити знімок екрана - + PNG Image (*.png) Зображення PNG (*.png) - + TAS state: Running %1/%2 Стан TAS: Працює %1/%2 - + TAS state: Recording %1 Стан TAS: Триває запис %1 - + TAS state: Idle %1/%2 Стан TAS: Бездіяльність %1/%2 - + TAS State: Invalid Стан TAS: Неправильний - + &Stop Running [&S] Зупинити - + Stop R&ecording [&E] Зупинити запис - + Building: %n shader(s) Компіляція: %n шейдерКомпіляція: %n шейдериКомпіляція: %n шейдерівКомпіляція: %n шейдерів - + Scale: %1x %1 is the resolution scaling factor Масштаб: %1x - + Speed: %1% / %2% Швидкість: %1% / %2% - + Speed: %1% Швидкість: %1% - + Game: %1 FPS Гра: %1 к/с - + Frame: %1 ms Кадр: %1 мс - + NO AA БЕЗ ЗГЛАДЖУВАННЯ - + NO FX - + FX - + VOLUME: MUTE ГУЧНІСТЬ: ВИМКНЕНО - + VOLUME: %1% Volume percentage (e.g. 50%) ГУЧНІСТЬ: %1% - + Derivation Components Missing Відсутні компоненти виведення - + Decryption keys are missing. Install them now? Відсутні ключі шифрування. Встановити їх зараз? - + Wayland Detected! Виявлено Wayland! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8105,74 +8088,74 @@ Would you like to force it for future launches? Хочете примусово увімкнути його для наступних запусків? - + Use X11 Використовувати X11 - + Continue with Wayland Продовжити з Wayland - + Don't show again Не показувати знову - + Restart Required Потрібен перезапуск - + Restart Eden to apply the X11 backend. Перезапуск Eden для застосування бекенду X11. - + Slow Сповільнення - + Turbo Прискорення - + Unlocked Розблоковано - + Select RomFS Dump Target Виберіть розташування для створення дампу RomFS - + Please select which RomFS you would like to dump. Виберіть, який дамп RomFS ви хочете створити. - + Are you sure you want to close Eden? Ви впевнені, що хочете закрити Eden? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. Ви впевнені, що хочете зупинити емуляцію? Увесь незбережений поступ буде втрачено. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/vi.ts b/dist/languages/vi.ts index a65e346ea0..a2042eb499 100644 --- a/dist/languages/vi.ts +++ b/dist/languages/vi.ts @@ -786,1332 +786,1315 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Dùng bộ nhớ đệm pipeline Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Bật xả tương ứng - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback Đồng bộ hóa với tốc độ khung hình khi phát video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Chạy game với tốc độ bình thường trong quá trình phát video, ngay cả khi tốc độ khung hình được mở khóa. - + Barrier feedback loops Vòng lặp phản hồi rào cản - + Improves rendering of transparency effects in specific games. Cải thiện hiệu quả kết xuất của hiệu ứng trong suốt trong một số game. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Hạt giống RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Tên thiết bị - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Vùng: - + The region of the console. - + Time Zone: Múi giờ: - + The time zone of the console. - + Sound Output Mode: Chế độ đầu ra âm thanh: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ẩn con trỏ chuột khi không dùng - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Vô hiệu hoá applet tay cầm - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) Không nén (Chất lượng tốt nhất) - + BC1 (Low quality) BC1 (Chất lượng thấp) - + BC3 (Medium quality) BC3 (Chất lượng trung bình) - - + + Auto Tự động - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Chính xác - - - + + + Default Mặc định - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - - Strict - - - - + Unsafe Không an toàn - + Paranoid (disables most optimizations) Paranoid (vô hiệu hoá hầu hết sự tối ưu) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Cửa sổ không viền - + Exclusive Fullscreen Toàn màn hình - + No Video Output Không có đầu ra video - + CPU Video Decoding Giải mã video bằng CPU - + GPU Video Decoding (Default) Giải mã video bằng GPU (Mặc định) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [THỬ NGHIỆM] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [THỬ NGHIỆM] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Không có - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Mặc định (16:9) - + Force 4:3 Dùng 4:3 - + Force 21:9 Dùng 21:9 - + Force 16:10 Dùng 16:10 - + Stretch to Window Mở rộng đến cửa sổ - + Automatic Tự động - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Español) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Nederlands) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh Anh - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Tây Ban Nha Mỹ Latinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha Brasil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6989,7 +6972,7 @@ Debug Message: - + &Pause &Tạm dừng @@ -7140,7 +7123,7 @@ Debug Message: - + &Start &Bắt đầu @@ -7151,7 +7134,7 @@ Debug Message: - + R&ecord G&hi lại @@ -7242,7 +7225,7 @@ Debug Message: - + None @@ -7268,737 +7251,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8006,74 +7989,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index 3dd8f18281..6acff0c2da 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -786,1332 +786,1315 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Dùng Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Bật xả tương ứng - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback Đồng bộ hóa với tốc độ khung hình khi phát video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Chạy game với tốc độ bình thường trong quá trình phát video, ngay cả khi tốc độ khung hình được mở khóa. - + Barrier feedback loops Vòng lặp phản hồi rào cản - + Improves rendering of transparency effects in specific games. Cải thiện hiệu quả hiển thị của hiệu ứng trong suốt trong một số trò chơi. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Hạt giống RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Tên thiết bị - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Vùng: - + The region of the console. - + Time Zone: Múi giờ: - + The time zone of the console. - + Sound Output Mode: Chế độ đầu ra âm thanh - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ẩn con trỏ chuột khi không dùng - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet Vô hiệu hoá applet tay cầm - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) Không nén (Chất lượng tốt nhất) - + BC1 (Low quality) BC1 (Chất lượng thấp) - + BC3 (Medium quality) BC3 (Chất lượng trung bình) - - + + Auto Tự động - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Tuyệt đối - - - + + + Default Mặc định - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - - Strict - - - - + Unsafe Tương đối - + Paranoid (disables most optimizations) Paranoid (vô hiệu hoá hầu hết sự tối ưu) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Cửa sổ không viền - + Exclusive Fullscreen Toàn màn hình - + No Video Output Không Video Đầu Ra - + CPU Video Decoding Giải mã video bằng CPU - + GPU Video Decoding (Default) Giải mã video bằng GPU (Mặc định) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [THỬ NGHIỆM] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [THỬ NGHIỆM] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian ScaleForce - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Trống - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Mặc định (16:9) - + Force 4:3 Dùng 4:3 - + Force 21:9 Dùng 21:9 - + Force 16:10 Dung 16:10 - + Stretch to Window Kéo dãn đến cửa sổ phần mềm - + Automatic Tự động - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Spanish) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Dutch) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh UK (British English) - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Mỹ La-tinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha của người Brazil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Châu Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Chế độ cắm TV - + Handheld Cầm tay - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -6989,7 +6972,7 @@ Debug Message: - + &Pause &Tạm dừng @@ -7140,7 +7123,7 @@ Debug Message: - + &Start &Bắt đầu @@ -7151,7 +7134,7 @@ Debug Message: - + R&ecord G&hi @@ -7242,7 +7225,7 @@ Debug Message: - + None @@ -7268,737 +7251,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8006,74 +7989,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index 29ff0fe772..46c8fd8014 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -833,65 +833,47 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. - 控制 GPU 围栏同步行为。 -“即时”是速度最快的选项,但可能会引入一些问题。 -“均衡”提供了更好的兼容性,可能修复某些游戏中的问题。 -“精确”在牺牲部分性能的前提下进一步提升兼容性。 -“严格”是速度最慢的选项,但可以修复那些要求更严格同步的问题。 -默认遵循 GPU “精确”设定。 +Default follows the GPU Mode setting. + - Enable GPU buffer readback - 开启 GPU 缓冲区回读 - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - 通过在上传前读取来保留 GPU 修改的数据。 -某些游戏需要这样才能正确渲染某些效果。 - - - Enable asynchronous shader compilation 开启异步着色器编译 - + May reduce shader stutter. 可能减少着色器卡顿。 - + GPU Clocks GPU 时钟频率 - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. 通过让游戏误以为 GPU 的处理速度比实际更快,以避免游戏为了适应 Switch 的时钟频率而降低分辨率和渲染距离。 - + GPU Unswizzle GPU 还原 - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. 利用 GPU 计算来加速 BCn 格式 3D 纹理的解码。如果遇到崩溃或画面花屏,请禁用此项。 - + GPU Unswizzle Max Texture Size GPU 还原最大纹理尺寸 - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -900,48 +882,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size GPU 还原流大小 - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. 设置每帧处理的纹理数据最大量(单位:MiB)。 较高的数值可以减少纹理加载时的卡顿,但可能会影响帧率的稳定性(即造成帧时间波动)。 - + GPU Unswizzle Chunk Size GPU 还原块大小 - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. 确定在单次调度(Dispatch)中处理的深度切片(Depth Slices)数量。 增加此数值可以提高高端 GPU 的吞吐量(处理效率),但在性能较弱的硬件上可能会引发 TDR(驱动程序重置)或驱动超时。 - + Use Vulkan pipeline cache 启用 Vulkan 管线缓存 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. 启用 GPU 供应商专用的管线缓存。 在 Vulkan 驱动程序内部不存储管线缓存的情况下,此选项可显著提高着色器加载速度。 - + Enable Compute Pipelines (Intel Vulkan Only) 启用计算管线 (仅限 Intel 显卡 Vulkan 模式) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -950,193 +932,193 @@ Compute pipelines are always enabled on all other drivers. 在所有其他驱动程序上始终启用计算管线。 - + Enable Reactive Flushing 启用反应性刷新 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 使用反应性刷新取代预测性刷新,从而更精确地同步内存。 - + Sync to framerate of video playback 播放视频时帧率同步 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 在视频播放期间以正常速度运行游戏,即使帧率未锁定。 - + Barrier feedback loops 屏障反馈环路 - + Improves rendering of transparency effects in specific games. 改进某些游戏中透明效果的渲染。 - + Enable buffer history 启用缓冲区历史 - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. 允许访问之前的缓冲状态。 这个选项可能会提升某些游戏的渲染质量和性能一致性。 - + Fix bloom effects 修复泛光效果 - + Removes bloom in Burnout. 去除《火爆狂飙》中的泛光特效。 - + Enable Legacy Rescale Pass 启用旧版缩放 - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. 通过依赖之前实现的行为,可能会修复部分游戏的缩放重叠问题。 修复 AMD 和 Intel 显卡上的线条伪影,以及《路易斯洋楼3》中 Nvidia 显卡的灰色纹理闪烁的遗留行为变通方法。 - + Extended Dynamic State 扩展动态状态 - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. 控制在扩展动态状态中可使用的函数数量。更高的数值允许启用更多功能,并可能提升性能,但同时也可能导致额外的图形问题。 - + Vertex Input Dynamic State 顶点输入动态状态 - + Enables vertex input dynamic state feature for better quality and performance. 开启顶点输入动态状态功能来获得更好的质量和性能。 - + Sample Shading 采样着色 - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. 允许片段着色器在多重采样的片段中每个样本执行一次而不是每个片段执行一次。可以提高图形质量,但会降低性能。 更高的值可以提高质量但会降低性能。 - + RNG Seed 随机数生成器种子 - + Controls the seed of the random number generator. Mainly used for speedrunning. 控制随机数生成器的种子。 主要用于竞速游戏。 - + Device Name 设备名称 - + The name of the console. 主机的数量。 - + Homebrew Args 自制软件参数 - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). 启动 homebrew 时需要传递的命令行参数 (例如 -noglsl)。 - + Custom RTC Date: 自定义系统时间: - + This option allows to change the clock of the console. Can be used to manipulate time in games. 此选项允许更改控制台的时钟。 可用于操纵游戏中的时间。 - + The number of seconds from the current unix time 来自当前 unix 时间的秒数。 - + Language: 语言: - + This option can be overridden when region setting is auto-select 当区域设置为自动选择时可以使用此选项替代。 - + Region: 地区: - + The region of the console. 主机的区域。 - + Time Zone: 时区: - + The time zone of the console. 主机的时区。 - + Sound Output Mode: 声音输出模式: - + Console Mode: 控制台模式: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1145,1042 +1127,1037 @@ Setting to Handheld can help improve performance for low end systems. 将设置为掌机模式可以帮助低端系统提高性能。 - + Prompt for user profile on boot 启动时提示选择用户账户 - + Useful if multiple people use the same PC. 在多人使用相同的 PC 时有效。 - + Pause when not in focus 在丢失焦点时暂停 - + Pauses emulation when focusing on other windows. 当焦点位于其它窗口时暂停模拟器。 - + Confirm before stopping emulation 停止模拟时需要确认 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. 替代提示以确认停止模拟。 启用它将绕过此类提示并直接退出模拟。 - + Hide mouse on inactivity 自动隐藏鼠标光标 - + Hides the mouse after 2.5s of inactivity. 在 2.5 秒无活动后隐藏鼠标。 - + Disable controller applet 禁用控制器小程序 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. 强制禁止在模拟程序中使用控制器小程序。 当程序尝试打开控制器小程序时,它会立即被关闭。 - + Check for updates 检查更新 - + Whether or not to check for updates upon startup. 在启动时是否检查更新。 - + Enable Gamemode 启用游戏模式 - + Force X11 as Graphics Backend 强制使用 X11 作为图形后端 - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - + Never 永不 - + On Load 加载时 - + Always 总是 - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不压缩 (最高质量) - + BC1 (Low quality) BC1 (低质量) - + BC3 (Medium quality) BC3 (中等质量) - - + + Auto 自动 - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative 保守模式 - + Aggressive 激进模式 - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (汇编着色器,仅限 NVIDIA 显卡) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (实验性,仅限 AMD/Mesa) - + Null 无 - + Fast 高速 - - - + + + Accurate 高精度 - - - + + + Default 系统默认 - + Unsafe (fast) 不安全(快速) - + Safe (stable) 安全(稳定) - + Immediate 即时 - + Balanced 平衡 - - Strict - 严格 - - - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Debugging 调试 - + Dynarmic 动态编译 - + NCE 本机代码执行 - + Borderless Windowed 无边框窗口 - + Exclusive Fullscreen 独占全屏 - + No Video Output 无视频输出 - + CPU Video Decoding CPU 视频解码 - + GPU Video Decoding (Default) GPU 视频解码 (默认) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [实验性] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [实验性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [实验性] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [实验性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 近邻取样 - + Bilinear 双线性过滤 - + Bicubic 双三线过滤 - + Gaussian 高斯模糊 - + Lanczos Lanczos - + ScaleForce 强制缩放 - + AMD FidelityFX Super Resolution AMD FidelityFX 超级分辨率 - + Area 区域 - + MMPX MMPX - + Zero-Tangent 零切线 - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution 骁龙游戏超级分辨率 - + Snapdragon Game Super Resolution EdgeDir 骁龙游戏超级分辨率 EdgeDir - + None 无 - + FXAA 快速近似抗锯齿 - + SMAA 子像素形态学抗锯齿 - + Default (16:9) 默认 (16:9) - + Force 4:3 强制 4:3 - + Force 21:9 强制 21:9 - + Force 16:10 强制 16:10 - + Stretch to Window 拉伸窗口 - + Automatic 自动 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日语 (日本語) - + American English 美式英语 - + French (français) 法语 (français) - + German (Deutsch) 德语 (Deutsch) - + Italian (italiano) 意大利语 (italiano) - + Spanish (español) 西班牙语 (español) - + Chinese 中文 - + Korean (한국어) 韩语 (한국어) - + Dutch (Nederlands) 荷兰语 (Nederlands) - + Portuguese (português) 葡萄牙语 (português) - + Russian (Русский) 俄语 (Русский) - + Taiwanese 台湾中文 - + British English 英式英语 - + Canadian French 加拿大法语 - + Latin American Spanish 拉美西班牙语 - + Simplified Chinese 简体中文 - + Traditional Chinese (正體中文) 繁体中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙语 (português do Brasil) - + Polish (polska) 波兰语(波兰语) - + Thai (แบบไทย) 泰语 - - + + Japan 日本 - + USA 美国 - + Europe 欧洲 - + Australia 澳大利亚 - + China 中国 - + Korea 韩国 - + Taiwan 台湾地区 - + Auto (%1) Auto select time zone 自动 (%1) - + Default (%1) Default time zone 默认 (%1) - + CET 欧洲中部时间 - + CST6CDT 古巴标准时间&古巴夏令时 - + Cuba 古巴 - + EET 东欧时间 - + Egypt 埃及 - + Eire 爱尔兰 - + EST 东部标准时间 - + EST5EDT 东部标准时间&东部夏令时 - + GB 英国 - + GB-Eire 英国-爱尔兰时间 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 美国夏威夷时间 - + Iceland 冰岛 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙买加 - + Kwajalein 夸贾林环礁 - + Libya 利比亚 - + MET 中欧时间 - + MST 山区标准时间 (北美) - + MST7MDT 山区标准时间&山区夏令时 (北美) - + Navajo 纳瓦霍 - + NZ 新西兰时间 - + NZ-CHAT NZ-CHAT - + Poland 波兰 - + Portugal 葡萄牙 - + PRC 中国标准时间 - + PST8PDT 太平洋标准时间&太平洋夏令时 - + ROC 台湾时间 - + ROK 韩国时间 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界时间 - + UTC 协调世界时 - + W-SU 欧洲-莫斯科时间 - + WET 西欧时间 - + Zulu 祖鲁 - + Mono 单声道 - + Stereo 立体声 - + Surround 环绕声 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (不安全) - + 12GB DRAM (Unsafe) 12GB DRAM (不安全) - + Docked 主机模式 - + Handheld 掌机模式 - - + + Normal 正常 - - + + Boost 升频 - - + + Overclock 超频 - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - + Very Small (16 MB) 很小 (16 MB) - + Small (32 MB) 较小 (32 MB) - + Normal (128 MB) 正常 (128 MB) - + Large (256 MB) 较大 (256 MB) - + Very Large (512 MB) 很大 (512 MB) - + Very Low (4 MB) 很低 (4 MB) - + Low (8 MB) 低 (8 MB) - + Normal (16 MB) 正常 (16 MB) - + Medium (32 MB) 中 (32 MB) - + High (64 MB) 高 (64 MB) - + Very Low (32) 很低 (32) - + Low (64) 低 (64) - + Normal (128) 正常 (128) - + Medium (256) 中(256) - + High (512) 高(512) - + Disabled 禁用 - + ExtendedDynamicState 1 扩展动态状态 1 - + ExtendedDynamicState 2 扩展动态状态 2 - + ExtendedDynamicState 3 扩展动态状态 3 - + Tree View 树景视图 - + Grid View 网格视图 @@ -7064,7 +7041,7 @@ Debug Message: - + &Pause 暂停 (&P) @@ -7215,7 +7192,7 @@ Debug Message: - + &Start 开始 (&S) @@ -7226,7 +7203,7 @@ Debug Message: - + R&ecord 录制 (&E) @@ -7317,7 +7294,7 @@ Debug Message: - + None 无 @@ -7343,742 +7320,742 @@ Debug Message: 轮播视图(&C) - + Small (32x32) 小 (32x32) - + Standard (64x64) 标准 (64x64) - + Large (128x128) 大 (128x128) - + Full Size (256x256) 最大 (256x256) - + Broken Vulkan Installation Detected 检测到损坏的 Vulkan 安装 - + Vulkan initialization failed during boot. 在启动时初始化 Vulkan 失败。 - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping 运行游戏 - + Loading Web Applet... 正在加载 Web 小程序... - - + + Disable Web Applet 禁用 Web 小程序 - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) 禁用网页小程序可能会导致未定义的行为并且应仅在 超级马里奥 3D 全明星中使用。您确定要禁用网页小程序吗? (这可以在调试设置中重新启用。) - + The amount of shaders currently being built 当前正在构建的着色器数量 - + The current selected resolution scaling multiplier. 当前选择的分辨率缩放倍数。 - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. 当前模拟速度。高于或低于 100% 的数值表示模拟运行比 Switch 快或慢。 - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. 游戏当前显示的每秒帧数。这个数值会因游戏和场景的不同而有所变化。 - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. 模拟 Switch 一帧所需的时间,不包括帧限制或垂直同步。为了全速模拟这个时间最多应为 16.67 毫秒。 - + Unmute 取消静音 - + Mute 静音 - + Reset Volume 重置音量 - + Configure Effects... 配置效果... - + &Clear Recent Files 清除最近的文件(&C) - + &Continue 继续(&C) - + Warning: Outdated Game Format 警告: 游戏格式过时 - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. 您正在为此游戏使用解包 ROM 目录格式,这是一种已过时的格式,它已被 NCA、NAX、XCI 或 NSP 等其他格式取代。解包 ROM 目录缺少图标、元数据和更新支持。<br>有关 Eden 支持的各种 Switch 格式的说明请查阅我们的用户手册。此消息将不再显示。 - - + + Error while loading ROM! 加载 ROM 时出错! - + The ROM format is not supported. 不支持该 ROM 格式。 - + An error occurred initializing the video core. 初始化视频核心时发生错误。 - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. 这通常是因为过时的 GPU 驱动所导致的。具体情况请查看日志。请查阅: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>如何访问日志文件</a>。 - + Error while loading ROM! %1 %1 signifies a numeric error code. 加载 ROM 时出错! %1 - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. %1<br>请重新导出您的文件,或在 Discord/Stoat 上寻求帮助。 - + An unknown error occurred. Please see the log for more details. 发生未知错误。请查看日志以获取更多详情。 - - + + (64-bit) (64 位) - - + + (32-bit) (32 位) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit %1 %2 - + Closing software... 正在关闭软件... - + Save Data 存档数据 - + Mod Data Mod 数据 - + Error Opening %1 Folder 打开 %1 文件夹出错 - - + + Folder does not exist! 文件夹不存在! - + Remove Installed Game Contents? 是否移除已安装的游戏内容? - + Remove Installed Game Update? 是否移除已安装的游戏更新? - + Remove Installed Game DLC? 是否移除已安装的游戏 DLC? - + Remove Entry 删除条目 - + Delete OpenGL Transferable Shader Cache? 要删除 OpenGL 可传输着色器缓存吗? - + Delete Vulkan Transferable Shader Cache? 要删除 Vulkan 可传输着色器缓存吗? - + Delete All Transferable Shader Caches? 删除所有可传输的着色器缓存? - + Remove Custom Game Configuration? 是否移除自定义游戏配置? - + Remove Cache Storage? 要清除缓存存储吗? - + Remove File 删除文件 - + Remove Play Time Data 删除游戏时间数据 - + Reset play time? 要重置播放时间吗? - - + + RomFS Extraction Failed! RomFS 提取失败! - + There was an error copying the RomFS files or the user cancelled the operation. 复制 RomFS 文件时出错或用户取消了操作。 - + Full 完整 - + Skeleton 结构 - + Select RomFS Dump Mode 选择 RomFS 转储模式 - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. 请选择您希望如何导出 RomFS。<br>&quot;完整&quot; 将把所有文件复制到新的目录中,而<br>&quot;结构&quot; 仅会创建目录结构。</br></br> - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root %1 的可用空间不足,无法提取 RomFS。请释放空间或在模拟 > 配置 > 系统 > 文件系统 > 转储根目录,中选择其它目录 - + Extracting RomFS... 正在提取 RomFS... - - + + Cancel 取消 - + RomFS Extraction Succeeded! RomFS 提取成功! - + The operation completed successfully. 操作已成功完成。 - + Error Opening %1 打开 %1 时出错 - + Select Directory 选择目录 - + Properties 属性 - + The game properties could not be loaded. 无法加载游戏属性。 - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. Switch 可执行文件 (%1);;所有文件 (*.*) - + Load File 加载文件 - + Open Extracted ROM Directory 打开已提取的 ROM 目录 - + Invalid Directory Selected 选择的目录无效 - + The directory you have selected does not contain a 'main' file. 您选择的目录不包含 'main' 文件。 - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) 可安装的 Switch 文件 (*.nca *.nsp *.xci);;任天堂内容档案 (*.nca);;任天堂提交包 (*.nsp);;NX 卡带镜像 (*.xci) - + Install Files 安装文件 - + %n file(s) remaining 剩余 %n 个文件 - + Installing file "%1"... 正在安装文件 "%1"... - - + + Install Results 安装结果 - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. 为了避免可能的冲突,我们不鼓励用户将基础游戏安装到 NAND。 请仅使用此功能来安装更新和 DLC。 - + %n file(s) were newly installed 已新安装 %n 个文件 - + %n file(s) were overwritten 已覆盖了 %n 个文件 - + %n file(s) failed to install %n 个文件安装失败 - + System Application 系统应用 - + System Archive 系统档案 - + System Application Update 系统应用更新 - + Firmware Package (Type A) 固件包 (类型 A) - + Firmware Package (Type B) 固件包 (类型 B) - + Game 游戏 - + Game Update 游戏更新 - + Game DLC 游戏可下载内容 - + Delta Title Delta 标题 - + Select NCA Install Type... 选择 NCA 安装类型... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) 请选择您希望将此 NCA 安装为的标题类型: (在大多数情况下,默认的 '游戏' 就可以。) - + Failed to Install 安装失败 - + The title type you selected for the NCA is invalid. 您为 NCA 选择的标题类型无效。 - + File not found 找不到文件 - + File "%1" not found 未找到文件 "%1" - + OK 确定 - + Function Disabled 功能已被关闭 - + Compatibility list reporting is currently disabled. Check back later! 兼容性列表报告目前已被禁用。请稍后再查看! - + Error opening URL 打开网址出错 - + Unable to open the URL "%1". 无法打开 URL "%1"。 - + TAS Recording TAS 录像 - + Overwrite file of player 1? 要覆盖玩家 1 的文件吗? - + Invalid config detected 检测到无效配置 - + Handheld controller can't be used on docked mode. Pro controller will be selected. 手柄在主机模式下无法使用。将选择 Pro 手柄。 - - + + Amiibo Amiibo - - + + The current amiibo has been removed 当前的 amiibo 已被移除 - + Error 错误 - - + + The current game is not looking for amiibos 当前游戏不支持寻找 amiibo - + Amiibo File (%1);; All Files (*.*) Amiibo 文件 (%1);; 所有文件 (*.*) - + Load Amiibo 读取 Amiibo - + Error loading Amiibo data 加载 Amiibo 数据出错 - + The selected file is not a valid amiibo 所选文件不是有效的 amiibo - + The selected file is already on use 所选文件正在使用中 - + An unknown error occurred 发生未知错误 - + No firmware available 没有可用的固件 - + Firmware Corrupted 固件已损坏 - + Unknown applet 未知小程序 - + Applet doesn't map to a known value. 无法识别该小程序对应的值。 - + Record not found 找不到记录程序 - + Applet not found. Please reinstall firmware. 找不到小程序。请重新安装固件。 - + Capture Screenshot 截取屏幕截图 - + PNG Image (*.png) PNG 图像 (*.png) - + TAS state: Running %1/%2 TAS 状态: 正在运行 %1/%2 - + TAS state: Recording %1 TAS 状态: 正在录制 %1 - + TAS state: Idle %1/%2 TAS 状态: 空闲 %1/%2 - + TAS State: Invalid TAS 状态: 无效 - + &Stop Running 停止运行(&S) - + Stop R&ecording 停止录制(&A) - + Building: %n shader(s) 正在编译:%n 个着色器 - + Scale: %1x %1 is the resolution scaling factor 缩放: %1x - + Speed: %1% / %2% 速度: %1% / %2% - + Speed: %1% 速度: %1% - + Game: %1 FPS 游戏: %1 FPS - + Frame: %1 ms 帧: %1 ms - + NO AA 无 AA - + NO FX 无 FX - + FX FX - + VOLUME: MUTE 音量: 静音 - + VOLUME: %1% Volume percentage (e.g. 50%) 音量: %1% - + Derivation Components Missing 缺少派生组件 - + Decryption keys are missing. Install them now? 缺少解密密钥。现在安装吗? - + Wayland Detected! 检测到 Wayland! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8089,74 +8066,74 @@ Would you like to force it for future launches? 您想要在未来的启动中强制执行吗? - + Use X11 使用 X11 - + Continue with Wayland 继续使用 Wayland - + Don't show again 不再显示 - + Restart Required 需要重新启动 - + Restart Eden to apply the X11 backend. 重新启动 Eden 以应用 X11 后端。 - + Slow 慢速 - + Turbo 加速 - + Unlocked 解锁 - + Select RomFS Dump Target 选择 RomFS 转储目标 - + Please select which RomFS you would like to dump. 请选择您想要转储的 RomFS。 - + Are you sure you want to close Eden? 您确实要关闭 Eden 吗? - - - + + + Eden Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. 您确定要停止模拟吗?任何未保存的进度将会丢失。 - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index 50b1b30118..678757a328 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -812,1333 +812,1316 @@ Default follows the GPU Accuracy setting. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. -Strict is the slowest option, but can fix issues that require stricter synchronization. -Default follows the GPU Accuracy setting. +Default follows the GPU Mode setting. - Enable GPU buffer readback - - - - - Preserves GPU-modified data by reading it back before uploading. -Some games require this to render certain effects properly. - - - - Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache 启用 Vulkan 管线缓存 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. 启用 GPU 供应商专用的管线缓存。 在 Vulkan 驱动程序内部不存储管线缓存的情况下,此选项可显著提高着色器加载速度。 - + Enable Compute Pipelines (Intel Vulkan Only) 启用计算管线 (仅限 Intel 显卡 Vulkan 模式) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing 启用反应性刷新 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 使用反应性刷新取代预测性刷新,从而更精确地同步内存。 - + Sync to framerate of video playback 播放视频时帧率同步 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 在视频播放期间以正常速度运行游戏,即使帧率未锁定。 - + Barrier feedback loops 屏障反馈循环 - + Improves rendering of transparency effects in specific games. 改进某些游戏中透明效果的渲染。 - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - + Enable Legacy Rescale Pass - + May fix rescale issues in some games by relying on behavior from the previous implementation. Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed 隨機種子 - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name 裝置名稱 - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: 自定义系统时间: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: 语言: - + This option can be overridden when region setting is auto-select - + Region: 區域: - + The region of the console. - + Time Zone: 時區: - + The time zone of the console. - + Sound Output Mode: 音訊輸出模式: - + Console Mode: 控制台模式: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation 停止模拟时需要确认 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity 滑鼠閒置時自動隱藏 - + Hides the mouse after 2.5s of inactivity. - + Disable controller applet 禁用控制器程序 - + Forcibly disables the use of the controller applet in emulated programs. When a program attempts to open the controller applet, it is immediately closed. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode 启用游戏模式 - + Force X11 as Graphics Backend - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不壓縮 (最高品質) - + BC1 (Low quality) BC1 (低品質) - + BC3 (Medium quality) BC3 (中品質) - - + + Auto 自動 - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative 保守模式(节省 VRAM) - + Aggressive 激进模式 - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null 無 - + Fast - - - + + + Accurate 高精度 - - - + + + Default 預設 - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - - Strict - - - - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed 無邊框視窗 - + Exclusive Fullscreen 全螢幕獨占 - + No Video Output 無視訊輸出 - + CPU Video Decoding CPU 視訊解碼 - + GPU Video Decoding (Default) GPU 視訊解碼(預設) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [實驗性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [實驗性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 最近鄰 - + Bilinear 雙線性 - + Bicubic 雙立方 - + Gaussian 高斯 - + Lanczos - + ScaleForce 強制縮放 - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None 無 - + FXAA FXAA - + SMAA SMAA - + Default (16:9) 預設 (16:9) - + Force 4:3 強制 4:3 - + Force 21:9 強制 21:9 - + Force 16:10 強制 16:10 - + Stretch to Window 延伸視窗 - + Automatic 自動 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日文 (日本語) - + American English 美式英语 - + French (français) 法文 (français) - + German (Deutsch) 德文 (Deutsch) - + Italian (italiano) 義大利文 (italiano) - + Spanish (español) 西班牙文 (español) - + Chinese 中文 - + Korean (한국어) 韓文 (한국어) - + Dutch (Nederlands) 荷蘭文 (Nederlands) - + Portuguese (português) 葡萄牙文 (português) - + Russian (Русский) 俄文 (Русский) - + Taiwanese 台灣中文 - + British English 英式英文 - + Canadian French 加拿大法文 - + Latin American Spanish 拉丁美洲西班牙文 - + Simplified Chinese 簡體中文 - + Traditional Chinese (正體中文) 正體中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA 美國 - + Europe 歐洲 - + Australia 澳洲 - + China 中國 - + Korea 南韓 - + Taiwan 台灣 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 預設 (%1) - + CET 中歐 - + CST6CDT CST6CDT - + Cuba 古巴 - + EET EET - + Egypt 埃及 - + Eire 愛爾蘭 - + EST 北美東部 - + EST5EDT EST5EDT - + GB GB - + GB-Eire 英國-愛爾蘭 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 夏威夷 - + Iceland 冰島 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙買加 - + Kwajalein 瓜加林環礁 - + Libya 利比亞 - + MET 中歐 - + MST 北美山區 - + MST7MDT MST7MDT - + Navajo 納瓦霍 - + NZ 紐西蘭 - + NZ-CHAT 紐西蘭-查塔姆群島 - + Poland 波蘭 - + Portugal 葡萄牙 - + PRC 中國 - + PST8PDT 太平洋 - + ROC 臺灣 - + ROK 韓國 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界 - + UTC UTC - + W-SU 莫斯科 - + WET 西歐 - + Zulu 協調世界時 - + Mono 單聲道 - + Stereo 立體聲 - + Surround 環繞音效 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked TV - + Handheld 掌機模式 - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + Disabled - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View @@ -7014,7 +6997,7 @@ Debug Message: - + &Pause 暫停(&P) @@ -7165,7 +7148,7 @@ Debug Message: - + &Start 開始(&S) @@ -7176,7 +7159,7 @@ Debug Message: - + R&ecord 錄製 (&E) @@ -7267,7 +7250,7 @@ Debug Message: - + None @@ -7293,737 +7276,737 @@ Debug Message: - + Small (32x32) - + Standard (64x64) - + Large (128x128) - + Full Size (256x256) - + Broken Vulkan Installation Detected - + Vulkan initialization failed during boot. - + Running a game TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the computer from sleeping - + Loading Web Applet... - - + + Disable Web Applet - + Disabling the web applet can lead to undefined behavior and should only be used with Super Mario 3D All-Stars. Are you sure you want to disable the web applet? (This can be re-enabled in the Debug settings.) - + The amount of shaders currently being built - + The current selected resolution scaling multiplier. - + Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - + How many frames per second the game is currently displaying. This will vary from game to game and scene to scene. - + Time taken to emulate a Switch frame, not counting framelimiting or v-sync. For full-speed emulation this should be at most 16.67 ms. - + Unmute - + Mute - + Reset Volume - + Configure Effects... - + &Clear Recent Files - + &Continue - + Warning: Outdated Game Format - + You are using the deconstructed ROM directory format for this game, which is an outdated format that has been superseded by others such as NCA, NAX, XCI, or NSP. Deconstructed ROM directories lack icons, metadata, and update support.<br>For an explanation of the various Switch formats Eden supports, out our user handbook. This message will not be shown again. - - + + Error while loading ROM! - + The ROM format is not supported. - + An error occurred initializing the video core. - + This is usually caused by outdated GPU drivers. Please see the log for more details. See: <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md'>How to access log files</a>. - + Error while loading ROM! %1 %1 signifies a numeric error code. - + %1<br>Please redump your files or ask on Discord/Stoat for help. %1 signifies an error string. - + An unknown error occurred. Please see the log for more details. - - + + (64-bit) - - + + (32-bit) - - + + %1 %2 %1 is the title name. %2 indicates if the title is 64-bit or 32-bit - + Closing software... - + Save Data - + Mod Data - + Error Opening %1 Folder - - + + Folder does not exist! - + Remove Installed Game Contents? - + Remove Installed Game Update? - + Remove Installed Game DLC? - + Remove Entry - + Delete OpenGL Transferable Shader Cache? - + Delete Vulkan Transferable Shader Cache? - + Delete All Transferable Shader Caches? - + Remove Custom Game Configuration? - + Remove Cache Storage? - + Remove File - + Remove Play Time Data - + Reset play time? - - + + RomFS Extraction Failed! - + There was an error copying the RomFS files or the user cancelled the operation. - + Full - + Skeleton - + Select RomFS Dump Mode - + Please select the how you would like the RomFS dumped.<br>Full will copy all of the files into the new directory while <br>skeleton will only create the directory structure. - + There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - + Extracting RomFS... - - + + Cancel - + RomFS Extraction Succeeded! - + The operation completed successfully. - + Error Opening %1 - + Select Directory - + Properties - + The game properties could not be loaded. - + Switch Executable (%1);;All Files (*.*) %1 is an identifier for the Switch executable file extensions. - + Load File - + Open Extracted ROM Directory - + Invalid Directory Selected - + The directory you have selected does not contain a 'main' file. - + Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive (*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge Image (*.xci) - + Install Files - + %n file(s) remaining - + Installing file "%1"... - - + + Install Results - + To avoid possible conflicts, we discourage users from installing base games to the NAND. Please, only use this feature to install updates and DLC. - + %n file(s) were newly installed - + %n file(s) were overwritten - + %n file(s) failed to install - + System Application - + System Archive - + System Application Update - + Firmware Package (Type A) - + Firmware Package (Type B) - + Game - + Game Update - + Game DLC - + Delta Title - + Select NCA Install Type... - + Please select the type of title you would like to install this NCA as: (In most instances, the default 'Game' is fine.) - + Failed to Install - + The title type you selected for the NCA is invalid. - + File not found - + File "%1" not found - + OK - + Function Disabled - + Compatibility list reporting is currently disabled. Check back later! - + Error opening URL - + Unable to open the URL "%1". - + TAS Recording - + Overwrite file of player 1? - + Invalid config detected - + Handheld controller can't be used on docked mode. Pro controller will be selected. - - + + Amiibo - - + + The current amiibo has been removed - + Error - - + + The current game is not looking for amiibos - + Amiibo File (%1);; All Files (*.*) - + Load Amiibo - + Error loading Amiibo data - + The selected file is not a valid amiibo - + The selected file is already on use - + An unknown error occurred - + No firmware available - + Firmware Corrupted - + Unknown applet - + Applet doesn't map to a known value. - + Record not found - + Applet not found. Please reinstall firmware. - + Capture Screenshot - + PNG Image (*.png) - + TAS state: Running %1/%2 - + TAS state: Recording %1 - + TAS state: Idle %1/%2 - + TAS State: Invalid - + &Stop Running - + Stop R&ecording - + Building: %n shader(s) - + Scale: %1x %1 is the resolution scaling factor - + Speed: %1% / %2% - + Speed: %1% - + Game: %1 FPS - + Frame: %1 ms - + NO AA - + NO FX - + FX - + VOLUME: MUTE - + VOLUME: %1% Volume percentage (e.g. 50%) - + Derivation Components Missing - + Decryption keys are missing. Install them now? - + Wayland Detected! - + Wayland is known to have significant performance issues and mysterious bugs. It's recommended to use X11 instead. @@ -8031,74 +8014,74 @@ Would you like to force it for future launches? - + Use X11 - + Continue with Wayland - + Don't show again - + Restart Required - + Restart Eden to apply the X11 backend. - + Slow - + Turbo - + Unlocked - + Select RomFS Dump Target - + Please select which RomFS you would like to dump. - + Are you sure you want to close Eden? - - - + + + Eden - + Are you sure you want to stop the emulation? Any unsaved progress will be lost. - + The currently running application has requested Eden to not exit. Would you like to bypass this and exit anyway? From 8e2d26c272681d6cafe6d5e703dafdc8200c7b65 Mon Sep 17 00:00:00 2001 From: xbzk Date: Wed, 30 Sep 2026 22:13:37 +0200 Subject: [PATCH 091/128] [video_core] buffer cache readback for nce invalidations (#4490) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- This is a follow up of 4473, a fix for the next Ender Magnolia known crash, the shackled beast's vaper crash, but specific for NCE. Imma try to be short: NCE invalidation was dooming whole guest pages when it shouldn't. If the GPU buffer cache owns some bytes on a page, invalidating first discards their ownership, and the retrying CPU can then observe stale data. On Android, this was corrupting some indirect draw packets and causing huge invalid index count reach staging memory allocation. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4490 Reviewed-by: CamilleLaVey Reviewed-by: lizzie --- src/core/memory.cpp | 2 +- src/video_core/gpu.cpp | 16 +++++++++++++--- src/video_core/gpu.h | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 837016de1d..eabc6dfccb 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -757,7 +757,7 @@ struct Memory::Impl { }; auto& gpu = system.GPU(); gpu_device_memory->ApplyOpOnPointer( - p, scratch_buffers[core], [&](DAddr address) { gpu.InvalidateRegion(address, size); }); + p, scratch_buffers[core], [&](DAddr address) { gpu.InvalidateRegion(address, size, true); }); } Core::System& system; diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index 9901cf4262..6aa7f9abd8 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -226,7 +226,17 @@ struct GPU::Impl { } /// Notify rasterizer that any caches of the specified region should be invalidated - void InvalidateRegion(DAddr addr, u64 size) { + void InvalidateRegion(DAddr addr, u64 size, bool preserve_gpu_writes) { + 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); } @@ -518,8 +528,8 @@ void GPU::FlushRegion(DAddr addr, u64 size) { impl->FlushRegion(addr, size); } -void GPU::InvalidateRegion(DAddr addr, u64 size) { - impl->InvalidateRegion(addr, size); +void GPU::InvalidateRegion(DAddr addr, u64 size, bool preserve_gpu_writes) { + impl->InvalidateRegion(addr, size, preserve_gpu_writes); } bool GPU::OnCPUWrite(DAddr addr, u64 size) { diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h index 75956ea199..974d214e10 100644 --- a/src/video_core/gpu.h +++ b/src/video_core/gpu.h @@ -248,7 +248,7 @@ public: void FlushRegion(DAddr addr, u64 size); /// Notify rasterizer that any caches of the specified region should be invalidated - void InvalidateRegion(DAddr addr, u64 size); + void InvalidateRegion(DAddr addr, u64 size, bool preserve_gpu_writes = false); /// 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 From 2a7e9b53b12711f679238ee738a2ce57cc42c8ed Mon Sep 17 00:00:00 2001 From: xbzk Date: Thu, 1 Oct 2026 00:28:18 +0200 Subject: [PATCH 092/128] [android,ui] fixed shader cache clearing when changing drivers (#4496) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Trivial bug pending on backlog, where changing drivers was not clearing up sharder cache as expected. The driver flow (broken) was deleting externalFilesDir/shader/, while the visible cache-size control (working) DirectoryInitialization.userDirectory/cache/shader/. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4496 Reviewed-by: CamilleLaVey Reviewed-by: lizzie --- .../main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt index 41f03c2488..fe53a99e3e 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt @@ -23,6 +23,7 @@ import org.yuzu.yuzu_emu.model.Driver.Companion.toDriver import org.yuzu.yuzu_emu.utils.GpuDriverHelper import org.yuzu.yuzu_emu.NativeLibrary import org.yuzu.yuzu_emu.utils.GpuDriverMetadata +import org.yuzu.yuzu_emu.utils.DirectoryInitialization import org.yuzu.yuzu_emu.utils.NativeConfig import java.io.File @@ -146,11 +147,11 @@ class DriverViewModel : ViewModel() { private fun wipeGameShaders(game: Game) { viewModelScope.launch { withContext(Dispatchers.IO) { - val externalFilesDir = YuzuApplication.appContext.getExternalFilesDir(null) + val userDirectory = DirectoryInitialization.userDirectory ?: return@withContext val shaderDir = File( - externalFilesDir.absolutePath + - "/shader/" + game.settingsName.lowercase() + userDirectory + + "/cache/shader/" + game.settingsName.lowercase() ) if (shaderDir.exists()) { shaderDir.deleteRecursively() From 963119e7cc3851007252c9981e4fae3e88b7687f Mon Sep 17 00:00:00 2001 From: John Date: Thu, 1 Oct 2026 03:34:57 +0200 Subject: [PATCH 093/128] [ffmpeg]Gamescope / Gamemode NVDEC Emulation - GPU Decoding Patches (#4501) Switch to ffmpeg with liz's gamescope patches. - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4501 Reviewed-by: CamilleLaVey Reviewed-by: lizzie --- cpmfile.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpmfile.json b/cpmfile.json index 616235f27a..9cac812b7a 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -79,7 +79,7 @@ "name": "ffmpeg", "package": "FFmpeg", "repo": "crueter-ci/FFmpeg", - "version": "9.0.1-1788120736-bf1b838f2a" + "version": "9.0.2-1790726865-946fcce07b" }, "fmt": { "hash": "f0da82c545b01692e9fd30fdfb613dbb8dd9716983dcd0ff19ac2a8d36f74beb5540ef38072fdecc1e34191b3682a8542ecbf3a61ef287dbba0a2679d4e023f2", From d3550c45718609dc563d8b58adfc0d846feefd03 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 1 Oct 2026 07:39:44 +0200 Subject: [PATCH 094/128] [qt] Filter collates accents (Unicode NFD) (#4380) Now "POKEMON" and "pokemon" are the same, and search's no longer case sensitive. Maybe we could transliterate? But that would require icu which is a bit overkill. Main point is to be able to search "Pokemon" (accent on 'e') without actually typing the accent https://unicode.org/reports/tr15/ Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4380 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey --- src/yuzu/game/common.h | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/yuzu/game/common.h b/src/yuzu/game/common.h index 03505d6313..063733e8d8 100644 --- a/src/yuzu/game/common.h +++ b/src/yuzu/game/common.h @@ -12,25 +12,29 @@ namespace Yuzu { inline bool ContainsAllWords(const QString& haystack, const QString& userinput) { const QStringList userinput_split = userinput.split(QLatin1Char{' '}, Qt::SkipEmptyParts); - return std::all_of(userinput_split.begin(), userinput_split.end(), - [&haystack](const QString& s) { return haystack.contains(s); }); + return std::all_of(userinput_split.begin(), userinput_split.end(), [&haystack](const QString& s) { + return haystack.contains(s); + }); } inline bool FilterMatches(const QString& filter, const QStandardItem* item) { if (filter.isEmpty()) return true; + auto const sluggify = [](const QString& s) { + QString o(s.normalized(QString::NormalizationForm_D).toLower()); + return o.replace(QRegularExpression(QStringLiteral("[^a-z\\s]")), QStringLiteral("")); + }; + + const auto norm_filter = sluggify(filter); const auto program_id = item->data(GameListItemPath::ProgramIdRole).toULongLong(); - - const QString file_path = item->data(GameListItemPath::FullPathRole).toString().toLower(); - const QString file_title = item->data(GameListItemPath::TitleRole).toString().toLower(); + const QString file_path = sluggify(item->data(GameListItemPath::FullPathRole).toString()); + const QString file_title = sluggify(item->data(GameListItemPath::TitleRole).toString()); const QString file_program_id = QStringLiteral("%1").arg(program_id, 16, 16, QLatin1Char{'0'}); - - const QString file_name = - file_path.mid(file_path.lastIndexOf(QLatin1Char{'/'}) + 1) + QLatin1Char{' '} + file_title; - - return Yuzu::ContainsAllWords(file_name, filter) || - (file_program_id.size() == 16 && file_program_id.contains(filter)); + const QString file_name = sluggify(file_path.mid(file_path.lastIndexOf(QLatin1Char{'/'}) + 1) + QLatin1Char{' '} + file_title); + return (ContainsAllWords(file_name, norm_filter) + || ContainsAllWords(file_title, norm_filter)) + || (file_program_id.size() == 16 && file_program_id.contains(norm_filter)); } } // namespace Yuzu From d16735f5b618942136d6ab53466e3be0a382c30a Mon Sep 17 00:00:00 2001 From: MaranBr Date: Fri, 2 Oct 2026 02:24:58 +0200 Subject: [PATCH 095/128] [am] Properly handle None frontend applet (#4500) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Properly handle the `AppletId::None` case by returning a null frontend applet instead of falling back to the stub implementation. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4500 Reviewed-by: lizzie Reviewed-by: CamilleLaVey --- src/core/hle/service/am/frontend/applets.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core/hle/service/am/frontend/applets.cpp b/src/core/hle/service/am/frontend/applets.cpp index d622c7b7a7..c59e4b9c6b 100644 --- a/src/core/hle/service/am/frontend/applets.cpp +++ b/src/core/hle/service/am/frontend/applets.cpp @@ -250,9 +250,10 @@ std::shared_ptr FrontendAppletHolder::GetApplet(std::shared_ptr< return std::make_shared(system, applet, mode, *frontend.photo_viewer); case AppletId::NetConnect: return std::make_shared(system, applet, mode, *frontend.net_connect); + case AppletId::None: + return nullptr; default: - LOG_ERROR(Service_AM, "No backend implementation exists for applet_id={:02X} program_id={:016X}" - "Falling back to stub applet", static_cast(id), applet->program_id); + UNIMPLEMENTED_MSG("No frontend implementation exists for applet_id={:02X} program_id={:016X}! Using stub applet.", static_cast(id), applet->program_id); return std::make_shared(system, applet, id, mode); } } From 48aeedd3b3c915b89aecfbda23c2462c0ed5746f Mon Sep 17 00:00:00 2001 From: Eden CI Date: Mon, 5 Oct 2026 21:18:09 +0200 Subject: [PATCH 096/128] [dist, android] Update translations from Transifex for Oct 05 (#4507) Automatic translation update for Oct 05 Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4507 --- dist/languages/ar.ts | 597 +++++++++--------- dist/languages/ca.ts | 424 ++++++------- dist/languages/cs.ts | 424 ++++++------- dist/languages/da.ts | 424 ++++++------- dist/languages/de.ts | 425 ++++++------- dist/languages/el.ts | 424 ++++++------- dist/languages/es.ts | 425 ++++++------- dist/languages/fi.ts | 436 +++++++------ dist/languages/fr.ts | 425 ++++++------- dist/languages/hu.ts | 424 ++++++------- dist/languages/id.ts | 424 ++++++------- dist/languages/it.ts | 425 ++++++------- dist/languages/ja_JP.ts | 424 ++++++------- dist/languages/ko_KR.ts | 425 ++++++------- dist/languages/nb.ts | 424 ++++++------- dist/languages/nl.ts | 424 ++++++------- dist/languages/pl.ts | 425 ++++++------- dist/languages/pt_BR.ts | 425 ++++++------- dist/languages/pt_PT.ts | 424 ++++++------- dist/languages/ru_RU.ts | 425 ++++++------- dist/languages/sv.ts | 431 +++++++------ dist/languages/tr_TR.ts | 424 ++++++------- dist/languages/uk.ts | 434 +++++++------ dist/languages/vi.ts | 424 ++++++------- dist/languages/vi_VN.ts | 424 ++++++------- dist/languages/zh_CN.ts | 425 ++++++------- dist/languages/zh_TW.ts | 424 ++++++------- .../app/src/main/res/values-ar/strings.xml | 30 +- .../src/main/res/values-zh-rTW/strings.xml | 287 +++++---- 29 files changed, 5854 insertions(+), 6122 deletions(-) diff --git a/dist/languages/ar.ts b/dist/languages/ar.ts index 9a735c85be..472f7ac609 100644 --- a/dist/languages/ar.ts +++ b/dist/languages/ar.ts @@ -303,12 +303,12 @@ This would ban both their forum username and their IP address. Enable Overlay Applet - تمكين التطبيق المصغر للطبقة + تفعيل التطبيق المصغر للطبقة Enables Horizon's built-in overlay applet. Press and hold the home button for 1 second to show it. - تمكين التطبيق الصغير المدمج في Horizon. اضغط مع الاستمرار على زر الشاشة الرئيسية لمدة 1 ثانية لإظهاره. + تفعيل التطبيق المصغر المدمج في هورايزون. اضغط مع الاستمرار على زر الشاشة الرئيسية لمدة 1 ثانية لإظهاره. @@ -413,7 +413,7 @@ Can help reduce stuttering at lower framerates. Accuracy: - :الدقة + :دقة المحاكاة @@ -451,7 +451,7 @@ Weaker CPUs may see reduced performance, and certain games may behave improperly Enable Host MMU Emulation (fastmem) - (fastmem) المضيف MMU تمكين محاكاة + (fastmem) المضيف MMU تفعيل محاكاة @@ -759,7 +759,7 @@ Unreal Engine 4 games often see the most significant changes thereof. Enable asynchronous presentation (Vulkan only) - (Vulkan فقط) تمكين العرض التقديمي غير المتزامن + (Vulkan فقط) تفعيل العرض التقديمي غير المتزامن @@ -919,7 +919,7 @@ This option can improve shader loading time significantly in cases where the Vul Enable Compute Pipelines (Intel Vulkan Only) - (Intel Vulkan فقط) تمكين خطوط أنابيب الحوسبة + (Intel Vulkan فقط) تفعيل خطوط أنابيب الحوسبة @@ -933,7 +933,7 @@ Compute pipelines are always enabled on all other drivers. Enable Reactive Flushing - تمكين التنظيف التفاعلي + تفعيل التنظيف التفاعلي @@ -963,7 +963,7 @@ Compute pipelines are always enabled on all other drivers. Enable buffer history - تمكين سجل التخزين المؤقت + تفعيل سجل التخزين المؤقت @@ -1154,7 +1154,7 @@ Setting to Handheld can help improve performance for low end systems. Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. يتجاوز المطالبات التي تطلب تأكيد إيقاف المحاكاة. -يؤدي تمكينه إلى تجاوز هذه المطالبات والخروج مباشرة من المحاكاة. +يؤدي تفعيله إلى تجاوز هذه المطالبات والخروج مباشرة من المحاكاة. @@ -1168,994 +1168,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - تعطيل تطبيق التحكم - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - يُعطّل استخدام أداة التحكم في البرامج المُحاكاة قسرًا. -عند محاولة أي برنامج فتح أداة التحكم، تُغلق فورًا. - - - Check for updates التحقق من توفر التحديثات - + Whether or not to check for updates upon startup. ما إذا كان يجب التحقق من التحديثات عند بدء التشغيل أم لا. - + Enable Gamemode - تمكين وضع اللعبة + تفعيل وضع اللعبة - + Force X11 as Graphics Backend كخلفية رسومات X11 فرض - + Custom frontend الواجهة الأمامية المخصصة - + Real applet تطبيق صغير حقيقي - + + + Disabled + معطل + + + Never أبداً - + On Load عند التحميل - + Always دائماً - + CPU وحدة المعالجة المركزية - + GPU وحدة معالجة الرسومات - + CPU Asynchronous وحدة المعالجة المركزية غير المتزامنة - + Uncompressed (Best quality) Uncompressed (أفضل جودة) - + BC1 (Low quality) BC1 (جودة منخفضة) - + BC3 (Medium quality) BC3 (جودة متوسطة) - - + + Auto تلقائي - + 30 FPS 30 إطارًا في الثانية - + 60 FPS 60 إطارًا في الثانية - + 90 FPS 90 إطارًا في الثانية - + 120 FPS 120 إطارًا في الثانية - + Conservative محافظ - + Aggressive عدواني - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null لا شيء - + Fast سريع - - - + + + Accurate دقه - - - + + + Default افتراضي - + Unsafe (fast) غير آمن (سريع) - + Safe (stable) آمن (مستقر) - + Immediate فوري - + Balanced متوازن - + Unsafe غير آمن - + Paranoid (disables most optimizations) - جنون العظمة (يعطل معظم التحسينات) + شديد الحذر (يعطل معظم التحسينات) - + Debugging تصحيح الأخطاء - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed نافذة بلا حدود - + Exclusive Fullscreen شاشة كاملة حصرية - + No Video Output لا يوجد إخراج فيديو - + CPU Video Decoding فك تشفير فيديو وحدة المعالجة المركزية - + GPU Video Decoding (Default) فك تشفير فيديو وحدة معالجة الرسومات (افتراضي) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [تجريبي] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [تجريبي] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [تجريبي] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [تجريبي] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [تجريبي] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution دقة فائقة للألعاب من سنابدراغون - + Snapdragon Game Super Resolution EdgeDir دقة فائقة للألعاب من سنابدراغون EdgeDir - + None لا شيء - + FXAA FXAA - + SMAA SMAA - + Default (16:9) (16:9) افتراضي - + Force 4:3 4:3 فرض - + Force 21:9 21:9 فرض - + Force 16:10 16:10 فرض - + Stretch to Window تمديد إلى النافذة - + Automatic تلقائي - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) اليابانية (日本語) - + American English الإنجليزية الأمريكية - + French (français) الفرنسية (français) - + German (Deutsch) الألمانية (Deutsch) - + Italian (italiano) الإيطالية (Italiano) - + Spanish (español) الإسبانية (español) - + Chinese الصينية - + Korean (한국어) الكورية (한국어) - + Dutch (Nederlands) الهولندية (Nederlands) - + Portuguese (português) البرتغالية (Português) - + Russian (Русский) الروسية (Русский) - + Taiwanese تايواني - + British English الإنجليزية البريطانية - + Canadian French الكندية الفرنسية - + Latin American Spanish أمريكا اللاتينية الإسبانية - + Simplified Chinese الصينية المبسطة - + Traditional Chinese (正體中文) الصينية التقليدية (正體中文) - + Brazilian Portuguese (português do Brasil) البرتغالية البرازيلية (português do Brasil) - + Polish (polska) البولندية (polska) - + Thai (แบบไทย) التايلاندية (แบบไทย) - - + + Japan اليابان - + USA الولايات المتحدة الأمريكية - + Europe أوروبا - + Australia أستراليا - + China الصين - + Korea كوريا - + Taiwan تايوان - + Auto (%1) Auto select time zone تلقائي (%1) - + Default (%1) Default time zone افتراضي (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba - كوبا + Cuba - + EET EET - + Egypt - مصر + Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT - توقيت غرينتش + GMT + + + + GMT+0 + GMT+0 + + + + GMT-0 + GMT-0 - GMT+0 - توقيت غرينتش +0 + GMT0 + GMT0 - GMT-0 - -0 توقيت غرينتش + Greenwich + Greenwich - GMT0 - 0 توقيت غرينتش + Hongkong + Hongkong - Greenwich - غرينتش - - - - Hongkong - هونغ كونغ - - - HST HST - + Iceland - أيسلندا + Iceland + + + + Iran + Iran + + + + Israel + Israel - Iran - إيران - - - - Israel - إسرائيل + Jamaica + Jamaica - Jamaica - جامايكا - - - Kwajalein Kwajalein - + Libya - ليبيا + Libya - + MET - توقيت وسط أوروبا + MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland - بولندا + Poland - + Portugal - البرتغال + Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore - سنغافورة + Singapore - + Turkey - تركيا + Turkey - + UCT UCT - + Universal - عالمي + Universal - + UTC UTC - + W-SU W-SU - + WET - توقيت غرب أوروبا + WET - + Zulu Zulu - + Mono أحادي - + Stereo مجسم - + Surround محيطي - + 4GB DRAM (Default) 4GB DRAM (افتراضي) - + 6GB DRAM (Unsafe) 6GB DRAM (غير آمنة) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (غير آمنة) - + 12GB DRAM (Unsafe) 12GB DRAM (غير آمنة) - + Docked الإرساء - + Handheld محمول - - + + Normal قياسي - - + + Boost تعزيز - - + + Overclock كسر السرعة - + Always ask (Default) اسأل دائمًا (افتراضي) - + Only if game specifies not to stop فقط إذا حددت اللعبة عدم التوقف - + Never ask لا تسأل أبدا - + Very Small (16 MB) صغير جدًا (16 ميغابايت) - + Small (32 MB) صغير (32 ميغابايت) - + Normal (128 MB) قياسي (128 ميغابايت) - + Large (256 MB) كبير (256 ميغابايت) - + Very Large (512 MB) كبير جدًا (512 ميغابايت) - + Very Low (4 MB) منخفض جدًا (4 ميغابايت) - + Low (8 MB) منخفض (8 ميغابايت) - + Normal (16 MB) قياسي (16 ميغابايت) - + Medium (32 MB) متوسط (32 ميغابايت) - + High (64 MB) عالي (64 ميغابايت) - + Very Low (32) منخفض جدًا (32) - + Low (64) منخفض (64) - + Normal (128) قياسي (128) - + Medium (256) متوسط (256) - + High (512) عالي (512) - - Disabled - معطل - - - + ExtendedDynamicState 1 الحالة الديناميكية الممتدة 1 - + ExtendedDynamicState 2 الحالة الديناميكية الممتدة 2 - + ExtendedDynamicState 3 الحالة الديناميكية الممتدة 3 - + Tree View عرض قائمة - + Grid View عرض شبكة @@ -2207,7 +2196,7 @@ When a program attempts to open the controller applet, it is immediately closed. Input device: - :جهاز الادخال + :جهاز الإدخال @@ -2293,7 +2282,7 @@ When a program attempts to open the controller applet, it is immediately closed. <html><head/><body><p><span style=" font-weight:600;">For debugging only.</span><br/>If you're not sure what these do, keep all of these enabled. <br/>These settings, when disabled, only take effect when CPU Debugging is enabled. </p></body></html> - <html><head/><body><p><span style=" font-weight:600;">للتصحيح فقط.</span><br/>إذا لم تكن متأكدًا من وظيفة هذه الخيارات، فاتركها جميعًا ممكّنة. <br/>عند تعطيل هذه الإعدادات، لا تصبح سارية المفعول إلا عند تمكين تصحيح أخطاء وحدة المعالجة المركزية. </p></body></html> + <html><head/><body><p><span style=" font-weight:600;">للتصحيح فقط.</span><br/>إذا لم تكن متأكدًا من وظيفة هذه الخيارات، فاتركها جميعًا ممكّنة. <br/>عند تعطيل هذه الإعدادات، لا تصبح سارية المفعول إلا عند تفعيل تصحيح أخطاء وحدة المعالجة المركزية. </p></body></html> @@ -2304,14 +2293,14 @@ When a program attempts to open the controller applet, it is immediately closed. <div style="white-space: nowrap">يعمل هذا التحسين على تسريع عمليات الوصول إلى الذاكرة بواسطة برنامج الضيف.</div> -<div style="white-space: nowrap">يؤدي تمكينه إلى تضمين الوصول إلى مؤشرات PageTable::pointers في الكود الصادر.</div> +<div style="white-space: nowrap">يؤدي تفعيله إلى تضمين الوصول إلى مؤشرات PageTable::pointers في الكود الصادر.</div> <div style="white-space: nowrap">يؤدي تعطيل هذا إلى إجبار جميع عمليات الوصول إلى الذاكرة على المرور عبر وظائف Memory::Read/Memory::Write.</div> Enable inline page tables - تمكين جداول الصفحات المضمنة + تفعيل جداول الصفحات المضمنة @@ -2339,7 +2328,7 @@ When a program attempts to open the controller applet, it is immediately closed. Enable return stack buffer - تمكين مخزن مؤقت لمكدس الإرجاع + تفعيل مخزن مؤقت لمكدس الإرجاع @@ -2353,7 +2342,7 @@ When a program attempts to open the controller applet, it is immediately closed. Enable fast dispatcher - تمكين المرسل السريع + تفعيل الموزع السريع @@ -2367,7 +2356,7 @@ When a program attempts to open the controller applet, it is immediately closed. Enable context elimination - تمكين حذف السياق + تفعيل حذف السياق @@ -2381,7 +2370,7 @@ When a program attempts to open the controller applet, it is immediately closed. Enable constant propagation - تمكين الانتشار الثابت + تفعيل الانتشار الثابت @@ -2395,7 +2384,7 @@ When a program attempts to open the controller applet, it is immediately closed. Enable miscellaneous optimizations - تمكين التحسينات المتنوعة + تفعيل التحسينات المتنوعة @@ -2404,14 +2393,14 @@ When a program attempts to open the controller applet, it is immediately closed. <div style="white-space: nowrap">When disabled, a misalignment is triggered on all misaligned accesses.</div> - <div style="white-space: nowrap">عند التمكين، لا يتم تشغيل عدم المحاذاة إلا عندما يتجاوز الوصول حدود الصفحة</div> + <div style="white-space: nowrap">عند التفعيل، لا يتم تشغيل عدم المحاذاة إلا عندما يتجاوز الوصول حدود الصفحة</div> <div style="white-space: nowrap">عند التعطيل، يتم تشغيل عدم المحاذاة على جميع عمليات الوصول غير المتوافقة</div> Enable misalignment check reduction - تمكين تقليل التحقق من المحاذاة غير الصحيحة + تفعيل تقليل التحقق من المحاذاة غير الصحيحة @@ -2422,14 +2411,14 @@ When a program attempts to open the controller applet, it is immediately closed. <div style="white-space: nowrap">يعمل هذا التحسين على تسريع عمليات الوصول إلى الذاكرة بواسطة برنامج الضيف.</div> -<div style="white-space: nowrap">يؤدي تمكينه إلى إجراء عمليات قراءة/كتابة ذاكرة الضيف مباشرة في الذاكرة والاستفادة من وحدة MMU الخاصة بالمضيف.</div> +<div style="white-space: nowrap">يؤدي تفعيله إلى إجراء عمليات قراءة/كتابة ذاكرة الضيف مباشرة في الذاكرة والاستفادة من وحدة MMU الخاصة بالمضيف.</div> <div style="white-space: nowrap">يؤدي تعطيل هذا إلى إجبار جميع عمليات الوصول إلى الذاكرة على استخدام محاكاة MMU البرمجية.</div> Enable Host MMU Emulation (general memory instructions) - المضيف (تعليمات الذاكرة العامة) MMU تمكين محاكاة + المضيف (تعليمات الذاكرة العامة) MMU تفعيل محاكاة @@ -2440,14 +2429,14 @@ When a program attempts to open the controller applet, it is immediately closed. <div style="white-space: nowrap">يعمل هذا التحسين على تسريع عمليات الوصول الحصري للذاكرة بواسطة برنامج الضيف.</div> -<div style="white-space: nowrap">يؤدي تمكينه إلى إجراء عمليات قراءة/كتابة للذاكرة الحصرية للضيوف مباشرة في الذاكرة والاستفادة من وحدة MMU الخاصة بالمضيف.</div> +<div style="white-space: nowrap">يؤدي تفعيله إلى إجراء عمليات قراءة/كتابة للذاكرة الحصرية للضيوف مباشرة في الذاكرة والاستفادة من وحدة MMU الخاصة بالمضيف.</div> <div style="white-space: nowrap">يؤدي تعطيل هذا إلى إجبار جميع عمليات الوصول الحصرية للذاكرة على استخدام محاكاة MMU البرمجية.</div> Enable Host MMU Emulation (exclusive memory instructions) - المضيف (تعليمات الذاكرة الحصرية) MMU تمكين محاكاة + المضيف (تعليمات الذاكرة الحصرية) MMU تفعيل محاكاة @@ -2457,13 +2446,13 @@ When a program attempts to open the controller applet, it is immediately closed. <div style="white-space: nowrap">يعمل هذا التحسين على تسريع عمليات الوصول الحصري للذاكرة بواسطة برنامج الضيف.</div> -<div style="white-space: nowrap">يؤدي تمكينه إلى تقليل التكلفة الإضافية لفشل fastmem في الوصول إلى الذاكرة الحصرية.</div> +<div style="white-space: nowrap">يؤدي تفعيله إلى تقليل التكلفة الإضافية لفشل fastmem في الوصول إلى الذاكرة الحصرية.</div> Enable recompilation of exclusive memory instructions - تمكين إعادة تجميع تعليمات الذاكرة الحصرية + تفعيل إعادة تجميع تعليمات الذاكرة الحصرية @@ -2473,13 +2462,13 @@ When a program attempts to open the controller applet, it is immediately closed. <div style="white-space: nowrap">يعمل هذا التحسين على تسريع عمليات الوصول إلى الذاكرة عن طريق السماح بنجاح الوصول إلى الذاكرة غير الصالحة.</div> - <div style="white-space: nowrap">يؤدي تمكينه إلى تقليل الحمل الزائد لجميع عمليات الوصول إلى الذاكرة وليس له أي تأثير على البرامج التي لا تصل إلى الذاكرة غير الصالحة.</div> + <div style="white-space: nowrap">يؤدي تفعيله إلى تقليل الحمل الزائد لجميع عمليات الوصول إلى الذاكرة وليس له أي تأثير على البرامج التي لا تصل إلى الذاكرة غير الصالحة.</div> Enable fallbacks for invalid memory accesses - تمكين الإجراءات الاحتياطية للوصول إلى الذاكرة غير الصالحة + تفعيل الإجراءات الاحتياطية للوصول إلى الذاكرة غير الصالحة @@ -2497,7 +2486,7 @@ When a program attempts to open the controller applet, it is immediately closed. Enable GDB Stub - GDB Stub تمكين + GDB Stub تفعيل @@ -2607,12 +2596,12 @@ When a program attempts to open the controller applet, it is immediately closed. When checked, it enables Nsight Aftermath crash dumps - Nsight Aftermath عند تحديد هذا الخيار، يتم تمكين عمليات تفريغ الأعطال الخاصة بـ + Nsight Aftermath عند تحديد هذا الخيار، يتم تفعيل عمليات تفريغ الأعطال الخاصة بـ Enable Nsight Aftermath - Nsight Aftermath تمكين + Nsight Aftermath تفعيل @@ -2627,7 +2616,7 @@ When a program attempts to open the controller applet, it is immediately closed. Enable Renderdoc Hotkey - Renderdoc تمكين مفتاح التشغيل السريع لـ + Renderdoc تفعيل مفتاح التشغيل السريع لـ @@ -2657,7 +2646,7 @@ When a program attempts to open the controller applet, it is immediately closed. Enable Graphics Debugging - تمكين تصحيح الرسومات + تفعيل تصحيح الرسومات @@ -2667,7 +2656,7 @@ When a program attempts to open the controller applet, it is immediately closed. Enable Shader Feedback - تمكين ملاحظات التظليل + تفعيل ملاحظات التظليل @@ -2712,12 +2701,12 @@ When a program attempts to open the controller applet, it is immediately closed. Enable All Controller Types - تمكين كافة أنواع اذرع التحكم + تفعيل كافة أنواع اذرع التحكم Enable Auto-Stub - تمكين الملحق تلقائي + تفعيل الملحق تلقائي @@ -2732,7 +2721,7 @@ When a program attempts to open the controller applet, it is immediately closed. Enable Debug Asserts - تمكين تأكيدات التصحيح + تفعيل تأكيدات التصحيح @@ -2742,7 +2731,7 @@ When a program attempts to open the controller applet, it is immediately closed. Battery Serial: - :رقم تسلسلي للبطارية + :الرقم التسلسلي للبطارية @@ -2777,7 +2766,7 @@ When a program attempts to open the controller applet, it is immediately closed. Enable this to output the latest generated audio command list to the console. Only affects games using the audio renderer. - قم بتمكين هذه الخيار لإخراج أحدث قائمة أوامر صوتية تم إنشاؤها إلى وحدة التحكم. يؤثر فقط على الألعاب التي تستخدم عارض الصوت. + قم بتفعيل هذه الخيار لإخراج أحدث قائمة أوامر صوتية تم إنشاؤها إلى وحدة التحكم. يؤثر فقط على الألعاب التي تستخدم عارض الصوت. @@ -2792,12 +2781,12 @@ When a program attempts to open the controller applet, it is immediately closed. Enable FS Access Log - FS تمكين سجل وصول + FS تفعيل سجل وصول Enable Verbose Reporting Services** - تمكين خدمات التقارير التفصيلية + تفعيل خدمات التقارير التفصيلية @@ -3770,12 +3759,12 @@ Would you like to delete the old save data? Enable XInput 8 player support (disables web applet) - (يعطل تطبيق الويب الصغير) XInput 8 تمكين دعم مشغل + (يعطل تطبيق الويب الصغير) XInput 8 تفعيل دعم مشغل Enable UDP controllers (not needed for motion) - (غير مطلوبة للحركة) UDP تمكين وحدات التحكم + (غير مطلوبة للحركة) UDP تفعيل وحدات التحكم @@ -4556,7 +4545,7 @@ To invert the axes, first move your joystick vertically, and then horizontally.< Enable mouse panning - تمكين تحريك الماوس + تفعيل تحريك الماوس @@ -4632,12 +4621,12 @@ Current values are %1% and %2% respectively. Emulated mouse is enabled. This is incompatible with mouse panning. - تم تمكين الماوس الذي تمت محاكاته. وهذا غير متوافق مع تحريك الماوس. + تم تفعيل الماوس الذي تمت محاكاته. وهذا غير متوافق مع تحريك الماوس. Emulated mouse is enabled - تم تمكين الماوس الذي تمت محاكاته + تم تفعيل الماوس الذي تمت محاكاته @@ -4670,7 +4659,7 @@ Current values are %1% and %2% respectively. Enable Airplane Mode - تمكين وضع الطيران + تفعيل وضع الطيران @@ -5197,7 +5186,7 @@ UUID: %2 Enable Ring Input - تمكين إدخال الحلقة + تفعيل إدخال الحلقة @@ -5245,12 +5234,12 @@ UUID: %2 Error enabling ring input - حدث خطأ أثناء تمكين إدخال الحلقة + حدث خطأ أثناء تفعيل إدخال الحلقة Direct Joycon driver is not enabled - لم يتم تمكين برنامج تشغيل جوي كون المباشر + لم يتم تفعيل برنامج تشغيل جوي كون المباشر @@ -5337,7 +5326,7 @@ UUID: %2 Enable TAS features - TAS تمكين ميزات + TAS تفعيل ميزات @@ -5758,7 +5747,7 @@ Drag points to change position, or double-click table cells to edit values. Enable Accurate Vibration - تمكين الاهتزاز الدقيق + تفعيل الاهتزاز الدقيق @@ -7079,7 +7068,7 @@ Debug Message: Enable Overlay Display Applet - تمكين التطبيق المصغر لعرض الطبقة + تفعيل التطبيق المصغر لعرض الطبقة @@ -8024,7 +8013,7 @@ Please, only use this feature to install updates and DLC. Game: %1 FPS - اللعبة: %1 إطاراً في الثانية + اللعبة: %1 إطار diff --git a/dist/languages/ca.ts b/dist/languages/ca.ts index 01653df505..82c2259280 100644 --- a/dist/languages/ca.ts +++ b/dist/languages/ca.ts @@ -1106,993 +1106,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Activa el mode joc - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + + + Disabled + + + + Never Mai - + On Load - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservador - + Aggressive Agressiu - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Ensamblat d'ombrejadors, només NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, només AMD/Mesa) - + Null Nul - + Fast Ràpid - - - + + + Accurate Precís - - - + + + Default Valor predeterminat - + Unsafe (fast) Insegur (ràpid) - + Safe (stable) Segur (estable) - + Immediate - + Balanced Equilibrat - + Unsafe Insegur - + Paranoid (disables most optimizations) Paranoic (desactiva la majoria d'optimitzacions) - + Debugging Depuració - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Finestra sense vores - + Exclusive Fullscreen Pantalla completa exclusiva - + No Video Output Sense sortida de vídeo - + CPU Video Decoding Descodificació de vídeo a la CPU - + GPU Video Decoding (Default) Descodificació de vídeo a la GPU (Valor predeterminat) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Veí més proper - + Bilinear Bilineal - + Bicubic Bicúbic - + Gaussian Gaussià - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution Super resolució AMD FidelityFX - + Area Àrea - + MMPX MMPX - + Zero-Tangent Tangència zero - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Cap - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Valor predeterminat (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 - + Stretch to Window Estirar a la finestra - + Automatic Automàtic - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonès (日本語) - + American English Anglès americà - + French (français) Francès (français) - + German (Deutsch) Alemany (Deutsch) - + Italian (italiano) Italià (italiano) - + Spanish (español) Castellà (español) - + Chinese Xinès - + Korean (한국어) Coreà (한국어) - + Dutch (Nederlands) Holandès (Nederlands) - + Portuguese (português) Portuguès (português) - + Russian (Русский) Rus (Русский) - + Taiwanese Taiwanès - + British English Anglès britànic - + Canadian French Francès canadenc - + Latin American Spanish Espanyol llatinoamericà - + Simplified Chinese Xinès simplificat - + Traditional Chinese (正體中文) Xinès tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portuguès brasiler (português do Brasil) - + Polish (polska) Polonès (polska) - + Thai (แบบไทย) Tailandès (แบบไทย) - - + + Japan Japó - + USA EUA - + Europe Europa - + Australia Austràlia - + China Xina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Per defecte (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islàndia - + Iran Iran - + Israel Isreal - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polònia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estèreo - + Surround Envoltant - + 4GB DRAM (Default) 4GB DRAM (Insegur) - + 6GB DRAM (Unsafe) 6GB DRAM (Insegur) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Insegur) - + 12GB DRAM (Unsafe) 12GB DRAM (Insegur) - + Docked Sobretaula - + Handheld Portàtil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop Tan sols si el joc especifica no parar - + Never ask No preguntar mai - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - - Disabled - - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/cs.ts b/dist/languages/cs.ts index b4a990d3f4..c6644fa046 100644 --- a/dist/languages/cs.ts +++ b/dist/languages/cs.ts @@ -1106,993 +1106,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + + + Disabled + + + + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Automatické - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Přesné - - - + + + Default Výchozí - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Nebezpečné - + Paranoid (disables most optimizations) Paranoidní (zakáže většinu optimizací) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Okno bez okrajů - + Exclusive Fullscreen Exkluzivní - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - + Bilinear Bilineární - + Bicubic - + Gaussian - + Lanczos - + ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Žádné - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Výchozí (16:9) - + Force 4:3 Vynutit 4:3 - + Force 21:9 Vynutit 21:9 - + Force 16:10 - + Stretch to Window Roztáhnout podle okna - + Automatic - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonština (日本語) - + American English - + French (français) Francouzština (français) - + German (Deutsch) Nemčina (Deutsch) - + Italian (italiano) Italština (Italiano) - + Spanish (español) Španělština (español) - + Chinese Čínština - + Korean (한국어) Korejština (한국어) - + Dutch (Nederlands) Holandština (Nederlands) - + Portuguese (português) Portugalština (português) - + Russian (Русский) Ruština (Русский) - + Taiwanese Tajwanština - + British English Britská Angličtina - + Canadian French Kanadská Francouzština - + Latin American Spanish Latinsko Americká Španělština - + Simplified Chinese Zjednodušená Čínština - + Traditional Chinese (正體中文) Tradiční Čínština (正體中文) - + Brazilian Portuguese (português do Brasil) Brazilská Portugalština (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonsko - + USA USA - + Europe Evropa - + Australia Austrálie - + China Čína - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Lybie - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polsko - + Portugal Portugalsko - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turecko - + UCT UCT - + Universal Univerzální - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Zadokovaná - + Handheld Příruční - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Vždy se zeptat (Výchozí) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - - Disabled - - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/da.ts b/dist/languages/da.ts index a1ad0d6597..ed0bbc27d1 100644 --- a/dist/languages/da.ts +++ b/dist/languages/da.ts @@ -1108,993 +1108,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + + + Disabled + + + + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Automatisk - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Nøjagtig - - - + + + Default Standard - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Usikker - + Paranoid (disables most optimizations) Paranoid (deaktiverer de fleste optimeringer) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Uindrammet Vindue - + Exclusive Fullscreen Eksklusiv Fuld Skærm - + No Video Output Ingen Video-Output - + CPU Video Decoding CPU-Video Afkodning - + GPU Video Decoding (Default) GPU-Video Afkodning (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75X (540p/810p) [EKSPERIMENTEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor Nærmeste Nabo - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gausisk - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tving 4:3 - + Force 21:9 Tving 21:9 - + Force 16:10 - + Stretch to Window Stræk til Vindue - + Automatic - + 2x - + 4x - + 8x - + 16x - + Japanese (日本語) Japansk (日本語) - + American English - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Hollandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwanesisk - + British English Britisk Engelsk - + Canadian French Candadisk Fransk - + Latin American Spanish Latinamerikansk Spansk - + Simplified Chinese Forenklet Kinesisk - + Traditional Chinese (正體中文) Traditionelt Kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliansk Portugisisk (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ægypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Tyrkiet - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokket - + Handheld Håndholdt - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - - Disabled - - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/de.ts b/dist/languages/de.ts index d6b1fdbcb5..d845754236 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -1170,994 +1170,983 @@ Wenn diese Option aktiviert ist, werden solche Abfragen umgangen und die Emulati - Disable controller applet - Controller-Applet deaktivieren - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - Deaktiviert die Verwendung des Controller-Applets in emulierten Programmen zwangsweise. -Wenn ein Programm versucht, das Controller-Applet zu öffnen, wird es sofort geschlossen. - - - Check for updates Auf Aktualisierungen überprüfen - + Whether or not to check for updates upon startup. Ob nach Aktualisierungen während des Startens gesucht werden soll. - + Enable Gamemode Spielmodus aktivieren - + Force X11 as Graphics Backend X11 als Grafik-Backend erzwingen - + Custom frontend Benutzerdefiniertes Frontend - + Real applet Echtes Applet - + + + Disabled + Deaktiviert + + + Never Niemals - + On Load Beim Laden - + Always Immer - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asynchron - + Uncompressed (Best quality) Unkomprimiert (Beste Qualität) - + BC1 (Low quality) BC1 (Niedrige Qualität) - + BC3 (Medium quality) BC3 (Mittlere Qualität) - - + + Auto Auto - + 30 FPS 30 BpS - + 60 FPS 60 BpS - + 90 FPS 90 BpS - + 120 FPS 120 BpS - + Conservative Konservativ - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembler-Shader, nur NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (experimentell, nur AMD/Mesa) - + Null Null - + Fast Schnell - - - + + + Accurate Akkurat - - - + + + Default Vorgabe - + Unsafe (fast) Unsicher (schnell) - + Safe (stable) Sicher (stabil) - + Immediate Direkt - + Balanced Ausgeglichen - + Unsafe Unsicher - + Paranoid (disables most optimizations) Paranoid (deaktiviert die meisten Optimierungen) - + Debugging Fehlerbehebung - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Rahmenloses Fenster - + Exclusive Fullscreen Exklusiver Vollbildmodus - + No Video Output Keine Videoausgabe - + CPU Video Decoding CPU Video Dekodierung - + GPU Video Decoding (Default) GPU Video Dekodierung (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5X (360p/540p) [EXPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75X (540p/810p) [EXPERIMENTELL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1,5X (1080p/1620p) [EXPERIMENTELL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest-Neighbor - + Bilinear Bilinear - + Bicubic Bikubisch - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super-Auflösung - + Area Bereich - + MMPX MMPX - + Zero-Tangent Nulltangente - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Spiel-Superauflösung - + Snapdragon Game Super Resolution EdgeDir Snapdragon Spiel-Superauflösung EdgeDir - + None Keiner - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Vorgabe (16:9) - + Force 4:3 4:3 erzwingen - + Force 21:9 21:9 erzwingen - + Force 16:10 16:10 erzwingen - + Stretch to Window Auf Fenster anpassen - + Automatic Automatisch - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japanisch (日本語) - + American English Amerikanisches Englisch - + French (français) Französisch (français) - + German (Deutsch) Deutsch (German) - + Italian (italiano) Italienisch (italiano) - + Spanish (español) Spanisch (español) - + Chinese Chinesisch - + Korean (한국어) Koreanisch (한국어) - + Dutch (Nederlands) Niederländisch (Nederlands) - + Portuguese (português) Portugiesisch (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanesisch - + British English Britisches Englisch - + Canadian French Kanadisches Französisch - + Latin American Spanish Lateinamerikanisches Spanisch - + Simplified Chinese Vereinfachtes Chinesisch - + Traditional Chinese (正體中文) Traditionelles Chinesisch (正體中文) - + Brazilian Portuguese (português do Brasil) Brasilianisches Portugiesisch (português do Brasil) - + Polish (polska) Polnisch (Polen) - + Thai (แบบไทย) Thailändisch (Thailändische Version) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatisch (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Ägypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkei - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Vorgabe) - + 6GB DRAM (Unsafe) 6GB DRAM (Unsicher) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Unsicher) - + 12GB DRAM (Unsafe) 12GB DRAM (Unsicher) - + Docked Angedockt - + Handheld Handgerät - - + + Normal Normal - - + + Boost Beschleunigung - - + + Overclock Übertaktung - + Always ask (Default) Immer fragen (Vorgabe) - + Only if game specifies not to stop Nur wenn ein Spiel vorgibt, nicht zu stoppen - + Never ask Niemals fragen - + Very Small (16 MB) Sehr klein (16 MB) - + Small (32 MB) Klein (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Groß (256 MB) - + Very Large (512 MB) Sehr groß (512 MB) - + Very Low (4 MB) Sehr niedrig (4 MB) - + Low (8 MB) Niedrig (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Mittel (32 MB) - + High (64 MB) Hoch (64 MB) - + Very Low (32) Sehr niedrig (32) - + Low (64) Niedrig (64) - + Normal (128) Normal (128) - + Medium (256) Mittel (256) - + High (512) Hoch (512) - - Disabled - Deaktiviert - - - + ExtendedDynamicState 1 ErweiterterDynamischerZustand 1 - + ExtendedDynamicState 2 ErweiterterDynamischerZustand 2 - + ExtendedDynamicState 3 ErweiterterDynamischerZustand 3 - + Tree View Baumansicht - + Grid View Rasteransicht diff --git a/dist/languages/el.ts b/dist/languages/el.ts index a9a5dd9012..b269f194ea 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -1108,993 +1108,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + + + Disabled + + + + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Αυτόματη - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Ακριβής - - - + + + Default Προεπιλεγμένο - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Επισφαλής - + Paranoid (disables most optimizations) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Παραθυροποιημένο Χωρίς Όρια - + Exclusive Fullscreen Αποκλειστική Πλήρης Οθόνη - + No Video Output Χωρίς Έξοδο Βίντεο - + CPU Video Decoding Αποκωδικοποίηση Βίντεο CPU - + GPU Video Decoding (Default) Αποκωδικοποίηση Βίντεο GPU (Προεπιλογή) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ΠΕΙΡΑΜΑΤΙΚΟ] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor Πλησιέστερος Γείτονας - + Bilinear Διγραμμικό - + Bicubic Δικυβικό - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Κανένα - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Προεπιλογή (16:9) - + Force 4:3 Επιβολή 4:3 - + Force 21:9 Επιβολή 21:9 - + Force 16:10 Επιβολή 16:10 - + Stretch to Window Επέκταση στο Παράθυρο - + Automatic Αυτόματα - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Ιαπωνικά (日本語) - + American English - + French (français) Γαλλικά (Français) - + German (Deutsch) Γερμανικά (Deutsch) - + Italian (italiano) Ιταλικά (Italiano) - + Spanish (español) Ισπανικά (Español) - + Chinese Κινέζικα - + Korean (한국어) Κορεάτικα (한국어) - + Dutch (Nederlands) Ολλανδικά (Nederlands) - + Portuguese (português) Πορτογαλικά (Português) - + Russian (Русский) Ρώσικα (Русский) - + Taiwanese Ταϊβανέζικα - + British English Βρετανικά Αγγλικά - + Canadian French Καναδικά Γαλλικά - + Latin American Spanish Λατινοαμερικάνικα Ισπανικά - + Simplified Chinese Απλοποιημένα Κινέζικα - + Traditional Chinese (正體中文) Παραδοσιακά Κινέζικα (正體中文) - + Brazilian Portuguese (português do Brasil) Πορτογαλικά Βραζιλίας (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Ιαπωνία - + USA ΗΠΑ - + Europe Ευρώπη - + Australia Αυστραλία - + China Κίνα - + Korea Κορέα - + Taiwan Ταϊβάν - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Κούβα - + EET EET - + Egypt Αίγυπτος - + Eire - + EST EST - + EST5EDT EST5EDT - + GB - + GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Γκρήνουιτς - + Hongkong Χονγκ Κονγκ - + HST HST - + Iceland Ισλανδία - + Iran Ιράν - + Israel Ισραήλ - + Jamaica Ιαμαϊκή - + Kwajalein - + Libya Λιβύη - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Ναβάχο - + NZ - + NZ-CHAT - + Poland Πολωνία - + Portugal Πορτογαλία - + PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Σιγκαπούρη - + Turkey Τουρκία - + UCT UCT - + Universal Παγκόσμια - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu - + Mono Μονοφωνικό - + Stereo Στέρεοφωνικό - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - - Disabled - - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/es.ts b/dist/languages/es.ts index 949145a741..c565dc17f2 100644 --- a/dist/languages/es.ts +++ b/dist/languages/es.ts @@ -1164,994 +1164,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - Desactivar applet de mandos - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - Desactiva forzosamente el uso del applet del controlador en programas emulados. -Cuando un programa intenta abrir el applet del controlador, se cierra inmediatamente. - - - Check for updates Buscar actualizaciones - + Whether or not to check for updates upon startup. Si se deben buscar actualizaciones al iniciar o no. - + Enable Gamemode Activar Modo Juego - + Force X11 as Graphics Backend Forzar X11 como motor gráfico - + Custom frontend Interfaz personalizada - + Real applet Applet real - + + + Disabled + Desactivado + + + Never Nunca - + On Load Al cargar - + Always Siempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU asíncrona - + Uncompressed (Best quality) Sin compresión (Mejor calidad) - + BC1 (Low quality) BC1 (Calidad baja) - + BC3 (Medium quality) BC3 (Calidad media) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservativo - + Aggressive Agresivo - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Ensamblado de sombreadores, solo NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, solo AMD/Mesa) - + Null Ninguno - + Fast Rápido - - - + + + Accurate Preciso - - - + + + Default Predeterminado - + Unsafe (fast) Inseguro (rápido) - + Safe (stable) Seguro (estable) - + Immediate Inmediato - + Balanced Balanceado - + Unsafe Impreciso - + Paranoid (disables most optimizations) Paranoico (Deshabilita la mayoría de optimizaciones) - + Debugging Depuración - + Dynarmic DynARMic - + NCE NCE - + Borderless Windowed Ventana sin bordes - + Exclusive Fullscreen Pantalla completa - + No Video Output Sin salida de vídeo - + CPU Video Decoding Decodificación de vídeo en la CPU - + GPU Video Decoding (Default) Decodificación de vídeo en GPU (Por defecto) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] x0,5 (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] x0,75 (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) x1 (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] x1,5 (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) x2 (1440p/2160p) - + 3X (2160p/3240p) x3 (2160p/3240p) - + 4X (2880p/4320p) x4 (2880p/4320p) - + 5X (3600p/5400p) x5 (3600p/5400p) - + 6X (4320p/6480p) x6 (4320p/6480p) - + 7X (5040p/7560p) x7 (5040p/7560p) - + 8X (5760p/8640p) x8 (5760p/8640p) - + Nearest Neighbor Vecino más próximo - + Bilinear Bilineal - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution Super Resolución AMD FidelityFX - + Area Área - + MMPX MMPX - + Zero-Tangent Tangente cero - + B-Spline Ranura B - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Super resolución de juego Snapdragon - + Snapdragon Game Super Resolution EdgeDir Filo direcorio de super resolución de juego Snapdragon - + None Ninguno - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Predeterminado (16:9) - + Force 4:3 Forzar 4:3 - + Force 21:9 Forzar 21:9 - + Force 16:10 Forzar 16:10 - + Stretch to Window Estirar a la ventana - + Automatic Automático - + 2x x2 - + 4x x4 - + 8x x8 - + 16x x16 - + Japanese (日本語) Japonés (日本語) - + American English Inglés estadounidense - + French (français) Francés (français) - + German (Deutsch) Alemán (deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Español - + Chinese Chino - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandés (nederlands) - + Portuguese (português) Portugués (português) - + Russian (Русский) Ruso (Русский) - + Taiwanese Taiwanés - + British English Inglés británico - + Canadian French Francés canadiense - + Latin American Spanish Español latinoamericano - + Simplified Chinese Chino simplificado - + Traditional Chinese (正體中文) Chino tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugués brasileño (português do Brasil) - + Polish (polska) Polaco (polska) - + Thai (แบบไทย) Tailandés (แบบไทย) - - + + Japan Japón - + USA EEUU - + Europe Europa - + Australia Australia - + China China - + Korea Corea - + Taiwan Taiwán - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Predeterminada (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Irán - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquía - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulú - + Mono Mono - + Stereo Estéreo - + Surround Envolvente - + 4GB DRAM (Default) 4GB DRAM (Por defecto) - + 6GB DRAM (Unsafe) 6GB DRAM (Inseguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Sobremesa - + Handheld Portátil - - + + Normal Normal - - + + Boost Impulso - - + + Overclock Overclock - + Always ask (Default) Preguntar siempre (Por defecto) - + Only if game specifies not to stop Solo si el juego pide no ser cerrado - + Never ask Nunca preguntar - + Very Small (16 MB) Muy pequeño (16 MB) - + Small (32 MB) Pequeño (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muy grande (512 MB) - + Very Low (4 MB) Muy bajo (4 MB) - + Low (8 MB) Bajo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muy bajo (32) - + Low (64) Bajo (64) - + Normal (128) Normal (128) - + Medium (256) Medio (256) - + High (512) Alto (512) - - Disabled - Desactivado - - - + ExtendedDynamicState 1 ModoDynamicoExtendido 1 - + ExtendedDynamicState 2 ModoDynamicoExtendido 2 - + ExtendedDynamicState 3 ModoDynamicoExtendido 3 - + Tree View Vista en árbol - + Grid View Vista en cuadrícula diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index 5918e93a67..2873cb1c05 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -1108,993 +1108,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + + + Disabled + + + + Never - + On Load - + Always - + CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate - - - + + + Default - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe - + Paranoid (disables most optimizations) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed - + Exclusive Fullscreen - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - + Bilinear - + Bicubic - + Gaussian - + Lanczos - + ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None - + FXAA - + SMAA - + Default (16:9) - + Force 4:3 - + Force 21:9 - + Force 16:10 - + Stretch to Window - + Automatic - + 2x - + 4x - + 8x - + 16x - + Japanese (日本語) - + American English - + French (français) - + German (Deutsch) - + Italian (italiano) - + Spanish (español) - + Chinese - + Korean (한국어) - + Dutch (Nederlands) - + Portuguese (português) - + Russian (Русский) - + Taiwanese - + British English - + Canadian French - + Latin American Spanish - + Simplified Chinese - + Traditional Chinese (正體中文) - + Brazilian Portuguese (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan - + USA - + Europe - + Australia - + China - + Korea - + Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET - + CST6CDT - + Cuba - + EET - + Egypt - + Eire - + EST - + EST5EDT - + GB - + GB-Eire - + GMT - + GMT+0 - + GMT-0 - + GMT0 - + Greenwich - + Hongkong - + HST - + Iceland - + Iran - + Israel - + Jamaica - + Kwajalein - + Libya - + MET - + MST - + MST7MDT - + Navajo - + NZ - + NZ-CHAT - + Poland - + Portugal - + PRC - + PST8PDT - + ROC - + ROK - + Singapore - + Turkey - + UCT - + Universal - + UTC - + W-SU - + WET - + Zulu - + Mono - + Stereo - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked - + Handheld + + + + Normal + + + + + + Boost + + - Normal - - - - - - Boost - - - - - Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - - Disabled - - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index 70562e75f1..99f926752e 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -1157,994 +1157,983 @@ L’activer permet de contourner ces confirmations et de quitter directement l - Disable controller applet - Désactiver l'applet du contrôleur - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - Désactive de force le menu de configuration des manettes dans les programmes émulés. -Lorsqu’un programme tente d’ouvrir ce menu, il est immédiatement fermé. - - - Check for updates Rechercher des mises à jours - + Whether or not to check for updates upon startup. Vérifier ou non les mises à jour au démarrage. - + Enable Gamemode Activer le mode jeu - + Force X11 as Graphics Backend Forcer X11 comme moteur graphique - + Custom frontend Interface personnalisée - + Real applet Applet réel - + + + Disabled + Désactivé + + + Never Jamais - + On Load Au chargement - + Always Toujours - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asynchrone - + Uncompressed (Best quality) Non compressé (Meilleure qualité) - + BC1 (Low quality) BC1 (Basse qualité) - + BC3 (Medium quality) BC3 (Qualité moyenne) - - + + Auto Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Conservateur - + Aggressive Agressif - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Nul - + Fast Rapide - - - + + + Accurate Précis - - - + + + Default Par défaut - + Unsafe (fast) Insecure (rapide) - + Safe (stable) Sûr (stable) - + Immediate - + Balanced Moyen - + Unsafe Risqué - + Paranoid (disables most optimizations) Paranoïaque (désactive la plupart des optimisations) - + Debugging Débogage - + Dynarmic Dynamique - + NCE NCE - + Borderless Windowed Fenêtré sans bordure - + Exclusive Fullscreen Plein écran exclusif - + No Video Output Pas de sortie vidéo - + CPU Video Decoding Décodage Vidéo sur le CPU - + GPU Video Decoding (Default) Décodage Vidéo sur le GPU (par défaut) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPÉRIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPÉRIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1,25X (900p/1350p) [EXPÉRIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPÉRIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Plus proche voisin - + Bilinear Bilinéaire - + Bicubic Bicubique - + Gaussian Gaussien - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area (Par zone) - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Aucun - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Par défaut (16:9) - + Force 4:3 Forcer le 4:3 - + Force 21:9 Forcer le 21:9 - + Force 16:10 Forcer le 16:10 - + Stretch to Window Étirer à la fenêtre - + Automatic Automatique - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonais (日本語) - + American English Anglais Américain - + French (français) Français (français) - + German (Deutsch) Allemand (Deutsch) - + Italian (italiano) Italien (italiano) - + Spanish (español) Espagnol (español) - + Chinese Chinois - + Korean (한국어) Coréen (한국어) - + Dutch (Nederlands) Néerlandais (Nederlands) - + Portuguese (português) Portugais (português) - + Russian (Русский) Russe (Русский) - + Taiwanese Taïwanais - + British English Anglais Britannique - + Canadian French Français Canadien - + Latin American Spanish Espagnol d'Amérique Latine - + Simplified Chinese Chinois Simplifié - + Traditional Chinese (正體中文) Chinois Traditionnel (正體中文) - + Brazilian Portuguese (português do Brasil) Portugais Brésilien (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japon - + USA É.-U.A. - + Europe Europe - + Australia Australie - + China Chine - + Korea Corée - + Taiwan Taïwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Par défaut (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Égypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islande - + Iran Iran - + Israel Israël - + Jamaica Jamaïque - + Kwajalein Kwajalein - + Libya Libye - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Pologne - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapour - + Turkey Turquie - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stéréo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Par défaut) - + 6GB DRAM (Unsafe) 6 GB DRAM (Risqué) - + 8GB DRAM 8GO DRAM - + 10GB DRAM (Unsafe) 10GO DRAM (Insecure) - + 12GB DRAM (Unsafe) 12GO DRAM (Insecure) - + Docked Mode TV - + Handheld Mode Portable - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Toujours demander (par défaut) - + Only if game specifies not to stop Uniquement si le jeu précise de ne pas s'arrêter - + Never ask Jamais demander - + Very Small (16 MB) Très petit (16Mo) - + Small (32 MB) Petit (32Mo) - + Normal (128 MB) Normal (128Mo) - + Large (256 MB) Large (256Mo) - + Very Large (512 MB) Très large (512Mo) - + Very Low (4 MB) Très faible (4 Mo) - + Low (8 MB) Faible (8 Mo) - + Normal (16 MB) Normal (16 Mo) - + Medium (32 MB) Moyen (32 Mo) - + High (64 MB) Élevé (64 Mo) - + Very Low (32) Très faible (32) - + Low (64) Faible (64) - + Normal (128) Normal (128) - + Medium (256) Moyen (256) - + High (512) Élevé (512) - - Disabled - Désactivé - - - + ExtendedDynamicState 1 État dynamique étendu 1 - + ExtendedDynamicState 2 État dynamique étendu 2 - + ExtendedDynamicState 3 État dynamique étendu 3 - + Tree View Vue en liste - + Grid View Vue en grille diff --git a/dist/languages/hu.ts b/dist/languages/hu.ts index 7e4617a12c..a519b354b3 100644 --- a/dist/languages/hu.ts +++ b/dist/languages/hu.ts @@ -1114,993 +1114,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - Vezérlő applet letiltása - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Játékmód engedélyezése - + Force X11 as Graphics Backend - + Custom frontend Egyéni frontend - + Real applet Valódi applet - + + + Disabled + + + + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU aszinkron - + Uncompressed (Best quality) Tömörítetlen (legjobb minőség) - + BC1 (Low quality) BC1 (alacsony minőség) - + BC3 (Medium quality) BC3 (közepes minőség) - - + + Auto Automatikus - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Takarékos - + Aggressive Aggresszív - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Pontos - - - + + + Default Alapértelmezett - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Nem biztonságos - + Paranoid (disables most optimizations) Paranoid (a legtöbb optimalizálást letiltja) - + Debugging - + Dynarmic Dinamikus - + NCE NCE - + Borderless Windowed Szegély nélküli ablak - + Exclusive Fullscreen Exkluzív teljes képernyő - + No Video Output Nincs videokimenet - + CPU Video Decoding CPU videódekódolás - + GPU Video Decoding (Default) GPU videódekódolás (alapértelmezett) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [KÍSÉRLETI] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [KÍSÉRLETI] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [KÍSÉRLETI] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Legközelebbi szomszéd - + Bilinear Bilineáris - + Bicubic Bikubikus - + Gaussian Gauss-féle - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nincs - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Alapértelmezett (16:9) - + Force 4:3 4:3 kényszerítése - + Force 21:9 21:9 kényszerítése - + Force 16:10 16:10 kényszerítése - + Stretch to Window Ablakhoz nyújtás - + Automatic Automatikus - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japán (日本語) - + American English Amerikai angol - + French (français) Francia (français) - + German (Deutsch) Német (Deutsch) - + Italian (italiano) Olasz (italiano) - + Spanish (español) Spanyol (español) - + Chinese Kínai - + Korean (한국어) Koreai (한국어) - + Dutch (Nederlands) Holland (Nederlands) - + Portuguese (português) Portugál (português) - + Russian (Русский) Orosz (Русский) - + Taiwanese Tajvani - + British English Brit Angol - + Canadian French Kanadai francia - + Latin American Spanish Latin-amerikai spanyol - + Simplified Chinese Egyszerűsített kínai - + Traditional Chinese (正體中文) Hagyományos kínai (正體中文) - + Brazilian Portuguese (português do Brasil) Brazíliai portugál (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japán - + USA USA - + Europe Európa - + Australia Ausztrália - + China Kína - + Korea Korea - + Taiwan Tajvan - + Auto (%1) Auto select time zone Automatikus (%1) - + Default (%1) Default time zone Alapértelmezett (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egyiptom - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Izland - + Iran Irán - + Israel Izrael - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navahó - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Lengyelország - + Portugal Portugália - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Szingapúr - + Turkey Törökország - + UCT UCT - + Universal Univerzális - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Sztereó - + Surround Térhangzás - + 4GB DRAM (Default) 4GB DRAM (Alapértelmezett) - + 6GB DRAM (Unsafe) 6GB DRAM (Nem biztonságos) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokkolt - + Handheld Kézi - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Mindig kérdezz rá (alapértelmezett) - + Only if game specifies not to stop Csak akkor, ha a játék kifejezetten kéri a folytatást. - + Never ask Soha ne kérdezz rá - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - - Disabled - - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/id.ts b/dist/languages/id.ts index 160fa812be..ab0fe1d8b8 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -1126,993 +1126,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - Nonaktifkan aplikasi pengontrol - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates Cek Pembaruan - + Whether or not to check for updates upon startup. - + Enable Gamemode Aktifkan Mode Permainan - + Force X11 as Graphics Backend - + Custom frontend Tampilan depan kustom - + Real applet Aplikasi nyata - + + + Disabled + + + + Never Tidak Pernah - + On Load - + Always Selalu - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU sinkron - + Uncompressed (Best quality) Tidak terkompresi (Kualitas Terbaik) - + BC1 (Low quality) BC1 (Kualitas rendah) - + BC3 (Medium quality) BC3 (Kualitas sedang) - - + + Auto Otomatis - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Konservatif - + Aggressive Agresif - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast Cepat - - - + + + Accurate Akurat - - - + + + Default Bawaan - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced Seimbang - + Unsafe Berbahaya - + Paranoid (disables most optimizations) Paranoid (menonaktifkan sebagian besar optimasi) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Layar Tanpa Batas - + Exclusive Fullscreen Layar Penuh Eksklusif - + No Video Output Tidak ada Keluaran Suara - + CPU Video Decoding Penguraian Video menggunakan CPU - + GPU Video Decoding (Default) Penguraian Video menggunakan GPU (Bawaan) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EKSPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EKSPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EKSPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Biliner - + Bicubic Bikubik - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Tak ada - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Bawaan (16:9) - + Force 4:3 Paksa 4:3 - + Force 21:9 Paksa 21:9 - + Force 16:10 Paksa 16:10 - + Stretch to Window Regangkan ke Layar - + Automatic Otomatis - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Jepang (日本語) - + American English Bahasa Inggris Amerika - + French (français) Prancis (français) - + German (Deutsch) Jerman (Deutsch) - + Italian (italiano) Italia (italiano) - + Spanish (español) Spanyol (español) - + Chinese Cina - + Korean (한국어) Korea (한국어) - + Dutch (Nederlands) Belanda (Nederlands) - + Portuguese (português) Portugis (português) - + Russian (Русский) Rusia (Русский) - + Taiwanese Taiwan - + British English Inggris Britania - + Canadian French Prancis Kanada - + Latin American Spanish Spanyol Amerika Latin - + Simplified Chinese Cina Sederhana - + Traditional Chinese (正體中文) Cina Tradisional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugis Brazil (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Jepang - + USA USA - + Europe Eropa - + Australia Australia - + China Tiongkok - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Bawaan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Mesir - + Eire Éire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Éire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polandia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turki - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Bawaan) - + 6GB DRAM (Unsafe) 6GB DRAM (Tidak Aman) - + 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Tidak Aman) - + 12GB DRAM (Unsafe) 12GB DRAM (Tidak Aman) - + Docked Terpasang - + Handheld Jinjing - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Selalu tanyakan (Bawaan) - + Only if game specifies not to stop Hanya jika permainan menentukan untuk tidak berhenti - + Never ask Jangan pernah bertanya - + Very Small (16 MB) Sangat Kecil (16 MB) - + Small (32 MB) Kecil (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Sedang (256) - + High (512) Tinggi (512) - - Disabled - - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/it.ts b/dist/languages/it.ts index c0b01945ad..6315c384db 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -1158,994 +1158,983 @@ Abilitarla bypassa queste richieste e l'emulazione cesserà immediatamente. - Disable controller applet - Disabilita l'applet controller - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - Disabilita forzatamente l'uso dell'applet del controller nei programmi emulati. -Quando un programma proverà ad aprire l'applet del controller, quest'ultimo verrà immediatamente chiuso. - - - Check for updates Controlla la presenza di aggiornamenti - + Whether or not to check for updates upon startup. Determina se controllare o meno la presenza di aggiornamenti all'avvio. - + Enable Gamemode Abilita Gamemode - + Force X11 as Graphics Backend Forza l'uso del back-end grafico X11 - + Custom frontend Frontend personalizzato - + Real applet Applet reale - + + + Disabled + Disabilitato + + + Never Mai - + On Load Al caricamento - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU (Asincrono) - + Uncompressed (Best quality) Nessuna compressione (qualità migliore) - + BC1 (Low quality) BC1 (qualità bassa) - + BC3 (Medium quality) BC3 (qualità media) - - + + Auto Automatico - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservativa - + Aggressive Aggressiva - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (shader assembly, solo NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (sperimentale, solo AMD/MESA) - + Null Nullo - + Fast Veloce - - - + + + Accurate Accurata - - - + + + Default Predefinito - + Unsafe (fast) Non sicuro (veloce) - + Safe (stable) Sicuro (stabile) - + Immediate - + Balanced Bilanciata - + Unsafe Non sicura - + Paranoid (disables most optimizations) Paranoica (disabilita la maggior parte delle ottimizzazioni) - + Debugging Debug - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Finestra senza bordi - + Exclusive Fullscreen Schermo intero esclusivo - + No Video Output Nessun output video - + CPU Video Decoding Decodifica video CPU - + GPU Video Decoding (Default) Decodifica video GPU (predefinita) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [SPERIMENTALE] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [SPERIMENTALE] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [SPERIMENTALE] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [SPERIMENTALE] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [SPERIMENTALE] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest neighbor - + Bilinear Bilineare - + Bicubic Bicubico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nessuna - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Predefinito (16:9) - + Force 4:3 Forza 4:3 - + Force 21:9 Forza 21:9 - + Force 16:10 Forza 16:10 - + Stretch to Window Allunga a finestra - + Automatic Automatico - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Giapponese (日本語) - + American English Inglese americano - + French (français) Francese (français) - + German (Deutsch) Tedesco (Deutsch) - + Italian (italiano) Italiano - + Spanish (español) Spagnolo (español) - + Chinese Cinese - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Olandese (Nederlands) - + Portuguese (português) Portoghese (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanese - + British English Inglese britannico - + Canadian French Francese canadese - + Latin American Spanish Spagnolo latino-americano - + Simplified Chinese Cinese semplificato - + Traditional Chinese (正體中文) Cinese tradizionale (正體中文) - + Brazilian Portuguese (português do Brasil) Portoghese brasiliano (português do Brasil) - + Polish (polska) Polacco (polska) - + Thai (แบบไทย) Thailandese (แบบไทย) - - + + Japan Giappone - + USA USA - + Europe Europa - + Australia Australia - + China Cina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatico (%1) - + Default (%1) Default time zone Predefinito (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egitto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islanda - + Iran Iran - + Israel Israele - + Jamaica Giamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portogallo - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turchia - + UCT UCT - + Universal Universale - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Predefinito) - + 6GB DRAM (Unsafe) 6GB DRAM (Non sicuro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Non sicuro) - + 12GB DRAM (Unsafe) 12GB DRAM (Non sicuro) - + Docked Dock - + Handheld Portatile - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Chiedi sempre (Predefinito) - + Only if game specifies not to stop Solo se il gioco richiede di non essere arrestato - + Never ask Non chiedere mai - + Very Small (16 MB) Molto piccola (16 MB) - + Small (32 MB) Piccola (32 MB) - + Normal (128 MB) Normale (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Molto grande (512 MB) - + Very Low (4 MB) Molto bassa (4 MB) - + Low (8 MB) Bassa (8 MB) - + Normal (16 MB) Normale (16 MB) - + Medium (32 MB) Media (32 MB) - + High (64 MB) Alta (64 MB) - + Very Low (32) Molto basso (32) - + Low (64) Basso (64) - + Normal (128) Normale (128) - + Medium (256) Medio (256) - + High (512) Alto (512) - - Disabled - Disabilitato - - - + ExtendedDynamicState 1 Stato dinamico esteso 1 - + ExtendedDynamicState 2 Stato dinamico esteso 2 - + ExtendedDynamicState 3 Stato dinamico esteso 3 - + Tree View Vista ad albero - + Grid View Vista a griglia diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index f16621c044..c7eb268ca0 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -1111,993 +1111,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - コントローラーアプレットの無効化 - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + + + Disabled + 無効 + + + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 非同期 - + Uncompressed (Best quality) 圧縮しない (最高品質) - + BC1 (Low quality) BC1 (低品質) - + BC3 (Medium quality) BC3 (中品質) - - + + Auto 自動 - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (アセンブリシェーダー、NVIDIA のみ) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V(実験的、AMD/Mesaのみ) - + Null - + Fast - - - + + + Accurate 正確 - - - + + + Default デフォルト - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe 不安定 - + Paranoid (disables most optimizations) パラノイド (ほとんどの最適化を無効化) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed ボーダーレスウィンドウ - + Exclusive Fullscreen 排他的フルスクリーン - + No Video Output ビデオ出力しない - + CPU Video Decoding ビデオをCPUでデコード - + GPU Video Decoding (Default) ビデオをGPUでデコード (デフォルト) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [実験的] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [実験的] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [実験的] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area - + MMPX MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None なし - + FXAA FXAA - + SMAA SMAA - + Default (16:9) デフォルト (16:9) - + Force 4:3 強制 4:3 - + Force 21:9 強制 21:9 - + Force 16:10 強制 16:10 - + Stretch to Window ウィンドウに合わせる - + Automatic 自動 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日本語 - + American English アメリカ英語 - + French (français) フランス語 (français) - + German (Deutsch) ドイツ語 (Deutsch) - + Italian (italiano) イタリア語 (italiano) - + Spanish (español) スペイン語 (español) - + Chinese 中国語 - + Korean (한국어) 韓国語 (한국어) - + Dutch (Nederlands) オランダ語 (Nederlands) - + Portuguese (português) ポルトガル語 (português) - + Russian (Русский) ロシア語 (Русский) - + Taiwanese 台湾語 - + British English イギリス英語 - + Canadian French カナダフランス語 - + Latin American Spanish ラテンアメリカスペイン語 - + Simplified Chinese 簡体字中国語 - + Traditional Chinese (正體中文) 繁体字中国語 (正體中文) - + Brazilian Portuguese (português do Brasil) ブラジルポルトガル語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA アメリカ - + Europe ヨーロッパ - + Australia オーストラリア - + China 中国 - + Korea 韓国 - + Taiwan 台湾 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 既定 (%1) - + CET 中央ヨーロッパ時間 - + CST6CDT CST6CDT - + Cuba キューバ - + EET 東ヨーロッパ標準時 - + Egypt エジプト - + Eire アイルランド - + EST アメリカ東部標準時 - + EST5EDT EST5EDT - + GB GB - + GB-Eire イギリス-アイルランド - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich グリニッジ - + Hongkong 香港 - + HST ハワイ標準時 - + Iceland アイスランド - + Iran イラン - + Israel イスラエル - + Jamaica ジャマイカ - + Kwajalein クェゼリン - + Libya リビア - + MET 中東時間 - + MST MST - + MST7MDT MST7MDT - + Navajo ナバホ - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland ポーランド - + Portugal ポルトガル - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore シンガポール - + Turkey トルコ - + UCT UCT - + Universal ユニバーサル - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu ズールー - + Mono モノラル - + Stereo ステレオ - + Surround サラウンド - + 4GB DRAM (Default) 4GB DRAM (デフォルト) - + 6GB DRAM (Unsafe) 6GB DRAM (不安定) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld 携帯モード - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) 常に確認する (デフォルト) - + Only if game specifies not to stop ゲームが停止しないように指定しているときのみ - + Never ask 確認しない - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - - Disabled - 無効 - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index 881fe138d3..a6d39cf213 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -1172,994 +1172,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - 컨트롤러 애플릿 비활성화 - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - 에뮬레이트된 프로그램에서 컨트롤러 애플릿 사용을 강제적으로 비활성화합니다. -프로그램이 컨트롤러 애플릿을 열려고 하면 즉시 닫힙니다. - - - Check for updates 업데이트 확인 - + Whether or not to check for updates upon startup. 시작 시 업데이트를 확인할지 여부. - + Enable Gamemode 게임 모드 활성화 - + Force X11 as Graphics Backend X11을 그래픽 백엔드로 강제 설정 - + Custom frontend 사용자 정의 프론트엔드 - + Real applet 실제 애플릿 - + + + Disabled + 비활성화됨 + + + Never 안 함 - + On Load 로드 시 - + Always 항상 - + CPU CPU - + GPU GPU - + CPU Asynchronous 비동기 CPU - + Uncompressed (Best quality) 비압축(최고 품질) - + BC1 (Low quality) BC1(저품질) - + BC3 (Medium quality) BC3(중간 품질) - - + + Auto 자동 - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative 소극적 - + Aggressive 적극적 - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM(어셈블리 셰이더, NVIDIA 전용) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V(실험적, AMD/Mesa 전용) - + Null Null - + Fast 고속 - - - + + + Accurate 정확 - - - + + + Default 기본값 - + Unsafe (fast) 불안전(빠름) - + Safe (stable) 안전(안정적) - + Immediate 즉시 - + Balanced 균형 - + Unsafe 불안전 - + Paranoid (disables most optimizations) 편집증적(대부분의 최적화를 비활성화함) - + Debugging 디버깅 - + Dynarmic 동적 - + NCE NCE - + Borderless Windowed 테두리 없는 창 - + Exclusive Fullscreen 독점 전체 화면 - + No Video Output 비디오 출력 없음 - + CPU Video Decoding CPU 비디오 디코딩 - + GPU Video Decoding (Default) GPU 비디오 디코딩(기본값) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [실험적] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [실험적] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [실험적] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [실험적] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [실험적] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 최단입점 - + Bilinear 쌍선형 - + Bicubic 쌍입방 - + Gaussian 가우시안 - + Lanczos 란초스 - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area 영역 - + MMPX MMPX - + Zero-Tangent 제로탄젠트 - + B-Spline B-스플라인 - + Mitchell 미첼 - + Spline-1 스플라인-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None 없음 - + FXAA FXAA - + SMAA SMAA - + Default (16:9) 기본(16:9) - + Force 4:3 강제 4:3 - + Force 21:9 강제 21:9 - + Force 16:10 강제 16:10 - + Stretch to Window 화면 늘리기 - + Automatic 자동 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 일본어(日本語) - + American English 미국식 영어 - + French (français) 프랑스어(français) - + German (Deutsch) 독일어(Deutsch) - + Italian (italiano) 이탈리아어(italiano) - + Spanish (español) 스페인어(español) - + Chinese 중국어 - + Korean (한국어) 한국어(Korean) - + Dutch (Nederlands) 네덜란드어(Nederlands) - + Portuguese (português) 포르투갈어(português) - + Russian (Русский) 러시아어(Русский) - + Taiwanese 대만어 - + British English 영국식 영어 - + Canadian French 캐나다 프랑스어 - + Latin American Spanish 라틴아메리카 스페인어 - + Simplified Chinese 중국어 간체 - + Traditional Chinese (正體中文) 중국어 번체(正體中文) - + Brazilian Portuguese (português do Brasil) 브라질 포르투갈어(português do Brasil) - + Polish (polska) 폴란드어(polska) - + Thai (แบบไทย) 태국어(แบบไทย) - - + + Japan 일본 - + USA 미국 - + Europe 유럽 - + Australia 호주 - + China 중국 - + Korea 대한민국 - + Taiwan 대만 - + Auto (%1) Auto select time zone 자동(%1) - + Default (%1) Default time zone 기본(%1) - + CET CET - + CST6CDT CST6CDT - + Cuba 쿠바 - + EET EET - + Egypt 이집트 - + Eire 아일랜드 - + EST EST - + EST5EDT EST5EDT - + GB 영국 - + GB-Eire 영국-아일랜드 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 그리니치 - + Hongkong 홍콩 - + HST HST - + Iceland 아이슬란드 - + Iran 이란 - + Israel 이스라엘 - + Jamaica 자메이카 - + Kwajalein 콰잘레인 - + Libya 리비아 - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo 나바호 - + NZ 뉴질랜드 - + NZ-CHAT 뉴질랜드-채텀 - + Poland 폴란드 - + Portugal 포르투갈 - + PRC 중국 - + PST8PDT PST8PDT - + ROC 대만 - + ROK 대한민국 - + Singapore 싱가포르 - + Turkey 터키 - + UCT UCT - + Universal 세계 - + UTC UTC - + W-SU 모스크바 - + WET WET - + Zulu Zulu - + Mono 모노 - + Stereo 스테레오 - + Surround 서라운드 - + 4GB DRAM (Default) 4GB DRAM(기본값) - + 6GB DRAM (Unsafe) 6GB DRAM(불안전) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM(불안전) - + 12GB DRAM (Unsafe) 12GB DRAM(불안전) - + Docked 독 모드 - + Handheld 휴대 모드 - - + + Normal 보통 - - + + Boost 부스트 - - + + Overclock 오버클럭 - + Always ask (Default) 항상 묻기(기본값) - + Only if game specifies not to stop 게임에서 멈추지 말라고 명시한 경우에만 - + Never ask 절대 묻지 않음 - + Very Small (16 MB) 아주 작은 크기(16 MB) - + Small (32 MB) 작은 크기(32 MB) - + Normal (128 MB) 보통 크기(128 MB) - + Large (256 MB) 큰 크기(256 MB) - + Very Large (512 MB) 아주 큰 크기(512 MB) - + Very Low (4 MB) 매우 낮은 크기(4 MB) - + Low (8 MB) 낮은 크기(8 MB) - + Normal (16 MB) 보통 크기(16 MB) - + Medium (32 MB) 중간 크기(32 MB) - + High (64 MB) 높은 크기(64 MB) - + Very Low (32) 매우 낮은 크기(32) - + Low (64) 낮은 크기(64) - + Normal (128) 보통 크기(128) - + Medium (256) 보통(256) - + High (512) 빠름(512) - - Disabled - 비활성화됨 - - - + ExtendedDynamicState 1 확장된 동적 상태 1 - + ExtendedDynamicState 2 확장된 동적 상태 2 - + ExtendedDynamicState 3 확장된 동적 상태 3 - + Tree View 트리 보기 - + Grid View 격자 보기 diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index 5d77604547..5e5edb0006 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -1108,993 +1108,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - Deaktiver kontroller-appleten - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates Se etter oppdateringer - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + + + Disabled + Skrudd av + + + Never Aldri - + On Load - + Always Alltid - + CPU CPU - + GPU Skjermkort - + CPU Asynchronous - + Uncompressed (Best quality) Ukomprimert (Best kvalitet) - + BC1 (Low quality) BC1 (Lav kvalitet) - + BC3 (Medium quality) BC3 (Middels kvalitet) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (eksperimentelt, kun AMD/Mesa) - + Null Null - + Fast Rask - - - + + + Accurate Nøyaktig - - - + + + Default Standard - + Unsafe (fast) Utrygg (raskt) - + Safe (stable) Trygg (stabil) - + Immediate - + Balanced Balansert - + Unsafe Utrygt - + Paranoid (disables most optimizations) Paranoid (deaktiverer de fleste optimaliseringer) - + Debugging - + Dynarmic - + NCE NCE - + Borderless Windowed Rammeløst vindu - + Exclusive Fullscreen Eksklusiv fullskjerm - + No Video Output Ingen videoutdata - + CPU Video Decoding CPU-videodekoding - + GPU Video Decoding (Default) GPU-videodekoding (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0,25× (180p/270p) [EKSPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5× (360p/540p) [EKSPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75× (540p/810p) [EKSPERIMENTELL] - + 1X (720p/1080p) 1× (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1,25× (900p/1350p) [EKSPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1,5× (1080p/1620p) [EKSPERIMENTELL] - + 2X (1440p/2160p) 2× (1440p/2160p) - + 3X (2160p/3240p) 3× (2160p/3240p) - + 4X (2880p/4320p) 4× (2880p/4320p) - + 5X (3600p/5400p) 5× (3600p/5400p) - + 6X (4320p/6480p) 6× (4320p/6480p) - + 7X (5040p/7560p) 7× (5040p/7560p) - + 8X (5760p/8640p) 8× (5760p/8640p) - + Nearest Neighbor Nærmeste nabo - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gaussisk - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Område - + MMPX MMPX - + Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tving 4:3 - + Force 21:9 Tving 21:9 - + Force 16:10 Tving 16:10 - + Stretch to Window Strekk til vinduet - + Automatic Automatisk - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japansk (日本語) - + American English Amerikansk engelsk - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Nederlandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwansk - + British English Britisk engelsk - + Canadian French Kanadisk fransk - + Latin American Spanish Latinamerikansk spansk - + Simplified Chinese Forenklet kinesisk - + Traditional Chinese (正體中文) Tradisjonell kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisisk (português do Brasil) - + Polish (polska) Polsk (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australia - + China Folkerepublikken Kina - + Korea Korea - + Taiwan Taiwan (Republikken Kina) - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET Sentraleuropeisk tid - + CST6CDT CST6CDT - + Cuba Cuba - + EET Østeuropeisk tid - + Egypt Egypt - + Eire Republikken Irland - + EST EST - + EST5EDT EST5EDT - + GB Storbritannia - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC Folkerepublikken Kina - + PST8PDT PST8PDT - + ROC Taiwan (Republikken Kina) - + ROK Sør-Korea - + Singapore Singapore - + Turkey Tyrkia - + UCT UCT - + Universal Universalt - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (Utrygt) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (Utrygt) - + 12GB DRAM (Unsafe) 12 GB DRAM (Utrygt) - + Docked I dokking - + Handheld Håndholdt - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Spør alltid (Standard) - + Only if game specifies not to stop - + Never ask Aldri spør - + Very Small (16 MB) Veldig liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Veldig stor (512 MB) - + Very Low (4 MB) Veldig lav (4 MB) - + Low (8 MB) Lav (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Middels (32 MB) - + High (64 MB) Høy (64 MB) - + Very Low (32) Svært lav (32) - + Low (64) Lav (64) - + Normal (128) Normal (128) - + Medium (256) Middels (256) - + High (512) Høy (512) - - Disabled - Skrudd av - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index 02b1520724..296dd3ebca 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -1115,993 +1115,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - Controller-applet uitschakelen - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + + + Disabled + + + + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) BC1 (Lage Kwaliteit) - + BC3 (Medium quality) BC3 (Gemiddelde kwaliteit) - - + + Auto Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Accuraat - - - + + + Default Standaard - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Onveilig - + Paranoid (disables most optimizations) Paranoid (schakelt de meeste optimalisaties uit) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Randloos Venster - + Exclusive Fullscreen Exclusief Volledig Scherm - + No Video Output Geen Video-uitvoer - + CPU Video Decoding CPU Videodecodering - + GPU Video Decoding (Default) GPU Videodecodering (Standaard) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTEEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTEEL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Geen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standaart (16:9) - + Force 4:3 Forceer 4:3 - + Force 21:9 Forceer 21:9 - + Force 16:10 Forceer 16:10 - + Stretch to Window Uitrekken naar Venster - + Automatic Automatisch - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japans (日本語) - + American English Amerikaans-Engels - + French (français) Frans (Français) - + German (Deutsch) Duits (Deutsch) - + Italian (italiano) Italiaans (italiano) - + Spanish (español) Spaans (Español) - + Chinese Chinees - + Korean (한국어) Koreaans (한국어) - + Dutch (Nederlands) Nederlands (Nederlands) - + Portuguese (português) Portugees (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanese - + British English Brits-Engels - + Canadian French Canadees-Frans - + Latin American Spanish Latijns-Amerikaans Spaans - + Simplified Chinese Vereenvoudigd Chinees - + Traditional Chinese (正體中文) Traditioneel Chinees (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliaans-Portugees (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australië - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standaard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Ijsland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libië - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkije - + UCT UCT - + Universal Universeel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - - Disabled - - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/pl.ts b/dist/languages/pl.ts index 8e76bb191e..4b94ca5e55 100644 --- a/dist/languages/pl.ts +++ b/dist/languages/pl.ts @@ -1156,994 +1156,983 @@ Włączenie powoduje pominięcie takich monitów i bezpośrednie wyjście z emul - Disable controller applet - Wyłącz aplet kontrolera - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - Wymusza wyłączenie użycia apletu kontrolera w oprogramowaniu uruchamianym w emulacji. -Jeśli emulowane oprogramowanie próbuje otworzyć aplet kontrolera, jest on natychmiast zamykany. - - - Check for updates Sprawdź aktualizacje - + Whether or not to check for updates upon startup. Czy sprawdzać aktualizacje przy uruchomieniu. - + Enable Gamemode Włącz Tryb gry - + Force X11 as Graphics Backend Wymuś X11 jako backend grafiki - + Custom frontend Niestandardowy frontend - + Real applet Prawdziwy aplet - + + + Disabled + Wyłączone + + + Never Nigdy - + On Load Przy wczytywaniu - + Always Zawsze - + CPU CPU - + GPU GPU - + CPU Asynchronous Asynchroniczne CPU - + Uncompressed (Best quality) Brak (najlepsza jakość) - + BC1 (Low quality) BC1 (niska jakość) - + BC3 (Medium quality) BC3 (średnia jakość) - - + + Auto Automatyczny - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Konserwatywny - + Aggressive Agresywny - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast Szybkie - - - + + + Accurate Dokładny - - - + + + Default Domyślny - + Unsafe (fast) Niezalecane (szybkie) - + Safe (stable) Bezpieczne (stabilne) - + Immediate - + Balanced Zrównoważony - + Unsafe Niebezpieczny - + Paranoid (disables most optimizations) Paranoiczne (wyłącza większość optymalizacji) - + Debugging Debugowanie - + Dynarmic Dynamiczny - + NCE NCE - + Borderless Windowed W oknie (Bezramkowy) - + Exclusive Fullscreen Exclusive Fullscreen - + No Video Output Brak wyjścia wideo - + CPU Video Decoding Dekodowanie Wideo przez CPU - + GPU Video Decoding (Default) Dekodowanie Wideo przez GPU (Domyślne) - + 0.25X (180p/270p) [EXPERIMENTAL] 0,25x (180p/270p) [EKSPERYMENTALNE] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5x (360p/540p) [EKSPERYMENTALNE] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EKSPERYMENTALNE] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EKSPERYMENTALNE] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [Ekperymentalnie] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Najbliższy sąsiadujący - + Bilinear Bilinearny - + Bicubic Bikubiczny - + Gaussian Kulisty - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Obszar - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Żadna (wyłączony) - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Domyślne (16:9) - + Force 4:3 Wymuś 4:3 - + Force 21:9 Wymuś 21:9 - + Force 16:10 Wymuś 16:10 - + Stretch to Window Rozciągnij do Okna - + Automatic Automatyczne - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japoński (日本語) - + American English Angielski Amerykański - + French (français) Francuski (français) - + German (Deutsch) Niemiecki (Niemcy) - + Italian (italiano) Włoski (italiano) - + Spanish (español) Hiszpański (español) - + Chinese Chiński - + Korean (한국어) Koreański (한국어) - + Dutch (Nederlands) Duński (Holandia) - + Portuguese (português) Portugalski (português) - + Russian (Русский) Rosyjski (Русский) - + Taiwanese Tajwański - + British English Angielski Brytyjski - + Canadian French Fancuski (Kanada) - + Latin American Spanish Hiszpański (Latin American) - + Simplified Chinese Chiński (Uproszczony) - + Traditional Chinese (正體中文) Chiński tradycyjny (正體中文) - + Brazilian Portuguese (português do Brasil) Portugalski (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonia - + USA USA - + Europe Europa - + Australia Australia - + China Chiny - + Korea Korea - + Taiwan Tajwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Domyślne (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipt - + Eire Irlandia - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Izrael - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polska - + Portugal Portugalia - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turcja - + UCT UCT - + Universal Uniwersalny - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Domyślne) - + 6GB DRAM (Unsafe) 6GB DRAM (NIebezpieczne) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (NIebezpieczne) - + 12GB DRAM (Unsafe) 12GB DRAM (NIebezpieczne) - + Docked Zadokowany - + Handheld Przenośnie - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Zawsze pytaj (Domyślne) - + Only if game specifies not to stop Tylko jeśli gra określa, aby nie zatrzymywać - + Never ask Nie pytaj więcej - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Średnie (256) - + High (512) Wysokie (512) - - Disabled - Wyłączone - - - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index a180d00364..cdc3af2593 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -1163,994 +1163,983 @@ Ao ativar, ignora esses avisos e encerra diretamente a emulação. - Disable controller applet - Desabilitar applet de controle - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - Desativa forçadamente o uso do applet de controle em programas emulados. -Quando um programa tenta abrir o applet, ele é imediatamente fechado. - - - Check for updates Verificar atualizações - + Whether or not to check for updates upon startup. Define se deve verificar atualizações na inicialização. - + Enable Gamemode Habilitar Gamemode - + Force X11 as Graphics Backend Forçar X11 como backend gráfico - + Custom frontend Frontend customizado - + Real applet Applet real - + + + Disabled + Desativado + + + Never Nunca - + On Load Ao carregar - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor Qualidade) - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - - + + Auto Automático - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservador - + Aggressive Agressivo - + Vulkan Vulcano - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Shaders em Assembly, apenas NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, apenas AMD/Mesa) - + Null Nenhum - + Fast Rápido - - - + + + Accurate Preciso - - - + + + Default Padrão - + Unsafe (fast) Inseguro (rápido) - + Safe (stable) Seguro (estável) - + Immediate - + Balanced Balanceado - + Unsafe Inseguro - + Paranoid (disables most optimizations) Paranoia (desativa a maioria das otimizações) - + Debugging Depuração - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela sem bordas - + Exclusive Fullscreen Tela cheia exclusiva - + No Video Output Sem saída de vídeo - + CPU Video Decoding Decodificação de vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de vídeo pela GPU (Padrão) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Área - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à Janela - + Automatic Automático - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) Polonês (polska) - + Thai (แบบไทย) Tailandês (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egito - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irã - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polônia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Ancorado - + Handheld Portátil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - + Very Small (16 MB) Muito Pequeno (16 MB) - + Small (32 MB) Pequeno (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muito Grande (512 MB) - + Very Low (4 MB) Muito Baixo (4 MB) - + Low (8 MB) Baixo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Médio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muito Baixo (32) - + Low (64) Baixo (64) - + Normal (128) Normal (128) - + Medium (256) Médio (256) - + High (512) Alto (512) - - Disabled - Desativado - - - + ExtendedDynamicState 1 Estado Dinâmico Estendido 1 - + ExtendedDynamicState 2 Estado Dinâmico Estendido 2 - + ExtendedDynamicState 3 Estado Dinâmico Estendido 3 - + Tree View Visualização em Árvore - + Grid View Visualização em Grade diff --git a/dist/languages/pt_PT.ts b/dist/languages/pt_PT.ts index ae1b0929d6..7084f01e62 100644 --- a/dist/languages/pt_PT.ts +++ b/dist/languages/pt_PT.ts @@ -1116,993 +1116,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - Desabilitar miniaplicativo de controle - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Habilitar Gamemode - + Force X11 as Graphics Backend - + Custom frontend Frontend customizado - + Real applet Miniaplicativo real - + + + Disabled + + + + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor Q - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - - + + Auto Automático - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Conservador - + Aggressive Agressivo - + Vulkan Vulcano - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Nenhum (desativado) - + Fast - - - + + + Accurate Preciso - - - + + + Default Padrão - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Inseguro - + Paranoid (disables most optimizations) Paranoia (desativa a maioria das otimizações) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela sem bordas - + Exclusive Fullscreen Tela cheia exclusiva - + No Video Output Sem saída de vídeo - + CPU Video Decoding Decodificação de vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de vídeo pela GPU (Padrão) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à Janela - + Automatic Automático - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irão - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polónia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Ancorado - + Handheld Portátil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - - Disabled - - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index c1276416b1..248209833e 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -1166,994 +1166,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - Отключить апплет контроллера - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - Принудительно отключает использование апплета контроллера в эмулируемых программах. -При попытке открыть апплет он сразу закрывается. - - - Check for updates Проверять обновления - + Whether or not to check for updates upon startup. Проверять обновления при запуске. - + Enable Gamemode Включить режим игры - + Force X11 as Graphics Backend Принудительно использовать X11 как графический бэкенд - + Custom frontend Собственный интерфейс эмулятора - + Real applet Приложение из прошивки - + + + Disabled + Отключено + + + Never Никогда - + On Load При загрузке - + Always Всегда - + CPU CPU - + GPU GPU - + CPU Asynchronous Асинхронный CPU - + Uncompressed (Best quality) Без сжатия (наилучшее качество) - + BC1 (Low quality) BC1 (низкое качество) - + BC3 (Medium quality) BC3 (среднее качество) - - + + Auto Авто - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Консервативный - + Aggressive Агрессивный - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (ассемблерные шейдеры, только для NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (экспериментальный, только для AMD/Mesa) - + Null Null - + Fast Производительность - - - + + + Accurate Точность - - - + + + Default По умолчанию - + Unsafe (fast) Небезопасно (быстро) - + Safe (stable) Безопасно (стабильно) - + Immediate Мгновенный - + Balanced Баланс - + Unsafe Небезопасно - + Paranoid (disables most optimizations) Параноик (отключает большинство оптимизаций) - + Debugging Отладка - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Безрамочный режим - + Exclusive Fullscreen Эксклюзивный полноэкранный - + No Video Output Отсутствие видеовыхода - + CPU Video Decoding Декодирование видео на CPU - + GPU Video Decoding (Default) Декодирование видео на GPU (По умолчанию) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [Экспериментально] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [Экспериментально] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [Экспериментально] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [ЭКПЕРИМЕНТАЛЬНО] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [Экспериментально] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Ближайший сосед (Nearest Neighbor) - + Bilinear Билинейный - + Bicubic Бикубический - + Gaussian По Гауссу - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX™️ Super Resolution - + Area Область (Area) - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Никакой - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Стандартное (16:9) - + Force 4:3 Принудительно 4:3 - + Force 21:9 Принудительно 21:9 - + Force 16:10 Принудительно 16:10 - + Stretch to Window Растянуть до окна - + Automatic Автоматически - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Японский (日本語) - + American English Американский английский - + French (français) Французский (français) - + German (Deutsch) Немецкий (Deutsch) - + Italian (italiano) Итальянский (italiano) - + Spanish (español) Испанский (español) - + Chinese Китайский - + Korean (한국어) Корейский (한국어) - + Dutch (Nederlands) Голландский (Nederlands) - + Portuguese (português) Португальский (português) - + Russian (Русский) Русский - + Taiwanese Тайваньский - + British English Британский английский - + Canadian French Канадский французский - + Latin American Spanish Латиноамериканский испанский - + Simplified Chinese Упрощённый китайский - + Traditional Chinese (正體中文) Традиционный китайский (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильский португальский (português do Brasil) - + Polish (polska) Польский (polska) - + Thai (แบบไทย) Тайский (แบบไทย) - - + + Japan Япония - + USA США - + Europe Европа - + Australia Австралия - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Авто (%1) - + Default (%1) Default time zone По умолчанию (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Египет - + Eire Эйре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Эйре - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвич - + Hongkong Гонконг - + HST HST - + Iceland Исландия - + Iran Иран - + Israel Израиль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Ливия - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польша - + Portugal Португалия - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сингапур - + Turkey Турция - + UCT UCT - + Universal Универсальный - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулу - + Mono Моно - + Stereo Стерео - + Surround Объемный звук - + 4GB DRAM (Default) 4 ГБ ОЗУ (По умолчанию) - + 6GB DRAM (Unsafe) 6 ГБ ОЗУ (Небезопасно) - + 8GB DRAM 8 ГБ ОЗУ - + 10GB DRAM (Unsafe) 10 ГБ ОЗУ (Небезопасно) - + 12GB DRAM (Unsafe) 12 ГБ ОЗУ (Небезопасно) - + Docked В док-станции - + Handheld Портативный - - + + Normal Нормальная - - + + Boost Ускоренная - - + + Overclock Разгон - + Always ask (Default) Всегда спрашивать (По умолчанию) - + Only if game specifies not to stop Только если игра указывает не останавливать - + Never ask Никогда не спрашивать - + Very Small (16 MB) Очень маленький (16 МБ) - + Small (32 MB) Маленький (32 МБ) - + Normal (128 MB) Нормальный (128 МБ) - + Large (256 MB) Большой (256 МБ) - + Very Large (512 MB) Очень большой (512 МБ) - + Very Low (4 MB) Очень низкий (4 МБ) - + Low (8 MB) Низкий (8 МБ) - + Normal (16 MB) Нормальный (16 МБ) - + Medium (32 MB) Средний (32 МБ) - + High (64 MB) Высокий (64 МБ) - + Very Low (32) Очень низкий (32) - + Low (64) Низкий (64) - + Normal (128) Нормальный (128) - + Medium (256) Средний (256) - + High (512) Высокий (512) - - Disabled - Отключено - - - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View Древовидный - + Grid View Сетчатый diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index b5cfbaa063..8662c56414 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -835,7 +835,11 @@ Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. Accurate further improves compatibility at the cost of some performance. Default follows the GPU Mode setting. - + Styr synkroniseringsbeteendet för GPU-staket. +Omedelbar är det snabbaste alternativet, men kan orsaka vissa problem. +Balanserad ger bättre kompatibilitet och kan lösa problem i vissa spel. +Exakt förbättrar kompatibiliteten ytterligare, men på bekostnad av viss prestanda. +Standard följer inställningen för GPU-läge. @@ -1173,994 +1177,983 @@ Om du aktiverar den hoppar du över sådana uppmaningar och avslutar emuleringen - Disable controller applet - Inaktivera kontroller-appleten - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - Inaktiverar med tvång användningen av kontrollerappletten i emulerade program. -När ett program försöker öppna kontrollerappletten stängs den omedelbart. - - - Check for updates Leta efter uppdateringar - + Whether or not to check for updates upon startup. Om uppdateringar ska sökas vid start eller inte. - + Enable Gamemode Aktivera Gamemode - + Force X11 as Graphics Backend Tvinga X11 som grafikbackend - + Custom frontend Anpassad frontend - + Real applet Verklig applet - + + + Disabled + Inaktiverad + + + Never Aldrig - + On Load Vid inläsning - + Always Alltid - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU asynkron - + Uncompressed (Best quality) Okomprimerad (bästa kvalitet) - + BC1 (Low quality) BC1 (låg kvalitet) - + BC3 (Medium quality) BC3 (medelhög kvalitet) - - + + Auto Auto - + 30 FPS 30 bilder/s - + 60 FPS 60 bilder/s - + 90 FPS 90 bilder/s - + 120 FPS 120 bilder/s - + Conservative Konservativ - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembly Shaders, endast NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimentell, endast AMD/Mesa) - + Null Null - + Fast Snabb - - - + + + Accurate Exakt - - - + + + Default Standard - + Unsafe (fast) Osäker (snabb) - + Safe (stable) Säker (stabil) - + Immediate Omedelbar - + Balanced Balanserad - + Unsafe Inte säker - + Paranoid (disables most optimizations) Paranoid (inaktiverar de flesta optimeringar) - + Debugging Felsökning - + Dynarmic Dynarmisk - + NCE NCE - + Borderless Windowed Ramlöst fönsterläge - + Exclusive Fullscreen Exklusiv helskärm - + No Video Output Ingen videoutgång - + CPU Video Decoding CPU-videoavkodning - + GPU Video Decoding (Default) GPU videoavkodning (standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTELL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTELL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Närmsta granne - + Bilinear Bilinjär - + Bicubic Bikubisk - + Gaussian Gaussisk - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Område - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tvinga 4:3 - + Force 21:9 Tvinga 21:9 - + Force 16:10 Tvinga 16:10 - + Stretch to Window Sträck ut till fönster - + Automatic Automatiskt - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japanska (日本語) - + American English Amerikansk engelska - + French (français) Franska (français) - + German (Deutsch) Tyska (Deutsch) - + Italian (italiano) Italienska (italiano) - + Spanish (español) Spanska (español) - + Chinese Kinesiska - + Korean (한국어) Koreanska (한국어) - + Dutch (Nederlands) Nederländska (Nederlands) - + Portuguese (português) Portugisiska (português) - + Russian (Русский) Ryska (Русский) - + Taiwanese Taiwanesiska - + British English Brittisk engelska - + Canadian French Kanadensisk franska - + Latin American Spanish Latinamerikansk spanska - + Simplified Chinese Förenklad kinesiska - + Traditional Chinese (正體中文) Traditionell kinesiska (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisiska (português do Brasil) - + Polish (polska) Polska (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egypten - + Eire Irland - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irland - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkiet - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET VÅT - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (osäker) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (osäker) - + 12GB DRAM (Unsafe) 12 GB DRAM (osäker) - + Docked Dockad - + Handheld Handhållen - - + + Normal Normal - - + + Boost Förstärk - - + + Overclock Överklocka - + Always ask (Default) Fråga alltid (standard) - + Only if game specifies not to stop Endast om spelet anger att det inte ska stoppas - + Never ask Fråga aldrig - + Very Small (16 MB) Mycket liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Mycket stor (512 MB) - + Very Low (4 MB) Mycket låg (4 MB) - + Low (8 MB) Låg (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medium (32 MB) - + High (64 MB) Hög (64 MB) - + Very Low (32) Mycket låg (32) - + Low (64) Låg (64) - + Normal (128) Normal (128) - + Medium (256) Medium (256) - + High (512) Hög (512) - - Disabled - Inaktiverad - - - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View Trädvy - + Grid View Rutnätsvy diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index 7bb09e316e..95f0e25c31 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -1125,993 +1125,983 @@ Etkinleştirildiğinde, bu tür istekleri/istemleri atlar ve emülasyonu doğrud - Disable controller applet - Kontrolcü aplikasyonunu devre dışı bırak - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - Emüle edilen programlarda kontrolcü aplikasyonunun kullanımını zorla devre dışı bırakır. Bir program kontrolcü aplikasyonunu açmaya çalıştığında, aplikasyon anında kapatılır. - - - Check for updates Güncellemeleri Kontrol Et - + Whether or not to check for updates upon startup. Başlangıçta güncellemelerin kontrol edilip edilmeyeceği. - + Enable Gamemode Oyun Modunu/Gamemode Etkinleştir - + Force X11 as Graphics Backend Grafik arka ucu olarak X11'i zorla - + Custom frontend Özel ön yüz - + Real applet Gerçek aplikasyon - + + + Disabled + Devre Dışı + + + Never Asla - + On Load Yüklemede - + Always Her zaman - + CPU CPU - + GPU GPU - + CPU Asynchronous Asenkron CPU - + Uncompressed (Best quality) Sıkıştırılmamış (En iyi kalite) - + BC1 (Low quality) BC1 (Düşük kalite) - + BC3 (Medium quality) BC3 (Orta kalite) - - + + Auto Otomatik - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Muhafazakar - + Aggressive Agresif - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Boş - + Fast Hızlı - - - + + + Accurate Doğru - - - + + + Default Varsayılan - + Unsafe (fast) Güvenli Değil (hızlı) - + Safe (stable) Güvenli (Stabil) - + Immediate - + Balanced Dengeli - + Unsafe Güvensiz - + Paranoid (disables most optimizations) Paranoya (çoğu optimizasyonu kapatır) - + Debugging Hata ayıklama - + Dynarmic Dinamik - + NCE NCE - + Borderless Windowed Kenarlıksız Tam Ekran - + Exclusive Fullscreen Ayrılmış Tam Ekran - + No Video Output Video Çıkışı Yok - + CPU Video Decoding CPU Video Decoding - + GPU Video Decoding (Default) GPU Video Decoding (Varsayılan) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [DENEYSEL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [DENEYSEL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [DENEYSEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [DENEYSEL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [DENEYSEL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor En Yakın Komşu Algoritması - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gausyen - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Süper Çözünürlük - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Yok - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Varsayılan (16:9) - + Force 4:3 4:3'e Zorla - + Force 21:9 21:9'a Zorla - + Force 16:10 16:10'a Zorla - + Stretch to Window Ekrana Sığdır - + Automatic Otomatik - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonca (日本語) - + American English Amerikan İngilizcesi - + French (français) Fransızca (français) - + German (Deutsch) Almanca (Deutsch) - + Italian (italiano) İtalyanca (italiano) - + Spanish (español) İspanyolca (español) - + Chinese Çince - + Korean (한국어) Korece (한국어) - + Dutch (Nederlands) Flemenkçe (Nederlands) - + Portuguese (português) Portekizce (português) - + Russian (Русский) Rusça (Русский) - + Taiwanese Tayvanca - + British English İngiliz İngilizcesi - + Canadian French Kanada Fransızcası - + Latin American Spanish Latin Amerika İspanyolcası - + Simplified Chinese Basitleştirilmiş Çince - + Traditional Chinese (正體中文) Geleneksel Çince (正體中文) - + Brazilian Portuguese (português do Brasil) Brezilya Portekizcesi (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonya - + USA ABD - + Europe Avrupa - + Australia Avustralya - + China Çin - + Korea Kore - + Taiwan Tayvan - + Auto (%1) Auto select time zone Otomatik (%1) - + Default (%1) Default time zone Varsayılan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Küba - + EET EET - + Egypt Mısır - + Eire İrlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-İrlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 MT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland İzlanda - + Iran İran - + Israel İsrail - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navaho - + NZ Yeni Zelanda - + NZ-CHAT Chatham Adaları - + Poland Polonya - + Portugal Portekiz - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkiye - + UCT UCT - + Universal Evrensel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Varsayılan) - + 6GB DRAM (Unsafe) 6GB DRAM (Güvenli Değil) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Güvenli Değil) - + 12GB DRAM (Unsafe) 12GB DRAM (Güvenli Değil) - + Docked Dock Modu Aktif - + Handheld Taşınabilir - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Her zaman sor (Varsayılan) - + Only if game specifies not to stop Sadece oyun durdurulmamasını belirtirse - + Never ask Asla sorma - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Orta (256) - + High (512) Yüksek (512) - - Disabled - Devre Dışı - - - + ExtendedDynamicState 1 Genişletilmiş Dinamik Durum 1 - + ExtendedDynamicState 2 Genişletilmiş Dinamik Durum 2 - + ExtendedDynamicState 3 Genişletilmiş Dinamik Durum 3 - + Tree View - + Grid View diff --git a/dist/languages/uk.ts b/dist/languages/uk.ts index 4b7e94bfe9..2fdce360cc 100644 --- a/dist/languages/uk.ts +++ b/dist/languages/uk.ts @@ -429,13 +429,14 @@ Can help reduce stuttering at lower framerates. CPU Clocks - + Тактові частоти ЦП Raises the clock the emulated CPU reports, which removes some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. - + Збільшує тактову частоту, про яку повідомляє емульований ЦП, завдяки чому прибираються деякі обмеження частоти кадрів. +На слабших ЦП це може спричинити зменшення продуктивності, а деякі ігри можуть неправильно відтворюватися. @@ -595,12 +596,12 @@ FXAA може створювати стабільніше зображення Enable post-processing effects - + Увімкнути ефекти постобробки Applies post-processing effects to the final image. - + Застосовує ефекти постобробки до фінального зображення. @@ -1168,994 +1169,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - Вимкнути аплет контролера - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - Примусово вимикає використання в емульованих програмах аплета контролера. -Якщо програма спробує відкрити аплет контролера, він одразу закриється. - - - Check for updates Перевіряти оновлення - + Whether or not to check for updates upon startup. Чи перевіряти оновлення при запуску. - + Enable Gamemode Увімкнути ігровий режим - + Force X11 as Graphics Backend Примусово використовувати X11 як графічний бекенд - + Custom frontend Користувацький фронтенд - + Real applet Справжній аплет - + + + Disabled + Вимкнено + + + Never Ніколи - + On Load При завантаженні - + Always Завжди - + CPU ЦП - + GPU ГП - + CPU Asynchronous Асинхронно ЦП - + Uncompressed (Best quality) Без стиснення (Найкраща якість) - + BC1 (Low quality) ВС1 (Низька якість) - + BC3 (Medium quality) ВС3 (Середня якість) - - + + Auto Автоматично - + 30 FPS 30 к/с - + 60 FPS 60 к/с - + 90 FPS 90 к/с - + 120 FPS 120 к/с - + Conservative Заощадження - + Aggressive Агресивно - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (асемблерні шейдери, лише NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (експериментально, лише AMD/Mesa) - + Null Нічого - + Fast Швидко - - - + + + Accurate Точно - - - + + + Default Стандартно - + Unsafe (fast) Небезпечно (швидко) - + Safe (stable) Безпечно (стабільно) - + Immediate - + Balanced Збалансовано - + Unsafe Небезпечно - + Paranoid (disables most optimizations) Параноїк (вимикає більшість оптимізацій) - + Debugging Зневадження - + Dynarmic Динамічно - + NCE NCE - + Borderless Windowed Безрамкове вікно - + Exclusive Fullscreen Ексклюзивний повноекранний - + No Video Output Виведення відео відсутнє - + CPU Video Decoding Декодування відео на ЦП - + GPU Video Decoding (Default) Декодування відео на ГП (стандатно) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [ЕКСПЕРИМЕНТАЛЬНО] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [ЕКСПЕРИМЕНТАЛЬНО] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ЕКСПЕРИМЕНТАЛЬНО] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [ЕКСПЕРИМЕНТАЛЬНО] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [ЕКСПЕРИМЕНТАЛЬНО] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Найближчий сусід - + Bilinear Білінійний - + Bicubic Бікубічний - + Gaussian Ґаусса - + Lanczos Ланцоша - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Області - + MMPX MMPX - + Zero-Tangent Нульовий тангенс - + B-Spline B-Spline - + Mitchell Мітчелла - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Немає - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Стандартно (16:9) - + Force 4:3 Примусово 4:3 - + Force 21:9 Примусово 21:9 - + Force 16:10 Примусово 16:10 - + Stretch to Window Розтягнути до вікна - + Automatic Автоматично - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Японська (日本語) - + American English Американська англійська - + French (français) Французька (français) - + German (Deutsch) Німецька (Deutsch) - + Italian (italiano) Італійська (italiano) - + Spanish (español) Іспанська (español) - + Chinese Китайська - + Korean (한국어) Корейська (한국어) - + Dutch (Nederlands) Нідерландська (Nederlands) - + Portuguese (português) Португальська (português) - + Russian (Русский) Російська (Русский) - + Taiwanese Тайванська - + British English Британська англійська - + Canadian French Канадська французька - + Latin American Spanish Латиноамериканська іспанська - + Simplified Chinese Спрощена китайська - + Traditional Chinese (正體中文) Традиційна китайська (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильська португальська (português do Brasil) - + Polish (polska) Польська (polska) - + Thai (แบบไทย) Тайська (แบบไทย) - - + + Japan Японія - + USA США - + Europe Європа - + Australia Австралія - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Автоматично (%1) - + Default (%1) Default time zone Стандартно (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Єгипет - + Eire Ейре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвіч - + Hongkong Гонконг - + HST HST - + Iceland Ісландія - + Iran Іран - + Israel Ізраїль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Лівія - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польща - + Portugal Португалія - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сінгапур - + Turkey Туреччина - + UCT UCT - + Universal Універсальний - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулу - + Mono Моно - + Stereo Стерео - + Surround Об’ємний - + 4GB DRAM (Default) 4GB DRAM (стандартно) - + 6GB DRAM (Unsafe) 6GB DRAM (небезпечно) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (небезпечно) - + 12GB DRAM (Unsafe) 12GB DRAM (небезпечно) - + Docked У докстанції - + Handheld Портативний - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Завжди запитувати (стандартно) - + Only if game specifies not to stop Лише якщо гра вказує не зупиняти - + Never ask Ніколи не запитувати - + Very Small (16 MB) Дуже малий (16 МБ) - + Small (32 MB) Малий (32 МБ) - + Normal (128 MB) Нормальний (128 МБ) - + Large (256 MB) Великий (256 МБ) - + Very Large (512 MB) Дуже великий (512 МБ) - + Very Low (4 MB) Дуже низький (4 МБ) - + Low (8 MB) Низький (8 МБ) - + Normal (16 MB) Нормальний (16 МБ) - + Medium (32 MB) Середній (32 МБ) - + High (64 MB) Високий (64 МБ) - + Very Low (32) Дуже низький (32) - + Low (64) Низький (64) - + Normal (128) Нормальний (128) - + Medium (256) Середньо (256) - + High (512) Високо (512) - - Disabled - Вимкнено - - - + ExtendedDynamicState 1 Розширений динамічний стан 1 - + ExtendedDynamicState 2 Розширений динамічний стан 2 - + ExtendedDynamicState 3 Розширений динамічний стан 3 - + Tree View Дерево вибору - + Grid View Таблиця diff --git a/dist/languages/vi.ts b/dist/languages/vi.ts index a2042eb499..f1257a08f5 100644 --- a/dist/languages/vi.ts +++ b/dist/languages/vi.ts @@ -1108,993 +1108,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - Vô hiệu hoá applet tay cầm - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + + + Disabled + + + + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) Không nén (Chất lượng tốt nhất) - + BC1 (Low quality) BC1 (Chất lượng thấp) - + BC3 (Medium quality) BC3 (Chất lượng trung bình) - - + + Auto Tự động - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Chính xác - - - + + + Default Mặc định - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Không an toàn - + Paranoid (disables most optimizations) Paranoid (vô hiệu hoá hầu hết sự tối ưu) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Cửa sổ không viền - + Exclusive Fullscreen Toàn màn hình - + No Video Output Không có đầu ra video - + CPU Video Decoding Giải mã video bằng CPU - + GPU Video Decoding (Default) Giải mã video bằng GPU (Mặc định) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [THỬ NGHIỆM] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [THỬ NGHIỆM] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Không có - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Mặc định (16:9) - + Force 4:3 Dùng 4:3 - + Force 21:9 Dùng 21:9 - + Force 16:10 Dùng 16:10 - + Stretch to Window Mở rộng đến cửa sổ - + Automatic Tự động - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Español) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Nederlands) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh Anh - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Tây Ban Nha Mỹ Latinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha Brasil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - - Disabled - - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index 6acff0c2da..64edf2850d 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -1108,993 +1108,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - Vô hiệu hoá applet tay cầm - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - + + + Disabled + + + + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) Không nén (Chất lượng tốt nhất) - + BC1 (Low quality) BC1 (Chất lượng thấp) - + BC3 (Medium quality) BC3 (Chất lượng trung bình) - - + + Auto Tự động - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Tuyệt đối - - - + + + Default Mặc định - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Tương đối - + Paranoid (disables most optimizations) Paranoid (vô hiệu hoá hầu hết sự tối ưu) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Cửa sổ không viền - + Exclusive Fullscreen Toàn màn hình - + No Video Output Không Video Đầu Ra - + CPU Video Decoding Giải mã video bằng CPU - + GPU Video Decoding (Default) Giải mã video bằng GPU (Mặc định) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [THỬ NGHIỆM] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [THỬ NGHIỆM] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian ScaleForce - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Trống - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Mặc định (16:9) - + Force 4:3 Dùng 4:3 - + Force 21:9 Dùng 21:9 - + Force 16:10 Dung 16:10 - + Stretch to Window Kéo dãn đến cửa sổ phần mềm - + Automatic Tự động - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Spanish) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Dutch) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh UK (British English) - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Mỹ La-tinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha của người Brazil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Châu Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Chế độ cắm TV - + Handheld Cầm tay - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - - Disabled - - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index 46c8fd8014..e6d5890370 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -1170,994 +1170,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - 禁用控制器小程序 - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - 强制禁止在模拟程序中使用控制器小程序。 - 当程序尝试打开控制器小程序时,它会立即被关闭。 - - - Check for updates 检查更新 - + Whether or not to check for updates upon startup. 在启动时是否检查更新。 - + Enable Gamemode 启用游戏模式 - + Force X11 as Graphics Backend 强制使用 X11 作为图形后端 - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - + + + Disabled + 禁用 + + + Never 永不 - + On Load 加载时 - + Always 总是 - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不压缩 (最高质量) - + BC1 (Low quality) BC1 (低质量) - + BC3 (Medium quality) BC3 (中等质量) - - + + Auto 自动 - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative 保守模式 - + Aggressive 激进模式 - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (汇编着色器,仅限 NVIDIA 显卡) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (实验性,仅限 AMD/Mesa) - + Null 无 - + Fast 高速 - - - + + + Accurate 高精度 - - - + + + Default 系统默认 - + Unsafe (fast) 不安全(快速) - + Safe (stable) 安全(稳定) - + Immediate 即时 - + Balanced 平衡 - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Debugging 调试 - + Dynarmic 动态编译 - + NCE 本机代码执行 - + Borderless Windowed 无边框窗口 - + Exclusive Fullscreen 独占全屏 - + No Video Output 无视频输出 - + CPU Video Decoding CPU 视频解码 - + GPU Video Decoding (Default) GPU 视频解码 (默认) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [实验性] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [实验性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [实验性] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [实验性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 近邻取样 - + Bilinear 双线性过滤 - + Bicubic 双三线过滤 - + Gaussian 高斯模糊 - + Lanczos Lanczos - + ScaleForce 强制缩放 - + AMD FidelityFX Super Resolution AMD FidelityFX 超级分辨率 - + Area 区域 - + MMPX MMPX - + Zero-Tangent 零切线 - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution 骁龙游戏超级分辨率 - + Snapdragon Game Super Resolution EdgeDir 骁龙游戏超级分辨率 EdgeDir - + None 无 - + FXAA 快速近似抗锯齿 - + SMAA 子像素形态学抗锯齿 - + Default (16:9) 默认 (16:9) - + Force 4:3 强制 4:3 - + Force 21:9 强制 21:9 - + Force 16:10 强制 16:10 - + Stretch to Window 拉伸窗口 - + Automatic 自动 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日语 (日本語) - + American English 美式英语 - + French (français) 法语 (français) - + German (Deutsch) 德语 (Deutsch) - + Italian (italiano) 意大利语 (italiano) - + Spanish (español) 西班牙语 (español) - + Chinese 中文 - + Korean (한국어) 韩语 (한국어) - + Dutch (Nederlands) 荷兰语 (Nederlands) - + Portuguese (português) 葡萄牙语 (português) - + Russian (Русский) 俄语 (Русский) - + Taiwanese 台湾中文 - + British English 英式英语 - + Canadian French 加拿大法语 - + Latin American Spanish 拉美西班牙语 - + Simplified Chinese 简体中文 - + Traditional Chinese (正體中文) 繁体中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙语 (português do Brasil) - + Polish (polska) 波兰语(波兰语) - + Thai (แบบไทย) 泰语 - - + + Japan 日本 - + USA 美国 - + Europe 欧洲 - + Australia 澳大利亚 - + China 中国 - + Korea 韩国 - + Taiwan 台湾地区 - + Auto (%1) Auto select time zone 自动 (%1) - + Default (%1) Default time zone 默认 (%1) - + CET 欧洲中部时间 - + CST6CDT 古巴标准时间&古巴夏令时 - + Cuba 古巴 - + EET 东欧时间 - + Egypt 埃及 - + Eire 爱尔兰 - + EST 东部标准时间 - + EST5EDT 东部标准时间&东部夏令时 - + GB 英国 - + GB-Eire 英国-爱尔兰时间 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 美国夏威夷时间 - + Iceland 冰岛 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙买加 - + Kwajalein 夸贾林环礁 - + Libya 利比亚 - + MET 中欧时间 - + MST 山区标准时间 (北美) - + MST7MDT 山区标准时间&山区夏令时 (北美) - + Navajo 纳瓦霍 - + NZ 新西兰时间 - + NZ-CHAT NZ-CHAT - + Poland 波兰 - + Portugal 葡萄牙 - + PRC 中国标准时间 - + PST8PDT 太平洋标准时间&太平洋夏令时 - + ROC 台湾时间 - + ROK 韩国时间 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界时间 - + UTC 协调世界时 - + W-SU 欧洲-莫斯科时间 - + WET 西欧时间 - + Zulu 祖鲁 - + Mono 单声道 - + Stereo 立体声 - + Surround 环绕声 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (不安全) - + 12GB DRAM (Unsafe) 12GB DRAM (不安全) - + Docked 主机模式 - + Handheld 掌机模式 - - + + Normal 正常 - - + + Boost 升频 - - + + Overclock 超频 - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - + Very Small (16 MB) 很小 (16 MB) - + Small (32 MB) 较小 (32 MB) - + Normal (128 MB) 正常 (128 MB) - + Large (256 MB) 较大 (256 MB) - + Very Large (512 MB) 很大 (512 MB) - + Very Low (4 MB) 很低 (4 MB) - + Low (8 MB) 低 (8 MB) - + Normal (16 MB) 正常 (16 MB) - + Medium (32 MB) 中 (32 MB) - + High (64 MB) 高 (64 MB) - + Very Low (32) 很低 (32) - + Low (64) 低 (64) - + Normal (128) 正常 (128) - + Medium (256) 中(256) - + High (512) 高(512) - - Disabled - 禁用 - - - + ExtendedDynamicState 1 扩展动态状态 1 - + ExtendedDynamicState 2 扩展动态状态 2 - + ExtendedDynamicState 3 扩展动态状态 3 - + Tree View 树景视图 - + Grid View 网格视图 diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index 678757a328..499262847d 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -1135,993 +1135,983 @@ Enabling it bypasses such prompts and directly exits the emulation. - Disable controller applet - 禁用控制器程序 - - - - Forcibly disables the use of the controller applet in emulated programs. -When a program attempts to open the controller applet, it is immediately closed. - - - - Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode 启用游戏模式 - + Force X11 as Graphics Backend - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - + + + Disabled + + + + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不壓縮 (最高品質) - + BC1 (Low quality) BC1 (低品質) - + BC3 (Medium quality) BC3 (中品質) - - + + Auto 自動 - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative 保守模式(节省 VRAM) - + Aggressive 激进模式 - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null 無 - + Fast - - - + + + Accurate 高精度 - - - + + + Default 預設 - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed 無邊框視窗 - + Exclusive Fullscreen 全螢幕獨占 - + No Video Output 無視訊輸出 - + CPU Video Decoding CPU 視訊解碼 - + GPU Video Decoding (Default) GPU 視訊解碼(預設) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [實驗性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [實驗性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 最近鄰 - + Bilinear 雙線性 - + Bicubic 雙立方 - + Gaussian 高斯 - + Lanczos - + ScaleForce 強制縮放 - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None 無 - + FXAA FXAA - + SMAA SMAA - + Default (16:9) 預設 (16:9) - + Force 4:3 強制 4:3 - + Force 21:9 強制 21:9 - + Force 16:10 強制 16:10 - + Stretch to Window 延伸視窗 - + Automatic 自動 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日文 (日本語) - + American English 美式英语 - + French (français) 法文 (français) - + German (Deutsch) 德文 (Deutsch) - + Italian (italiano) 義大利文 (italiano) - + Spanish (español) 西班牙文 (español) - + Chinese 中文 - + Korean (한국어) 韓文 (한국어) - + Dutch (Nederlands) 荷蘭文 (Nederlands) - + Portuguese (português) 葡萄牙文 (português) - + Russian (Русский) 俄文 (Русский) - + Taiwanese 台灣中文 - + British English 英式英文 - + Canadian French 加拿大法文 - + Latin American Spanish 拉丁美洲西班牙文 - + Simplified Chinese 簡體中文 - + Traditional Chinese (正體中文) 正體中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA 美國 - + Europe 歐洲 - + Australia 澳洲 - + China 中國 - + Korea 南韓 - + Taiwan 台灣 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 預設 (%1) - + CET 中歐 - + CST6CDT CST6CDT - + Cuba 古巴 - + EET EET - + Egypt 埃及 - + Eire 愛爾蘭 - + EST 北美東部 - + EST5EDT EST5EDT - + GB GB - + GB-Eire 英國-愛爾蘭 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 夏威夷 - + Iceland 冰島 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙買加 - + Kwajalein 瓜加林環礁 - + Libya 利比亞 - + MET 中歐 - + MST 北美山區 - + MST7MDT MST7MDT - + Navajo 納瓦霍 - + NZ 紐西蘭 - + NZ-CHAT 紐西蘭-查塔姆群島 - + Poland 波蘭 - + Portugal 葡萄牙 - + PRC 中國 - + PST8PDT 太平洋 - + ROC 臺灣 - + ROK 韓國 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界 - + UTC UTC - + W-SU 莫斯科 - + WET 西歐 - + Zulu 協調世界時 - + Mono 單聲道 - + Stereo 立體聲 - + Surround 環繞音效 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked TV - + Handheld 掌機模式 - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - - Disabled - - - - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index fe8e1e0555..1082a117ab 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -28,7 +28,7 @@ السلوك إخفاء الطبقة تلقائيًا إخفاء طبقة ذراع التحكم باللمس تلقائيًا بعد مرور الوقت المحدد من عدم النشاط. - تمكين إخفاء الطبقة تلقائيًا + تفعيل إخفاء الطبقة تلقائيًا إخفاء الطبقة عند إدخال ذراع التحكم إخفاء تلقائي لطبقة عناصر التحكم باللمس عند استخدام ذراع تحكم فعلية. تظهر الطبقة مرة أخرى عند فصل ذراع التحكم. عكس أزرار التأكيد/الرجوع في وحدة التحكم @@ -51,7 +51,7 @@ التخصيص الرؤية طبقة الأداء - تمكين طبقة إحصائيات الأداء + تفعيل طبقة إحصائيات الأداء ضبط المعلومات التي يتم عرضها في طبقة إحصائيات الأداء عرض معدل الإطارات عرض معدل الإطارات الحالي @@ -81,7 +81,7 @@ عرض طبقة معلومات الجهاز - تمكين طبقة الجهاز + تفعيل طبقة الجهاز طبقة الجهاز ضبط المعلومات التي يتم عرضها في طبقة الجهاز @@ -98,8 +98,8 @@ مزامنة سرعة النواة قم بمزامنة سرعة النواة مع النسبة المئوية للسرعة القصوى لتحسين الأداء دون تغيير السرعة الفعلية للعبة. - تمكين محاكاة MMU المضيف - يعمل هذا التحسين على تسريع وصول الذاكرة بواسطة البرنامج الضيف. يؤدي تمكينه إلى إجراء عمليات قراءة/كتابة ذاكرة الضيف مباشرة في الذاكرة والاستفادة من MMU المضيف. يؤدي تعطيل هذا إلى إجبار جميع عمليات الوصول إلى الذاكرة على استخدام محاكاة MMU البرمجية. + تفعيل محاكاة MMU المضيف + يعمل هذا التحسين على تسريع وصول الذاكرة بواسطة البرنامج الضيف. يؤدي تفعيله إلى إجراء عمليات قراءة/كتابة ذاكرة الضيف مباشرة في الذاكرة والاستفادة من MMU المضيف. يؤدي تعطيل هذا إلى إجبار جميع عمليات الوصول إلى الذاكرة على استخدام محاكاة MMU البرمجية. مقابض تصحيح الأخطاء للإستخدام في التطوير فقط. 0 إلى 65535 @@ -342,7 +342,7 @@ دقة مسار التدفق البصري، كجزء من الناتج. ويُعد خفض هذه القيمة أرخص طريقة لاستعادة الأداء. توليد الإطار غير متاح يفتقر برنامج تشغيل وحدة معالجة الرسومات هذا إلى نموذج ذاكرة Vulkan أو دعم الدقة النصفية (float16) التي تتطلبها برامج التظليل الخاصة بـ «Lossless Scaling». - اختياري. قم بتوفير ملف Lossless.dll الخاص بك لتمكين إنشاء الإطارات لاحقًا + اختياري. قم بتوفير ملف Lossless.dll الخاص بك لتفعيل إنشاء الإطارات لاحقًا تثبيت ملف Lossless.dll يتطلب إنشاء الإطارات أن تكون لديك نسخة قانونية خاصة بك من ملف Lossless.dll المأخوذ من برنامج Lossless Scaling اختر نسخة أخرى من ملف Lossless.dll @@ -350,7 +350,7 @@ مدعوم غير مدعوم (لا يتوفر نموذج ذاكرة Vulkan أو float16) Lossless Scaling - قم بتوفير نسختك الخاصة من ملف Lossless.dll لتمكين توليد الإطارات + قم بتوفير نسختك الخاصة من ملف Lossless.dll لتفعيل توليد الإطارات مثبت غير مثبت استبدل @@ -502,9 +502,9 @@ نسبة الحد الأقصى للسرعة يحدد النسبة المئوية للحد من سرعة المحاكاة. %100 هي السرعة الطبيعية. القيم الأعلى أو الأقل ستزيد أو تقلل من الحد الأقصى للسرعة. سرعة تيربو - عند تمكين وضع التيربو، سيتم تشغيل المحاكاة بهذه السرعة. + عند تفعيل وضع التيربو، سيتم تشغيل المحاكاة بهذه السرعة. سرعة بطيئة - عند تمكين الوضع البطيء، سيتم تشغيل المحاكاة بهذه السرعة. + عند تفعيل الوضع البطيء، سيتم تشغيل المحاكاة بهذه السرعة. خلفية وحدة المعالجة المركزية دقة وحدة المعالجة المركزية %1$s%2$s @@ -578,7 +578,7 @@ يمكن لهذه الحيلة أن تزيد من الأداء عن طريق نقل عملية العرض إلى خيط معالجة منفصل على حساب مشاكل الرسوميات. استخدم التنظيف التفاعلي يحسن دقة العرض في بعض الألعاب على حساب الأداء. - تمكين سجل التخزين المؤقت + تفعيل سجل التخزين المؤقت يُتيح هذا الخيار الوصول إلى حالات التخزين المؤقت السابقة. وقد يُحسّن جودة العرض وثبات الأداء في بعض الألعاب. مخازن الرؤوس المُحسّنة يُتيح ربطًا مُحسَّنًا لمخازن الرؤوس لتحسين الأداء. يتطلب برامج تشغيل Mesa 26.0+ Turnip/ برامج تشغيل QCOM. قد يتعطل على برامج تشغيل Turnip القديمة (25.3 وما دون). @@ -616,7 +616,7 @@ يتحكم هذا الخيار في عدد الميزات التي يمكن استخدامها في ExtendedDynamicState (EDS). كلما زادت القيمة، قلّ عدد عمليات تجميع خط الأنابيب بناءً على الحالة الديناميكية التي يدعمها برنامج التشغيل. معطل حالة ديناميكية لإدخال الرأس - يتيح تمكين هذه الميزة معالجة أكثر مرونة لمدخلات الرؤوس، مما قد يقلل من وقت تجميع خط الأنابيب في vertex/buffer. + يتيح تفعيل هذه الميزة معالجة أكثر مرونة لمدخلات الرؤوس، مما قد يقلل من وقت تجميع خط الأنابيب في vertex/buffer. تظليل العينة يسمح هذا الخيار بتنفيذ مُظلل الأجزاء لكل عينة في جزء متعدد العينات بدلاً من تنفيذه مرة واحدة لكل جزء. يُحسّن هذا من جودة الرسومات على حساب بعض الأداء. @@ -825,9 +825,9 @@ النظام وضع الإرساء، المنطقة، اللغة الرسومات - مستوى الدقة، الدقة، ذاكرة التخزين المؤقتة للتظليل + مستوى دقة المحاكاة، الدقة، ذاكرة التخزين المؤقتة للتظليل الإعدادات السريعة - تمكين الإعدادات السريعة + تفعيل الإعدادات السريعة السماح بالوصول إلى قائمة الإعدادات السريعة عن طريق التمرير و زر القائمة الصوت محرك الإخراج، مستوى الصوت @@ -1223,8 +1223,8 @@ وضع الطيران يمرر وضع الطيران إلى نظام تشغيل Switch - تمكين التطبيق الصغير للطبقة - تمكين التطبيق الصغير المدمج في Horizon. اضغط مع الاستمرار على زر الشاشة الرئيسية لمدة 1 ثانية لإظهاره. + تفعيل التطبيق الصغير للطبقة + تفعيل التطبيق الصغير المدمج في Horizon. اضغط مع الاستمرار على زر الشاشة الرئيسية لمدة 1 ثانية لإظهاره. إدارة ملف التعريف diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 044b7675de..55b126fd91 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -16,7 +16,7 @@ 範圍最大必須為%1$d 無效的範圍 - 使用個別設定中 + 使用個別遊戲設定中 顯示虛擬按鍵 @@ -67,7 +67,7 @@ 當著色器在編譯時顯示 顯示正在編譯的著色器數量 管線工作執行緒 - 設定用於建置 Vulkan 管線的 CPU 核心數量,設定的數值越大效能越好,但溫度也會上升更快 + 設定用於建置Vulkan管線的CPU核心數量,設定的數值越大效能越好,但溫度也會上升更快 疊加層位置 選擇疊加層在畫面上的顯示位置 左上 @@ -98,15 +98,15 @@ 同步核心速度 將核心速度與最大速度百分比同步,在不改變遊戲實際速度的情況下提高效能 - 啟用主機 MMU 模擬 - 此最佳化可加速客體程式的記憶體存取。啟用後,客體記憶體讀取/寫入將直接在記憶體中執行並利用主機的 MMU。停用此功能將強制所有記憶體存取使用軟體 MMU 模擬。 + 啟用主機MMU模擬 + 此最佳化可加速客體程式的記憶體存取。啟用後,客體記憶體讀取/寫入將直接在記憶體中執行並利用主機的MMU。停用此功能將強制所有記憶體存取使用軟體MMU模擬 偵錯開關 僅限開發用途 0到65535 NVDEC模擬 - 若在過場動畫中當機請切換成 CPU + 若在過場動畫中當機請切換成CPU 無 @@ -151,7 +151,7 @@ %1$s 離開 %1$s 被踢出 %1$s 被封鎖 - 位址已解封 + IP位址已解封 踢出成員 密碼 正在加入… @@ -173,7 +173,7 @@ 封鎖使用者 公開房間 未找到公開房間 - 需要輸入密碼 + 請輸入密碼 :%1$d/%2$d 遊戲 任意遊戲 @@ -189,7 +189,7 @@ 需要Web令牌,請前往進階設定 -> 系統 -> 網路 IP格式無效 必須介於4-20個字元之間,並且僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式) - 使用者名稱無效,請在系統→網路中檢查設定 + 使用者名稱無效,請在系統 -> 網路中檢查設定 必須為48個字元,且僅包含小寫字母a-z 埠號需為1-65535 取消 @@ -201,16 +201,16 @@ 歡迎! - 瞭解如何設定 Eden 並開始模擬。 + 瞭解如何設定 Eden 並開始模擬 開始使用 金鑰 - 使用下方的按鈕安裝您的 prod.keys 檔案。 + 使用下方的按鈕安裝您的 prod.keys 檔案 韌體 使用下方的按鈕安裝您的firmware.zip檔案 遊戲資料夾 使用下方的按鈕選擇您的遊戲資料夾。 完成 - 您已準備就緒。\n盡情遊玩您的遊戲! + 您已準備就緒\n盡情遊玩您的遊戲! 下一步 上一步 新增遊戲 @@ -237,7 +237,7 @@ 更新安裝失敗:%1$s 搜尋 設定 - 找不到檔案,或者尚未選取遊戲目錄 + 找不到遊戲檔案,或者尚未選取遊戲目錄 管理遊戲資料夾 允許 Eden 尋找您的遊戲檔案 跳過選擇遊戲資料夾? @@ -287,9 +287,9 @@ 跳過 取消 安裝 Amiibo 金鑰 - 若要在遊戲中使用 Amiibo 得先安裝 + 需要先安裝才能在遊戲中使用Amiibo GPU驅動程式下載器 - GPU 驅動程式管理員 + GPU驅動程式管理員 安裝替代驅動程式以取得潛在的更佳效能或準確度 後製處理效果 在渲染完成後套用 ReShade FX 效果 @@ -299,7 +299,7 @@ 開啟清單 收起清單 移除效果 - 濾鏡已啟用。請在開啟遊戲前於 後製處理效果 中調整 + 濾鏡已啟用。請在開啟遊戲前於\"後製處理效果\"中調整 數值已變更,與原始濾鏡設定不同 濾鏡 新增濾鏡 @@ -312,93 +312,102 @@ 找不到設定檔。請將濾鏡效果的 .fx 檔案放置於此資料夾: 影格生成 調整此遊戲的影格生成設定 - 使用 Lossless Scaling 在已渲染的影格之間插入補間影格。啟用此功能時,會強制採用 FIFO 垂直同步 + 使用Lossless Scaling在已渲染的影格之間插入補間影格。啟用此功能時,會強制採用FIFO垂直同步 影格倍率 - 設定在每個已渲染的影格中要顯示的影格數。數值越高所需的 GPU 運算時間也會按比例增加。若要求的影格數超過裝置顯示器能呈現的數量將會降低模擬速度 + 設定在每個已渲染的影格中要顯示的影格數,數值越高所需的GPU運算時間也會按比例增加。若要求的影格數超過裝置顯示器能呈現的數量將會降低模擬速度 2x 3x 4x 目標影格率 - 選擇裝置顯示器能實際呈現的影格率。之後倍率器會自動升高或降低以維持影格率。如果某個調整導致遊戲本身運作變慢,則會自動復原該設定 + 選擇裝置顯示器能實際呈現的影格率,之後倍率器會自動升高或降低以維持影格率。如果某個調整導致遊戲本身運作變慢,則會自動復原該設定 使用固定倍率 60 FPS 90 FPS 120 FPS + 開啟 + 關閉 + 固定 + 自動 + 開啟或關閉影格生成後選擇影格倍率 + 選擇要生成的目標影格率,倍率器會自動調整 + 用來預測影格之間動態的解析度,較低的數值可以減少GPU運算時間 影格佇列目標 最多允許多少個已完成的影格在顯示器前等待,較大的佇列可以吸收 GPU 突發負載,但會增加輸入延遲 最低延遲(無緩衝) 平衡(1影格) 最流暢(2影格) 配合遊戲調整運動預測 - 以遊戲實際渲染的解析度而非升頻後的輸出進行運動預測。由於升頻後不會增加任何動態細節,因此不會影響準確度 + 以遊戲實際渲染的解析度而非升頻後的輸出進行運動預測,由於升頻後不會增加任何動態細節,因此不會影響準確度 運動預測解析度 - 光流處理的解析度,以輸出解析度的比例表示。降低此設定值是減少效能負載最有效的方法 + 光流處理的解析度,以輸出解析度的比例表示,降低此設定值是減少效能負載最有效的方法 無法使用影格生成 + 此GPU驅動程式缺少Lossless Scaling著色器所需的Vulkan記憶體模型或半精度浮點數(float16)支援 可選擇安裝自己擁有的 Lossless.dll 以在之後啟用影格生成功能 安裝 Lossless.dll 您需要擁有從合法管道獲得的 Lossless Scaling 並從該軟體的資料夾中取得 Lossless.dll 檔案才能使用影格生成功能 安裝不同的 Lossless.dll 檔案 影格生成 支援 + 不支援(無Vulkan記憶體模型或float16) Lossless Scaling - 安裝您擁有的 Lossless.dll 檔案以使用影格生成 + 安裝您擁有的Lossless.dll檔案以使用影格生成 已安裝 未安裝 - 替換 + 更換 刪除 - 刪除已安裝的 Lossless.dll 及預先編譯的著色器 - 影格生成功能會停止運作直到您重新安裝 Lossless.dll 。您的 Lossless.dll 原始檔並不會被 Eden 修改 + 刪除已安裝的Lossless.dll及預先編譯的著色器 + 影格生成功能會停止運作直到您重新安裝Lossless.dll,您的Lossless.dll原始檔不會被 Eden 修改 Lossless.dll 未安裝 前往 設定 -> Lossless Scaling 安裝以使用影格生成功能 請先關閉遊戲 - Lossless.dll 無法在遊戲執行時進行更換 + Lossless.dll無法在遊戲執行時進行更換 沒有東西可以刪除 - 尚未安裝 Lossless.dll + 尚未安裝Lossless.dll 準備影格生成著色器中... - 成功安裝 Lossless.dll - 無法安裝 Lossless.dll + 成功安裝Lossless.dll + 無法安裝Lossless.dll 無法複製選取的檔案 無法讀取選取的檔案 - 選取的檔案並不是 Windows 程式庫。請在 Lossless Scaling 的安裝位置(資料夾)中選擇 Lossless.dll - 這個 Lossless.dll 的副本並未包含影格生成著色器。請更新 Lossless Scaling 後再試一次 - 無法轉譯影格生成著色器。尚不支援此 Lossless Scaling 版本 - 轉譯的著色器無法寫入到儲存空間。請確認手機容量是否充足 + 選取的檔案並不是Windows程式庫。請在Lossless Scaling的安裝位置(資料夾)中選擇Lossless.dll + 這個Lossless.dll的副本並未包含影格生成著色器。請更新Lossless Scaling後重試 + 無法轉譯影格生成著色器,尚不支援此Lossless Scaling版本 + 轉譯的著色器無法寫入到儲存空間,請確認手機容量是否充足 進階設定 調整模擬器設定 最近遊玩 最近新增 - 開啟 Eden 資料夾 - 管理 Eden 的內部檔案 + 開啟Eden資料夾 + 管理Eden的內部檔案 自訂Eden的主題與介面 找不到檔案管理員 - 無法開啟 Eden 目錄 + 無法開啟Eden目錄 請使用檔案管理員的側邊面板手動定位到使用者資料夾 管理儲存資料 - 導入/導出遊戲的儲存資料\n壓縮檔必須為.zip格式\n壓縮檔中首個子資料夾名稱必須為遊戲 ID + 導入/導出遊戲的儲存資料\n壓縮檔必須為.zip格式\n壓縮檔中首個子資料夾名稱必須為遊戲ID 導入儲存資料 這將會以提供的檔案覆寫現有的該遊戲儲存資料,您確定要繼續嗎? 正在導入儲存資料… 正在導出儲存資料… 已成功導入 無效的儲存目錄結構 - 首個子資料夾名稱必須為遊戲 ID + 首個子資料夾名稱必須為遊戲ID 安裝韌體 - 韌體必須為 ZIP 壓縮檔,將會用於部分遊戲的啟動 + 韌體必須為ZIP壓縮檔,將會用於部分遊戲的啟動 正在安裝韌體 韌體安裝失敗 - 請確保韌體 nca 檔案位於 zip 壓縮檔的根目錄,然後再試一次。 + 請確保韌體nca檔案位於zip壓縮檔的根目錄後再試一次 韌體解除安裝失敗 分享偵錯記錄 - 分享 Eden 的記錄檔以便對相關問題進行偵錯 + 分享Eden的記錄檔以便對相關問題進行偵錯 找不到日誌檔案 - 分享 GPU 日誌 - 分享 Eden 的 GPU 日誌以對圖形問題進行偵錯 - 找不到 GPU 日誌檔案 + 分享GPU日誌 + 分享Eden的GPU日誌以對圖形問題進行偵錯 + 找不到GPU日誌檔案 安裝遊戲內容 - 安裝遊戲更新或 DLC + 安裝遊戲更新或DLC 正在安裝內容… - 安裝檔案至 NAND 時發生錯誤 - 請確保內容有效並且 prod.keys 檔案已安裝 + 安裝檔案至NAND時發生錯誤 + 請確保內容有效並且prod.keys檔案已安裝 為避免產生衝突,無法直接安裝遊戲本體 %1$d 安裝錯誤 遊戲內容已成功安裝 @@ -406,8 +415,8 @@ %1$d 覆寫成功 https://yuzu-mirror.github.io/help/quickstart/#dumping-installed-updates 您的裝置不支援自訂驅動程式 - 此裝置不支援注入自訂驅動程式。\n請以後再來查看是否已新增支援! - 管理 Eden 資料 + 此裝置不支援注入自訂驅動程式\n請以後再來查看是否已新增支援! + 管理Eden資料 安裝韌體、金鑰,導入/導出使用者資料及安裝其它項目! 遊戲資料夾 深度掃描 @@ -424,7 +433,7 @@ 驗證已安裝內容的完整性 檢查所有已安裝的內容是否有損壞 - 缺少 prod.keys + 缺少prod.keys 無法解密韌體和零售遊戲 https://yuzu-mirror.github.io/help/quickstart/#dumping-decryption-keys @@ -437,8 +446,8 @@ 金鑰安裝失敗 金鑰安裝成功 一個或多個金鑰安裝失敗 - 請確保金鑰檔案具有.keys副檔名後重試。 - 金鑰初始化失敗。請檢查您的轉儲工具是否為最新版本並重新轉儲金鑰。 + 請確保金鑰檔案具有.keys副檔名後重試 + 金鑰初始化失敗,請檢查您的轉儲工具是否為最新版本並重新轉儲金鑰 Qlaunch @@ -450,48 +459,48 @@ prod.keys檔案和韌體已安裝並重試]]> 相簿 使用系統相片檢視器查看儲存在使用者螢幕截圖資料夾中的影像 - Mii 編輯 - 使用系統編輯器來檢視並編輯 Mii + Mii編輯 + 使用系統編輯器來檢視並編輯Mii Cabinet - 編輯、刪除儲存在 amiibo 上的資料 - Cabinet 啟動器 + 編輯、刪除儲存在amiibo上的資料 + Cabinet啟動器 暱稱和擁有者設定 刪除遊戲資料 還原程式 格式化程式 - Gaia 不存在 + Gaia不存在 已複製到剪貼簿 - 一個開放原始碼的 Switch 模擬器 + 一個開放原始碼的Switch模擬器 參與者 - 這些人讓 Eden Android 版成為可能 - 這些專案使 Eden Android 版成為可能 + 這些人讓Eden Android版成為可能 + 這些專案使Eden Android版成為可能 組建版本 使用者資料 - 導入/導出所有應用程式資料。\n\n導入使用者資料時,現有的使用者資料將被取代!\n\n直接從 Citron 導入使用者資料可能會出現問題,建議手動導入所有所需資料。 + 導入/導出所有應用程式資料\n\n導入使用者資料時,現有的使用者資料將被取代!\n\n直接從 Citron 導入使用者資料可能會出現問題,建議手動導入所有所需資料 正在導出使用者資料… 正在導入使用者資料… - 無效的 Eden 備份 + 無效的Eden備份 使用者資料導出成功 使用者資料導入成功 導出已取消 - 請確保使用者資料夾位於 zip 壓縮檔的根目錄,並在 config/config.ini 路徑中包含組態檔案,並再試一次 + 請確保使用者資料夾位於zip壓縮檔的根目錄,並在 config/config.ini 路徑中包含組態檔案後重試 限制模擬速度 將模擬速度限制在標準速度的指定百分比 限制速度百分比 - 指定模擬速度的百分比。100% 為標準速度,更高或更低的值將會減少或增加速度限制 + 指定模擬速度的百分比,100%為標準速度,更高或更低的值將會減少或增加速度限制 加速模式 當開啟加速模式時,模擬器將以此速度執行 慢速模式 當慢速模式開啟時,模擬器將會以此速度執行 - CPU 後端 - CPU 準確度 + CPU後端 + CPU準確度 %1$s%2$s - Homebrew 參數 - 在啟動時傳遞給 Homebrew 的命令列參數(例如:-noglsl) + Homebrew參數 + 在啟動時傳遞給Homebrew的命令列參數(例如:-noglsl) 裝置名稱 @@ -499,26 +508,26 @@ 提高解析度,降低效能。停用後將會使用手提模式,會降低解析度並提高效能 模擬區域 模擬語言 - 選擇 RTC 日期 - 選擇 RTC 時間 - 自訂 RTC + 選擇RTC日期 + 選擇RTC時間 + 自訂RTC 允許您設定與您的目前系統時間相互獨立的自訂時間 - 設定自訂 RTC + 設定自訂RTC - CPU 時脈 - 提高模擬 CPU 回報的時脈,可以減少某些 FPS 限制。較弱的 CPU 可能會出現效能下降的情況,部分遊戲可能會出現異常 + CPU時脈 + 提高模擬CPU回報的時脈,可以減少某些FPS限制。較弱的CPU可能會出現效能下降的情況,部分遊戲可能會出現異常 自訂CPU時脈 - 自訂CPU時脈。更高的值可能提高效能,但也可能導致遊戲卡死。建議範圍為77-21000。 + 自訂CPU時脈,更高的值可能提高效能,但也可能導致遊戲卡死。建議範圍為77-21000 時脈 - 記憶體佈局 - (實驗性)更改模擬記憶體佈局。此設定不會提高效能,但可能有助於使用模組來提高解析度的遊戲的載入。不要在 RAM 為 8GB 或更少的手機上使用。若遊戲崩潰請將進階設定裡偵錯選項中的CPU後端改為 Dynarmic (JIT) + 記憶體布局 + (實驗性)更改模擬記憶體布局,此設定不會提高效能,但可能有助於使用模組來提高解析度的遊戲的載入。不要在RAM為8GB或更少的手機上使用。若遊戲崩潰請將進階設定裡偵錯選項中的CPU後端改為Dynarmic (JIT) 生成 網路令牌 - 用於建立公開大廳的網路令牌。由48個小寫字母a-z組成 + 用於建立公開大廳的網路令牌,由48個小寫字母a-z組成 網路使用者名稱 多人遊戲房間中顯示的使用者名稱。必須為4-20個字元,僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式) 網路 @@ -527,19 +536,19 @@ 解析度 (手提/底座) 垂直同步 視窗自適應濾波器 - FSR/SGSR 銳化度 - 使用 FSR/SGSR 時圖片的銳化程度 + FSR/SGSR銳化度 + 使用FSR/SGSR時圖片的銳化程度 抗鋸齒 進階 - GPU 模式 - 設定 GPU 模擬的準確度。大多數遊戲在設定為快速時即可正常渲染,但有些需要渲染粒子的遊戲仍需設為準確來避免圖形錯誤 - DMA 準確度 - 控制 DMA 準確度。將準確度設為穩定可以修復某些遊戲中的問題,但在某些情況下也可能影響效能。如果不確定,請保留為預設 + GPU模式 + 設定GPU模擬的準確度,大多數遊戲在設定為快速時即可正常渲染,但有些需要渲染粒子的遊戲仍需設為準確來避免圖形錯誤 + DMA準確度 + 控制DMA準確度,將準確度設為穩定可以修復某些遊戲中的問題,但在某些情況下也可能影響效能。如果不確定,請保留為預設 GPU 同步柵欄模式 - 控制 GPU 同步柵欄模式。即時是速度最快的選項,但可能會導致一些問題。使用平衡可以提供更好的相容性並修復某些遊戲中的錯誤。準確則是在犧牲部分效能的情況下進一步提升相容性。嚴格是最慢的選項,但可以修復那些對同步要求更嚴格的遊戲中的問題。預設則會依照 GPU 準確度設定 + 控制 GPU 同步柵欄模式,即時是速度最快的選項,但可能會導致一些問題;使用平衡可以提供更好的相容性並修復某些遊戲中的錯誤;準確則是在犧牲部分效能的情況下進一步提升相容性;嚴格是最慢的選項,但可以修復那些對同步要求更嚴格的遊戲中的問題;預設則會依照 GPU 準確度設定 各向異性過濾 改善斜角檢視時的紋理品質 VRAM使用模式 @@ -548,53 +557,53 @@ 選擇ASTC壓縮紋理的解碼方式:CPU(慢速、穩定)、GPU(快速、推薦)或CPU非同步(無卡頓,可能導致問題) 同步記憶體操作 - 確保計算和記憶體操作之間的資料一致性。 此選項應能修復某些遊戲中的問題,但在某些情況下可能會降低效能。 使用Unreal Engine 4的遊戲似乎受影響最大 + 確保計算和記憶體操作之間的資料一致性,此選項應能修復某些遊戲中的問題,但在某些情況下可能會降低效能。使用Unreal Engine 4的遊戲似乎受影響最大 磁碟著色器快取 將產生的著色器快取儲存至硬碟以減少中斷 - 強制使用最大時脈 (僅限Adreno) - 強制 GPU 以可能的最大時脈執行 (熱溫限制仍會被套用) - GPU 非同步模擬 - 此修改可透過使用 GPU 非同步模擬來提升性能,不過可能會導致圖形問題且會提高在進行時序相關操作時當機的機率 + 強制使用最大時脈(僅限Adreno) + 強制GPU以可能的最大時脈運作(熱溫限制仍會被套用) + GPU非同步模擬 + 此修改可透過使用GPU非同步模擬來提升性能,不過可能會導致圖形問題且會提高在進行時序相關操作時當機的機率 非同步呈現 - 此修改可以透過將渲染移至單獨的 CPU 執行緒來提升性能,但可能會導致圖形問題 + 此修改可以透過將渲染移至單獨的CPU執行緒來提升性能,但可能會導致圖形問題 使用重新啟用排清 - 犧牲效能,以改善部分遊戲的轉譯準確度 + 犧牲效能以改善部分遊戲的轉譯準確度 啟用緩衝區歷史 - 允許存取先前的緩衝區狀態。此選項可能會改善部分遊戲的渲染品質與效能穩定性 + 允許存取先前的緩衝區狀態,此選項可能會改善部分遊戲的渲染品質與效能穩定性 最佳化頂點緩衝區 - 啟用最佳化的頂點緩衝區綁定。需要安裝 Mesa 26.0+ Turnip drivers/Qualcomm drivers。使用舊版 Turnip drivers 會導致當機 (25.3版和更低的版本) + 啟用最佳化的頂點緩衝區綁定,需要安裝 Mesa 26.0+ Turnip drivers/Qualcomm drivers。使用舊版 Turnip drivers 會導致當機(25.3版和更低的版本) 修改 - GPU 時脈 - 讓遊戲誤以為 GPU 工作能更快完成,避免遊戲為了配合 Switch 的時脈而降低解析度與渲染距離 + GPU時脈 + 讓遊戲誤以為GPU工作能更快完成,避免遊戲為了配合Switch的時脈而降低解析度與渲染距離 跳過CPU內部失效處理 在記憶體更新期間跳過某些CPU端快取的失效處理,減少CPU使用率並提高其性能。可能會導致某些遊戲出現故障或當機 修正光暈特效 - 在 薩爾達傳說:織夢島 和 薩爾達傳說:智慧的再現 中 減少光暈模糊的問題並移除 橫衝直撞:狂飆樂園重製版 中的光暈效果 (Adreno A6XX - A7XX/ Turnip)。警告:可能會在其它遊戲中導致圖形異常 - 模擬 BGR565 - 修正遊戲中出現的顏色反轉、圖形異常或陰影異常 + 在 \"薩爾達傳說:織夢島\" 和 \"薩爾達傳說:智慧的再現\" 中減少光暈模糊的問題並移除 \"橫衝直撞:狂飆樂園重製版\" 中的光暈效果(適用於Adreno A6XX - A7XX/ Turnip)。警告:可能會在其它遊戲中導致圖形異常 + 模擬BGR565 + 修正遊戲中出現的色彩反轉、圖形異常或陰影異常 啟用舊版重新縮放處理 透過快速重新縮放處理來啟用遊戲重新縮放設定階段的舊版處理方式 使用非同步著色器 - 使用非同步編譯著色器。這可能會減少卡頓,但也可能導致圖形錯誤。 - GPU Unswizzle 設定 - 設定基於 GPU 的 Unswizzling 參數或完全停用此功能。調整此設定以在性能與紋理載入品質中取得平衡 - 啟用 GPU Unswizzle + 使用非同步編譯著色器,這可能會減少卡頓,但也可能導致圖形錯誤 + GPU Unswizzle設定 + 設定基於GPU的Unswizzling參數或完全停用此功能,調整此設定以在性能與紋理載入品質中取得平衡 + 啟用GPU Unswizzle 停用 - GPU Unswizzle 最大紋理尺寸 - 設定 GPU 紋理 Unswizzling 的最大值 (MB)。雖然 GPU 處理中型和大型紋理的速度較快,但 CPU 處理非常小的紋理可能更有效率。整此設定以在 GPU 加速與 CPU 負載之間取得平衡 - GPU Unswizzle 流大小 - 設定每個影格處理大型紋理 Unswizzling 的資料上限。數值越高載入紋理的速度越快,但會增加畫面延遲;數值較低則能降低 GPU 負載,不過有可能導致至紋理載入不完全甚至突然出現 - GPU Unswizzle 塊大小 - 設定 3D 紋理每批次處理的深度切片數量。增加此數值可提升規格較佳 GPU 的處理效率,但在較低規格的硬體上可能導致卡頓或驅動程式逾時 + GPU Unswizzle最大紋理尺寸 + 設定 GPU 紋理 Unswizzling 的最大值(MB),雖然 GPU 處理中型和大型紋理的速度較快,但 CPU 處理非常小的紋理可能更有效率。調整此設定以在GPU加速與CPU負載之間取得平衡 + GPU Unswizzle Stream大小 + 設定每個影格處理大型紋理Unswizzling的資料上限,數值越高載入紋理的速度越快,但會增加畫面延遲;數值較低則能降低 GPU 負載,不過有可能導致至紋理載入不完全甚至突然出現 + GPU Unswizzle Chunk大小 + 設定 3D 紋理每批次處理的深度切片數量,增加此數值可提升規格較佳GPU的處理效率,但在較低規格的硬體上可能導致卡頓或驅動程式逾時 預設 擴充功能 擴展動態狀態 - 控制擴展動態狀態中可使用的功能數量。較高的數值可根據驅動程式支援的動態狀態減少管線編譯的次數。 + 控制擴展動態狀態中可使用的功能數量,較高的數值可根據驅動程式支援的動態狀態減少管線編譯的次數 停用 頂點輸入動態狀態 啟用此功能可提供更彈性的頂點輸入處理方式,並可能減少頂點/緩衝區的管線編譯時間 @@ -616,43 +625,43 @@ CPU 時脈 使用自動存根 - 自動補上缺少的服務和功能。可提高相容性但可能導致當機和穩定性問題。 + 自動補上缺少的服務和功能,可提高相容性但可能導致當機和穩定性問題 GPU API 圖形偵錯 - 將圖形 API 設為慢速偵錯模式 - BCn 區塊壓縮紋理修補 - 覆寫 Adreno GPU 的 BCn 紋理格式自動偵測。通常會根據 Android 版本自動偵測(會在API 28 以上自動啟用) + 將圖形API設為慢速偵錯模式 + BCn區塊壓縮紋理修補 + 覆寫Adreno GPU的BCn紋理格式自動偵測。通常會根據Android版本自動偵測(會在API 28以上的裝置自動啟用) Fastmem 日誌 按行寫入偵錯日誌 - 在每行寫入時重新整理偵錯日誌,讓程式在當機或閃退時更容易偵錯。 + 在寫入一行日誌就立刻更新偵錯記錄,讓程式在當機或閃退時更容易偵錯 啟用更詳細的日誌記錄 - 將日誌檔的最大檔案限制從 100MB 提高到 1GB + 將日誌檔的最大檔案限制從100MB提高到1GB 日誌過濾器 控制 Eden 日誌的紀錄類別。例如: *:Info Service.LM:Debug - GPU 日誌 + GPU日誌 記錄層級 - GPU 日誌的詳細層級 (越高日誌越詳細,不過會更容易過熱) - 記錄 Vulkan API 呼叫 - 在環形緩衝區中記錄所有 Vulkan API 呼叫 - 傾印 SPIR-V 著色器 - 將重新編譯後的 SPIR-V 二進位檔案 (.spv) 儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 spirv-dis/spirv-cross/spirv-val 進行檢查 + GPU日誌的詳細層級(越高日誌越詳細,不過會更容易過熱) + 記錄Vulkan API呼叫 + 在環形緩衝區中記錄所有Vulkan API呼叫 + 傾印SPIR-V著色器 + 將重新編譯後的SPIR-V二進位檔案(.spv)儲存至Eden資料夾裡的dump資料夾中。可使用 spirv-dis/spirv-cross/spirv-val 進行檢查 傾印客體(Maxwell)著色器 - 將 Maxwell 客體著色器位元組碼檔案 (.ash) 儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 nvdisasm 進行檢查 - 傾印 Maxwell 巨集 - 將 Maxwell 巨集程式檔案 (.macro) 儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 envydis 進行檢查 - 追蹤 GPU 記憶體 - 監控 GPU 記憶體的分配和釋放 + 將Maxwell客體著色器位元組碼檔案(.ash)儲存至Eden資料夾裡的dump資料夾中。可使用 nvdisasm 進行檢查 + 傾印Maxwell巨集 + 將Maxwell巨集程式檔案(.macro)儲存至Eden資料夾裡的dump資料夾中。可使用 envydis 進行檢查 + 追蹤GPU記憶體 + 監控GPU記憶體的分配和釋放 驅動程式偵錯資料 擷取驅動程式的特定偵錯資料(例如 Turnip breadcrumbs) 環形緩衝區大小 - 追蹤的近期 Vulkan 呼叫數量(預設為 512 ) - 64 至 4096 個項目 + 追蹤的近期Vulkan呼叫數量(預設為512) + 64至4096個項目 一般 @@ -676,17 +685,17 @@ 左搖桿 控制搖桿 右搖桿 - C 搖桿 + C搖桿 按壓 靈敏度 無感帶 用按鈕、按鍵來模擬搖桿 修改按鈕模擬左/右搖桿的值,視遊戲不同而有所差異\n(模擬左搖桿時,若將此數值設為50,則按下按鈕時遊戲裡的人物可能只會走動而不是奔跑;模擬右搖桿時所使用的值則是會影響到轉視角的速度,數值越高代表使用的模擬值越大) 肩部按鍵 - 左 SL - 左 SR - 右 SL - 右 SR + 左SL + 左SR + 右SL + 右SR 無效 無 未知 @@ -701,12 +710,12 @@ 選擇一個控制器以嘗試自動配對按鈕、搖桿 嘗試為 %1$s 自動配對 控制器類型 - Pro 手把 + Pro手把 掌機模式 - 雙 Joycon 手把 - 左 Joycon 手把 - 右 Joycon 手把 - GameCube 手把 + 雙Joycon手把 + 左Joycon手把 + 右Joycon手把 + GameCube手把 方向反轉 反轉按鈕 切換按鍵 @@ -799,7 +808,7 @@ 推薦驅動程式: GPU型號 不支援的GPU - 您的GPU不支援驅動程式注入。不建議嘗試設定自訂驅動程式。 + 您的GPU不支援驅動程式注入,不建議嘗試設定自訂驅動程式 設定 From 10bcd2d849843b146a79c61a21df615e1bdcfcde Mon Sep 17 00:00:00 2001 From: xbzk Date: Mon, 5 Oct 2026 22:37:30 +0200 Subject: [PATCH 097/128] [settings] add PR4490 & PR4492 toggles (#4502) - [X] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [X] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [X] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- TEMPORARY! Pushed under Camille's instruction. Will be dropped as soon as they get optimized. Aimed to avoid reported perf impact from PRs 4490 and 4492 on 30-sep-2026 nightly, Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4502 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey --- .../features/settings/model/BooleanSetting.kt | 2 + .../settings/model/view/SettingsItem.kt | 14 +++++++ .../settings/ui/SettingsFragmentPresenter.kt | 2 + .../app/src/main/res/values/strings.xml | 4 ++ src/common/settings.h | 4 ++ src/core/hle/service/ro/ro.cpp | 38 ++++++++++--------- src/qt_common/config/shared_translation.cpp | 8 ++++ src/video_core/gpu.cpp | 20 +++++----- 8 files changed, 65 insertions(+), 27 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index 97be7f1bd9..239d56837c 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -16,6 +16,8 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { RENDERER_USE_SPEED_LIMIT("use_speed_limit"), USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"), SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"), + NCE_INVALIDATION_GPU_READBACK("nce_invalidation_gpu_readback"), + NCE_RUNTIME_NRO_PATCH("nce_runtime_nro_patch"), FIX_BLOOM_EFFECTS("fix_bloom_effects"), EMULATE_BGR565("emulate_bgr565"), RESCALE_HACK("rescale_hack"), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 366d3a8b3b..ef52b23053 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -866,6 +866,20 @@ abstract class SettingsItem( descriptionId = R.string.skip_cpu_inner_invalidation_description ) ) + put( + SwitchSetting( + BooleanSetting.NCE_INVALIDATION_GPU_READBACK, + titleId = R.string.nce_invalidation_gpu_readback, + descriptionId = R.string.nce_invalidation_gpu_readback_description + ) + ) + put( + SwitchSetting( + BooleanSetting.NCE_RUNTIME_NRO_PATCH, + titleId = R.string.nce_runtime_nro_patch, + descriptionId = R.string.nce_runtime_nro_patch_description + ) + ) put( SwitchSetting( BooleanSetting.FIX_BLOOM_EFFECTS, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index e9f818d9bc..dccc8b859a 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -554,6 +554,8 @@ class SettingsFragmentPresenter( add(HeaderSetting(R.string.hacks)) add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key) + add(BooleanSetting.NCE_INVALIDATION_GPU_READBACK.key) + add(BooleanSetting.NCE_RUNTIME_NRO_PATCH.key) add(BooleanSetting.FIX_BLOOM_EFFECTS.key) add(BooleanSetting.EMULATE_BGR565.key) add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key) diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 5a587be351..e48319f483 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -595,6 +595,10 @@ Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch\'s clocks. Skip CPU Inner Invalidation Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it\'s performance. This may cause glitches or crashes on some games. + GPU Readback Before NCE Invalidation + Temporary. Fix Ender Magnolia (and other UE titles) crashes. May reduce performance. Improvement in progress. + Patch Runtime NROs for NCE + Temporary. Fix Biomutant boot. May impact performance. Improvement in progress. Fix Bloom Effects Reduces bloom blur in LA/EOW (Adreno A6XX - A7XX/ Turnip), removes bloom in Burnout. Warning: may cause graphical artifacts in other games. Emulate BGR565 diff --git a/src/common/settings.h b/src/common/settings.h index 5d66f49ebd..d4c445c27c 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -639,6 +639,10 @@ struct Values { Specialization::Default, true, true}; + SwitchableSetting nce_invalidation_gpu_readback{ + linkage, false, "nce_invalidation_gpu_readback", Category::RendererHacks}; + SwitchableSetting nce_runtime_nro_patch{ + linkage, false, "nce_runtime_nro_patch", Category::RendererHacks}; SwitchableSetting async_presentation{linkage, #ifdef __ANDROID__ false, diff --git a/src/core/hle/service/ro/ro.cpp b/src/core/hle/service/ro/ro.cpp index b847811fe5..167bf04c9a 100644 --- a/src/core/hle/service/ro/ro.cpp +++ b/src/core/hle/service/ro/ro.cpp @@ -426,28 +426,30 @@ public: std::addressof(ro_size), std::addressof(rw_size), nro_info->base_address, nro_size, bss_size)); #ifdef HAS_NCE - if (Settings::IsNceEnabled()) { - auto* process = context->GetProcess(); - auto& memory = process->GetMemory(); + if (Settings::values.nce_runtime_nro_patch.GetValue()) { + if (Settings::IsNceEnabled()) { + auto* process = context->GetProcess(); + auto& memory = process->GetMemory(); - std::vector image(total_size); - memory.ReadBlock(nro_info->base_address, image.data(), rx_size); + std::vector image(total_size); + memory.ReadBlock(nro_info->base_address, image.data(), rx_size); - Kernel::CodeSet::Segment code{.size = static_cast(rx_size)}; - Core::NCE::Patcher patch; - patch.PatchText(image, code); - patch.RelocateAndCopy(nro_info->base_address, code, image, nullptr); + Kernel::CodeSet::Segment code{.size = static_cast(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; + 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); + 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. diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index 29fbd32de5..0fe2366dfc 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -194,6 +194,14 @@ std::unique_ptr InitializeTranslations(QObject* parent) { INSERT(Settings, skip_cpu_inner_invalidation, tr("Skip CPU Inner Invalidation"), tr("Skips certain cache invalidations during memory updates, reducing CPU usage and " "improving latency. This may cause soft-crashes.")); + INSERT(Settings, nce_invalidation_gpu_readback, + tr("GPU Readback Before NCE Invalidation"), + tr("Flushes GPU buffer data back to guest memory before NCE invalidates the whole " + "guest page, preserving it while the CPU store proceeds.")); + INSERT(Settings, nce_runtime_nro_patch, + tr("Patch Runtime NROs for NCE"), + tr("Applies NCE code patches to runtime-loaded NRO modules." + "This is required for some games to run correctly.")); INSERT(Settings, vsync_mode, tr("VSync Mode:"), tr("FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen " "refresh rate.\nFIFO Relaxed allows tearing as it recovers from a slow down.\n" diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index 6aa7f9abd8..4e36d086e6 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -227,15 +227,17 @@ struct GPU::Impl { /// Notify rasterizer that any caches of the specified region should be invalidated void InvalidateRegion(DAddr addr, u64 size, bool preserve_gpu_writes) { - 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; + if (Settings::values.nce_invalidation_gpu_readback.GetValue()) { + 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); } From 3cdd2ce141224079ce1dc8bfb4be7edc113aca02 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Thu, 8 Oct 2026 19:02:48 +0200 Subject: [PATCH 098/128] =?UTF-8?q?[android,=20renderer=5Fvulkan]=20=D0=A1?= =?UTF-8?q?hange=20default=20settings=20(#4509)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Airplane mode: On - needed to launch many games. Nvdec: CPU - fixes most issues in cutscenes. AudioEngine: Sdl3 (only Android) - "Auto" includes Cubeb on Android, but SDL3 works better. Async GPU: On - In most games, this provides a 30% boost in performance. Async presentation: On (Remove async presentation toggle from Android, It is no longer needed). Co-authored-by: CamilleLaVey Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4509 Reviewed-by: Maufeat Reviewed-by: lizzie --- .../features/settings/model/BooleanSetting.kt | 1 - .../settings/model/view/SettingsItem.kt | 7 ----- .../settings/ui/SettingsFragmentPresenter.kt | 1 - .../app/src/main/res/values-ar/strings.xml | 2 -- .../app/src/main/res/values-es/strings.xml | 2 -- .../app/src/main/res/values-ru/strings.xml | 2 -- .../app/src/main/res/values-uk/strings.xml | 2 -- .../src/main/res/values-zh-rCN/strings.xml | 2 -- .../src/main/res/values-zh-rTW/strings.xml | 10 +++---- .../app/src/main/res/values/strings.xml | 2 -- src/common/settings.h | 24 ++++++++--------- .../renderer_vulkan/renderer_vulkan.cpp | 6 +++-- .../renderer_vulkan/vk_present_manager.cpp | 26 ++++++++++++++++++- .../renderer_vulkan/vk_present_manager.h | 10 ++++++- 14 files changed, 54 insertions(+), 43 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index 239d56837c..2f2d3823f8 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -27,7 +27,6 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache"), RENDERER_FORCE_MAX_CLOCK("force_max_clock"), RENDERER_ASYNCHRONOUS_GPU_EMULATION("use_asynchronous_gpu_emulation"), - RENDERER_ASYNC_PRESENTATION("async_presentation"), RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"), RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"), ENABLE_BUFFER_HISTORY("enable_buffer_history"), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index ef52b23053..8346339ee4 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -753,13 +753,6 @@ abstract class SettingsItem( descriptionId = R.string.renderer_asynchronous_gpu_emulation_description ) ) - put( - SwitchSetting( - BooleanSetting.RENDERER_ASYNC_PRESENTATION, - titleId = R.string.renderer_async_presentation, - descriptionId = R.string.renderer_async_presentation_description - ) - ) put( SingleChoiceSetting( IntSetting.DMA_ACCURACY, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index dccc8b859a..74e1e90836 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -561,7 +561,6 @@ class SettingsFragmentPresenter( add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key) add(IntSetting.ANDROID_PIPELINE_WORKERS.key) add(BooleanSetting.RENDERER_ASYNCHRONOUS_GPU_EMULATION.key) - add(BooleanSetting.RENDERER_ASYNC_PRESENTATION.key) add(SettingsItem.GPU_UNSWIZZLE_COMBINED) add(HeaderSetting(R.string.extensions)) diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 1082a117ab..5669aab8ba 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -574,8 +574,6 @@ يجبر وحدة معالجة الرسومات على العمل بأقصى سرعة ممكنة (سيظل يتم تطبيق القيود الحرارية). محاكاة غير متزامنة لوحدة معالجة الرسومات يمكن لهذه الحيلة أن تزيد الأداء عن طريق تشغيل محاكاة وحدة معالجة الرسومات بشكل غير متزامن على حساب مشاكل الرسومات وزيادة معدلات الأعطال بسبب العمليات المتعلقة بالتوقيت. - عرض غير متزامن - يمكن لهذه الحيلة أن تزيد من الأداء عن طريق نقل عملية العرض إلى خيط معالجة منفصل على حساب مشاكل الرسوميات. استخدم التنظيف التفاعلي يحسن دقة العرض في بعض الألعاب على حساب الأداء. تفعيل سجل التخزين المؤقت diff --git a/src/android/app/src/main/res/values-es/strings.xml b/src/android/app/src/main/res/values-es/strings.xml index 72f8d74203..05135b515e 100644 --- a/src/android/app/src/main/res/values-es/strings.xml +++ b/src/android/app/src/main/res/values-es/strings.xml @@ -518,8 +518,6 @@ Fuerza a la GPU a ejecutarse a la velocidad máxima de reloj posible (se seguirán aplicando restricciones térmicas). Emulación de GPU asíncrona Este hack puede aumentar el rendimiento ejecutando la emulación de la GPU de forma asíncrona, a costa de problemas gráficos y un aumento en la tasa de fallos debido a operaciones relacionadas con la sincronización. - Presentación asíncrona - Este hack puede aumentar el rendimiento al mover la presentación a un hilo independiente de la CPU a costa de problemas gráficos. Usar limpieza reactiva Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento. Activar el historial del búfer diff --git a/src/android/app/src/main/res/values-ru/strings.xml b/src/android/app/src/main/res/values-ru/strings.xml index 912ce84caf..c291a9276b 100644 --- a/src/android/app/src/main/res/values-ru/strings.xml +++ b/src/android/app/src/main/res/values-ru/strings.xml @@ -563,8 +563,6 @@ Заставляет ГПУ работать на максимально возможных тактовых частотах (тепловые ограничения все равно будут применяться). Асинхронная эмуляция ГПУ Может повысить производительность за счёт асинхронного запуска эмуляции ГПУ, но ценой появления графических ошибок и увеличения частоты вылетов из-за операций, зависящих от синхронизации. - Асинхронная презентация - Может повысить производительность за счёт перемещения вывода кадров в отдельный поток ЦП, но ценой возникновения графических проблем. Реактивная очистка Повышение точности рендеринга в некоторых играх за счет снижения производительности. Включить историю буфера diff --git a/src/android/app/src/main/res/values-uk/strings.xml b/src/android/app/src/main/res/values-uk/strings.xml index 9923fc72c4..b49e320806 100644 --- a/src/android/app/src/main/res/values-uk/strings.xml +++ b/src/android/app/src/main/res/values-uk/strings.xml @@ -481,8 +481,6 @@ Змушує GPU працювати на максимальній тактовій частоті. Асинхронна емуляція ГП Це обхідне рішення може покращити продуктивність завдяки асинхронному виконанню емуляції ГП, але спричинить проблеми з графікою та збільшить частоту збоїв чутливих до таймінгів операцій. - Асинхронне подання - Це обхідне рішення може покращити продуктивність завдяки переміщенню подання на окремий потік ЦП, але спричинить проблеми з графікою. Реактивне очищення Покращує точність рендерингу в деяких іграх. Увімкнути історію буфера diff --git a/src/android/app/src/main/res/values-zh-rCN/strings.xml b/src/android/app/src/main/res/values-zh-rCN/strings.xml index 19f5f0aae7..6ae0f102b2 100644 --- a/src/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/android/app/src/main/res/values-zh-rCN/strings.xml @@ -564,8 +564,6 @@ 强制 GPU 以最大时钟运行 (温控依然生效)。 GPU 异步模拟 此技巧可通过异步运行 GPU 模拟来提升性能,但在执行与时序相关的操作时,可能带来图形显示问题以及增加崩溃概率。 - 异步呈现 - 此技巧通过将图形呈现移至独立的 CPU 线程来提升性能,但可能会带来图形显示问题。 启用反应性刷新 通过牺牲性能来提升某些游戏的渲染精度。 启用缓冲区历史 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 55b126fd91..9a30acd3ac 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -560,12 +560,10 @@ 確保計算和記憶體操作之間的資料一致性,此選項應能修復某些遊戲中的問題,但在某些情況下可能會降低效能。使用Unreal Engine 4的遊戲似乎受影響最大 磁碟著色器快取 將產生的著色器快取儲存至硬碟以減少中斷 - 強制使用最大時脈(僅限Adreno) - 強制GPU以可能的最大時脈運作(熱溫限制仍會被套用) - GPU非同步模擬 - 此修改可透過使用GPU非同步模擬來提升性能,不過可能會導致圖形問題且會提高在進行時序相關操作時當機的機率 - 非同步呈現 - 此修改可以透過將渲染移至單獨的CPU執行緒來提升性能,但可能會導致圖形問題 + 強制使用最大時脈 (僅限Adreno) + 強制 GPU 以可能的最大時脈執行 (熱溫限制仍會被套用) + GPU 非同步模擬 + 此修改可透過使用 GPU 非同步模擬來提升性能,不過可能會導致圖形問題且會提高在進行時序相關操作時當機的機率 使用重新啟用排清 犧牲效能以改善部分遊戲的轉譯準確度 啟用緩衝區歷史 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index e48319f483..703a91fd02 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -580,8 +580,6 @@ Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied). GPU async emulation This hack can increase performance by running GPU emulation asynchronously at the cost of graphical issues and increased crash rates by timing-related operations. - Asynchronous presentation - This hack can increase performance by moving presentation to a separate CPU thread at the cost of graphical issues. Use reactive flushing Improves rendering accuracy in some games at the cost of performance. Enable buffer history diff --git a/src/common/settings.h b/src/common/settings.h index d4c445c27c..0eee48b55d 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -171,8 +171,13 @@ struct Values { SwitchableSetting enable_overlay{linkage, false, "enable_overlay", Category::LibraryApplet}; // Audio - SwitchableSetting sink_id{linkage, AudioEngine::Auto, "output_engine", - Category::Audio, Specialization::RuntimeList}; + SwitchableSetting sink_id{linkage, +#ifdef __ANDROID__ + AudioEngine::Sdl3, +#else + AudioEngine::Auto, +#endif + "output_engine", Category::Audio, Specialization::RuntimeList}; SwitchableSetting audio_output_device_id{ linkage, "auto", "output_device", Category::Audio, Specialization::RuntimeList}; SwitchableSetting audio_input_device_id{ @@ -472,13 +477,8 @@ struct Values { SwitchableSetting frame_gen_dump_flow{linkage, false, "frame_gen_dump_flow", Category::Renderer}; - SwitchableSetting use_asynchronous_gpu_emulation{linkage, -#ifdef __ANDROID__ - false, -#else - true, -#endif - "use_asynchronous_gpu_emulation", Category::Renderer}; + SwitchableSetting use_asynchronous_gpu_emulation{linkage, true, "use_asynchronous_gpu_emulation", + Category::Renderer}; // *nix platforms may have issues with the borderless windowed fullscreen mode. // Default to exclusive fullscreen on these platforms for now. SwitchableSetting fullscreen_mode{linkage, @@ -537,7 +537,7 @@ struct Values { "vram_usage_mode", Category::RendererAdvanced}; - SwitchableSetting nvdec_emulation{linkage, NvdecEmulation::Gpu, + SwitchableSetting nvdec_emulation{linkage, NvdecEmulation::Cpu, "nvdec_emulation", Category::RendererAdvanced}; SwitchableSetting max_anisotropy{linkage, @@ -645,7 +645,7 @@ struct Values { linkage, false, "nce_runtime_nro_patch", Category::RendererHacks}; SwitchableSetting async_presentation{linkage, #ifdef __ANDROID__ - false, + true, #else false, #endif @@ -936,7 +936,7 @@ struct Values { // Network Setting network_interface{linkage, std::string(), "network_interface", Category::Network}; - SwitchableSetting airplane_mode{linkage, false, "airplane_mode", Category::Network}; + SwitchableSetting airplane_mode{linkage, true, "airplane_mode", Category::Network}; // WebService Setting web_api_url{linkage, "api.ynet-fun.xyz", "web_api_url", diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 4fd4c0233b..27ca531186 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -217,13 +217,15 @@ void RendererVulkan::Composite(std::span framebu scheduler.RequestOutsideRenderPassOperationContext(); blit_swapchain.DrawToFrame(device, rasterizer, frame, framebuffers, - render_window.GetFramebufferLayout(), swapchain.GetImageCount(), + render_window.GetFramebufferLayout(), + present_manager.SwapchainImageCount(), swapchain.GetImageViewFormat()); #ifdef HAS_LSFG void(frame_gen.WantedGenerations(present_manager.MaxExtraFrames())); - frame_gen.Process(device, frame, swapchain.GetImageFormat(), GuestExtent(framebuffers)); + frame_gen.Process(device, frame, present_manager.SwapchainImageFormat(), + GuestExtent(framebuffers)); const size_t generated_frames = frame_gen.GeneratedFrameCount(); for (size_t generation = 0; generation < generated_frames; ++generation) { diff --git a/src/video_core/renderer_vulkan/vk_present_manager.cpp b/src/video_core/renderer_vulkan/vk_present_manager.cpp index d173a3ba5f..9298764546 100644 --- a/src/video_core/renderer_vulkan/vk_present_manager.cpp +++ b/src/video_core/renderer_vulkan/vk_present_manager.cpp @@ -23,6 +23,7 @@ namespace Vulkan { namespace { constexpr size_t MAX_FRAMES_IN_FLIGHT = 7; +constexpr u32 MAX_PRESENT_ATTEMPTS = 3; #ifdef HAS_LSFG static_assert(MAX_FRAMES_IN_FLIGHT <= LSFG_MAX_TARGETS); #endif @@ -372,12 +373,33 @@ void PresentManager::SetImageCount() { #else image_count = std::min(swapchain.GetImageCount(), MAX_FRAMES_IN_FLIGHT); #endif + swapchain_image_count = swapchain.GetImageCount(); + swapchain_image_format = swapchain.GetImageFormat(); +} + +void PresentManager::DiscardFrame(Frame* frame) { + static constexpr VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + const VkSemaphore render_ready = *frame->render_ready; + const VkSubmitInfo submit_info{ + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, + .pNext = nullptr, + .waitSemaphoreCount = 1U, + .pWaitSemaphores = &render_ready, + .pWaitDstStageMask = &wait_stage, + .commandBufferCount = 0U, + .pCommandBuffers = nullptr, + .signalSemaphoreCount = 0U, + .pSignalSemaphores = nullptr, + }; + + std::scoped_lock submit_lock{scheduler.submit_mutex}; + void(device.GetGraphicsQueue().Submit(submit_info, *frame->present_done)); } void PresentManager::CopyToSwapchain(Frame* frame) { bool requires_recreation = false; - while (true) { + for (u32 attempt = 0; attempt < MAX_PRESENT_ATTEMPTS; ++attempt) { try { // Recreate surface and swapchain if needed. if (requires_recreation) { @@ -397,6 +419,8 @@ void PresentManager::CopyToSwapchain(Frame* frame) { requires_recreation = true; } } + + DiscardFrame(frame); } void PresentManager::CopyToSwapchainImpl(Frame* frame) { diff --git a/src/video_core/renderer_vulkan/vk_present_manager.h b/src/video_core/renderer_vulkan/vk_present_manager.h index 4741c55e61..ab2b76f10f 100644 --- a/src/video_core/renderer_vulkan/vk_present_manager.h +++ b/src/video_core/renderer_vulkan/vk_present_manager.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include #include @@ -68,6 +69,9 @@ public: /// How many additional frames can be queued without stalling the render thread [[nodiscard]] size_t MaxExtraFrames() const; + [[nodiscard]] std::size_t SwapchainImageCount() const { return swapchain_image_count; } + [[nodiscard]] VkFormat SwapchainImageFormat() const { return swapchain_image_format; } + private: void PresentThread(std::stop_token token); @@ -77,6 +81,8 @@ private: void RecreateSwapchain(Frame* frame); + void DiscardFrame(Frame* frame); + void SetImageCount(); private: @@ -100,7 +106,9 @@ private: bool blit_supported; bool storage_supported; bool use_present_thread; - std::size_t image_count{}; + std::atomic image_count{}; + std::atomic swapchain_image_count{}; + std::atomic swapchain_image_format{}; }; } // namespace Vulkan From 67bada77f8a43a90da2e94e89b8e7da73c256989 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Thu, 8 Oct 2026 23:11:34 +0200 Subject: [PATCH 099/128] [video_core] Skip fragment shaders with known issues on non-NVIDIA drivers (#4503) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Skip fragment shaders using a pattern that is not supported by non-NVIDIA drivers. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4503 Reviewed-by: CamilleLaVey --- src/common/settings.h | 3 -- src/qt_common/config/shared_translation.cpp | 6 --- .../frontend/maxwell/translate_program.cpp | 2 +- src/shader_recompiler/ir_opt/passes.h | 4 ++ .../ir_opt/rescaling_pass.cpp | 17 +++----- .../ir_opt/vendor_workaround_pass.cpp | 43 +++++++++++++++++++ .../renderer_vulkan/vk_pipeline_cache.cpp | 6 +++ 7 files changed, 59 insertions(+), 22 deletions(-) diff --git a/src/common/settings.h b/src/common/settings.h index 0eee48b55d..2a4bf3e9e4 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -657,9 +657,6 @@ struct Values { SwitchableSetting emulate_bgr565{linkage, false, "emulate_bgr565", Category::RendererHacks}; - SwitchableSetting rescale_hack{linkage, false, "rescale_hack", - Category::RendererHacks}; - SwitchableSetting use_asynchronous_shaders{linkage, false, "use_asynchronous_shaders", Category::RendererHacks}; diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index 0fe2366dfc..964a4cdad4 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -279,12 +279,6 @@ std::unique_ptr InitializeTranslations(QObject* parent) { "quality and performance consistency in some games.")); INSERT(Settings, fix_bloom_effects, tr("Fix bloom effects"), tr("Removes bloom in Burnout.")); - INSERT(Settings, rescale_hack, tr("Enable Legacy Rescale Pass"), - tr("May fix rescale issues in some games by relying on behavior from the previous " - "implementation.\n" - "Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and " - "grey texture flicker on Nvidia GPUs in Luigis Mansion 3.")); - // Renderer (Extensions) INSERT(Settings, dyna_state, tr("Extended Dynamic State"), tr("Controls the number of features that can be used in Extended Dynamic State.\n" diff --git a/src/shader_recompiler/frontend/maxwell/translate_program.cpp b/src/shader_recompiler/frontend/maxwell/translate_program.cpp index ebc5a825dd..1b2ec5502d 100644 --- a/src/shader_recompiler/frontend/maxwell/translate_program.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate_program.cpp @@ -301,7 +301,7 @@ IR::Program TranslateProgram(ObjectPool& inst_pool, ObjectPoolInstructions()) { + switch (inst.GetOpcode()) { + case IR::Opcode::ShuffleIndex: + case IR::Opcode::ShuffleUp: + case IR::Opcode::ShuffleDown: + case IR::Opcode::ShuffleButterfly: + break; + default: + continue; + } + const IR::Value shuffle_arg{inst.Arg(0)}; + if (shuffle_arg.IsImmediate()) { + continue; + } + const IR::Inst* bitcast{shuffle_arg.InstRecursive()}; + if (!bitcast || bitcast->GetOpcode() != IR::Opcode::BitCastU32F32) { + continue; + } + const IR::Value bitcast_arg{bitcast->Arg(0)}; + if (bitcast_arg.IsImmediate()) { + continue; + } + const IR::Inst* attribute{bitcast_arg.InstRecursive()}; + if (!attribute || attribute->GetOpcode() != IR::Opcode::GetAttribute) { + continue; + } + const IR::Attribute attr{attribute->Arg(0).Attribute()}; + if (attr == IR::Attribute::PositionX || attr == IR::Attribute::PositionY) { + return true; + } + } + } + return false; +} + } // namespace Shader::Optimization diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 642b9fa223..5e057dd4cf 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -23,6 +23,7 @@ #include "shader_recompiler/environment.h" #include "shader_recompiler/frontend/maxwell/control_flow.h" #include "shader_recompiler/frontend/maxwell/translate_program.h" +#include "shader_recompiler/ir_opt/passes.h" #include "shader_recompiler/program_header.h" #include "video_core/engines/kepler_compute.h" #include "video_core/engines/maxwell_3d.h" @@ -826,6 +827,11 @@ std::unique_ptr PipelineCache::CreateGraphicsPipeline( programs[index] = MergeDualVertexPrograms(program_va, program_vb, env); } + if (device.GetDriverID() != VK_DRIVER_ID_NVIDIA_PROPRIETARY && Shader::Optimization::HasBrokenPattern(programs[index])) { + LOG_WARNING(Render_Vulkan, "0x{:016x}: Skipping shader with known issues", key.unique_hashes[index]); + return nullptr; + } + if (Settings::values.dump_guest_shaders) { env.Dump(hash, key.unique_hashes[index]); } From c746982201a60958193f0678fff1f39417aaaf1e Mon Sep 17 00:00:00 2001 From: crueter Date: Sun, 11 Oct 2026 05:11:01 +0200 Subject: [PATCH 100/128] [*] fix clangarm64 compilation (#4521) seems like a lot less headers are pulling in vector Signed-off-by: crueter - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4521 Reviewed-by: lizzie --- src/core/hle/service/bcat/backend/backend.h | 3 +-- src/hid_core/resources/npad/npad_types.h | 4 +++- src/input_common/helpers/joycon_protocol/joycon_types.h | 2 ++ src/input_common/helpers/joycon_protocol/poller.cpp | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/core/hle/service/bcat/backend/backend.h b/src/core/hle/service/bcat/backend/backend.h index 8419399a62..645af9a386 100644 --- a/src/core/hle/service/bcat/backend/backend.h +++ b/src/core/hle/service/bcat/backend/backend.h @@ -6,12 +6,11 @@ #pragma once -#include #include #include +#include #include "common/common_types.h" -#include "core/file_sys/vfs/vfs_types.h" #include "core/hle/result.h" #include "core/hle/service/bcat/bcat_types.h" #include "core/hle/service/kernel_helpers.h" diff --git a/src/hid_core/resources/npad/npad_types.h b/src/hid_core/resources/npad/npad_types.h index 68b803c3d3..2f7ac2d4f7 100644 --- a/src/hid_core/resources/npad/npad_types.h +++ b/src/hid_core/resources/npad/npad_types.h @@ -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-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -6,6 +6,8 @@ #pragma once +#include + #include "common/bit_field.h" #include "common/common_funcs.h" #include "common/common_types.h" diff --git a/src/input_common/helpers/joycon_protocol/joycon_types.h b/src/input_common/helpers/joycon_protocol/joycon_types.h index dd3bd4398c..8597d02701 100644 --- a/src/input_common/helpers/joycon_protocol/joycon_types.h +++ b/src/input_common/helpers/joycon_protocol/joycon_types.h @@ -13,6 +13,8 @@ #include #include +#include + #include #include "common/bit_field.h" diff --git a/src/input_common/helpers/joycon_protocol/poller.cpp b/src/input_common/helpers/joycon_protocol/poller.cpp index 2384981f50..07e599f89e 100644 --- a/src/input_common/helpers/joycon_protocol/poller.cpp +++ b/src/input_common/helpers/joycon_protocol/poller.cpp @@ -4,7 +4,7 @@ // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/logging.h" +#include #include "input_common/helpers/joycon_protocol/poller.h" namespace InputCommon::Joycon { From fecc1b4ee32bc06f736f2d138680ec948cf13ab1 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Sun, 11 Oct 2026 12:08:33 +0200 Subject: [PATCH 101/128] revert [vulkan] Masquerade VkInfo as PUBGMobile + UE #4320 (#4520) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- https://github.com/Balemuni/Balemunis-Aurora stopped fixing the black squares in TotK. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4520 Reviewed-by: lizzie Reviewed-by: Maufeat --- src/video_core/vulkan_common/vulkan_wrapper.cpp | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 5044881598..bb43fe399f 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -460,20 +460,8 @@ Instance Instance::Create(u32 version, Span layers, Span gloom + yellow line glitch appears -#ifdef __ANDROID__ - const VkApplicationInfo application_info{ - .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, - .pNext = nullptr, - .pApplicationName = "PUBGMobile", - .applicationVersion = VK_MAKE_VERSION(1, 7, 0), - .pEngineName = "UnrealEngine", - .engineVersion = VK_MAKE_VERSION(4, 23, 0), - .apiVersion = VK_API_VERSION_1_3, - }; -#else + // DO NOT TOUCH, breaks RNDA3!! + // Don't know why, but gloom + yellow line glitch appears const VkApplicationInfo application_info{ .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, .pNext = nullptr, @@ -483,7 +471,6 @@ Instance Instance::Create(u32 version, Span layers, Span Date: Mon, 12 Oct 2026 01:09:10 +0200 Subject: [PATCH 102/128] [vk] Return the corrections made for buffer update logic #3690 (#4499) Credit: Pavel Fixes shadows in Metroid Prime Remastered Broken ![image](/attachments/7c49b843-0184-4835-b14e-d93a0948dd56) Fixed ![image](/attachments/2ba2eb43-fead-4fd4-9791-671aa518f282) Needs to be tested - Demon Slayer Vertex Explosions - Ender Magnolia Freezing - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Co-authored-by: PavelBARABANOV Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4499 Reviewed-by: Maufeat Reviewed-by: lizzie Reviewed-by: CamilleLaVey --- src/video_core/renderer_vulkan/vk_query_cache.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_query_cache.cpp b/src/video_core/renderer_vulkan/vk_query_cache.cpp index 2b5aa24053..f63c924e39 100644 --- a/src/video_core/renderer_vulkan/vk_query_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_query_cache.cpp @@ -814,7 +814,7 @@ public: new_query->flags |= VideoCommon::QueryFlagBits::IsFinalValueSynced; return index; } - + scheduler.RequestOutsideRenderPassOperationContext(); CloseCounter(); auto [bank_slot, data_slot] = ProduceCounterBuffer(slot); @@ -952,8 +952,6 @@ private: } has_flushed_end_pending = false; - // Refresh buffer state before ending transform feedback to ensure counters_count is up-to-date. - UpdateBuffers(); if (buffers_count == 0) { LOG_DEBUG(Render_Vulkan, "EndTransformFeedbackEXT called with no counters (buffers_count=0)"); scheduler.Record([](vk::CommandBuffer cmdbuf) { From 9580e54f2f4787986abde4c7601177d0c5cd2792 Mon Sep 17 00:00:00 2001 From: Eden CI Date: Mon, 12 Oct 2026 19:23:00 +0200 Subject: [PATCH 103/128] [dist, android] Update translations from Transifex for Oct 12 (#4527) Automatic translation update for Oct 12 Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4527 --- dist/languages/ar.ts | 612 +++++++-------- dist/languages/ca.ts | 587 +++++++------- dist/languages/cs.ts | 587 +++++++------- dist/languages/da.ts | 587 +++++++------- dist/languages/de.ts | 588 +++++++------- dist/languages/el.ts | 587 +++++++------- dist/languages/es.ts | 588 +++++++------- dist/languages/fi.ts | 599 ++++++++------- dist/languages/fr.ts | 587 +++++++------- dist/languages/hu.ts | 587 +++++++------- dist/languages/id.ts | 587 +++++++------- dist/languages/it.ts | 587 +++++++------- dist/languages/ja_JP.ts | 587 +++++++------- dist/languages/ko_KR.ts | 588 +++++++------- dist/languages/nb.ts | 587 +++++++------- dist/languages/nl.ts | 587 +++++++------- dist/languages/pl.ts | 587 +++++++------- dist/languages/pt_BR.ts | 588 +++++++------- dist/languages/pt_PT.ts | 587 +++++++------- dist/languages/ru_RU.ts | 588 +++++++------- dist/languages/sv.ts | 726 +++++++++--------- dist/languages/tr_TR.ts | 587 +++++++------- dist/languages/uk.ts | 588 +++++++------- dist/languages/vi.ts | 587 +++++++------- dist/languages/vi_VN.ts | 587 +++++++------- dist/languages/zh_CN.ts | 588 +++++++------- dist/languages/zh_TW.ts | 587 +++++++------- .../app/src/main/res/values-ar/strings.xml | 6 +- .../src/main/res/values-zh-rTW/strings.xml | 428 ++++++----- 29 files changed, 8363 insertions(+), 8103 deletions(-) diff --git a/dist/languages/ar.ts b/dist/languages/ar.ts index 472f7ac609..73ab8a2039 100644 --- a/dist/languages/ar.ts +++ b/dist/languages/ar.ts @@ -727,12 +727,32 @@ Aggressive mode may impact performance of other applications such as recording s يتخطى بعض عمليات إبطال ذاكرة التخزين المؤقتة أثناء تحديثات الذاكرة، مما يقلل من استخدام وحدة المعالجة المركزية ويحسّن زمن الوصول. قد يؤدي هذا إلى أعطال مؤقتة. - + + GPU Readback Before NCE Invalidation + NCE إعادة قراءة وحدة معالجة الرسومات قبل إبطال صلاحية + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + يفرغ بيانات ذاكرة المعالج الرسومي المؤقتة ويعيدها إلى ذاكرة المحاكي قبل أن تلغي تقنية التشغيل المباشر عمل الصفحة بالكامل، مما يحافظ على البيانات أثناء استمرار المعالج المركزي في تخزينها + + + + Patch Runtime NROs for NCE + تعديل ملفات تشغيل اللعبة فوراً لتتوافق مع تقنية التشغيل المباشر + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + يعدل كود تشغيل اللعبة تلقائياً عند فتحها. هذا الإجراء ضروري لتشغيل بعض الألعاب بدون مشاكل. + + + VSync Mode: VSync وضع: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -743,12 +763,12 @@ Immediate (no synchronization) presents whatever is available and can exhibit te يُظهر الوضع الفوري (بدون مزامنة) كل ما هو متاح، وقد يُظهر تمزقًا. - + Sync Memory Operations مزامنة عمليات الذاكرة - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -757,44 +777,44 @@ Unreal Engine 4 games often see the most significant changes thereof. التغييرات الأكثر أهمية Unreal Engine 4 غالبًا ما تشهد ألعاب. - + Enable asynchronous presentation (Vulkan only) (Vulkan فقط) تفعيل العرض التقديمي غير المتزامن - + Slightly improves performance by moving presentation to a separate CPU thread. تحسين الأداء بشكل طفيف عن طريق نقل العرض التقديمي إلى مؤشر ترابط منفصل في وحدة المعالجة المركزية. - + Force maximum clocks (Vulkan only) (Vulkan فقط) فرض الحد الأقصى للساعات - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. يعمل في الخلفية أثناء انتظار أوامر الرسومات لمنع وحدة معالجة الرسومات من خفض سرعة الساعة. - + Anisotropic Filtering: :الترشيح متباين الخواص - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. يتحكم بجودة عرض الملمس بزوايا مائلة. من الآمن ضبطه على 16x على معظم وحدات معالجة الرسومات. - + GPU Mode: :وضع وحدة معالجة الرسومات - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -803,12 +823,12 @@ Particles tend to only render correctly with Accurate mode. لا تُعرض الجسيمات بشكل صحيح إلا في وضع «دقيق». - + DMA Accuracy: DMA دقة: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -817,12 +837,12 @@ Default follows the GPU Accuracy setting. يُتبع الإعداد الافتراضي إعداد «دقة وحدة معالجة الرسومات» - + GPU Fence Behavior: :سلوك حاجز وحدة معالجة الرسومات - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -835,44 +855,44 @@ Default follows the GPU Mode setting. يتبع الخيار افتراضي إعداد وضع وحدة معالجة الرسومات. - + Enable asynchronous shader compilation تفعيل تجميع التظليل غير المتزامن - + May reduce shader stutter. قد يقلل من تقطع التظليل. - + GPU Clocks سرعات وحدة معالجة الرسومات - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. يجعل اللعبة تعتقد أن عمل وحدة معالجة الرسومات ينتهي بشكل أسرع مما هو عليه في الواقع، لذلك تتوقف عن خفض الدقة ومسافة العرض لتتناسب مع سرعات جهاز Switch. - + GPU Unswizzle إلغاء ترتيب بيانات وحدة معالجة الرسومات - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. باستخدام حوسبة وحدة معالجة الرسومات BCn 3D يسرع فك تشفير نسيج. قم بتعطيله في حالة حدوث أعطال أو مشاكل في الرسومات. - + GPU Unswizzle Max Texture Size الحد الأقصى لحجم النسيج في وحدة معالجة الرسومات بعد إعادة ترتيب البيانات - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -881,48 +901,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size حجم تدفق إلغاء ترتيب بيانات وحدة معالجة الرسومات - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. يحدد الحد الأقصى لكمية بيانات النسيج (بالميغابايت) التي تتم معالجتها لكل إطار. يمكن أن تقلل القيم الأعلى من التقطع أثناء تحميل النسيج، ولكنها قد تؤثر على اتساق الإطارات. - + GPU Unswizzle Chunk Size حجم كتلة إلغاء ترتيب بيانات وحدة معالجة الرسومات - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. يُحدد هذا الخيار عدد شرائح العمق التي تتم معالجتها في عملية إرسال واحدة. زيادة هذا الخيار قد تُحسّن الإنتاجية على وحدات معالجة الرسومات المتطورة، ولكنها قد تُسبب أخطاء في إعادة تعيين وقت الاستجابة أو انقطاع الاتصال ببرنامج التشغيل على الأجهزة ذات المواصفات الأقل. - + Use Vulkan pipeline cache Vulkan استخدام ذاكرة التخزين المؤقتة لخط أنابيب - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. يُفعّل ذاكرة التخزين المؤقت لخطوط الأنابيب الخاصة ببائع وحدة معالجة الرسومات. بتخزين ملفات ذاكرة التخزين المؤقتة للخطوط الداخلية Vulkan يمكن أن يؤدي هذا الخيار إلى تحسين وقت تحميل التظليل بشكل كبير في الحالات التي لا يقوم فيها برنامج تشغيل. - + Enable Compute Pipelines (Intel Vulkan Only) (Intel Vulkan فقط) تفعيل خطوط أنابيب الحوسبة - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -931,192 +951,180 @@ Compute pipelines are always enabled on all other drivers. خطوط أنابيب الحوسبة مفعلة دائمًا على جميع برامج التشغيل الأخرى. - + Enable Reactive Flushing تفعيل التنظيف التفاعلي - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. يستخدم التنظيف التفاعلي بدلاً من التنظيف التنبئي، مما يسمح بمزامنة الذاكرة بشكل أكثر دقة. - + Sync to framerate of video playback المزامنة مع معدل الإطارات لتشغيل الفيديو - + Run the game at normal speed during video playback, even when the framerate is unlocked. قم بتشغيل اللعبة بالسرعة العادية أثناء تشغيل الفيديو، حتى عندما يكون معدل الإطارات مفتوحًا. - + Barrier feedback loops حلقات التغذية الراجعة للحواجز - + Improves rendering of transparency effects in specific games. يحسن عرض تأثيرات الشفافية في بعض الألعاب المحددة. - + Enable buffer history تفعيل سجل التخزين المؤقت - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. يُتيح هذا الخيار الوصول إلى حالات التخزين المؤقت السابقة. وقد يُحسّن جودة العرض وثبات الأداء في بعض الألعاب. - + Fix bloom effects إصلاح تأثيرات التوهج - + Removes bloom in Burnout. يزيل التوهج في وضع الاحتراق. - - Enable Legacy Rescale Pass - تفعيل ميزة إعادة التحجيم القديمة - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - قد يصلح مشاكل إعادة القياس في بعض الألعاب بالاعتماد على سلوك من التنفيذ السابق. -حل لسلوك قديم يصلح تشوهات الخطوط على بطاقات AMD وIntel الرسومية، ووميض النسيج الرمادي على بطاقات Nvidia الرسومية في لعبة Luigi's Mansion 3. - - - + Extended Dynamic State الحالة الديناميكية الموسعة - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. يتحكم في عدد الميزات التي يمكن استخدامها في الحالة الديناميكية الموسعة.تسمح الحالات الأعلى بمزيد من الميزات ويمكن أن تزيد من الأداء، ولكنها قد تسبب مشكلات رسومية إضافية. - + Vertex Input Dynamic State حالة ديناميكية لإدخال الرأس - + Enables vertex input dynamic state feature for better quality and performance. يتيح ميزة الحالة الديناميكية لإدخال الرأس لتحسين الجودة والأداء. - + Sample Shading تظليل العينة - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. يسمح لمظلل الأجزاء بالتنفيذ لكل عينة في جزء متعدد العينات بدلاً من مرة واحدة لكل جزء. يحسن جودة الرسومات على حساب الأداء. القيم الأعلى تحسن الجودة ولكنها تقلل من الأداء. - + RNG Seed مولد الأرقام العشوائية - + Controls the seed of the random number generator. Mainly used for speedrunning. يتحكم في بذرة مولد الأرقام العشوائية. يُستخدم بشكل رئيسي في سباقات السرعة. - + Device Name اسم الجهاز - + The name of the console. اسم وحدة التحكم. - + Homebrew Args Homebrew وسائط - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). (noglsl -مثل) عند التشغيل Homebrew سطر الأوامر الوسائط المُمررة إلى - + Custom RTC Date: :تاريخ التوقيت الحقيقي المخصص - + This option allows to change the clock of the console. Can be used to manipulate time in games. يتيح لك هذا الخيار تغيير ساعة وحدة التحكم. يمكن استخدامه للتحكم بالوقت في الألعاب. - + The number of seconds from the current unix time عدد الثواني من وقت يونكس الحالي - + Language: :اللغة - + This option can be overridden when region setting is auto-select يمكن تجاوز هذا الخيار عند تحديد إعداد المنطقة تلقائيًا - + Region: :المنطقة - + The region of the console. منطقة وحدة التحكم. - + Time Zone: :المنطقة الزمنية - + The time zone of the console. المنطقة الزمنية لوحدة التحكم. - + Sound Output Mode: :وضع إخراج الصوت - + Console Mode: :وضع وحدة التحكم - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1125,1026 +1133,1026 @@ Setting to Handheld can help improve performance for low end systems. يُمكن أن يُساعد الضبط على الوضع المحمول على تحسين أداء الأجهزة منخفضة المواصفات. - + Prompt for user profile on boot المطالبة بملف تعريف المستخدم عند التشغيل - + Useful if multiple people use the same PC. مفيد إذا كان هناك عدة أشخاص يستخدمون نفس الكمبيوتر. - + Pause when not in focus توقف عند عدم التركيز - + Pauses emulation when focusing on other windows. يوقف المحاكاة عند التركيز على نوافذ أخرى. - + Confirm before stopping emulation تأكيد قبل إيقاف المحاكاة - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. يتجاوز المطالبات التي تطلب تأكيد إيقاف المحاكاة. يؤدي تفعيله إلى تجاوز هذه المطالبات والخروج مباشرة من المحاكاة. - + Hide mouse on inactivity إخفاء الماوس عند عدم النشاط - + Hides the mouse after 2.5s of inactivity. يخفي الماوس بعد 2.5 ثانية من عدم النشاط. - + Check for updates التحقق من توفر التحديثات - + Whether or not to check for updates upon startup. ما إذا كان يجب التحقق من التحديثات عند بدء التشغيل أم لا. - + Enable Gamemode تفعيل وضع اللعبة - + Force X11 as Graphics Backend كخلفية رسومات X11 فرض - + Custom frontend الواجهة الأمامية المخصصة - + Real applet تطبيق صغير حقيقي - - + + Disabled معطل - + Never أبداً - + On Load عند التحميل - + Always دائماً - + CPU وحدة المعالجة المركزية - + GPU وحدة معالجة الرسومات - + CPU Asynchronous وحدة المعالجة المركزية غير المتزامنة - + Uncompressed (Best quality) Uncompressed (أفضل جودة) - + BC1 (Low quality) BC1 (جودة منخفضة) - + BC3 (Medium quality) BC3 (جودة متوسطة) - - + + Auto تلقائي - + 30 FPS 30 إطارًا في الثانية - + 60 FPS 60 إطارًا في الثانية - + 90 FPS 90 إطارًا في الثانية - + 120 FPS 120 إطارًا في الثانية - + Conservative محافظ - + Aggressive عدواني - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null لا شيء - + Fast سريع - - - + + + Accurate دقه - - - + + + Default افتراضي - + Unsafe (fast) غير آمن (سريع) - + Safe (stable) آمن (مستقر) - + Immediate فوري - + Balanced متوازن - + Unsafe غير آمن - + Paranoid (disables most optimizations) شديد الحذر (يعطل معظم التحسينات) - + Debugging تصحيح الأخطاء - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed نافذة بلا حدود - + Exclusive Fullscreen شاشة كاملة حصرية - + No Video Output لا يوجد إخراج فيديو - + CPU Video Decoding فك تشفير فيديو وحدة المعالجة المركزية - + GPU Video Decoding (Default) فك تشفير فيديو وحدة معالجة الرسومات (افتراضي) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [تجريبي] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [تجريبي] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [تجريبي] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [تجريبي] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [تجريبي] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution دقة فائقة للألعاب من سنابدراغون - + Snapdragon Game Super Resolution EdgeDir دقة فائقة للألعاب من سنابدراغون EdgeDir - + None لا شيء - + FXAA FXAA - + SMAA SMAA - + Default (16:9) (16:9) افتراضي - + Force 4:3 4:3 فرض - + Force 21:9 21:9 فرض - + Force 16:10 16:10 فرض - + Stretch to Window تمديد إلى النافذة - + Automatic تلقائي - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) اليابانية (日本語) - + American English الإنجليزية الأمريكية - + French (français) الفرنسية (français) - + German (Deutsch) الألمانية (Deutsch) - + Italian (italiano) الإيطالية (Italiano) - + Spanish (español) الإسبانية (español) - + Chinese الصينية - + Korean (한국어) الكورية (한국어) - + Dutch (Nederlands) الهولندية (Nederlands) - + Portuguese (português) البرتغالية (Português) - + Russian (Русский) الروسية (Русский) - + Taiwanese تايواني - + British English الإنجليزية البريطانية - + Canadian French الكندية الفرنسية - + Latin American Spanish أمريكا اللاتينية الإسبانية - + Simplified Chinese الصينية المبسطة - + Traditional Chinese (正體中文) الصينية التقليدية (正體中文) - + Brazilian Portuguese (português do Brasil) البرتغالية البرازيلية (português do Brasil) - + Polish (polska) البولندية (polska) - + Thai (แบบไทย) التايلاندية (แบบไทย) - - + + Japan اليابان - + USA الولايات المتحدة الأمريكية - + Europe أوروبا - + Australia أستراليا - + China الصين - + Korea كوريا - + Taiwan تايوان - + Auto (%1) Auto select time zone تلقائي (%1) - + Default (%1) Default time zone افتراضي (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Poland - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkey - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono أحادي - + Stereo مجسم - + Surround محيطي - + 4GB DRAM (Default) 4GB DRAM (افتراضي) - + 6GB DRAM (Unsafe) 6GB DRAM (غير آمنة) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (غير آمنة) - + 12GB DRAM (Unsafe) 12GB DRAM (غير آمنة) - + Docked الإرساء - + Handheld محمول - - + + Normal قياسي - - + + Boost تعزيز - - + + Overclock كسر السرعة - + Always ask (Default) اسأل دائمًا (افتراضي) - + Only if game specifies not to stop فقط إذا حددت اللعبة عدم التوقف - + Never ask لا تسأل أبدا - + Very Small (16 MB) صغير جدًا (16 ميغابايت) - + Small (32 MB) صغير (32 ميغابايت) - + Normal (128 MB) قياسي (128 ميغابايت) - + Large (256 MB) كبير (256 ميغابايت) - + Very Large (512 MB) كبير جدًا (512 ميغابايت) - + Very Low (4 MB) منخفض جدًا (4 ميغابايت) - + Low (8 MB) منخفض (8 ميغابايت) - + Normal (16 MB) قياسي (16 ميغابايت) - + Medium (32 MB) متوسط (32 ميغابايت) - + High (64 MB) عالي (64 ميغابايت) - + Very Low (32) منخفض جدًا (32) - + Low (64) منخفض (64) - + Normal (128) قياسي (128) - + Medium (256) متوسط (256) - + High (512) عالي (512) - + ExtendedDynamicState 1 الحالة الديناميكية الممتدة 1 - + ExtendedDynamicState 2 الحالة الديناميكية الممتدة 2 - + ExtendedDynamicState 3 الحالة الديناميكية الممتدة 3 - + Tree View عرض قائمة - + Grid View عرض شبكة @@ -3732,7 +3740,7 @@ Would you like to delete the old save data? Ring Controller - وحدة تحكم الحلقة + ذراع تحكم الحلقة @@ -5096,7 +5104,7 @@ Once deleted, these can NOT be recovered. Are you 100% sure you want to delete t Unable to create directory %1 for storing user images. - غير قادر على إنشاء الدليل %1 لتخزين صور المستخدم. + تعذر إنشاء المجلد %1 لتخزين صور المستخدم. @@ -5149,7 +5157,7 @@ UUID: %2 Configure Ring Controller - إعدادات حلقة وحدة التحكم + إعدادات حلقة ذراع التحكم @@ -5249,12 +5257,12 @@ UUID: %2 The current mapped device doesn't support the ring controller - الجهاز المُعيَّن حاليًا لا يدعم وحدة التحكم بالحلقة + الجهاز المعين حاليا لا يدعم ذراع التحكم بالحلقة The current mapped device doesn't have a ring attached - الجهاز المُعَيَّن حاليًا ليس به حلقة مُرفقة + الجهاز المعين حاليا ليس به حلقة مرفقة @@ -5790,7 +5798,7 @@ Drag points to change position, or double-click table cells to edit values. Discord Presence - الحضور على ديسكورد + التواجد على ديسكورد @@ -5888,7 +5896,7 @@ Drag points to change position, or double-click table cells to edit values. Delete all data in this directory. THIS IS 100% IRREVERSABLE! - حذف جميع البيانات الموجودة في هذا الدليل. هذا الإجراء لا رجعة فيه بنسبة 100%! + حذف جميع البيانات الموجودة في هذا المجلد. هذه العملية لا رجعة فيها بنسبة 100%! @@ -7312,22 +7320,22 @@ Debug Message: Small (32x32) - صغير (32x32) + (32x32) صغير Standard (64x64) - قياسي (64x64) + (64x64) قياسي Large (128x128) - كبير (128x128) + (128x128) كبير Full Size (256x256) - حجم كامل (256x256) + (256x256) حجم كامل @@ -8313,7 +8321,7 @@ If you wish to clean up the files which were left in the old data location, you %1 -إذا كنت ترغب في تنظيف الملفات التي تركت في موقع البيانات القديم، يمكنك القيام بذلك عن طريق حذف الدليل التالي: +إذا كنت ترغب في إزالة الملفات التي بقيت في موقع البيانات القديم، فيمكنك القيام بذلك عن طريق حذف المجلد التالي: %1 diff --git a/dist/languages/ca.ts b/dist/languages/ca.ts index 82c2259280..534d4e4af1 100644 --- a/dist/languages/ca.ts +++ b/dist/languages/ca.ts @@ -694,12 +694,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: Mode de sincronització vertical: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -707,79 +727,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: Filtrat anisotròpic: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: Mode de la GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Precisió DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -788,1301 +808,1290 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Llavor de GNA - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Nom del dispositiu - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Idioma: - + This option can be overridden when region setting is auto-select - + Region: Regió: - + The region of the console. - + Time Zone: Zona horària: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: Mode de la consola - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ocultar el cursor del ratolí en cas d'inactivitat - + Hides the mouse after 2.5s of inactivity. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Activa el mode joc - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - - + + Disabled - + Never Mai - + On Load - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservador - + Aggressive Agressiu - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Ensamblat d'ombrejadors, només NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, només AMD/Mesa) - + Null Nul - + Fast Ràpid - - - + + + Accurate Precís - - - + + + Default Valor predeterminat - + Unsafe (fast) Insegur (ràpid) - + Safe (stable) Segur (estable) - + Immediate - + Balanced Equilibrat - + Unsafe Insegur - + Paranoid (disables most optimizations) Paranoic (desactiva la majoria d'optimitzacions) - + Debugging Depuració - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Finestra sense vores - + Exclusive Fullscreen Pantalla completa exclusiva - + No Video Output Sense sortida de vídeo - + CPU Video Decoding Descodificació de vídeo a la CPU - + GPU Video Decoding (Default) Descodificació de vídeo a la GPU (Valor predeterminat) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Veí més proper - + Bilinear Bilineal - + Bicubic Bicúbic - + Gaussian Gaussià - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution Super resolució AMD FidelityFX - + Area Àrea - + MMPX MMPX - + Zero-Tangent Tangència zero - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Cap - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Valor predeterminat (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 - + Stretch to Window Estirar a la finestra - + Automatic Automàtic - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonès (日本語) - + American English Anglès americà - + French (français) Francès (français) - + German (Deutsch) Alemany (Deutsch) - + Italian (italiano) Italià (italiano) - + Spanish (español) Castellà (español) - + Chinese Xinès - + Korean (한국어) Coreà (한국어) - + Dutch (Nederlands) Holandès (Nederlands) - + Portuguese (português) Portuguès (português) - + Russian (Русский) Rus (Русский) - + Taiwanese Taiwanès - + British English Anglès britànic - + Canadian French Francès canadenc - + Latin American Spanish Espanyol llatinoamericà - + Simplified Chinese Xinès simplificat - + Traditional Chinese (正體中文) Xinès tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portuguès brasiler (português do Brasil) - + Polish (polska) Polonès (polska) - + Thai (แบบไทย) Tailandès (แบบไทย) - - + + Japan Japó - + USA EUA - + Europe Europa - + Australia Austràlia - + China Xina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Per defecte (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islàndia - + Iran Iran - + Israel Isreal - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polònia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estèreo - + Surround Envoltant - + 4GB DRAM (Default) 4GB DRAM (Insegur) - + 6GB DRAM (Unsafe) 6GB DRAM (Insegur) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Insegur) - + 12GB DRAM (Unsafe) 12GB DRAM (Insegur) - + Docked Sobretaula - + Handheld Portàtil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop Tan sols si el joc especifica no parar - + Never ask No preguntar mai - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/cs.ts b/dist/languages/cs.ts index c6644fa046..abbc0b4db0 100644 --- a/dist/languages/cs.ts +++ b/dist/languages/cs.ts @@ -694,12 +694,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -707,79 +727,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: Anizotropní filtrování: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -788,1301 +808,1290 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Název Zařízení - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Jazyk: - + This option can be overridden when region setting is auto-select - + Region: Region: - + The region of the console. - + Time Zone: Časové Pásmo: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Potvrzení před zastavením emulace - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Skrýt myš při neaktivitě - + Hides the mouse after 2.5s of inactivity. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - - + + Disabled - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Automatické - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Přesné - - - + + + Default Výchozí - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Nebezpečné - + Paranoid (disables most optimizations) Paranoidní (zakáže většinu optimizací) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Okno bez okrajů - + Exclusive Fullscreen Exkluzivní - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - + Bilinear Bilineární - + Bicubic - + Gaussian - + Lanczos - + ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Žádné - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Výchozí (16:9) - + Force 4:3 Vynutit 4:3 - + Force 21:9 Vynutit 21:9 - + Force 16:10 - + Stretch to Window Roztáhnout podle okna - + Automatic - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonština (日本語) - + American English - + French (français) Francouzština (français) - + German (Deutsch) Nemčina (Deutsch) - + Italian (italiano) Italština (Italiano) - + Spanish (español) Španělština (español) - + Chinese Čínština - + Korean (한국어) Korejština (한국어) - + Dutch (Nederlands) Holandština (Nederlands) - + Portuguese (português) Portugalština (português) - + Russian (Русский) Ruština (Русский) - + Taiwanese Tajwanština - + British English Britská Angličtina - + Canadian French Kanadská Francouzština - + Latin American Spanish Latinsko Americká Španělština - + Simplified Chinese Zjednodušená Čínština - + Traditional Chinese (正體中文) Tradiční Čínština (正體中文) - + Brazilian Portuguese (português do Brasil) Brazilská Portugalština (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonsko - + USA USA - + Europe Evropa - + Australia Austrálie - + China Čína - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypt - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Lybie - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polsko - + Portugal Portugalsko - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turecko - + UCT UCT - + Universal Univerzální - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Zadokovaná - + Handheld Příruční - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Vždy se zeptat (Výchozí) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/da.ts b/dist/languages/da.ts index ed0bbc27d1..4e34f94af9 100644 --- a/dist/languages/da.ts +++ b/dist/languages/da.ts @@ -696,12 +696,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -709,79 +729,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: Anisotropisk Filtrering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -790,1301 +810,1290 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG-Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Region - + The region of the console. - + Time Zone: Tidszone - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Skjul mus ved inaktivitet - + Hides the mouse after 2.5s of inactivity. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - - + + Disabled - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Automatisk - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Nøjagtig - - - + + + Default Standard - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Usikker - + Paranoid (disables most optimizations) Paranoid (deaktiverer de fleste optimeringer) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Uindrammet Vindue - + Exclusive Fullscreen Eksklusiv Fuld Skærm - + No Video Output Ingen Video-Output - + CPU Video Decoding CPU-Video Afkodning - + GPU Video Decoding (Default) GPU-Video Afkodning (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75X (540p/810p) [EKSPERIMENTEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor Nærmeste Nabo - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gausisk - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tving 4:3 - + Force 21:9 Tving 21:9 - + Force 16:10 - + Stretch to Window Stræk til Vindue - + Automatic - + 2x - + 4x - + 8x - + 16x - + Japanese (日本語) Japansk (日本語) - + American English - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Hollandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwanesisk - + British English Britisk Engelsk - + Canadian French Candadisk Fransk - + Latin American Spanish Latinamerikansk Spansk - + Simplified Chinese Forenklet Kinesisk - + Traditional Chinese (正體中文) Traditionelt Kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliansk Portugisisk (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ægypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Tyrkiet - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokket - + Handheld Håndholdt - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/de.ts b/dist/languages/de.ts index d845754236..a911437c44 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -731,12 +731,32 @@ Der aggressive Modus kann die Leistung anderer Anwendungen, wie z. B. Aufnahmeso Überspringt bestimmte Cache-Invalidierungen auf CPU-Seite während Speicherupdates, reduziert die CPU-Auslastung und verbessert die Leistung. Dies verursacht vielleicht Abstürze. - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: VSync-Modus: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -747,12 +767,12 @@ Postkasten kann eine geringere Latenz als FIFO aufweisen und verursacht kein Tea Sofort (ohne Synchronisation) zeigt alles an, was verfügbar ist, und kann Tearing verursachen. - + Sync Memory Operations Speicheroperationen synchronisieren - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -761,44 +781,44 @@ Diese Option behebt Probleme in Spielen, kann jedoch zu Leistungseinbußen führ Bei Spielen mit Unreal Engine 4 sind die Auswirkungen oft am deutlichsten spürbar. - + Enable asynchronous presentation (Vulkan only) Aktiviere asynchrone Präsentation (Nur Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Verbessert die Leistung geringfügig, indem die Darstellung auf einen separaten CPU-Thread verlagert wird. - + Force maximum clocks (Vulkan only) Erzwinge Maximale Taktrate (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Lässt im Hintergrund die GPU Aufgaben erledigen während diese auf Grafikbefehle wartet, damit diese nicht herunter taktet. - + Anisotropic Filtering: Anisotrope Filterung: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Steuert die Qualität der Texturwiedergabe bei schrägen Blickwinkeln. Bei den meisten Grafikkarten kann dieser Wert bedenkenlos auf 16x eingestellt werden. - + GPU Mode: GPU-Modus: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -807,12 +827,12 @@ Die meisten Spiele werden im Modus Schnell in Ordnung gerendert, für einige ist Partikel werden in der Regel nur im Modus Akkurat korrekt gerendert. - + DMA Accuracy: DMA-Genauigkeit: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -821,12 +841,12 @@ Unsicher ist schneller, während Sicher stabiler ist und in manchen Spielen Prob Standard folgt der GPU-Genauigkeit Einstellung. - + GPU Fence Behavior: GPU-Zaunobjekt-Verhalten: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -835,44 +855,44 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation Aktiviere asynchrones Shader-Kompilieren - + May reduce shader stutter. Kann Shader-Ruckler reduzieren. - + GPU Clocks GPU-Takte - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. Führt dazu, dass das Spiel glaubt, die Arbeit der GPU würde früher fertig sein, als sie eigentlich ist. Dadurch hört das Spiel auf die Auflösung und Render-Distanz zu verringern um sich den Takten der Switch anzupassen. - + GPU Unswizzle GPU-Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Beschleunigt die Dekodierung von BCn-3D-Texturen mithilfe von GPU-Rechenleistung. Deaktiviere diese Option, falls Abstürze oder Grafikfehler auftreten. - + GPU Unswizzle Max Texture Size GPU-Unswizzle max. Texturgröße - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -881,48 +901,48 @@ Während die GPU für mittelgroße und große Texturen schneller ist, kann die C Passen Sie diesen Wert an, um das Gleichgewicht zwischen GPU-Beschleunigung und CPU-Overhead zu finden. - + GPU Unswizzle Stream Size GPU-Unswizzle-Streamgröße - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Legt die maximale Menge an Texturdaten (in MiB) fest, die pro Bild verarbeitet wird. Höhere Werte können Ruckeln beim Laden von Texturen verringern, können sich jedoch auf die Bildrate auswirken. - + GPU Unswizzle Chunk Size GPU-Unswizzle Chunk-Größe - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Legt die Anzahl der Tiefenschnitte fest, die in einem einzelnen Durchlauf verarbeitet werden. Eine Erhöhung dieses Werts kann den Durchsatz auf High-End-GPUs verbessern, bei schwächerer Hardware jedoch zu TDR- oder Treiber-Auszeiten führen. - + Use Vulkan pipeline cache Vulkan-Pipeline-Cache verwenden - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Aktiviert den herstellerspezifischen Pipeline-Cache der GPU. Diese Option kann die Ladezeit von Shadern erheblich verkürzen, wenn der Vulkan-Treiber die Pipeline-Cache-Dateien nicht intern speichert. - + Enable Compute Pipelines (Intel Vulkan Only) Aktiviere Compute-Pipelines (Nur Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -931,194 +951,182 @@ Diese Einstellung ist nur bei proprietären Intel-Treibern vorhanden und kann be Bei allen anderen Treibern sind die Rechen-Rohrleitungen immer aktiviert. - + Enable Reactive Flushing Aktiviere Reactives Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Benutzt Reactive-Flushing anstatt Predictive-Flushing, welches akkurateres Speicher-Synchronisieren erlaubt. - + Sync to framerate of video playback Synchronisiere mit Bildrate von Video-Wiedergaben - + Run the game at normal speed during video playback, even when the framerate is unlocked. Lasse das Spiel in der normalen Geschwindigkeit abspielen, trotz freigeschalteter Bildrate - + Barrier feedback loops Barrier-Feedback-Schleifen - + Improves rendering of transparency effects in specific games. Verbessert das Rendering von Transparenzeffekten in bestimmten Spielen. - + Enable buffer history Puffer-Verlauf aktivieren - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Ermöglicht den Zugriff auf frühere Pufferzustände. Diese Option kann in manchen Spielen die Darstellungsqualität und die Leistungsstabilität verbessern. - + Fix bloom effects Bloom-Effekte beheben - + Removes bloom in Burnout. Entfernt Bloom in Burnout. - - Enable Legacy Rescale Pass - „Legacy Rescale Pass“ aktivieren - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - Behebt möglicherweise Probleme mit der Skalierung in einigen Spielen, indem auf das Verhalten der vorherigen Implementierung zurückgegriffen wird. -Eine Umgehungslösung für das alte Verhalten, die Linienartefakte auf AMD- und Intel-GPUs sowie graues Texturflackern auf Nvidia-GPUs in „Luigi’s Mansion 3“ behebt. - - - + Extended Dynamic State Erweiterter dynamischer Zustand - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Legt die Anzahl der Funktionen fest, die im erweiterten dynamischen Modus verwendet werden können. Höhere Stufen ermöglichen mehr Funktionen und können die Leistung steigern, können jedoch zusätzliche grafische Probleme verursachen. - + Vertex Input Dynamic State Dynamischer Zustand der Scheitelpunkteingabe - + Enables vertex input dynamic state feature for better quality and performance. Aktiviert die Funktion für den dynamischen Status der Scheitelpunkteingabe, um eine bessere Qualität und Leistung zu erzielen. - + Sample Shading Probe-Schattierung - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Ermöglicht es dem Fragment-Shader, pro Abtastwert in einem mehrfach abgetasteten Fragment ausgeführt zu werden, anstatt nur einmal pro Fragment. Verbessert die Grafikqualität auf Kosten der Leistung. Höhere Werte verbessern die Qualität, beeinträchtigen jedoch die Leistung. - + RNG Seed Startwert für den Zufallszahlengenerator - + Controls the seed of the random number generator. Mainly used for speedrunning. Steuert den Startwert des Zufallszahlengenerators. Wird hauptsächlich für Schnelldurchläufe verwendet. - + Device Name Gerätename - + The name of the console. Der Name der Konsole. - + Homebrew Args Homebrew-Argumente - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Befehlszeilenargumente, die beim Start an Homebrew übergeben werden (z. B. -noglsl). - + Custom RTC Date: Benutzerdefinierte Echtzeituhrdatum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Diese Option erlaubt die Änderung der Uhr der Konsole. Kann benutzt werden um Zeit in Spielen zu manipulieren. - + The number of seconds from the current unix time Die Anzahl der Sekunden seit dem aktuellen Unix-Zeitstempel - + Language: Sprache: - + This option can be overridden when region setting is auto-select Diese Option kann überschrieben werden, wenn die Regionseinstellung auf „Automatische Auswahl“ steht - + Region: Region: - + The region of the console. Die Region der Konsole. - + Time Zone: Zeitzone: - + The time zone of the console. Die Zeitzone der Konsole. - + Sound Output Mode: Tonausgangsmodus: - + Console Mode: Konsolenmodus: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1127,1026 +1135,1026 @@ Je nach dieser Einstellung ändern sich bei Spielen die Auflösung, die Detailst Die Einstellung auf „Handgerät“ kann dazu beitragen, die Leistung auf Systemen mit geringerer Leistung zu verbessern. - + Prompt for user profile on boot Beim Systemstart nach dem Benutzerprofil fragen - + Useful if multiple people use the same PC. Nützlich, wenn mehrere Personen denselben PC nutzen. - + Pause when not in focus Pausieren, wenn nicht im Fokus - + Pauses emulation when focusing on other windows. Pausiert die Emulation, wenn der Fokus auf andere Fenster wechselt. - + Confirm before stopping emulation Vor dem Stoppen der Emulation bestätigen - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Überschreibt die Abfragen zur Bestätigung des Beendens der Emulation. Wenn diese Option aktiviert ist, werden solche Abfragen umgangen und die Emulation wird direkt beendet. - + Hide mouse on inactivity Mauszeiger verbergen - + Hides the mouse after 2.5s of inactivity. Verbirgt den Mauszeiger nach 2,5 Sekunden Inaktivität. - + Check for updates Auf Aktualisierungen überprüfen - + Whether or not to check for updates upon startup. Ob nach Aktualisierungen während des Startens gesucht werden soll. - + Enable Gamemode Spielmodus aktivieren - + Force X11 as Graphics Backend X11 als Grafik-Backend erzwingen - + Custom frontend Benutzerdefiniertes Frontend - + Real applet Echtes Applet - - + + Disabled Deaktiviert - + Never Niemals - + On Load Beim Laden - + Always Immer - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asynchron - + Uncompressed (Best quality) Unkomprimiert (Beste Qualität) - + BC1 (Low quality) BC1 (Niedrige Qualität) - + BC3 (Medium quality) BC3 (Mittlere Qualität) - - + + Auto Auto - + 30 FPS 30 BpS - + 60 FPS 60 BpS - + 90 FPS 90 BpS - + 120 FPS 120 BpS - + Conservative Konservativ - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembler-Shader, nur NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (experimentell, nur AMD/Mesa) - + Null Null - + Fast Schnell - - - + + + Accurate Akkurat - - - + + + Default Vorgabe - + Unsafe (fast) Unsicher (schnell) - + Safe (stable) Sicher (stabil) - + Immediate Direkt - + Balanced Ausgeglichen - + Unsafe Unsicher - + Paranoid (disables most optimizations) Paranoid (deaktiviert die meisten Optimierungen) - + Debugging Fehlerbehebung - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Rahmenloses Fenster - + Exclusive Fullscreen Exklusiver Vollbildmodus - + No Video Output Keine Videoausgabe - + CPU Video Decoding CPU Video Dekodierung - + GPU Video Decoding (Default) GPU Video Dekodierung (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5X (360p/540p) [EXPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75X (540p/810p) [EXPERIMENTELL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1,5X (1080p/1620p) [EXPERIMENTELL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest-Neighbor - + Bilinear Bilinear - + Bicubic Bikubisch - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super-Auflösung - + Area Bereich - + MMPX MMPX - + Zero-Tangent Nulltangente - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Spiel-Superauflösung - + Snapdragon Game Super Resolution EdgeDir Snapdragon Spiel-Superauflösung EdgeDir - + None Keiner - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Vorgabe (16:9) - + Force 4:3 4:3 erzwingen - + Force 21:9 21:9 erzwingen - + Force 16:10 16:10 erzwingen - + Stretch to Window Auf Fenster anpassen - + Automatic Automatisch - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japanisch (日本語) - + American English Amerikanisches Englisch - + French (français) Französisch (français) - + German (Deutsch) Deutsch (German) - + Italian (italiano) Italienisch (italiano) - + Spanish (español) Spanisch (español) - + Chinese Chinesisch - + Korean (한국어) Koreanisch (한국어) - + Dutch (Nederlands) Niederländisch (Nederlands) - + Portuguese (português) Portugiesisch (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanesisch - + British English Britisches Englisch - + Canadian French Kanadisches Französisch - + Latin American Spanish Lateinamerikanisches Spanisch - + Simplified Chinese Vereinfachtes Chinesisch - + Traditional Chinese (正體中文) Traditionelles Chinesisch (正體中文) - + Brazilian Portuguese (português do Brasil) Brasilianisches Portugiesisch (português do Brasil) - + Polish (polska) Polnisch (Polen) - + Thai (แบบไทย) Thailändisch (Thailändische Version) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatisch (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Ägypten - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkei - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Vorgabe) - + 6GB DRAM (Unsafe) 6GB DRAM (Unsicher) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Unsicher) - + 12GB DRAM (Unsafe) 12GB DRAM (Unsicher) - + Docked Angedockt - + Handheld Handgerät - - + + Normal Normal - - + + Boost Beschleunigung - - + + Overclock Übertaktung - + Always ask (Default) Immer fragen (Vorgabe) - + Only if game specifies not to stop Nur wenn ein Spiel vorgibt, nicht zu stoppen - + Never ask Niemals fragen - + Very Small (16 MB) Sehr klein (16 MB) - + Small (32 MB) Klein (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Groß (256 MB) - + Very Large (512 MB) Sehr groß (512 MB) - + Very Low (4 MB) Sehr niedrig (4 MB) - + Low (8 MB) Niedrig (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Mittel (32 MB) - + High (64 MB) Hoch (64 MB) - + Very Low (32) Sehr niedrig (32) - + Low (64) Niedrig (64) - + Normal (128) Normal (128) - + Medium (256) Mittel (256) - + High (512) Hoch (512) - + ExtendedDynamicState 1 ErweiterterDynamischerZustand 1 - + ExtendedDynamicState 2 ErweiterterDynamischerZustand 2 - + ExtendedDynamicState 3 ErweiterterDynamischerZustand 3 - + Tree View Baumansicht - + Grid View Rasteransicht diff --git a/dist/languages/el.ts b/dist/languages/el.ts index b269f194ea..b3ec9c6f5e 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -696,12 +696,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -709,79 +729,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: Ανισοτροπικό Φιλτράρισμα: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -790,1301 +810,1290 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Περιφέρεια: - + The region of the console. - + Time Zone: Ζώνη Ώρας: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Απόκρυψη δρομέα ποντικιού στην αδράνεια - + Hides the mouse after 2.5s of inactivity. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - - + + Disabled - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto Αυτόματη - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate Ακριβής - - - + + + Default Προεπιλεγμένο - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Επισφαλής - + Paranoid (disables most optimizations) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Παραθυροποιημένο Χωρίς Όρια - + Exclusive Fullscreen Αποκλειστική Πλήρης Οθόνη - + No Video Output Χωρίς Έξοδο Βίντεο - + CPU Video Decoding Αποκωδικοποίηση Βίντεο CPU - + GPU Video Decoding (Default) Αποκωδικοποίηση Βίντεο GPU (Προεπιλογή) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ΠΕΙΡΑΜΑΤΙΚΟ] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor Πλησιέστερος Γείτονας - + Bilinear Διγραμμικό - + Bicubic Δικυβικό - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Κανένα - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Προεπιλογή (16:9) - + Force 4:3 Επιβολή 4:3 - + Force 21:9 Επιβολή 21:9 - + Force 16:10 Επιβολή 16:10 - + Stretch to Window Επέκταση στο Παράθυρο - + Automatic Αυτόματα - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Ιαπωνικά (日本語) - + American English - + French (français) Γαλλικά (Français) - + German (Deutsch) Γερμανικά (Deutsch) - + Italian (italiano) Ιταλικά (Italiano) - + Spanish (español) Ισπανικά (Español) - + Chinese Κινέζικα - + Korean (한국어) Κορεάτικα (한국어) - + Dutch (Nederlands) Ολλανδικά (Nederlands) - + Portuguese (português) Πορτογαλικά (Português) - + Russian (Русский) Ρώσικα (Русский) - + Taiwanese Ταϊβανέζικα - + British English Βρετανικά Αγγλικά - + Canadian French Καναδικά Γαλλικά - + Latin American Spanish Λατινοαμερικάνικα Ισπανικά - + Simplified Chinese Απλοποιημένα Κινέζικα - + Traditional Chinese (正體中文) Παραδοσιακά Κινέζικα (正體中文) - + Brazilian Portuguese (português do Brasil) Πορτογαλικά Βραζιλίας (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Ιαπωνία - + USA ΗΠΑ - + Europe Ευρώπη - + Australia Αυστραλία - + China Κίνα - + Korea Κορέα - + Taiwan Ταϊβάν - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET CET - + CST6CDT CST6CDT - + Cuba Κούβα - + EET EET - + Egypt Αίγυπτος - + Eire - + EST EST - + EST5EDT EST5EDT - + GB - + GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Γκρήνουιτς - + Hongkong Χονγκ Κονγκ - + HST HST - + Iceland Ισλανδία - + Iran Ιράν - + Israel Ισραήλ - + Jamaica Ιαμαϊκή - + Kwajalein - + Libya Λιβύη - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Ναβάχο - + NZ - + NZ-CHAT - + Poland Πολωνία - + Portugal Πορτογαλία - + PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Σιγκαπούρη - + Turkey Τουρκία - + UCT UCT - + Universal Παγκόσμια - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu - + Mono Μονοφωνικό - + Stereo Στέρεοφωνικό - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/es.ts b/dist/languages/es.ts index c565dc17f2..8cda19bc6b 100644 --- a/dist/languages/es.ts +++ b/dist/languages/es.ts @@ -730,12 +730,32 @@ El modo agresivo puede afectar al rendimiento de otras aplicaciones, como a los Omite ciertas invalidaciones de caché durante las actualizaciones de memoria, reduciendo el uso de la CPU y mejorando la latencia. Esto puede causar bloqueos leves. - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: Modo VSync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -746,12 +766,12 @@ Mailbox ofrece menor latencia que FIFO y evita el tearing, aunque puede perder a Immediate (sin sincronización) muestra los fotogramas tan pronto están disponibles, pero puede generar desgarros de imagen. - + Sync Memory Operations Sincronizar operaciones de memoria - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -760,56 +780,56 @@ Esta opción arregla errores en los juegos, pero puede afectar negativamente al Los juegos con Unreal Engine 4 son con frecuencia los que muestran cambios significantes en esto. - + Enable asynchronous presentation (Vulkan only) Activar presentación asíncrona (solo Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Mejora el rendimiento ligeramente al usar un hilo de CPU adicional para la presentación. - + Force maximum clocks (Vulkan only) Forzar relojes al máximo (solo Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Ejecuta los procesos en segundo plano mientras se espera a las instrucciones gráficas para evitar que la GPU reduzca su velocidad de reloj. - + Anisotropic Filtering: Filtrado anisotrópico: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Controla la calidad del renderizado de texturas en ángulos oblicuos. Es seguro configurarlo en 16x en la mayoría de las GPU. - + GPU Mode: Modo de la GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Precisión de DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -818,12 +838,12 @@ Inseguro es más rápido, mientras que seguro es más estable y puede solucionar Predeterminado sigue el ajuste de la precisión de GPU. - + GPU Fence Behavior: Comportamiento de vallado de la GPU: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -832,44 +852,44 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation Activa la compilación de shaders asincrónicos - + May reduce shader stutter. Puede reducir los tirones causados por la carga de sombreadores. - + GPU Clocks Relojes de GPU - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle Desentrelazado de la GPU - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Acelera la decodificación de texturas 3D BCn mediante computación de la GPU. Desactívela si experimenta problemas o fallos gráficos. - + GPU Unswizzle Max Texture Size Tamaño máximo de textura de desentrelazado de la GPU - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -878,46 +898,46 @@ Aunque la GPU es más rápida para texturas medianas y grandes, la CPU puede ser Ajuste este valor para encontrar el equilibrio entre la aceleración de la GPU y la sobrecarga de la CPU. - + GPU Unswizzle Stream Size Tamaño del flujo de desentrelazado de la GPU - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Establece la cantidad máxima de datos de textura (en MiB) procesados ​​por cada fotograma. Valores más altos pueden reducir la distorsión durante la carga de texturas, pero pueden afectar a la consistencia de los fotogramas. - + GPU Unswizzle Chunk Size Tamaño del trozo de desentrelazado de la GPU - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Determina la cantidad de cortes de profundidad procesados ​​en un solo envío. Aumentar este valor puede mejorar el rendimiento en una GPU de gama alta, pero puede causar tirones y problemas en los tiempos de respuesta en hardware más modesto. - + Use Vulkan pipeline cache Usar caché de canalización de Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Activa la caché de canalización específica del fabricante. Esta opción puede mejorar los tiempos de cargas de sombreadores en el caso de que el controlador de Vulkan no lo almacene internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Activar la canalizaciones de cómputo (solo Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -926,194 +946,182 @@ Este ajuste solo existe para los controladores propietarios de Intel y puede cau En los demás controladores, la canalización de cómputo siempre está activada. - + Enable Reactive Flushing Activar limpieza reactiva - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa limpieza de memoria reactiva en vez de predictiva, permitiendo una sincronización de memoria más precisa. - + Sync to framerate of video playback Sincronizar a fotogramas de reproducción de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Ejecuta el juego a velocidad normal durante la reproducción de vídeos, incluso cuando no hay límite de fotogramas. - + Barrier feedback loops Bucles de feedback de barrera - + Improves rendering of transparency effects in specific games. Mejora la renderización de los efectos de transparencia en ciertos juegos. - + Enable buffer history Activar el historial del búfer - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Habilita el acceso a estados de búfer anteriores. Esta opción puede mejorar la calidad de renderizado y la consistencia en el rendimiento de algunos juegos. - + Fix bloom effects Arreglar efectos de resplandor - + Removes bloom in Burnout. Elimina el resplandor en Burnout. - - Enable Legacy Rescale Pass - Activar el pase de reescalado heredado - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - Puede arreglar los problemas de reescalado en algunos juegos confiando en el comportamiento de la implementación anterior. -Solución alternativa de comportamiento heredado que corrige los artefactos de línea de la GPU AMD y el parpadeo de texturas gris de la GPU Nvidia en Luigis Mansion 3. - - - + Extended Dynamic State Estado dinámico extendido - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Controla el número de funciones que pueden ser usadas en el Estado Dinámico Extendido. Números más altos permiten úsar más funciones y pueden aumentar el rendimiento, pero tambén pueden causar errores gráficos. - + Vertex Input Dynamic State Estado dinámico de entrada de vértices - + Enables vertex input dynamic state feature for better quality and performance. Activa la función de estado dinámico de entrada de vértices para una mejor calidad y rendimiento. - + Sample Shading Sombreado de muestra - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permite que el sombreador de fragmentos se ejecute por muestra en un fragmento multimuestreado, en lugar de una sola vez por fragmento. Mejora la calidad de los gráficos a costa de rendimiento. Los valores más altos mejoran la calidad, pero reducen el rendimiento. - + RNG Seed Semilla de GNA - + Controls the seed of the random number generator. Mainly used for speedrunning. Controla la semilla del generador de números aleatorios. Usado principalmente para speedrunning. - + Device Name Nombre del dispositivo - + The name of the console. El nombre de la consola - + Homebrew Args Argumentos Homebrew - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Argumentos en la línea de comandos pasados al homebrew al ser lanzado (p.e. -noglsl). - + Custom RTC Date: Fecha Personalizada RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Esta opción permite cambiar el reloj de la consola. Puede ser usado para manipular el tiempo en juegos. - + The number of seconds from the current unix time Número de segundos de la hora actual de Unix - + Language: Idioma: - + This option can be overridden when region setting is auto-select Esta opción puede ser reemplazada cuando la configuración de región está en selección automática. - + Region: Región: - + The region of the console. La Región de la Consola. - + Time Zone: Zona horaria: - + The time zone of the console. La zona horaria de la consola. - + Sound Output Mode: Método de salida de sonido: - + Console Mode: Modo consola: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1122,1025 +1130,1025 @@ Los juegos cambiarán su resolución, detalles y compatibilidad con los mandos s Configurar el modo portátil puede mejorar el rendimiento en sistemas de gama baja. - + Prompt for user profile on boot Solicitud para perfil de usuario al arrancar - + Useful if multiple people use the same PC. Útil si múltiples personas usan la misma PC - + Pause when not in focus Pausar cuando la ventana no esté activa - + Pauses emulation when focusing on other windows. Pausa la emulación cuando otra ventana diferente está activa. - + Confirm before stopping emulation Confirmar detención - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Anula las solicitudes de confirmación para detener la emulación. Al habilitar esta opción, se omiten dichas solicitudes y se sale directamente de la emulación. - + Hide mouse on inactivity Ocultar el cursor por inactividad. - + Hides the mouse after 2.5s of inactivity. Oculta el mouse después de 2.5s de inactividad. - + Check for updates Buscar actualizaciones - + Whether or not to check for updates upon startup. Si se deben buscar actualizaciones al iniciar o no. - + Enable Gamemode Activar Modo Juego - + Force X11 as Graphics Backend Forzar X11 como motor gráfico - + Custom frontend Interfaz personalizada - + Real applet Applet real - - + + Disabled Desactivado - + Never Nunca - + On Load Al cargar - + Always Siempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU asíncrona - + Uncompressed (Best quality) Sin compresión (Mejor calidad) - + BC1 (Low quality) BC1 (Calidad baja) - + BC3 (Medium quality) BC3 (Calidad media) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservativo - + Aggressive Agresivo - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Ensamblado de sombreadores, solo NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, solo AMD/Mesa) - + Null Ninguno - + Fast Rápido - - - + + + Accurate Preciso - - - + + + Default Predeterminado - + Unsafe (fast) Inseguro (rápido) - + Safe (stable) Seguro (estable) - + Immediate Inmediato - + Balanced Balanceado - + Unsafe Impreciso - + Paranoid (disables most optimizations) Paranoico (Deshabilita la mayoría de optimizaciones) - + Debugging Depuración - + Dynarmic DynARMic - + NCE NCE - + Borderless Windowed Ventana sin bordes - + Exclusive Fullscreen Pantalla completa - + No Video Output Sin salida de vídeo - + CPU Video Decoding Decodificación de vídeo en la CPU - + GPU Video Decoding (Default) Decodificación de vídeo en GPU (Por defecto) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] x0,5 (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] x0,75 (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) x1 (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] x1,5 (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) x2 (1440p/2160p) - + 3X (2160p/3240p) x3 (2160p/3240p) - + 4X (2880p/4320p) x4 (2880p/4320p) - + 5X (3600p/5400p) x5 (3600p/5400p) - + 6X (4320p/6480p) x6 (4320p/6480p) - + 7X (5040p/7560p) x7 (5040p/7560p) - + 8X (5760p/8640p) x8 (5760p/8640p) - + Nearest Neighbor Vecino más próximo - + Bilinear Bilineal - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution Super Resolución AMD FidelityFX - + Area Área - + MMPX MMPX - + Zero-Tangent Tangente cero - + B-Spline Ranura B - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Super resolución de juego Snapdragon - + Snapdragon Game Super Resolution EdgeDir Filo direcorio de super resolución de juego Snapdragon - + None Ninguno - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Predeterminado (16:9) - + Force 4:3 Forzar 4:3 - + Force 21:9 Forzar 21:9 - + Force 16:10 Forzar 16:10 - + Stretch to Window Estirar a la ventana - + Automatic Automático - + 2x x2 - + 4x x4 - + 8x x8 - + 16x x16 - + Japanese (日本語) Japonés (日本語) - + American English Inglés estadounidense - + French (français) Francés (français) - + German (Deutsch) Alemán (deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Español - + Chinese Chino - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandés (nederlands) - + Portuguese (português) Portugués (português) - + Russian (Русский) Ruso (Русский) - + Taiwanese Taiwanés - + British English Inglés británico - + Canadian French Francés canadiense - + Latin American Spanish Español latinoamericano - + Simplified Chinese Chino simplificado - + Traditional Chinese (正體中文) Chino tradicional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugués brasileño (português do Brasil) - + Polish (polska) Polaco (polska) - + Thai (แบบไทย) Tailandés (แบบไทย) - - + + Japan Japón - + USA EEUU - + Europe Europa - + Australia Australia - + China China - + Korea Corea - + Taiwan Taiwán - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Predeterminada (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Irán - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turquía - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulú - + Mono Mono - + Stereo Estéreo - + Surround Envolvente - + 4GB DRAM (Default) 4GB DRAM (Por defecto) - + 6GB DRAM (Unsafe) 6GB DRAM (Inseguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Sobremesa - + Handheld Portátil - - + + Normal Normal - - + + Boost Impulso - - + + Overclock Overclock - + Always ask (Default) Preguntar siempre (Por defecto) - + Only if game specifies not to stop Solo si el juego pide no ser cerrado - + Never ask Nunca preguntar - + Very Small (16 MB) Muy pequeño (16 MB) - + Small (32 MB) Pequeño (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muy grande (512 MB) - + Very Low (4 MB) Muy bajo (4 MB) - + Low (8 MB) Bajo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muy bajo (32) - + Low (64) Bajo (64) - + Normal (128) Normal (128) - + Medium (256) Medio (256) - + High (512) Alto (512) - + ExtendedDynamicState 1 ModoDynamicoExtendido 1 - + ExtendedDynamicState 2 ModoDynamicoExtendido 2 - + ExtendedDynamicState 3 ModoDynamicoExtendido 3 - + Tree View Vista en árbol - + Grid View Vista en cuadrícula diff --git a/dist/languages/fi.ts b/dist/languages/fi.ts index 2873cb1c05..5b075f0b0e 100644 --- a/dist/languages/fi.ts +++ b/dist/languages/fi.ts @@ -696,12 +696,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -709,79 +729,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. - + Anisotropic Filtering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -790,1301 +810,1290 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: - + The region of the console. - + Time Zone: - + The time zone of the console. - + Sound Output Mode: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity - + Hides the mouse after 2.5s of inactivity. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - - + + Disabled - + Never - + On Load - + Always - + CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) - + BC3 (Medium quality) - - + + Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null - + Fast - - - + + + Accurate - - - + + + Default - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe - + Paranoid (disables most optimizations) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed - + Exclusive Fullscreen - + No Video Output - + CPU Video Decoding - + GPU Video Decoding (Default) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) - + 3X (2160p/3240p) - + 4X (2880p/4320p) - + 5X (3600p/5400p) - + 6X (4320p/6480p) - + 7X (5040p/7560p) - + 8X (5760p/8640p) - + Nearest Neighbor - + Bilinear - + Bicubic - + Gaussian - + Lanczos - + ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None - + FXAA - + SMAA - + Default (16:9) - + Force 4:3 - + Force 21:9 - + Force 16:10 - + Stretch to Window - + Automatic - + 2x - + 4x - + 8x - + 16x - + Japanese (日本語) - + American English - + French (français) - + German (Deutsch) - + Italian (italiano) - + Spanish (español) - + Chinese - + Korean (한국어) - + Dutch (Nederlands) - + Portuguese (português) - + Russian (Русский) - + Taiwanese - + British English - + Canadian French - + Latin American Spanish - + Simplified Chinese - + Traditional Chinese (正體中文) - + Brazilian Portuguese (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan - + USA - + Europe - + Australia - + China - + Korea - + Taiwan - + Auto (%1) Auto select time zone - + Default (%1) Default time zone - + CET - + CST6CDT - + Cuba - + EET - + Egypt - + Eire - + EST - + EST5EDT - + GB - + GB-Eire - + GMT - + GMT+0 - + GMT-0 - + GMT0 - + Greenwich - + Hongkong - + HST - + Iceland - + Iran - + Israel - + Jamaica - + Kwajalein - + Libya - + MET - + MST - + MST7MDT - + Navajo - + NZ - + NZ-CHAT - + Poland - + Portugal - + PRC - + PST8PDT - + ROC - + ROK - + Singapore - + Turkey - + UCT - + Universal - + UTC - + W-SU - + WET - + Zulu - + Mono - + Stereo - + Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked - + Handheld - - - - Normal - - - - - - Boost - - + Normal + + + + + + Boost + + + + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index 99f926752e..2f2ddd1481 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -729,12 +729,32 @@ Le mode agressif peut affecter les performances d’autres applications, comme l Ignore certaines invalidations de cache lors des mises à jour de la mémoire, réduisant l’utilisation du CPU et améliorant la latence. Cela peut provoquer des plantages légers. - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: Mode VSync : - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -745,12 +765,12 @@ Mailbox peut offrir une latence inférieure à FIFO et n’entraîne pas de déc Immediate (pas de synchronisation) affiche ce qui est disponible et peut provoquer du déchirement. - + Sync Memory Operations Synchroniser les opérations mémoire - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -759,68 +779,68 @@ Cette option corrige des problèmes dans les jeux, mais peut dégrader les perfo Les jeux Unreal Engine 4 sont souvent ceux qui bénéficient le plus de ce réglage. - + Enable asynchronous presentation (Vulkan only) Activer la présentation asynchrone (Vulkan uniquement) - + Slightly improves performance by moving presentation to a separate CPU thread. Améliore légèrement les performances en déplaçant la présentation vers un thread CPU séparé. - + Force maximum clocks (Vulkan only) Forcer la fréquence d'horloge maximale (Vulkan uniquement) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Les exécutions fonctionnent en arrière-plan en attendant les commandes graphiques pour empêcher le GPU de réduire sa vitesse de fréquence d'horloge. - + Anisotropic Filtering: Filtrage anisotropique : - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Contrôle la qualité du rendu des textures sous des angles obliques. Il est sûr de le régler à 16x sur la plupart des GPU. - + GPU Mode: Mode GPU : - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Précision du DMA : - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -829,89 +849,89 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation Activer la compilation asynchrone des shaders - + May reduce shader stutter. Peut réduire les saccades dues aux shaders. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Utiliser le cache de pipeline Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Active le cache de pipeline spécifique au fournisseur de GPU. Cette option peut améliorer considérablement le temps de chargement des shaders dans les cas où le pilote Vulkan ne stocke pas les fichiers de cache de pipeline en interne. - + Enable Compute Pipelines (Intel Vulkan Only) Activer les pipelines de calcul (Vulkan sur Intel uniquement) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -920,95 +940,84 @@ Ce réglage n’existe que pour les pilotes propriétaires Intel et peut provoqu Les pipelines de calcul sont toujours activés sur tous les autres pilotes. - + Enable Reactive Flushing Activer le Vidage Réactif - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Utilise une purge réactive au lieu d'une purge prédictive, permettant une synchronisation de la mémoire plus précise. - + Sync to framerate of video playback Synchro la fréquence d'image de la relecture du vidéo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Éxécuter le jeu à une vitesse normale pendant la relecture du vidéo, même-ci la fréquence d'image est dévérouillée. - + Barrier feedback loops Boucles de rétroaction de barrière - + Improves rendering of transparency effects in specific games. Améliore le rendu des effets de transparence dans des jeux spécifiques. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State État dynamique étendu - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading Échantillonnage de shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permet au shader de fragments de s’exécuter pour chaque échantillon dans un fragment multi-échantillonné, au lieu d’une seule fois par fragment. @@ -1016,96 +1025,96 @@ Améliore la qualité graphique au prix de performances réduites. Des valeurs plus élevées améliorent la qualité mais dégradent les performances. - + RNG Seed Seed RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Contrôle la graine du générateur de nombres aléatoires. Principalement utilisé pour le speedrun. - + Device Name Nom de l'appareil - + The name of the console. Nom de la console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Date RTC personnalisée : - + This option allows to change the clock of the console. Can be used to manipulate time in games. Cette option permet de modifier l’horloge de la console. Peut être utilisée pour manipuler le temps dans les jeux. - + The number of seconds from the current unix time Nombre de secondes écoulées depuis le 1er janvier 1970. - + Language: Langue : - + This option can be overridden when region setting is auto-select Cette option peut être remplacée lorsque la région est sur auto. - + Region: Région : - + The region of the console. Région de la console. - + Time Zone: Fuseau horaire : - + The time zone of the console. Fuseau horaire de la console. - + Sound Output Mode: Mode de sortie sonore : - + Console Mode: Mode console : - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1114,1026 +1123,1026 @@ Les jeux adaptent leur résolution, leurs paramètres graphiques et les manettes Passer en mode Portable peut améliorer les performances sur les systèmes peu puissants. - + Prompt for user profile on boot Choisir l’utilisateur au démarrage. - + Useful if multiple people use the same PC. Utile si plusieurs personnes utilisent le même PC. - + Pause when not in focus Pause lorsque la fenêtre n’est pas active. - + Pauses emulation when focusing on other windows. Met l’émulation en pause dès que l’utilisateur change de fenêtre. - + Confirm before stopping emulation Confirmer avant d'arrêter l'émulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Ignore les demandes de confirmation pour arrêter l’émulation. L’activer permet de contourner ces confirmations et de quitter directement l’émulation. - + Hide mouse on inactivity Cacher la souris en cas d'inactivité - + Hides the mouse after 2.5s of inactivity. Cache le curseur après 2,5 secondes d’inactivité. - + Check for updates Rechercher des mises à jours - + Whether or not to check for updates upon startup. Vérifier ou non les mises à jour au démarrage. - + Enable Gamemode Activer le mode jeu - + Force X11 as Graphics Backend Forcer X11 comme moteur graphique - + Custom frontend Interface personnalisée - + Real applet Applet réel - - + + Disabled Désactivé - + Never Jamais - + On Load Au chargement - + Always Toujours - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Asynchrone - + Uncompressed (Best quality) Non compressé (Meilleure qualité) - + BC1 (Low quality) BC1 (Basse qualité) - + BC3 (Medium quality) BC3 (Qualité moyenne) - - + + Auto Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Conservateur - + Aggressive Agressif - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Nul - + Fast Rapide - - - + + + Accurate Précis - - - + + + Default Par défaut - + Unsafe (fast) Insecure (rapide) - + Safe (stable) Sûr (stable) - + Immediate - + Balanced Moyen - + Unsafe Risqué - + Paranoid (disables most optimizations) Paranoïaque (désactive la plupart des optimisations) - + Debugging Débogage - + Dynarmic Dynamique - + NCE NCE - + Borderless Windowed Fenêtré sans bordure - + Exclusive Fullscreen Plein écran exclusif - + No Video Output Pas de sortie vidéo - + CPU Video Decoding Décodage Vidéo sur le CPU - + GPU Video Decoding (Default) Décodage Vidéo sur le GPU (par défaut) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPÉRIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPÉRIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1,25X (900p/1350p) [EXPÉRIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPÉRIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Plus proche voisin - + Bilinear Bilinéaire - + Bicubic Bicubique - + Gaussian Gaussien - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area (Par zone) - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Aucun - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Par défaut (16:9) - + Force 4:3 Forcer le 4:3 - + Force 21:9 Forcer le 21:9 - + Force 16:10 Forcer le 16:10 - + Stretch to Window Étirer à la fenêtre - + Automatic Automatique - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonais (日本語) - + American English Anglais Américain - + French (français) Français (français) - + German (Deutsch) Allemand (Deutsch) - + Italian (italiano) Italien (italiano) - + Spanish (español) Espagnol (español) - + Chinese Chinois - + Korean (한국어) Coréen (한국어) - + Dutch (Nederlands) Néerlandais (Nederlands) - + Portuguese (português) Portugais (português) - + Russian (Русский) Russe (Русский) - + Taiwanese Taïwanais - + British English Anglais Britannique - + Canadian French Français Canadien - + Latin American Spanish Espagnol d'Amérique Latine - + Simplified Chinese Chinois Simplifié - + Traditional Chinese (正體中文) Chinois Traditionnel (正體中文) - + Brazilian Portuguese (português do Brasil) Portugais Brésilien (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japon - + USA É.-U.A. - + Europe Europe - + Australia Australie - + China Chine - + Korea Corée - + Taiwan Taïwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Par défaut (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Égypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland Islande - + Iran Iran - + Israel Israël - + Jamaica Jamaïque - + Kwajalein Kwajalein - + Libya Libye - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Pologne - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapour - + Turkey Turquie - + UCT UCT - + Universal Universel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stéréo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Par défaut) - + 6GB DRAM (Unsafe) 6 GB DRAM (Risqué) - + 8GB DRAM 8GO DRAM - + 10GB DRAM (Unsafe) 10GO DRAM (Insecure) - + 12GB DRAM (Unsafe) 12GO DRAM (Insecure) - + Docked Mode TV - + Handheld Mode Portable - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Toujours demander (par défaut) - + Only if game specifies not to stop Uniquement si le jeu précise de ne pas s'arrêter - + Never ask Jamais demander - + Very Small (16 MB) Très petit (16Mo) - + Small (32 MB) Petit (32Mo) - + Normal (128 MB) Normal (128Mo) - + Large (256 MB) Large (256Mo) - + Very Large (512 MB) Très large (512Mo) - + Very Low (4 MB) Très faible (4 Mo) - + Low (8 MB) Faible (8 Mo) - + Normal (16 MB) Normal (16 Mo) - + Medium (32 MB) Moyen (32 Mo) - + High (64 MB) Élevé (64 Mo) - + Very Low (32) Très faible (32) - + Low (64) Faible (64) - + Normal (128) Normal (128) - + Medium (256) Moyen (256) - + High (512) Élevé (512) - + ExtendedDynamicState 1 État dynamique étendu 1 - + ExtendedDynamicState 2 État dynamique étendu 2 - + ExtendedDynamicState 3 État dynamique étendu 3 - + Tree View Vue en liste - + Grid View Vue en grille diff --git a/dist/languages/hu.ts b/dist/languages/hu.ts index a519b354b3..29ba70527e 100644 --- a/dist/languages/hu.ts +++ b/dist/languages/hu.ts @@ -702,12 +702,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: VSync mód: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -715,79 +735,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Aszinkron prezentálás engedélyezése (csak Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Kicsit javítja a teljesítményt azáltal, hogy a megjelenítést külön CPU szálra helyezi át. - + Force maximum clocks (Vulkan only) Maximális órajelek kényszerítése (csak Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. A háttérben fut, miközben várja a grafikai parancsokat, hogy a GPU ne csökkentse az órajelét. - + Anisotropic Filtering: Anizotropikus szűrés: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -796,1301 +816,1290 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Vulkan pipeline gyorsítótár használata. - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Reaktív ürítés használata - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Reaktív ürítést használ a prediktív ürítés helyett, ami pontosabb memóriaszinkronizálást tesz lehetővé. - + Sync to framerate of video playback Szinkronizálás a videolejátszás képkockasebességéhez - + Run the game at normal speed during video playback, even when the framerate is unlocked. A játék futtatása normál sebességgel videolejátszás közben, még akkor is, ha a képkockasebesség fel van oldva. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. Javítja az átlátszósági effektek megjelenítését bizonyos játékokban. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Eszköznév - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Egyéni RTC dátum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Nyelv: - + This option can be overridden when region setting is auto-select - + Region: Régió: - + The region of the console. - + Time Zone: Időzóna: - + The time zone of the console. - + Sound Output Mode: Hangkimeneti mód: - + Console Mode: Konzol mód: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Emuláció leállításának megerősítése - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Egér elrejtése inaktivitáskor - + Hides the mouse after 2.5s of inactivity. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Játékmód engedélyezése - + Force X11 as Graphics Backend - + Custom frontend Egyéni frontend - + Real applet Valódi applet - - + + Disabled - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU aszinkron - + Uncompressed (Best quality) Tömörítetlen (legjobb minőség) - + BC1 (Low quality) BC1 (alacsony minőség) - + BC3 (Medium quality) BC3 (közepes minőség) - - + + Auto Automatikus - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Takarékos - + Aggressive Aggresszív - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Pontos - - - + + + Default Alapértelmezett - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Nem biztonságos - + Paranoid (disables most optimizations) Paranoid (a legtöbb optimalizálást letiltja) - + Debugging - + Dynarmic Dinamikus - + NCE NCE - + Borderless Windowed Szegély nélküli ablak - + Exclusive Fullscreen Exkluzív teljes képernyő - + No Video Output Nincs videokimenet - + CPU Video Decoding CPU videódekódolás - + GPU Video Decoding (Default) GPU videódekódolás (alapértelmezett) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [KÍSÉRLETI] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [KÍSÉRLETI] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [KÍSÉRLETI] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Legközelebbi szomszéd - + Bilinear Bilineáris - + Bicubic Bikubikus - + Gaussian Gauss-féle - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nincs - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Alapértelmezett (16:9) - + Force 4:3 4:3 kényszerítése - + Force 21:9 21:9 kényszerítése - + Force 16:10 16:10 kényszerítése - + Stretch to Window Ablakhoz nyújtás - + Automatic Automatikus - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japán (日本語) - + American English Amerikai angol - + French (français) Francia (français) - + German (Deutsch) Német (Deutsch) - + Italian (italiano) Olasz (italiano) - + Spanish (español) Spanyol (español) - + Chinese Kínai - + Korean (한국어) Koreai (한국어) - + Dutch (Nederlands) Holland (Nederlands) - + Portuguese (português) Portugál (português) - + Russian (Русский) Orosz (Русский) - + Taiwanese Tajvani - + British English Brit Angol - + Canadian French Kanadai francia - + Latin American Spanish Latin-amerikai spanyol - + Simplified Chinese Egyszerűsített kínai - + Traditional Chinese (正體中文) Hagyományos kínai (正體中文) - + Brazilian Portuguese (português do Brasil) Brazíliai portugál (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japán - + USA USA - + Europe Európa - + Australia Ausztrália - + China Kína - + Korea Korea - + Taiwan Tajvan - + Auto (%1) Auto select time zone Automatikus (%1) - + Default (%1) Default time zone Alapértelmezett (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egyiptom - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Izland - + Iran Irán - + Israel Izrael - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navahó - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Lengyelország - + Portugal Portugália - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Szingapúr - + Turkey Törökország - + UCT UCT - + Universal Univerzális - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Sztereó - + Surround Térhangzás - + 4GB DRAM (Default) 4GB DRAM (Alapértelmezett) - + 6GB DRAM (Unsafe) 6GB DRAM (Nem biztonságos) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Dokkolt - + Handheld Kézi - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Mindig kérdezz rá (alapértelmezett) - + Only if game specifies not to stop Csak akkor, ha a játék kifejezetten kéri a folytatást. - + Never ask Soha ne kérdezz rá - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/id.ts b/dist/languages/id.ts index ab0fe1d8b8..7792d12f35 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -713,12 +713,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: Mode Sinkronisasi Vertikal - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -726,79 +746,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations Sinkronisasi Operasi Memori - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Aktifkan presentasi asinkron (hanya Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Meningkatkan kinerja sedikit dengan memindahkan presentasi ke thread CPU terpisah. - + Force maximum clocks (Vulkan only) Paksa jam maximum (Vulkan only) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Berjalan bekerja di latar belakang sambil menunggu perintah grafis untuk mencegah GPU agar tidak menurunkan kecepatan jamnya. - + Anisotropic Filtering: Anisotropic Filtering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: Mode GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Akurasi DMA - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -807,1302 +827,1291 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation Gunakan kompilasi shader asinkron - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Gunakan pipeline cache Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Memungkinkan cache pipeline spesifik vendor GPU. Opsi ini dapat meningkatkan waktu pemuatan shader secara signifikan dalam kasus di mana driver Vulkan tidak menyimpan file cache pipeline secara internal. - + Enable Compute Pipelines (Intel Vulkan Only) Aktifkan Pipa Komputasi (Hanya Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Aktifkan Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Menggunakan pemadatan reaktif alih-alih pemadatan prediktif, memungkinkan sinkronisasi memori yang lebih akurat. - + Sync to framerate of video playback Sinkronkan dengan kecepatan pemutaran video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Jalankan permainan dengan kecepatan normal selama pemutaran video, bahkan ketika framerate tidak terkunci. - + Barrier feedback loops Loop umpan balik penghalang - + Improves rendering of transparency effects in specific games. Meningkatkan rendering efek transparansi dalam game tertentu. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects Perbaiki efek bloom - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading Pencahayaan Sampel - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Benih RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Nama Perangkat - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Tanggal RTC Kustom: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Bahasa - + This option can be overridden when region setting is auto-select - + Region: Wilayah: - + The region of the console. - + Time Zone: Zona Waktu: - + The time zone of the console. - + Sound Output Mode: Mode keluaran suara. - + Console Mode: Mode Konsol - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Konfirmasi sebelum menghentikan emulasi - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Sembunyikan mouse saat tidak aktif - + Hides the mouse after 2.5s of inactivity. - + Check for updates Cek Pembaruan - + Whether or not to check for updates upon startup. - + Enable Gamemode Aktifkan Mode Permainan - + Force X11 as Graphics Backend - + Custom frontend Tampilan depan kustom - + Real applet Aplikasi nyata - - + + Disabled - + Never Tidak Pernah - + On Load - + Always Selalu - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU sinkron - + Uncompressed (Best quality) Tidak terkompresi (Kualitas Terbaik) - + BC1 (Low quality) BC1 (Kualitas rendah) - + BC3 (Medium quality) BC3 (Kualitas sedang) - - + + Auto Otomatis - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Konservatif - + Aggressive Agresif - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast Cepat - - - + + + Accurate Akurat - - - + + + Default Bawaan - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced Seimbang - + Unsafe Berbahaya - + Paranoid (disables most optimizations) Paranoid (menonaktifkan sebagian besar optimasi) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Layar Tanpa Batas - + Exclusive Fullscreen Layar Penuh Eksklusif - + No Video Output Tidak ada Keluaran Suara - + CPU Video Decoding Penguraian Video menggunakan CPU - + GPU Video Decoding (Default) Penguraian Video menggunakan GPU (Bawaan) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EKSPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EKSPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EKSPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Biliner - + Bicubic Bikubik - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Tak ada - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Bawaan (16:9) - + Force 4:3 Paksa 4:3 - + Force 21:9 Paksa 21:9 - + Force 16:10 Paksa 16:10 - + Stretch to Window Regangkan ke Layar - + Automatic Otomatis - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Jepang (日本語) - + American English Bahasa Inggris Amerika - + French (français) Prancis (français) - + German (Deutsch) Jerman (Deutsch) - + Italian (italiano) Italia (italiano) - + Spanish (español) Spanyol (español) - + Chinese Cina - + Korean (한국어) Korea (한국어) - + Dutch (Nederlands) Belanda (Nederlands) - + Portuguese (português) Portugis (português) - + Russian (Русский) Rusia (Русский) - + Taiwanese Taiwan - + British English Inggris Britania - + Canadian French Prancis Kanada - + Latin American Spanish Spanyol Amerika Latin - + Simplified Chinese Cina Sederhana - + Traditional Chinese (正體中文) Cina Tradisional (正體中文) - + Brazilian Portuguese (português do Brasil) Portugis Brazil (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Jepang - + USA USA - + Europe Eropa - + Australia Australia - + China Tiongkok - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Bawaan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Mesir - + Eire Éire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Éire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Israel - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polandia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turki - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Bawaan) - + 6GB DRAM (Unsafe) 6GB DRAM (Tidak Aman) - + 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Tidak Aman) - + 12GB DRAM (Unsafe) 12GB DRAM (Tidak Aman) - + Docked Terpasang - + Handheld Jinjing - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Selalu tanyakan (Bawaan) - + Only if game specifies not to stop Hanya jika permainan menentukan untuk tidak berhenti - + Never ask Jangan pernah bertanya - + Very Small (16 MB) Sangat Kecil (16 MB) - + Small (32 MB) Kecil (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Sedang (256) - + High (512) Tinggi (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/it.ts b/dist/languages/it.ts index 6315c384db..2cf9191129 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -730,12 +730,32 @@ La modalità aggressiva potrebbe impattare sulle prestazioni di altre applicazio Salta alcuni invalidamenti della cache durante gli aggiornamenti della memoria, riducendo l'uso della CPU e migliorando la latenza. Questo potrebbe causare soft-crash. - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: Modalità VSync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -746,12 +766,12 @@ Mailbox può avere una latenza minore di FIFO e non ha tearing ma potrebbe perde Immediate (no sincronizzazione) mostra tutto il disponibile, quindi anche tearing. - + Sync Memory Operations Sincronizza operazioni di memoria - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -760,68 +780,68 @@ Questa opzione dovrebbe risolvere problemi in alcuni giochi, ma potrebbe ridurre I giochi con Unreal Engine 4 sembrano essere i più colpiti. - + Enable asynchronous presentation (Vulkan only) Abilita la presentazione asincrona (solo Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Migliora di poco le prestazioni spostando la presentazione su un thread della CPU separato. - + Force maximum clocks (Vulkan only) Forza clock massimi (solo Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Esegue del lavoro in background durante l'attesa dei comandi grafici per evitare che la GPU diminuisca la sua velocità di clock. - + Anisotropic Filtering: Filtro anisotropico: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Controlla la qualità del rendering delle texture negli angoli obliqui. Si può utilizzare in modo sicuro al 16x su quasi tutte le GPU. - + GPU Mode: Modalità GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Precisione DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -830,89 +850,89 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation Abilita la compilazione asincrona degli shader - + May reduce shader stutter. Può ridurre i fenomeni di stuttering (scatti) causati dagli shader. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Usa la cache delle pipeline di Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Abilita la cache delle pipeline specifica del produttore della GPU. Quest'opzione può ridurre di molto i tempi di caricamento degli shader nei casi in cui il driver Vulkan non memorizza la cache delle pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Abilita le compute pipeline (solo per Vulkan su Intel) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -921,192 +941,181 @@ Quest'impostazione esiste solo per i driver proprietari Intel e potrebbe fa Le compute pipelines sono sempre attivate su tutti gli altri drivers. - + Enable Reactive Flushing Abilita il flushing reattivo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Utilizza il flushing reattivo invece di quello predittivo, al fine di ottenere una sincronizzazione della memoria più accurata. - + Sync to framerate of video playback Sincronizza il framerate a quello del video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Esegue il gioco a velocità normale durante le cutscene, anche quando il framerate è sbloccato. - + Barrier feedback loops Barrier feedback loops - + Improves rendering of transparency effects in specific games. Migliora il rendering degli effetti di trasparenza in alcuni giochi. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State Stato dinamico esteso - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Controlla il numero di funzionalità che possono essere usate con lo stato dinamico esteso. Gli stati più alti consentono più funzionalità e possono migliorare le prestazioni, ma possono causare ulteriori problemi grafici. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading Sample shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permette al fragment shader di eseguire per campione in un frammento multi-campione invece che una volta per frammento. Migliora la qualità grafica a scapito delle prestazioni. Alti valori migliorano la qualità ma peggiorano le prestazioni. - + RNG Seed Seed RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Controlla il seme del generatore di numeri casuali. Principalmente utilizzato per le speedrun. - + Device Name Nome del dispositivo - + The name of the console. Il nome della console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Data RTC personalizzata: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Quest'opzione permette di modificare l'orologio della console. Può essere usato per manipolare il tempo nei giochi. - + The number of seconds from the current unix time Il numero di secondi dal tempo Unix attuale - + Language: Lingua: - + This option can be overridden when region setting is auto-select Può essere rimpiazzato se il fuso orario della Regione è impostato su Auto - + Region: Regione: - + The region of the console. La regione della console. - + Time Zone: Fuso orario: - + The time zone of the console. Il fuso orario della console. - + Sound Output Mode: Modalità di output del suono: - + Console Mode: Modalità console: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1115,1026 +1124,1026 @@ I giochi ne terranno conto e modificheranno la risoluzione, i dettagli e i contr Impostare l'opzione su "Portatile" può aiutare a migliorare le prestazioni sui sistemi meno potenti. - + Prompt for user profile on boot Scegli il profilo utente all'avvio - + Useful if multiple people use the same PC. Utile se più persone utilizzano lo stesso PC. - + Pause when not in focus Metti in pausa quando la finestra non è in primo piano - + Pauses emulation when focusing on other windows. Mette in pausa l'emulazione quando altre finestre sono in primo piano. - + Confirm before stopping emulation Chiedi conferma prima di arrestare l'emulazione - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Sovrascrive le richieste di conferma per fermare l'emulazione. Abilitarla bypassa queste richieste e l'emulazione cesserà immediatamente. - + Hide mouse on inactivity Nascondi il puntatore del mouse se inattivo - + Hides the mouse after 2.5s of inactivity. Nasconde il mouse dopo 2,5 secondi di inattività. - + Check for updates Controlla la presenza di aggiornamenti - + Whether or not to check for updates upon startup. Determina se controllare o meno la presenza di aggiornamenti all'avvio. - + Enable Gamemode Abilita Gamemode - + Force X11 as Graphics Backend Forza l'uso del back-end grafico X11 - + Custom frontend Frontend personalizzato - + Real applet Applet reale - - + + Disabled Disabilitato - + Never Mai - + On Load Al caricamento - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU (Asincrono) - + Uncompressed (Best quality) Nessuna compressione (qualità migliore) - + BC1 (Low quality) BC1 (qualità bassa) - + BC3 (Medium quality) BC3 (qualità media) - - + + Auto Automatico - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservativa - + Aggressive Aggressiva - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (shader assembly, solo NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (sperimentale, solo AMD/MESA) - + Null Nullo - + Fast Veloce - - - + + + Accurate Accurata - - - + + + Default Predefinito - + Unsafe (fast) Non sicuro (veloce) - + Safe (stable) Sicuro (stabile) - + Immediate - + Balanced Bilanciata - + Unsafe Non sicura - + Paranoid (disables most optimizations) Paranoica (disabilita la maggior parte delle ottimizzazioni) - + Debugging Debug - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Finestra senza bordi - + Exclusive Fullscreen Schermo intero esclusivo - + No Video Output Nessun output video - + CPU Video Decoding Decodifica video CPU - + GPU Video Decoding (Default) Decodifica video GPU (predefinita) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [SPERIMENTALE] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [SPERIMENTALE] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [SPERIMENTALE] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [SPERIMENTALE] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [SPERIMENTALE] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest neighbor - + Bilinear Bilineare - + Bicubic Bicubico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nessuna - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Predefinito (16:9) - + Force 4:3 Forza 4:3 - + Force 21:9 Forza 21:9 - + Force 16:10 Forza 16:10 - + Stretch to Window Allunga a finestra - + Automatic Automatico - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Giapponese (日本語) - + American English Inglese americano - + French (français) Francese (français) - + German (Deutsch) Tedesco (Deutsch) - + Italian (italiano) Italiano - + Spanish (español) Spagnolo (español) - + Chinese Cinese - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Olandese (Nederlands) - + Portuguese (português) Portoghese (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanese - + British English Inglese britannico - + Canadian French Francese canadese - + Latin American Spanish Spagnolo latino-americano - + Simplified Chinese Cinese semplificato - + Traditional Chinese (正體中文) Cinese tradizionale (正體中文) - + Brazilian Portuguese (português do Brasil) Portoghese brasiliano (português do Brasil) - + Polish (polska) Polacco (polska) - + Thai (แบบไทย) Thailandese (แบบไทย) - - + + Japan Giappone - + USA USA - + Europe Europa - + Australia Australia - + China Cina - + Korea Corea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Automatico (%1) - + Default (%1) Default time zone Predefinito (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egitto - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islanda - + Iran Iran - + Israel Israele - + Jamaica Giamaica - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polonia - + Portugal Portogallo - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turchia - + UCT UCT - + Universal Universale - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Predefinito) - + 6GB DRAM (Unsafe) 6GB DRAM (Non sicuro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Non sicuro) - + 12GB DRAM (Unsafe) 12GB DRAM (Non sicuro) - + Docked Dock - + Handheld Portatile - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Chiedi sempre (Predefinito) - + Only if game specifies not to stop Solo se il gioco richiede di non essere arrestato - + Never ask Non chiedere mai - + Very Small (16 MB) Molto piccola (16 MB) - + Small (32 MB) Piccola (32 MB) - + Normal (128 MB) Normale (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Molto grande (512 MB) - + Very Low (4 MB) Molto bassa (4 MB) - + Low (8 MB) Bassa (8 MB) - + Normal (16 MB) Normale (16 MB) - + Medium (32 MB) Media (32 MB) - + High (64 MB) Alta (64 MB) - + Very Low (32) Molto basso (32) - + Low (64) Basso (64) - + Normal (128) Normale (128) - + Medium (256) Medio (256) - + High (512) Alto (512) - + ExtendedDynamicState 1 Stato dinamico esteso 1 - + ExtendedDynamicState 2 Stato dinamico esteso 2 - + ExtendedDynamicState 3 Stato dinamico esteso 3 - + Tree View Vista ad albero - + Grid View Vista a griglia diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index c7eb268ca0..2341618395 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -696,12 +696,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: 垂直同期: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -712,79 +732,79 @@ Mailbox は FIFO よりも遅延が小さくティアリングがありません Immediate (no synchronization) は表示可能なものをすべて表示し, ティアリング発生の可能性があります. - + Sync Memory Operations メモリ操作の同期 - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) 非同期プレゼンテーション (Vulkan のみ) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) 最大クロック強制 (Vulkan のみ) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. GPUのクロックスピードを下げないように、グラフィックコマンドを待っている間、バックグラウンドで作業を実行させます。 - + Anisotropic Filtering: 異方性フィルタリング: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: GPUモード: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: DMA精度: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -793,1301 +813,1290 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Vulkan パイプラインキャッシュを使用 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) コンピュート・パイプラインの有効化(インテル Vulkan のみ) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback ビデオ再生のフレームレートに同期する - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. 特定のゲームにおける透明エフェクトのレンダリングを改善します。 - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed 乱数シード値の変更 - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name デバイス名 - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: 言語: - + This option can be overridden when region setting is auto-select - + Region: 地域: - + The region of the console. - + Time Zone: タイムゾーン: - + The time zone of the console. - + Sound Output Mode: 音声出力モード: - + Console Mode: コンソールモード: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation エミュレーションを停止する前に確認する - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity 非アクティブ時にマウスカーソルを隠す - + Hides the mouse after 2.5s of inactivity. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - - + + Disabled 無効 - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 非同期 - + Uncompressed (Best quality) 圧縮しない (最高品質) - + BC1 (Low quality) BC1 (低品質) - + BC3 (Medium quality) BC3 (中品質) - - + + Auto 自動 - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (アセンブリシェーダー、NVIDIA のみ) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V(実験的、AMD/Mesaのみ) - + Null - + Fast - - - + + + Accurate 正確 - - - + + + Default デフォルト - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe 不安定 - + Paranoid (disables most optimizations) パラノイド (ほとんどの最適化を無効化) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed ボーダーレスウィンドウ - + Exclusive Fullscreen 排他的フルスクリーン - + No Video Output ビデオ出力しない - + CPU Video Decoding ビデオをCPUでデコード - + GPU Video Decoding (Default) ビデオをGPUでデコード (デフォルト) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [実験的] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [実験的] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [実験的] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area - + MMPX MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None なし - + FXAA FXAA - + SMAA SMAA - + Default (16:9) デフォルト (16:9) - + Force 4:3 強制 4:3 - + Force 21:9 強制 21:9 - + Force 16:10 強制 16:10 - + Stretch to Window ウィンドウに合わせる - + Automatic 自動 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日本語 - + American English アメリカ英語 - + French (français) フランス語 (français) - + German (Deutsch) ドイツ語 (Deutsch) - + Italian (italiano) イタリア語 (italiano) - + Spanish (español) スペイン語 (español) - + Chinese 中国語 - + Korean (한국어) 韓国語 (한국어) - + Dutch (Nederlands) オランダ語 (Nederlands) - + Portuguese (português) ポルトガル語 (português) - + Russian (Русский) ロシア語 (Русский) - + Taiwanese 台湾語 - + British English イギリス英語 - + Canadian French カナダフランス語 - + Latin American Spanish ラテンアメリカスペイン語 - + Simplified Chinese 簡体字中国語 - + Traditional Chinese (正體中文) 繁体字中国語 (正體中文) - + Brazilian Portuguese (português do Brasil) ブラジルポルトガル語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA アメリカ - + Europe ヨーロッパ - + Australia オーストラリア - + China 中国 - + Korea 韓国 - + Taiwan 台湾 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 既定 (%1) - + CET 中央ヨーロッパ時間 - + CST6CDT CST6CDT - + Cuba キューバ - + EET 東ヨーロッパ標準時 - + Egypt エジプト - + Eire アイルランド - + EST アメリカ東部標準時 - + EST5EDT EST5EDT - + GB GB - + GB-Eire イギリス-アイルランド - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich グリニッジ - + Hongkong 香港 - + HST ハワイ標準時 - + Iceland アイスランド - + Iran イラン - + Israel イスラエル - + Jamaica ジャマイカ - + Kwajalein クェゼリン - + Libya リビア - + MET 中東時間 - + MST MST - + MST7MDT MST7MDT - + Navajo ナバホ - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland ポーランド - + Portugal ポルトガル - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore シンガポール - + Turkey トルコ - + UCT UCT - + Universal ユニバーサル - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu ズールー - + Mono モノラル - + Stereo ステレオ - + Surround サラウンド - + 4GB DRAM (Default) 4GB DRAM (デフォルト) - + 6GB DRAM (Unsafe) 6GB DRAM (不安定) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld 携帯モード - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) 常に確認する (デフォルト) - + Only if game specifies not to stop ゲームが停止しないように指定しているときのみ - + Never ask 確認しない - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index a6d39cf213..c78a853a20 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -733,12 +733,32 @@ Aggressive mode may impact performance of other applications such as recording s 메모리 업데이트 중 특정 캐시 무효화를 건너뛰어 CPU 사용량을 줄이고 지연 시간을 개선합니다. 하지만 이로 인해 소프트 크래시가 발생할 수 있습니다. - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: 수직 동기화 모드: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -749,12 +769,12 @@ Mailbox는 FIFO보다 지연 시간이 짧고 화면 찢김 현상이 없지만 즉각적(동기화 없음)는 사용 가능한 모든 화면을 표시하며 화면 찢김 현상이 발생할 수 있습니다. - + Sync Memory Operations 메모리 작업 동기화 - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -763,44 +783,44 @@ Unreal Engine 4 games often see the most significant changes thereof. 대개 언리얼 엔진 4 게임에서 이러한 변경 사항이 가장 두드러지게 나타납니다. - + Enable asynchronous presentation (Vulkan only) 비동기 프레젠테이션 활성화(Vulkan 전용) - + Slightly improves performance by moving presentation to a separate CPU thread. 프레젠테이션을 별도의 CPU 스레드로 이동시켜 성능을 약간 향상시킵니다. - + Force maximum clocks (Vulkan only) 최대 클럭 강제 적용(Vulkan 전용) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. 그래픽 명령을 기다리는 동안 백그라운드에서 작업을 실행하여 GPU 클럭 속도가 저하되는 것을 방지합니다. - + Anisotropic Filtering: 비등방성 필터링: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. 비스듬한 각도에서의 텍스처 렌더링 품질을 제어합니다. 대부분의 GPU에서 16x로 설정해도 안전합니다. - + GPU Mode: GPU 모드: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -809,12 +829,12 @@ Particles tend to only render correctly with Accurate mode. 특히 조각들은 정확 모드에서만 제대로 렌더링되는 경향이 있습니다. - + DMA Accuracy: DMA 정확도: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -823,12 +843,12 @@ Default follows the GPU Accuracy setting. 기본값은 GPU 정확도 설정을 따릅니다. - + GPU Fence Behavior: GPU 펜스 동작: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -837,44 +857,44 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation 비동기 셰이더 컴파일 활성화 - + May reduce shader stutter. 셰이더 끊김 현상을 줄일 수 있습니다. - + GPU Clocks GPU 클럭 - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. 게임이 GPU 작업이 실제보다 더 빨리 완료된다고 착각하게 만들어, 스위치의 클럭 속도에 맞추기 위해 해상도와 렌더 거리를 낮추는 작업을 중단하게 합니다. - + GPU Unswizzle GPU 언스위즐 - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. GPU 컴퓨팅을 사용하여 BCn 3D 텍스처 디코딩을 가속화합니다. 충돌이나 그래픽 결함이 발생하는 경우 이 기능을 비활성화하세요. - + GPU Unswizzle Max Texture Size GPU 언스위즐 최대 텍스처 크기 - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -883,48 +903,48 @@ GPU는 중간 및 큰 크기의 텍스처에서 더 빠르지만, 매우 작은 이 값을 조정하여 GPU 가속과 CPU 오버헤드 간의 균형을 찾으세요. - + GPU Unswizzle Stream Size GPU 언스위즐 스트림 크기 - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. 프레임당 처리할 최대 텍스처 데이터 양(MiB 단위)을 설정합니다. 값이 높을수록 텍스처 로딩 중 끊김 현상을 줄일 수 있지만 프레임 일관성에 영향을 미칠 수 있습니다. - + GPU Unswizzle Chunk Size GPU 언스위즐 청크 크기 - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. 단일 디스패치에서 처리할 깊이 슬라이스 수를 결정합니다. 이 값을 높이면 고성능 GPU에서 처리량이 향상될 수 있지만, 성능이 낮은 하드웨어에서는 TDR 오류나 드라이버 시간 초과가 발생할 수 있습니다. - + Use Vulkan pipeline cache Vulkan 파이프라인 캐시 사용 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. GPU 제조사별 파이프라인 캐시를 활성화합니다. 이 옵션은 Vulkan 드라이버가 파이프라인 캐시 파일을 내부에 저장하지 않는 경우 셰이더 로딩 시간을 크게 향상시킬 수 있습니다. - + Enable Compute Pipelines (Intel Vulkan Only) 컴퓨트 파이프라인 활성화(인텔 Vulkan 전용) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -933,194 +953,182 @@ Compute pipelines are always enabled on all other drivers. 다른 모든 드라이버에서는 컴퓨트 파이프라인이 항상 활성화됩니다. - + Enable Reactive Flushing 반응형 플러싱 활성화 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 예측형 플러싱 대신 반응형 플러싱을 사용하여 보다 정확한 메모리 동기화를 가능하게 합니다. - + Sync to framerate of video playback 비디오 재생 프레임 속도에 동기화 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 프레임률 제한이 해제된 경우에도 비디오 재생 중에는 게임을 정상 속도로 실행합니다. - + Barrier feedback loops 피드백 루프 차단 - + Improves rendering of transparency effects in specific games. 특정 게임에서 투명 효과 렌더링을 개선합니다. - + Enable buffer history 버퍼 기록 활성화 - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. 이전 버퍼 상태에 접근할 수 있도록 합니다. 이 옵션은 일부 게임에서 렌더링 품질과 성능 일관성을 향상시킬 수 있습니다. - + Fix bloom effects 블룸 효과 수정 - + Removes bloom in Burnout. Burnout에서의 블룸 현상을 제거합니다. - - Enable Legacy Rescale Pass - 기존 크기 조정 무시 활성화 - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - 이전 구현의 동작을 활용하여 일부 게임에서 발생하는 크기 조정 문제를 해결할 수 있습니다. -루이지 맨션 3에서 발생했던 AMD 및 인텔 GPU의 선 아티팩트 현상과 Nvidia GPU의 회색 텍스처 깜빡임 현상을 해결하는 기존 반응에 대한 예비 해결책입니다. - - - + Extended Dynamic State 확장된 동적 상태 - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. 확장된 동적 상태에서 사용할 수 있는 기능의 수를 제어합니다. 상태 수가 많을수록 더 많은 기능을 사용할 수 있고 성능이 향상될 수 있지만, 추가적인 그래픽 문제가 발생할 수 있습니다. - + Vertex Input Dynamic State 정점 입력 동적 상태 - + Enables vertex input dynamic state feature for better quality and performance. 정점 입력의 동적 상태 기능을 활성화하여 품질과 성능을 향상시킵니다. - + Sample Shading 샘플 셰이딩 - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. 조각 셰이더가 다중샘플 조각에서 한 번당 한 조각이 아닌 샘플별로 실행될 수 있도록 합니다. 성능 저하를 감수하고 그래픽 품질을 향상시킵니다. 값이 높을수록 품질은 향상되지만 성능은 저하됩니다. - + RNG Seed RNG 시드 - + Controls the seed of the random number generator. Mainly used for speedrunning. 난수 생성기의 시드 값을 제어합니다. 주로 스피드런에 사용됩니다. - + Device Name 장치 이름 - + The name of the console. 콘솔의 이름 - + Homebrew Args 홈브루 인수 - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). 홈브루 실행 시 전달되는 명령줄 인수(예: -noglsl). - + Custom RTC Date: 사용자 지정 RTC 날짜: - + This option allows to change the clock of the console. Can be used to manipulate time in games. 이 옵션을 사용하면 콘솔의 시간을 변경할 수 있습니다. 게임 내 시간을 조작하는 데 사용할 수 있습니다. - + The number of seconds from the current unix time 현재 unix 시간으로부터 경과한 초 수 - + Language: 언어: - + This option can be overridden when region setting is auto-select 이 옵션은 지역 설정이 자동 선택으로 되어 있을 경우 번복될 수 있습니다. - + Region: 지역: - + The region of the console. 콘솔의 지역 - + Time Zone: 시간대: - + The time zone of the console. 콘솔의 시간대 - + Sound Output Mode: 소리 출력 모드: - + Console Mode: 콘솔 모드: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1129,1026 +1137,1026 @@ Setting to Handheld can help improve performance for low end systems. 휴대 모드로 설정하면 저사양 시스템의 성능을 향상시키는 데 도움이 될 수 있습니다. - + Prompt for user profile on boot 부팅 시 유저 프로필 입력 요청 - + Useful if multiple people use the same PC. 여러 사람이 같은 PC를 사용할 때 유용합니다. - + Pause when not in focus 초점이 맞지 않을 때 일시 중지 - + Pauses emulation when focusing on other windows. 다른 창에 초점을 맞출 때 에뮬레이션을 일시 중지합니다. - + Confirm before stopping emulation 에뮬레이션을 중지하기 전에 확인 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. 에뮬레이션 중지를 확인하는 메시지를 무시합니다. 이 옵션을 활성화하면 이러한 메시지를 건너뛰고 에뮬레이션을 바로 종료합니다. - + Hide mouse on inactivity 마우스 커서가 비활동 상태일 때 숨기기 - + Hides the mouse after 2.5s of inactivity. 마우스 커서가 2.5초 동안 활동이 없으면 숨깁니다. - + Check for updates 업데이트 확인 - + Whether or not to check for updates upon startup. 시작 시 업데이트를 확인할지 여부. - + Enable Gamemode 게임 모드 활성화 - + Force X11 as Graphics Backend X11을 그래픽 백엔드로 강제 설정 - + Custom frontend 사용자 정의 프론트엔드 - + Real applet 실제 애플릿 - - + + Disabled 비활성화됨 - + Never 안 함 - + On Load 로드 시 - + Always 항상 - + CPU CPU - + GPU GPU - + CPU Asynchronous 비동기 CPU - + Uncompressed (Best quality) 비압축(최고 품질) - + BC1 (Low quality) BC1(저품질) - + BC3 (Medium quality) BC3(중간 품질) - - + + Auto 자동 - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative 소극적 - + Aggressive 적극적 - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM(어셈블리 셰이더, NVIDIA 전용) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V(실험적, AMD/Mesa 전용) - + Null Null - + Fast 고속 - - - + + + Accurate 정확 - - - + + + Default 기본값 - + Unsafe (fast) 불안전(빠름) - + Safe (stable) 안전(안정적) - + Immediate 즉시 - + Balanced 균형 - + Unsafe 불안전 - + Paranoid (disables most optimizations) 편집증적(대부분의 최적화를 비활성화함) - + Debugging 디버깅 - + Dynarmic 동적 - + NCE NCE - + Borderless Windowed 테두리 없는 창 - + Exclusive Fullscreen 독점 전체 화면 - + No Video Output 비디오 출력 없음 - + CPU Video Decoding CPU 비디오 디코딩 - + GPU Video Decoding (Default) GPU 비디오 디코딩(기본값) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [실험적] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [실험적] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [실험적] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [실험적] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [실험적] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 최단입점 - + Bilinear 쌍선형 - + Bicubic 쌍입방 - + Gaussian 가우시안 - + Lanczos 란초스 - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area 영역 - + MMPX MMPX - + Zero-Tangent 제로탄젠트 - + B-Spline B-스플라인 - + Mitchell 미첼 - + Spline-1 스플라인-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None 없음 - + FXAA FXAA - + SMAA SMAA - + Default (16:9) 기본(16:9) - + Force 4:3 강제 4:3 - + Force 21:9 강제 21:9 - + Force 16:10 강제 16:10 - + Stretch to Window 화면 늘리기 - + Automatic 자동 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 일본어(日本語) - + American English 미국식 영어 - + French (français) 프랑스어(français) - + German (Deutsch) 독일어(Deutsch) - + Italian (italiano) 이탈리아어(italiano) - + Spanish (español) 스페인어(español) - + Chinese 중국어 - + Korean (한국어) 한국어(Korean) - + Dutch (Nederlands) 네덜란드어(Nederlands) - + Portuguese (português) 포르투갈어(português) - + Russian (Русский) 러시아어(Русский) - + Taiwanese 대만어 - + British English 영국식 영어 - + Canadian French 캐나다 프랑스어 - + Latin American Spanish 라틴아메리카 스페인어 - + Simplified Chinese 중국어 간체 - + Traditional Chinese (正體中文) 중국어 번체(正體中文) - + Brazilian Portuguese (português do Brasil) 브라질 포르투갈어(português do Brasil) - + Polish (polska) 폴란드어(polska) - + Thai (แบบไทย) 태국어(แบบไทย) - - + + Japan 일본 - + USA 미국 - + Europe 유럽 - + Australia 호주 - + China 중국 - + Korea 대한민국 - + Taiwan 대만 - + Auto (%1) Auto select time zone 자동(%1) - + Default (%1) Default time zone 기본(%1) - + CET CET - + CST6CDT CST6CDT - + Cuba 쿠바 - + EET EET - + Egypt 이집트 - + Eire 아일랜드 - + EST EST - + EST5EDT EST5EDT - + GB 영국 - + GB-Eire 영국-아일랜드 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 그리니치 - + Hongkong 홍콩 - + HST HST - + Iceland 아이슬란드 - + Iran 이란 - + Israel 이스라엘 - + Jamaica 자메이카 - + Kwajalein 콰잘레인 - + Libya 리비아 - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo 나바호 - + NZ 뉴질랜드 - + NZ-CHAT 뉴질랜드-채텀 - + Poland 폴란드 - + Portugal 포르투갈 - + PRC 중국 - + PST8PDT PST8PDT - + ROC 대만 - + ROK 대한민국 - + Singapore 싱가포르 - + Turkey 터키 - + UCT UCT - + Universal 세계 - + UTC UTC - + W-SU 모스크바 - + WET WET - + Zulu Zulu - + Mono 모노 - + Stereo 스테레오 - + Surround 서라운드 - + 4GB DRAM (Default) 4GB DRAM(기본값) - + 6GB DRAM (Unsafe) 6GB DRAM(불안전) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM(불안전) - + 12GB DRAM (Unsafe) 12GB DRAM(불안전) - + Docked 독 모드 - + Handheld 휴대 모드 - - + + Normal 보통 - - + + Boost 부스트 - - + + Overclock 오버클럭 - + Always ask (Default) 항상 묻기(기본값) - + Only if game specifies not to stop 게임에서 멈추지 말라고 명시한 경우에만 - + Never ask 절대 묻지 않음 - + Very Small (16 MB) 아주 작은 크기(16 MB) - + Small (32 MB) 작은 크기(32 MB) - + Normal (128 MB) 보통 크기(128 MB) - + Large (256 MB) 큰 크기(256 MB) - + Very Large (512 MB) 아주 큰 크기(512 MB) - + Very Low (4 MB) 매우 낮은 크기(4 MB) - + Low (8 MB) 낮은 크기(8 MB) - + Normal (16 MB) 보통 크기(16 MB) - + Medium (32 MB) 중간 크기(32 MB) - + High (64 MB) 높은 크기(64 MB) - + Very Low (32) 매우 낮은 크기(32) - + Low (64) 낮은 크기(64) - + Normal (128) 보통 크기(128) - + Medium (256) 보통(256) - + High (512) 빠름(512) - + ExtendedDynamicState 1 확장된 동적 상태 1 - + ExtendedDynamicState 2 확장된 동적 상태 2 - + ExtendedDynamicState 3 확장된 동적 상태 3 - + Tree View 트리 보기 - + Grid View 격자 보기 diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index 5e5edb0006..191099c395 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -696,12 +696,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: VSync-modus: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -709,79 +729,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Aktiver asynkron presentasjon (kun Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) Tving maksikal klokkehastighet (kun Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Kjører arbeid i bakgrunnen mens den venter på grafikkommandoer for å forhindre at GPU-en senker klokkehastigheten. - + Anisotropic Filtering: Anisotropisk filtrering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: GPU-modus: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: DMA-nøyaktighet: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -790,1301 +810,1290 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Bruk Vulkan-rørledningsbuffer - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Aktiver Reaktiv Tømming - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback Synkroniser med bildefrekvensen for videoavspilling - + Run the game at normal speed during video playback, even when the framerate is unlocked. Kjør spillet i normal hastighet under videoavspilling, selv når bildefrekvensen er låst opp. - + Barrier feedback loops Tilbakekoblingssløyfer for barrierer - + Improves rendering of transparency effects in specific games. Forbedrer gjengivelsen av transparenseffekter i spesifikke spill. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG-frø - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Enhetsnavn - + The name of the console. Konsollens navn. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Selvvalgt RTC-dato: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Språk: - + This option can be overridden when region setting is auto-select - + Region: Region: - + The region of the console. Konsollens region. - + Time Zone: Tidssone: - + The time zone of the console. Konsollens tidssone. - + Sound Output Mode: Lydutdatamodus: - + Console Mode: Konsollmodus: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Bekreft før stopping av emulering - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Gjem mus under inaktivitet - + Hides the mouse after 2.5s of inactivity. - + Check for updates Se etter oppdateringer - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - - + + Disabled Skrudd av - + Never Aldri - + On Load - + Always Alltid - + CPU CPU - + GPU Skjermkort - + CPU Asynchronous - + Uncompressed (Best quality) Ukomprimert (Best kvalitet) - + BC1 (Low quality) BC1 (Lav kvalitet) - + BC3 (Medium quality) BC3 (Middels kvalitet) - - + + Auto Auto - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (eksperimentelt, kun AMD/Mesa) - + Null Null - + Fast Rask - - - + + + Accurate Nøyaktig - - - + + + Default Standard - + Unsafe (fast) Utrygg (raskt) - + Safe (stable) Trygg (stabil) - + Immediate - + Balanced Balansert - + Unsafe Utrygt - + Paranoid (disables most optimizations) Paranoid (deaktiverer de fleste optimaliseringer) - + Debugging - + Dynarmic - + NCE NCE - + Borderless Windowed Rammeløst vindu - + Exclusive Fullscreen Eksklusiv fullskjerm - + No Video Output Ingen videoutdata - + CPU Video Decoding CPU-videodekoding - + GPU Video Decoding (Default) GPU-videodekoding (Standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0,25× (180p/270p) [EKSPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5× (360p/540p) [EKSPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0,75× (540p/810p) [EKSPERIMENTELL] - + 1X (720p/1080p) 1× (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1,25× (900p/1350p) [EKSPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1,5× (1080p/1620p) [EKSPERIMENTELL] - + 2X (1440p/2160p) 2× (1440p/2160p) - + 3X (2160p/3240p) 3× (2160p/3240p) - + 4X (2880p/4320p) 4× (2880p/4320p) - + 5X (3600p/5400p) 5× (3600p/5400p) - + 6X (4320p/6480p) 6× (4320p/6480p) - + 7X (5040p/7560p) 7× (5040p/7560p) - + 8X (5760p/8640p) 8× (5760p/8640p) - + Nearest Neighbor Nærmeste nabo - + Bilinear Bilineær - + Bicubic Bikubisk - + Gaussian Gaussisk - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Område - + MMPX MMPX - + Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tving 4:3 - + Force 21:9 Tving 21:9 - + Force 16:10 Tving 16:10 - + Stretch to Window Strekk til vinduet - + Automatic Automatisk - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japansk (日本語) - + American English Amerikansk engelsk - + French (français) Fransk (français) - + German (Deutsch) Tysk (Deutsch) - + Italian (italiano) Italiensk (italiano) - + Spanish (español) Spansk (español) - + Chinese Kinesisk - + Korean (한국어) Koreansk (한국어) - + Dutch (Nederlands) Nederlandsk (Nederlands) - + Portuguese (português) Portugisisk (português) - + Russian (Русский) Russisk (Русский) - + Taiwanese Taiwansk - + British English Britisk engelsk - + Canadian French Kanadisk fransk - + Latin American Spanish Latinamerikansk spansk - + Simplified Chinese Forenklet kinesisk - + Traditional Chinese (正體中文) Tradisjonell kinesisk (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisisk (português do Brasil) - + Polish (polska) Polsk (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australia - + China Folkerepublikken Kina - + Korea Korea - + Taiwan Taiwan (Republikken Kina) - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET Sentraleuropeisk tid - + CST6CDT CST6CDT - + Cuba Cuba - + EET Østeuropeisk tid - + Egypt Egypt - + Eire Republikken Irland - + EST EST - + EST5EDT EST5EDT - + GB Storbritannia - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC Folkerepublikken Kina - + PST8PDT PST8PDT - + ROC Taiwan (Republikken Kina) - + ROK Sør-Korea - + Singapore Singapore - + Turkey Tyrkia - + UCT UCT - + Universal Universalt - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (Standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (Utrygt) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (Utrygt) - + 12GB DRAM (Unsafe) 12 GB DRAM (Utrygt) - + Docked I dokking - + Handheld Håndholdt - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Spør alltid (Standard) - + Only if game specifies not to stop - + Never ask Aldri spør - + Very Small (16 MB) Veldig liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Veldig stor (512 MB) - + Very Low (4 MB) Veldig lav (4 MB) - + Low (8 MB) Lav (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Middels (32 MB) - + High (64 MB) Høy (64 MB) - + Very Low (32) Svært lav (32) - + Low (64) Lav (64) - + Normal (128) Normal (128) - + Medium (256) Middels (256) - + High (512) Høy (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index 296dd3ebca..8e99ce56d4 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -703,12 +703,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: VSync-modus: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -716,79 +736,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Schakel asynchrone presentatie in (alleen Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) Forceer maximale klokken (alleen Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Werkt op de achtergrond terwijl er wordt gewacht op grafische opdrachten om te voorkomen dat de GPU zijn kloksnelheid verlaagt. - + Anisotropic Filtering: Anisotrope Filtering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -797,1301 +817,1290 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Gebruik Vulkan-pijplijn-cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Schakel Reactive Flushing In - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback - + Run the game at normal speed during video playback, even when the framerate is unlocked. - + Barrier feedback loops - + Improves rendering of transparency effects in specific games. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed RNG Seed - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Apparaatnaam - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Aangepaste RTC Datum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Taal: - + This option can be overridden when region setting is auto-select - + Region: Regio: - + The region of the console. - + Time Zone: Tijdzone: - + The time zone of the console. - + Sound Output Mode: Geluidsuitvoermodus: - + Console Mode: Console Modus: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Bevestig voordat u de emulatie stopt - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Verberg muis wanneer inactief - + Hides the mouse after 2.5s of inactivity. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - - + + Disabled - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) - + BC1 (Low quality) BC1 (Lage Kwaliteit) - + BC3 (Medium quality) BC3 (Gemiddelde kwaliteit) - - + + Auto Auto - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Accuraat - - - + + + Default Standaard - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Onveilig - + Paranoid (disables most optimizations) Paranoid (schakelt de meeste optimalisaties uit) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Randloos Venster - + Exclusive Fullscreen Exclusief Volledig Scherm - + No Video Output Geen Video-uitvoer - + CPU Video Decoding CPU Videodecodering - + GPU Video Decoding (Default) GPU Videodecodering (Standaard) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTEEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTEEL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Geen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standaart (16:9) - + Force 4:3 Forceer 4:3 - + Force 21:9 Forceer 21:9 - + Force 16:10 Forceer 16:10 - + Stretch to Window Uitrekken naar Venster - + Automatic Automatisch - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japans (日本語) - + American English Amerikaans-Engels - + French (français) Frans (Français) - + German (Deutsch) Duits (Deutsch) - + Italian (italiano) Italiaans (italiano) - + Spanish (español) Spaans (Español) - + Chinese Chinees - + Korean (한국어) Koreaans (한국어) - + Dutch (Nederlands) Nederlands (Nederlands) - + Portuguese (português) Portugees (português) - + Russian (Русский) Russisch (Русский) - + Taiwanese Taiwanese - + British English Brits-Engels - + Canadian French Canadees-Frans - + Latin American Spanish Latijns-Amerikaans Spaans - + Simplified Chinese Vereenvoudigd Chinees - + Traditional Chinese (正體中文) Traditioneel Chinees (正體中文) - + Brazilian Portuguese (português do Brasil) Braziliaans-Portugees (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australië - + China China - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standaard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egypte - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Ijsland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libië - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkije - + UCT UCT - + Universal Universeel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/pl.ts b/dist/languages/pl.ts index 4b94ca5e55..28a51ae4f8 100644 --- a/dist/languages/pl.ts +++ b/dist/languages/pl.ts @@ -729,12 +729,32 @@ Tryb agresywny może pogorszyć działanie innych aplikacji, np. oprogramowania Pomija niektóre unieważnienia pamięci podręcznej po stronie CPU podczas aktualizacji pamięci, zmniejszając użycie CPU i poprawiając jego wydajność. Może powodować błędy lub awarie w niektórych grach. - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: Tryb synchronizacji pionowej: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -745,12 +765,12 @@ Mailbox może mieć niższe opóźnienia niż FIFO i nie powoduje tearingu, ale Immediate (bez synchronizacji) wyświetla wszystko, co jest dostępne, i może powodować tearing. - + Sync Memory Operations Synchronizuj operacje pamięci - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -758,68 +778,68 @@ Unreal Engine 4 games often see the most significant changes thereof. Gry z Unreal Engine 4 mogą być najbardziej dotknięte. - + Enable asynchronous presentation (Vulkan only) Włącz asynchroniczną prezentację (tylko Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Nieznacznie poprawia wydajność, przenosząc prezentację na oddzielny wątek CPU. - + Force maximum clocks (Vulkan only) Wymuś maksymalne zegary (Tylko Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Uruchamia pracę w tle podczas oczekiwania na komendy graficzne aby GPU nie obniżało taktowania. - + Anisotropic Filtering: Filtrowanie anizotropowe: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Steruje jakością renderowania tekstur pod ostrymi kątami. Na większości GPU bezpieczną wartością jest 16x. - + GPU Mode: Tryb GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Dokładność DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -828,89 +848,89 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation Włącz asynchroniczną kompilację shaderów - + May reduce shader stutter. Może zmniejszyć zacięcia spowodowane kompilacją shaderów. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Użyj pamięci podręcznej strumienia dla Vulkana - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Włącza specyficzną dla producenta GPU pamięć podręczną potoków. Ta opcja może znacząco skrócić czas ładowania shaderów w przypadkach, gdy sterownik Vulkan nie przechowuje wewnętrznie plików pamięci podręcznej potoków. - + Enable Compute Pipelines (Intel Vulkan Only) Włącz potoki obliczeniowe (tylko Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -919,192 +939,181 @@ To ustawienie istnieje wyłącznie dla sterowników Intela i może spowodować b Na wszystkich pozostałych sterownikach potoki obliczeniowe są zawsze włączone. - + Enable Reactive Flushing Włącz reaktywne opróżnianie buforów - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Używa opróżniania reaktywnego zamiast predykcyjnego, co umożliwia dokładniejsze synchronizowanie pamięci. - + Sync to framerate of video playback Synchronizuj do liczby klatek odtwarzanego wideo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Uruchamiaj grę z normalną prędkością podczas odtwarzania wideo, nawet przy odblokowanej liczbie klatek na sekundę. - + Barrier feedback loops Pętle sprzężenia zwrotnego barier - + Improves rendering of transparency effects in specific games. Poprawia renderowanie efektów przezroczystości w niektórych grach. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State Rozszerzony stan dynamiczny - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Kontroluje liczbę funkcji, które mogą być używane w Extended Dynamic State. Wyższe poziomy pozwalają na użycie większej liczby funkcji i mogą zwiększyć wydajność, ale mogą powodować dodatkowe problemy z grafiką. - + Vertex Input Dynamic State Dynamiczny stan wejścia wierzchołków - + Enables vertex input dynamic state feature for better quality and performance. Włącza funkcję dynamicznego stanu wejścia wierzchołków, poprawiając jakość i wydajność. - + Sample Shading Cieniowanie próbkowe - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Pozwala wykonywać shader fragmentów dla każdej próbki we fragmencie wielokrotnie próbkowanym zamiast raz dla każdego fragmentu. Poprawia jakość grafiki kosztem wydajności. Wyższe wartości poprawiają jakość, ale obniżają wydajność. - + RNG Seed Ziarno RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Ustala ziarno generatora liczb losowych. Głównie używane do speedrunów. - + Device Name Nazwa urządzenia - + The name of the console. The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Własna data RTC - + This option allows to change the clock of the console. Can be used to manipulate time in games. Ta opcja pozwala zmienić zegar konsoli. Może służyć do manipulowania czasem w grach. - + The number of seconds from the current unix time Liczba sekund od bieżącego czasu Unix - + Language: Język: - + This option can be overridden when region setting is auto-select Ta opcja może zostać nadpisana, gdy ustawienie regionu to automatyczny wybór. - + Region: Region: - + The region of the console. Region konsoli. - + Time Zone: Strefa czasowa: - + The time zone of the console. Strefa czasowa konsoli. - + Sound Output Mode: Tryb wyjścia dźwięku: - + Console Mode: Tryb konsoli - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1113,1026 +1122,1026 @@ W zależności od tego ustawienia gry zmienią swoją rozdzielczość, szczegó Ustawienie na Handheld może poprawić wydajność na słabszych komputerach. - + Prompt for user profile on boot Pytaj o profil użytkownika przy uruchomieniu. - + Useful if multiple people use the same PC. Przydatne, gdy z tego samego PC korzysta wiele osób. - + Pause when not in focus Wstrzymuj, gdy okno nie jest aktywne - + Pauses emulation when focusing on other windows. Wstrzymuje emulację po przełączeniu na inne okna. - + Confirm before stopping emulation Potwierdzaj przed zatrzymaniem emulacji - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Nadpisuje monity z prośbą o potwierdzenie zatrzymania emulacji. Włączenie powoduje pominięcie takich monitów i bezpośrednie wyjście z emulacji. - + Hide mouse on inactivity Ukryj mysz przy braku aktywności - + Hides the mouse after 2.5s of inactivity. Ukrywa kursor po 2,5 s bezczynności. - + Check for updates Sprawdź aktualizacje - + Whether or not to check for updates upon startup. Czy sprawdzać aktualizacje przy uruchomieniu. - + Enable Gamemode Włącz Tryb gry - + Force X11 as Graphics Backend Wymuś X11 jako backend grafiki - + Custom frontend Niestandardowy frontend - + Real applet Prawdziwy aplet - - + + Disabled Wyłączone - + Never Nigdy - + On Load Przy wczytywaniu - + Always Zawsze - + CPU CPU - + GPU GPU - + CPU Asynchronous Asynchroniczne CPU - + Uncompressed (Best quality) Brak (najlepsza jakość) - + BC1 (Low quality) BC1 (niska jakość) - + BC3 (Medium quality) BC3 (średnia jakość) - - + + Auto Automatyczny - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Konserwatywny - + Aggressive Agresywny - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast Szybkie - - - + + + Accurate Dokładny - - - + + + Default Domyślny - + Unsafe (fast) Niezalecane (szybkie) - + Safe (stable) Bezpieczne (stabilne) - + Immediate - + Balanced Zrównoważony - + Unsafe Niebezpieczny - + Paranoid (disables most optimizations) Paranoiczne (wyłącza większość optymalizacji) - + Debugging Debugowanie - + Dynarmic Dynamiczny - + NCE NCE - + Borderless Windowed W oknie (Bezramkowy) - + Exclusive Fullscreen Exclusive Fullscreen - + No Video Output Brak wyjścia wideo - + CPU Video Decoding Dekodowanie Wideo przez CPU - + GPU Video Decoding (Default) Dekodowanie Wideo przez GPU (Domyślne) - + 0.25X (180p/270p) [EXPERIMENTAL] 0,25x (180p/270p) [EKSPERYMENTALNE] - + 0.5X (360p/540p) [EXPERIMENTAL] 0,5x (360p/540p) [EKSPERYMENTALNE] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EKSPERYMENTALNE] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EKSPERYMENTALNE] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [Ekperymentalnie] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Najbliższy sąsiadujący - + Bilinear Bilinearny - + Bicubic Bikubiczny - + Gaussian Kulisty - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Obszar - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Żadna (wyłączony) - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Domyślne (16:9) - + Force 4:3 Wymuś 4:3 - + Force 21:9 Wymuś 21:9 - + Force 16:10 Wymuś 16:10 - + Stretch to Window Rozciągnij do Okna - + Automatic Automatyczne - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japoński (日本語) - + American English Angielski Amerykański - + French (français) Francuski (français) - + German (Deutsch) Niemiecki (Niemcy) - + Italian (italiano) Włoski (italiano) - + Spanish (español) Hiszpański (español) - + Chinese Chiński - + Korean (한국어) Koreański (한국어) - + Dutch (Nederlands) Duński (Holandia) - + Portuguese (português) Portugalski (português) - + Russian (Русский) Rosyjski (Русский) - + Taiwanese Tajwański - + British English Angielski Brytyjski - + Canadian French Fancuski (Kanada) - + Latin American Spanish Hiszpański (Latin American) - + Simplified Chinese Chiński (Uproszczony) - + Traditional Chinese (正體中文) Chiński tradycyjny (正體中文) - + Brazilian Portuguese (português do Brasil) Portugalski (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonia - + USA USA - + Europe Europa - + Australia Australia - + China Chiny - + Korea Korea - + Taiwan Tajwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Domyślne (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipt - + Eire Irlandia - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islandia - + Iran Iran - + Israel Izrael - + Jamaica Jamajka - + Kwajalein Kwajalein - + Libya Libia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polska - + Portugal Portugalia - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Turcja - + UCT UCT - + Universal Uniwersalny - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Domyślne) - + 6GB DRAM (Unsafe) 6GB DRAM (NIebezpieczne) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (NIebezpieczne) - + 12GB DRAM (Unsafe) 12GB DRAM (NIebezpieczne) - + Docked Zadokowany - + Handheld Przenośnie - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Zawsze pytaj (Domyślne) - + Only if game specifies not to stop Tylko jeśli gra określa, aby nie zatrzymywać - + Never ask Nie pytaj więcej - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Średnie (256) - + High (512) Wysokie (512) - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index cdc3af2593..063a1bff4f 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -728,12 +728,32 @@ O modo agressivo pode impactar a performance de outros aplicativos, como softwar Ignora certas invalidações de cache durante atualizações de memória, reduzindo o uso da CPU e melhorando a latência. Isso pode causar travamentos leves. - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: Modo de Sincronização vertical: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -744,12 +764,12 @@ Mailbox pode ter menor latência que FIFO e não apresenta cortes, mas pode perd Immediate (sem sincronização) exibe o que estiver disponível e pode apresentar cortes. - + Sync Memory Operations Sincronizar operações de memória - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -758,68 +778,68 @@ Esta opção corrige problemas em diversos jogos, mas pode reduzir o desempenho. Jogos baseados na Unreal Engine 4 costumam apresentar as mudanças mais significativas. - + Enable asynchronous presentation (Vulkan only) Ativar apresentação assíncrona (Somente Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Melhora ligeiramente o desempenho ao mover a apresentação para uma thread de CPU separada. - + Force maximum clocks (Vulkan only) Forçar clock máximo (somente Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Executa trabalho em segundo plano aguardando pelos comandos gráficos para evitar a GPU de reduzir seu clock. - + Anisotropic Filtering: Filtro Anisotrópico: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Controla a qualidade da renderização de texturas em ângulos oblíquos. Seguro definir em 16x na maioria das GPUs. - + GPU Mode: Modo da GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: Precisão do DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -828,44 +848,44 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation Ativar compilação assíncrona de shaders - + May reduce shader stutter. Pode reduzir travamentos de shaders. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Acelera a decodificação de texturas 3D BCn usando processamento da GPU. Desative se ocorrerem travamentos ou falhas gráficas. - + GPU Unswizzle Max Texture Size Tamanho Máximo de Textura para GPU Unswizzle - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -874,48 +894,48 @@ A GPU é mais rápida para texturas médias e grandes, mas a CPU pode ser mais e Ajuste para encontrar o equilíbrio entre aceleração da GPU e sobrecarga da CPU. - + GPU Unswizzle Stream Size Tamanho do Fluxo de GPU Unswizzle - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Define a quantidade máxima de dados de textura (em MiB) processados por quadro. Valores mais altos podem reduzir travamentos durante o carregamento de texturas, mas podem afetar a consistência dos quadros. - + GPU Unswizzle Chunk Size Tamanho do Bloco de GPU Unswizzle - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Determina o número de fatias de profundidade processadas em uma única execução. Aumentar esse valor pode melhorar o desempenho em GPUs avançadas, mas pode causar TDR ou tempo limite do driver em hardwares mais fracos. - + Use Vulkan pipeline cache Utilizar cache de pipeline do Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Habilita o cache de pipeline da fabricante da GPU. Esta opção pode melhorar o tempo de carregamento de shaders significantemente em casos onde o driver Vulkan não armazena o cache de pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Habilitar Pipeline de Computação (Somente Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -924,194 +944,182 @@ Esta configuração existe apenas para drivers proprietários da Intel e pode ca Pipelines de computação estão sempre habilitados em outros drivers. - + Enable Reactive Flushing Habilitar Flushing Reativo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa flushing reativo ao invés de flushing preditivo, permitindo mais precisão na sincronização da memória. - + Sync to framerate of video playback Sincronizar com o framerate da reprodução de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Executa o jogo na velocidade normal durante a reprodução de vídeo, mesmo se o framerate estiver desbloqueado. - + Barrier feedback loops Ciclos de feedback de barreira - + Improves rendering of transparency effects in specific games. Melhora a renderização de efeitos de transparência em jogos específicos. - + Enable buffer history Ativar histórico de buffer - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Permite acesso a estados anteriores do buffer. Esta opção pode melhorar a qualidade de renderização e a consistência de desempenho em alguns jogos. - + Fix bloom effects Corrigir efeitos de bloom - + Removes bloom in Burnout. Remove o bloom no Burnout. - - Enable Legacy Rescale Pass - Ativar Passagem de Redimensionamento Legada - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - Pode corrigir problemas de redimensionamento em alguns jogos, baseando-se no comportamento da implementação anterior. -Solução legada que corrige artefatos de linha em GPUs AMD e Intel, e cintilação de texturas cinzas em GPUs Nvidia no Luigi's Mansion 3. - - - + Extended Dynamic State Estado Dinâmico Estendido - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Controla o número de recursos que podem ser usados no Estado Dinâmico Estendido. Estados mais altos permitem mais recursos e podem aumentar o desempenho, mas também podem causar problemas gráficos adicionais. - + Vertex Input Dynamic State Estado Dinâmico de Entrada de Vértices - + Enables vertex input dynamic state feature for better quality and performance. Ativa o recurso de estado dinâmico de entrada de vértices para melhor qualidade e desempenho. - + Sample Shading Sombreamento por Amostragem - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Permite que o shader de fragmento seja processado por cada amostra em fragmentos multiamostrados, em vez de uma única vez por fragmento. Melhora a qualidade gráfica ao custo de desempenho. Valores mais altos aumentam a qualidade, mas reduzem a performance. - + RNG Seed Semente de RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Controla a semente do gerador de números aleatórios. Usado principalmente em speedruns. - + Device Name Nome do Dispositivo - + The name of the console. O nome do console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Data personalizada do RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Esta opção permite alterar o relógio do console. Pode ser usada para manipular o tempo nos jogos. - + The number of seconds from the current unix time Número de segundos a partir do tempo Unix atual - + Language: Idioma: - + This option can be overridden when region setting is auto-select Esta opção pode ser substituída quando a configuração de região estiver em seleção automática - + Region: Região: - + The region of the console. A região do console. - + Time Zone: Fuso Horário: - + The time zone of the console. O fuso horário do console. - + Sound Output Mode: Modo de saída de som - + Console Mode: Modo Console: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1120,1026 +1128,1026 @@ Os jogos ajustarão resolução, detalhes e controladores suportados conforme es Definir como Portátil pode ajudar a melhorar o desempenho em sistemas mais fracos. - + Prompt for user profile on boot Solicitar perfil de usuário na inicialização - + Useful if multiple people use the same PC. Útil se várias pessoas usam o mesmo PC. - + Pause when not in focus Pausar quando não estiver em foco - + Pauses emulation when focusing on other windows. Pausa a emulação ao focar em outras janelas. - + Confirm before stopping emulation Confirmar antes de parar a emulação - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Substitui as confirmações ao parar a emulação. Ao ativar, ignora esses avisos e encerra diretamente a emulação. - + Hide mouse on inactivity Esconder rato quando inactivo. - + Hides the mouse after 2.5s of inactivity. Oculta o mouse após 2,5s de inatividade. - + Check for updates Verificar atualizações - + Whether or not to check for updates upon startup. Define se deve verificar atualizações na inicialização. - + Enable Gamemode Habilitar Gamemode - + Force X11 as Graphics Backend Forçar X11 como backend gráfico - + Custom frontend Frontend customizado - + Real applet Applet real - - + + Disabled Desativado - + Never Nunca - + On Load Ao carregar - + Always Sempre - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor Qualidade) - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - - + + Auto Automático - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Conservador - + Aggressive Agressivo - + Vulkan Vulcano - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Shaders em Assembly, apenas NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimental, apenas AMD/Mesa) - + Null Nenhum - + Fast Rápido - - - + + + Accurate Preciso - - - + + + Default Padrão - + Unsafe (fast) Inseguro (rápido) - + Safe (stable) Seguro (estável) - + Immediate - + Balanced Balanceado - + Unsafe Inseguro - + Paranoid (disables most optimizations) Paranoia (desativa a maioria das otimizações) - + Debugging Depuração - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela sem bordas - + Exclusive Fullscreen Tela cheia exclusiva - + No Video Output Sem saída de vídeo - + CPU Video Decoding Decodificação de vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de vídeo pela GPU (Padrão) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Área - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à Janela - + Automatic Automático - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) Polonês (polska) - + Thai (แบบไทย) Tailandês (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egito - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irã - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polônia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Inseguro) - + 12GB DRAM (Unsafe) 12GB DRAM (Inseguro) - + Docked Ancorado - + Handheld Portátil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - + Very Small (16 MB) Muito Pequeno (16 MB) - + Small (32 MB) Pequeno (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Grande (256 MB) - + Very Large (512 MB) Muito Grande (512 MB) - + Very Low (4 MB) Muito Baixo (4 MB) - + Low (8 MB) Baixo (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Médio (32 MB) - + High (64 MB) Alto (64 MB) - + Very Low (32) Muito Baixo (32) - + Low (64) Baixo (64) - + Normal (128) Normal (128) - + Medium (256) Médio (256) - + High (512) Alto (512) - + ExtendedDynamicState 1 Estado Dinâmico Estendido 1 - + ExtendedDynamicState 2 Estado Dinâmico Estendido 2 - + ExtendedDynamicState 3 Estado Dinâmico Estendido 3 - + Tree View Visualização em Árvore - + Grid View Visualização em Grade diff --git a/dist/languages/pt_PT.ts b/dist/languages/pt_PT.ts index 7084f01e62..eb9b0c12a4 100644 --- a/dist/languages/pt_PT.ts +++ b/dist/languages/pt_PT.ts @@ -703,12 +703,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: Modo de Sincronização vertical: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -716,79 +736,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Ativar apresentação assíncrona (Somente Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Melhora ligeiramente o desempenho ao mover a apresentação para uma thread de CPU separada. - + Force maximum clocks (Vulkan only) Forçar clock máximo (somente Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Executa trabalho em segundo plano aguardando pelos comandos gráficos para evitar a GPU de reduzir seu clock. - + Anisotropic Filtering: Filtro Anisotrópico: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -797,1302 +817,1291 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Utilizar cache de pipeline do Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Habilita o cache de pipeline da fabricante da GPU. Esta opção pode melhorar o tempo de carregamento de shaders significantemente em casos onde o driver Vulkan não armazena o cache de pipeline internamente. - + Enable Compute Pipelines (Intel Vulkan Only) Habilitar Pipeline de Computação (Somente Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Habilitar Flushing Reativo - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Usa flushing reativo ao invés de flushing preditivo, permitindo mais precisão na sincronização da memória. - + Sync to framerate of video playback Sincronizar com o framerate da reprodução de vídeo - + Run the game at normal speed during video playback, even when the framerate is unlocked. Executa o jogo na velocidade normal durante a reprodução de vídeo, mesmo se o framerate estiver desbloqueado. - + Barrier feedback loops Ciclos de feedback de barreira - + Improves rendering of transparency effects in specific games. Melhora a renderização de efeitos de transparência em jogos específicos. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Semente de RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Nome do Dispositivo - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Data personalizada do RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: Idioma: - + This option can be overridden when region setting is auto-select - + Region: Região: - + The region of the console. - + Time Zone: Fuso Horário: - + The time zone of the console. - + Sound Output Mode: Modo de saída de som - + Console Mode: Modo Console: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation Confirmar antes de parar a emulação - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Esconder rato quando inactivo. - + Hides the mouse after 2.5s of inactivity. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode Habilitar Gamemode - + Force X11 as Graphics Backend - + Custom frontend Frontend customizado - + Real applet Miniaplicativo real - - + + Disabled - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU Assíncrona - + Uncompressed (Best quality) Descompactado (Melhor Q - + BC1 (Low quality) BC1 (Baixa qualidade) - + BC3 (Medium quality) BC3 (Média qualidade) - - + + Auto Automático - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Conservador - + Aggressive Agressivo - + Vulkan Vulcano - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Nenhum (desativado) - + Fast - - - + + + Accurate Preciso - - - + + + Default Padrão - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Inseguro - + Paranoid (disables most optimizations) Paranoia (desativa a maioria das otimizações) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Janela sem bordas - + Exclusive Fullscreen Tela cheia exclusiva - + No Video Output Sem saída de vídeo - + CPU Video Decoding Decodificação de vídeo pela CPU - + GPU Video Decoding (Default) Decodificação de vídeo pela GPU (Padrão) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTAL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTAL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Vizinho mais próximo - + Bilinear Bilinear - + Bicubic Bicúbico - + Gaussian Gaussiano - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Nenhum - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Padrão (16:9) - + Force 4:3 Forçar 4:3 - + Force 21:9 Forçar 21:9 - + Force 16:10 Forçar 16:10 - + Stretch to Window Esticar à Janela - + Automatic Automático - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonês (日本語) - + American English Inglês Americano - + French (français) Francês (français) - + German (Deutsch) Alemão (Deutsch) - + Italian (italiano) Italiano (italiano) - + Spanish (español) Espanhol (español) - + Chinese Chinês - + Korean (한국어) Coreano (한국어) - + Dutch (Nederlands) Holandês (Nederlands) - + Portuguese (português) Português (português) - + Russian (Русский) Russo (Русский) - + Taiwanese Taiwanês - + British English Inglês Britânico - + Canadian French Francês Canadense - + Latin American Spanish Espanhol Latino-Americano - + Simplified Chinese Chinês Simplificado - + Traditional Chinese (正體中文) Chinês Tradicional (正 體 中文) - + Brazilian Portuguese (português do Brasil) Português do Brasil (Brazilian Portuguese) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japão - + USA EUA - + Europe Europa - + Australia Austrália - + China China - + Korea Coreia - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Padrão (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Egipto - + Eire Irlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Islândia - + Iran Irão - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Líbia - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polónia - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapura - + Turkey Turquia - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Estéreo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Padrão) - + 6GB DRAM (Unsafe) 6GB DRAM (Não seguro) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Ancorado - + Handheld Portátil - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Sempre perguntar (Padrão) - + Only if game specifies not to stop Somente se o jogo especificar para não parar - + Never ask Nunca perguntar - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 248209833e..bb44335970 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -729,12 +729,32 @@ Aggressive mode may impact performance of other applications such as recording s Пропускает некоторые операции сброса кэша при обновлении памяти, снижая нагрузку на ЦП и уменьшая задержку. Может вызывать сбои в работе игр. - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: Режим VSync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -745,12 +765,12 @@ Mailbox может обеспечивать меньшую задержку, ч Immediate (без синхронизации) выводит все доступные кадры и может иметь разрывы. - + Sync Memory Operations Синхронизация операций памяти - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -759,56 +779,56 @@ Unreal Engine 4 games often see the most significant changes thereof. Игры на Unreal Engine 4 чаще всего демонстрируют заметные изменения. - + Enable asynchronous presentation (Vulkan only) Включить асинхронный вывод (только Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Немного повышает производительность, перенося вывод кадра в отдельный поток CPU. - + Force maximum clocks (Vulkan only) Принудительно зафиксировать максимальную тактовую частоту (только для Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Выполняет фоновые операции во время ожидания графических команд, предотвращая снижение тактовой частоты GPU. - + Anisotropic Filtering: Анизотропная фильтрация: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Управляет качеством отображения текстур под наклонными углами. На большинстве GPU безопасно использовать значение 16x. - + GPU Mode: Режим GPU: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. Управляет режимом эмуляции ГПУ. Большинство игр нормально отображаются в режиме Быстрый, но для некоторых требуется режим Точный. Частицы обычно корректно отображаются только в режиме Точный. - + DMA Accuracy: Точность DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -817,12 +837,12 @@ Default follows the GPU Accuracy setting. По умолчанию соответствует настройке точности ГПУ. - + GPU Fence Behavior: Поведение барьеров ГПУ: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -831,44 +851,44 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation Включить асинхронную компиляцию шейдеров - + May reduce shader stutter. Может уменьшить фризы, вызванные компиляцией шейдеров. - + GPU Clocks Частоты GPU - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. Заставляет игру думать, что GPU завершает свою работу быстрее, чем на самом деле, чтобы она перестала подстраиваться под частоты Switch, понижать разрешение и дальность прорисовки. - + GPU Unswizzle GPU-десвиззлинг (GPU Unswizzle) - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Ускоряет декодирование 3D-текстур BCn с использованием вычислений GPU. Отключите при возникновении сбоев или графических артефактов. - + GPU Unswizzle Max Texture Size Максимальный размер текстур для GPU-десвиззлинга - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -877,48 +897,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size Размер потока GPU-десвиззлинга - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Задает максимальный объем данных текстур (в МиБ), обрабатываемый за кадр. Более высокие значения могут уменьшить подергивания при загрузке текстур, но это может повлиять на стабильность кадров. - + GPU Unswizzle Chunk Size Размер блока GPU-десвиззлинга - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Определяет количество слоев глубины, обрабатываемых за один вызов. Увеличение этого значения может повысить пропускную способность на производительных GPU, но на слабом оборудовании способно вызвать TDR или тайм-ауты драйвера. - + Use Vulkan pipeline cache Использовать кэш конвейеров Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Включает кэш конвейеров, зависящий от производителя GPU. Эта опция может значительно ускорить загрузку шейдеров в тех случаях, когда драйвер Vulkan не сохраняет такие файлы кэша внутри себя. - + Enable Compute Pipelines (Intel Vulkan Only) Включить вычислительные конвейеры (только для Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -927,194 +947,182 @@ Compute pipelines are always enabled on all other drivers. На остальных драйверах вычислительные конвейеры всегда включены. - + Enable Reactive Flushing Включить реактивный сброс - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Использует реактивный сброс (Reactive Flushing) вместо прогнозирующего, обеспечивая более точную синхронизацию памяти. - + Sync to framerate of video playback Синхронизировать с частотой кадров видео - + Run the game at normal speed during video playback, even when the framerate is unlocked. Поддерживать нормальную скорость игры во время воспроизведения видео, даже если частота кадров разблокирована. - + Barrier feedback loops Циклы обратной связи барьеров - + Improves rendering of transparency effects in specific games. Улучшает отрисовку эффектов прозрачности в некоторых играх. - + Enable buffer history Включить историю буфера - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Предоставляет доступ к предыдущим состояниям буфера. В некоторых играх может повысить качество рендеринга и стабильность производительности. - + Fix bloom effects Исправить эффекты bloom - + Removes bloom in Burnout. Удаляет эффект bloom в игре Burnout. - - Enable Legacy Rescale Pass - Включить устаревший режим масштабирования - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - Может исправить проблемы масштабирования в некоторых играх, используя поведение предыдущей реализации. -Это обходное решение устраняет артефакты линий на GPU AMD и Intel, а также мерцание серых текстур на GPU Nvidia в Luigis Mansion 3. - - - + Extended Dynamic State Расширенное динамическое состояние (Extended Dynamic State) - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Определяет количество функций, доступных в Extended Dynamic State. Более высокие значения позволяют использовать больше функций и иногда повышают производительность, но могут вызвать дополнительные графические проблемы. - + Vertex Input Dynamic State Динамическое состояние ввода вершин (Vertex Input Dynamic State) - + Enables vertex input dynamic state feature for better quality and performance. Включает функцию динамического состояния ввода вершин для улучшения качества и производительности. - + Sample Shading Множественное затенение (Sample Shading) - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Позволяет фрагментному шейдеру выполняться для каждого сэмпла в мультисемплированном фрагменте вместо одного раза. Повышает качество графики за счет снижения производительности. Более высокие значения повышают качество, но сильнее снижают производительность. - + RNG Seed Сид RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Задает начальное значение генератора случайных чисел. В основном используется для спидранов. - + Device Name Название устройства - + The name of the console. Имя консоли. - + Homebrew Args Аргументы Homebrew - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Аргументы командной строки при запуске homebrew (например, -noglsl). - + Custom RTC Date: Пользовательская RTC-дата: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Позволяет изменить системные часы консоли. Может использоваться для изменения времени в играх. - + The number of seconds from the current unix time Количество секунд от текущего UNIX-времени. - + Language: Язык: - + This option can be overridden when region setting is auto-select Эта настройка может быть переопределена при автоматическом выборе региона. - + Region: Регион: - + The region of the console. Регион консоли. - + Time Zone: Часовой пояс: - + The time zone of the console. Часовой пояс консоли. - + Sound Output Mode: Режим вывода звука: - + Console Mode: Консольный режим: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1123,1026 +1131,1026 @@ Setting to Handheld can help improve performance for low end systems. Установка в портативный режим может повысить производительность на слабых системах. - + Prompt for user profile on boot Запрашивать профиль пользователя при запуске игры - + Useful if multiple people use the same PC. Полезно, если одним ПК пользуются несколько человек. - + Pause when not in focus Приостанавливать, если окно не активно - + Pauses emulation when focusing on other windows. Приостанавливает эмуляцию при переключении на другие окна. - + Confirm before stopping emulation Запрашивать подтверждение перед остановкой эмуляции - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Убирает запросы на подтверждение остановки эмуляции. При включении этой настройки эмуляция завершается сразу, без подтверждения. - + Hide mouse on inactivity Скрывать курсор при бездействии - + Hides the mouse after 2.5s of inactivity. Скрывает курсор мыши после 2,5 секунд бездействия. - + Check for updates Проверять обновления - + Whether or not to check for updates upon startup. Проверять обновления при запуске. - + Enable Gamemode Включить режим игры - + Force X11 as Graphics Backend Принудительно использовать X11 как графический бэкенд - + Custom frontend Собственный интерфейс эмулятора - + Real applet Приложение из прошивки - - + + Disabled Отключено - + Never Никогда - + On Load При загрузке - + Always Всегда - + CPU CPU - + GPU GPU - + CPU Asynchronous Асинхронный CPU - + Uncompressed (Best quality) Без сжатия (наилучшее качество) - + BC1 (Low quality) BC1 (низкое качество) - + BC3 (Medium quality) BC3 (среднее качество) - - + + Auto Авто - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative Консервативный - + Aggressive Агрессивный - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (ассемблерные шейдеры, только для NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (экспериментальный, только для AMD/Mesa) - + Null Null - + Fast Производительность - - - + + + Accurate Точность - - - + + + Default По умолчанию - + Unsafe (fast) Небезопасно (быстро) - + Safe (stable) Безопасно (стабильно) - + Immediate Мгновенный - + Balanced Баланс - + Unsafe Небезопасно - + Paranoid (disables most optimizations) Параноик (отключает большинство оптимизаций) - + Debugging Отладка - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed Безрамочный режим - + Exclusive Fullscreen Эксклюзивный полноэкранный - + No Video Output Отсутствие видеовыхода - + CPU Video Decoding Декодирование видео на CPU - + GPU Video Decoding (Default) Декодирование видео на GPU (По умолчанию) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [Экспериментально] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [Экспериментально] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [Экспериментально] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [ЭКПЕРИМЕНТАЛЬНО] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [Экспериментально] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Ближайший сосед (Nearest Neighbor) - + Bilinear Билинейный - + Bicubic Бикубический - + Gaussian По Гауссу - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX™️ Super Resolution - + Area Область (Area) - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Никакой - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Стандартное (16:9) - + Force 4:3 Принудительно 4:3 - + Force 21:9 Принудительно 21:9 - + Force 16:10 Принудительно 16:10 - + Stretch to Window Растянуть до окна - + Automatic Автоматически - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Японский (日本語) - + American English Американский английский - + French (français) Французский (français) - + German (Deutsch) Немецкий (Deutsch) - + Italian (italiano) Итальянский (italiano) - + Spanish (español) Испанский (español) - + Chinese Китайский - + Korean (한국어) Корейский (한국어) - + Dutch (Nederlands) Голландский (Nederlands) - + Portuguese (português) Португальский (português) - + Russian (Русский) Русский - + Taiwanese Тайваньский - + British English Британский английский - + Canadian French Канадский французский - + Latin American Spanish Латиноамериканский испанский - + Simplified Chinese Упрощённый китайский - + Traditional Chinese (正體中文) Традиционный китайский (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильский португальский (português do Brasil) - + Polish (polska) Польский (polska) - + Thai (แบบไทย) Тайский (แบบไทย) - - + + Japan Япония - + USA США - + Europe Европа - + Australia Австралия - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Авто (%1) - + Default (%1) Default time zone По умолчанию (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Египет - + Eire Эйре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Эйре - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвич - + Hongkong Гонконг - + HST HST - + Iceland Исландия - + Iran Иран - + Israel Израиль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Ливия - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польша - + Portugal Португалия - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сингапур - + Turkey Турция - + UCT UCT - + Universal Универсальный - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулу - + Mono Моно - + Stereo Стерео - + Surround Объемный звук - + 4GB DRAM (Default) 4 ГБ ОЗУ (По умолчанию) - + 6GB DRAM (Unsafe) 6 ГБ ОЗУ (Небезопасно) - + 8GB DRAM 8 ГБ ОЗУ - + 10GB DRAM (Unsafe) 10 ГБ ОЗУ (Небезопасно) - + 12GB DRAM (Unsafe) 12 ГБ ОЗУ (Небезопасно) - + Docked В док-станции - + Handheld Портативный - - + + Normal Нормальная - - + + Boost Ускоренная - - + + Overclock Разгон - + Always ask (Default) Всегда спрашивать (По умолчанию) - + Only if game specifies not to stop Только если игра указывает не останавливать - + Never ask Никогда не спрашивать - + Very Small (16 MB) Очень маленький (16 МБ) - + Small (32 MB) Маленький (32 МБ) - + Normal (128 MB) Нормальный (128 МБ) - + Large (256 MB) Большой (256 МБ) - + Very Large (512 MB) Очень большой (512 МБ) - + Very Low (4 MB) Очень низкий (4 МБ) - + Low (8 MB) Низкий (8 МБ) - + Normal (16 MB) Нормальный (16 МБ) - + Medium (32 MB) Средний (32 МБ) - + High (64 MB) Высокий (64 МБ) - + Very Low (32) Очень низкий (32) - + Low (64) Низкий (64) - + Normal (128) Нормальный (128) - + Medium (256) Средний (256) - + High (512) Высокий (512) - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View Древовидный - + Grid View Сетчатый diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index 8662c56414..818a84cbe1 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -51,7 +51,7 @@ li.checked::marker { content: "\2612"; } Communicating with the server... - Kommunicerar med servern... + Kommunicerar med servern… @@ -192,7 +192,7 @@ Detta skulle stänga av både deras forumanvändarnamn och deras IP-adress. Moderation... - Moderering... + Moderering… @@ -375,7 +375,7 @@ Påverkar inte prestanda/stabilitet men kan göra det möjligt att läsa in HD-t 200% for a 30 FPS game is 60 FPS, and for a 60 FPS game it will be 120 FPS. Disabling it means unlocking the framerate to the maximum your PC can reach. Kontrollerar spelets maximala renderingshastighet, men det är upp till varje spel om det körs snabbare eller inte. -200% för ett spel med 30 bilder/s är 60 bilder/s, och för ett spel med 60 bilder/s blir det 120 bilder/s. +200 % för ett spel med 30 bilder/s är 60 bilder/s och för ett spel med 60 bilder/s blir det 120 bilder/s. Att inaktivera det innebär att du låser upp bildfrekvensen till det maximala som din dator kan nå. @@ -436,7 +436,7 @@ Kan bidra till att minska hackande vid lägre bildfrekvenser. Raises the clock the emulated CPU reports, which removes some FPS limiters. Weaker CPUs may see reduced performance, and certain games may behave improperly. Höjer den klockfrekvens som den emulerade processorn rapporterar, vilket tar bort vissa FPS-begränsare. -Svagare processorer kan få sämre prestanda, och vissa spel kan fungera felaktigt. +Svagare processorer kan få sämre prestanda och vissa spel kan fungera felaktigt. @@ -446,7 +446,7 @@ Svagare processorer kan få sämre prestanda, och vissa spel kan fungera felakti Set a custom value of CPU ticks. Higher values can increase performance, but may cause deadlocks. A range of 77-21000 is recommended. - Ange ett anpassat värde för CPU-ticks. Högre värden kan öka prestandan, men kan orsaka deadlocks. Ett intervall på 77-21000 rekommenderas. + Ange ett anpassat värde för CPU-ticks. Högre värden kan öka prestandan, men kan orsaka deadlocks. Ett intervall på 77 till 21000 rekommenderas. @@ -734,12 +734,32 @@ Aggressivt läge kan påverka prestandan hos andra program, till exempel inspeln Hoppar över vissa cache-ogiltigförklaringar under minnesuppdateringar, vilket minskar CPU-användningen och förbättrar latensen. Detta kan orsaka mjuka krascher. - + + GPU Readback Before NCE Invalidation + GPU-återläsning före NCE-ogiltigförklaring + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + Skriver tillbaka GPU-buffertdata till gästens minne innan NCE ogiltigförklarar hela gästsidan, så att data bevaras medan CPU-lagringen fortsätter. + + + + Patch Runtime NROs for NCE + Korrigera NRO:er under körning för NCE + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + Tillämpar NCE-korrigeringar på NRO-moduler som läses in under körning. Det krävs för att vissa spel ska fungera korrekt. + + + VSync Mode: VSync-läge: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -750,12 +770,12 @@ Mailbox kan ha lägre latens än FIFO och uppvisar inte tearing, men kan tappa b Immediate (ingen synkronisering) visar allt som är tillgängligt och kan uppvisa tearing. - + Sync Memory Operations Synkronisera minnesoperationer - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -764,44 +784,44 @@ Det här alternativet åtgärdar problem i spel, men kan försämra prestandan. Unreal Engine 4-spel upplever ofta de mest betydande förändringarna av detta. - + Enable asynchronous presentation (Vulkan only) Aktivera asynkron presentation (endast Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Förbättrar prestandan något genom att flytta presentationen till en separat CPU-tråd. - + Force maximum clocks (Vulkan only) Tvinga fram maximal klockfrekvens (endast Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Körs i bakgrunden i väntan på grafikkommandon för att förhindra att GPU:n sänker sin klockhastighet. - + Anisotropic Filtering: Anisotropisk filtrering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Kontrollerar kvaliteten på texturrendering vid sneda vinklar. -Säker att ställa in på 16x på de flesta GPU:er. +Det går att ställa in 16× på de flesta GPU:er. - + GPU Mode: GPU-läge: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -810,12 +830,12 @@ De flesta spel återges bra med Snabb, men Exakt krävs fortfarande för vissa. Partiklar återges ofta korrekt endast i läget Exakt. - + DMA Accuracy: DMA-noggrannhet: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -824,12 +844,12 @@ Osäker är snabbare, medan Säker är stabilare och kan lösa problem i vissa s Standard följer inställningen för GPU-noggrannhet. - + GPU Fence Behavior: Beteende för GPU-staket: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -842,44 +862,44 @@ Exakt förbättrar kompatibiliteten ytterligare, men på bekostnad av viss prest Standard följer inställningen för GPU-läge. - + Enable asynchronous shader compilation Aktivera asynkron shaderkompilering - + May reduce shader stutter. Kan minska shader-hackighet. - + GPU Clocks GPU-klockfrekvenser - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. Får spelet att tro att GPU-arbetet avslutas snabbare än det gör, så att det slutar sänka upplösning och ritaravstånd för att passa Switch-klockfrekvenserna. - + GPU Unswizzle GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Accelererar avkodning av BCn 3D-texturer med hjälp av GPU-beräkningar. Inaktivera om du upplever krascher eller grafiska fel. - + GPU Unswizzle Max Texture Size Maximal texturstorlek för GPU Unswizzle - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -888,48 +908,48 @@ GPU är snabbare för medelstora och stora texturer, men CPU kan vara effektivar Justera detta för att hitta balansen mellan GPU-acceleration och CPU-överbelastning. - + GPU Unswizzle Stream Size Strömstorlek för GPU Unswizzle - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Ställer in den maximala mängden texturdata (i MiB) som bearbetas per bildruta. Högre värden kan minska hackighet under texturinläsning men kan påverka bildrutans konsistens. - + GPU Unswizzle Chunk Size Chunk-storlek för GPU Unswizzle - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Bestämmer antalet djupskivor som bearbetas i en enda sändning. Att öka detta kan förbättra genomströmningen på avancerade GPU:er, men kan orsaka TDR eller drivrutinstidsgränser på svagare hårdvara. - + Use Vulkan pipeline cache Använda Vulkan pipeline-cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Aktiverar GPU-leverantörsspecifik pipeline-cache. Det här alternativet kan förbättra laddningstiden för shaders avsevärt i fall där Vulkan-drivrutinen inte lagrar pipeline-cache-filer internt. - + Enable Compute Pipelines (Intel Vulkan Only) Aktivera compute pipelines (endast Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -938,194 +958,182 @@ Denna inställning finns endast för Intels egna drivrutiner och kan orsaka kras Beräkningspipelines är alltid aktiverade på alla andra drivrutiner. - + Enable Reactive Flushing Aktivera Reactive Flushing - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Använder reaktiv rensning i stället för prediktiv rensning, vilket ger mer exakt minnessynkning. - + Sync to framerate of video playback Synkronisera med bildfrekvensen för videouppspelning - + Run the game at normal speed during video playback, even when the framerate is unlocked. Kör spelet i normal hastighet under videouppspelning, även när bildfrekvensen är upplåst. - + Barrier feedback loops Återkopplingsloopar för barriärer - + Improves rendering of transparency effects in specific games. Förbättrar renderingen av transparenseffekter i vissa spel. - + Enable buffer history Aktivera bufferthistorik - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Aktiverar åtkomst till tidigare bufferttillstånd. Det här alternativet kan förbättra renderingskvaliteten och prestandakonsistensen i vissa spel. - + Fix bloom effects Korrigera bloom-effekter - + Removes bloom in Burnout. Tar bort bloom i Burnout. - - Enable Legacy Rescale Pass - Aktivera äldre omskalningspass - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - Kan åtgärda skalningsproblem i vissa spel genom att förlita sig på beteendet från den tidigare implementeringen. -Äldre beteende som åtgärdar linjeartefakter på AMD- och Intel-GPU:er och grå texturflimmer på Nvidia-GPU:er i Luigis Mansion 3. - - - + Extended Dynamic State Utökad dynamisk status - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Kontrollerar antalet funktioner som kan användas i utökat dynamiskt tillstånd. Högre tillstånd möjliggör fler funktioner och kan öka prestandan, men kan orsaka ytterligare grafiska problem. - + Vertex Input Dynamic State Dynamiskt tillstånd för vertexinmatning - + Enables vertex input dynamic state feature for better quality and performance. Aktiverar funktionen för dynamiskt tillstånd för vertexinmatning för bättre kvalitet och prestanda. - + Sample Shading Provskuggning - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Tillåter fragment-shadern att exekveras per prov i ett multisamplade fragment istället för en gång per fragment. Förbättrar grafikens kvalitet på bekostnad av prestanda. Högre värden förbättrar kvaliteten men försämrar prestandan. - + RNG Seed RNG-frö - + Controls the seed of the random number generator. Mainly used for speedrunning. Att kontrollera fröet till slumptalsgeneratorn. Används främst för speedrunning. - + Device Name Enhetsnamn - + The name of the console. Konsolens namn. - + Homebrew Args Homebrew-argument - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Kommandoradsargument som skickas till homebrew vid start (t.ex. -noglsl). - + Custom RTC Date: Anpassat RTC-datum: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Med det här alternativet kan du ändra klockan på konsolen. Kan användas för att manipulera tiden i spel. - + The number of seconds from the current unix time Antalet sekunder från aktuell Unix-tid - + Language: Språk: - + This option can be overridden when region setting is auto-select - Det här alternativet kan åsidosättas när regioninställningen är automatiskt vald. + Det här alternativet kan åsidosättas när regioninställningen är automatiskt vald - + Region: Region: - + The region of the console. Konsolens region. - + Time Zone: Tidszon: - + The time zone of the console. Konsolens tidszon. - + Sound Output Mode: Ljudutmatningsläge: - + Console Mode: Konsolläge: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1134,1026 +1142,1026 @@ Spel ändrar upplösning, detaljer och stödda kontroller beroende på denna ins Inställningen Handhållen kan förbättra prestandan för enklare system. - + Prompt for user profile on boot Fråga efter användarprofil vid uppstart - + Useful if multiple people use the same PC. Användbart om flera personer använder samma dator. - + Pause when not in focus Pausa när inte i fokus - + Pauses emulation when focusing on other windows. Pausar emulering när fokus är på andra fönster. - + Confirm before stopping emulation Bekräfta innan emuleringen stoppas - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Åsidosätter frågor om att bekräfta att emuleringen ska avslutas. Om du aktiverar den hoppar du över sådana uppmaningar och avslutar emuleringen direkt. - + Hide mouse on inactivity Dölj musen vid inaktivitet - + Hides the mouse after 2.5s of inactivity. Döljer musen efter 2,5 sekunders inaktivitet. - + Check for updates Leta efter uppdateringar - + Whether or not to check for updates upon startup. Om uppdateringar ska sökas vid start eller inte. - + Enable Gamemode Aktivera Gamemode - + Force X11 as Graphics Backend Tvinga X11 som grafikbackend - + Custom frontend Anpassad frontend - + Real applet Verklig applet - - + + Disabled Inaktiverad - + Never Aldrig - + On Load Vid inläsning - + Always Alltid - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU asynkron - + Uncompressed (Best quality) Okomprimerad (bästa kvalitet) - + BC1 (Low quality) BC1 (låg kvalitet) - + BC3 (Medium quality) BC3 (medelhög kvalitet) - - + + Auto Auto - + 30 FPS 30 bilder/s - + 60 FPS 60 bilder/s - + 90 FPS 90 bilder/s - + 120 FPS 120 bilder/s - + Conservative Konservativ - + Aggressive Aggressiv - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (Assembly Shaders, endast NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (Experimentell, endast AMD/Mesa) - + Null Null - + Fast Snabb - - - + + + Accurate Exakt - - - + + + Default Standard - + Unsafe (fast) Osäker (snabb) - + Safe (stable) Säker (stabil) - + Immediate Omedelbar - + Balanced Balanserad - + Unsafe Inte säker - + Paranoid (disables most optimizations) Paranoid (inaktiverar de flesta optimeringar) - + Debugging Felsökning - + Dynarmic Dynarmisk - + NCE NCE - + Borderless Windowed Ramlöst fönsterläge - + Exclusive Fullscreen Exklusiv helskärm - + No Video Output Ingen videoutgång - + CPU Video Decoding CPU-videoavkodning - + GPU Video Decoding (Default) GPU videoavkodning (standard) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [EXPERIMENTELL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [EXPERIMENTELL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [EXPERIMENTELL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [EXPERIMENTELL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [EXPERIMENTELL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Närmsta granne - + Bilinear Bilinjär - + Bicubic Bikubisk - + Gaussian Gaussisk - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Område - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Ingen - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Standard (16:9) - + Force 4:3 Tvinga 4:3 - + Force 21:9 Tvinga 21:9 - + Force 16:10 Tvinga 16:10 - + Stretch to Window Sträck ut till fönster - + Automatic Automatiskt - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japanska (日本語) - + American English Amerikansk engelska - + French (français) Franska (français) - + German (Deutsch) Tyska (Deutsch) - + Italian (italiano) Italienska (italiano) - + Spanish (español) Spanska (español) - + Chinese Kinesiska - + Korean (한국어) Koreanska (한국어) - + Dutch (Nederlands) Nederländska (Nederlands) - + Portuguese (português) Portugisiska (português) - + Russian (Русский) Ryska (Русский) - + Taiwanese Taiwanesiska - + British English Brittisk engelska - + Canadian French Kanadensisk franska - + Latin American Spanish Latinamerikansk spanska - + Simplified Chinese Förenklad kinesiska - + Traditional Chinese (正體中文) Traditionell kinesiska (正體中文) - + Brazilian Portuguese (português do Brasil) Brasiliansk portugisiska (português do Brasil) - + Polish (polska) Polska (polska) - + Thai (แบบไทย) Thai (แบบไทย) - - + + Japan Japan - + USA USA - + Europe Europa - + Australia Australien - + China Kina - + Korea Korea - + Taiwan Taiwan - + Auto (%1) Auto select time zone Auto (%1) - + Default (%1) Default time zone Standard (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Kuba - + EET EET - + Egypt Egypten - + Eire Irland - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Irland - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hongkong - + HST HST - + Iceland Island - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libyen - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Polen - + Portugal Portugal - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Turkiet - + UCT UCT - + Universal Universal - + UTC UTC - + W-SU W-SU - + WET VÅT - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4 GB DRAM (standard) - + 6GB DRAM (Unsafe) 6 GB DRAM (osäker) - + 8GB DRAM 8 GB DRAM - + 10GB DRAM (Unsafe) 10 GB DRAM (osäker) - + 12GB DRAM (Unsafe) 12 GB DRAM (osäker) - + Docked Dockad - + Handheld Handhållen - - + + Normal Normal - - + + Boost Förstärk - - + + Overclock Överklocka - + Always ask (Default) Fråga alltid (standard) - + Only if game specifies not to stop Endast om spelet anger att det inte ska stoppas - + Never ask Fråga aldrig - + Very Small (16 MB) Mycket liten (16 MB) - + Small (32 MB) Liten (32 MB) - + Normal (128 MB) Normal (128 MB) - + Large (256 MB) Stor (256 MB) - + Very Large (512 MB) Mycket stor (512 MB) - + Very Low (4 MB) Mycket låg (4 MB) - + Low (8 MB) Låg (8 MB) - + Normal (16 MB) Normal (16 MB) - + Medium (32 MB) Medium (32 MB) - + High (64 MB) Hög (64 MB) - + Very Low (32) Mycket låg (32) - + Low (64) Låg (64) - + Normal (128) Normal (128) - + Medium (256) Medium (256) - + High (512) Hög (512) - + ExtendedDynamicState 1 ExtendedDynamicState 1 - + ExtendedDynamicState 2 ExtendedDynamicState 2 - + ExtendedDynamicState 3 ExtendedDynamicState 3 - + Tree View Trädvy - + Grid View Rutnätsvy @@ -2974,7 +2982,7 @@ Om du aktiverar den hoppar du över sådana uppmaningar och avslutar emuleringen ... - ... + … @@ -3049,33 +3057,33 @@ Om du aktiverar den hoppar du över sådana uppmaningar och avslutar emuleringen Select Emulated NAND Directory... - Välj katalog för emulerad NAND... + Välj katalog för emulerad NAND… Select Emulated SD Directory... - Välj katalog för emulerad SD... + Välj katalog för emulerad SD… Select Save Data Directory... - Välj katalog för sparat data... + Välj katalog för sparat data… Select Gamecard Path... - Välj sökväg för Gamecard... + Välj sökväg för Gamecard… Select Dump Directory... - Välj dumpkatalog... + Välj dumpkatalog… Select Mod Load Directory... - Välj katalog för modinläsningar... + Välj katalog för modinläsningar… @@ -3133,7 +3141,7 @@ Till: %2 Migrating save data... - Migrerar sparat data... + Migrerar sparat data… @@ -3224,7 +3232,7 @@ Vill du ta bort gammalt sparat data? Select External Content Directory... - Välj katalog för externt innehåll... + Välj katalog för externt innehåll… @@ -3273,7 +3281,7 @@ Vill du ta bort gammalt sparat data? Configure Effects... - Konfigurera effekter... + Konfigurera effekter… @@ -3820,7 +3828,7 @@ Vill du ta bort gammalt sparat data? Aimed to disable SDL GUIDE button hack: synthetic GUIDE(HOME) event when SELECT(MINUS) + START(PLUS) pressed. May impact Win related trigger/rumble/etc stuff - Avsedd att stänga av SDL:s GUIDE-knappshack: syntetisk GUIDE(HOME)-händelse när SELECT(MINUS) + START(PLUS) trycks ned. Kan påverka Windows-relaterade avtryckare, vibrationer med mera. + Avsedd att stänga av SDL:s GUIDE-knappshack: syntetisk GUIDE(HOME)-händelse när SELECT(MINUS) + START(PLUS) trycks ned. Kan påverka Windows-relaterade avtryckare, vibrationer med mera @@ -4019,7 +4027,7 @@ Vill du ta bort gammalt sparat data? Modifier Range: 0% - Modifieringsintervall: 0% + Modifieringsintervall: 0 % @@ -4203,7 +4211,7 @@ Vill du ta bort gammalt sparat data? Choose a value between 0% and 100% - Välj ett värde mellan 0% och 100% + Välj ett värde mellan 0 % och 100 % @@ -4241,13 +4249,13 @@ Om du vill invertera axlarna för du joysticken först vertikalt och sedan horis Deadzone: %1% - Dödzon: %1% + Dödzon: %1 % Modifier Range: %1% - Modifieringsintervall: %1% + Modifieringsintervall: %1 % @@ -4636,8 +4644,8 @@ Om du vill invertera axlarna för du joysticken först vertikalt och sedan horis Mouse panning works better with a deadzone of 0% and a range of 100%. Current values are %1% and %2% respectively. - Muspanorering fungerar bättre med en dödzon på 0% a och ett intervall på 100%. -Nuvarande värden är %1% respektive %2%. + Muspanorering fungerar bättre med en dödzon på 0 % och ett intervall på 100 %. +Nuvarande värden är %1 % respektive %2 %. @@ -4886,7 +4894,7 @@ För att ta bort NAND-installerade uppdateringar, högerklicka på spelet i spel Once deleted, these can NOT be recovered. Are you 100% sure you want to delete them? -När de har tagits bort kan de INTE återställas. Är du 100% säker på att du vill ta bort dem? +När de har tagits bort kan de INTE återställas. Är du 100 % säker på att du vill ta bort dem? @@ -5250,7 +5258,7 @@ UUID: %2 Deadzone: %1% - Dödzon: %1% + Dödzon: %1 % @@ -5377,7 +5385,7 @@ UUID: %2 ... - ... + … @@ -5390,7 +5398,7 @@ UUID: %2 Select TAS Load Directory... - Välj katalog för TAS-inläsningar... + Välj katalog för TAS-inläsningar… @@ -5657,7 +5665,7 @@ Dra punkterna för att ändra position, eller dubbelklicka på tabellcellerna f ... - ... + … @@ -5672,7 +5680,7 @@ Dra punkterna för att ändra position, eller dubbelklicka på tabellcellerna f Select Screenshots Path... - Välj sökväg för skärmdumpar... + Välj sökväg för skärmdumpar… @@ -5924,7 +5932,7 @@ Dra punkterna för att ändra position, eller dubbelklicka på tabellcellerna f Calculating... - Beräknar... + Beräknar… @@ -6806,7 +6814,7 @@ Felsökningsmeddelande: Loading... - Läser in... + Läser in… @@ -6816,7 +6824,7 @@ Felsökningsmeddelande: Launching... - Startar... + Startar… @@ -7033,17 +7041,17 @@ Felsökningsmeddelande: &Install Files to NAND... - &Installera filer till NAND... + &Installera filer till NAND… L&oad File... - Läs &in fil... + Läs &in fil… Load &Folder... - Läs in &mapp... + Läs in &mapp… @@ -7079,7 +7087,7 @@ Felsökningsmeddelande: Con&figure... - Kon&figurera... + Kon&figurera… @@ -7144,7 +7152,7 @@ Felsökningsmeddelande: Load/Remove &Amiibo... - Läs in/ta bort &Amiibo... + Läs in/ta bort &Amiibo… @@ -7194,12 +7202,12 @@ Felsökningsmeddelande: &Configure TAS... - &Konfigurera TAS... + &Konfigurera TAS… Configure C&urrent Game... - Konfigurera a&ktuellt spel... + Konfigurera a&ktuellt spel… @@ -7369,7 +7377,7 @@ Felsökningsmeddelande: Loading Web Applet... - Läser in webbapplet... + Läser in webbapplet… @@ -7397,7 +7405,7 @@ Felsökningsmeddelande: Current emulation speed. Values higher or lower than 100% indicate emulation is running faster or slower than a Switch. - Aktuell emuleringshastighet. Värden högre eller lägre än 100% indikerar att emuleringen körs snabbare eller långsammare än en Switch. + Aktuell emuleringshastighet. Värden högre eller lägre än 100 % indikerar att emuleringen körs snabbare eller långsammare än en Switch. @@ -7427,7 +7435,7 @@ Felsökningsmeddelande: Configure Effects... - Konfigurera effekter... + Konfigurera effekter… @@ -7509,7 +7517,7 @@ Felsökningsmeddelande: Closing software... - Stänger programvara... + Stänger programvara… @@ -7626,12 +7634,12 @@ Felsökningsmeddelande: There is not enough free space at %1 to extract the RomFS. Please free up space or select a different dump directory at Emulation > Configure > System > Filesystem > Dump Root - Det finns inte tillräckligt med ledigt utrymme på %1 för att extrahera RomFS. Frigör utrymme eller välj en annan dumpkatalog under Emulering > Konfigurera > System > Filsystem > Dumprot. + Det finns inte tillräckligt med ledigt utrymme på %1 för att extrahera RomFS. Frigör utrymme eller välj en annan dumpkatalog under Emulering > Konfigurera > System > Filsystem > Dumprot Extracting RomFS... - Extraherar RomFS... + Extraherar RomFS… @@ -7713,7 +7721,7 @@ Felsökningsmeddelande: Installing file "%1"... - Installerar filen "%1"... + Installerar filen "%1"… @@ -7800,7 +7808,7 @@ Använd endast denna funktion för att installera uppdateringar och DLC. Select NCA Install Type... - Välj NCA-installationstyp... + Välj NCA-installationstyp… @@ -7884,7 +7892,7 @@ Använd endast denna funktion för att installera uppdateringar och DLC. The current amiibo has been removed - Den aktuella amiibo har tagits bort. + Den aktuella amiibo har tagits bort @@ -7915,7 +7923,7 @@ Använd endast denna funktion för att installera uppdateringar och DLC. The selected file is not a valid amiibo - Den valda filen är inte en giltig amiibo. + Den valda filen är inte en giltig amiibo @@ -8011,12 +8019,12 @@ Använd endast denna funktion för att installera uppdateringar och DLC. Speed: %1% / %2% - Hastighet: %1% / %2% + Hastighet: %1 % / %2 % Speed: %1% - Hastighet: %1% + Hastighet: %1 % @@ -8052,7 +8060,7 @@ Använd endast denna funktion för att installera uppdateringar och DLC. VOLUME: %1% Volume percentage (e.g. 50%) - VOLYM: %1% + VOLYM: %1 % @@ -8503,7 +8511,7 @@ Fortsätt ändå? UUID must be 32 hex characters (0-9, A-F) - UUID måste vara 32 hexadecimala tecken (0-9, A-F) + UUID måste vara 32 hexadecimala tecken (0 till 9, A-F) @@ -8587,7 +8595,7 @@ Fortsätt ändå? Must be 32 hex characters (0-9, a-f) Tooltip - Måste vara 32 hexadecimala tecken (0-9, a-f) + Måste vara 32 hexadecimala tecken (0 till 9, a-f) @@ -8793,7 +8801,7 @@ p, li { white-space: pre-wrap; } Migrating, this may take a while... - Migrerar, det kan ta ett tag... + Migrerar, det kan ta ett tag… @@ -9308,7 +9316,7 @@ p, li { white-space: pre-wrap; } ... - ... + … @@ -9356,7 +9364,7 @@ p, li { white-space: pre-wrap; } Installing Firmware... - Installerar firmware... + Installerar firmware… @@ -9396,7 +9404,7 @@ p, li { white-space: pre-wrap; } Verifying integrity... - Verifierar integritet... + Verifierar integritet… @@ -9454,7 +9462,7 @@ p, li { white-space: pre-wrap; } UNEXPECTED BAD THINGS MAY HAPPEN IF YOU DON'T READ THIS!<br>Eden has detected the following save directories with no attached profile:<br>%1<br><br>The following profiles are valid:<br>%2<br><br>Click "OK" to open your save folder and fix up your profiles.<br>Hint: copy the contents of the largest or last-modified folder elsewhere, delete all orphaned profiles, and move your copied contents to the good profile.<br><br>Still confused? See the <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>help page</a>.<br> - OVÄNTADE PROBLEM KAN UPPSTÅ OM DU INTE LÄSER DETTA!<br>Eden har upptäckt följande sparningskataloger utan bifogade profiler:<br>%1<br><br>Följande profiler är giltiga:<br>%2<br><br>Klicka på ”OK” för att öppna din sparningsmapp och fixa dina profiler.<br>Tips: kopiera innehållet i den största eller senast ändrade mappen till en annan plats, ta bort alla övergivna profiler och flytta det kopierade innehållet till den giltiga profilen.<br><br>Fortfarande förvirrad? Se <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>hjälpsidan</a>.<br> + OVÄNTADE PROBLEM KAN UPPSTÅ OM DU INTE LÄSER DETTA!<br>Eden har upptäckt följande sparningskataloger utan bifogade profiler:<br>%1<br><br>Följande profiler är giltiga:<br>%2<br><br>Klicka på ”OK” för att öppna din sparningsmapp och rätta till dina profiler.<br>Tips: kopiera innehållet i den största eller senast ändrade mappen till en annan plats, ta bort alla övergivna profiler och flytta det kopierade innehållet till den giltiga profilen.<br><br>Fortfarande förvirrad? Se <a href='https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/Orphaned.md'>hjälpsidan</a>.<br> @@ -9476,12 +9484,12 @@ p, li { white-space: pre-wrap; } Once deleted, your data will NOT come back! Only do this if you're 100% sure you want to delete this data. När dina data har raderats kan de INTE återställas! -Gör detta endast om du är 100% säker på att du vill radera dessa data. +Gör detta endast om du är 100 % säker på att du vill radera dessa data. Clearing... - Tömmer... + Tömmer… @@ -9503,7 +9511,7 @@ Gör detta endast om du är 100% säker på att du vill radera dessa data. Exporting data. This may take a while... - Exporterar data. Detta kan ta en stund... + Exporterar data. Detta kan ta en stund… @@ -9558,7 +9566,7 @@ Gör detta endast om du är 100% säker på att du vill radera dessa data. Importing data. This may take a while... - Importerar data. Detta kan ta en stund... + Importerar data. Detta kan ta en stund… @@ -10073,12 +10081,12 @@ De flesta mods är RomFS-mods, men patchar (.pchtxt) är vanligtvis ExeFS-mods.< Successfully installed firmware version %1 - Firmware-version %1 har installerats. + Firmware-version %1 har installerats Unable to locate potential firmware NCA files - Det går inte att hitta potentiella NCA-filer för firmware. + Det går inte att hitta potentiella NCA-filer för firmware @@ -10198,7 +10206,7 @@ Detta rekommenderas om du vill dela data mellan emulatorer. 1 - 8 - 1 - 8 + 1 till 8 @@ -10608,7 +10616,7 @@ p, li { white-space: pre-wrap; } By selecting "From Eden", previous save data stored in Ryujinx will be deleted, and vice versa for "From Ryujinx". Genom att länka sparade data till Ryujinx kan både Ryujinx och Eden referera till samma sparade filer för dina spel. -Om du väljer ”Från Eden” tas tidigare sparade data bort som lagrats i Ryujinx, och vice versa för ”Från Ryujinx”. +Om du väljer ”Från Eden” tas tidigare sparade data bort som lagrats i Ryujinx och vice versa för ”Från Ryujinx”. @@ -10726,7 +10734,7 @@ Om du väljer ”Från Eden” tas tidigare sparade data bort som lagrats i Ryuj Downloading... - Hämtar ner... + Hämtar ner… diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index 95f0e25c31..b63445c3fb 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -712,12 +712,32 @@ Aggressive mode may impact performance of other applications such as recording s Bellek güncellemeleri sırasında belirli önbellek geçersiz kılma işlemlerini atlayarak işlemci kullanımını azaltır ve gecikmeyi iyileştirir. Bu, hafif çökmelere neden olabilir. - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: VSync Modu: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -725,79 +745,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te FIFO (VSync) kare düşürmez veya yırtılma göstermez ancak ekran yenileme hızıyla sınırlıdır. FIFO Relaxed, yavaşlamadan toparlanırken yırtılmaya izin verir. Mailbox, FIFO'dan daha düşük gecikmeye sahip olabilir ve yırtılma yapmaz ancak kare düşürebilir. Immediate (senkronizasyon yok), mevcut olanı anında sunar ve yırtılmalara neden olabilir. - + Sync Memory Operations Bellek İşlemlerini Senkronize Et - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. Hesaplama ve bellek işlemleri arasında veri tutarlılığı sağlar. Bu seçenek oyunlardaki sorunları giderir ancak performansı düşürebilir. Unreal Engine 4 oyunları genellikle bundan en önemli ölçüde etkilenenlerdir. - + Enable asynchronous presentation (Vulkan only) Asenkron sunumu etkinleştir (Yalnızca Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Sunum işlemini ayrı bir işlemci iş parçacığına taşıyarak performansı biraz artırır. - + Force maximum clocks (Vulkan only) En yüksek hızı zorla (Yalnızca Vulkan için) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Grafik komutlarını beklerken GPU'nun hızının düşmesini engellemek için arka planda görev yürütür - + Anisotropic Filtering: Anisotropic Filtering: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Eğik açılardaki doku oluşturma kalitesini kontrol eder. Çoğu grafik kartında 16x olarak ayarlanması güvenlidir. - + GPU Mode: Grafik Kartı Modu - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: DMA Doğruluğu: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -806,1302 +826,1291 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation Asenkron gölgelendirici derlemeyi etkinleştir - + May reduce shader stutter. Gölgelendirici/shader takılmalarını azaltabilir. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Vulkan pipeline önbelleği kullan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Grafik kartı üreticisine özel işlem hattı önbelleğini etkinleştirir. Bu seçenek, Vulkan sürücüsünün işlem hattı önbellek dosyalarını dahili olarak saklamadığı durumlarda gölgelendirici yükleme süresini önemli ölçüde iyileştirebilir. - + Enable Compute Pipelines (Intel Vulkan Only) Hesaplama İşlem Hatlarını Etkinleştir (Yalnızca Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. Bazı oyunlar için gereklidir. Bu ayar yalnızca Intel'in tescilli sürücüleri için mevcuttur ve etkinleştirilirse çökmeye neden olabilir. Hesaplama işlem hatları diğer tüm sürücülerde her zaman etkindir. - + Enable Reactive Flushing Reaktif Temizlemeyi Etkinleştir - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Tahminli temizleme yerine reaktif temizleme kullanarak daha doğru bellek senkronizasyonu sağlar. - + Sync to framerate of video playback Video oynatma kare hızına senkronize et - + Run the game at normal speed during video playback, even when the framerate is unlocked. Kare hızı kilidi açık olsa bile video oynatımı sırasında oyunu normal hızda çalıştırır. - + Barrier feedback loops Bariyer geri besleme döngüleri - + Improves rendering of transparency effects in specific games. Belirli oyunlarda şeffaflık efektlerinin oluşturulmasını iyileştirir. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State Genişletilmiş Dinamik Durum - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Genişletilmiş Dinamik Durumda kullanılabilecek özelliklerin sayısını kontrol eder. Daha yüksek durumlar daha fazla özelliğe izin verir ve performansı artırabilir, ancak ek grafik sorunlarına neden olabilir. - + Vertex Input Dynamic State Vertex Dinamik Durumu - + Enables vertex input dynamic state feature for better quality and performance. Daha iyi kalite ve performans için Vertex dinamik durum özelliğini etkinleştirir. - + Sample Shading Örnek Gölgelendirme - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Parça gölgelendiricinin, her parça için bir kez yerine çoklu örneklenmiş bir parçadaki her örnek için yürütülmesine olanak tanır. Performans pahasına grafik kalitesini artırır. Daha yüksek değerler kaliteyi artırır ancak performansı düşürür. - + RNG Seed RNG çekirdeği - + Controls the seed of the random number generator. Mainly used for speedrunning. Rastgele sayı üretecinin tohumunu kontrol eder. Esas olarak hızlı bitirme denemeleri için kullanılır. - + Device Name Cihaz İsmi - + The name of the console. Konsolun adı - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: Özel RTC Tarihi - + This option allows to change the clock of the console. Can be used to manipulate time in games. Bu seçenek konsolun saatini değiştirmeye olanak tanır. Oyunlarda zamanı manipüle etmek için kullanılabilir. - + The number of seconds from the current unix time Mevcut unix zamanından itibaren saniye sayısı - + Language: Dil: - + This option can be overridden when region setting is auto-select Bölge ayarı otomatik seçim olduğunda bu seçenek geçersiz kılınabilir. - + Region: Bölge: - + The region of the console. Konsolun bölgesi - + Time Zone: Saat Dilimi: - + The time zone of the console. Konsolun saat dilimi - + Sound Output Mode: Ses Çıkış Modu: - + Console Mode: Konsol Modu: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. Konsolun Yerleşik veya El Modunda olup olmadığını seçer. Oyunlar bu ayara bağlı olarak çözünürlüklerini, detaylarını ve desteklenen kontrolcülerini değiştirecektir. El Moduna ayarlamak, düşük seviyeli sistemler için performansı artırmaya yardımcı olabilir. - + Prompt for user profile on boot Açılışta kullanıcı profili için sor - + Useful if multiple people use the same PC. Aynı bilgisayarı birden fazla kişi kullanıyorsa yararlıdır. - + Pause when not in focus Odaklı değilken duraklat - + Pauses emulation when focusing on other windows. Diğer pencerelere odaklanıldığında emülasyonu duraklatır. - + Confirm before stopping emulation Emülasyonu durdurmadan önce onayla - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Emülasyonu durdurma onayı isteklerini/istemlerini geçersiz kılar. Etkinleştirildiğinde, bu tür istekleri/istemleri atlar ve emülasyonu doğrudan/dirket olarak kapatır. - + Hide mouse on inactivity Hareketsizlik durumunda imleci gizle - + Hides the mouse after 2.5s of inactivity. 2,5 saniye hareketsizlikten sonra fareyi gizler. - + Check for updates Güncellemeleri Kontrol Et - + Whether or not to check for updates upon startup. Başlangıçta güncellemelerin kontrol edilip edilmeyeceği. - + Enable Gamemode Oyun Modunu/Gamemode Etkinleştir - + Force X11 as Graphics Backend Grafik arka ucu olarak X11'i zorla - + Custom frontend Özel ön yüz - + Real applet Gerçek aplikasyon - - + + Disabled Devre Dışı - + Never Asla - + On Load Yüklemede - + Always Her zaman - + CPU CPU - + GPU GPU - + CPU Asynchronous Asenkron CPU - + Uncompressed (Best quality) Sıkıştırılmamış (En iyi kalite) - + BC1 (Low quality) BC1 (Düşük kalite) - + BC3 (Medium quality) BC3 (Orta kalite) - - + + Auto Otomatik - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative Muhafazakar - + Aggressive Agresif - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Boş - + Fast Hızlı - - - + + + Accurate Doğru - - - + + + Default Varsayılan - + Unsafe (fast) Güvenli Değil (hızlı) - + Safe (stable) Güvenli (Stabil) - + Immediate - + Balanced Dengeli - + Unsafe Güvensiz - + Paranoid (disables most optimizations) Paranoya (çoğu optimizasyonu kapatır) - + Debugging Hata ayıklama - + Dynarmic Dinamik - + NCE NCE - + Borderless Windowed Kenarlıksız Tam Ekran - + Exclusive Fullscreen Ayrılmış Tam Ekran - + No Video Output Video Çıkışı Yok - + CPU Video Decoding CPU Video Decoding - + GPU Video Decoding (Default) GPU Video Decoding (Varsayılan) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [DENEYSEL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [DENEYSEL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [DENEYSEL] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [DENEYSEL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [DENEYSEL] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor En Yakın Komşu Algoritması - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gausyen - + Lanczos Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Süper Çözünürlük - + Area Area - + MMPX MMPX - + Zero-Tangent Zero-Tangent - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Yok - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Varsayılan (16:9) - + Force 4:3 4:3'e Zorla - + Force 21:9 21:9'a Zorla - + Force 16:10 16:10'a Zorla - + Stretch to Window Ekrana Sığdır - + Automatic Otomatik - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Japonca (日本語) - + American English Amerikan İngilizcesi - + French (français) Fransızca (français) - + German (Deutsch) Almanca (Deutsch) - + Italian (italiano) İtalyanca (italiano) - + Spanish (español) İspanyolca (español) - + Chinese Çince - + Korean (한국어) Korece (한국어) - + Dutch (Nederlands) Flemenkçe (Nederlands) - + Portuguese (português) Portekizce (português) - + Russian (Русский) Rusça (Русский) - + Taiwanese Tayvanca - + British English İngiliz İngilizcesi - + Canadian French Kanada Fransızcası - + Latin American Spanish Latin Amerika İspanyolcası - + Simplified Chinese Basitleştirilmiş Çince - + Traditional Chinese (正體中文) Geleneksel Çince (正體中文) - + Brazilian Portuguese (português do Brasil) Brezilya Portekizcesi (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Japonya - + USA ABD - + Europe Avrupa - + Australia Avustralya - + China Çin - + Korea Kore - + Taiwan Tayvan - + Auto (%1) Auto select time zone Otomatik (%1) - + Default (%1) Default time zone Varsayılan (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Küba - + EET EET - + Egypt Mısır - + Eire İrlanda - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-İrlanda - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 MT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hong Kong - + HST HST - + Iceland İzlanda - + Iran İran - + Israel İsrail - + Jamaica Jamaika - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navaho - + NZ Yeni Zelanda - + NZ-CHAT Chatham Adaları - + Poland Polonya - + Portugal Portekiz - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapur - + Turkey Türkiye - + UCT UCT - + Universal Evrensel - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) 4GB DRAM (Varsayılan) - + 6GB DRAM (Unsafe) 6GB DRAM (Güvenli Değil) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (Güvenli Değil) - + 12GB DRAM (Unsafe) 12GB DRAM (Güvenli Değil) - + Docked Dock Modu Aktif - + Handheld Taşınabilir - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Her zaman sor (Varsayılan) - + Only if game specifies not to stop Sadece oyun durdurulmamasını belirtirse - + Never ask Asla sorma - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) Orta (256) - + High (512) Yüksek (512) - + ExtendedDynamicState 1 Genişletilmiş Dinamik Durum 1 - + ExtendedDynamicState 2 Genişletilmiş Dinamik Durum 2 - + ExtendedDynamicState 3 Genişletilmiş Dinamik Durum 3 - + Tree View - + Grid View diff --git a/dist/languages/uk.ts b/dist/languages/uk.ts index 2fdce360cc..fd166bc4f9 100644 --- a/dist/languages/uk.ts +++ b/dist/languages/uk.ts @@ -732,12 +732,32 @@ Aggressive mode may impact performance of other applications such as recording s Пропускає деякі анулювання кешу під час оновлень пам’яті, зменшуючи використання ЦП й виправляючи затримки. Це може спричинити збої. - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: Режим вертикальної синхронізації: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -748,12 +768,12 @@ Mailbox може мати меншу затримку, ніж FIFO, і не ма Immediate (без синхронізації) показує всі кадри й може створювати розриви. - + Sync Memory Operations Синхронізувати операції з пам’яттю - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -762,44 +782,44 @@ Unreal Engine 4 games often see the most significant changes thereof. Ігри на Unreal Engine 4 часто зазнають найзначніших змін. - + Enable asynchronous presentation (Vulkan only) Увімкнути асинхронне подання (лише Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. Трохи покращує продуктивність завдяки переміщенню подання на окремий потік ЦП. - + Force maximum clocks (Vulkan only) Примусово максимальна тактова частота (лише Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Виконує роботу у фоновому режимі в очікуванні графічних команд, не даючи змоги ГП знижувати тактову частоту. - + Anisotropic Filtering: Анізотропна фільтрація: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. Керує якістю візуалізації текстур під непрямими кутами. Для більшості ГП можна вільно вибирати 16x. - + GPU Mode: Режим ГП: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -808,24 +828,24 @@ Particles tend to only render correctly with Accurate mode. Частинки зазвичай правильно візуалізуються лише з режимом «Точно». - + DMA Accuracy: Точність DMA: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -834,44 +854,44 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation Увімкнути асинхронну компіляцію шейдерів - + May reduce shader stutter. Може зменшити шейдерні затримки. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle Розпакування за допомогою ГП - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. Прискорює декодування 3D-текстур BCn застосовуючи обчислення за допомогою ГП. Вимкніть у разі збоїв або проблем із графікою. - + GPU Unswizzle Max Texture Size Максимальний розмір текстур для розпакування за допомогою ГП - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -880,48 +900,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size Розмір потоку розпакування за допомогою ГП - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. Встановлює максимальний обсяг даних текстур (у МіБ) для обробки на кадр. Вищі значення здатні зменшити затримки під час завантаження текстур, але можуть вплинути на стабільність кадрів. - + GPU Unswizzle Chunk Size Розмір блоків розпакування за допомогою ГП - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. Визначає кількість зрізів глибини, оброблених за одне відправлення. Збільшення здатне покращити пропускну здатність на потужних ГП, але може призвести до TDR або затримок драйвера зі слабшим устаткуванням. - + Use Vulkan pipeline cache Використовувати кеш конвеєра Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. Вмикає особливий для різних виробників ГП кеш конвеєра. Це налаштування може значно зменшити час завантаження шейдерів у випадках, коли драйвер Vulkan не зберігає власний кеш конвеєра. - + Enable Compute Pipelines (Intel Vulkan Only) Увімкнути обчислювальні конвеєри (лише Intel Vulkan) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -930,194 +950,182 @@ Compute pipelines are always enabled on all other drivers. Обчислювальні конвеєри завжди увімкнені у всіх інших драйверах. - + Enable Reactive Flushing Увімкнути реактивне очищення - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. Використовує реактивне очищення замість прогнозованого, забезпечуючи точнішу синхронізацію пам’яті. - + Sync to framerate of video playback Синхронізувати частоту кадрів з відтворенням відео - + Run the game at normal speed during video playback, even when the framerate is unlocked. Відтворювати гру з нормальною швидкістю під час відтворення відео навіть при розблокованій частоті кадрів. - + Barrier feedback loops Бар’єрні цикли відгуку - + Improves rendering of transparency effects in specific games. Покращує візуалізацію ефектів прозорості в деяких іграх. - + Enable buffer history Увімкнути історію буфера - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. Вмикає доступ до попередніх станів буфера. Цей параметр може покращити якість візуалізації та стабільну продуктивність у деяких іграх. - + Fix bloom effects Виправити ефекти світіння - + Removes bloom in Burnout. Прибирає світіння в Burnout. - - Enable Legacy Rescale Pass - Увімкнути застаріле масштабування - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - Може виправити проблеми з масштабуванням в іграх, покладаючись на поведінку з попередньої імплементації. -Застаріле масштабування виправляє артефакти з лініями на ГП від AMD та Intel, а також сіре блимання текстур на ГП від Nvidia в Luigis Mansion 3. - - - + Extended Dynamic State Розширений динамічний стан - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. Керує кількістю функцій, які можна використовувати в «Розширеному динамічному стані». Вищі значення допускають більше функцій і можуть збільшити продуктивність, але можуть спричинити додаткові проблеми з графікою. - + Vertex Input Dynamic State Динамічний стан введення вершин - + Enables vertex input dynamic state feature for better quality and performance. Вмикає можливість динамічного стану введення вершин для кращих якості й продуктивності. - + Sample Shading Шейдинг зразків - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. Дозволяє виконувати фрагмент шейдера для кожного зразка в багатозразковому фрагменті замість одного разу для кожного фрагмента. Покращує якість графікі ціною втрати продуктивності. Вищі значення покращують якість, але погіршують продуктивність. - + RNG Seed Початкове значення RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. Керує початковим значення генератора випадкових чисел. Зазвичай використовується в спідранах. - + Device Name Назва пристрою - + The name of the console. Назва консолі. - + Homebrew Args Параметри запуску Homebrew - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). Параметри командного рядка, що передаються Homebrew при запуску (як-от noglsl). - + Custom RTC Date: Користувацька дата RTC: - + This option allows to change the clock of the console. Can be used to manipulate time in games. Це налаштування дозволяє змінити час годинника консолі. Можна використовувати для маніпуляцій із часом в іграх. - + The number of seconds from the current unix time Кількість секунд від поточного unix-часу. - + Language: Мова: - + This option can be overridden when region setting is auto-select Це налаштування може перевизначитися, якщо налаштування регіону вибирається автоматично - + Region: Регіон: - + The region of the console. Регіон консолі. - + Time Zone: Часовий пояс: - + The time zone of the console. Часовий пояс консолі. - + Sound Output Mode: Режим виведення звуку: - + Console Mode: Режим консолі: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1126,1026 +1134,1026 @@ Setting to Handheld can help improve performance for low end systems. Налаштування «Портативний» може покращити продуктивність на слабких системах. - + Prompt for user profile on boot Запитувати профіль користувача під час запуску - + Useful if multiple people use the same PC. Корисно, якщо одним комп’ютером користуються кілька користувачів. - + Pause when not in focus Призупиняти, якщо не у фокусі - + Pauses emulation when focusing on other windows. Призупиняє емуляцію при фокусування на інших вікнах. - + Confirm before stopping emulation Підтверджувати зупинку емуляції - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. Перевизначає запити на підтвердження зупинки емуляції. Увімкнення обходить такі запити й одразу зупиняє емуляцію. - + Hide mouse on inactivity Приховувати курсор миші при бездіяльності - + Hides the mouse after 2.5s of inactivity. Приховує курсор миші після 2,5 с її бездіяльності. - + Check for updates Перевіряти оновлення - + Whether or not to check for updates upon startup. Чи перевіряти оновлення при запуску. - + Enable Gamemode Увімкнути ігровий режим - + Force X11 as Graphics Backend Примусово використовувати X11 як графічний бекенд - + Custom frontend Користувацький фронтенд - + Real applet Справжній аплет - - + + Disabled Вимкнено - + Never Ніколи - + On Load При завантаженні - + Always Завжди - + CPU ЦП - + GPU ГП - + CPU Asynchronous Асинхронно ЦП - + Uncompressed (Best quality) Без стиснення (Найкраща якість) - + BC1 (Low quality) ВС1 (Низька якість) - + BC3 (Medium quality) ВС3 (Середня якість) - - + + Auto Автоматично - + 30 FPS 30 к/с - + 60 FPS 60 к/с - + 90 FPS 90 к/с - + 120 FPS 120 к/с - + Conservative Заощадження - + Aggressive Агресивно - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (асемблерні шейдери, лише NVIDIA) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (експериментально, лише AMD/Mesa) - + Null Нічого - + Fast Швидко - - - + + + Accurate Точно - - - + + + Default Стандартно - + Unsafe (fast) Небезпечно (швидко) - + Safe (stable) Безпечно (стабільно) - + Immediate - + Balanced Збалансовано - + Unsafe Небезпечно - + Paranoid (disables most optimizations) Параноїк (вимикає більшість оптимізацій) - + Debugging Зневадження - + Dynarmic Динамічно - + NCE NCE - + Borderless Windowed Безрамкове вікно - + Exclusive Fullscreen Ексклюзивний повноекранний - + No Video Output Виведення відео відсутнє - + CPU Video Decoding Декодування відео на ЦП - + GPU Video Decoding (Default) Декодування відео на ГП (стандатно) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [ЕКСПЕРИМЕНТАЛЬНО] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [ЕКСПЕРИМЕНТАЛЬНО] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [ЕКСПЕРИМЕНТАЛЬНО] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [ЕКСПЕРИМЕНТАЛЬНО] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [ЕКСПЕРИМЕНТАЛЬНО] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Найближчий сусід - + Bilinear Білінійний - + Bicubic Бікубічний - + Gaussian Ґаусса - + Lanczos Ланцоша - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution AMD FidelityFX Super Resolution - + Area Області - + MMPX MMPX - + Zero-Tangent Нульовий тангенс - + B-Spline B-Spline - + Mitchell Мітчелла - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir Snapdragon Game Super Resolution EdgeDir - + None Немає - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Стандартно (16:9) - + Force 4:3 Примусово 4:3 - + Force 21:9 Примусово 21:9 - + Force 16:10 Примусово 16:10 - + Stretch to Window Розтягнути до вікна - + Automatic Автоматично - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Японська (日本語) - + American English Американська англійська - + French (français) Французька (français) - + German (Deutsch) Німецька (Deutsch) - + Italian (italiano) Італійська (italiano) - + Spanish (español) Іспанська (español) - + Chinese Китайська - + Korean (한국어) Корейська (한국어) - + Dutch (Nederlands) Нідерландська (Nederlands) - + Portuguese (português) Португальська (português) - + Russian (Русский) Російська (Русский) - + Taiwanese Тайванська - + British English Британська англійська - + Canadian French Канадська французька - + Latin American Spanish Латиноамериканська іспанська - + Simplified Chinese Спрощена китайська - + Traditional Chinese (正體中文) Традиційна китайська (正體中文) - + Brazilian Portuguese (português do Brasil) Бразильська португальська (português do Brasil) - + Polish (polska) Польська (polska) - + Thai (แบบไทย) Тайська (แบบไทย) - - + + Japan Японія - + USA США - + Europe Європа - + Australia Австралія - + China Китай - + Korea Корея - + Taiwan Тайвань - + Auto (%1) Auto select time zone Автоматично (%1) - + Default (%1) Default time zone Стандартно (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Куба - + EET EET - + Egypt Єгипет - + Eire Ейре - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Гринвіч - + Hongkong Гонконг - + HST HST - + Iceland Ісландія - + Iran Іран - + Israel Ізраїль - + Jamaica Ямайка - + Kwajalein Кваджалейн - + Libya Лівія - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Навахо - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Польща - + Portugal Португалія - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Сінгапур - + Turkey Туреччина - + UCT UCT - + Universal Універсальний - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Зулу - + Mono Моно - + Stereo Стерео - + Surround Об’ємний - + 4GB DRAM (Default) 4GB DRAM (стандартно) - + 6GB DRAM (Unsafe) 6GB DRAM (небезпечно) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (небезпечно) - + 12GB DRAM (Unsafe) 12GB DRAM (небезпечно) - + Docked У докстанції - + Handheld Портативний - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) Завжди запитувати (стандартно) - + Only if game specifies not to stop Лише якщо гра вказує не зупиняти - + Never ask Ніколи не запитувати - + Very Small (16 MB) Дуже малий (16 МБ) - + Small (32 MB) Малий (32 МБ) - + Normal (128 MB) Нормальний (128 МБ) - + Large (256 MB) Великий (256 МБ) - + Very Large (512 MB) Дуже великий (512 МБ) - + Very Low (4 MB) Дуже низький (4 МБ) - + Low (8 MB) Низький (8 МБ) - + Normal (16 MB) Нормальний (16 МБ) - + Medium (32 MB) Середній (32 МБ) - + High (64 MB) Високий (64 МБ) - + Very Low (32) Дуже низький (32) - + Low (64) Низький (64) - + Normal (128) Нормальний (128) - + Medium (256) Середньо (256) - + High (512) Високо (512) - + ExtendedDynamicState 1 Розширений динамічний стан 1 - + ExtendedDynamicState 2 Розширений динамічний стан 2 - + ExtendedDynamicState 3 Розширений динамічний стан 3 - + Tree View Дерево вибору - + Grid View Таблиця diff --git a/dist/languages/vi.ts b/dist/languages/vi.ts index f1257a08f5..f0a7e591bd 100644 --- a/dist/languages/vi.ts +++ b/dist/languages/vi.ts @@ -696,12 +696,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: Chế độ Vsync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -709,79 +729,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Bật hiển thị bất đồng bộ (chỉ cho Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) Buộc chạy ở xung nhịp tối đa (chỉ cho Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Chạy các công việc trong nền trong khi đang chờ lệnh đồ họa để giữ cho GPU không giảm xung nhịp. - + Anisotropic Filtering: Lọc bất đẳng hướng: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -790,1301 +810,1290 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Dùng bộ nhớ đệm pipeline Vulkan - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Bật xả tương ứng - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback Đồng bộ hóa với tốc độ khung hình khi phát video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Chạy game với tốc độ bình thường trong quá trình phát video, ngay cả khi tốc độ khung hình được mở khóa. - + Barrier feedback loops Vòng lặp phản hồi rào cản - + Improves rendering of transparency effects in specific games. Cải thiện hiệu quả kết xuất của hiệu ứng trong suốt trong một số game. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Hạt giống RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Tên thiết bị - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Vùng: - + The region of the console. - + Time Zone: Múi giờ: - + The time zone of the console. - + Sound Output Mode: Chế độ đầu ra âm thanh: - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ẩn con trỏ chuột khi không dùng - + Hides the mouse after 2.5s of inactivity. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - - + + Disabled - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) Không nén (Chất lượng tốt nhất) - + BC1 (Low quality) BC1 (Chất lượng thấp) - + BC3 (Medium quality) BC3 (Chất lượng trung bình) - - + + Auto Tự động - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Chính xác - - - + + + Default Mặc định - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Không an toàn - + Paranoid (disables most optimizations) Paranoid (vô hiệu hoá hầu hết sự tối ưu) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Cửa sổ không viền - + Exclusive Fullscreen Toàn màn hình - + No Video Output Không có đầu ra video - + CPU Video Decoding Giải mã video bằng CPU - + GPU Video Decoding (Default) Giải mã video bằng GPU (Mặc định) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [THỬ NGHIỆM] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [THỬ NGHIỆM] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian Gaussian - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Không có - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Mặc định (16:9) - + Force 4:3 Dùng 4:3 - + Force 21:9 Dùng 21:9 - + Force 16:10 Dùng 16:10 - + Stretch to Window Mở rộng đến cửa sổ - + Automatic Tự động - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Español) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Nederlands) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh Anh - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Tây Ban Nha Mỹ Latinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha Brasil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Docked - + Handheld Handheld - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index 64edf2850d..51156ca9c8 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -696,12 +696,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: Chế độ Vsync: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -709,79 +729,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) Bật hiển thị bất đồng bộ (chỉ dành cho Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. - + Force maximum clocks (Vulkan only) Buộc chạy ở xung nhịp tối đa (chỉ Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. Chạy các công việc trong nền trong khi đang chờ lệnh đồ họa để giữ cho GPU không giảm xung nhịp. - + Anisotropic Filtering: Bộ lọc góc nghiêng: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -790,1301 +810,1290 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache Dùng Vulkan pipeline cache - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. - + Enable Compute Pipelines (Intel Vulkan Only) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing Bật xả tương ứng - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. - + Sync to framerate of video playback Đồng bộ hóa với tốc độ khung hình khi phát video - + Run the game at normal speed during video playback, even when the framerate is unlocked. Chạy game với tốc độ bình thường trong quá trình phát video, ngay cả khi tốc độ khung hình được mở khóa. - + Barrier feedback loops Vòng lặp phản hồi rào cản - + Improves rendering of transparency effects in specific games. Cải thiện hiệu quả hiển thị của hiệu ứng trong suốt trong một số trò chơi. - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed Hạt giống RNG - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name Tên thiết bị - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: - + This option can be overridden when region setting is auto-select - + Region: Vùng: - + The region of the console. - + Time Zone: Múi giờ: - + The time zone of the console. - + Sound Output Mode: Chế độ đầu ra âm thanh - + Console Mode: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity Ẩn con trỏ chuột khi không dùng - + Hides the mouse after 2.5s of inactivity. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode - + Force X11 as Graphics Backend - + Custom frontend - + Real applet - - + + Disabled - + Never - + On Load - + Always - + CPU CPU - + GPU - + CPU Asynchronous - + Uncompressed (Best quality) Không nén (Chất lượng tốt nhất) - + BC1 (Low quality) BC1 (Chất lượng thấp) - + BC3 (Medium quality) BC3 (Chất lượng trung bình) - - + + Auto Tự động - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative - + Aggressive - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null Null - + Fast - - - + + + Accurate Tuyệt đối - - - + + + Default Mặc định - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe Tương đối - + Paranoid (disables most optimizations) Paranoid (vô hiệu hoá hầu hết sự tối ưu) - + Debugging - + Dynarmic - + NCE - + Borderless Windowed Cửa sổ không viền - + Exclusive Fullscreen Toàn màn hình - + No Video Output Không Video Đầu Ra - + CPU Video Decoding Giải mã video bằng CPU - + GPU Video Decoding (Default) Giải mã video bằng GPU (Mặc định) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [THỬ NGHIỆM] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [THỬ NGHIỆM] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor Nearest Neighbor - + Bilinear Bilinear - + Bicubic Bicubic - + Gaussian ScaleForce - + Lanczos - + ScaleForce ScaleForce - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None Trống - + FXAA FXAA - + SMAA SMAA - + Default (16:9) Mặc định (16:9) - + Force 4:3 Dùng 4:3 - + Force 21:9 Dùng 21:9 - + Force 16:10 Dung 16:10 - + Stretch to Window Kéo dãn đến cửa sổ phần mềm - + Automatic Tự động - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) Tiếng Nhật (日本語) - + American English Tiếng Anh Mỹ - + French (français) Tiếng Pháp (French) - + German (Deutsch) Tiếng Đức (Deutsch) - + Italian (italiano) Tiếng Ý (italiano) - + Spanish (español) Tiếng Tây Ban Nha (Spanish) - + Chinese Tiếng Trung - + Korean (한국어) Tiếng Hàn (한국어) - + Dutch (Nederlands) Tiếng Hà Lan (Dutch) - + Portuguese (português) Tiếng Bồ Đào Nha (Portuguese) - + Russian (Русский) Tiếng Nga (Русский) - + Taiwanese Tiếng Đài Loan - + British English Tiếng Anh UK (British English) - + Canadian French Tiếng Pháp Canada - + Latin American Spanish Tiếng Mỹ La-tinh - + Simplified Chinese Tiếng Trung giản thể - + Traditional Chinese (正體中文) Tiếng Trung phồn thể (正體中文) - + Brazilian Portuguese (português do Brasil) Tiếng Bồ Đào Nha của người Brazil (Português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan Nhật Bản - + USA Hoa Kỳ - + Europe Châu Âu - + Australia Châu Úc - + China Trung Quốc - + Korea Hàn Quốc - + Taiwan Đài Loan - + Auto (%1) Auto select time zone Tự động (%1) - + Default (%1) Default time zone Mặc định (%1) - + CET CET - + CST6CDT CST6CDT - + Cuba Cuba - + EET EET - + Egypt Ai Cập - + Eire Eire - + EST EST - + EST5EDT EST5EDT - + GB GB - + GB-Eire GB-Eire - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich Greenwich - + Hongkong Hồng Kông - + HST HST - + Iceland Iceland - + Iran Iran - + Israel Israel - + Jamaica Jamaica - + Kwajalein Kwajalein - + Libya Libya - + MET MET - + MST MST - + MST7MDT MST7MDT - + Navajo Navajo - + NZ NZ - + NZ-CHAT NZ-CHAT - + Poland Ba Lan - + Portugal Bồ Đào Nha - + PRC PRC - + PST8PDT PST8PDT - + ROC ROC - + ROK ROK - + Singapore Singapore - + Turkey Thổ Nhĩ Kỳ - + UCT UCT - + Universal Quốc tế - + UTC UTC - + W-SU W-SU - + WET WET - + Zulu Zulu - + Mono Mono - + Stereo Stereo - + Surround Surround - + 4GB DRAM (Default) - + 6GB DRAM (Unsafe) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked Chế độ cắm TV - + Handheld Cầm tay - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) - + Only if game specifies not to stop - + Never ask - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index e6d5890370..2b86a73843 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -734,12 +734,32 @@ Aggressive mode may impact performance of other applications such as recording s 在内存更新期间跳过某些缓存失效,从而降低 CPU 使用率并改善延迟。这可能导致软件崩溃。 - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: 垂直同步模式: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -750,12 +770,12 @@ Mailbox 的延迟可能比 FIFO 低且不会导致撕裂,但可能会丢帧。 Immediate (不同步) 会呈现全部可用内容,并可能出现撕裂。 - + Sync Memory Operations 同步内存操作 - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. @@ -764,44 +784,44 @@ Unreal Engine 4 games often see the most significant changes thereof. 虚幻 4 引擎的游戏通常会看到最显著的变化。 - + Enable asynchronous presentation (Vulkan only) 启用异步帧提交 (仅限 Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. 将帧提交移动到单独的 CPU 线程,略微提高性能。 - + Force maximum clocks (Vulkan only) 强制最大时钟 (仅限 Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. 在后台运行的同时等待图形命令,以防止 GPU 降低时钟速度。 - + Anisotropic Filtering: 各向异性过滤: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. 控制在斜角下纹理渲染的质量。 大多数 GPU 上设置为 16 倍是安全的。 - + GPU Mode: GPU 模式: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. @@ -809,12 +829,12 @@ Particles tend to only render correctly with Accurate mode. 大多数游戏在“快速”模式下渲染效果良好,但有些游戏仍需使用“精确”模式。而粒子效果通常只有在“精确”模式下才能正确渲染。 - + DMA Accuracy: DMA 精度: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. @@ -823,12 +843,12 @@ Default follows the GPU Accuracy setting. 默认使用 GPU 精度设置。 - + GPU Fence Behavior: GPU 围栏行为: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -837,43 +857,43 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation 开启异步着色器编译 - + May reduce shader stutter. 可能减少着色器卡顿。 - + GPU Clocks GPU 时钟频率 - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. 通过让游戏误以为 GPU 的处理速度比实际更快,以避免游戏为了适应 Switch 的时钟频率而降低分辨率和渲染距离。 - + GPU Unswizzle GPU 还原 - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. 利用 GPU 计算来加速 BCn 格式 3D 纹理的解码。如果遇到崩溃或画面花屏,请禁用此项。 - + GPU Unswizzle Max Texture Size GPU 还原最大纹理尺寸 - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. @@ -882,48 +902,48 @@ Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size GPU 还原流大小 - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. 设置每帧处理的纹理数据最大量(单位:MiB)。 较高的数值可以减少纹理加载时的卡顿,但可能会影响帧率的稳定性(即造成帧时间波动)。 - + GPU Unswizzle Chunk Size GPU 还原块大小 - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. 确定在单次调度(Dispatch)中处理的深度切片(Depth Slices)数量。 增加此数值可以提高高端 GPU 的吞吐量(处理效率),但在性能较弱的硬件上可能会引发 TDR(驱动程序重置)或驱动超时。 - + Use Vulkan pipeline cache 启用 Vulkan 管线缓存 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. 启用 GPU 供应商专用的管线缓存。 在 Vulkan 驱动程序内部不存储管线缓存的情况下,此选项可显著提高着色器加载速度。 - + Enable Compute Pipelines (Intel Vulkan Only) 启用计算管线 (仅限 Intel 显卡 Vulkan 模式) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. @@ -932,193 +952,181 @@ Compute pipelines are always enabled on all other drivers. 在所有其他驱动程序上始终启用计算管线。 - + Enable Reactive Flushing 启用反应性刷新 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 使用反应性刷新取代预测性刷新,从而更精确地同步内存。 - + Sync to framerate of video playback 播放视频时帧率同步 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 在视频播放期间以正常速度运行游戏,即使帧率未锁定。 - + Barrier feedback loops 屏障反馈环路 - + Improves rendering of transparency effects in specific games. 改进某些游戏中透明效果的渲染。 - + Enable buffer history 启用缓冲区历史 - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. 允许访问之前的缓冲状态。 这个选项可能会提升某些游戏的渲染质量和性能一致性。 - + Fix bloom effects 修复泛光效果 - + Removes bloom in Burnout. 去除《火爆狂飙》中的泛光特效。 - - Enable Legacy Rescale Pass - 启用旧版缩放 - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - 通过依赖之前实现的行为,可能会修复部分游戏的缩放重叠问题。 -修复 AMD 和 Intel 显卡上的线条伪影,以及《路易斯洋楼3》中 Nvidia 显卡的灰色纹理闪烁的遗留行为变通方法。 - - - + Extended Dynamic State 扩展动态状态 - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. 控制在扩展动态状态中可使用的函数数量。更高的数值允许启用更多功能,并可能提升性能,但同时也可能导致额外的图形问题。 - + Vertex Input Dynamic State 顶点输入动态状态 - + Enables vertex input dynamic state feature for better quality and performance. 开启顶点输入动态状态功能来获得更好的质量和性能。 - + Sample Shading 采样着色 - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. 允许片段着色器在多重采样的片段中每个样本执行一次而不是每个片段执行一次。可以提高图形质量,但会降低性能。 更高的值可以提高质量但会降低性能。 - + RNG Seed 随机数生成器种子 - + Controls the seed of the random number generator. Mainly used for speedrunning. 控制随机数生成器的种子。 主要用于竞速游戏。 - + Device Name 设备名称 - + The name of the console. 主机的数量。 - + Homebrew Args 自制软件参数 - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). 启动 homebrew 时需要传递的命令行参数 (例如 -noglsl)。 - + Custom RTC Date: 自定义系统时间: - + This option allows to change the clock of the console. Can be used to manipulate time in games. 此选项允许更改控制台的时钟。 可用于操纵游戏中的时间。 - + The number of seconds from the current unix time 来自当前 unix 时间的秒数。 - + Language: 语言: - + This option can be overridden when region setting is auto-select 当区域设置为自动选择时可以使用此选项替代。 - + Region: 地区: - + The region of the console. 主机的区域。 - + Time Zone: 时区: - + The time zone of the console. 主机的时区。 - + Sound Output Mode: 声音输出模式: - + Console Mode: 控制台模式: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. @@ -1127,1026 +1135,1026 @@ Setting to Handheld can help improve performance for low end systems. 将设置为掌机模式可以帮助低端系统提高性能。 - + Prompt for user profile on boot 启动时提示选择用户账户 - + Useful if multiple people use the same PC. 在多人使用相同的 PC 时有效。 - + Pause when not in focus 在丢失焦点时暂停 - + Pauses emulation when focusing on other windows. 当焦点位于其它窗口时暂停模拟器。 - + Confirm before stopping emulation 停止模拟时需要确认 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. 替代提示以确认停止模拟。 启用它将绕过此类提示并直接退出模拟。 - + Hide mouse on inactivity 自动隐藏鼠标光标 - + Hides the mouse after 2.5s of inactivity. 在 2.5 秒无活动后隐藏鼠标。 - + Check for updates 检查更新 - + Whether or not to check for updates upon startup. 在启动时是否检查更新。 - + Enable Gamemode 启用游戏模式 - + Force X11 as Graphics Backend 强制使用 X11 作为图形后端 - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - - + + Disabled 禁用 - + Never 永不 - + On Load 加载时 - + Always 总是 - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不压缩 (最高质量) - + BC1 (Low quality) BC1 (低质量) - + BC3 (Medium quality) BC3 (中等质量) - - + + Auto 自动 - + 30 FPS 30 FPS - + 60 FPS 60 FPS - + 90 FPS 90 FPS - + 120 FPS 120 FPS - + Conservative 保守模式 - + Aggressive 激进模式 - + Vulkan Vulkan - + OpenGL GLSL OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) OpenGL GLASM (汇编着色器,仅限 NVIDIA 显卡) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) OpenGL SPIR-V (实验性,仅限 AMD/Mesa) - + Null 无 - + Fast 高速 - - - + + + Accurate 高精度 - - - + + + Default 系统默认 - + Unsafe (fast) 不安全(快速) - + Safe (stable) 安全(稳定) - + Immediate 即时 - + Balanced 平衡 - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Debugging 调试 - + Dynarmic 动态编译 - + NCE 本机代码执行 - + Borderless Windowed 无边框窗口 - + Exclusive Fullscreen 独占全屏 - + No Video Output 无视频输出 - + CPU Video Decoding CPU 视频解码 - + GPU Video Decoding (Default) GPU 视频解码 (默认) - + 0.25X (180p/270p) [EXPERIMENTAL] 0.25X (180p/270p) [实验性] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [实验性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] 1.25X (900p/1350p) [实验性] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [实验性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 近邻取样 - + Bilinear 双线性过滤 - + Bicubic 双三线过滤 - + Gaussian 高斯模糊 - + Lanczos Lanczos - + ScaleForce 强制缩放 - + AMD FidelityFX Super Resolution AMD FidelityFX 超级分辨率 - + Area 区域 - + MMPX MMPX - + Zero-Tangent 零切线 - + B-Spline B-Spline - + Mitchell Mitchell - + Spline-1 Spline-1 - + Snapdragon Game Super Resolution 骁龙游戏超级分辨率 - + Snapdragon Game Super Resolution EdgeDir 骁龙游戏超级分辨率 EdgeDir - + None 无 - + FXAA 快速近似抗锯齿 - + SMAA 子像素形态学抗锯齿 - + Default (16:9) 默认 (16:9) - + Force 4:3 强制 4:3 - + Force 21:9 强制 21:9 - + Force 16:10 强制 16:10 - + Stretch to Window 拉伸窗口 - + Automatic 自动 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日语 (日本語) - + American English 美式英语 - + French (français) 法语 (français) - + German (Deutsch) 德语 (Deutsch) - + Italian (italiano) 意大利语 (italiano) - + Spanish (español) 西班牙语 (español) - + Chinese 中文 - + Korean (한국어) 韩语 (한국어) - + Dutch (Nederlands) 荷兰语 (Nederlands) - + Portuguese (português) 葡萄牙语 (português) - + Russian (Русский) 俄语 (Русский) - + Taiwanese 台湾中文 - + British English 英式英语 - + Canadian French 加拿大法语 - + Latin American Spanish 拉美西班牙语 - + Simplified Chinese 简体中文 - + Traditional Chinese (正體中文) 繁体中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙语 (português do Brasil) - + Polish (polska) 波兰语(波兰语) - + Thai (แบบไทย) 泰语 - - + + Japan 日本 - + USA 美国 - + Europe 欧洲 - + Australia 澳大利亚 - + China 中国 - + Korea 韩国 - + Taiwan 台湾地区 - + Auto (%1) Auto select time zone 自动 (%1) - + Default (%1) Default time zone 默认 (%1) - + CET 欧洲中部时间 - + CST6CDT 古巴标准时间&古巴夏令时 - + Cuba 古巴 - + EET 东欧时间 - + Egypt 埃及 - + Eire 爱尔兰 - + EST 东部标准时间 - + EST5EDT 东部标准时间&东部夏令时 - + GB 英国 - + GB-Eire 英国-爱尔兰时间 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 美国夏威夷时间 - + Iceland 冰岛 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙买加 - + Kwajalein 夸贾林环礁 - + Libya 利比亚 - + MET 中欧时间 - + MST 山区标准时间 (北美) - + MST7MDT 山区标准时间&山区夏令时 (北美) - + Navajo 纳瓦霍 - + NZ 新西兰时间 - + NZ-CHAT NZ-CHAT - + Poland 波兰 - + Portugal 葡萄牙 - + PRC 中国标准时间 - + PST8PDT 太平洋标准时间&太平洋夏令时 - + ROC 台湾时间 - + ROK 韩国时间 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界时间 - + UTC 协调世界时 - + W-SU 欧洲-莫斯科时间 - + WET 西欧时间 - + Zulu 祖鲁 - + Mono 单声道 - + Stereo 立体声 - + Surround 环绕声 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM 8GB DRAM - + 10GB DRAM (Unsafe) 10GB DRAM (不安全) - + 12GB DRAM (Unsafe) 12GB DRAM (不安全) - + Docked 主机模式 - + Handheld 掌机模式 - - + + Normal 正常 - - + + Boost 升频 - - + + Overclock 超频 - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - + Very Small (16 MB) 很小 (16 MB) - + Small (32 MB) 较小 (32 MB) - + Normal (128 MB) 正常 (128 MB) - + Large (256 MB) 较大 (256 MB) - + Very Large (512 MB) 很大 (512 MB) - + Very Low (4 MB) 很低 (4 MB) - + Low (8 MB) 低 (8 MB) - + Normal (16 MB) 正常 (16 MB) - + Medium (32 MB) 中 (32 MB) - + High (64 MB) 高 (64 MB) - + Very Low (32) 很低 (32) - + Low (64) 低 (64) - + Normal (128) 正常 (128) - + Medium (256) 中(256) - + High (512) 高(512) - + ExtendedDynamicState 1 扩展动态状态 1 - + ExtendedDynamicState 2 扩展动态状态 2 - + ExtendedDynamicState 3 扩展动态状态 3 - + Tree View 树景视图 - + Grid View 网格视图 diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index 499262847d..463d7fa2ed 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -722,12 +722,32 @@ Aggressive mode may impact performance of other applications such as recording s - + + GPU Readback Before NCE Invalidation + + + + + Flushes GPU buffer data back to guest memory before NCE invalidates the whole guest page, preserving it while the CPU store proceeds. + + + + + Patch Runtime NROs for NCE + + + + + Applies NCE code patches to runtime-loaded NRO modules.This is required for some games to run correctly. + + + + VSync Mode: 垂直同步: - + FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen refresh rate. FIFO Relaxed allows tearing as it recovers from a slow down. Mailbox can have lower latency than FIFO and does not tear but may drop frames. @@ -735,79 +755,79 @@ Immediate (no synchronization) presents whatever is available and can exhibit te - + Sync Memory Operations 同步記憶體操作 - + Ensures data consistency between compute and memory operations. This option fixes issues in games, but may degrade performance. Unreal Engine 4 games often see the most significant changes thereof. - + Enable asynchronous presentation (Vulkan only) 啟用非同步顯示(僅限Vulkan) - + Slightly improves performance by moving presentation to a separate CPU thread. 透過將畫面顯示移至獨立的CPU執行緒來略微提升性能。 - + Force maximum clocks (Vulkan only) 強制使用最大時脈(僅限Vulkan) - + Runs work in the background while waiting for graphics commands to keep the GPU from lowering its clock speed. 在等待圖形命令時於背景執行任務以防GPU降低時脈 - + Anisotropic Filtering: 各向異性過濾: - + Controls the quality of texture rendering at oblique angles. Safe to set at 16x on most GPUs. - + GPU Mode: - + Controls the GPU emulation mode. Most games render fine with Fast, but Accurate is still required for some. Particles tend to only render correctly with Accurate mode. - + DMA Accuracy: - + Controls the DMA read mode. Unsafe is faster, while Safe is more stable and can fix issues in some games. Default follows the GPU Accuracy setting. - + GPU Fence Behavior: - + Controls the GPU fence synchronization behavior. Immediate is the fastest option, but can introduce some issues. Balanced offers better compatibility and may fix issues in some games. @@ -816,1302 +836,1291 @@ Default follows the GPU Mode setting. - + Enable asynchronous shader compilation - + May reduce shader stutter. - + GPU Clocks - + Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch's clocks. - + GPU Unswizzle - + Accelerates BCn 3D texture decoding using GPU compute. Disable if experiencing crashes or graphical glitches. - + GPU Unswizzle Max Texture Size - + Sets the maximum size (MiB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead. - + GPU Unswizzle Stream Size - + Sets the maximum amount of texture data (in MiB) processed per frame. Higher values can reduce stutter during texture loading but may impact frame consistency. - + GPU Unswizzle Chunk Size - + Determines the number of depth slices processed in a single dispatch. Increasing this can improve throughput on high-end GPUs but may cause TDR or driver timeouts on weaker hardware. - + Use Vulkan pipeline cache 启用 Vulkan 管线缓存 - + Enables GPU vendor-specific pipeline cache. This option can improve shader loading time significantly in cases where the Vulkan driver does not store pipeline cache files internally. 启用 GPU 供应商专用的管线缓存。 在 Vulkan 驱动程序内部不存储管线缓存的情况下,此选项可显著提高着色器加载速度。 - + Enable Compute Pipelines (Intel Vulkan Only) 启用计算管线 (仅限 Intel 显卡 Vulkan 模式) - + Required by some games. This setting only exists for Intel proprietary drivers and may crash if enabled. Compute pipelines are always enabled on all other drivers. - + Enable Reactive Flushing 启用反应性刷新 - + Uses reactive flushing instead of predictive flushing, allowing more accurate memory syncing. 使用反应性刷新取代预测性刷新,从而更精确地同步内存。 - + Sync to framerate of video playback 播放视频时帧率同步 - + Run the game at normal speed during video playback, even when the framerate is unlocked. 在视频播放期间以正常速度运行游戏,即使帧率未锁定。 - + Barrier feedback loops 屏障反馈循环 - + Improves rendering of transparency effects in specific games. 改进某些游戏中透明效果的渲染。 - + Enable buffer history - + Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games. - + Fix bloom effects - + Removes bloom in Burnout. - - Enable Legacy Rescale Pass - - - - - May fix rescale issues in some games by relying on behavior from the previous implementation. -Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and grey texture flicker on Nvidia GPUs in Luigis Mansion 3. - - - - + Extended Dynamic State - + Controls the number of features that can be used in Extended Dynamic State. Higher states allow for more features and can increase performance, but may cause additional graphical issues. - + Vertex Input Dynamic State - + Enables vertex input dynamic state feature for better quality and performance. - + Sample Shading - + Allows the fragment shader to execute per sample in a multi-sampled fragment instead of once per fragment. Improves graphics quality at the cost of performance. Higher values improve quality but degrade performance. - + RNG Seed 隨機種子 - + Controls the seed of the random number generator. Mainly used for speedrunning. - + Device Name 裝置名稱 - + The name of the console. - + Homebrew Args - + Command-line arguments passed to homebrew at launch (e.g. -noglsl). - + Custom RTC Date: 自定义系统时间: - + This option allows to change the clock of the console. Can be used to manipulate time in games. - + The number of seconds from the current unix time - + Language: 语言: - + This option can be overridden when region setting is auto-select - + Region: 區域: - + The region of the console. - + Time Zone: 時區: - + The time zone of the console. - + Sound Output Mode: 音訊輸出模式: - + Console Mode: 控制台模式: - + Selects if the console is in Docked or Handheld mode. Games will change their resolution, details and supported controllers and depending on this setting. Setting to Handheld can help improve performance for low end systems. - + Prompt for user profile on boot - + Useful if multiple people use the same PC. - + Pause when not in focus - + Pauses emulation when focusing on other windows. - + Confirm before stopping emulation 停止模拟时需要确认 - + Overrides prompts asking to confirm stopping the emulation. Enabling it bypasses such prompts and directly exits the emulation. - + Hide mouse on inactivity 滑鼠閒置時自動隱藏 - + Hides the mouse after 2.5s of inactivity. - + Check for updates - + Whether or not to check for updates upon startup. - + Enable Gamemode 启用游戏模式 - + Force X11 as Graphics Backend - + Custom frontend 自定义前端 - + Real applet 真实的小程序 - - + + Disabled - + Never - + On Load - + Always - + CPU CPU - + GPU GPU - + CPU Asynchronous CPU 异步模拟 - + Uncompressed (Best quality) 不壓縮 (最高品質) - + BC1 (Low quality) BC1 (低品質) - + BC3 (Medium quality) BC3 (中品質) - - + + Auto 自動 - + 30 FPS - + 60 FPS - + 90 FPS - + 120 FPS - + Conservative 保守模式(节省 VRAM) - + Aggressive 激进模式 - + Vulkan Vulkan - + OpenGL GLSL - + OpenGL GLASM (Assembly Shaders, NVIDIA Only) - + OpenGL SPIR-V (Experimental, AMD/Mesa Only) - + Null 無 - + Fast - - - + + + Accurate 高精度 - - - + + + Default 預設 - + Unsafe (fast) - + Safe (stable) - + Immediate - + Balanced - + Unsafe 低精度 - + Paranoid (disables most optimizations) 偏执模式 (禁用绝大多数优化项) - + Debugging - + Dynarmic Dynarmic - + NCE NCE - + Borderless Windowed 無邊框視窗 - + Exclusive Fullscreen 全螢幕獨占 - + No Video Output 無視訊輸出 - + CPU Video Decoding CPU 視訊解碼 - + GPU Video Decoding (Default) GPU 視訊解碼(預設) - + 0.25X (180p/270p) [EXPERIMENTAL] - + 0.5X (360p/540p) [EXPERIMENTAL] 0.5X (360p/540p) [实验性] - + 0.75X (540p/810p) [EXPERIMENTAL] 0.75X (540p/810p) [實驗性] - + 1X (720p/1080p) 1X (720p/1080p) - + 1.25X (900p/1350p) [EXPERIMENTAL] - + 1.5X (1080p/1620p) [EXPERIMENTAL] 1.5X (1080p/1620p) [實驗性] - + 2X (1440p/2160p) 2X (1440p/2160p) - + 3X (2160p/3240p) 3X (2160p/3240p) - + 4X (2880p/4320p) 4X (2880p/4320p) - + 5X (3600p/5400p) 5X (3600p/5400p) - + 6X (4320p/6480p) 6X (4320p/6480p) - + 7X (5040p/7560p) 7X (5040p/7560p) - + 8X (5760p/8640p) 8X (5760p/8640p) - + Nearest Neighbor 最近鄰 - + Bilinear 雙線性 - + Bicubic 雙立方 - + Gaussian 高斯 - + Lanczos - + ScaleForce 強制縮放 - + AMD FidelityFX Super Resolution - + Area - + MMPX - + Zero-Tangent - + B-Spline - + Mitchell - + Spline-1 - + Snapdragon Game Super Resolution - + Snapdragon Game Super Resolution EdgeDir - + None 無 - + FXAA FXAA - + SMAA SMAA - + Default (16:9) 預設 (16:9) - + Force 4:3 強制 4:3 - + Force 21:9 強制 21:9 - + Force 16:10 強制 16:10 - + Stretch to Window 延伸視窗 - + Automatic 自動 - + 2x 2x - + 4x 4x - + 8x 8x - + 16x 16x - + Japanese (日本語) 日文 (日本語) - + American English 美式英语 - + French (français) 法文 (français) - + German (Deutsch) 德文 (Deutsch) - + Italian (italiano) 義大利文 (italiano) - + Spanish (español) 西班牙文 (español) - + Chinese 中文 - + Korean (한국어) 韓文 (한국어) - + Dutch (Nederlands) 荷蘭文 (Nederlands) - + Portuguese (português) 葡萄牙文 (português) - + Russian (Русский) 俄文 (Русский) - + Taiwanese 台灣中文 - + British English 英式英文 - + Canadian French 加拿大法文 - + Latin American Spanish 拉丁美洲西班牙文 - + Simplified Chinese 簡體中文 - + Traditional Chinese (正體中文) 正體中文 (正體中文) - + Brazilian Portuguese (português do Brasil) 巴西-葡萄牙語 (português do Brasil) - + Polish (polska) - + Thai (แบบไทย) - - + + Japan 日本 - + USA 美國 - + Europe 歐洲 - + Australia 澳洲 - + China 中國 - + Korea 南韓 - + Taiwan 台灣 - + Auto (%1) Auto select time zone 自動 (%1) - + Default (%1) Default time zone 預設 (%1) - + CET 中歐 - + CST6CDT CST6CDT - + Cuba 古巴 - + EET EET - + Egypt 埃及 - + Eire 愛爾蘭 - + EST 北美東部 - + EST5EDT EST5EDT - + GB GB - + GB-Eire 英國-愛爾蘭 - + GMT GMT - + GMT+0 GMT+0 - + GMT-0 GMT-0 - + GMT0 GMT0 - + Greenwich 格林威治 - + Hongkong 香港 - + HST 夏威夷 - + Iceland 冰島 - + Iran 伊朗 - + Israel 以色列 - + Jamaica 牙買加 - + Kwajalein 瓜加林環礁 - + Libya 利比亞 - + MET 中歐 - + MST 北美山區 - + MST7MDT MST7MDT - + Navajo 納瓦霍 - + NZ 紐西蘭 - + NZ-CHAT 紐西蘭-查塔姆群島 - + Poland 波蘭 - + Portugal 葡萄牙 - + PRC 中國 - + PST8PDT 太平洋 - + ROC 臺灣 - + ROK 韓國 - + Singapore 新加坡 - + Turkey 土耳其 - + UCT UCT - + Universal 世界 - + UTC UTC - + W-SU 莫斯科 - + WET 西歐 - + Zulu 協調世界時 - + Mono 單聲道 - + Stereo 立體聲 - + Surround 環繞音效 - + 4GB DRAM (Default) 4GB DRAM (默认) - + 6GB DRAM (Unsafe) 6GB DRAM (不安全) - + 8GB DRAM - + 10GB DRAM (Unsafe) - + 12GB DRAM (Unsafe) - + Docked TV - + Handheld 掌機模式 - - + + Normal - - + + Boost - - + + Overclock - + Always ask (Default) 总是询问 (默认) - + Only if game specifies not to stop 仅当游戏不希望停止时 - + Never ask 从不询问 - + Very Small (16 MB) - + Small (32 MB) - + Normal (128 MB) - + Large (256 MB) - + Very Large (512 MB) - + Very Low (4 MB) - + Low (8 MB) - + Normal (16 MB) - + Medium (32 MB) - + High (64 MB) - + Very Low (32) - + Low (64) - + Normal (128) - + Medium (256) - + High (512) - + ExtendedDynamicState 1 - + ExtendedDynamicState 2 - + ExtendedDynamicState 3 - + Tree View - + Grid View diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 5669aab8ba..09722b486e 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -254,7 +254,7 @@ إعداد بيانات المحاكي يلزم وجود مفاتيح حتى يعمل المحاكي، ويوصى باستخدام الفيرموير ويكون ضروريًا لاستخدام تطبيق القائمة الرئيسية. منح الأذونات - منح أذونات اختيارية لاستخدام ميزات معينة للمحاكي + منح أذونات اختيارية لاستخدام ميزات محددة في المحاكي العديد من الألعاب تتطلب الوصول إلى الفيرموير لتشغيل بشكل صحيح. https://yuzu-mirror.github.io/help/quickstart/#guide-introduction الإشعارات @@ -587,6 +587,10 @@ يجعل اللعبة تعتقد أن عمل وحدة معالجة الرسومات ينتهي بشكل أسرع مما هو عليه في الواقع، لذلك تتوقف عن خفض الدقة ومسافة العرض لتتناسب مع سرعات جهاز Switch. تخطي إبطال صلاحية وحدة المعالجة المركزية الداخلية يتخطى بعض عمليات إبطال ذاكرة التخزين المؤقتة من جانب وحدة المعالجة المركزية أثناء تحديثات الذاكرة، مما يقلل من استخدام وحدة المعالجة المركزية ويحسن أداءها. قد يتسبب ذلك في حدوث أعطال أو تعطل في بعض الألعاب. + إعادة قراءة وحدة معالجة الرسومات قبل إبطال صلاحية NCE + إصلاح مؤقت. يعالج مشكلة تعطل لعبة Ender Magnolia (وغيرها من ألعاب UE). قد يؤدي إلى انخفاض في الأداء. يجري العمل على تحسينه. + تصحيح حالات NRO في وقت التشغيل لـ NCE + حل مؤقت. إصلاح مشكلة تشغيل لعبة Biomutant. قد يؤثر ذلك على الأداء. يجري العمل على تحسينه. إصلاح تأثيرات التوهج يقلل من ضبابية التوهج في LA/EOW (Adreno A6XX - A7XX/ Turnip)، ويزيل التوهج في Burnout. تحذير: قد يسبب تشوهات رسومية في ألعاب أخرى. محاكاة BGR565 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 9a30acd3ac..3f3272daf4 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -1,12 +1,12 @@ - 本軟體可執行Nintendo Switch主機的遊戲,軟體不提供遊戲和金鑰檔案。

在開始之前,請先安裝您的 prod.keys ]]> 檔案,了解更多]]>
+ 本軟體可執行 Nintendo Switch 主機的遊戲,軟體不提供遊戲和金鑰檔案。

在開始之前,請先安裝您的 prod.keys ]]> 檔案,了解更多]]>
通知和錯誤 發生錯誤時顯示通知 未授予通知權限! - Eden模擬器通知 - Eden正在執行 + Eden 模擬器通知 + Eden 正在執行 秒 @@ -32,7 +32,7 @@ 使用控制器時自動隱藏虛擬按鍵 在使用控制器時自動隱藏畫面上的虛擬按鍵,會在控制器斷開連接後重新出現 反轉手把的 確認/返回 按鈕 - 使用Eden時將手把的確認及返回鍵反轉以符合Switch與Xbox的操作方式 + 使用 Eden 時將手把的確認及返回鍵反轉以符合 Switch 與 Xbox 的操作方式 虛擬按鍵設定 調整虛擬按鍵的位置與顯示設定 @@ -54,7 +54,7 @@ 啟用效能統計疊加層 設定疊加層中顯示的資訊 顯示影格率 - 顯示當前影格率 + 顯示目前的影格率 顯示影格時間 顯示應用程式的記憶體用量 顯示模擬器的記憶體用量 @@ -67,7 +67,7 @@ 當著色器在編譯時顯示 顯示正在編譯的著色器數量 管線工作執行緒 - 設定用於建置Vulkan管線的CPU核心數量,設定的數值越大效能越好,但溫度也會上升更快 + 設定用於建置 Vulkan 管線的 CPU 核心數量,設定的數值越大效能越好,但溫度也會上升更快 疊加層位置 選擇疊加層在畫面上的顯示位置 左上 @@ -85,11 +85,11 @@ 裝置疊加層 設定裝置疊加層中顯示的資訊 - 顯示Eden的組建版本 + 顯示 Eden 的組建版本 顯示圖形驅動程式的版本 顯示裝置型號 - 顯示GPU型號 - 顯示CPU型號 + 顯示 GPU 型號 + 顯示 CPU 型號 顯示韌體版本 @@ -98,15 +98,15 @@ 同步核心速度 將核心速度與最大速度百分比同步,在不改變遊戲實際速度的情況下提高效能 - 啟用主機MMU模擬 - 此最佳化可加速客體程式的記憶體存取。啟用後,客體記憶體讀取/寫入將直接在記憶體中執行並利用主機的MMU。停用此功能將強制所有記憶體存取使用軟體MMU模擬 + 啟用主機 MMU 模擬 + 此最佳化可加速客體程式的記憶體存取。啟用後,客體記憶體讀取/寫入將直接在記憶體中執行並利用主機的 MMU。停用此功能將強制所有記憶體存取使用軟體 MMU 模擬 偵錯開關 僅限開發用途 - 0到65535 + 0 到 65535 - NVDEC模擬 - 若在過場動畫中當機請切換成CPU + NVDEC 模擬 + 若在過場動畫中當機請切換成 CPU 無 @@ -121,7 +121,7 @@ 加入 瀏覽公開房間 使用者名稱 - IP位址 + IP 位址 埠 房間建立成功 成功加入房間 @@ -129,8 +129,8 @@ 網路錯誤 連線中斷 使用者名稱已被其他人使用 - MAC位址衝突 - 主機ID衝突 + MAC 位址衝突 + 主機 ID 衝突 版本不符 密碼錯誤 無法連接 @@ -143,7 +143,7 @@ 您已被房主踢出 未知錯誤 房間未初始化 - 房間閒置 + 房間閒置中 正在加入房間 已加入房間 房間管理員 @@ -151,7 +151,7 @@ %1$s 離開 %1$s 被踢出 %1$s 被封鎖 - IP位址已解封 + IP 位址已解封 踢出成員 密碼 正在加入… @@ -184,14 +184,14 @@ 搜尋房間… 遊戲 大廳類型 - 長度需為3-20個字元 - 必填 - 需要Web令牌,請前往進階設定 -> 系統 -> 網路 - IP格式無效 - 必須介於4-20個字元之間,並且僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式) + 長度需為 3-20 個字元 + 請填寫這個欄位 + 需要 Web 令牌,請前往進階設定 -> 系統 -> 網路 + IP 格式無效 + 必須介於 4-20 個字元之間,並且僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式) 使用者名稱無效,請在系統 -> 網路中檢查設定 - 必須為48個字元,且僅包含小寫字母a-z - 埠號需為1-65535 + 必須為 48 個字元,且僅包含小寫字母 a-z + 埠號需為 1-65535 取消 確定 重新整理 @@ -228,7 +228,7 @@ 不再顯示 遊戲目錄新增成功 檢查更新 - 在Eden啟動時檢查有無新版本並選擇是否要下載與安裝更新 + 在 Eden 啟動時檢查有無新版本並選擇是否要下載與安裝更新 發現新版本 有更新可供安裝:%1$s\n\n您要進行更新嗎? 下載更新中 @@ -252,7 +252,7 @@ https://yuzu-mirror.github.io/help/quickstart/#guide-introduction 跳過安裝韌體? 設定模擬器資料 - 模擬器需要金鑰才能正常執行,同時建議安裝韌體以啟動QLaunch小程式 + 模擬器需要金鑰才能正常執行,同時建議安裝韌體以啟動 QLaunch 小程式 授予權限 授予權限以使用模擬器的特定功能 許多遊戲需要韌體才能正常運作 @@ -273,10 +273,10 @@ 版本號碼 基本資訊 硬體 - 支援的ABI - CPU資訊 - GPU資訊 - Vulkan驅動程式版本 + 支援的 ABI + CPU 資訊 + GPU 資訊 + Vulkan 驅動程式版本 取得裝置資訊失敗 記憶體資訊 記憶體大小 @@ -287,9 +287,9 @@ 跳過 取消 安裝 Amiibo 金鑰 - 需要先安裝才能在遊戲中使用Amiibo - GPU驅動程式下載器 - GPU驅動程式管理員 + 需要先安裝才能在遊戲中使用 Amiibo + GPU 驅動程式下載器 + GPU 驅動程式管理員 安裝替代驅動程式以取得潛在的更佳效能或準確度 後製處理效果 在渲染完成後套用 ReShade FX 效果 @@ -330,84 +330,84 @@ 自動 開啟或關閉影格生成後選擇影格倍率 選擇要生成的目標影格率,倍率器會自動調整 - 用來預測影格之間動態的解析度,較低的數值可以減少GPU運算時間 + 用來預測影格之間動態的解析度,較低的數值可以減少 GPU 運算時間 影格佇列目標 最多允許多少個已完成的影格在顯示器前等待,較大的佇列可以吸收 GPU 突發負載,但會增加輸入延遲 最低延遲(無緩衝) - 平衡(1影格) - 最流暢(2影格) + 平衡(1 影格) + 最流暢(2 影格) 配合遊戲調整運動預測 以遊戲實際渲染的解析度而非升頻後的輸出進行運動預測,由於升頻後不會增加任何動態細節,因此不會影響準確度 運動預測解析度 光流處理的解析度,以輸出解析度的比例表示,降低此設定值是減少效能負載最有效的方法 無法使用影格生成 - 此GPU驅動程式缺少Lossless Scaling著色器所需的Vulkan記憶體模型或半精度浮點數(float16)支援 + 此 GPU 驅動程式缺少 Lossless Scaling 著色器所需的 Vulkan 記憶體模型或半精度浮點數(float16)支援 可選擇安裝自己擁有的 Lossless.dll 以在之後啟用影格生成功能 安裝 Lossless.dll 您需要擁有從合法管道獲得的 Lossless Scaling 並從該軟體的資料夾中取得 Lossless.dll 檔案才能使用影格生成功能 安裝不同的 Lossless.dll 檔案 影格生成 支援 - 不支援(無Vulkan記憶體模型或float16) + 不支援(無 Vulkan 記憶體模型或 float16) Lossless Scaling - 安裝您擁有的Lossless.dll檔案以使用影格生成 + 安裝您擁有的 Lossless.dll 檔案以使用影格生成 已安裝 未安裝 更換 刪除 - 刪除已安裝的Lossless.dll及預先編譯的著色器 - 影格生成功能會停止運作直到您重新安裝Lossless.dll,您的Lossless.dll原始檔不會被 Eden 修改 + 刪除已安裝的 Lossless.dll 及預先編譯的著色器 + 影格生成功能會停止運作直到您重新安裝Lossless.dll,您的 Lossless.dll原始檔不會被 Eden 修改 Lossless.dll 未安裝 前往 設定 -> Lossless Scaling 安裝以使用影格生成功能 請先關閉遊戲 - Lossless.dll無法在遊戲執行時進行更換 + Lossless.dll 無法在遊戲執行時進行更換 沒有東西可以刪除 - 尚未安裝Lossless.dll + 尚未安裝 Lossless.dll 準備影格生成著色器中... - 成功安裝Lossless.dll - 無法安裝Lossless.dll + 成功安裝 Lossless.dll + 無法安裝 Lossless.dll 無法複製選取的檔案 無法讀取選取的檔案 - 選取的檔案並不是Windows程式庫。請在Lossless Scaling的安裝位置(資料夾)中選擇Lossless.dll - 這個Lossless.dll的副本並未包含影格生成著色器。請更新Lossless Scaling後重試 - 無法轉譯影格生成著色器,尚不支援此Lossless Scaling版本 + 選取的檔案並不是 Windows 程式庫。請在 Lossless Scaling 的安裝位置(資料夾)中選擇 Lossless.dll + 這個 Lossless.dll 的副本並未包含影格生成著色器。請更新 Lossless Scaling 後重試 + 無法轉譯影格生成著色器,尚不支援此 Lossless Scaling 版本 轉譯的著色器無法寫入到儲存空間,請確認手機容量是否充足 進階設定 調整模擬器設定 最近遊玩 最近新增 - 開啟Eden資料夾 - 管理Eden的內部檔案 - 自訂Eden的主題與介面 + 開啟 Eden 資料夾 + 管理 Eden 的內部檔案 + 自訂 Eden 的主題與介面 找不到檔案管理員 - 無法開啟Eden目錄 + 無法開啟 Eden 目錄 請使用檔案管理員的側邊面板手動定位到使用者資料夾 管理儲存資料 - 導入/導出遊戲的儲存資料\n壓縮檔必須為.zip格式\n壓縮檔中首個子資料夾名稱必須為遊戲ID - 導入儲存資料 - 這將會以提供的檔案覆寫現有的該遊戲儲存資料,您確定要繼續嗎? - 正在導入儲存資料… - 正在導出儲存資料… - 已成功導入 + 匯入/匯出遊戲的儲存資料\n壓縮檔必須為.zip格式\n壓縮檔中首個子資料夾名稱必須為遊戲ID + 匯入儲存資料 + 這將會以提供的檔案覆蓋現有的該遊戲儲存資料,您確定要繼續嗎? + 正在匯入儲存資料… + 正在匯出儲存資料… + 已成功匯入 無效的儲存目錄結構 - 首個子資料夾名稱必須為遊戲ID + 首個子資料夾名稱必須為遊戲 ID 安裝韌體 - 韌體必須為ZIP壓縮檔,將會用於部分遊戲的啟動 + 韌體必須為 ZIP 壓縮檔,將會用於部分遊戲的啟動 正在安裝韌體 韌體安裝失敗 - 請確保韌體nca檔案位於zip壓縮檔的根目錄後再試一次 + 請確保韌體 nca 檔案位於 zip 壓縮檔的根目錄後再試一次 韌體解除安裝失敗 分享偵錯記錄 - 分享Eden的記錄檔以便對相關問題進行偵錯 + 分享 Eden 的記錄檔以便對相關問題進行偵錯 找不到日誌檔案 - 分享GPU日誌 - 分享Eden的GPU日誌以對圖形問題進行偵錯 - 找不到GPU日誌檔案 + 分享 GPU 日誌 + 分享 Eden 的 GPU 日誌以對圖形問題進行偵錯 + 找不到 GPU 日誌檔案 安裝遊戲內容 - 安裝遊戲更新或DLC + 安裝遊戲更新或 DLC 正在安裝內容… - 安裝檔案至NAND時發生錯誤 - 請確保內容有效並且prod.keys檔案已安裝 + 安裝檔案至 NAND 時發生錯誤 + 請確保內容有效並且 prod.keys 檔案已安裝 為避免產生衝突,無法直接安裝遊戲本體 %1$d 安裝錯誤 遊戲內容已成功安裝 @@ -416,7 +416,7 @@ https://yuzu-mirror.github.io/help/quickstart/#dumping-installed-updates 您的裝置不支援自訂驅動程式 此裝置不支援注入自訂驅動程式\n請以後再來查看是否已新增支援! - 管理Eden資料 + 管理 Eden 資料 安裝韌體、金鑰,導入/導出使用者資料及安裝其它項目! 遊戲資料夾 深度掃描 @@ -433,7 +433,7 @@ 驗證已安裝內容的完整性 檢查所有已安裝的內容是否有損壞 - 缺少prod.keys + 缺少 prod.keys 無法解密韌體和零售遊戲 https://yuzu-mirror.github.io/help/quickstart/#dumping-decryption-keys @@ -446,12 +446,12 @@ 金鑰安裝失敗 金鑰安裝成功 一個或多個金鑰安裝失敗 - 請確保金鑰檔案具有.keys副檔名後重試 + 請確保金鑰檔案具有 .keys 副檔名後重試 金鑰初始化失敗,請檢查您的轉儲工具是否為最新版本並重新轉儲金鑰 Qlaunch - 從Switch系統主畫面啟動應用程式(目前僅支援英文) + 從 Switch 系統主畫面啟動應用程式(目前僅支援英文) 小程式啟動器 使用已安裝的韌體啟動系統小程式 未安裝韌體 @@ -459,48 +459,48 @@ prod.keys檔案和韌體已安裝並重試]]> 相簿 使用系統相片檢視器查看儲存在使用者螢幕截圖資料夾中的影像 - Mii編輯 - 使用系統編輯器來檢視並編輯Mii + Mii 編輯 + 使用系統編輯器來檢視並編輯 Mii Cabinet - 編輯、刪除儲存在amiibo上的資料 - Cabinet啟動器 + 編輯、刪除儲存在 amiibo 上的資料 + Cabinet 啟動器 暱稱和擁有者設定 刪除遊戲資料 還原程式 格式化程式 - Gaia不存在 + Gaia 不存在 已複製到剪貼簿 - 一個開放原始碼的Switch模擬器 + 一個開放原始碼的 Switch 模擬器 參與者 - 這些人讓Eden Android版成為可能 - 這些專案使Eden Android版成為可能 + 這些人讓 Eden Android 版成為可能 + 這些專案使 Eden Android 版成為可能 組建版本 使用者資料 - 導入/導出所有應用程式資料\n\n導入使用者資料時,現有的使用者資料將被取代!\n\n直接從 Citron 導入使用者資料可能會出現問題,建議手動導入所有所需資料 - 正在導出使用者資料… - 正在導入使用者資料… - 無效的Eden備份 - 使用者資料導出成功 - 使用者資料導入成功 - 導出已取消 - 請確保使用者資料夾位於zip壓縮檔的根目錄,並在 config/config.ini 路徑中包含組態檔案後重試 + 匯入/匯出所有應用程式資料\n\n匯入使用者資料時,現有的使用者資料將被取代!\n\n直接從 Citron 匯入使用者資料可能會出現問題,建議手動匯入所有所需資料 + 正在匯出使用者資料… + 正在匯入使用者資料… + 無效的 Eden 備份 + 使用者資料匯出成功 + 使用者資料匯入成功 + 匯出已取消 + 請確保使用者資料夾位於 zip 壓縮檔的根目錄,並在 config/config.ini 路徑中包含組態檔案後重試 限制模擬速度 將模擬速度限制在標準速度的指定百分比 限制速度百分比 - 指定模擬速度的百分比,100%為標準速度,更高或更低的值將會減少或增加速度限制 + 指定模擬速度的百分比,100% 為標準速度,更高或更低的值將會減少或增加速度限制 加速模式 當開啟加速模式時,模擬器將以此速度執行 慢速模式 當慢速模式開啟時,模擬器將會以此速度執行 - CPU後端 - CPU準確度 + CPU 後端 + CPU 準確度 %1$s%2$s - Homebrew參數 - 在啟動時傳遞給Homebrew的命令列參數(例如:-noglsl) + Homebrew 參數 + 在啟動時傳遞給 Homebrew 的命令列參數(例如:-noglsl) 裝置名稱 @@ -508,60 +508,60 @@ 提高解析度,降低效能。停用後將會使用手提模式,會降低解析度並提高效能 模擬區域 模擬語言 - 選擇RTC日期 - 選擇RTC時間 - 自訂RTC + 選擇 RTC 日期 + 選擇 RTC 時間 + 自訂 RTC 允許您設定與您的目前系統時間相互獨立的自訂時間 - 設定自訂RTC + 設定自訂 RTC - CPU時脈 - 提高模擬CPU回報的時脈,可以減少某些FPS限制。較弱的CPU可能會出現效能下降的情況,部分遊戲可能會出現異常 - 自訂CPU時脈 - 自訂CPU時脈,更高的值可能提高效能,但也可能導致遊戲卡死。建議範圍為77-21000 + CPU 時脈 + 提高模擬 CPU 回報的時脈,可以減少某些 FPS 限制。較弱的 CPU 可能會出現效能下降的情況,部分遊戲可能會出現異常 + 自訂 CPU 時脈 + 自訂 CPU 時脈,更高的值可能提高效能,但也可能導致遊戲卡死。建議範圍為 77-21000 時脈 記憶體布局 - (實驗性)更改模擬記憶體布局,此設定不會提高效能,但可能有助於使用模組來提高解析度的遊戲的載入。不要在RAM為8GB或更少的手機上使用。若遊戲崩潰請將進階設定裡偵錯選項中的CPU後端改為Dynarmic (JIT) + (實驗性)更改模擬記憶體布局,此設定不會提高效能,但可能有助於使用模組來提高解析度的遊戲的載入。不要在 RAM 為 8GB 或更少的手機上使用。若遊戲崩潰請將進階設定裡偵錯選項中的 CPU 後端改為 Dynarmic(JIT) 生成 網路令牌 - 用於建立公開大廳的網路令牌,由48個小寫字母a-z組成 + 用於建立公開大廳的網路令牌,由 48 個小寫字母 a-z 組成 網路使用者名稱 - 多人遊戲房間中顯示的使用者名稱。必須為4-20個字元,僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式) + 多人遊戲房間中顯示的使用者名稱。必須為 4-20 個字元,僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式) 網路 解析度 (手提/底座) 垂直同步 視窗自適應濾波器 - FSR/SGSR銳化度 - 使用FSR/SGSR時圖片的銳化程度 + FSR/SGSR 銳化度 + 使用 FSR/SGSR 時圖片的銳化程度 抗鋸齒 進階 - GPU模式 - 設定GPU模擬的準確度,大多數遊戲在設定為快速時即可正常渲染,但有些需要渲染粒子的遊戲仍需設為準確來避免圖形錯誤 - DMA準確度 - 控制DMA準確度,將準確度設為穩定可以修復某些遊戲中的問題,但在某些情況下也可能影響效能。如果不確定,請保留為預設 + GPU 模式 + 設定 GPU 模擬的準確度,大多數遊戲在設定為快速時即可正常渲染,但有些需要渲染粒子的遊戲仍需設為準確來避免圖形錯誤 + DMA 準確度 + 控制 DMA 準確度,將準確度設為穩定可以修復某些遊戲中的問題,但在某些情況下也可能影響效能。如果不確定,請保留為預設 GPU 同步柵欄模式 控制 GPU 同步柵欄模式,即時是速度最快的選項,但可能會導致一些問題;使用平衡可以提供更好的相容性並修復某些遊戲中的錯誤;準確則是在犧牲部分效能的情況下進一步提升相容性;嚴格是最慢的選項,但可以修復那些對同步要求更嚴格的遊戲中的問題;預設則會依照 GPU 準確度設定 各向異性過濾 改善斜角檢視時的紋理品質 - VRAM使用模式 - 控制GPU記憶體的分配與釋放策略 - ASTC解碼方式 - 選擇ASTC壓縮紋理的解碼方式:CPU(慢速、穩定)、GPU(快速、推薦)或CPU非同步(無卡頓,可能導致問題) + VRAM 使用模式 + 控制 GPU 記憶體的分配與釋放策略 + ASTC 解碼方式 + 選擇 ASTC 壓縮紋理的解碼方式:CPU(慢速、穩定)、GPU(快速、推薦)或 CPU 非同步(無卡頓,可能導致問題) 同步記憶體操作 - 確保計算和記憶體操作之間的資料一致性,此選項應能修復某些遊戲中的問題,但在某些情況下可能會降低效能。使用Unreal Engine 4的遊戲似乎受影響最大 + 確保計算和記憶體操作之間的資料一致性,此選項應能修復某些遊戲中的問題,但在某些情況下可能會降低效能。使用 Unreal Engine 4 的遊戲似乎受影響最大 磁碟著色器快取 將產生的著色器快取儲存至硬碟以減少中斷 - 強制使用最大時脈 (僅限Adreno) - 強制 GPU 以可能的最大時脈執行 (熱溫限制仍會被套用) + 強制使用最大時脈(僅限 Adreno) + 強制GPU以可能的最大時脈運作(熱溫限制仍會被套用) GPU 非同步模擬 此修改可透過使用 GPU 非同步模擬來提升性能,不過可能會導致圖形問題且會提高在進行時序相關操作時當機的機率 使用重新啟用排清 @@ -569,32 +569,36 @@ 啟用緩衝區歷史 允許存取先前的緩衝區狀態,此選項可能會改善部分遊戲的渲染品質與效能穩定性 最佳化頂點緩衝區 - 啟用最佳化的頂點緩衝區綁定,需要安裝 Mesa 26.0+ Turnip drivers/Qualcomm drivers。使用舊版 Turnip drivers 會導致當機(25.3版和更低的版本) + 啟用最佳化的頂點緩衝區綁定,需要安裝 Mesa 26.0+ Turnip drivers/Qualcomm drivers。使用舊版 Turnip drivers 會導致當機(25.3 版或更低的版本) 修改 - GPU時脈 - 讓遊戲誤以為GPU工作能更快完成,避免遊戲為了配合Switch的時脈而降低解析度與渲染距離 - 跳過CPU內部失效處理 - 在記憶體更新期間跳過某些CPU端快取的失效處理,減少CPU使用率並提高其性能。可能會導致某些遊戲出現故障或當機 + GPU 時脈 + 讓遊戲誤以為 GPU 工作能更快完成,避免遊戲為了配合 Switch 的時脈而降低解析度與渲染距離 + 跳過 CPU 內部失效處理 + 在記憶體更新期間跳過某些 CPU 端快取的失效處理,減少 CPU 使用率並提高其性能。可能會導致某些遊戲出現故障或當機 + 在 NCE 無效化前進行 GPU 回讀 + (暫時性功能)修復 \"終結者瑪格諾莉亞:霧中綻放\" 及其它使用虛幻引擎之遊戲中的當機問題,可能會降低效能。此功能正在改善中 + 對 NCE Runtime 的 NRO 檔案進行修補 + (暫時性功能)修復 \"Biomutant\" 的啟動問題,可能會對效能造成影響。此功能正在改善中 修正光暈特效 - 在 \"薩爾達傳說:織夢島\" 和 \"薩爾達傳說:智慧的再現\" 中減少光暈模糊的問題並移除 \"橫衝直撞:狂飆樂園重製版\" 中的光暈效果(適用於Adreno A6XX - A7XX/ Turnip)。警告:可能會在其它遊戲中導致圖形異常 - 模擬BGR565 + 在 \"薩爾達傳說:織夢島\" 和 \"薩爾達傳說:智慧的再現\" 中減少光暈模糊的問題並移除 \"橫衝直撞:狂飆樂園重製版\" 中的光暈效果(適用於 Adreno A6XX - A7XX/ Turnip)。警告:可能會在其它遊戲中導致圖形異常 + 模擬 BGR565 修正遊戲中出現的色彩反轉、圖形異常或陰影異常 啟用舊版重新縮放處理 透過快速重新縮放處理來啟用遊戲重新縮放設定階段的舊版處理方式 使用非同步著色器 使用非同步編譯著色器,這可能會減少卡頓,但也可能導致圖形錯誤 - GPU Unswizzle設定 - 設定基於GPU的Unswizzling參數或完全停用此功能,調整此設定以在性能與紋理載入品質中取得平衡 - 啟用GPU Unswizzle + GPU Unswizzle 設定 + 設定基於 GPU 的 Unswizzling 參數或完全停用此功能,調整此設定以在性能與紋理載入品質中取得平衡 + 啟用 GPU Unswizzle 停用 - GPU Unswizzle最大紋理尺寸 - 設定 GPU 紋理 Unswizzling 的最大值(MB),雖然 GPU 處理中型和大型紋理的速度較快,但 CPU 處理非常小的紋理可能更有效率。調整此設定以在GPU加速與CPU負載之間取得平衡 - GPU Unswizzle Stream大小 - 設定每個影格處理大型紋理Unswizzling的資料上限,數值越高載入紋理的速度越快,但會增加畫面延遲;數值較低則能降低 GPU 負載,不過有可能導致至紋理載入不完全甚至突然出現 - GPU Unswizzle Chunk大小 - 設定 3D 紋理每批次處理的深度切片數量,增加此數值可提升規格較佳GPU的處理效率,但在較低規格的硬體上可能導致卡頓或驅動程式逾時 + GPU Unswizzle 最大紋理尺寸 + 設定 GPU 紋理 Unswizzling 的最大值(MB),雖然 GPU 處理中型和大型紋理的速度較快,但 CPU 處理非常小的紋理可能更有效率。調整此設定以在 GPU 加速與 CPU 負載之間取得平衡 + GPU Unswizzle Stream 大小 + 設定每個影格處理大型紋理 Unswizzling 的資料上限,數值越高載入紋理的速度越快,但會增加畫面延遲;數值較低則能降低 GPU 負載,不過有可能導致至紋理載入不完全甚至突然出現 + GPU Unswizzle Chunk 大小 + 設定 3D 紋理每批次處理的深度切片數量,增加此數值可提升規格較佳 GPU 的處理效率,但在較低規格的硬體上可能導致卡頓或驅動程式逾時 預設 @@ -617,7 +621,7 @@ 子母畫面 位於背景時最小化視窗 - 解析度縮放到2倍或更高可能會導致問題,並可能顯著降低設備速度 + 解析度縮放到 2 倍或更高可能會導致問題,並可能顯著降低設備速度 CPU @@ -628,38 +632,38 @@ GPU API 圖形偵錯 - 將圖形API設為慢速偵錯模式 - BCn區塊壓縮紋理修補 - 覆寫Adreno GPU的BCn紋理格式自動偵測。通常會根據Android版本自動偵測(會在API 28以上的裝置自動啟用) + 將圖形 API 設為慢速偵錯模式 + BCn 區塊壓縮紋理修補 + 覆寫 Adreno GPU 的 BCn 紋理格式自動偵測。通常會根據 Android 版本自動偵測(會在 API 28 以上的裝置自動啟用) Fastmem 日誌 按行寫入偵錯日誌 - 在寫入一行日誌就立刻更新偵錯記錄,讓程式在當機或閃退時更容易偵錯 + 寫入一行日誌就立刻更新偵錯記錄,讓程式在當機或畫面凍結時更容易偵錯 啟用更詳細的日誌記錄 - 將日誌檔的最大檔案限制從100MB提高到1GB + 將日誌檔的最大檔案限制從 100MB 提高到 1GB 日誌過濾器 控制 Eden 日誌的紀錄類別。例如: *:Info Service.LM:Debug - GPU日誌 + GPU 日誌 記錄層級 - GPU日誌的詳細層級(越高日誌越詳細,不過會更容易過熱) - 記錄Vulkan API呼叫 - 在環形緩衝區中記錄所有Vulkan API呼叫 - 傾印SPIR-V著色器 - 將重新編譯後的SPIR-V二進位檔案(.spv)儲存至Eden資料夾裡的dump資料夾中。可使用 spirv-dis/spirv-cross/spirv-val 進行檢查 + GPU 日誌的詳細層級(越高日誌越詳細,不過會更容易過熱) + 記錄 Vulkan API 呼叫 + 在環形緩衝區中記錄所有 Vulkan API 呼叫 + 傾印 SPIR-V 著色器 + 將重新編譯後的 SPIR-V 二進位檔案(.spv)儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 spirv-dis/spirv-cross/spirv-val 進行檢查 傾印客體(Maxwell)著色器 - 將Maxwell客體著色器位元組碼檔案(.ash)儲存至Eden資料夾裡的dump資料夾中。可使用 nvdisasm 進行檢查 - 傾印Maxwell巨集 - 將Maxwell巨集程式檔案(.macro)儲存至Eden資料夾裡的dump資料夾中。可使用 envydis 進行檢查 - 追蹤GPU記憶體 - 監控GPU記憶體的分配和釋放 + 將 Maxwell 客體著色器位元組碼檔案(.ash)儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 nvdisasm 進行檢查 + 傾印 Maxwell 巨集 + 將 Maxwell 巨集程式檔案(.macro)儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 envydis 進行檢查 + 追蹤 GPU 記憶體 + 監控 GPU 記憶體的分配和釋放 驅動程式偵錯資料 擷取驅動程式的特定偵錯資料(例如 Turnip breadcrumbs) 環形緩衝區大小 - 追蹤的近期Vulkan呼叫數量(預設為512) - 64至4096個項目 + 追蹤的近期 Vulkan 呼叫數量(預設為 512) + 64 至 4096 個項目 一般 @@ -683,17 +687,17 @@ 左搖桿 控制搖桿 右搖桿 - C搖桿 + C 搖桿 按壓 靈敏度 無感帶 用按鈕、按鍵來模擬搖桿 - 修改按鈕模擬左/右搖桿的值,視遊戲不同而有所差異\n(模擬左搖桿時,若將此數值設為50,則按下按鈕時遊戲裡的人物可能只會走動而不是奔跑;模擬右搖桿時所使用的值則是會影響到轉視角的速度,數值越高代表使用的模擬值越大) + 修改按鈕模擬左/右搖桿的值,視遊戲不同而有所差異\n(模擬左搖桿時,若將此數值設為 50,則按下按鈕時遊戲裡的人物可能只會走動而不是奔跑;模擬右搖桿時所使用的值則是會影響到轉視角的速度,數值越高代表使用的模擬值越大) 肩部按鍵 - 左SL - 左SR - 右SL - 右SR + 左 SL + 左 SR + 右 SL + 右 SR 無效 無 未知 @@ -708,12 +712,12 @@ 選擇一個控制器以嘗試自動配對按鈕、搖桿 嘗試為 %1$s 自動配對 控制器類型 - Pro手把 + Pro 手把 掌機模式 - 雙Joycon手把 - 左Joycon手把 - 右Joycon手把 - GameCube手把 + 雙 Joycon 手把 + 左 Joycon 手把 + 右 Joycon 手把 + GameCube 手把 方向反轉 反轉按鈕 切換按鍵 @@ -738,7 +742,7 @@ 按下一個按鈕或肩部按鍵/移動搖桿 將方向鍵配對到 %1$s 配對到 %1$s - 導入設定檔失敗 + 匯入設定檔失敗 儲存設定檔失敗 重設控制器配對 您確定要將此控制器的所有配對重設為預設值?此動作無法復原 @@ -759,21 +763,21 @@ 自動 提交 無 - 導入 - 導出 - 導出失敗 - 導入失敗 + 匯入 + 匯出 + 匯出失敗 + 匯入失敗 正在取消 安裝 下載 刪除 編輯 - 已成功導入 - 已成功導出 + 已成功匯入 + 已成功匯出 開始 全域設定 個別遊戲設定 - 導入完成 + 匯入完成 使用全域設定 操作已成功完成 確認 @@ -804,9 +808,9 @@ 安裝中… 最新 推薦驅動程式: - GPU型號 - 不支援的GPU - 您的GPU不支援驅動程式注入,不建議嘗試設定自訂驅動程式 + GPU 型號 + 不支援的 GPU + 您的 GPU 不支援驅動程式注入,不建議嘗試設定自訂驅動程式 設定 @@ -836,13 +840,13 @@ 成功遷移儲存資料 儲存資料遷移失敗 存檔目錄設定完成 - 所選取的位置已有儲存資料。是否要取代該檔案? + 所選取的位置已有儲存資料,是否要取代該檔案? 若要自訂路徑必須授予所有檔案的存取權 授予權限 NAND 路徑 設定 NAND 資料的自訂路徑 - 虛擬 SD卡 路徑 - 設定虛擬 SD卡 儲存空間的自訂路徑 + 虛擬SD卡路徑 + 設定虛擬SD卡儲存空間的自訂路徑 路徑設定成功 跳過 @@ -861,7 +865,7 @@ 切換模組、更新及 DLC 遊玩時間: 重設遊玩時間 - 將此遊戲的遊玩時間重設為0 + 將此遊戲的遊玩時間重設為 0 您確定要重設此遊戲的遊玩時間嗎? 遊玩時間已重設 修改遊玩時間 @@ -870,16 +874,16 @@ 小時 分鐘 秒 - 必須介於0到9999小時之間 - 必須介於0到59分鐘之間 - 必須介於0到59秒之間 - 成功更新遊玩時間 + 必須介於 0 到 9999 小時之間 + 必須介於 0 到 59 分鐘之間 + 必須介於 0 到 59 秒之間 + 成功修改遊玩時間 清除著色器快取 清除此遊戲所有已編譯的著色器快取 重新編譯著色器快取的過程中可能會導致遊戲有些微卡頓 著色器快取已成功清除 已刪除著色器快取 - 為了維持Vulkan管線驗證,Eden已自動清除所有著色器快取。為了預防閃退和圖形錯誤,這是必須的動作。因為著色器需要重新編譯,您在遊戲過程中可能會遇到些微卡頓的情況 + 為了維持Vulkan管線驗證,Eden 已自動清除所有著色器快取,若要預防閃退和圖形錯誤,這是必須的動作。因為著色器需要重新編譯,您在遊戲過程中可能會遇到些微卡頓的情況 附加元件:%1$s 儲存資料 管理此遊戲的儲存資料 @@ -911,8 +915,8 @@ 未完成文件完整性檢查 以下文件的完整性驗證失敗:\n %1$s 分享設定 - 導入設定 - 導出設定 + 匯入設定 + 匯出設定 分享設定失敗 @@ -928,12 +932,12 @@ 正在搜尋遊戲... - 找不到標題ID的遊戲: %1$s + 找不到標題 ID 的遊戲: %1$s 自訂設定失敗 無法套用自訂設定 %1$s: %2$s 使用預設設定啟動 啟動已取消 - 無法套用請求的設定。這可能是由於缺少GPU驅動程式或設定問題。 + 無法套用請求的設定,這可能是由於缺少 GPU 驅動程式或設定問題 已套用自訂設定 正在啟動 %1$s... 無法初始化遊戲 @@ -954,10 +958,10 @@ 未安裝所需的驅動程式: %s 無效的驅動程式檔案: %s - 無可用網路連線。請檢查您的網路連線並重試 - 需要GPU驅動程式 + 無可用網路連線,請檢查您的網路連線並重試 + 需要 GPU 驅動程式 這個遊戲的設定需要 \"%s\"驅動程式,而它並沒有安裝在您的裝置上\n\n要下載並安裝此驅動程式嗎? - 驅動程式下載已取消。沒有所需的驅動程式無法啟動遊戲。 + 驅動程式下載已取消,沒有所需的驅動程式無法啟動遊戲 下載 @@ -979,7 +983,7 @@ 暫停模擬 繼續模擬 疊加層/虛擬按鍵設定 - 導入Amiibo + 導入 Amiibo 觸控螢幕 鎖定側邊選單 解鎖側邊選單 @@ -987,12 +991,12 @@ Amiibo - 該amiibo已被移除 - 此遊戲目前沒有在尋找amiibo - 您所選擇的並不是正確的amiibo金鑰檔 + 該 amiibo 已被移除 + 此遊戲目前沒有在尋找 amiibo + 您所選擇的並不是正確的 amiibo 金鑰檔 選擇的檔案已在使用中 發生未知的錯誤 - 已導入Amiibo + Amiibo 已匯入 @@ -1021,9 +1025,9 @@ 臺灣 - 4GB (推薦) - 6GB (不穩定) - 8GB (不穩定) + 4GB(推薦) + 6GB(不穩定) + 8GB(不穩定) 正常 @@ -1073,20 +1077,26 @@ 效能 - 準確 + 品質 預設 不穩定 穩定 + + 預設 + 即時 + 平衡 + 準確 + 保守 積極 - 即時 (關閉) + 即時(關閉) Mailbox - FIFO (開啟) + FIFO(開啟) FIFO 寬鬆 @@ -1108,6 +1118,18 @@ 不合理 偵錯 + + Freedreno 設定 + GPU 驅動程式設定 + 預先提供的設定檔 + 目前使用的設定 + 進階設定 + 變數名稱 (例如: TU_DEBUG) + 變數值 + 新增變數 + 全部清除 + Freedreno 設定已儲存 + 已清除所有 Freedreno 變數 方向鍵 左搖桿 From 4dc69c06f764a235bccd01afbfc765d9ddbebc9f Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 12 Oct 2026 22:21:17 +0200 Subject: [PATCH 104/128] [*] Remove Fix{Static,Small}VectorADL workaround for GCC 12 (#4386) 1. We demand at least, minimum, gcc 14 2. Debian stable boost uses a newer version https://packages.debian.org/trixie/libboost-all-dev, so fix isn't longer required - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4386 Reviewed-by: MaranBr Reviewed-by: crueter --- src/audio_core/in/audio_in_system.cpp | 19 ++------------ src/video_core/buffer_cache/buffer_cache.h | 2 +- src/video_core/memory_manager.cpp | 2 +- .../renderer_vulkan/vk_buffer_cache.cpp | 4 +-- .../renderer_vulkan/vk_texture_cache.cpp | 6 ++--- src/video_core/texture_cache/texture_cache.h | 26 +++++++++---------- src/video_core/texture_cache/util.h | 23 +--------------- 7 files changed, 23 insertions(+), 59 deletions(-) diff --git a/src/audio_core/in/audio_in_system.cpp b/src/audio_core/in/audio_in_system.cpp index f71a2df6be..f8946cc0f6 100644 --- a/src/audio_core/in/audio_in_system.cpp +++ b/src/audio_core/in/audio_in_system.cpp @@ -14,21 +14,6 @@ #include "core/core_timing.h" #include "core/hle/kernel/k_event.h" -// See texture_cache/util.h -template -#if BOOST_VERSION >= 108100 || __GNUC__ > 12 -[[nodiscard]] boost::container::static_vector FixStaticVectorADL(const boost::container::static_vector& v) { - return v; -} -#else -[[nodiscard]] std::vector FixStaticVectorADL(const boost::container::static_vector& v) { - std::vector u; - for (auto const& e : v) - u.push_back(e); - return u; -} -#endif - namespace AudioCore::AudioIn { System::System(Core::System& system_, Kernel::KEvent* event_, const size_t session_id_) @@ -110,7 +95,7 @@ Result System::Start() { boost::container::static_vector buffers_to_flush{}; buffers.RegisterBuffers(buffers_to_flush); - session->AppendBuffers(FixStaticVectorADL(buffers_to_flush)); + session->AppendBuffers(buffers_to_flush); session->SetRingSize(static_cast(buffers_to_flush.size())); return ResultSuccess; @@ -155,7 +140,7 @@ void System::RegisterBuffers() { if (state == State::Started) { boost::container::static_vector registered_buffers{}; buffers.RegisterBuffers(registered_buffers); - session->AppendBuffers(FixStaticVectorADL(registered_buffers)); + session->AppendBuffers(registered_buffers); } } diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 9a5d6f322a..53addb5dec 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -1664,7 +1664,7 @@ void BufferCache

::JoinOverlap(BufferId new_buffer_id, BufferId overlap_id, .size = overlap.SizeBytes(), }); new_buffer.MarkUsage(copies[0].dst_offset, copies[0].size); - runtime.CopyBuffer(new_buffer, overlap, FixSmallVectorADL(copies), true); + runtime.CopyBuffer(new_buffer, overlap, copies, true); #ifdef YUZU_LEGACY if (immediately_free) runtime.Finish(); diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index d5838a387d..8ffdcb6276 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp @@ -713,7 +713,7 @@ void MemoryManager::FlushCaching() { if (accumulator.InvalidateAll([this](GPUVAddr addr, size_t size) { GetSubmappedRangeImpl(addr, size, page_stash2); })) { - rasterizer->InnerInvalidation(VideoCommon::FixSmallVectorADL(page_stash2)); + rasterizer->InnerInvalidation(page_stash2); page_stash2.clear(); } } diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index 1a33189bf8..493de2cc20 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp @@ -471,7 +471,7 @@ void BufferCacheRuntime::CopyBuffer(VkBuffer dst_buffer, VkBuffer src_buffer, if (src_buffer == staging_pool.StreamBuf() && can_reorder_upload) { scheduler.RecordWithUploadBuffer([src_buffer, dst_buffer, vk_copies]( vk::CommandBuffer, vk::CommandBuffer upload_cmdbuf) { - upload_cmdbuf.CopyBuffer(src_buffer, dst_buffer, VideoCommon::FixSmallVectorADL(vk_copies)); + upload_cmdbuf.CopyBuffer(src_buffer, dst_buffer, vk_copies); }); return; } @@ -482,7 +482,7 @@ void BufferCacheRuntime::CopyBuffer(VkBuffer dst_buffer, VkBuffer src_buffer, cmdbuf.PipelineBarrier(vk::PIPELINE_STAGE_GRAPHICS_COMPUTE_TRANSFER, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, READ_BARRIER); } - cmdbuf.CopyBuffer(src_buffer, dst_buffer, VideoCommon::FixSmallVectorADL(vk_copies)); + cmdbuf.CopyBuffer(src_buffer, dst_buffer, vk_copies); if (barrier) { cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, vk::PIPELINE_STAGE_GRAPHICS_COMPUTE, 0, WRITE_BARRIER); diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index bc2e82acae..583cb6edaf 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -1642,7 +1642,7 @@ void TextureCacheRuntime::CopyImage(Image& dst, Image& src, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, nullptr, nullptr, pre_barriers); cmdbuf.CopyImage(src_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_image, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VideoCommon::FixSmallVectorADL(vk_copies)); + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, vk_copies); cmdbuf.PipelineBarrier( VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | @@ -2006,7 +2006,7 @@ void Image::UploadMemory(VkBuffer buffer, VkDeviceSize offset, scheduler->Record([src_buffer, temp_vk_image, vk_aspect_mask, vk_copies](vk::CommandBuffer cmdbuf) { - CopyBufferToImage(cmdbuf, src_buffer, temp_vk_image, vk_aspect_mask, false, VideoCommon::FixSmallVectorADL(vk_copies)); + CopyBufferToImage(cmdbuf, src_buffer, temp_vk_image, vk_aspect_mask, false, vk_copies); }); const auto [samples_x, samples_y] = VideoCommon::SamplesLog2(info.num_samples); @@ -2060,7 +2060,7 @@ void Image::UploadMemory(VkBuffer buffer, VkDeviceSize offset, scheduler->Record([src_buffer, vk_image, vk_aspect_mask, was_initialized, vk_copies](vk::CommandBuffer cmdbuf) { - CopyBufferToImage(cmdbuf, src_buffer, vk_image, vk_aspect_mask, was_initialized, VideoCommon::FixSmallVectorADL(vk_copies)); + CopyBufferToImage(cmdbuf, src_buffer, vk_image, vk_aspect_mask, was_initialized, vk_copies); }); if (is_rescaled) { diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 640bd38407..e92e54f8ce 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -140,7 +140,7 @@ void TextureCache

::RunGarbageCollector() { } if (must_download) { auto map = runtime.DownloadStagingBuffer(image.unswizzled_size_bytes); - const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); + const auto copies = FullDownloadCopies(image.info); image.DownloadMemory(map, copies); runtime.Finish(); SwizzleImage(*gpu_memory, image.gpu_addr, image.info, copies, map.mapped_span, swizzle_data_buffer); @@ -629,7 +629,7 @@ void TextureCache

::DownloadMemory(DAddr cpu_addr, size_t size) { for (const ImageId image_id : images) { Image& image = slot_images[image_id]; auto map = runtime.DownloadStagingBuffer(image.unswizzled_size_bytes); - const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); + const auto copies = FullDownloadCopies(image.info); image.DownloadMemory(map, copies); runtime.Finish(); SwizzleImage(*gpu_memory, image.gpu_addr, image.info, copies, map.mapped_span, @@ -893,7 +893,7 @@ void TextureCache

::CommitAsyncFlushes() { for (const PendingDownload& download_info : download_ids) { if (download_info.is_swizzle) { Image& image = slot_images[download_info.object_id]; - const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); + const auto copies = FullDownloadCopies(image.info); image.DownloadMemory(download_map, copies); download_map.offset += Common::AlignUp(image.unswizzled_size_bytes, 64); } @@ -926,7 +926,7 @@ void TextureCache

::PopAsyncFlushes() { auto& download_buffer = download_map[download_info.async_buffer_id]; if (download_info.is_swizzle) { const ImageBase& image = slot_images[download_info.object_id]; - const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); + const auto copies = FullDownloadCopies(image.info); download_buffer.offset -= Common::AlignUp(image.unswizzled_size_bytes, 64); std::span download_span = download_buffer.mapped_span.subspan(download_buffer.offset); @@ -964,7 +964,7 @@ void TextureCache

::PopAsyncFlushes() { continue; } Image& image = slot_images[download_info.object_id]; - const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); + const auto copies = FullDownloadCopies(image.info); image.DownloadMemory(download_map, copies); download_map.offset += image.unswizzled_size_bytes; } @@ -977,7 +977,7 @@ void TextureCache

::PopAsyncFlushes() { continue; } const ImageBase& image = slot_images[download_info.object_id]; - const auto copies = FixSmallVectorADL(FullDownloadCopies(image.info)); + const auto copies = FullDownloadCopies(image.info); SwizzleImage(*gpu_memory, image.gpu_addr, image.info, copies, download_span, swizzle_data_buffer); download_map.offset += image.unswizzled_size_bytes; download_span = download_span.subspan(image.unswizzled_size_bytes); @@ -1160,7 +1160,7 @@ void TextureCache

::UploadImageContents(Image& image, StagingBuffer& staging) gpu_memory->ReadBlock(gpu_addr, mapped_span.data(), mapped_span.size_bytes(), VideoCommon::CacheType::NoTextureCache); const auto uploads = FullUploadSwizzles(image.info); - runtime.AccelerateImageUpload(image, staging, FixSmallVectorADL(uploads), 0, 0); + runtime.AccelerateImageUpload(image, staging, uploads, 0, 0); return; } @@ -1168,11 +1168,11 @@ void TextureCache

::UploadImageContents(Image& image, StagingBuffer& staging) *gpu_memory, gpu_addr, image.guest_size_bytes, &swizzle_data_buffer); if (True(image.flags & ImageFlagBits::Converted)) { unswizzle_data_buffer.resize_destructive(image.unswizzled_size_bytes); - auto copies = FixSmallVectorADL(UnswizzleImage(*gpu_memory, gpu_addr, image.info, swizzle_data, unswizzle_data_buffer)); + auto copies = UnswizzleImage(*gpu_memory, gpu_addr, image.info, swizzle_data, unswizzle_data_buffer); ConvertImage(unswizzle_data_buffer, image.info, mapped_span, copies); image.UploadMemory(staging, copies); } else { - const auto copies = FixSmallVectorADL(UnswizzleImage(*gpu_memory, gpu_addr, image.info, swizzle_data, mapped_span)); + const auto copies = UnswizzleImage(*gpu_memory, gpu_addr, image.info, swizzle_data, mapped_span); image.UploadMemory(staging, copies); } } @@ -1401,7 +1401,7 @@ void TextureCache

::TickAsyncDecode() { auto staging = runtime.UploadStagingBuffer(MapSizeBytes(image)); std::memcpy(staging.mapped_span.data(), async_decode->decoded_data.data(), async_decode->decoded_data.size()); - image.UploadMemory(staging, FixSmallVectorADL(async_decode->copies)); + image.UploadMemory(staging, async_decode->copies); image.flags &= ~ImageFlagBits::IsDecoding; has_uploads = true; i = async_decodes.erase(i); @@ -1469,7 +1469,7 @@ void TextureCache

::TickAsyncUnswizzle() { if (z_count > 0) { const auto uploads = FullUploadSwizzles(task.info); - runtime.AccelerateImageUpload(image, task.staging_buffer, FixSmallVectorADL(uploads), z_start, z_count); + runtime.AccelerateImageUpload(image, task.staging_buffer, uploads, z_start, z_count); task.last_submitted_offset += (static_cast(z_count) * task.bytes_per_slice); } } @@ -1730,9 +1730,9 @@ ImageId TextureCache

::JoinImages(const ImageInfo& info, GPUVAddr gpu_addr, DA const u32 down_shift = can_rescale ? resolution.down_shift : 0; auto copies = MakeShrinkImageCopies(new_info, overlap.info, base, up_scale, down_shift); if (overlap.info.num_samples != new_image.info.num_samples) { - runtime.CopyImageMSAA(new_image, overlap, FixSmallVectorADL(copies)); + runtime.CopyImageMSAA(new_image, overlap, copies); } else { - runtime.CopyImage(new_image, overlap, FixSmallVectorADL(copies)); + runtime.CopyImage(new_image, overlap, copies); } new_image.modification_tick = overlap.modification_tick; } diff --git a/src/video_core/texture_cache/util.h b/src/video_core/texture_cache/util.h index 3e8bb00032..590d85b042 100644 --- a/src/video_core/texture_cache/util.h +++ b/src/video_core/texture_cache/util.h @@ -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-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -122,25 +122,4 @@ void DeduceBlitImages(ImageInfo& dst_info, ImageInfo& src_info, const ImageBase* [[nodiscard]] u32 MapSizeBytes(const ImageBase& image); -// TODO: Remove once Debian STABLE no longer has such outdated boost -// This is a gcc bug where ADL lookup fails for range niebloids of std::span -// for any given type of the static_vector/small_vector, etc which makes a whole mess -// for anything using std::span so we just do this terrible hack on older versions of -// GCC12 because people actually still use stable debian so... yeah -// One may say: "This is bad for performance" - to which I say, using GCC 12 you already know -// what kind of bs you will be dealing with anyways. -template -#if BOOST_VERSION >= 108100 || __GNUC__ > 12 -[[nodiscard]] boost::container::small_vector FixSmallVectorADL(const boost::container::small_vector& v) { - return v; -} -#else -[[nodiscard]] std::vector FixSmallVectorADL(const boost::container::small_vector& v) { - std::vector u; - for (auto const& e : v) - u.push_back(e); - return u; -} -#endif - } // namespace VideoCommon From 218c6705d950635bc18f8458d738a1996fb592b6 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 13 Oct 2026 04:38:36 +0200 Subject: [PATCH 105/128] [hle] constexpr handler dispatch maps, introduce version gating (#4480) This PR primarily focuses on upbringing constexpr maps for handlers. Each time an HLE object of a service is construed, it registers it's own handlers, over and over. Regardless of whetever it needs them at the moment or not. Additionally we don't require to keep track of different function pointers amongst each object. This can be done by overriding the given function instead, as opposed to having a separate hash map for every given object. In other words: Remove handlers (and handlers_tipc) map for every instance then read from a static defined per-class. - [x] Migrate all HLE functions to new `frozen::map` constexpr time finder - [ ] Measure if this approach actually makes better codegen Optional: - [x] Properly gate all functions (that have versions commented next to them) - [x] Maybe store `HandlerFnP<>` and `const char*` separately, version gating can go in a different map as well Information such as name can be used on debug builds, but doesn't particularly help on release as one can consult an external reference (or have an annotated IPC map) Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Co-authored-by: Maufeat Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4480 Reviewed-by: Maufeat Reviewed-by: MaranBr --- docs/DesignOverview.md | 2 +- docs/README.md | 2 +- docs/{HosKernel.md => SubsystemHLE.md} | 53 +- src/core/CMakeLists.txt | 70 +- src/core/hle/service/acc/acc.cpp | 1933 +++++++++-------- src/core/hle/service/acc/acc.h | 64 - src/core/hle/service/acc/async_context.cpp | 11 - src/core/hle/service/acc/async_context.h | 13 + src/core/hle/service/am/am.cpp | 1341 +++++++++++- .../all_system_applet_proxies_service.cpp | 135 -- .../all_system_applet_proxies_service.h | 56 - .../am/service/applet_common_functions.cpp | 98 - .../am/service/applet_common_functions.h | 33 - .../am/service/application_accessor.cpp | 64 +- .../service/am/service/application_accessor.h | 4 + .../am/service/application_creator.cpp | 20 +- .../service/am/service/application_creator.h | 3 +- .../am/service/application_functions.cpp | 153 +- .../am/service/application_functions.h | 1 + .../service/am/service/application_proxy.cpp | 106 - .../service/am/service/application_proxy.h | 49 - .../am/service/application_proxy_service.cpp | 44 - .../am/service/application_proxy_service.h | 33 - .../service/am/service/audio_controller.cpp | 26 +- .../hle/service/am/service/audio_controller.h | 4 + .../am/service/common_state_getter.cpp | 209 +- .../service/am/service/common_state_getter.h | 1 + .../am/service/cradle_firmware_updater.cpp | 28 +- .../am/service/cradle_firmware_updater.h | 4 + .../service/am/service/debug_functions.cpp | 43 - .../hle/service/am/service/debug_functions.h | 16 - .../service/am/service/display_controller.cpp | 68 +- .../service/am/service/display_controller.h | 3 +- .../am/service/global_state_controller.cpp | 41 +- .../am/service/global_state_controller.h | 7 +- .../am/service/home_menu_functions.cpp | 42 +- .../service/am/service/home_menu_functions.h | 1 + .../am/service/library_applet_accessor.cpp | 64 +- .../am/service/library_applet_accessor.h | 22 +- .../am/service/library_applet_creator.cpp | 287 --- .../am/service/library_applet_creator.h | 44 - .../am/service/library_applet_proxy.cpp | 134 -- .../service/am/service/library_applet_proxy.h | 56 - .../service/library_applet_self_accessor.cpp | 332 --- .../am/service/library_applet_self_accessor.h | 87 - .../hle/service/am/service/lock_accessor.cpp | 78 - .../hle/service/am/service/lock_accessor.h | 32 - .../am/service/overlay_applet_proxy.cpp | 120 - .../service/am/service/overlay_applet_proxy.h | 55 - .../service/am/service/overlay_functions.cpp | 52 +- .../service/am/service/overlay_functions.h | 35 +- .../am/service/process_winding_controller.cpp | 28 +- .../am/service/process_winding_controller.h | 1 + .../service/am/service/self_controller.cpp | 113 +- .../hle/service/am/service/self_controller.h | 1 + src/core/hle/service/am/service/storage.cpp | 78 +- src/core/hle/service/am/service/storage.h | 4 + .../service/am/service/storage_accessor.cpp | 68 - .../hle/service/am/service/storage_accessor.h | 38 - .../am/service/system_applet_proxy.cpp | 133 -- .../service/am/service/system_applet_proxy.h | 58 - .../service/am/service/window_controller.cpp | 31 +- .../service/am/service/window_controller.h | 4 + .../hle/service/aoc/addon_content_manager.cpp | 57 +- .../hle/service/aoc/addon_content_manager.h | 5 +- .../service/aoc/purchase_event_manager.cpp | 30 +- .../hle/service/aoc/purchase_event_manager.h | 5 + src/core/hle/service/apm/apm_interface.cpp | 38 +- src/core/hle/service/apm/apm_interface.h | 24 + src/core/hle/service/audio/audio.cpp | 208 +- .../hle/service/audio/audio_controller.cpp | 140 +- src/core/hle/service/audio/audio_controller.h | 4 +- src/core/hle/service/audio/audio_device.cpp | 52 +- src/core/hle/service/audio/audio_device.h | 1 + src/core/hle/service/audio/audio_in.cpp | 50 +- src/core/hle/service/audio/audio_in.h | 4 + .../hle/service/audio/audio_in_manager.cpp | 33 +- src/core/hle/service/audio/audio_in_manager.h | 4 + src/core/hle/service/audio/audio_out.cpp | 40 +- src/core/hle/service/audio/audio_out.h | 5 + .../hle/service/audio/audio_out_manager.cpp | 20 +- .../hle/service/audio/audio_out_manager.h | 1 + src/core/hle/service/audio/audio_renderer.cpp | 51 +- src/core/hle/service/audio/audio_renderer.h | 4 + .../service/audio/audio_renderer_manager.cpp | 22 +- .../service/audio/audio_renderer_manager.h | 1 + .../audio/final_output_recorder_manager.cpp | 42 +- .../audio/final_output_recorder_manager.h | 10 + ...nal_output_recorder_manager_for_applet.cpp | 11 +- ...final_output_recorder_manager_for_applet.h | 11 + .../service/audio/hardware_opus_decoder.cpp | 35 +- .../hle/service/audio/hardware_opus_decoder.h | 4 + .../audio/hardware_opus_decoder_manager.cpp | 34 +- .../audio/hardware_opus_decoder_manager.h | 4 + src/core/hle/service/bcat/bcat_service.cpp | 75 +- src/core/hle/service/bcat/bcat_service.h | 1 + .../bcat/delivery_cache_directory_service.cpp | 18 +- .../bcat/delivery_cache_directory_service.h | 4 + .../bcat/delivery_cache_file_service.cpp | 23 +- .../bcat/delivery_cache_file_service.h | 4 + .../bcat/delivery_cache_progress_service.cpp | 19 +- .../bcat/delivery_cache_progress_service.h | 4 + .../bcat/delivery_cache_storage_service.cpp | 20 +- .../bcat/delivery_cache_storage_service.h | 4 + .../bcat/news/newly_arrived_event_holder.cpp | 22 +- .../bcat/news/newly_arrived_event_holder.h | 4 + .../service/bcat/news/news_data_service.cpp | 19 +- .../hle/service/bcat/news/news_data_service.h | 3 +- .../bcat/news/news_database_service.cpp | 25 +- .../service/bcat/news/news_database_service.h | 4 +- .../hle/service/bcat/news/news_service.cpp | 52 +- src/core/hle/service/bcat/news/news_service.h | 11 +- .../bcat/news/overwrite_event_holder.cpp | 21 +- .../bcat/news/overwrite_event_holder.h | 4 + .../hle/service/bcat/news/service_creator.cpp | 25 +- .../hle/service/bcat/news/service_creator.h | 4 + src/core/hle/service/bcat/service_creator.cpp | 26 +- src/core/hle/service/bcat/service_creator.h | 4 + src/core/hle/service/bpc/bpc.cpp | 138 +- src/core/hle/service/btdrv/btdrv.cpp | 310 +-- src/core/hle/service/btm/btm.cpp | 497 ++++- src/core/hle/service/btm/btm_debug.cpp | 40 - src/core/hle/service/btm/btm_debug.h | 21 - src/core/hle/service/btm/btm_system.cpp | 34 - src/core/hle/service/btm/btm_system.h | 25 - src/core/hle/service/btm/btm_system_core.cpp | 135 -- src/core/hle/service/btm/btm_system_core.h | 62 - src/core/hle/service/btm/btm_user.cpp | 33 - src/core/hle/service/btm/btm_user.h | 25 - src/core/hle/service/btm/btm_user_core.cpp | 106 - src/core/hle/service/btm/btm_user_core.h | 47 - src/core/hle/service/caps/caps.cpp | 218 +- src/core/hle/service/caps/caps_a.cpp | 211 -- src/core/hle/service/caps/caps_a.h | 63 - src/core/hle/service/caps/caps_c.cpp | 50 +- src/core/hle/service/caps/caps_c.h | 12 +- src/core/hle/service/caps/caps_sc.cpp | 29 +- src/core/hle/service/caps/caps_sc.h | 29 + src/core/hle/service/caps/caps_ss.cpp | 26 +- src/core/hle/service/caps/caps_ss.h | 4 + src/core/hle/service/caps/caps_su.cpp | 22 +- src/core/hle/service/caps/caps_su.h | 5 +- src/core/hle/service/caps/caps_u.cpp | 40 +- src/core/hle/service/caps/caps_u.h | 4 + src/core/hle/service/erpt/erpt.cpp | 64 +- src/core/hle/service/es/es.cpp | 342 +-- src/core/hle/service/eupld/eupld.cpp | 47 +- src/core/hle/service/fatal/fatal.cpp | 31 +- src/core/hle/service/fatal/fatal_p.cpp | 19 - src/core/hle/service/fatal/fatal_p.h | 16 - src/core/hle/service/fatal/fatal_u.cpp | 20 - src/core/hle/service/fatal/fatal_u.h | 16 - src/core/hle/service/fgm/fgm.cpp | 52 +- .../service/filesystem/fsp/fs_i_directory.cpp | 16 +- .../service/filesystem/fsp/fs_i_directory.h | 5 + .../hle/service/filesystem/fsp/fs_i_file.cpp | 12 - .../hle/service/filesystem/fsp/fs_i_file.h | 16 + .../filesystem/fsp/fs_i_filesystem.cpp | 43 +- .../service/filesystem/fsp/fs_i_filesystem.h | 1 + .../fsp/fs_i_multi_commit_manager.cpp | 8 +- .../fsp/fs_i_multi_commit_manager.h | 10 + .../fsp/fs_i_save_data_info_reader.cpp | 7 +- .../fsp/fs_i_save_data_info_reader.h | 9 + .../service/filesystem/fsp/fs_i_storage.cpp | 9 - .../hle/service/filesystem/fsp/fs_i_storage.h | 18 +- .../hle/service/filesystem/fsp/fsp_ldr.cpp | 12 +- src/core/hle/service/filesystem/fsp/fsp_ldr.h | 12 + .../hle/service/filesystem/fsp/fsp_pr.cpp | 13 +- src/core/hle/service/filesystem/fsp/fsp_pr.h | 13 + .../hle/service/filesystem/fsp/fsp_srv.cpp | 271 ++- src/core/hle/service/filesystem/fsp/fsp_srv.h | 1 + src/core/hle/service/friend/friend.cpp | 378 ++-- .../hle/service/friend/friend_interface.cpp | 20 - .../hle/service/friend/friend_interface.h | 16 - src/core/hle/service/glue/arp.cpp | 42 +- src/core/hle/service/glue/arp.h | 26 + src/core/hle/service/glue/bgtc.cpp | 43 +- src/core/hle/service/glue/bgtc.h | 42 + src/core/hle/service/glue/ectx.cpp | 38 +- src/core/hle/service/glue/ectx.h | 26 + src/core/hle/service/glue/notif.cpp | 96 +- src/core/hle/service/glue/notif.h | 5 + src/core/hle/service/glue/time/static.cpp | 59 +- src/core/hle/service/glue/time/static.h | 6 +- src/core/hle/service/glue/time/time_zone.cpp | 40 +- src/core/hle/service/glue/time/time_zone.h | 1 + src/core/hle/service/gpio/gpio.cpp | 16 +- src/core/hle/service/grc/grc.cpp | 39 +- .../hid/active_vibration_device_list.cpp | 14 +- .../hid/active_vibration_device_list.h | 5 +- src/core/hle/service/hid/applet_resource.cpp | 11 +- src/core/hle/service/hid/applet_resource.h | 4 + src/core/hle/service/hid/hid.cpp | 365 +++- src/core/hle/service/hid/hid_debug_server.cpp | 296 +-- src/core/hle/service/hid/hid_debug_server.h | 29 +- src/core/hle/service/hid/hid_server.cpp | 396 ++-- src/core/hle/service/hid/hid_server.h | 2 + .../hle/service/hid/hid_system_server.cpp | 246 --- src/core/hle/service/hid/hid_system_server.h | 249 +++ src/core/hle/service/hid/hidbus.cpp | 42 +- src/core/hle/service/hid/hidbus.h | 5 + src/core/hle/service/hid/irs.cpp | 58 +- src/core/hle/service/hid/irs.h | 15 + src/core/hle/service/hid/xcd.cpp | 30 +- src/core/hle/service/hid/xcd.h | 30 + src/core/hle/service/i2c/i2c.cpp | 54 +- src/core/hle/service/jit/jit.cpp | 37 +- src/core/hle/service/lbl/lbl.cpp | 71 +- src/core/hle/service/ldn/ldn.cpp | 138 +- src/core/hle/service/ldn/monitor_service.cpp | 31 +- src/core/hle/service/ldn/monitor_service.h | 4 + .../hle/service/ldn/sf_monitor_service.cpp | 21 +- src/core/hle/service/ldn/sf_monitor_service.h | 4 + src/core/hle/service/ldn/sf_service.cpp | 37 - src/core/hle/service/ldn/sf_service.h | 21 - .../hle/service/ldn/sf_service_monitor.cpp | 41 +- src/core/hle/service/ldn/sf_service_monitor.h | 7 +- .../system_local_communication_service.cpp | 75 +- .../ldn/system_local_communication_service.h | 4 + .../ldn/user_local_communication_service.cpp | 72 +- .../ldn/user_local_communication_service.h | 3 +- src/core/hle/service/ldr/ldr.cpp | 53 +- src/core/hle/service/lm/lm.cpp | 55 +- src/core/hle/service/mig/mig.cpp | 86 +- src/core/hle/service/mii/mii.cpp | 134 +- src/core/hle/service/mii/mii.h | 4 + src/core/hle/service/mm/mm_u.cpp | 27 +- src/core/hle/service/mnpp/mnpp.cpp | 62 +- src/core/hle/service/ncm/ncm.cpp | 220 +- src/core/hle/service/nfc/nfc.cpp | 230 +- src/core/hle/service/nfp/nfp.cpp | 266 ++- src/core/hle/service/ngc/ngc.cpp | 160 +- src/core/hle/service/nifm/nifm.cpp | 227 +- src/core/hle/service/nifm/nifm.h | 3 +- src/core/hle/service/nim/nim.cpp | 681 +++--- src/core/hle/service/npns/npns.cpp | 196 +- .../service/ns/account_proxy_interface.cpp | 10 +- .../hle/service/ns/account_proxy_interface.h | 10 + .../ns/application_manager_interface.cpp | 904 ++++---- .../ns/application_manager_interface.h | 1 + .../ns/application_version_interface.cpp | 22 +- .../ns/application_version_interface.h | 22 + src/core/hle/service/ns/async_result.cpp | 18 +- src/core/hle/service/ns/async_result.h | 1 + .../ns/content_management_interface.cpp | 16 - .../service/ns/content_management_interface.h | 16 + src/core/hle/service/ns/develop_interface.cpp | 28 +- src/core/hle/service/ns/develop_interface.h | 28 + .../hle/service/ns/document_interface.cpp | 12 +- src/core/hle/service/ns/document_interface.h | 12 + .../service/ns/download_task_interface.cpp | 18 +- .../hle/service/ns/download_task_interface.h | 18 + .../service/ns/dynamic_rights_interface.cpp | 70 +- .../hle/service/ns/dynamic_rights_interface.h | 2 + .../hle/service/ns/ecommerce_interface.cpp | 16 +- src/core/hle/service/ns/ecommerce_interface.h | 16 + .../service/ns/factory_reset_interface.cpp | 29 +- .../hle/service/ns/factory_reset_interface.h | 4 + src/core/hle/service/ns/ns.cpp | 63 +- .../service/ns/platform_service_manager.cpp | 44 +- .../hle/service/ns/platform_service_manager.h | 12 +- src/core/hle/service/ns/query_service.cpp | 64 +- src/core/hle/service/ns/query_service.h | 1 + ...nly_application_control_data_interface.cpp | 48 +- ..._only_application_control_data_interface.h | 2 + ...read_only_application_record_interface.cpp | 19 +- .../read_only_application_record_interface.h | 4 +- .../service/ns/service_getter_interface.cpp | 37 +- .../hle/service/ns/service_getter_interface.h | 5 + .../hle/service/ns/system_update_control.cpp | 32 +- .../hle/service/ns/system_update_control.h | 32 + .../service/ns/system_update_interface.cpp | 49 +- .../hle/service/ns/system_update_interface.h | 5 +- src/core/hle/service/nvdrv/nvdrv.cpp | 74 +- .../hle/service/nvdrv/nvdrv_interface.cpp | 18 - src/core/hle/service/nvdrv/nvdrv_interface.h | 24 +- src/core/hle/service/nvdrv/nvmemp.cpp | 5 - src/core/hle/service/nvdrv/nvmemp.h | 11 + .../service/nvnflinger/hos_binder_driver.cpp | 20 +- .../service/nvnflinger/hos_binder_driver.h | 1 + .../hle/service/olsc/daemon_controller.cpp | 36 +- src/core/hle/service/olsc/daemon_controller.h | 2 + .../hle/service/olsc/native_handle_holder.cpp | 14 +- .../hle/service/olsc/native_handle_holder.h | 1 + src/core/hle/service/olsc/olsc.cpp | 173 +- .../olsc/olsc_service_for_application.cpp | 59 +- .../olsc/olsc_service_for_application.h | 2 + .../olsc/olsc_service_for_system_service.cpp | 144 -- .../olsc/olsc_service_for_system_service.h | 53 - .../olsc/remote_storage_controller.cpp | 72 +- .../service/olsc/remote_storage_controller.h | 2 + .../olsc/transfer_task_list_controller.cpp | 74 +- .../olsc/transfer_task_list_controller.h | 2 + .../service/omm/operation_mode_manager.cpp | 38 +- .../hle/service/omm/operation_mode_manager.h | 38 + .../hle/service/omm/policy_manager_system.cpp | 15 +- .../hle/service/omm/policy_manager_system.h | 15 + .../hle/service/omm/power_state_interface.cpp | 21 +- .../hle/service/omm/power_state_interface.h | 21 + src/core/hle/service/pcie/pcie.cpp | 90 +- .../service/pctl/parental_control_service.cpp | 498 ----- .../service/pctl/parental_control_service.h | 99 - .../pctl/parental_control_service_factory.cpp | 44 - .../pctl/parental_control_service_factory.h | 31 - src/core/hle/service/pctl/pctl.cpp | 636 +++++- src/core/hle/service/pctl/pctl_results.h | 15 - src/core/hle/service/pctl/pctl_types.h | 73 - src/core/hle/service/pcv/pcv.cpp | 172 +- src/core/hle/service/pm/pm.cpp | 100 +- src/core/hle/service/prepo/prepo.cpp | 91 +- src/core/hle/service/psc/ovln/receiver.cpp | 118 - src/core/hle/service/psc/ovln/receiver.h | 46 - .../hle/service/psc/ovln/receiver_service.cpp | 123 +- .../hle/service/psc/ovln/receiver_service.h | 5 + src/core/hle/service/psc/ovln/sender.cpp | 32 - src/core/hle/service/psc/ovln/sender.h | 21 - .../hle/service/psc/ovln/sender_service.cpp | 43 +- .../hle/service/psc/ovln/sender_service.h | 8 +- src/core/hle/service/psc/pm_control.cpp | 28 - src/core/hle/service/psc/pm_control.h | 16 - src/core/hle/service/psc/pm_module.cpp | 24 - src/core/hle/service/psc/pm_module.h | 16 - src/core/hle/service/psc/pm_service.cpp | 28 - src/core/hle/service/psc/pm_service.h | 22 - src/core/hle/service/psc/psc.cpp | 181 +- src/core/hle/service/psc/time/alarms.cpp | 24 +- src/core/hle/service/psc/time/alarms.h | 21 +- src/core/hle/service/psc/time/manager.h | 31 +- .../service/psc/time/power_state_service.cpp | 19 +- .../service/psc/time/power_state_service.h | 1 + .../hle/service/psc/time/service_manager.cpp | 48 +- .../hle/service/psc/time/service_manager.h | 2 + src/core/hle/service/psc/time/static.cpp | 50 +- src/core/hle/service/psc/time/static.h | 2 + .../hle/service/psc/time/steady_clock.cpp | 28 +- src/core/hle/service/psc/time/steady_clock.h | 2 + .../hle/service/psc/time/system_clock.cpp | 24 +- src/core/hle/service/psc/time/system_clock.h | 1 + .../service/psc/time/time_zone_service.cpp | 42 +- .../hle/service/psc/time/time_zone_service.h | 1 + src/core/hle/service/ptm/psm.cpp | 53 +- src/core/hle/service/ptm/psm.h | 25 + src/core/hle/service/ptm/ptm.cpp | 32 +- src/core/hle/service/ptm/ts.cpp | 29 +- src/core/hle/service/ptm/ts.h | 14 + src/core/hle/service/ro/ro.cpp | 371 +++- src/core/hle/service/ro/ro_nro_utils.cpp | 185 -- src/core/hle/service/ro/ro_nro_utils.h | 26 - src/core/hle/service/ro/ro_results.h | 29 - src/core/hle/service/ro/ro_types.h | 142 -- src/core/hle/service/service.cpp | 69 +- src/core/hle/service/service.h | 145 +- .../service/set/factory_settings_server.cpp | 52 +- .../hle/service/set/factory_settings_server.h | 52 + .../set/firmware_debug_settings_server.cpp | 19 +- .../set/firmware_debug_settings_server.h | 20 + src/core/hle/service/set/settings_server.cpp | 38 +- src/core/hle/service/set/settings_server.h | 25 +- .../service/set/system_settings_server.cpp | 465 ++-- .../hle/service/set/system_settings_server.h | 2 +- src/core/hle/service/sm/sm.cpp | 205 +- src/core/hle/service/sm/sm.h | 24 +- src/core/hle/service/sm/sm_controller.cpp | 128 -- src/core/hle/service/sm/sm_controller.h | 27 - src/core/hle/service/sockets/bsd.cpp | 81 - src/core/hle/service/sockets/bsd.h | 81 + src/core/hle/service/sockets/nsd.cpp | 32 - src/core/hle/service/sockets/nsd.h | 32 + src/core/hle/service/sockets/sfdnsres.cpp | 27 - src/core/hle/service/sockets/sfdnsres.h | 31 + src/core/hle/service/sockets/sockets.cpp | 62 +- src/core/hle/service/spl/spl.cpp | 171 +- src/core/hle/service/spl/spl.h | 141 ++ src/core/hle/service/spl/spl_module.cpp | 15 +- src/core/hle/service/ssl/ssl.cpp | 395 ++-- src/core/hle/service/tma/tma.cpp | 12 +- src/core/hle/service/usb/usb.cpp | 290 ++- .../vi/application_display_service.cpp | 56 +- .../service/vi/application_display_service.h | 2 +- .../service/vi/application_root_service.cpp | 16 +- .../hle/service/vi/application_root_service.h | 4 + .../service/vi/manager_display_service.cpp | 176 +- .../hle/service/vi/manager_display_service.h | 3 +- .../hle/service/vi/manager_root_service.cpp | 24 +- .../hle/service/vi/manager_root_service.h | 4 + .../hle/service/vi/shared_buffer_manager.h | 4 + .../hle/service/vi/system_display_service.cpp | 112 +- .../hle/service/vi/system_display_service.h | 1 + .../hle/service/vi/system_root_service.cpp | 20 +- src/core/hle/service/vi/system_root_service.h | 4 + src/core/hle/service/wlan/wlan.cpp | 368 ++-- tools/README.md | 2 +- 392 files changed, 12860 insertions(+), 14029 deletions(-) rename docs/{HosKernel.md => SubsystemHLE.md} (55%) delete mode 100644 src/core/hle/service/am/service/all_system_applet_proxies_service.cpp delete mode 100644 src/core/hle/service/am/service/all_system_applet_proxies_service.h delete mode 100644 src/core/hle/service/am/service/applet_common_functions.cpp delete mode 100644 src/core/hle/service/am/service/applet_common_functions.h delete mode 100644 src/core/hle/service/am/service/application_proxy.cpp delete mode 100644 src/core/hle/service/am/service/application_proxy.h delete mode 100644 src/core/hle/service/am/service/application_proxy_service.cpp delete mode 100644 src/core/hle/service/am/service/application_proxy_service.h delete mode 100644 src/core/hle/service/am/service/debug_functions.cpp delete mode 100644 src/core/hle/service/am/service/debug_functions.h delete mode 100644 src/core/hle/service/am/service/library_applet_creator.cpp delete mode 100644 src/core/hle/service/am/service/library_applet_creator.h delete mode 100644 src/core/hle/service/am/service/library_applet_proxy.cpp delete mode 100644 src/core/hle/service/am/service/library_applet_proxy.h delete mode 100644 src/core/hle/service/am/service/library_applet_self_accessor.cpp delete mode 100644 src/core/hle/service/am/service/library_applet_self_accessor.h delete mode 100644 src/core/hle/service/am/service/lock_accessor.cpp delete mode 100644 src/core/hle/service/am/service/lock_accessor.h delete mode 100644 src/core/hle/service/am/service/overlay_applet_proxy.cpp delete mode 100644 src/core/hle/service/am/service/overlay_applet_proxy.h delete mode 100644 src/core/hle/service/am/service/storage_accessor.cpp delete mode 100644 src/core/hle/service/am/service/storage_accessor.h delete mode 100644 src/core/hle/service/am/service/system_applet_proxy.cpp delete mode 100644 src/core/hle/service/am/service/system_applet_proxy.h delete mode 100644 src/core/hle/service/btm/btm_debug.cpp delete mode 100644 src/core/hle/service/btm/btm_debug.h delete mode 100644 src/core/hle/service/btm/btm_system.cpp delete mode 100644 src/core/hle/service/btm/btm_system.h delete mode 100644 src/core/hle/service/btm/btm_system_core.cpp delete mode 100644 src/core/hle/service/btm/btm_system_core.h delete mode 100644 src/core/hle/service/btm/btm_user.cpp delete mode 100644 src/core/hle/service/btm/btm_user.h delete mode 100644 src/core/hle/service/btm/btm_user_core.cpp delete mode 100644 src/core/hle/service/btm/btm_user_core.h delete mode 100644 src/core/hle/service/caps/caps_a.cpp delete mode 100644 src/core/hle/service/caps/caps_a.h delete mode 100644 src/core/hle/service/fatal/fatal_p.cpp delete mode 100644 src/core/hle/service/fatal/fatal_p.h delete mode 100644 src/core/hle/service/fatal/fatal_u.cpp delete mode 100644 src/core/hle/service/fatal/fatal_u.h delete mode 100644 src/core/hle/service/friend/friend_interface.cpp delete mode 100644 src/core/hle/service/friend/friend_interface.h delete mode 100644 src/core/hle/service/ldn/sf_service.cpp delete mode 100644 src/core/hle/service/ldn/sf_service.h delete mode 100644 src/core/hle/service/olsc/olsc_service_for_system_service.cpp delete mode 100644 src/core/hle/service/olsc/olsc_service_for_system_service.h delete mode 100644 src/core/hle/service/pctl/parental_control_service.cpp delete mode 100644 src/core/hle/service/pctl/parental_control_service.h delete mode 100644 src/core/hle/service/pctl/parental_control_service_factory.cpp delete mode 100644 src/core/hle/service/pctl/parental_control_service_factory.h delete mode 100644 src/core/hle/service/pctl/pctl_results.h delete mode 100644 src/core/hle/service/pctl/pctl_types.h delete mode 100644 src/core/hle/service/psc/ovln/receiver.cpp delete mode 100644 src/core/hle/service/psc/ovln/receiver.h delete mode 100644 src/core/hle/service/psc/ovln/sender.cpp delete mode 100644 src/core/hle/service/psc/ovln/sender.h delete mode 100644 src/core/hle/service/psc/pm_control.cpp delete mode 100644 src/core/hle/service/psc/pm_control.h delete mode 100644 src/core/hle/service/psc/pm_module.cpp delete mode 100644 src/core/hle/service/psc/pm_module.h delete mode 100644 src/core/hle/service/psc/pm_service.cpp delete mode 100644 src/core/hle/service/psc/pm_service.h delete mode 100644 src/core/hle/service/ro/ro_nro_utils.cpp delete mode 100644 src/core/hle/service/ro/ro_nro_utils.h delete mode 100644 src/core/hle/service/ro/ro_results.h delete mode 100644 src/core/hle/service/ro/ro_types.h delete mode 100644 src/core/hle/service/sm/sm_controller.cpp delete mode 100644 src/core/hle/service/sm/sm_controller.h diff --git a/docs/DesignOverview.md b/docs/DesignOverview.md index c6a328cb9c..959fbfdbb2 100644 --- a/docs/DesignOverview.md +++ b/docs/DesignOverview.md @@ -1,6 +1,6 @@ # Design Overview -Modern game consoles require heavy power to be emulated appropriately. This is why the emulator uses an approach known as HLE (High-Level-Emulation), in a nutshell: Instead of accurately emulating every subsystem that forms part of a component, emulate the resulting visible I/O interface instead. +Modern game consoles require heavy power to emulate. This is why the emulator uses an approach known as HLE (High-Level-Emulation), in a nutshell: Instead of accurately emulating every subsystem that forms part of a component, emulate the resulting visible output of said interface instead. For example, take a disk write, instead of emulating a proper SD card we instead use the C++ standard library for I/O. Additionally we use the abstractions provided by the `fs` service to "lie" to programs about certain SD card properties. Notably this includes making up sizes for the fake SD card, giving "realistic" values or expected outputs for a given card, and so on. And instead of writing to an actual SD card, the emulator simply writes to a file. diff --git a/docs/README.md b/docs/README.md index 5bcaf30239..f7568e16f3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,7 +21,7 @@ This contains documentation created by developers, build instructions, guideline - Subsystems: - **[Design Overview](./DesignOverview.md)** - **[Dynarmic](./dynarmic/README.md)** - - **[HOS Kernel](./HosKernel.md)** + - **[Subsystem: HLE](./SubsystemHLE.md)** - **[Settings](./Settings.md)** ## Policies diff --git a/docs/HosKernel.md b/docs/SubsystemHLE.md similarity index 55% rename from docs/HosKernel.md rename to docs/SubsystemHLE.md index 87df2072a5..7a59fef9fa 100644 --- a/docs/HosKernel.md +++ b/docs/SubsystemHLE.md @@ -1,4 +1,6 @@ -# HOS Kernel +# Subsystem: HLE + +## HOS Kernel In brief, the HOS kernel is a microkernel, all services and programs run in userspace, the primary way to do communication between these is via `HIPC` (not covered here); otherwise most of the primitives reside in the forms of syscalls invoked via `svc #imm`. The kernel supports both 32-bit and 64-bit programs, and has the capacity to use 32, 36 and 39 bits of address space for spawned processes. Most of the networking stack is based off FreeBSD's network stack. @@ -29,3 +31,52 @@ Every process keeps it's own tracking of the following structures: The emulator willingly restricts itself to only use 4 threads (to emulate 4 cores), this is because most existing applications do not benefit greatly from the added core count, and in fact can be detrimental due to extra contention. This translates equitatively to about 4 `ArmInterface` slots for each process, these are then redirected to whatever is the last `pc` of the last thread running on the core is meant to be; proceed to run it, then when returning (due to halt or interruption), proceed to reschedule the thread. The scheduler as-is isn't 100% faithful to the original (for example the original is cooperative and not preemptive), and has great timing variance (especially due to the fact the emulator can run in systems with wildly different timings). + +## Services + +Consult [SwitchBrew](https://switchbrew.org/) for per-service methods, and implementation details. + +All services are instatiated implicitly using `ServiceFramework`. To register a new interface or service, you can inherit from said class, providing additionally a template parameter that references `Self`, for example: + +```c++ +// Follows as: +// class MyInterface [final] : public ServiceFramework { ... }; +// [final] is optional, but should be used whenever there is no intention of this class itself being inherited. +class IFloatingRegistrationRequest final : public ServiceFramework { +public: + // ctor, you can pass extra parameters here (if so required) + explicit IFloatingRegistrationRequest(Core::System& system_) + : ServiceFramework{system_, "IFloatingRegistrationRequest"} + {} + + // Must be placed after all methods are defined (or declared). + // Define here your functions and methods, please order them. + // Use FindRequestTipc for TIPC handlers. + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetSessionId"}, + FunctionInfo{12, nullptr, "GetAccountId"}, + FunctionInfo{13, nullptr, "GetLinkedNintendoAccountId"}, + FunctionInfo{14, nullptr, "GetNickname"}, + FunctionInfo{15, nullptr, "GetProfileImage"}, + FunctionInfo{16, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})}, + FunctionInfo{21, nullptr, "LoadIdTokenCache"}, + FunctionInfo{100, nullptr, "RegisterUser"}, + FunctionInfo{101, nullptr, "RegisterUserWithUid"}, + FunctionInfo{102, nullptr, "RegisterNetworkServiceAccountAsync", MakeVersionGate({4,0,0})}, + FunctionInfo{103, nullptr, "RegisterNetworkServiceAccountWithUidAsync", MakeVersionGate({4,0,0})}, + FunctionInfo{110, nullptr, "SetSystemProgramIdentification"}, + FunctionInfo{111, nullptr, "EnsureIdTokenCacheAsync"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } +}; +``` + +Try to keep service structures local, that is, don't place them on header files if they're only going to be used by a specific service. + +In each `.cpp` file that uses `D<...>/C<...>` CMIF wrapper helpers, remember to include the corresponding instancer, so you don't face linker errors: +```c++ +#include "core/hle/service/cmif_serialization.h" +``` +This will properly instatiate the corresponding wrappers and decompose the provided arguments in the wiring order. diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 31f9931d3a..f1d4bdae42 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -444,28 +444,18 @@ add_library(core STATIC hle/service/am/process_creation.h hle/service/am/process_holder.cpp hle/service/am/process_holder.h - hle/service/am/service/all_system_applet_proxies_service.cpp - hle/service/am/service/all_system_applet_proxies_service.h - hle/service/am/service/applet_common_functions.cpp - hle/service/am/service/applet_common_functions.h hle/service/am/service/application_accessor.cpp hle/service/am/service/application_accessor.h hle/service/am/service/application_creator.cpp hle/service/am/service/application_creator.h hle/service/am/service/application_functions.cpp hle/service/am/service/application_functions.h - hle/service/am/service/application_proxy.cpp - hle/service/am/service/application_proxy.h - hle/service/am/service/application_proxy_service.cpp - hle/service/am/service/application_proxy_service.h hle/service/am/service/audio_controller.cpp hle/service/am/service/audio_controller.h hle/service/am/service/common_state_getter.cpp hle/service/am/service/common_state_getter.h hle/service/am/service/cradle_firmware_updater.cpp hle/service/am/service/cradle_firmware_updater.h - hle/service/am/service/debug_functions.cpp - hle/service/am/service/debug_functions.h hle/service/am/service/display_controller.cpp hle/service/am/service/display_controller.h hle/service/am/service/global_state_controller.cpp @@ -474,28 +464,14 @@ add_library(core STATIC hle/service/am/service/home_menu_functions.h hle/service/am/service/library_applet_accessor.cpp hle/service/am/service/library_applet_accessor.h - hle/service/am/service/library_applet_creator.cpp - hle/service/am/service/library_applet_creator.h - hle/service/am/service/library_applet_proxy.cpp - hle/service/am/service/library_applet_proxy.h - hle/service/am/service/library_applet_self_accessor.cpp - hle/service/am/service/library_applet_self_accessor.h - hle/service/am/service/lock_accessor.cpp - hle/service/am/service/lock_accessor.h hle/service/am/service/overlay_functions.cpp hle/service/am/service/overlay_functions.h - hle/service/am/service/overlay_applet_proxy.cpp - hle/service/am/service/overlay_applet_proxy.h hle/service/am/service/process_winding_controller.cpp hle/service/am/service/process_winding_controller.h hle/service/am/service/self_controller.cpp hle/service/am/service/self_controller.h hle/service/am/service/storage.cpp hle/service/am/service/storage.h - hle/service/am/service/storage_accessor.cpp - hle/service/am/service/storage_accessor.h - hle/service/am/service/system_applet_proxy.cpp - hle/service/am/service/system_applet_proxy.h hle/service/am/service/window_controller.cpp hle/service/am/service/window_controller.h hle/service/am/window_system.cpp @@ -580,20 +556,8 @@ add_library(core STATIC hle/service/btdrv/btdrv.h hle/service/btm/btm.cpp hle/service/btm/btm.h - hle/service/btm/btm_debug.cpp - hle/service/btm/btm_debug.h - hle/service/btm/btm_system.cpp - hle/service/btm/btm_system.h - hle/service/btm/btm_system_core.cpp - hle/service/btm/btm_system_core.h - hle/service/btm/btm_user.cpp - hle/service/btm/btm_user.h - hle/service/btm/btm_user_core.cpp - hle/service/btm/btm_user_core.h hle/service/caps/caps.cpp hle/service/caps/caps.h - hle/service/caps/caps_a.cpp - hle/service/caps/caps_a.h hle/service/caps/caps_c.cpp hle/service/caps/caps_c.h hle/service/caps/caps_manager.cpp @@ -618,10 +582,6 @@ add_library(core STATIC hle/service/eupld/eupld.h hle/service/fatal/fatal.cpp hle/service/fatal/fatal.h - hle/service/fatal/fatal_p.cpp - hle/service/fatal/fatal_p.h - hle/service/fatal/fatal_u.cpp - hle/service/fatal/fatal_u.h hle/service/fgm/fgm.cpp hle/service/fgm/fgm.h hle/service/filesystem/filesystem.cpp @@ -653,8 +613,6 @@ add_library(core STATIC hle/service/filesystem/save_data_controller.h hle/service/friend/friend.cpp hle/service/friend/friend.h - hle/service/friend/friend_interface.cpp - hle/service/friend/friend_interface.h hle/service/glue/arp.cpp hle/service/glue/arp.h hle/service/glue/bgtc.cpp @@ -723,8 +681,6 @@ add_library(core STATIC hle/service/ldn/monitor_service.h hle/service/ldn/sf_monitor_service.cpp hle/service/ldn/sf_monitor_service.h - hle/service/ldn/sf_service.cpp - hle/service/ldn/sf_service.h hle/service/ldn/sf_service_monitor.cpp hle/service/ldn/sf_service_monitor.h hle/service/ldn/system_local_communication_service.cpp @@ -913,8 +869,6 @@ add_library(core STATIC hle/service/olsc/native_handle_holder.h hle/service/olsc/olsc_service_for_application.cpp hle/service/olsc/olsc_service_for_application.h - hle/service/olsc/olsc_service_for_system_service.cpp - hle/service/olsc/olsc_service_for_system_service.h hle/service/olsc/olsc.cpp hle/service/olsc/olsc.h hle/service/olsc/remote_storage_controller.cpp @@ -944,14 +898,8 @@ add_library(core STATIC hle/service/os/process.h hle/service/pcie/pcie.cpp hle/service/pcie/pcie.h - hle/service/pctl/parental_control_service_factory.cpp - hle/service/pctl/parental_control_service_factory.h - hle/service/pctl/parental_control_service.cpp - hle/service/pctl/parental_control_service.h hle/service/pctl/pctl.cpp hle/service/pctl/pctl.h - hle/service/pctl/pctl_results.h - hle/service/pctl/pctl_types.h hle/service/pcv/pcv.cpp hle/service/pcv/pcv.h hle/service/pm/pm.cpp @@ -961,18 +909,8 @@ add_library(core STATIC hle/service/psc/ovln/ovln_types.h hle/service/psc/ovln/receiver_service.cpp hle/service/psc/ovln/receiver_service.h - hle/service/psc/ovln/receiver.cpp - hle/service/psc/ovln/receiver.h hle/service/psc/ovln/sender_service.cpp hle/service/psc/ovln/sender_service.h - hle/service/psc/ovln/sender.cpp - hle/service/psc/ovln/sender.h - hle/service/psc/pm_control.cpp - hle/service/psc/pm_control.h - hle/service/psc/pm_module.cpp - hle/service/psc/pm_module.h - hle/service/psc/pm_service.cpp - hle/service/psc/pm_service.h hle/service/psc/psc.cpp hle/service/psc/psc.h hle/service/psc/time/alarms.cpp @@ -1023,10 +961,6 @@ add_library(core STATIC hle/service/ptm/ts.h hle/service/ro/ro.cpp hle/service/ro/ro.h - hle/service/ro/ro_nro_utils.cpp - hle/service/ro/ro_nro_utils.h - hle/service/ro/ro_results.h - hle/service/ro/ro_types.h hle/service/server_manager.cpp hle/service/server_manager.h hle/service/service.cpp @@ -1055,8 +989,6 @@ add_library(core STATIC hle/service/set/system_settings_server.h hle/service/sm/sm.cpp hle/service/sm/sm.h - hle/service/sm/sm_controller.cpp - hle/service/sm/sm_controller.h hle/service/sockets/bsd.cpp hle/service/sockets/bsd.h hle/service/sockets/nsd.cpp @@ -1222,7 +1154,7 @@ target_link_libraries(core PRIVATE RenderDoc::API ZLIB::ZLIB) -target_link_libraries(core PUBLIC httplib::httplib zstd::zstd) +target_link_libraries(core PUBLIC httplib::httplib zstd::zstd frozen::frozen-headers) if (ENABLE_WEB_SERVICE) target_compile_definitions(core PUBLIC ENABLE_WEB_SERVICE) diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index d68b6bde0d..9b29a7773c 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -75,41 +75,6 @@ class IManagerForSystemService final : public ServiceFramework, "CheckAvailability"}, - {1, D<&IManagerForSystemService::GetAccountId>, "GetAccountId"}, - {2, nullptr, "EnsureIdTokenCacheAsync"}, - {3, D<&IManagerForSystemService::LoadIdTokenCacheDeprecated>, "LoadIdTokenCacheDeprecated"}, // 19.0.0+ - {4, D<&IManagerForSystemService::LoadIdTokenCache>, "LoadIdTokenCache"}, // 19.0.0+ - {100, nullptr, "SetSystemProgramIdentification"}, - {101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+ - {110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+ - {111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+ - {112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0 - {113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+ - {120, nullptr, "GetNintendoAccountId"}, - {121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+ - {130, nullptr, "GetNintendoAccountUserResourceCache"}, - {131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"}, - {132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"}, - {133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+ - {134, nullptr, "RefreshNintendoAccountVerificationUrlCache"}, // 9.0.0+ - {135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+ - {136, nullptr, "GetNintendoAccountUserResourceCache"}, // 19.0.0+ - {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+ - {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+ - {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+ - {143, D<&IManagerForSystemService::GetNetworkServiceLicenseCacheEx>, "GetNetworkServiceLicenseCacheEx"}, // 15.0.0+ - {150, nullptr, "CreateAuthorizationRequest"}, - {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, - {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, - {170, nullptr, "CreateDeviceHistoryRequest"}, // 17.0.0+ - {180, nullptr, "GetRequestForNintendoAccountReauthentication"} // 18.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); } private: @@ -143,6 +108,40 @@ private: R_SUCCEED(); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IManagerForSystemService::CheckAvailability>, "CheckAvailability"}, + FunctionInfo{1, D<&IManagerForSystemService::GetAccountId>, "GetAccountId"}, + FunctionInfo{2, nullptr, "EnsureIdTokenCacheAsync"}, + FunctionInfo{3, D<&IManagerForSystemService::LoadIdTokenCacheDeprecated>, "LoadIdTokenCacheDeprecated", MakeVersionGate({19,0,0})}, + FunctionInfo{4, D<&IManagerForSystemService::LoadIdTokenCache>, "LoadIdTokenCache", MakeVersionGate({19,0,0})}, + FunctionInfo{100, nullptr, "SetSystemProgramIdentification"}, + FunctionInfo{101, nullptr, "RefreshNotificationTokenAsync", MakeVersionGate({7,0,0})}, + FunctionInfo{110, nullptr, "GetServiceEntryRequirementCache", MakeVersionGate({4,0,0})}, + FunctionInfo{111, nullptr, "InvalidateServiceEntryRequirementCache", MakeVersionGate({4,0,0})}, + FunctionInfo{112, nullptr, "InvalidateTokenCache", MakeVersionGate({4,0,0}, {6,2,0})}, + FunctionInfo{113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay", MakeVersionGate({6,1,0})}, + FunctionInfo{120, nullptr, "GetNintendoAccountId"}, + FunctionInfo{121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint", MakeVersionGate({9,0,0})}, + FunctionInfo{130, nullptr, "GetNintendoAccountUserResourceCache"}, + FunctionInfo{131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"}, + FunctionInfo{132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"}, + FunctionInfo{133, nullptr, "GetNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})}, + FunctionInfo{134, nullptr, "RefreshNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})}, + FunctionInfo{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed", MakeVersionGate({9,0,0})}, + FunctionInfo{136, nullptr, "GetNintendoAccountUserResourceCache", MakeVersionGate({19,0,0})}, + FunctionInfo{140, nullptr, "GetNetworkServiceLicenseCache", MakeVersionGate({5,0,0})}, + FunctionInfo{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync", MakeVersionGate({5,0,0})}, + FunctionInfo{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed", MakeVersionGate({5,0,0})}, + FunctionInfo{143, D<&IManagerForSystemService::GetNetworkServiceLicenseCacheEx>, "GetNetworkServiceLicenseCacheEx", MakeVersionGate({15,0,0})}, + FunctionInfo{150, nullptr, "CreateAuthorizationRequest"}, + FunctionInfo{160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, + FunctionInfo{161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, + FunctionInfo{170, nullptr, "CreateDeviceHistoryRequest", MakeVersionGate({17,0,0})}, + FunctionInfo{180, nullptr, "GetRequestForNintendoAccountReauthentication", MakeVersionGate({18,0,0})} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } Common::UUID account_id; }; @@ -151,25 +150,25 @@ class IFloatingRegistrationRequest final : public ServiceFramework FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; @@ -177,62 +176,6 @@ class IAdministrator final : public ServiceFramework { public: explicit IAdministrator(Core::System& system_, Common::UUID) : ServiceFramework{system_, "IAdministrator"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "CheckAvailability"}, - {1, nullptr, "GetAccountId"}, - {2, nullptr, "EnsureIdTokenCacheAsync"}, - {3, nullptr, "LoadIdTokenCache"}, - {100, nullptr, "SetSystemProgramIdentification"}, - {101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+ - {110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+ - {111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+ - {112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0 - {113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+ - {120, nullptr, "GetNintendoAccountId"}, - {121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+ - {130, nullptr, "GetNintendoAccountUserResourceCache"}, - {131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"}, - {132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"}, - {133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+ - {134, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsync"}, // 9.0.0+ - {135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+ - {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+ - {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+ - {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+ - {143, nullptr, "GetNetworkServiceLicenseCacheEx"}, - {150, nullptr, "CreateAuthorizationRequest"}, - {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, - {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, - {170, nullptr, "CreateDeviceHistoryRequest"}, // 17.0.0+ - {180, nullptr, "GetRequestForNintendoAccountReauthentication"}, // 18.0.0+ - {200, nullptr, "IsRegistered"}, - {201, nullptr, "RegisterAsync"}, - {202, nullptr, "UnregisterAsync"}, - {203, nullptr, "DeleteRegistrationInfoLocally"}, - {220, nullptr, "SynchronizeProfileAsync"}, - {221, nullptr, "UploadProfileAsync"}, - {222, nullptr, "SynchronizaProfileAsyncIfSecondsElapsed"}, - {250, &IAdministrator::IsLinkedWithNintendoAccount, "IsLinkedWithNintendoAccount"}, - {251, nullptr, "CreateProcedureToLinkWithNintendoAccount"}, - {252, nullptr, "ResumeProcedureToLinkWithNintendoAccount"}, - {255, nullptr, "CreateProcedureToUpdateLinkageStateOfNintendoAccount"}, - {256, nullptr, "ResumeProcedureToUpdateLinkageStateOfNintendoAccount"}, - {260, nullptr, "CreateProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+ - {261, nullptr, "ResumeProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+ - {280, nullptr, "ProxyProcedureToAcquireApplicationAuthorizationForNintendoAccount"}, - {290, nullptr, "GetRequestForNintendoAccountUserResourceView"}, // 8.0.0+ - {300, nullptr, "TryRecoverNintendoAccountUserStateAsync"}, // 6.0.0+ - {400, nullptr, "IsServiceEntryRequirementCacheRefreshRequiredForOnlinePlay"}, // 6.1.0+ - {401, nullptr, "RefreshServiceEntryRequirementCacheForOnlinePlayAsync"}, // 6.1.0+ - {900, nullptr, "GetAuthenticationInfoForWin"}, // 9.0.0+ - {901, nullptr, "ImportAsyncForWin"}, // 9.0.0+ - {997, nullptr, "DebugUnlinkNintendoAccountAsync"}, - {998, nullptr, "DebugSetAvailabilityErrorDetail"}, - }; - // clang-format on - - RegisterHandlers(functions); } private: @@ -241,42 +184,97 @@ private: rb.Push(ResultSuccess); rb.Push(false); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "CheckAvailability"}, + FunctionInfo{1, nullptr, "GetAccountId"}, + FunctionInfo{2, nullptr, "EnsureIdTokenCacheAsync"}, + FunctionInfo{3, nullptr, "LoadIdTokenCache"}, + FunctionInfo{100, nullptr, "SetSystemProgramIdentification"}, + FunctionInfo{101, nullptr, "RefreshNotificationTokenAsync", MakeVersionGate({7,0,0})}, + FunctionInfo{110, nullptr, "GetServiceEntryRequirementCache", MakeVersionGate({4,0,0})}, + FunctionInfo{111, nullptr, "InvalidateServiceEntryRequirementCache", MakeVersionGate({4,0,0})}, + FunctionInfo{112, nullptr, "InvalidateTokenCache", MakeVersionGate({4,0,0}, {6,2,0})}, + FunctionInfo{113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay", MakeVersionGate({6,1,0})}, + FunctionInfo{120, nullptr, "GetNintendoAccountId"}, + FunctionInfo{121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint", MakeVersionGate({9,0,0})}, + FunctionInfo{130, nullptr, "GetNintendoAccountUserResourceCache"}, + FunctionInfo{131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"}, + FunctionInfo{132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"}, + FunctionInfo{133, nullptr, "GetNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})}, + FunctionInfo{134, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsync", MakeVersionGate({9,0,0})}, + FunctionInfo{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed", MakeVersionGate({9,0,0})}, + FunctionInfo{140, nullptr, "GetNetworkServiceLicenseCache", MakeVersionGate({5,0,0})}, + FunctionInfo{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync", MakeVersionGate({5,0,0})}, + FunctionInfo{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed", MakeVersionGate({5,0,0})}, + FunctionInfo{143, nullptr, "GetNetworkServiceLicenseCacheEx"}, + FunctionInfo{150, nullptr, "CreateAuthorizationRequest"}, + FunctionInfo{160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, + FunctionInfo{161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, + FunctionInfo{170, nullptr, "CreateDeviceHistoryRequest", MakeVersionGate({17,0,0})}, + FunctionInfo{180, nullptr, "GetRequestForNintendoAccountReauthentication", MakeVersionGate({18,0,0})}, + FunctionInfo{200, nullptr, "IsRegistered"}, + FunctionInfo{201, nullptr, "RegisterAsync"}, + FunctionInfo{202, nullptr, "UnregisterAsync"}, + FunctionInfo{203, nullptr, "DeleteRegistrationInfoLocally"}, + FunctionInfo{220, nullptr, "SynchronizeProfileAsync"}, + FunctionInfo{221, nullptr, "UploadProfileAsync"}, + FunctionInfo{222, nullptr, "SynchronizaProfileAsyncIfSecondsElapsed"}, + FunctionInfo{250, &IAdministrator::IsLinkedWithNintendoAccount, "IsLinkedWithNintendoAccount"}, + FunctionInfo{251, nullptr, "CreateProcedureToLinkWithNintendoAccount"}, + FunctionInfo{252, nullptr, "ResumeProcedureToLinkWithNintendoAccount"}, + FunctionInfo{255, nullptr, "CreateProcedureToUpdateLinkageStateOfNintendoAccount"}, + FunctionInfo{256, nullptr, "ResumeProcedureToUpdateLinkageStateOfNintendoAccount"}, + FunctionInfo{260, nullptr, "CreateProcedureToLinkNnidWithNintendoAccount", MakeVersionGate({3,0,0})}, + FunctionInfo{261, nullptr, "ResumeProcedureToLinkNnidWithNintendoAccount", MakeVersionGate({3,0,0})}, + FunctionInfo{280, nullptr, "ProxyProcedureToAcquireApplicationAuthorizationForNintendoAccount"}, + FunctionInfo{290, nullptr, "GetRequestForNintendoAccountUserResourceView", MakeVersionGate({8,0,0})}, + FunctionInfo{300, nullptr, "TryRecoverNintendoAccountUserStateAsync", MakeVersionGate({6,0,0})}, + FunctionInfo{400, nullptr, "IsServiceEntryRequirementCacheRefreshRequiredForOnlinePlay", MakeVersionGate({6,1,0})}, + FunctionInfo{401, nullptr, "RefreshServiceEntryRequirementCacheForOnlinePlayAsync", MakeVersionGate({6,1,0})}, + FunctionInfo{900, nullptr, "GetAuthenticationInfoForWin", MakeVersionGate({9,0,0})}, + FunctionInfo{901, nullptr, "ImportAsyncForWin", MakeVersionGate({9,0,0})}, + FunctionInfo{997, nullptr, "DebugUnlinkNintendoAccountAsync"}, + FunctionInfo{998, nullptr, "DebugSetAvailabilityErrorDetail"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } }; class IAuthorizationRequest final : public ServiceFramework { public: explicit IAuthorizationRequest(Core::System& system_, Common::UUID) : ServiceFramework{system_, "IAuthorizationRequest"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetSessionId"}, - {10, nullptr, "InvokeWithoutInteractionAsync"}, - {19, nullptr, "IsAuthorized"}, - {20, nullptr, "GetAuthorizationCode"}, - {21, nullptr, "GetIdToken"}, - {22, nullptr, "GetState"}, - }; - // clang-format on + } - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetSessionId"}, + FunctionInfo{10, nullptr, "InvokeWithoutInteractionAsync"}, + FunctionInfo{19, nullptr, "IsAuthorized"}, + FunctionInfo{20, nullptr, "GetAuthorizationCode"}, + FunctionInfo{21, nullptr, "GetIdToken"}, + FunctionInfo{22, nullptr, "GetState"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IOAuthProcedure final : public ServiceFramework { public: explicit IOAuthProcedure(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IOAuthProcedure"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "PrepareAsync"}, - {1, nullptr, "GetRequest"}, - {2, nullptr, "ApplyResponse"}, - {3, nullptr, "ApplyResponseAsync"}, - {10, nullptr, "Suspend"}, - }; - // clang-format on + : ServiceFramework{system_, "IOAuthProcedure"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "PrepareAsync"}, + FunctionInfo{1, nullptr, "GetRequest"}, + FunctionInfo{2, nullptr, "ApplyResponse"}, + FunctionInfo{3, nullptr, "ApplyResponseAsync"}, + FunctionInfo{10, nullptr, "Suspend"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; @@ -284,96 +282,69 @@ public: class IOAuthProcedureForExternalNsa final : public ServiceFramework { public: explicit IOAuthProcedureForExternalNsa(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IOAuthProcedureForExternalNsa"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "PrepareAsync"}, - {1, nullptr, "GetRequest"}, - {2, nullptr, "ApplyResponse"}, - {3, nullptr, "ApplyResponseAsync"}, - {10, nullptr, "Suspend"}, - {100, nullptr, "GetAccountId"}, - {101, nullptr, "GetLinkedNintendoAccountId"}, - {102, nullptr, "GetNickname"}, - {103, nullptr, "GetProfileImage"}, - {104, nullptr, "GetProfileLargeImage"} // 18.0.0+ - }; - // clang-format on + : ServiceFramework{system_, "IOAuthProcedureForExternalNsa"} + {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "PrepareAsync"}, + FunctionInfo{1, nullptr, "GetRequest"}, + FunctionInfo{2, nullptr, "ApplyResponse"}, + FunctionInfo{3, nullptr, "ApplyResponseAsync"}, + FunctionInfo{10, nullptr, "Suspend"}, + FunctionInfo{100, nullptr, "GetAccountId"}, + FunctionInfo{101, nullptr, "GetLinkedNintendoAccountId"}, + FunctionInfo{102, nullptr, "GetNickname"}, + FunctionInfo{103, nullptr, "GetProfileImage"}, + FunctionInfo{104, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; -class IOAuthProcedureForNintendoAccountLinkage final - : public ServiceFramework { +class IOAuthProcedureForNintendoAccountLinkage final : public ServiceFramework { public: explicit IOAuthProcedureForNintendoAccountLinkage(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IOAuthProcedureForNintendoAccountLinkage"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "PrepareAsync"}, - {1, nullptr, "GetRequest"}, - {2, nullptr, "ApplyResponse"}, - {3, nullptr, "ApplyResponseAsync"}, - {10, nullptr, "Suspend"}, - {100, nullptr, "GetRequestWithTheme"}, - {101, nullptr, "IsNetworkServiceAccountReplaced"}, - {199, nullptr, "GetUrlForIntroductionOfExtraMembership"}, // 2.0.0 - 5.1.0 - {200, nullptr, "ApplyAsyncWithAuthorizedToken"}, - {210, nullptr, "IsProfileAvailable"}, // 17.0.0+ - {220, nullptr, "RegisterUserAsyncWithoutProfile"}, // 17.0.0+ - {221, nullptr, "RegisterUserWithProfileAsync"}, // 17.0.0+ - {230, nullptr, "RegisterUserWithLargeImageProfileAsync"}, // 18.0.0+ - }; - // clang-format on + : ServiceFramework{system_, "IOAuthProcedureForNintendoAccountLinkage"} + {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "PrepareAsync"}, + FunctionInfo{1, nullptr, "GetRequest"}, + FunctionInfo{2, nullptr, "ApplyResponse"}, + FunctionInfo{3, nullptr, "ApplyResponseAsync"}, + FunctionInfo{10, nullptr, "Suspend"}, + FunctionInfo{100, nullptr, "GetRequestWithTheme"}, + FunctionInfo{101, nullptr, "IsNetworkServiceAccountReplaced"}, + FunctionInfo{199, nullptr, "GetUrlForIntroductionOfExtraMembership", MakeVersionGate({2,0,0}, {5,1,0})}, + FunctionInfo{200, nullptr, "ApplyAsyncWithAuthorizedToken"}, + FunctionInfo{210, nullptr, "IsProfileAvailable", MakeVersionGate({17,0,0})}, + FunctionInfo{220, nullptr, "RegisterUserAsyncWithoutProfile", MakeVersionGate({17,0,0})}, + FunctionInfo{221, nullptr, "RegisterUserWithProfileAsync", MakeVersionGate({17,0,0})}, + FunctionInfo{230, nullptr, "RegisterUserWithLargeImageProfileAsync", MakeVersionGate({18,0,0})} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class INotifier final : public ServiceFramework { public: explicit INotifier(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "INotifier"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetSystemEvent"}, - }; - // clang-format on + : ServiceFramework{system_, "INotifier"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetSystemEvent"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IProfileCommon : public ServiceFramework { public: - explicit IProfileCommon(Core::System& system_, const char* name, bool editor_commands, - Common::UUID user_id_, ProfileManager& profile_manager_) + explicit IProfileCommon(Core::System& system_, const char* name, bool editor_commands, Common::UUID user_id_, ProfileManager& profile_manager_) : ServiceFramework{system_, name}, profile_manager{profile_manager_}, user_id{user_id_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IProfileCommon::Get, "Get"}, - {1, &IProfileCommon::GetBase, "GetBase"}, - {10, &IProfileCommon::GetImageSize, "GetImageSize"}, - {11, &IProfileCommon::LoadImage, "LoadImage"}, - {20, &IProfileCommon::Unknown20, "Unknown20"}, - {21, &IProfileCommon::Unknown21, "Unknown21"}, - {30, &IProfileCommon::Unknown30, "Unknown30"} - }; - // clang-format on - RegisterHandlers(functions); - - if (editor_commands) { - // clang-format off - static const FunctionInfo editor_functions[] = { - {100, &IProfileCommon::Store, "Store"}, - {101, &IProfileCommon::StoreWithImage, "StoreWithImage"}, - {110, &IProfileCommon::Unknown110, "Unknown110"} - }; - // clang-format on - - RegisterHandlers(editor_functions); - } } protected: @@ -600,6 +571,22 @@ protected: rb.Push(ResultSuccess); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IProfileCommon::Get, "Get"}, + FunctionInfo{1, &IProfileCommon::GetBase, "GetBase"}, + FunctionInfo{10, &IProfileCommon::GetImageSize, "GetImageSize"}, + FunctionInfo{11, &IProfileCommon::LoadImage, "LoadImage"}, + FunctionInfo{20, &IProfileCommon::Unknown20, "Unknown20"}, + FunctionInfo{21, &IProfileCommon::Unknown21, "Unknown21"}, + FunctionInfo{30, &IProfileCommon::Unknown30, "Unknown30"}, + // Editor commands + FunctionInfo{100, &IProfileCommon::Store, "Store"}, + FunctionInfo{101, &IProfileCommon::StoreWithImage, "StoreWithImage"}, + FunctionInfo{110, &IProfileCommon::Unknown110, "Unknown110"} + ); ProfileManager& profile_manager; Common::UUID user_id{}; ///< The user id this profile refers to. }; @@ -621,35 +608,33 @@ public: class ISessionObject final : public ServiceFramework { public: explicit ISessionObject(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "ISessionObject"} { - // clang-format off - static const FunctionInfo functions[] = { - {999, nullptr, "Dummy"}, - }; - // clang-format on + : ServiceFramework{system_, "ISessionObject"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{999, nullptr, "Dummy"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IGuestLoginRequest final : public ServiceFramework { public: explicit IGuestLoginRequest(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IGuestLoginRequest"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetSessionId"}, - {11, nullptr, "Unknown"}, // 1.0.0 - 2.3.0 (the name is blank on Switchbrew) - {12, nullptr, "GetAccountId"}, - {13, nullptr, "GetLinkedNintendoAccountId"}, - {14, nullptr, "GetNickname"}, - {15, nullptr, "GetProfileImage"}, - {16, nullptr, "GetProfileLargeImage"}, // 18.0.0+ - {21, nullptr, "LoadIdTokenCache"}, // 3.0.0+ - }; - // clang-format on + : ServiceFramework{system_, "IGuestLoginRequest"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetSessionId"}, + FunctionInfo{11, nullptr, "Unknown", MakeVersionGate({1,0,0}, {2,3,0})}, // the name is blank on Switchbrew + FunctionInfo{12, nullptr, "GetAccountId"}, + FunctionInfo{13, nullptr, "GetLinkedNintendoAccountId"}, + FunctionInfo{14, nullptr, "GetNickname"}, + FunctionInfo{15, nullptr, "GetProfileImage"}, + FunctionInfo{16, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})}, + FunctionInfo{21, nullptr, "LoadIdTokenCache", MakeVersionGate({3,0,0})} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; @@ -686,23 +671,10 @@ public: const std::shared_ptr& profile_manager_) : ServiceFramework{system_, "IManagerForApplication"}, ensure_token_id{std::make_shared(system)}, - profile_manager{profile_manager_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IManagerForApplication::CheckAvailability, "CheckAvailability"}, - {1, &IManagerForApplication::GetAccountId, "GetAccountId"}, - {2, &IManagerForApplication::EnsureIdTokenCacheAsync, "EnsureIdTokenCacheAsync"}, - {3, &IManagerForApplication::LoadIdTokenCacheDeprecated, "LoadIdTokenCacheDeprecated"}, - {4, &IManagerForApplication::LoadIdTokenCache, "LoadIdTokenCache"}, - {130, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCacheForApplication"}, - {136, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCache"}, // 19.0.0+ - {150, nullptr, "CreateAuthorizationRequest"}, - {160, &IManagerForApplication::StoreOpenContext, "StoreOpenContext"}, - {170, nullptr, "LoadNetworkServiceLicenseKindAsync"}, - }; - // clang-format on + profile_manager{profile_manager_} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -772,6 +744,18 @@ private: rb.Push(ResultSuccess); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IManagerForApplication::CheckAvailability, "CheckAvailability"}, + FunctionInfo{1, &IManagerForApplication::GetAccountId, "GetAccountId"}, + FunctionInfo{2, &IManagerForApplication::EnsureIdTokenCacheAsync, "EnsureIdTokenCacheAsync"}, + FunctionInfo{3, &IManagerForApplication::LoadIdTokenCacheDeprecated, "LoadIdTokenCacheDeprecated"}, + FunctionInfo{4, &IManagerForApplication::LoadIdTokenCache, "LoadIdTokenCache"}, + FunctionInfo{130, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCacheForApplication"}, + FunctionInfo{136, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCache", MakeVersionGate({19,0,0})}, + FunctionInfo{150, nullptr, "CreateAuthorizationRequest"}, + FunctionInfo{160, &IManagerForApplication::StoreOpenContext, "StoreOpenContext"}, + FunctionInfo{170, nullptr, "LoadNetworkServiceLicenseKindAsync"} + ); std::shared_ptr ensure_token_id{}; std::shared_ptr profile_manager; }; @@ -781,18 +765,17 @@ class IAsyncNetworkServiceLicenseKindContext final : public ServiceFramework { public: explicit IAsyncNetworkServiceLicenseKindContext(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IAsyncNetworkServiceLicenseKindContext"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetSystemEvent"}, - {1, nullptr, "Cancel"}, - {2, nullptr, "HasDone"}, - {3, nullptr, "GetResult"}, - {4, nullptr, "GetNetworkServiceLicenseKind"}, - }; - // clang-format on + : ServiceFramework{system_, "IAsyncNetworkServiceLicenseKindContext"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetSystemEvent"}, + FunctionInfo{1, nullptr, "Cancel"}, + FunctionInfo{2, nullptr, "HasDone"}, + FunctionInfo{3, nullptr, "GetResult"}, + FunctionInfo{4, nullptr, "GetNetworkServiceLicenseKind"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; @@ -801,56 +784,54 @@ class IOAuthProcedureForUserRegistration final : public ServiceFramework { public: explicit IOAuthProcedureForUserRegistration(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IOAuthProcedureForUserRegistration"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "PrepareAsync"}, - {1, nullptr, "GetRequest"}, - {2, nullptr, "ApplyResponse"}, - {3, nullptr, "ApplyResponseAsync"}, - {10, nullptr, "Suspend"}, - {100, nullptr, "GetAccountId"}, - {101, nullptr, "GetLinkedNintendoAccountId"}, - {102, nullptr, "GetNickname"}, - {103, nullptr, "GetProfileImage"}, - {104, nullptr, "GetProfileLargeImage"}, // 18.0.0+ - {110, nullptr, "RegisterUserAsync"}, - {111, nullptr, "GetUid"}, - {200, nullptr, "ApplyResponseForUserCreationAsync"}, // 17.0.0+ - {205, nullptr, "SuspendAfterApplyResponse"}, // 17.0.0+ - {210, nullptr, "IsProfileAvailable"}, // 17.0.0+ - {220, nullptr, "RegisterUserAsyncWithoutProfile"}, // 17.0.0+ - {221, nullptr, "RegisterUserWithProfileAsync"}, // 17.0.0+ - {230, nullptr, "RegisterUserWithLargeImageProfileAsync"} // 18.0.0+ - }; - // clang-format on + : ServiceFramework{system_, "IOAuthProcedureForUserRegistration"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "PrepareAsync"}, + FunctionInfo{1, nullptr, "GetRequest"}, + FunctionInfo{2, nullptr, "ApplyResponse"}, + FunctionInfo{3, nullptr, "ApplyResponseAsync"}, + FunctionInfo{10, nullptr, "Suspend"}, + FunctionInfo{100, nullptr, "GetAccountId"}, + FunctionInfo{101, nullptr, "GetLinkedNintendoAccountId"}, + FunctionInfo{102, nullptr, "GetNickname"}, + FunctionInfo{103, nullptr, "GetProfileImage"}, + FunctionInfo{104, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})}, + FunctionInfo{110, nullptr, "RegisterUserAsync"}, + FunctionInfo{111, nullptr, "GetUid"}, + FunctionInfo{200, nullptr, "ApplyResponseForUserCreationAsync", MakeVersionGate({17,0,0})}, + FunctionInfo{205, nullptr, "SuspendAfterApplyResponse", MakeVersionGate({17,0,0})}, + FunctionInfo{210, nullptr, "IsProfileAvailable", MakeVersionGate({17,0,0})}, + FunctionInfo{220, nullptr, "RegisterUserAsyncWithoutProfile", MakeVersionGate({17,0,0})}, + FunctionInfo{221, nullptr, "RegisterUserWithProfileAsync", MakeVersionGate({17,0,0})}, + FunctionInfo{230, nullptr, "RegisterUserWithLargeImageProfileAsync", MakeVersionGate({18,0,0})} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class DAUTH_O final : public ServiceFramework { public: - explicit DAUTH_O(Core::System& system_, Common::UUID) : ServiceFramework{system_, "dauth:o"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "EnsureAuthenticationTokenCacheAsync"}, - {1, nullptr, "LoadAuthenticationTokenCache"}, - {2, nullptr, "InvalidateAuthenticationTokenCache"}, - {3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"}, - {10, nullptr, "EnsureEdgeTokenCacheAsync"}, - {11, nullptr, "LoadEdgeTokenCache"}, - {12, nullptr, "InvalidateEdgeTokenCache"}, - {13, nullptr, "IsEdgeTokenCacheAvailable"}, - {20, nullptr, "EnsureApplicationAuthenticationCacheAsync"}, - {21, nullptr, "LoadApplicationAuthenticationTokenCache"}, - {22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"}, - {23, nullptr, "IsApplicationAuthenticationCacheAvailable"}, - {24, nullptr, "InvalidateApplicationAuthenticationCache"}, - }; - // clang-format on + explicit DAUTH_O(Core::System& system_, Common::UUID) : ServiceFramework{system_, "dauth:o"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "EnsureAuthenticationTokenCacheAsync"}, + FunctionInfo{1, nullptr, "LoadAuthenticationTokenCache"}, + FunctionInfo{2, nullptr, "InvalidateAuthenticationTokenCache"}, + FunctionInfo{3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"}, + FunctionInfo{10, nullptr, "EnsureEdgeTokenCacheAsync"}, + FunctionInfo{11, nullptr, "LoadEdgeTokenCache"}, + FunctionInfo{12, nullptr, "InvalidateEdgeTokenCache"}, + FunctionInfo{13, nullptr, "IsEdgeTokenCacheAvailable"}, + FunctionInfo{20, nullptr, "EnsureApplicationAuthenticationCacheAsync"}, + FunctionInfo{21, nullptr, "LoadApplicationAuthenticationTokenCache"}, + FunctionInfo{22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"}, + FunctionInfo{23, nullptr, "IsApplicationAuthenticationCacheAvailable"}, + FunctionInfo{24, nullptr, "InvalidateApplicationAuthenticationCache"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; @@ -858,781 +839,809 @@ public: class IAsyncResult final : public ServiceFramework { public: explicit IAsyncResult(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IAsyncResult"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetResult"}, - {1, nullptr, "Cancel"}, - {2, nullptr, "IsAvailable"}, - {3, nullptr, "GetSystemEvent"}, - }; - // clang-format on + : ServiceFramework{system_, "IAsyncResult"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetResult"}, + FunctionInfo{1, nullptr, "Cancel"}, + FunctionInfo{2, nullptr, "IsAvailable"}, + FunctionInfo{3, nullptr, "GetSystemEvent"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; -void Module::Interface::GetUserCount(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(static_cast(profile_manager->GetUserCount())); -} +class Module final { +public: + class Interface : public ServiceFramework { + public: + explicit Interface(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_, const char* name) + : ServiceFramework{system_, name} + , module{std::move(module_)} + , profile_manager{std::move(profile_manager_)} + {} + ~Interface() override = default; -void Module::Interface::GetUserExistence(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); - LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString()); - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(profile_manager->UserExists(user_id)); -} - -void Module::Interface::ListAllUsers(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - ctx.WriteBuffer(profile_manager->GetAllUsers()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); -} - -void Module::Interface::ListOpenUsers(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - ctx.WriteBuffer(profile_manager->GetOpenUsers()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); -} - -void Module::Interface::GetLastOpenedUser(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - IPC::ResponseBuilder rb{ctx, 6}; - rb.Push(ResultSuccess); - rb.PushRaw(profile_manager->GetLastOpenedUser()); -} - -void Module::Interface::GetProfile(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); - LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString()); - - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, user_id, *profile_manager); -} - -void Module::Interface::IsUserRegistrationRequestPermitted(HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(profile_manager->CanSystemRegisterUser()); -} - -void Module::Interface::InitializeApplicationInfo(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(InitializeApplicationInfoBase()); -} - -void Module::Interface::InitializeApplicationInfoRestricted(HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(Partial implementation) called"); - - // TODO(ogniK): We require checking if the user actually owns the title and what not. As of - // currently, we assume the user owns the title. InitializeApplicationInfoBase SHOULD be called - // first then we do extra checks if the game is a digital copy. - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(InitializeApplicationInfoBase()); -} - -Result Module::Interface::InitializeApplicationInfoBase() { - if (application_info) { - LOG_ERROR(Service_ACC, "Application already initialized"); - return Account::ResultApplicationInfoAlreadyInitialized; - } - - // TODO(ogniK): This should be changed to reflect the target process for when we have multiple - // processes emulated. As we don't actually have pid support we should assume we're just using - // our own process - Glue::ApplicationLaunchProperty launch_property{}; - const auto result = system.GetARPManager().GetLaunchProperty( - &launch_property, system.GetApplicationProcessProgramID()); - - if (result != ResultSuccess) { - LOG_ERROR(Service_ACC, "Failed to get launch property"); - return Account::ResultInvalidApplication; - } - - switch (launch_property.base_game_storage_id) { - case FileSys::StorageId::GameCard: - application_info.application_type = ApplicationType::GameCard; - break; - case FileSys::StorageId::Host: - case FileSys::StorageId::NandSystem: - case FileSys::StorageId::NandUser: - case FileSys::StorageId::SdCard: - case FileSys::StorageId::None: // Yuzu specific, differs from hardware - application_info.application_type = ApplicationType::Digital; - break; - default: - LOG_ERROR(Service_ACC, "Invalid game storage ID! storage_id={}", - launch_property.base_game_storage_id); - return Account::ResultInvalidApplication; - } - - LOG_WARNING(Service_ACC, "ApplicationInfo init required"); - // TODO(ogniK): Actual initialization here - - return ResultSuccess; -} - -void Module::Interface::GetBaasAccountManagerForApplication(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, profile_manager); -} - -void Module::Interface::IsUserAccountSwitchLocked(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - FileSys::NACP nacp; - const auto res = system.GetAppLoader().ReadControlData(nacp); - - bool is_locked = false; - - if (res != Loader::ResultStatus::Success) { - const FileSys::PatchManager pm{system.GetApplicationProcessProgramID(), - system.GetFileSystemController(), - system.GetContentProvider()}; - const auto nacp_unique = pm.GetControlMetadata().first; - - if (nacp_unique != nullptr) { - is_locked = nacp_unique->GetUserAccountSwitchLock(); - } else { - LOG_ERROR(Service_ACC, "nacp_unique is null!"); + void GetUserCount(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(static_cast(profile_manager->GetUserCount())); } - } else { - is_locked = nacp.GetUserAccountSwitchLock(); - } - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(is_locked); -} + void GetUserExistence(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); + LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString()); -void Module::Interface::InitializeApplicationInfoV2(HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(profile_manager->UserExists(user_id)); + } - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); -} + void ListAllUsers(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + ctx.WriteBuffer(profile_manager->GetAllUsers()); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); + } -void Module::Interface::BeginUserRegistration(HLERequestContext& ctx) { - const auto user_id = Common::UUID::MakeRandom(); - profile_manager->CreateNewUser(user_id, "Eden"); + void ListOpenUsers(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + ctx.WriteBuffer(profile_manager->GetOpenUsers()); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); + } - LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); + void GetLastOpenedUser(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + IPC::ResponseBuilder rb{ctx, 6}; + rb.Push(ResultSuccess); + rb.PushRaw(profile_manager->GetLastOpenedUser()); + } - IPC::ResponseBuilder rb{ctx, 6}; - rb.Push(ResultSuccess); - rb.PushRaw(user_id); -} + void GetProfile(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); + LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString()); -void Module::Interface::CompleteUserRegistration(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, user_id, *profile_manager); + } - LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); + void IsUserRegistrationRequestPermitted(HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(profile_manager->CanSystemRegisterUser()); + } - profile_manager->WriteUserSaveFile(); + void InitializeApplicationInfo(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(InitializeApplicationInfoBase()); + } - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); -} + void InitializeApplicationInfoRestricted(HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(Partial implementation) called"); -void Module::Interface::DeleteUser(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); - LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); - if (!profile_manager->RemoveUser(user_id)) { - LOG_ERROR(Service_ACC, "Failed to delete user with uuid={}", user_id.RawString()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(1U); - return; - } - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); -} + // TODO(ogniK): We require checking if the user actually owns the title and what not. As of + // currently, we assume the user owns the title. InitializeApplicationInfoBase SHOULD be called + // first then we do extra checks if the game is a digital copy. -void Module::Interface::SetUserPosition(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(InitializeApplicationInfoBase()); + } - u64 position = rp.Pop(); - Common::UUID user_id = rp.PopRaw(); + void GetBaasAccountManagerForApplication(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, profile_manager); + } - LOG_DEBUG(Service_ACC, "called, position={} user_id={}", position, user_id.FormattedString()); + void IsUserAccountSwitchLocked(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + FileSys::NACP nacp; + const auto res = system.GetAppLoader().ReadControlData(nacp); - profile_manager->SetUserPosition(position, user_id); + bool is_locked = false; - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); -} + if (res != Loader::ResultStatus::Success) { + const FileSys::PatchManager pm{system.GetApplicationProcessProgramID(), + system.GetFileSystemController(), + system.GetContentProvider()}; + const auto nacp_unique = pm.GetControlMetadata().first; -void Module::Interface::GetProfileEditor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); + if (nacp_unique != nullptr) { + is_locked = nacp_unique->GetUserAccountSwitchLock(); + } else { + LOG_ERROR(Service_ACC, "nacp_unique is null!"); + } + } else { + is_locked = nacp.GetUserAccountSwitchLock(); + } - LOG_DEBUG(Service_ACC, "called, user_id=0x{}", user_id.RawString()); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(is_locked); + } - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, user_id, *profile_manager); -} + void InitializeApplicationInfoV2(HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); -void Module::Interface::GetBaasAccountAdministrator(HLERequestContext &ctx) { - IPC::RequestParser rp{ctx}; - const auto uuid = rp.PopRaw(); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); + } - LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString()); + void BeginUserRegistration(HLERequestContext& ctx) { + const auto user_id = Common::UUID::MakeRandom(); + profile_manager->CreateNewUser(user_id, "Eden"); - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, uuid); -} + LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); -void Module::Interface::ListQualifiedUsers(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); + IPC::ResponseBuilder rb{ctx, 6}; + rb.Push(ResultSuccess); + rb.PushRaw(user_id); + } - // All users should be qualified. We don't actually have parental control or anything to do with - // nintendo online currently. We're just going to assume the user running the game has access to - // the game regardless of parental control settings. - ctx.WriteBuffer(profile_manager->GetAllUsers()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); -} + void CompleteUserRegistration(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); -void Module::Interface::ListOpenContextStoredUsers(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); + LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); - ctx.WriteBuffer(profile_manager->GetStoredOpenedUsers()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); -} + profile_manager->WriteUserSaveFile(); -void Module::Interface::StoreSaveDataThumbnailApplication(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto uuid = rp.PopRaw(); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); + } - LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}", uuid.RawString()); + void DeleteUser(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); + LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); + if (!profile_manager->RemoveUser(user_id)) { + LOG_ERROR(Service_ACC, "Failed to delete user with uuid={}", user_id.RawString()); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(1U); + return; + } + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); + } - // TODO(ogniK): Check if application ID is zero on acc initialize. As we don't have a reliable - // way of confirming things like the TID, we're going to assume a non zero value for the time - // being. - constexpr u64 tid{1}; - StoreSaveDataThumbnail(ctx, uuid, tid); -} + void SetUserPosition(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; -void Module::Interface::GetBaasAccountManagerForSystemService(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto uuid = rp.PopRaw(); + u64 position = rp.Pop(); + Common::UUID user_id = rp.PopRaw(); - LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString()); + LOG_DEBUG(Service_ACC, "called, position={} user_id={}", position, user_id.FormattedString()); - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, uuid); -} + profile_manager->SetUserPosition(position, user_id); -void Module::Interface::StoreSaveDataThumbnailSystem(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto uuid = rp.PopRaw(); - const auto tid = rp.Pop(); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); + } - LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}, tid={:016X}", uuid.RawString(), tid); - StoreSaveDataThumbnail(ctx, uuid, tid); -} + void GetProfileEditor(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); -void Module::Interface::GetPinCodeLength(HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); + LOG_DEBUG(Service_ACC, "called, user_id=0x{}", user_id.RawString()); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(0); -} + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, user_id, *profile_manager); + } -void Module::Interface::StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid, - const u64 tid) { - IPC::ResponseBuilder rb{ctx, 2}; + void GetBaasAccountAdministrator(HLERequestContext &ctx) { + IPC::RequestParser rp{ctx}; + const auto uuid = rp.PopRaw(); - if (tid == 0) { - LOG_ERROR(Service_ACC, "TitleID is not valid!"); - rb.Push(Account::ResultInvalidApplication); - return; - } + LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString()); - if (uuid.IsInvalid()) { - LOG_ERROR(Service_ACC, "User ID is not valid!"); - rb.Push(Account::ResultInvalidUserId); - return; - } - const auto thumbnail_size = ctx.GetReadBufferSize(); - if (thumbnail_size != THUMBNAIL_SIZE) { - LOG_ERROR(Service_ACC, "Buffer size is empty! size={:X} expecting {:X}", thumbnail_size, - THUMBNAIL_SIZE); - rb.Push(Account::ResultInvalidArrayLength); - return; - } + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, uuid); + } - // TODO(ogniK): Construct save data thumbnail - rb.Push(ResultSuccess); -} + void ListQualifiedUsers(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); -void Module::Interface::TrySelectUserWithoutInteractionDeprecated(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - // A u8 is passed into this function which we can safely ignore. It's to determine if we have - // access to use the network or not by the looks of it - IPC::ResponseBuilder rb{ctx, 6}; - if (profile_manager->GetUserCount() != 1) { - rb.Push(ResultSuccess); - rb.PushRaw(Common::InvalidUUID); - return; - } + // All users should be qualified. We don't actually have parental control or anything to do with + // nintendo online currently. We're just going to assume the user running the game has access to + // the game regardless of parental control settings. + ctx.WriteBuffer(profile_manager->GetAllUsers()); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); + } - const auto user_list = profile_manager->GetAllUsers(); - if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) { - rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code - rb.PushRaw(Common::InvalidUUID); - return; - } + void ListOpenContextStoredUsers(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); - // Select the first user we have - rb.Push(ResultSuccess); - rb.PushRaw(profile_manager->GetUser(0)->uuid); -} + ctx.WriteBuffer(profile_manager->GetStoredOpenedUsers()); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); + } -void Module::Interface::TrySelectUserWithoutInteraction(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - // A u8 is passed into this function which we can safely ignore. It's to determine if we have - // access to use the network or not by the looks of it - IPC::ResponseBuilder rb{ctx, 6}; - if (profile_manager->GetUserCount() != 1) { - rb.Push(ResultSuccess); - rb.PushRaw(Common::InvalidUUID); - return; - } + void StoreSaveDataThumbnailApplication(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + const auto uuid = rp.PopRaw(); - const auto user_list = profile_manager->GetAllUsers(); - if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) { - rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code - rb.PushRaw(Common::InvalidUUID); - return; - } + LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}", uuid.RawString()); - // Select the first user we have - rb.Push(ResultSuccess); - rb.PushRaw(profile_manager->GetUser(0)->uuid); -} + // TODO(ogniK): Check if application ID is zero on acc initialize. As we don't have a reliable + // way of confirming things like the TID, we're going to assume a non zero value for the time + // being. + constexpr u64 tid{1}; + StoreSaveDataThumbnail(ctx, uuid, tid); + } -Module::Interface::Interface(std::shared_ptr module_, - std::shared_ptr profile_manager_, - Core::System& system_, const char* name) - : ServiceFramework{system_, name}, module{std::move(module_)}, - profile_manager{std::move(profile_manager_)} {} + void GetBaasAccountManagerForSystemService(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + const auto uuid = rp.PopRaw(); -Module::Interface::~Interface() = default; + LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString()); + + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, uuid); + } + + void StoreSaveDataThumbnailSystem(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + const auto uuid = rp.PopRaw(); + const auto tid = rp.Pop(); + + LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}, tid={:016X}", uuid.RawString(), tid); + StoreSaveDataThumbnail(ctx, uuid, tid); + } + + void GetPinCodeLength(HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(0); + } + + void TrySelectUserWithoutInteractionDeprecated(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + // A u8 is passed into this function which we can safely ignore. It's to determine if we have + // access to use the network or not by the looks of it + IPC::ResponseBuilder rb{ctx, 6}; + if (profile_manager->GetUserCount() != 1) { + rb.Push(ResultSuccess); + rb.PushRaw(Common::InvalidUUID); + return; + } + + const auto user_list = profile_manager->GetAllUsers(); + if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) { + rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code + rb.PushRaw(Common::InvalidUUID); + return; + } + + // Select the first user we have + rb.Push(ResultSuccess); + rb.PushRaw(profile_manager->GetUser(0)->uuid); + } + + void TrySelectUserWithoutInteraction(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + // A u8 is passed into this function which we can safely ignore. It's to determine if we have + // access to use the network or not by the looks of it + IPC::ResponseBuilder rb{ctx, 6}; + if (profile_manager->GetUserCount() != 1) { + rb.Push(ResultSuccess); + rb.PushRaw(Common::InvalidUUID); + return; + } + + const auto user_list = profile_manager->GetAllUsers(); + if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) { + rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code + rb.PushRaw(Common::InvalidUUID); + return; + } + + // Select the first user we have + rb.Push(ResultSuccess); + rb.PushRaw(profile_manager->GetUser(0)->uuid); + } + + private: + Result InitializeApplicationInfoBase() { + if (application_info) { + LOG_ERROR(Service_ACC, "Application already initialized"); + return Account::ResultApplicationInfoAlreadyInitialized; + } + + // TODO(ogniK): This should be changed to reflect the target process for when we have multiple + // processes emulated. As we don't actually have pid support we should assume we're just using + // our own process + Glue::ApplicationLaunchProperty launch_property{}; + const auto result = system.GetARPManager().GetLaunchProperty( + &launch_property, system.GetApplicationProcessProgramID()); + + if (result != ResultSuccess) { + LOG_ERROR(Service_ACC, "Failed to get launch property"); + return Account::ResultInvalidApplication; + } + + switch (launch_property.base_game_storage_id) { + case FileSys::StorageId::GameCard: + application_info.application_type = ApplicationType::GameCard; + break; + case FileSys::StorageId::Host: + case FileSys::StorageId::NandSystem: + case FileSys::StorageId::NandUser: + case FileSys::StorageId::SdCard: + case FileSys::StorageId::None: // Yuzu specific, differs from hardware + application_info.application_type = ApplicationType::Digital; + break; + default: + LOG_ERROR(Service_ACC, "Invalid game storage ID! storage_id={}", + launch_property.base_game_storage_id); + return Account::ResultInvalidApplication; + } + + LOG_WARNING(Service_ACC, "ApplicationInfo init required"); + // TODO(ogniK): Actual initialization here + + return ResultSuccess; + } + + void StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid, + const u64 tid) { + IPC::ResponseBuilder rb{ctx, 2}; + + if (tid == 0) { + LOG_ERROR(Service_ACC, "TitleID is not valid!"); + rb.Push(Account::ResultInvalidApplication); + return; + } + + if (uuid.IsInvalid()) { + LOG_ERROR(Service_ACC, "User ID is not valid!"); + rb.Push(Account::ResultInvalidUserId); + return; + } + const auto thumbnail_size = ctx.GetReadBufferSize(); + if (thumbnail_size != THUMBNAIL_SIZE) { + LOG_ERROR(Service_ACC, "Buffer size is empty! size={:X} expecting {:X}", thumbnail_size, + THUMBNAIL_SIZE); + rb.Push(Account::ResultInvalidArrayLength); + return; + } + + // TODO(ogniK): Construct save data thumbnail + rb.Push(ResultSuccess); + } + + enum class ApplicationType : u32_le { + GameCard = 0, + Digital = 1, + Unknown = 3, + }; + + struct ApplicationInfo { + Service::Glue::ApplicationLaunchProperty launch_property; + ApplicationType application_type; + + constexpr explicit operator bool() const { + return launch_property.title_id != 0x0; + } + }; + + ApplicationInfo application_info{}; + protected: + std::shared_ptr module; + std::shared_ptr profile_manager; + }; +}; class ACC_AA final : public Module::Interface { public: explicit ACC_AA(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:aa") { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "EnsureCacheAsync"}, - {1, nullptr, "LoadCache"}, - {2, nullptr, "GetDeviceAccountId"}, - {50, nullptr, "RegisterNotificationTokenAsync"}, // 1.0.0 - 6.2.0 - {51, nullptr, "UnregisterNotificationTokenAsync"}, // 1.0.0 - 6.2.0 - }; - // clang-format on - RegisterHandlers(functions); + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:aa") {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } ~ACC_AA() override = default; + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "EnsureCacheAsync"}, + FunctionInfo{1, nullptr, "LoadCache"}, + FunctionInfo{2, nullptr, "GetDeviceAccountId"}, + FunctionInfo{50, nullptr, "RegisterNotificationTokenAsync", MakeVersionGate({1,0,0}, {6,2,0})}, + FunctionInfo{51, nullptr, "UnregisterNotificationTokenAsync", MakeVersionGate({1,0,0}, {6,2,0})} + ); }; class ACC_SU final : public Module::Interface { public: explicit ACC_SU(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:su") { - // clang-format off - static const FunctionInfo functions[] = { - {0, &ACC_SU::GetUserCount, "GetUserCount"}, - {1, &ACC_SU::GetUserExistence, "GetUserExistence"}, - {2, &ACC_SU::ListAllUsers, "ListAllUsers"}, - {3, &ACC_SU::ListOpenUsers, "ListOpenUsers"}, - {4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"}, - {5, &ACC_SU::GetProfile, "GetProfile"}, - {6, nullptr, "GetProfileDigest"}, - {50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, - {51, &ACC_SU::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, - {52, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, // 19.0.0+ - {60, &ACC_SU::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, - {99, nullptr, "DebugActivateOpenContextRetention"}, - {100, nullptr, "GetUserRegistrationNotifier"}, - {101, nullptr, "GetUserStateChangeNotifier"}, - {102, &ACC_SU::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"}, - {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, - {104, nullptr, "GetProfileUpdateNotifier"}, - {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, - {106, nullptr, "GetProfileSyncNotifier"}, - {110, &ACC_SU::StoreSaveDataThumbnailSystem, "StoreSaveDataThumbnail"}, - {111, nullptr, "ClearSaveDataThumbnail"}, - {112, nullptr, "LoadSaveDataThumbnail"}, - {113, nullptr, "GetSaveDataThumbnailExistence"}, - {120, nullptr, "ListOpenUsersInApplication"}, - {130, nullptr, "ActivateOpenContextRetention"}, - {140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"}, - {150, nullptr, "AuthenticateApplicationAsync"}, - {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, - {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, - {190, nullptr, "GetUserLastOpenedApplication"}, - {191, nullptr, "ActivateOpenContextHolder"}, - {200, &ACC_SU::BeginUserRegistration, "BeginUserRegistration"}, - {201, &ACC_SU::CompleteUserRegistration, "CompleteUserRegistration"}, - {202, nullptr, "CancelUserRegistration"}, - {203, &ACC_SU::DeleteUser, "DeleteUser"}, - {204, &ACC_SU::SetUserPosition, "SetUserPosition"}, - {205, &ACC_SU::GetProfileEditor, "GetProfileEditor"}, - {206, nullptr, "CompleteUserRegistrationForcibly"}, - {210, nullptr, "CreateFloatingRegistrationRequest"}, - {211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, - {212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"}, - {230, nullptr, "AuthenticateServiceAsync"}, - {250, &ACC_SU::GetBaasAccountAdministrator, "GetBaasAccountAdministrator"}, - {290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, - {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, - {299, nullptr, "SuspendBackgroundDaemon"}, - {400, nullptr, "SetPinCode"}, // 18.0.0+ - {401, &ACC_SU::GetPinCodeLength, "GetPinCodeLength"}, // 18.0.0+ - {402, nullptr, "GetPinCode"}, // 18.0.0+ - {403, nullptr, "GetPinCodeParity"}, - {404, nullptr, "VerifyPinCode"}, - {405, nullptr, "IsPinCodeVerificationForbidden"}, - {410, nullptr, "GetPinCodeErrorCount"}, // 18.0.0+ - {411, nullptr, "ResetPinCodeErrorCount"}, // 18.0.0+ - {412, nullptr, "IncrementPinCodeErrorCount"}, // 18.0.0+ - {900, nullptr, "SetUserUnqualifiedForDebug"}, - {901, nullptr, "UnsetUserUnqualifiedForDebug"}, - {902, nullptr, "ListUsersUnqualifiedForDebug"}, - {910, nullptr, "RefreshFirmwareSettingsForDebug"}, - {997, nullptr, "DebugInvalidateTokenCacheForUser"}, - {998, nullptr, "DebugSetUserStateClose"}, - {999, nullptr, "DebugSetUserStateOpen"}, - }; - // clang-format on + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:su") {} - RegisterHandlers(functions); - } ~ACC_SU() override = default; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &ACC_SU::GetUserCount, "GetUserCount"}, + FunctionInfo{1, &ACC_SU::GetUserExistence, "GetUserExistence"}, + FunctionInfo{2, &ACC_SU::ListAllUsers, "ListAllUsers"}, + FunctionInfo{3, &ACC_SU::ListOpenUsers, "ListOpenUsers"}, + FunctionInfo{4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"}, + FunctionInfo{5, &ACC_SU::GetProfile, "GetProfile"}, + FunctionInfo{6, nullptr, "GetProfileDigest"}, + FunctionInfo{50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, + FunctionInfo{51, &ACC_SU::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, + FunctionInfo{52, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction", MakeVersionGate({19,0,0})}, + FunctionInfo{60, &ACC_SU::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, + FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"}, + FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"}, + FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"}, + FunctionInfo{102, &ACC_SU::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"}, + FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, + FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"}, + FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, + FunctionInfo{106, nullptr, "GetProfileSyncNotifier"}, + FunctionInfo{110, &ACC_SU::StoreSaveDataThumbnailSystem, "StoreSaveDataThumbnail"}, + FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"}, + FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"}, + FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"}, + FunctionInfo{120, nullptr, "ListOpenUsersInApplication"}, + FunctionInfo{130, nullptr, "ActivateOpenContextRetention"}, + FunctionInfo{140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"}, + FunctionInfo{150, nullptr, "AuthenticateApplicationAsync"}, + FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, + FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, + FunctionInfo{190, nullptr, "GetUserLastOpenedApplication"}, + FunctionInfo{191, nullptr, "ActivateOpenContextHolder"}, + FunctionInfo{200, &ACC_SU::BeginUserRegistration, "BeginUserRegistration"}, + FunctionInfo{201, &ACC_SU::CompleteUserRegistration, "CompleteUserRegistration"}, + FunctionInfo{202, nullptr, "CancelUserRegistration"}, + FunctionInfo{203, &ACC_SU::DeleteUser, "DeleteUser"}, + FunctionInfo{204, &ACC_SU::SetUserPosition, "SetUserPosition"}, + FunctionInfo{205, &ACC_SU::GetProfileEditor, "GetProfileEditor"}, + FunctionInfo{206, nullptr, "CompleteUserRegistrationForcibly"}, + FunctionInfo{210, nullptr, "CreateFloatingRegistrationRequest"}, + FunctionInfo{211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, + FunctionInfo{212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"}, + FunctionInfo{230, nullptr, "AuthenticateServiceAsync"}, + FunctionInfo{250, &ACC_SU::GetBaasAccountAdministrator, "GetBaasAccountAdministrator"}, + FunctionInfo{290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, + FunctionInfo{291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, + FunctionInfo{299, nullptr, "SuspendBackgroundDaemon"}, + FunctionInfo{400, nullptr, "SetPinCode", MakeVersionGate({18,0,0})}, + FunctionInfo{401, &ACC_SU::GetPinCodeLength, "GetPinCodeLength", MakeVersionGate({18,0,0})}, + FunctionInfo{402, nullptr, "GetPinCode", MakeVersionGate({18,0,0})}, + FunctionInfo{403, nullptr, "GetPinCodeParity"}, + FunctionInfo{404, nullptr, "VerifyPinCode"}, + FunctionInfo{405, nullptr, "IsPinCodeVerificationForbidden"}, + FunctionInfo{410, nullptr, "GetPinCodeErrorCount", MakeVersionGate({18,0,0})}, + FunctionInfo{411, nullptr, "ResetPinCodeErrorCount", MakeVersionGate({18,0,0})}, + FunctionInfo{412, nullptr, "IncrementPinCodeErrorCount", MakeVersionGate({18,0,0})}, + FunctionInfo{900, nullptr, "SetUserUnqualifiedForDebug"}, + FunctionInfo{901, nullptr, "UnsetUserUnqualifiedForDebug"}, + FunctionInfo{902, nullptr, "ListUsersUnqualifiedForDebug"}, + FunctionInfo{910, nullptr, "RefreshFirmwareSettingsForDebug"}, + FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"}, + FunctionInfo{998, nullptr, "DebugSetUserStateClose"}, + FunctionInfo{999, nullptr, "DebugSetUserStateOpen"} + ); }; class ACC_U0 final : public Module::Interface { public: ACC_U0(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u0") { - // clang-format off - static const FunctionInfo functions[] = { - {0, &ACC_U0::GetUserCount, "GetUserCount"}, - {1, &ACC_U0::GetUserExistence, "GetUserExistence"}, - {2, &ACC_U0::ListAllUsers, "ListAllUsers"}, - {3, &ACC_U0::ListOpenUsers, "ListOpenUsers"}, - {4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"}, - {5, &ACC_U0::GetProfile, "GetProfile"}, - {6, nullptr, "GetProfileDigest"}, // 3.0.0+ - {50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, - {51, &ACC_U0::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, - {52, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, - {60, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 - {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+ - {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"}, - {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"}, - {102, nullptr, "AuthenticateApplicationAsync"}, - {103, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+ - {110, &ACC_U0::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"}, - {111, nullptr, "ClearSaveDataThumbnail"}, - {120, nullptr, "CreateGuestLoginRequest"}, - {130, nullptr, "LoadOpenContext"}, // 5.0.0+ - {131, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 6.0.0+ - {140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted"}, // 6.0.0+ - {141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+ - {150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked"}, // 6.0.0+ - {160, &ACC_U0::InitializeApplicationInfoV2, "InitializeApplicationInfoV2"}, - }; - // clang-format on + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u0") {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } ~ACC_U0() override = default; + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &ACC_U0::GetUserCount, "GetUserCount"}, + FunctionInfo{1, &ACC_U0::GetUserExistence, "GetUserExistence"}, + FunctionInfo{2, &ACC_U0::ListAllUsers, "ListAllUsers"}, + FunctionInfo{3, &ACC_U0::ListOpenUsers, "ListOpenUsers"}, + FunctionInfo{4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"}, + FunctionInfo{5, &ACC_U0::GetProfile, "GetProfile"}, + FunctionInfo{6, nullptr, "GetProfileDigest", MakeVersionGate({3,0,0})}, + FunctionInfo{50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, + FunctionInfo{51, &ACC_U0::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, + FunctionInfo{52, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, + FunctionInfo{60, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers", MakeVersionGate({5,0,0}, {5,1,0})}, + FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention", MakeVersionGate({6,0,0})}, + FunctionInfo{100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"}, + FunctionInfo{101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"}, + FunctionInfo{102, nullptr, "AuthenticateApplicationAsync"}, + FunctionInfo{103, nullptr, "CheckNetworkServiceAvailabilityAsync", MakeVersionGate({4,0,0})}, + FunctionInfo{110, &ACC_U0::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"}, + FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"}, + FunctionInfo{120, nullptr, "CreateGuestLoginRequest"}, + FunctionInfo{130, nullptr, "LoadOpenContext", MakeVersionGate({5,0,0})}, + FunctionInfo{131, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers", MakeVersionGate({6,0,0})}, + FunctionInfo{140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted", MakeVersionGate({6,0,0})}, + FunctionInfo{141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers", MakeVersionGate({6,0,0})}, + FunctionInfo{150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked", MakeVersionGate({6,0,0})}, + FunctionInfo{160, &ACC_U0::InitializeApplicationInfoV2, "InitializeApplicationInfoV2"} + ); }; class ACC_U1 final : public Module::Interface { public: ACC_U1(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u1") { - // clang-format off - static const FunctionInfo functions[] = { - {0, &ACC_U1::GetUserCount, "GetUserCount"}, - {1, &ACC_U1::GetUserExistence, "GetUserExistence"}, - {2, &ACC_U1::ListAllUsers, "ListAllUsers"}, - {3, &ACC_U1::ListOpenUsers, "ListOpenUsers"}, - {4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"}, - {5, &ACC_U1::GetProfile, "GetProfile"}, - {6, nullptr, "GetProfileDigest"}, - {50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, - {51, &ACC_U1::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, - {52, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, - {60, &ACC_U1::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, - {99, nullptr, "DebugActivateOpenContextRetention"}, - {100, nullptr, "GetUserRegistrationNotifier"}, - {101, nullptr, "GetUserStateChangeNotifier"}, - {102, &ACC_U1::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"}, - {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, - {104, nullptr, "GetProfileUpdateNotifier"}, - {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, - {106, nullptr, "GetProfileSyncNotifier"}, - {110, &ACC_U1::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"}, - {111, nullptr, "ClearSaveDataThumbnail"}, - {112, nullptr, "LoadSaveDataThumbnail"}, - {113, nullptr, "GetSaveDataThumbnailExistence"}, - {120, nullptr, "ListOpenUsersInApplication"}, - {130, nullptr, "ActivateOpenContextRetention"}, - {140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"}, - {150, nullptr, "AuthenticateApplicationAsync"}, - {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, - {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, - {190, nullptr, "GetUserLastOpenedApplication"}, - {191, nullptr, "ActivateOpenContextHolder"}, - {401, &ACC_U1::GetPinCodeLength, "GetPinCodeLength"}, // 18.0.0+ - {402, nullptr, "GetPinCode"}, // 18.0.0+ - {997, nullptr, "DebugInvalidateTokenCacheForUser"}, - {998, nullptr, "DebugSetUserStateClose"}, - {999, nullptr, "DebugSetUserStateOpen"}, - }; - // clang-format on + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u1") {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } ~ACC_U1() override = default; + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &ACC_U1::GetUserCount, "GetUserCount"}, + FunctionInfo{1, &ACC_U1::GetUserExistence, "GetUserExistence"}, + FunctionInfo{2, &ACC_U1::ListAllUsers, "ListAllUsers"}, + FunctionInfo{3, &ACC_U1::ListOpenUsers, "ListOpenUsers"}, + FunctionInfo{4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"}, + FunctionInfo{5, &ACC_U1::GetProfile, "GetProfile"}, + FunctionInfo{6, nullptr, "GetProfileDigest"}, + FunctionInfo{50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, + FunctionInfo{51, &ACC_U1::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, + FunctionInfo{52, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, + FunctionInfo{60, &ACC_U1::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, + FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"}, + FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"}, + FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"}, + FunctionInfo{102, &ACC_U1::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"}, + FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, + FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"}, + FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, + FunctionInfo{106, nullptr, "GetProfileSyncNotifier"}, + FunctionInfo{110, &ACC_U1::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"}, + FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"}, + FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"}, + FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"}, + FunctionInfo{120, nullptr, "ListOpenUsersInApplication"}, + FunctionInfo{130, nullptr, "ActivateOpenContextRetention"}, + FunctionInfo{140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"}, + FunctionInfo{150, nullptr, "AuthenticateApplicationAsync"}, + FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, + FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, + FunctionInfo{190, nullptr, "GetUserLastOpenedApplication"}, + FunctionInfo{191, nullptr, "ActivateOpenContextHolder"}, + FunctionInfo{401, &ACC_U1::GetPinCodeLength, "GetPinCodeLength", MakeVersionGate({18,0,0})}, + FunctionInfo{402, nullptr, "GetPinCode", MakeVersionGate({18,0,0})}, + FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"}, + FunctionInfo{998, nullptr, "DebugSetUserStateClose"}, + FunctionInfo{999, nullptr, "DebugSetUserStateOpen"} + ); }; class DAUTH_0 final : public ServiceFramework { public: - explicit DAUTH_0(Core::System& system_) : ServiceFramework{system_, "dauth:0"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "EnsureAuthenticationTokenCacheAsync"}, - {1, nullptr, "LoadAuthenticationTokenCache"}, - {2, nullptr, "InvalidateAuthenticationTokenCache"}, - {3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"}, - {10, nullptr, "EnsureEdgeTokenCacheAsync"}, - {11, nullptr, "LoadEdgeTokenCache"}, - {12, nullptr, "InvalidateEdgeTokenCache"}, - {13, nullptr, "IsEdgeTokenCacheAvailable"}, - {20, nullptr, "EnsureApplicationAuthenticationCacheAsync"}, - {21, nullptr, "LoadApplicationAuthenticationTokenCache"}, - {22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"}, - {23, nullptr, "IsApplicationAuthenticationCacheAvailable"}, - {24, nullptr, "InvalidateApplicationAuthenticationCache"}, - {30, nullptr, "EnsureGameCardAuthenticationCacheAsync"}, - {31, nullptr, "LoadGameCardAuthenticationTokenCache"}, - {32, nullptr, "IsGameCardAuthenticationCacheAvailable"}, - {33, nullptr, "InvalidateGameCardAuthenticationCache"}, - {1000, nullptr, "GetInactiveElicenseUsedEvent"}, - {9000, nullptr, "ImportVirtualClientCertificate"}, - {9010, nullptr, "DeleteVirtualClientCertificate"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit DAUTH_0(Core::System& system_) : ServiceFramework{system_, "dauth:0"} {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "EnsureAuthenticationTokenCacheAsync"}, + FunctionInfo{1, nullptr, "LoadAuthenticationTokenCache"}, + FunctionInfo{2, nullptr, "InvalidateAuthenticationTokenCache"}, + FunctionInfo{3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"}, + FunctionInfo{10, nullptr, "EnsureEdgeTokenCacheAsync"}, + FunctionInfo{11, nullptr, "LoadEdgeTokenCache"}, + FunctionInfo{12, nullptr, "InvalidateEdgeTokenCache"}, + FunctionInfo{13, nullptr, "IsEdgeTokenCacheAvailable"}, + FunctionInfo{20, nullptr, "EnsureApplicationAuthenticationCacheAsync"}, + FunctionInfo{21, nullptr, "LoadApplicationAuthenticationTokenCache"}, + FunctionInfo{22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"}, + FunctionInfo{23, nullptr, "IsApplicationAuthenticationCacheAvailable"}, + FunctionInfo{24, nullptr, "InvalidateApplicationAuthenticationCache"}, + FunctionInfo{30, nullptr, "EnsureGameCardAuthenticationCacheAsync"}, + FunctionInfo{31, nullptr, "LoadGameCardAuthenticationTokenCache"}, + FunctionInfo{32, nullptr, "IsGameCardAuthenticationCacheAvailable"}, + FunctionInfo{33, nullptr, "InvalidateGameCardAuthenticationCache"}, + FunctionInfo{1000, nullptr, "GetInactiveElicenseUsedEvent"}, + FunctionInfo{9000, nullptr, "ImportVirtualClientCertificate"}, + FunctionInfo{9010, nullptr, "DeleteVirtualClientCertificate"} + ); }; class ACC_E final : public Module::Interface { public: explicit ACC_E(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e") { - // clang-format off - static const FunctionInfo functions[] = { - { 0, nullptr, "GetUserCount"}, - { 1, nullptr, "GetUserExistence"}, - { 2, nullptr, "ListAllUsers"}, - { 3, nullptr, "ListOpenUsers"}, - { 4, nullptr, "GetLastOpenedUser"}, - { 5, nullptr, "GetProfile"}, - { 6, nullptr, "GetProfileDigest"}, - { 50, nullptr, "IsUserRegistrationRequestPermitted"}, - { 51, nullptr, "TrySelectUserWithoutInteractionDeprecated"}, - { 52, nullptr, "TrySelectUserWithoutInteraction"}, - { 99, nullptr, "DebugActivateOpenContextRetention"}, - { 100, nullptr, "GetUserRegistrationNotifier"}, - { 101, nullptr, "GetUserStateChangeNotifier"}, - { 102, nullptr, "GetBaasAccountManagerForSystemService"}, - { 103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, - { 104, nullptr, "GetProfileUpdateNotifier"}, - { 105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, - { 106, nullptr, "GetProfileSyncNotifier"}, - { 110, nullptr, "StoreSaveDataThumbnail"}, - { 111, nullptr, "ClearSaveDataThumbnail"}, - { 112, nullptr, "LoadSaveDataThumbnail"}, - { 113, nullptr, "GetSaveDataThumbnailExistence"}, - { 120, nullptr, "ListOpenUsersInApplication"}, - { 130, nullptr, "ActivateOpenContextRetention"}, - { 140, nullptr, "ListQualifiedUsers"}, - { 151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, - { 152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, - { 170, nullptr, "GetNasOp2MembershipStateChangeNotifier"}, - { 191, nullptr, "UpdateNotificationReceiverInfo"}, - { 200, nullptr, "BeginUserRegistration"}, - { 201, nullptr, "CompleteUserRegistration"}, - { 202, nullptr, "CancelUserRegistration"}, - { 203, nullptr, "DeleteUser"}, - { 204, nullptr, "SetUserPosition"}, - { 205, nullptr, "GetProfileEditor"}, - { 206, nullptr, "CompleteUserRegistrationForcibly"}, - { 210, nullptr, "CreateFloatingRegistrationRequest"}, - { 211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, - { 212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"}, - { 213, nullptr, "CreateProcedureToCreateUserWithNintendoAccount"}, - { 214, nullptr, "ResumeProcedureToCreateUserWithNintendoAccount"}, - { 215, nullptr, "ResumeProcedureToCreateUserWithNintendoAccountAfterApplyResponse"}, - { 230, nullptr, "AuthenticateServiceAsync"}, - { 250, nullptr, "GetBaasAccountAdministrator"}, - { 251, nullptr, "SynchronizeNetworkServiceAccountsSnapshotAsync"}, - { 290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, - { 291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, - { 292, nullptr, "ProxyProcedureForDeviceMigrationAuthenticatingOperatingUser"}, - { 293, nullptr, "ProxyProcedureForDeviceMigrationDownload"}, - { 299, nullptr, "SuspendBackgroundDaemon"}, - { 350, nullptr, "CreateDeviceMigrationUserExportRequest"}, - { 351, nullptr, "UploadNasCredential"}, - { 352, nullptr, "CreateDeviceMigrationUserImportRequest"}, - { 353, nullptr, "DeleteUserMigrationSaveData"}, - { 400, nullptr, "SetPinCode"}, - { 401, nullptr, "GetPinCodeLength"}, - { 402, nullptr, "GetPinCode"}, - { 403, nullptr, "GetPinCodeParity"}, - { 404, nullptr, "VerifyPinCode"}, - { 405, nullptr, "IsPinCodeVerificationForbidden"}, - { 410, nullptr, "GetPinCodeErrorCount"}, - { 411, nullptr, "ResetPinCodeErrorCount"}, - { 412, nullptr, "IncrementPinCodeErrorCount"}, - { 413, nullptr, "SetPinCodeErrorCount"}, - { 420, nullptr, "SetStartPenaltyTime"}, - { 421, nullptr, "GetStartPenaltyTime"}, - { 900, nullptr, "SetUserUnqualifiedForDebug"}, - { 901, nullptr, "UnsetUserUnqualifiedForDebug"}, - { 902, nullptr, "ListUsersUnqualifiedForDebug"}, - { 910, nullptr, "RefreshFirmwareSettingsForDebug"}, - { 997, nullptr, "DebugInvalidateTokenCacheForUser"}, - { 998, nullptr, "DebugSetUserStateClose"}, - { 999, nullptr, "DebugSetUserStateOpen"}, - { 1000, nullptr, "CreateIAccountEntityServiceForApplication"}, - { 1100, nullptr, "CreateIUserStateManager"}, - { 10050, nullptr, "IsUserRegistrationRequestPermittedForAccountPolicy"}, - { 10105, nullptr, "CheckNetworkServiceAvailabilityAsyncForAccountPolicy"}, - }; - // clang-format on - RegisterHandlers(functions); + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e") {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetUserCount"}, + FunctionInfo{1, nullptr, "GetUserExistence"}, + FunctionInfo{2, nullptr, "ListAllUsers"}, + FunctionInfo{3, nullptr, "ListOpenUsers"}, + FunctionInfo{4, nullptr, "GetLastOpenedUser"}, + FunctionInfo{5, nullptr, "GetProfile"}, + FunctionInfo{6, nullptr, "GetProfileDigest"}, + FunctionInfo{50, nullptr, "IsUserRegistrationRequestPermitted"}, + FunctionInfo{51, nullptr, "TrySelectUserWithoutInteractionDeprecated"}, + FunctionInfo{52, nullptr, "TrySelectUserWithoutInteraction"}, + FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"}, + FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"}, + FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"}, + FunctionInfo{102, nullptr, "GetBaasAccountManagerForSystemService"}, + FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, + FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"}, + FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, + FunctionInfo{106, nullptr, "GetProfileSyncNotifier"}, + FunctionInfo{110, nullptr, "StoreSaveDataThumbnail"}, + FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"}, + FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"}, + FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"}, + FunctionInfo{120, nullptr, "ListOpenUsersInApplication"}, + FunctionInfo{130, nullptr, "ActivateOpenContextRetention"}, + FunctionInfo{140, nullptr, "ListQualifiedUsers"}, + FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, + FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, + FunctionInfo{170, nullptr, "GetNasOp2MembershipStateChangeNotifier"}, + FunctionInfo{191, nullptr, "UpdateNotificationReceiverInfo"}, + FunctionInfo{200, nullptr, "BeginUserRegistration"}, + FunctionInfo{201, nullptr, "CompleteUserRegistration"}, + FunctionInfo{202, nullptr, "CancelUserRegistration"}, + FunctionInfo{203, nullptr, "DeleteUser"}, + FunctionInfo{204, nullptr, "SetUserPosition"}, + FunctionInfo{205, nullptr, "GetProfileEditor"}, + FunctionInfo{206, nullptr, "CompleteUserRegistrationForcibly"}, + FunctionInfo{210, nullptr, "CreateFloatingRegistrationRequest"}, + FunctionInfo{211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, + FunctionInfo{212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"}, + FunctionInfo{213, nullptr, "CreateProcedureToCreateUserWithNintendoAccount"}, + FunctionInfo{214, nullptr, "ResumeProcedureToCreateUserWithNintendoAccount"}, + FunctionInfo{215, nullptr, "ResumeProcedureToCreateUserWithNintendoAccountAfterApplyResponse"}, + FunctionInfo{230, nullptr, "AuthenticateServiceAsync"}, + FunctionInfo{250, nullptr, "GetBaasAccountAdministrator"}, + FunctionInfo{251, nullptr, "SynchronizeNetworkServiceAccountsSnapshotAsync"}, + FunctionInfo{290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, + FunctionInfo{291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, + FunctionInfo{292, nullptr, "ProxyProcedureForDeviceMigrationAuthenticatingOperatingUser"}, + FunctionInfo{293, nullptr, "ProxyProcedureForDeviceMigrationDownload"}, + FunctionInfo{299, nullptr, "SuspendBackgroundDaemon"}, + FunctionInfo{350, nullptr, "CreateDeviceMigrationUserExportRequest"}, + FunctionInfo{351, nullptr, "UploadNasCredential"}, + FunctionInfo{352, nullptr, "CreateDeviceMigrationUserImportRequest"}, + FunctionInfo{353, nullptr, "DeleteUserMigrationSaveData"}, + FunctionInfo{400, nullptr, "SetPinCode"}, + FunctionInfo{401, nullptr, "GetPinCodeLength"}, + FunctionInfo{402, nullptr, "GetPinCode"}, + FunctionInfo{403, nullptr, "GetPinCodeParity"}, + FunctionInfo{404, nullptr, "VerifyPinCode"}, + FunctionInfo{405, nullptr, "IsPinCodeVerificationForbidden"}, + FunctionInfo{410, nullptr, "GetPinCodeErrorCount"}, + FunctionInfo{411, nullptr, "ResetPinCodeErrorCount"}, + FunctionInfo{412, nullptr, "IncrementPinCodeErrorCount"}, + FunctionInfo{413, nullptr, "SetPinCodeErrorCount"}, + FunctionInfo{420, nullptr, "SetStartPenaltyTime"}, + FunctionInfo{421, nullptr, "GetStartPenaltyTime"}, + FunctionInfo{900, nullptr, "SetUserUnqualifiedForDebug"}, + FunctionInfo{901, nullptr, "UnsetUserUnqualifiedForDebug"}, + FunctionInfo{902, nullptr, "ListUsersUnqualifiedForDebug"}, + FunctionInfo{910, nullptr, "RefreshFirmwareSettingsForDebug"}, + FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"}, + FunctionInfo{998, nullptr, "DebugSetUserStateClose"}, + FunctionInfo{999, nullptr, "DebugSetUserStateOpen"}, + FunctionInfo{1000, nullptr, "CreateIAccountEntityServiceForApplication"}, + FunctionInfo{1100, nullptr, "CreateIUserStateManager"}, + FunctionInfo{10050, nullptr, "IsUserRegistrationRequestPermittedForAccountPolicy"}, + FunctionInfo{10105, nullptr, "CheckNetworkServiceAvailabilityAsyncForAccountPolicy"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class ACC_E_U1 final : public Module::Interface { public: explicit ACC_E_U1(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u1") { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetUserCount"}, - {1, nullptr, "GetUserExistence"}, - {2, nullptr, "ListAllUsers"}, - {3, nullptr, "ListOpenUsers"}, - {4, nullptr, "GetLastOpenedUser"}, - {5, nullptr, "GetProfile"}, - {6, nullptr, "GetProfileDigest"}, - {50, nullptr, "IsUserRegistrationRequestPermitted"}, - {51, nullptr, "TrySelectUserWithoutInteractionDeprecated"}, - {99, nullptr, "DebugActivateOpenContextRetention"}, - {100, nullptr, "GetUserRegistrationNotifier"}, - {101, nullptr, "GetUserStateChangeNotifier"}, - {102, nullptr, "GetBaasAccountManagerForSystemService"}, - {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, - {104, nullptr, "GetProfileUpdateNotifier"}, - {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, - {106, nullptr, "GetProfileSyncNotifier"}, - {110, nullptr, "StoreSaveDataThumbnail"}, - {111, nullptr, "ClearSaveDataThumbnail"}, - {112, nullptr, "LoadSaveDataThumbnail"}, - {113, nullptr, "GetSaveDataThumbnailExistence"}, - {120, nullptr, "ListOpenUsersInApplication"}, - {130, nullptr, "ActivateOpenContextRetention"}, - {140, nullptr, "ListQualifiedUsers"}, - {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, - {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, - {170, nullptr, "GetNasOp2MembershipStateChangeNotifier"}, - {191, nullptr, "UpdateNotificationReceiverInfo"}, - {997, nullptr, "DebugInvalidateTokenCacheForUser"}, - {998, nullptr, "DebugSetUserStateClose"}, - {999, nullptr, "DebugSetUserStateOpen"}, - }; - // clang-format on - RegisterHandlers(functions); + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u1") {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetUserCount"}, + FunctionInfo{1, nullptr, "GetUserExistence"}, + FunctionInfo{2, nullptr, "ListAllUsers"}, + FunctionInfo{3, nullptr, "ListOpenUsers"}, + FunctionInfo{4, nullptr, "GetLastOpenedUser"}, + FunctionInfo{5, nullptr, "GetProfile"}, + FunctionInfo{6, nullptr, "GetProfileDigest"}, + FunctionInfo{50, nullptr, "IsUserRegistrationRequestPermitted"}, + FunctionInfo{51, nullptr, "TrySelectUserWithoutInteractionDeprecated"}, + FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"}, + FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"}, + FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"}, + FunctionInfo{102, nullptr, "GetBaasAccountManagerForSystemService"}, + FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, + FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"}, + FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, + FunctionInfo{106, nullptr, "GetProfileSyncNotifier"}, + FunctionInfo{110, nullptr, "StoreSaveDataThumbnail"}, + FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"}, + FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"}, + FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"}, + FunctionInfo{120, nullptr, "ListOpenUsersInApplication"}, + FunctionInfo{130, nullptr, "ActivateOpenContextRetention"}, + FunctionInfo{140, nullptr, "ListQualifiedUsers"}, + FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, + FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, + FunctionInfo{170, nullptr, "GetNasOp2MembershipStateChangeNotifier"}, + FunctionInfo{191, nullptr, "UpdateNotificationReceiverInfo"}, + FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"}, + FunctionInfo{998, nullptr, "DebugSetUserStateClose"}, + FunctionInfo{999, nullptr, "DebugSetUserStateOpen"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class ACC_E_U2 final : public Module::Interface { public: explicit ACC_E_U2(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u2") { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetUserCount"}, - {1, nullptr, "GetUserExistence"}, - {2, nullptr, "ListAllUsers"}, - {3, nullptr, "ListOpenUsers"}, - {4, nullptr, "GetLastOpenedUser"}, - {5, nullptr, "GetProfile"}, - {6, nullptr, "GetProfileDigest"}, - {50, nullptr, "#IsUserRegistrationRequestPermitted"}, - {51, nullptr, "TrySelectUserWithoutInteractionDeprecated"}, - {52, nullptr, "TrySelectUserWithoutInteraction"}, - {99, nullptr, "DebugActivateOpenContextRetention"}, - {100, nullptr, "GetUserRegistrationNotifier"}, - {101, nullptr, "GetUserStateChangeNotifier"}, - {102, nullptr, "GetBaasAccountManagerForSystemService"}, - {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, - {104, nullptr, "GetProfileUpdateNotifier"}, - {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, - {106, nullptr, "GetProfileSyncNotifier"}, - {110, nullptr, "StoreSaveDataThumbnail"}, - {111, nullptr, "ClearSaveDataThumbnail"}, - {112, nullptr, "LoadSaveDataThumbnail"}, - {113, nullptr, "GetSaveDataThumbnailExistence"}, - {120, nullptr, "ListOpenUsersInApplication"}, - {130, nullptr, "ActivateOpenContextRetention"}, - {140, nullptr, "ListQualifiedUsers"}, - {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, - {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, - {170, nullptr, "GetNasOp2MembershipStateChangeNotifier"}, - {191, nullptr, "UpdateNotificationReceiverInfo"}, - {205, nullptr, "GetProfileEditor"}, - {401, nullptr, "GetPinCodeLength"}, - {402, nullptr, "GetPinCode"}, - {403, nullptr, "GetPinCodeParity"}, - {404, nullptr, "VerifyPinCode"}, - {405, nullptr, "IsPinCodeVerificationForbidden"}, - {997, nullptr, "DebugInvalidateTokenCacheForUser"}, - {998, nullptr, "DebugSetUserStateClose"}, - {999, nullptr, "DebugSetUserStateOpen"}, - }; - // clang-format on - RegisterHandlers(functions); + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u2") {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetUserCount"}, + FunctionInfo{1, nullptr, "GetUserExistence"}, + FunctionInfo{2, nullptr, "ListAllUsers"}, + FunctionInfo{3, nullptr, "ListOpenUsers"}, + FunctionInfo{4, nullptr, "GetLastOpenedUser"}, + FunctionInfo{5, nullptr, "GetProfile"}, + FunctionInfo{6, nullptr, "GetProfileDigest"}, + FunctionInfo{50, nullptr, "IsUserRegistrationRequestPermitted"}, + FunctionInfo{51, nullptr, "TrySelectUserWithoutInteractionDeprecated"}, + FunctionInfo{52, nullptr, "TrySelectUserWithoutInteraction"}, + FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"}, + FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"}, + FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"}, + FunctionInfo{102, nullptr, "GetBaasAccountManagerForSystemService"}, + FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, + FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"}, + FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, + FunctionInfo{106, nullptr, "GetProfileSyncNotifier"}, + FunctionInfo{110, nullptr, "StoreSaveDataThumbnail"}, + FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"}, + FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"}, + FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"}, + FunctionInfo{120, nullptr, "ListOpenUsersInApplication"}, + FunctionInfo{130, nullptr, "ActivateOpenContextRetention"}, + FunctionInfo{140, nullptr, "ListQualifiedUsers"}, + FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, + FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, + FunctionInfo{170, nullptr, "GetNasOp2MembershipStateChangeNotifier"}, + FunctionInfo{191, nullptr, "UpdateNotificationReceiverInfo"}, + FunctionInfo{205, nullptr, "GetProfileEditor"}, + FunctionInfo{401, nullptr, "GetPinCodeLength"}, + FunctionInfo{402, nullptr, "GetPinCode"}, + FunctionInfo{403, nullptr, "GetPinCodeParity"}, + FunctionInfo{404, nullptr, "VerifyPinCode"}, + FunctionInfo{405, nullptr, "IsPinCodeVerificationForbidden"}, + FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"}, + FunctionInfo{998, nullptr, "DebugSetUserStateClose"}, + FunctionInfo{999, nullptr, "DebugSetUserStateOpen"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/acc/acc.h b/src/core/hle/service/acc/acc.h index 19af7c74c9..9c2c96acdb 100644 --- a/src/core/hle/service/acc/acc.h +++ b/src/core/hle/service/acc/acc.h @@ -14,70 +14,6 @@ namespace Service::Account { class ProfileManager; -class Module final { -public: - class Interface : public ServiceFramework { - public: - explicit Interface(std::shared_ptr module_, - std::shared_ptr profile_manager_, Core::System& system_, - const char* name); - ~Interface() override; - - void GetUserCount(HLERequestContext& ctx); - void GetUserExistence(HLERequestContext& ctx); - void ListAllUsers(HLERequestContext& ctx); - void ListOpenUsers(HLERequestContext& ctx); - void GetLastOpenedUser(HLERequestContext& ctx); - void GetProfile(HLERequestContext& ctx); - void InitializeApplicationInfo(HLERequestContext& ctx); - void InitializeApplicationInfoRestricted(HLERequestContext& ctx); - void GetBaasAccountManagerForApplication(HLERequestContext& ctx); - void IsUserRegistrationRequestPermitted(HLERequestContext& ctx); - void TrySelectUserWithoutInteractionDeprecated(HLERequestContext& ctx); - void TrySelectUserWithoutInteraction(HLERequestContext& ctx); - void IsUserAccountSwitchLocked(HLERequestContext& ctx); - void InitializeApplicationInfoV2(HLERequestContext& ctx); - void BeginUserRegistration(HLERequestContext& ctx); - void CompleteUserRegistration(HLERequestContext& ctx); - void DeleteUser(HLERequestContext& ctx); - void SetUserPosition(HLERequestContext& ctx); - void GetProfileEditor(HLERequestContext& ctx); - void GetBaasAccountAdministrator(HLERequestContext &ctx); - void ListQualifiedUsers(HLERequestContext& ctx); - void ListOpenContextStoredUsers(HLERequestContext& ctx); - void StoreSaveDataThumbnailApplication(HLERequestContext& ctx); - void GetBaasAccountManagerForSystemService(HLERequestContext& ctx); - void StoreSaveDataThumbnailSystem(HLERequestContext& ctx); - void GetPinCodeLength(HLERequestContext& ctx); - - private: - Result InitializeApplicationInfoBase(); - void StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid, - const u64 tid); - - enum class ApplicationType : u32_le { - GameCard = 0, - Digital = 1, - Unknown = 3, - }; - - struct ApplicationInfo { - Service::Glue::ApplicationLaunchProperty launch_property; - ApplicationType application_type; - - constexpr explicit operator bool() const { - return launch_property.title_id != 0x0; - } - }; - - ApplicationInfo application_info{}; - - protected: - std::shared_ptr module; - std::shared_ptr profile_manager; - }; -}; - void LoopProcess(Core::System& system); } // namespace Service::Account diff --git a/src/core/hle/service/acc/async_context.cpp b/src/core/hle/service/acc/async_context.cpp index 8dec886ad7..a7f751d756 100644 --- a/src/core/hle/service/acc/async_context.cpp +++ b/src/core/hle/service/acc/async_context.cpp @@ -12,17 +12,6 @@ namespace Service::Account { IAsyncContext::IAsyncContext(Core::System& system_) : ServiceFramework{system_, "IAsyncContext"}, service_context{system_, "IAsyncContext"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IAsyncContext::GetSystemEvent, "GetSystemEvent"}, - {1, &IAsyncContext::Cancel, "Cancel"}, - {2, &IAsyncContext::HasDone, "HasDone"}, - {3, &IAsyncContext::GetResult, "GetResult"}, - }; - // clang-format on - - RegisterHandlers(functions); - completion_event = service_context.CreateEvent("IAsyncContext:CompletionEvent"); } diff --git a/src/core/hle/service/acc/async_context.h b/src/core/hle/service/acc/async_context.h index d7bffc055e..0137567d11 100644 --- a/src/core/hle/service/acc/async_context.h +++ b/src/core/hle/service/acc/async_context.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -30,6 +33,16 @@ protected: void MarkComplete(); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IAsyncContext::GetSystemEvent, "GetSystemEvent"}, + FunctionInfo{1, &IAsyncContext::Cancel, "Cancel"}, + FunctionInfo{2, &IAsyncContext::HasDone, "HasDone"}, + FunctionInfo{3, &IAsyncContext::GetResult, "GetResult"} + ); + KernelHelpers::ServiceContext service_context; std::atomic is_complete{false}; diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 2ef393439b..472be8f0f0 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -1,16 +1,1343 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include "common/settings.h" +#include "core/core.h" +#include "core/file_sys/common_funcs.h" +#include "core/file_sys/patch_manager.h" +#include "core/file_sys/romfs_factory.h" +#include "core/file_sys/control_metadata.h" +#include "core/hle/api_version.h" +#include "core/hle/kernel/k_transfer_memory.h" +#include "core/hle/service/server_manager.h" +#include "core/hle/service/am/applet_manager.h" +#include "core/hle/service/am/window_system.h" #include "core/hle/service/am/am.h" #include "core/hle/service/am/button_poller.h" #include "core/hle/service/am/event_observer.h" -#include "core/hle/service/am/service/all_system_applet_proxies_service.h" -#include "core/hle/service/am/service/application_proxy_service.h" -#include "core/hle/service/am/window_system.h" -#include "core/hle/service/server_manager.h" +#include "core/hle/service/am/service/application_creator.h" +#include "core/hle/service/am/service/audio_controller.h" +#include "core/hle/service/am/service/common_state_getter.h" +#include "core/hle/service/am/service/display_controller.h" +#include "core/hle/service/am/service/global_state_controller.h" +#include "core/hle/service/am/service/home_menu_functions.h" +#include "core/hle/service/am/service/process_winding_controller.h" +#include "core/hle/service/am/service/self_controller.h" +#include "core/hle/service/am/service/window_controller.h" +#include "core/hle/service/am/service/application_functions.h" +#include "core/hle/service/am/applet_data_broker.h" +#include "core/hle/service/am/frontend/applets.h" +#include "core/hle/service/am/library_applet_storage.h" +#include "core/hle/service/am/process_creation.h" +#include "core/hle/service/am/service/library_applet_accessor.h" +#include "core/hle/service/am/service/overlay_functions.h" +#include "core/hle/service/am/service/storage.h" +#include "core/hle/service/ns/language.h" +#include "core/hle/service/ns/application_manager_interface.h" +#include "core/hle/service/ns/service_getter_interface.h" +#include "core/hle/service/glue/glue_manager.h" +#include "core/hle/service/sm/sm.h" +#include "core/hle/service/acc/profile_manager.h" +#include "core/hle/service/am/frontend/applet_profile_select.h" +#include "core/hle/service/cmif_serialization.h" namespace Service::AM { +struct Applet; +class IAppletCommonFunctions; +class IApplicationCreator; +class IAudioController; +class ICommonStateGetter; +class IDebugFunctions; +class IDisplayController; +class IHomeMenuFunctions; +class IGlobalStateController; +class ILibraryAppletCreator; +class IProcessWindingController; +class ISelfController; +class IWindowController; +class WindowSystem; + +class IDebugFunctions final : public ServiceFramework { +public: + explicit IDebugFunctions(Core::System& system_) : ServiceFramework{system_, "IDebugFunctions"} {} + ~IDebugFunctions() override = default; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "NotifyMessageToHomeMenuForDebug"}, + FunctionInfo{1, nullptr, "OpenMainApplication"}, + FunctionInfo{10, nullptr, "PerformSystemButtonPressing"}, + FunctionInfo{20, nullptr, "InvalidateTransitionLayer"}, + FunctionInfo{30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"}, + FunctionInfo{31, nullptr, "RequestLaunchApplicationByApplicationLaunchInfoForDebug"}, + FunctionInfo{40, nullptr, "GetAppletResourceUsageInfo"}, + FunctionInfo{50, nullptr, "AddSystemProgramIdAndAppletIdForDebug"}, + FunctionInfo{51, nullptr, "AddOperationConfirmedLibraryAppletIdForDebug"}, + FunctionInfo{100, nullptr, "SetCpuBoostModeForApplet"}, + FunctionInfo{101, nullptr, "CancelCpuBoostModeForApplet"}, + FunctionInfo{110, nullptr, "PushToAppletBoundChannelForDebug"}, + FunctionInfo{111, nullptr, "TryPopFromAppletBoundChannelForDebug"}, + FunctionInfo{120, nullptr, "AlarmSettingNotificationEnableAppEventReserve"}, + FunctionInfo{121, nullptr, "AlarmSettingNotificationDisableAppEventReserve"}, + FunctionInfo{122, nullptr, "AlarmSettingNotificationPushAppEventNotify"}, + FunctionInfo{130, nullptr, "FriendInvitationSetApplicationParameter"}, + FunctionInfo{131, nullptr, "FriendInvitationClearApplicationParameter"}, + FunctionInfo{132, nullptr, "FriendInvitationPushApplicationParameter"}, + FunctionInfo{140, nullptr, "RestrictPowerOperationForSecureLaunchModeForDebug"}, + FunctionInfo{200, nullptr, "CreateFloatingLibraryAppletAccepterForDebug"}, + FunctionInfo{300, nullptr, "TerminateAllRunningApplicationsForDebug"}, + FunctionInfo{900, nullptr, "GetGrcProcessLaunchedSystemEvent"} + ); +}; + +class IApplicationProxy final : public ServiceFramework { +public: + explicit IApplicationProxy(Core::System& system_, std::shared_ptr applet, + Kernel::KProcess* process, WindowSystem& window_system) + : ServiceFramework{system_, "IApplicationProxy"}, + m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { + } + + ~IApplicationProxy() override = default; + + Result GetAudioController( + Out> out_audio_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_audio_controller = std::make_shared(system); + R_SUCCEED(); + } + + Result GetDisplayController( + Out> out_display_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_display_controller = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetProcessWindingController( + Out> out_process_winding_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_process_winding_controller = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetDebugFunctions( + Out> out_debug_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_debug_functions = std::make_shared(system); + R_SUCCEED(); + } + + Result GetWindowController( + Out> out_window_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_window_controller = std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result GetSelfController( + Out> out_self_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_self_controller = std::make_shared(system, m_applet, m_process); + R_SUCCEED(); + } + + Result GetCommonStateGetter( + Out> out_common_state_getter) { + LOG_DEBUG(Service_AM, "called"); + *out_common_state_getter = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetLibraryAppletCreator( + Out> out_library_applet_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_creator = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result GetApplicationFunctions( + Out> out_application_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_application_functions = std::make_shared(system, m_applet); + R_SUCCEED(); + } + +private: + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IApplicationProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, + FunctionInfo{1, D<&IApplicationProxy::GetSelfController>, "GetSelfController"}, + FunctionInfo{2, D<&IApplicationProxy::GetWindowController>, "GetWindowController"}, + FunctionInfo{3, D<&IApplicationProxy::GetAudioController>, "GetAudioController"}, + FunctionInfo{4, D<&IApplicationProxy::GetDisplayController>, "GetDisplayController"}, + FunctionInfo{10, D<&IApplicationProxy::GetProcessWindingController>, "GetProcessWindingController"}, + FunctionInfo{11, D<&IApplicationProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, + FunctionInfo{20, D<&IApplicationProxy::GetApplicationFunctions>, "GetApplicationFunctions"}, + FunctionInfo{1000, D<&IApplicationProxy::GetDebugFunctions>, "GetDebugFunctions"} + ); + WindowSystem& m_window_system; + Kernel::KProcess* const m_process; + const std::shared_ptr m_applet; +}; + +class IApplicationProxyService final : public ServiceFramework { +public: + explicit IApplicationProxyService(Core::System& system_, + WindowSystem& window_system) + : ServiceFramework{system_, "appletOE"}, m_window_system{window_system} { + } + + ~IApplicationProxyService() override = default; + + Result OpenApplicationProxy( + Out> out_application_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_DEBUG(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid)) { + *out_application_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } + } + + std::shared_ptr GetAppletFromProcessId(ProcessId process_id) { + return m_window_system.GetByAppletResourceUserId(process_id.pid); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IApplicationProxyService::OpenApplicationProxy>, "OpenApplicationProxy"} + ); + WindowSystem& m_window_system; +}; + +class IAppletCommonFunctions final : public ServiceFramework { +public: + explicit IAppletCommonFunctions(Core::System& system_, std::shared_ptr applet_) : ServiceFramework{system_, "IAppletCommonFunctions"}, applet{std::move(applet_)} {} + ~IAppletCommonFunctions() override = default; + + Result SetHomeButtonDoubleClickEnabled( + bool home_button_double_click_enabled) { + LOG_WARNING(Service_AM, "(STUBBED) called, home_button_double_click_enabled={}", home_button_double_click_enabled); + R_SUCCEED(); + } + + Result GetHomeButtonDoubleClickEnabled( + Out out_home_button_double_click_enabled) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_home_button_double_click_enabled = false; + R_SUCCEED(); + } + + Result SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height) { + LOG_DEBUG(Service_AM, "(STUBBED) called, x={}, y={}, width={}, height={}", x, y, width, height); + std::scoped_lock lk{applet->lock}; + applet->display_magnification = Common::Rectangle{x, y, x + width, y + height}; + R_SUCCEED(); + } + + Result SetCpuBoostRequestPriority(s32 priority) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + std::scoped_lock lk{applet->lock}; + applet->cpu_boost_request_priority = priority; + R_SUCCEED(); + } + + Result GetCurrentApplicationId(Out out_application_id) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_application_id = FileSys::GetBaseTitleID(system.GetApplicationProcessProgramID()); + R_SUCCEED(); + } + + Result SetGpuTimeSliceBoost(s64 time_span) { + LOG_WARNING(Service_AM, "(STUBBED) called, time_span={}", time_span); + R_SUCCEED(); + } + + Result Unknown350(Out out_unknown) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_unknown = 0; + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "SetTerminateResult"}, + FunctionInfo{10, nullptr, "ReadThemeStorage"}, + FunctionInfo{11, nullptr, "WriteThemeStorage"}, + FunctionInfo{20, nullptr, "PushToAppletBoundChannel"}, + FunctionInfo{21, nullptr, "TryPopFromAppletBoundChannel"}, + FunctionInfo{40, nullptr, "GetDisplayLogicalResolution"}, + FunctionInfo{42, D<&IAppletCommonFunctions::SetDisplayMagnification>, "SetDisplayMagnification"}, + FunctionInfo{50, D<&IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled>, "SetHomeButtonDoubleClickEnabled"}, + FunctionInfo{51, D<&IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled>, "GetHomeButtonDoubleClickEnabled"}, + FunctionInfo{52, nullptr, "IsHomeButtonShortPressedBlocked"}, + FunctionInfo{60, nullptr, "IsVrModeCurtainRequired"}, + FunctionInfo{61, nullptr, "IsSleepRequiredByHighTemperature"}, + FunctionInfo{62, nullptr, "IsSleepRequiredByLowBattery"}, + FunctionInfo{70, D<&IAppletCommonFunctions::SetCpuBoostRequestPriority>, "SetCpuBoostRequestPriority"}, + FunctionInfo{80, nullptr, "SetHandlingCaptureButtonShortPressedMessageEnabledForApplet"}, + FunctionInfo{81, nullptr, "SetHandlingCaptureButtonLongPressedMessageEnabledForApplet"}, + FunctionInfo{90, nullptr, "OpenNamedChannelAsParent"}, + FunctionInfo{91, nullptr, "OpenNamedChannelAsChild"}, + FunctionInfo{100, nullptr, "SetApplicationCoreUsageMode"}, + FunctionInfo{300, D<&IAppletCommonFunctions::GetCurrentApplicationId>, "GetCurrentApplicationId"}, + FunctionInfo{310, nullptr, "IsSystemAppletHomeMenu", MakeVersionGate({19,0,0})}, + FunctionInfo{320, D<&IAppletCommonFunctions::SetGpuTimeSliceBoost>, "SetGpuTimeSliceBoost", MakeVersionGate({19,0,0})}, + FunctionInfo{321, nullptr, "SetGpuTimeSliceBoostDueToApplication", MakeVersionGate({19,0,0})}, + FunctionInfo{350, D<&IAppletCommonFunctions::Unknown350>, "Unknown350", MakeVersionGate({20,0,0})} + ); + const std::shared_ptr applet; +}; + +class ISystemAppletProxy final : public ServiceFramework { +public: + explicit ISystemAppletProxy(Core::System& system_, std::shared_ptr applet, Kernel::KProcess* process, WindowSystem& window_system) + : ServiceFramework{system_, "ISystemAppletProxy"}, + m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { + } + + ~ISystemAppletProxy() override = default; + + Result GetAudioController( + Out> out_audio_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_audio_controller = std::make_shared(system); + R_SUCCEED(); + } + + Result GetDisplayController( + Out> out_display_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_display_controller = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetProcessWindingController( + Out> out_process_winding_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_process_winding_controller = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetDebugFunctions( + Out> out_debug_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_debug_functions = std::make_shared(system); + R_SUCCEED(); + } + + Result GetWindowController( + Out> out_window_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_window_controller = std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result GetSelfController( + Out> out_self_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_self_controller = std::make_shared(system, m_applet, m_process); + R_SUCCEED(); + } + + Result GetCommonStateGetter( + Out> out_common_state_getter) { + LOG_DEBUG(Service_AM, "called"); + *out_common_state_getter = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetLibraryAppletCreator( + Out> out_library_applet_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_creator = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result GetApplicationCreator( + Out> out_application_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_application_creator = std::make_shared(system, m_window_system); + R_SUCCEED(); + } + + Result GetAppletCommonFunctions( + Out> out_applet_common_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_applet_common_functions = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetHomeMenuFunctions( + Out> out_home_menu_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_home_menu_functions = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result GetGlobalStateController( + Out> out_global_state_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_global_state_controller = std::make_shared(system); + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ISystemAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, + FunctionInfo{1, D<&ISystemAppletProxy::GetSelfController>, "GetSelfController"}, + FunctionInfo{2, D<&ISystemAppletProxy::GetWindowController>, "GetWindowController"}, + FunctionInfo{3, D<&ISystemAppletProxy::GetAudioController>, "GetAudioController"}, + FunctionInfo{4, D<&ISystemAppletProxy::GetDisplayController>, "GetDisplayController"}, + FunctionInfo{10, D<&ISystemAppletProxy::GetProcessWindingController>, "GetProcessWindingController"}, + FunctionInfo{11, D<&ISystemAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, + FunctionInfo{20, D<&ISystemAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"}, + FunctionInfo{21, D<&ISystemAppletProxy::GetGlobalStateController>, "GetGlobalStateController"}, + FunctionInfo{22, D<&ISystemAppletProxy::GetApplicationCreator>, "GetApplicationCreator"}, + FunctionInfo{23, D<&ISystemAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"}, + FunctionInfo{1000, D<&ISystemAppletProxy::GetDebugFunctions>, "GetDebugFunctions"} + ); + WindowSystem& m_window_system; + Kernel::KProcess* const m_process; + const std::shared_ptr m_applet; +}; + +static AppletIdentityInfo GetCallerIdentity(Applet& applet) { + if (const auto caller_applet = applet.caller_applet.lock(); caller_applet) { + // TODO: is this actually the application ID? + return { + .applet_id = caller_applet->applet_id, + .application_id = caller_applet->program_id, + }; + } else { + return { + .applet_id = AppletId::QLaunch, + .application_id = 0x0100000000001000ull, + }; + } +} + +class ILibraryAppletSelfAccessor final : public ServiceFramework { +public: + ILibraryAppletSelfAccessor(Core::System& system_, + std::shared_ptr applet) + : ServiceFramework{system_, "ILibraryAppletSelfAccessor"}, m_applet{std::move(applet)}, + m_broker{m_applet->caller_applet_broker} { + } + + ~ILibraryAppletSelfAccessor() = default; + + Result PopInData(Out> out_storage) { + LOG_INFO(Service_AM, "called"); + R_RETURN(m_broker->GetInData().Pop(system.Kernel(), out_storage)); + } + + Result PushOutData(SharedPointer storage) { + LOG_INFO(Service_AM, "called"); + m_broker->GetOutData().Push(system.Kernel(), storage); + R_SUCCEED(); + } + + Result PopInteractiveInData(Out> out_storage) { + LOG_INFO(Service_AM, "called"); + R_RETURN(m_broker->GetInteractiveInData().Pop(system.Kernel(), out_storage)); + } + + Result PushInteractiveOutData(SharedPointer storage) { + LOG_INFO(Service_AM, "called"); + m_broker->GetInteractiveOutData().Push(system.Kernel(), storage); + R_SUCCEED(); + } + + Result GetPopInDataEvent( + OutCopyHandle out_event) { + LOG_INFO(Service_AM, "called"); + *out_event = m_broker->GetInData().GetEvent(); + R_SUCCEED(); + } + + Result GetPopInteractiveInDataEvent( + OutCopyHandle out_event) { + LOG_INFO(Service_AM, "called"); + *out_event = m_broker->GetInteractiveInData().GetEvent(); + R_SUCCEED(); + } + + Result GetLibraryAppletInfo( + Out out_library_applet_info) { + LOG_INFO(Service_AM, "called"); + *out_library_applet_info = { + .applet_id = m_applet->applet_id, + .library_applet_mode = m_applet->library_applet_mode, + }; + R_SUCCEED(); + } + + Result GetMainAppletIdentityInfo( + Out out_identity_info) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_identity_info = { + .applet_id = AppletId::QLaunch, + .application_id = 0x0100000000001000ull, + }; + R_SUCCEED(); + } + + Result CanUseApplicationCore(Out out_can_use_application_core) { + // TODO: This appears to read the NPDM from state and check the core mask of the applet. + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_can_use_application_core = false; + R_SUCCEED(); + } + + Result GetMainAppletApplicationControlProperty( + OutLargeData, BufferAttr_HipcMapAlias> out_nacp) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + + // TODO: this should be the main applet, not the caller applet + const auto application = GetCallerIdentity(*m_applet); + std::vector nacp; + const auto result = + system.GetARPManager().GetControlProperty(&nacp, application.application_id); + + if (R_SUCCEEDED(result)) { + std::memcpy(out_nacp->data(), nacp.data(), (std::min)(nacp.size(), out_nacp->size())); + } + + R_RETURN(result); + } + + Result GetMainAppletStorageId(Out out_storage_id) { + LOG_INFO(Service_AM, "(STUBBED) called"); + *out_storage_id = FileSys::StorageId::NandUser; + R_SUCCEED(); + } + + Result ExitProcessAndReturn() { + LOG_INFO(Service_AM, "called"); + + if (const auto caller_applet = m_applet->caller_applet.lock(); caller_applet) { + m_applet->process->Terminate(); + } else { + system.GetUserChannel() = m_applet->user_channel_launch_parameter; + system.ExecuteProgram(0); + } + + R_SUCCEED(); + } + + Result GetCallerAppletIdentityInfo( + Out out_identity_info) { + LOG_INFO(Service_AM, "called"); + *out_identity_info = GetCallerIdentity(*m_applet); + R_SUCCEED(); + } + + Result GetCallerAppletIdentityInfoStack( + Out out_count, OutArray out_identity_info) { + LOG_INFO(Service_AM, "called"); + + std::shared_ptr applet = m_applet; + *out_count = 0; + + do { + if (*out_count >= static_cast(out_identity_info.size())) { + break; + } + out_identity_info[(*out_count)++] = GetCallerIdentity(*applet); + } while ((applet = applet->caller_applet.lock())); + + R_SUCCEED(); + } + + Result GetDesirableKeyboardLayout(Out out_desirable_layout) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_desirable_layout = 0; + R_SUCCEED(); + } + + Result ReportVisibleError(ErrorCode error_code) { + LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category, + error_code.number); + R_SUCCEED(); + } + + Result ReportVisibleErrorWithErrorContext( + ErrorCode error_code, InLargeData error_context) { + LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category, + error_code.number); + R_SUCCEED(); + } + + Result UnpopInData(SharedPointer storage) { + LOG_INFO(Service_AM, "called"); + m_broker->GetInData().Unpop(system.Kernel(), storage); + R_SUCCEED(); + } + + Result GetMainAppletApplicationDesiredLanguage( + Out out_desired_language) { + // FIXME: this is copied from IApplicationFunctions::GetDesiredLanguage + // FIXME: all of this stuff belongs to ns + auto identity = GetCallerIdentity(*m_applet); + + // TODO(bunnei): This should be configurable + LOG_DEBUG(Service_AM, "called"); + + // Get supported languages from NACP, if possible + // Default to 0 (all languages supported) + u32 supported_languages = 0; + + const auto res = FileSys::PatchManager::GetMetadataFromBaseOrUpdate(system, identity.application_id); + + if (res.first != nullptr) { + supported_languages = res.first->GetSupportedLanguages(); + } + + // Call IApplicationManagerInterface implementation. + auto& service_manager = system.ServiceManager(); + auto ns_am2 = service_manager.GetService("ns:am2"); + + std::shared_ptr app_man; + R_TRY(ns_am2->GetApplicationManagerInterface(&app_man)); + + // Get desired application language + NS::ApplicationLanguage desired_language{}; + R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages)); + + // Convert to settings language code. + u64 language_code{}; + R_TRY(app_man->ConvertApplicationLanguageToLanguageCode(&language_code, desired_language)); + + LOG_DEBUG(Service_AM, "got desired_language={:016X}", language_code); + + *out_desired_language = language_code; + R_SUCCEED(); + } + + Result GetCurrentApplicationId(Out out_application_id) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + + // TODO: this should be the main applet, not the caller applet + const auto main_applet = GetCallerIdentity(*m_applet); + *out_application_id = main_applet.application_id; + + R_SUCCEED(); + } + + Result GetMainAppletAvailableUsers( + Out out_can_select_any_user, Out out_users_count, + OutArray out_users) { + const Service::Account::ProfileManager manager{}; + + *out_can_select_any_user = false; + *out_users_count = -1; + + LOG_INFO(Service_AM, "called"); + + if (manager.GetUserCount() > 0) { + *out_can_select_any_user = true; + *out_users_count = static_cast(manager.GetUserCount()); + + const auto users = manager.GetAllUsers(); + for (size_t i = 0; i < users.size() && i < out_users.size(); i++) { + out_users[i] = users[i]; + } + } + + R_SUCCEED(); + } + + Result ShouldSetGpuTimeSliceManually( + Out out_should_set_gpu_time_slice_manually) { + LOG_INFO(Service_AM, "(STUBBED) called"); + *out_should_set_gpu_time_slice_manually = false; + R_SUCCEED(); + } + + Result GetLibraryAppletInfoEx( + Out out_library_applet_info) { + LOG_INFO(Service_AM, "called"); + *out_library_applet_info = { + .applet_id = m_applet->applet_id, + .library_applet_mode = m_applet->library_applet_mode, + }; + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ILibraryAppletSelfAccessor::PopInData>, "PopInData"}, + FunctionInfo{1, D<&ILibraryAppletSelfAccessor::PushOutData>, "PushOutData"}, + FunctionInfo{2, D<&ILibraryAppletSelfAccessor::PopInteractiveInData>, "PopInteractiveInData"}, + FunctionInfo{3, D<&ILibraryAppletSelfAccessor::PushInteractiveOutData>, "PushInteractiveOutData"}, + FunctionInfo{5, D<&ILibraryAppletSelfAccessor::GetPopInDataEvent>, "GetPopInDataEvent"}, + FunctionInfo{6, D<&ILibraryAppletSelfAccessor::GetPopInteractiveInDataEvent>, "GetPopInteractiveInDataEvent"}, + FunctionInfo{10, D<&ILibraryAppletSelfAccessor::ExitProcessAndReturn>, "ExitProcessAndReturn"}, + FunctionInfo{11, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"}, + FunctionInfo{12, D<&ILibraryAppletSelfAccessor::GetMainAppletIdentityInfo>, "GetMainAppletIdentityInfo"}, + FunctionInfo{13, D<&ILibraryAppletSelfAccessor::CanUseApplicationCore>, "CanUseApplicationCore"}, + FunctionInfo{14, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo>, "GetCallerAppletIdentityInfo"}, + FunctionInfo{15, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationControlProperty>, "GetMainAppletApplicationControlProperty"}, + FunctionInfo{16, D<&ILibraryAppletSelfAccessor::GetMainAppletStorageId>, "GetMainAppletStorageId"}, + FunctionInfo{17, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfoStack>, "GetCallerAppletIdentityInfoStack"}, + FunctionInfo{18, nullptr, "GetNextReturnDestinationAppletIdentityInfo"}, + FunctionInfo{19, D<&ILibraryAppletSelfAccessor::GetDesirableKeyboardLayout>, "GetDesirableKeyboardLayout"}, + FunctionInfo{20, nullptr, "PopExtraStorage"}, + FunctionInfo{25, nullptr, "GetPopExtraStorageEvent"}, + FunctionInfo{30, D<&ILibraryAppletSelfAccessor::UnpopInData>, "UnpopInData"}, + FunctionInfo{31, nullptr, "UnpopExtraStorage"}, + FunctionInfo{40, nullptr, "GetIndirectLayerProducerHandle"}, + FunctionInfo{50, D<&ILibraryAppletSelfAccessor::ReportVisibleError>, "ReportVisibleError"}, + FunctionInfo{51, D<&ILibraryAppletSelfAccessor::ReportVisibleErrorWithErrorContext>, "ReportVisibleErrorWithErrorContext"}, + FunctionInfo{60, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage>, "GetMainAppletApplicationDesiredLanguage"}, + FunctionInfo{70, D<&ILibraryAppletSelfAccessor::GetCurrentApplicationId>, "GetCurrentApplicationId"}, + FunctionInfo{80, nullptr, "RequestExitToSelf"}, + FunctionInfo{90, nullptr, "CreateApplicationAndPushAndRequestToLaunch"}, + FunctionInfo{100, nullptr, "CreateGameMovieTrimmer"}, + FunctionInfo{101, nullptr, "ReserveResourceForMovieOperation"}, + FunctionInfo{102, nullptr, "UnreserveResourceForMovieOperation"}, + FunctionInfo{110, D<&ILibraryAppletSelfAccessor::GetMainAppletAvailableUsers>, "GetMainAppletAvailableUsers"}, + FunctionInfo{120, nullptr, "GetLaunchStorageInfoForDebug"}, + FunctionInfo{130, nullptr, "GetGpuErrorDetectedSystemEvent"}, + FunctionInfo{140, nullptr, "SetApplicationMemoryReservation"}, + FunctionInfo{150, D<&ILibraryAppletSelfAccessor::ShouldSetGpuTimeSliceManually>, "ShouldSetGpuTimeSliceManually"}, + FunctionInfo{160, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfoEx>, "GetLibraryAppletInfoEx"} + ); + const std::shared_ptr m_applet; + const std::shared_ptr m_broker; +}; + +class ILibraryAppletProxy final : public ServiceFramework { +public: + explicit ILibraryAppletProxy(Core::System& system_, std::shared_ptr applet, + Kernel::KProcess* process, WindowSystem& window_system) + : ServiceFramework{system_, "ILibraryAppletProxy"}, + m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { + } + ~ILibraryAppletProxy() override = default; + + Result GetAudioController( + Out> out_audio_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_audio_controller = std::make_shared(system); + R_SUCCEED(); + } + + Result GetDisplayController( + Out> out_display_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_display_controller = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetProcessWindingController( + Out> out_process_winding_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_process_winding_controller = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetDebugFunctions( + Out> out_debug_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_debug_functions = std::make_shared(system); + R_SUCCEED(); + } + + Result GetWindowController( + Out> out_window_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_window_controller = std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result GetSelfController( + Out> out_self_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_self_controller = std::make_shared(system, m_applet, m_process); + R_SUCCEED(); + } + + Result GetCommonStateGetter( + Out> out_common_state_getter) { + LOG_DEBUG(Service_AM, "called"); + *out_common_state_getter = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetLibraryAppletCreator( + Out> out_library_applet_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_creator = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result OpenLibraryAppletSelfAccessor( + Out> out_library_applet_self_accessor) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_self_accessor = + std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetAppletCommonFunctions( + Out> out_applet_common_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_applet_common_functions = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetHomeMenuFunctions( + Out> out_home_menu_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_home_menu_functions = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result GetGlobalStateController( + Out> out_global_state_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_global_state_controller = std::make_shared(system); + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ILibraryAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, + FunctionInfo{1, D<&ILibraryAppletProxy::GetSelfController>, "GetSelfController"}, + FunctionInfo{2, D<&ILibraryAppletProxy::GetWindowController>, "GetWindowController"}, + FunctionInfo{3, D<&ILibraryAppletProxy::GetAudioController>, "GetAudioController"}, + FunctionInfo{4, D<&ILibraryAppletProxy::GetDisplayController>, "GetDisplayController"}, + FunctionInfo{10, D<&ILibraryAppletProxy::GetProcessWindingController>, "GetProcessWindingController"}, + FunctionInfo{11, D<&ILibraryAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, + FunctionInfo{20, D<&ILibraryAppletProxy::OpenLibraryAppletSelfAccessor>, "OpenLibraryAppletSelfAccessor"}, + FunctionInfo{21, D<&ILibraryAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"}, + FunctionInfo{22, D<&ILibraryAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"}, + FunctionInfo{23, D<&ILibraryAppletProxy::GetGlobalStateController>, "GetGlobalStateController"}, + FunctionInfo{1000, D<&ILibraryAppletProxy::GetDebugFunctions>, "GetDebugFunctions"} + ); + WindowSystem& m_window_system; + Kernel::KProcess* const m_process; + const std::shared_ptr m_applet; +}; + +class IOverlayAppletProxy final : public ServiceFramework { +public: + explicit IOverlayAppletProxy(Core::System &system_, std::shared_ptr applet, + Kernel::KProcess *process, WindowSystem &window_system) + : ServiceFramework{system_, "IOverlayAppletProxy"}, + m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { + } + + ~IOverlayAppletProxy() override = default; + + Result GetCommonStateGetter( + Out > out_common_state_getter) { + LOG_DEBUG(Service_AM, "called"); + *out_common_state_getter = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetSelfController( + Out > out_self_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_self_controller = std::make_shared(system, m_applet, m_process); + R_SUCCEED(); + } + + Result GetWindowController( + Out > out_window_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_window_controller = std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result GetAudioController( + Out > out_audio_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_audio_controller = std::make_shared(system); + R_SUCCEED(); + } + + Result GetDisplayController( + Out > out_display_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_display_controller = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetProcessWindingController( + Out > out_process_winding_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_process_winding_controller = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetLibraryAppletCreator( + Out > out_library_applet_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_creator = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result GetOverlayFunctions( + Out > out_overlay_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_overlay_functions = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetAppletCommonFunctions( + Out > out_applet_common_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_applet_common_functions = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result GetGlobalStateController( + Out > out_global_state_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_global_state_controller = std::make_shared(system); + R_SUCCEED(); + } + + Result GetDebugFunctions( + Out > out_debug_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_debug_functions = std::make_shared(system); + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IOverlayAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, + FunctionInfo{1, D<&IOverlayAppletProxy::GetSelfController>, "GetSelfController"}, + FunctionInfo{2, D<&IOverlayAppletProxy::GetWindowController>, "GetWindowController"}, + FunctionInfo{3, D<&IOverlayAppletProxy::GetAudioController>, "GetAudioController"}, + FunctionInfo{4, D<&IOverlayAppletProxy::GetDisplayController>, "GetDisplayController"}, + FunctionInfo{10, D<&IOverlayAppletProxy::GetProcessWindingController>, "GetProcessWindingController"}, + FunctionInfo{11, D<&IOverlayAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, + FunctionInfo{20, D<&IOverlayAppletProxy::GetOverlayFunctions>, "GetOverlayFunctions"}, + FunctionInfo{21, D<&IOverlayAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"}, + FunctionInfo{23, D<&IOverlayAppletProxy::GetGlobalStateController>, "GetGlobalStateController"}, + FunctionInfo{1000, D<&IOverlayAppletProxy::GetDebugFunctions>, "GetDebugFunctions"} + ); + WindowSystem& m_window_system; + Kernel::KProcess* const m_process; + const std::shared_ptr m_applet; +}; + +static bool ShouldCreateGuestApplet(AppletId applet_id) { +#define X(Name, name) \ + if (applet_id == AppletId::Name && \ + Settings::values.name##_applet_mode.GetValue() != Settings::AppletMode::LLE) { \ + return false; \ + } + + X(Cabinet, cabinet) + X(Controller, controller) + X(DataErase, data_erase) + X(Error, error) + X(NetConnect, net_connect) + X(ProfileSelect, player_select) + X(SoftwareKeyboard, swkbd) + X(MiiEdit, mii_edit) + X(Web, web) + X(Shop, shop) + X(PhotoViewer, photo_viewer) + X(OfflineWeb, offline_web) + X(LoginShare, login_share) + X(WebAuth, wifi_web_auth) + X(MyPage, my_page) + +#undef X + + return true; +} + +static AppletProgramId AppletIdToProgramId(AppletId applet_id) { + switch (applet_id) { + case AppletId::OverlayDisplay: + return AppletProgramId::OverlayDisplay; + case AppletId::QLaunch: + return AppletProgramId::QLaunch; + case AppletId::Starter: + return AppletProgramId::Starter; + case AppletId::Auth: + return AppletProgramId::Auth; + case AppletId::Cabinet: + return AppletProgramId::Cabinet; + case AppletId::Controller: + return AppletProgramId::Controller; + case AppletId::DataErase: + return AppletProgramId::DataErase; + case AppletId::Error: + return AppletProgramId::Error; + case AppletId::NetConnect: + return AppletProgramId::NetConnect; + case AppletId::ProfileSelect: + return AppletProgramId::ProfileSelect; + case AppletId::SoftwareKeyboard: + return AppletProgramId::SoftwareKeyboard; + case AppletId::MiiEdit: + return AppletProgramId::MiiEdit; + case AppletId::Web: + return AppletProgramId::Web; + case AppletId::Shop: + return AppletProgramId::Shop; + case AppletId::PhotoViewer: + return AppletProgramId::PhotoViewer; + case AppletId::Settings: + return AppletProgramId::Settings; + case AppletId::OfflineWeb: + return AppletProgramId::OfflineWeb; + case AppletId::LoginShare: + return AppletProgramId::LoginShare; + case AppletId::WebAuth: + return AppletProgramId::WebAuth; + case AppletId::MyPage: + return AppletProgramId::MyPage; + default: + return static_cast(0); + } +} + +static std::shared_ptr CreateGuestApplet(Core::System& system, + WindowSystem& window_system, + std::shared_ptr caller_applet, + AppletId applet_id, + LibraryAppletMode mode) { + const auto program_id = static_cast(AppletIdToProgramId(applet_id)); + if (program_id == 0) { + // Unknown applet + return {}; + } + + auto process = CreateProcess(system, program_id, 1, HLE::ApiVersion::HOS_VERSION_MAJOR); + if (process) { + const auto applet = std::make_shared(system, std::move(process), false); + applet->program_id = program_id; + applet->applet_id = applet_id; + applet->type = AppletType::LibraryApplet; + applet->library_applet_mode = mode; + applet->window_visible = mode != LibraryAppletMode::AllForegroundInitiallyHidden; + + auto broker = std::make_shared(system); + applet->caller_applet = caller_applet; + applet->caller_applet_broker = broker; + { + std::scoped_lock lk{caller_applet->lock}; + caller_applet->child_applets.push_back(applet); + } + window_system.TrackApplet(applet, false); + return std::make_shared(system, broker, applet); + } + // Couldn't initialize the guest process + return {}; +} + +static std::shared_ptr CreateFrontendApplet(Core::System& system, + WindowSystem& window_system, + std::shared_ptr caller_applet, + AppletId applet_id, + LibraryAppletMode mode) { + const auto program_id = static_cast(AppletIdToProgramId(applet_id)); + + auto process = std::make_unique(system); + auto applet = std::make_shared(system, std::move(process), false); + applet->program_id = program_id; + applet->applet_id = applet_id; + applet->type = AppletType::LibraryApplet; + applet->library_applet_mode = mode; + + auto storage = std::make_shared(system); + applet->caller_applet = caller_applet; + applet->caller_applet_broker = storage; + applet->frontend = system.GetFrontendAppletHolder().GetApplet(applet, applet_id, mode); + { + std::scoped_lock lk{caller_applet->lock}; + caller_applet->child_applets.push_back(applet); + } + return std::make_shared(system, storage, applet); +} + +class ILibraryAppletCreator final : public ServiceFramework { +public: + explicit ILibraryAppletCreator(Core::System& system_, std::shared_ptr applet, WindowSystem& window_system) + : ServiceFramework{system_, "ILibraryAppletCreator"} + , m_window_system{window_system}, m_applet{std::move(applet)} { + } + ~ILibraryAppletCreator() override = default; + + Result CreateLibraryApplet( + Out> out_library_applet_accessor, AppletId applet_id, + LibraryAppletMode library_applet_mode) { + LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={}", applet_id, + library_applet_mode); + + std::shared_ptr library_applet; + if (ShouldCreateGuestApplet(applet_id)) { + library_applet = + CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); + } + if (!library_applet) { + library_applet = + CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); + } + if (!library_applet) { + LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id); + R_THROW(ResultUnknown); + } + + // Applet is created, can now be launched. + m_applet->library_applet_launchable_event.Signal(system.Kernel()); + *out_library_applet_accessor = library_applet; + R_SUCCEED(); + } + + Result CreateLibraryAppletEx( + Out> out_library_applet_accessor, AppletId applet_id, + LibraryAppletMode library_applet_mode, u64 thread_id) { + LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={} thread_id={}", applet_id, + library_applet_mode, thread_id); + + std::shared_ptr library_applet; + if (ShouldCreateGuestApplet(applet_id)) { + library_applet = + CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); + } + if (!library_applet) { + library_applet = + CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); + } + if (!library_applet) { + LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id); + R_THROW(ResultUnknown); + } + + // Applet is created, can now be launched. + m_applet->library_applet_launchable_event.Signal(system.Kernel()); + *out_library_applet_accessor = library_applet; + R_SUCCEED(); + } + + Result CreateStorage(Out> out_storage, s64 size) { + LOG_DEBUG(Service_AM, "called, size={}", size); + + if (size <= 0) { + LOG_ERROR(Service_AM, "size is less than or equal to 0"); + R_THROW(ResultUnknown); + } + + *out_storage = std::make_shared(system, AM::CreateStorage(std::vector(size))); + R_SUCCEED(); + } + + Result CreateTransferMemoryStorage( + Out> out_storage, bool is_writable, s64 size, + InCopyHandle transfer_memory_handle) { + LOG_DEBUG(Service_AM, "called, is_writable={} size={}", is_writable, size); + + if (size <= 0) { + LOG_ERROR(Service_AM, "size is less than or equal to 0"); + R_THROW(ResultUnknown); + } + + if (!transfer_memory_handle) { + LOG_ERROR(Service_AM, "transfer_memory_handle is null"); + R_THROW(ResultUnknown); + } + + *out_storage = std::make_shared( + system, AM::CreateTransferMemoryStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(), + transfer_memory_handle.Get(), is_writable, size)); + R_SUCCEED(); + } + + Result CreateHandleStorage( + Out> out_storage, s64 size, + InCopyHandle transfer_memory_handle) { + LOG_DEBUG(Service_AM, "called, size={}", size); + + if (size <= 0) { + LOG_ERROR(Service_AM, "size is less than or equal to 0"); + R_THROW(ResultUnknown); + } + + if (!transfer_memory_handle) { + LOG_ERROR(Service_AM, "transfer_memory_handle is null"); + R_THROW(ResultUnknown); + } + + *out_storage = std::make_shared( + system, AM::CreateHandleStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(), + transfer_memory_handle.Get(), size)); + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ILibraryAppletCreator::CreateLibraryApplet>, "CreateLibraryApplet"}, + FunctionInfo{1, nullptr, "TerminateAllLibraryApplets"}, + FunctionInfo{2, nullptr, "AreAnyLibraryAppletsLeft"}, + FunctionInfo{3, D<&ILibraryAppletCreator::CreateLibraryAppletEx>, "CreateLibraryAppletEx"}, + FunctionInfo{10, D<&ILibraryAppletCreator::CreateStorage>, "CreateStorage"}, + FunctionInfo{11, D<&ILibraryAppletCreator::CreateTransferMemoryStorage>, "CreateTransferMemoryStorage"}, + FunctionInfo{12, D<&ILibraryAppletCreator::CreateHandleStorage>, "CreateHandleStorage"} + ); + WindowSystem& m_window_system; + const std::shared_ptr m_applet; +}; + +class IAllSystemAppletProxiesService final + : public ServiceFramework { +public: + explicit IAllSystemAppletProxiesService(Core::System& system_, WindowSystem& window_system) + : ServiceFramework{system_, "appletAE"}, m_window_system{window_system} { + } + + ~IAllSystemAppletProxiesService() override = default; + + Result OpenSystemAppletProxy( + Out> out_system_applet_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_DEBUG(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid); applet) { + *out_system_applet_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } + } + + Result OpenLibraryAppletProxy( + Out> out_library_applet_proxy, ClientProcessId pid, + InCopyHandle process_handle, + InLargeData attribute) { + LOG_DEBUG(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid); applet) { + *out_library_applet_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } + } + + Result OpenOverlayAppletProxy( + Out> out_overlay_applet_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_WARNING(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid); applet) { + *out_overlay_applet_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } + } + + Result OpenSystemApplicationProxy( + Out> out_system_application_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_DEBUG(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid); applet) { + *out_system_application_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } + } + + Result OpenLibraryAppletProxyOld( + Out> out_library_applet_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_DEBUG(Service_AM, "called"); + + AppletAttribute attribute{}; + R_RETURN(this->OpenLibraryAppletProxy(out_library_applet_proxy, pid, process_handle, attribute)); + } + + Result GetSystemProcessCommonFunctions() { + LOG_DEBUG(Service_AM, "(STUBBED) called."); + // TODO (jarrodnorwell) + R_SUCCEED(); + } + + Result GetAppletAlternativeFunctions() { + LOG_DEBUG(Service_AM, "(STUBBED) called."); + // TODO (maufeat) + R_SUCCEED(); + } + + std::shared_ptr GetAppletFromProcessId(ProcessId process_id) { + return m_window_system.GetByAppletResourceUserId(process_id.pid); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{100, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxy"}, + FunctionInfo{110, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxyEx"}, + FunctionInfo{200, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld>, "OpenLibraryAppletProxyOld"}, + FunctionInfo{201, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxy>, "OpenLibraryAppletProxy"}, + FunctionInfo{300, D<&IAllSystemAppletProxiesService::OpenOverlayAppletProxy>, "OpenOverlayAppletProxy"}, + FunctionInfo{350, D<&IAllSystemAppletProxiesService::OpenSystemApplicationProxy>, "OpenSystemApplicationProxy"}, + FunctionInfo{400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"}, + FunctionInfo{410, nullptr, "GetSystemAppletControllerForDebug"}, + FunctionInfo{450, D<&IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions>, "GetSystemProcessCommonFunctions", MakeVersionGate({19,0,0})}, + FunctionInfo{460, D<&IAllSystemAppletProxiesService::GetAppletAlternativeFunctions>, "GetAppletAlternativeFunctions", MakeVersionGate({20,0,0})}, + FunctionInfo{1000, nullptr, "GetDebugFunctions"} + ); + WindowSystem& m_window_system; +}; + void LoopProcess(Core::System& system) { WindowSystem window_system(system); ButtonPoller button_poller(system, window_system); @@ -18,10 +1345,8 @@ void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService( - "appletAE", std::make_shared(system, window_system)); - server_manager->RegisterNamedService( - "appletOE", std::make_shared(system, window_system)); + server_manager->RegisterNamedService("appletAE", std::make_shared(system, window_system)); + server_manager->RegisterNamedService("appletOE", std::make_shared(system, window_system)); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp b/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp deleted file mode 100644 index 437032c2f4..0000000000 --- a/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/core.h" -#include "core/hle/service/am/applet_manager.h" -#include "core/hle/service/am/service/all_system_applet_proxies_service.h" -#include "core/hle/service/am/service/application_proxy.h" -#include "core/hle/service/am/service/library_applet_proxy.h" -#include "core/hle/service/am/service/system_applet_proxy.h" -#include "core/hle/service/am/service/overlay_applet_proxy.h" -#include "core/hle/service/am/window_system.h" -#include "core/hle/service/cmif_serialization.h" - -namespace Service::AM { - -IAllSystemAppletProxiesService::IAllSystemAppletProxiesService(Core::System& system_, - WindowSystem& window_system) - : ServiceFramework{system_, "appletAE"}, m_window_system{window_system} { - // clang-format off - static const FunctionInfo functions[] = { - {100, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxy"}, - {110, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxyEx"}, - {200, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld>, "OpenLibraryAppletProxyOld"}, - {201, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxy>, "OpenLibraryAppletProxy"}, - {300, D<&IAllSystemAppletProxiesService::OpenOverlayAppletProxy>, "OpenOverlayAppletProxy"}, - {350, D<&IAllSystemAppletProxiesService::OpenSystemApplicationProxy>, "OpenSystemApplicationProxy"}, - {400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"}, - {410, nullptr, "GetSystemAppletControllerForDebug"}, - {450, D<&IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions>, "GetSystemProcessCommonFunctions"}, // 19.0.0+ - {460, D<&IAllSystemAppletProxiesService::GetAppletAlternativeFunctions>, "GetAppletAlternativeFunctions"}, // 20.0.0+ - {1000, nullptr, "GetDebugFunctions"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -IAllSystemAppletProxiesService::~IAllSystemAppletProxiesService() = default; - -Result IAllSystemAppletProxiesService::OpenSystemAppletProxy( - Out> out_system_applet_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_DEBUG(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid); applet) { - *out_system_applet_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } -} - -Result IAllSystemAppletProxiesService::OpenLibraryAppletProxy( - Out> out_library_applet_proxy, ClientProcessId pid, - InCopyHandle process_handle, - InLargeData attribute) { - LOG_DEBUG(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid); applet) { - *out_library_applet_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } -} - -Result IAllSystemAppletProxiesService::OpenOverlayAppletProxy( - Out> out_overlay_applet_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_WARNING(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid); applet) { - *out_overlay_applet_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } -} - -Result IAllSystemAppletProxiesService::OpenSystemApplicationProxy( - Out> out_system_application_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_DEBUG(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid); applet) { - *out_system_application_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } -} - -Result IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld( - Out> out_library_applet_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_DEBUG(Service_AM, "called"); - - AppletAttribute attribute{}; - R_RETURN( - this->OpenLibraryAppletProxy(out_library_applet_proxy, pid, process_handle, attribute)); -} - -Result IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions() { - LOG_DEBUG(Service_AM, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - R_SUCCEED(); -} - -Result IAllSystemAppletProxiesService::GetAppletAlternativeFunctions() { - LOG_DEBUG(Service_AM, "(STUBBED) called."); - - // TODO (maufeat) - - R_SUCCEED(); -} - -std::shared_ptr IAllSystemAppletProxiesService::GetAppletFromProcessId( - ProcessId process_id) { - return m_window_system.GetByAppletResourceUserId(process_id.pid); -} - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/all_system_applet_proxies_service.h b/src/core/hle/service/am/service/all_system_applet_proxies_service.h deleted file mode 100644 index 73cb8a09ac..0000000000 --- a/src/core/hle/service/am/service/all_system_applet_proxies_service.h +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" -#include "core/hle/service/am/service/overlay_applet_proxy.h" - -namespace Service { - -namespace AM { - -struct Applet; -struct AppletAttribute; -class IApplicationProxy; -class ILibraryAppletProxy; -class ISystemAppletProxy; -class WindowSystem; - -class IAllSystemAppletProxiesService final - : public ServiceFramework { -public: - explicit IAllSystemAppletProxiesService(Core::System& system_, WindowSystem& window_system); - ~IAllSystemAppletProxiesService() override; - -private: - Result OpenSystemAppletProxy(Out> out_system_applet_proxy, - ClientProcessId pid, - InCopyHandle process_handle); - Result OpenLibraryAppletProxy(Out> out_library_applet_proxy, - ClientProcessId pid, - InCopyHandle process_handle, - InLargeData attribute); - Result OpenOverlayAppletProxy(Out> out_overlay_applet_proxy, - ClientProcessId pid, InCopyHandle process_handle); - Result OpenLibraryAppletProxyOld( - Out> out_library_applet_proxy, ClientProcessId pid, - InCopyHandle process_handle); - Result OpenSystemApplicationProxy( - Out> out_system_application_proxy, ClientProcessId pid, - InCopyHandle process_handle); - Result GetSystemProcessCommonFunctions(); - Result GetAppletAlternativeFunctions(); - -private: - std::shared_ptr GetAppletFromProcessId(ProcessId pid); - - WindowSystem& m_window_system; -}; - -} // namespace AM -} // namespace Service diff --git a/src/core/hle/service/am/service/applet_common_functions.cpp b/src/core/hle/service/am/service/applet_common_functions.cpp deleted file mode 100644 index 5ffec23b3e..0000000000 --- a/src/core/hle/service/am/service/applet_common_functions.cpp +++ /dev/null @@ -1,98 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/core.h" -#include "core/file_sys/common_funcs.h" -#include "core/hle/service/am/applet.h" -#include "core/hle/service/am/service/applet_common_functions.h" -#include "core/hle/service/cmif_serialization.h" - -namespace Service::AM { - -IAppletCommonFunctions::IAppletCommonFunctions(Core::System& system_, - std::shared_ptr applet_) - : ServiceFramework{system_, "IAppletCommonFunctions"}, applet{std::move(applet_)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "SetTerminateResult"}, - {10, nullptr, "ReadThemeStorage"}, - {11, nullptr, "WriteThemeStorage"}, - {20, nullptr, "PushToAppletBoundChannel"}, - {21, nullptr, "TryPopFromAppletBoundChannel"}, - {40, nullptr, "GetDisplayLogicalResolution"}, - {42, D<&IAppletCommonFunctions::SetDisplayMagnification>, "SetDisplayMagnification"}, - {50, D<&IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled>, "SetHomeButtonDoubleClickEnabled"}, - {51, D<&IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled>, "GetHomeButtonDoubleClickEnabled"}, - {52, nullptr, "IsHomeButtonShortPressedBlocked"}, - {60, nullptr, "IsVrModeCurtainRequired"}, - {61, nullptr, "IsSleepRequiredByHighTemperature"}, - {62, nullptr, "IsSleepRequiredByLowBattery"}, - {70, D<&IAppletCommonFunctions::SetCpuBoostRequestPriority>, "SetCpuBoostRequestPriority"}, - {80, nullptr, "SetHandlingCaptureButtonShortPressedMessageEnabledForApplet"}, - {81, nullptr, "SetHandlingCaptureButtonLongPressedMessageEnabledForApplet"}, - {90, nullptr, "OpenNamedChannelAsParent"}, - {91, nullptr, "OpenNamedChannelAsChild"}, - {100, nullptr, "SetApplicationCoreUsageMode"}, - {300, D<&IAppletCommonFunctions::GetCurrentApplicationId>, "GetCurrentApplicationId"}, - {310, nullptr, "IsSystemAppletHomeMenu"}, //19.0.0+ - {320, D<&IAppletCommonFunctions::SetGpuTimeSliceBoost>, "SetGpuTimeSliceBoost"}, //19.0.0+ - {321, nullptr, "SetGpuTimeSliceBoostDueToApplication"}, //19.0.0+ - {350, D<&IAppletCommonFunctions::Unknown350>, "Unknown350"} //20.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); -} - -IAppletCommonFunctions::~IAppletCommonFunctions() = default; - -Result IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled( - bool home_button_double_click_enabled) { - LOG_WARNING(Service_AM, "(STUBBED) called, home_button_double_click_enabled={}", - home_button_double_click_enabled); - R_SUCCEED(); -} - -Result IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled( - Out out_home_button_double_click_enabled) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_home_button_double_click_enabled = false; - R_SUCCEED(); -} - -Result IAppletCommonFunctions::SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height) { - LOG_DEBUG(Service_AM, "(STUBBED) called, x={}, y={}, width={}, height={}", x, y, width, - height); - std::scoped_lock lk{applet->lock}; - applet->display_magnification = Common::Rectangle{x, y, x + width, y + height}; - R_SUCCEED(); -} - -Result IAppletCommonFunctions::SetCpuBoostRequestPriority(s32 priority) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - std::scoped_lock lk{applet->lock}; - applet->cpu_boost_request_priority = priority; - R_SUCCEED(); -} - -Result IAppletCommonFunctions::GetCurrentApplicationId(Out out_application_id) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_application_id = FileSys::GetBaseTitleID(system.GetApplicationProcessProgramID()); - R_SUCCEED(); -} - -Result IAppletCommonFunctions::SetGpuTimeSliceBoost(s64 time_span) { - LOG_WARNING(Service_AM, "(STUBBED) called, time_span={}", time_span); - R_SUCCEED(); -} - -Result IAppletCommonFunctions::Unknown350(Out out_unknown) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_unknown = 0; - R_SUCCEED(); -} - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/applet_common_functions.h b/src/core/hle/service/am/service/applet_common_functions.h deleted file mode 100644 index 696fcd5bd1..0000000000 --- a/src/core/hle/service/am/service/applet_common_functions.h +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Service::AM { - -struct Applet; - -class IAppletCommonFunctions final : public ServiceFramework { -public: - explicit IAppletCommonFunctions(Core::System& system_, std::shared_ptr applet_); - ~IAppletCommonFunctions() override; - -private: - Result SetHomeButtonDoubleClickEnabled(bool home_button_double_click_enabled); - Result GetHomeButtonDoubleClickEnabled(Out out_home_button_double_click_enabled); - Result SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height); - Result SetCpuBoostRequestPriority(s32 priority); - Result GetCurrentApplicationId(Out out_application_id); - Result SetGpuTimeSliceBoost(s64 time_span); - Result Unknown350(Out out_unknown); - - const std::shared_ptr applet; -}; - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/application_accessor.cpp b/src/core/hle/service/am/service/application_accessor.cpp index f357871706..d24c2616dc 100644 --- a/src/core/hle/service/am/service/application_accessor.cpp +++ b/src/core/hle/service/am/service/application_accessor.cpp @@ -18,42 +18,42 @@ namespace Service::AM { +std::optional IApplicationAccessor::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IApplicationAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"}, + FunctionInfo{1, nullptr, "IsCompleted"}, + FunctionInfo{10, D<&IApplicationAccessor::Start>, "Start"}, + FunctionInfo{20, D<&IApplicationAccessor::RequestExit>, "RequestExit"}, + FunctionInfo{25, D<&IApplicationAccessor::Terminate>, "Terminate"}, + FunctionInfo{30, D<&IApplicationAccessor::GetResult>, "GetResult"}, + FunctionInfo{101, D<&IApplicationAccessor::RequestForApplicationToGetForeground>, "RequestForApplicationToGetForeground"}, + FunctionInfo{110, nullptr, "TerminateAllLibraryApplets"}, + FunctionInfo{111, nullptr, "AreAnyLibraryAppletsLeft"}, + FunctionInfo{112, D<&IApplicationAccessor::GetCurrentLibraryApplet>, "GetCurrentLibraryApplet"}, + FunctionInfo{120, nullptr, "GetApplicationId"}, + FunctionInfo{121, D<&IApplicationAccessor::PushLaunchParameter>, "PushLaunchParameter"}, + FunctionInfo{122, D<&IApplicationAccessor::GetApplicationControlProperty>, "GetApplicationControlProperty"}, + FunctionInfo{123, nullptr, "GetApplicationLaunchProperty"}, + FunctionInfo{124, nullptr, "GetApplicationLaunchRequestInfo"}, + FunctionInfo{130, D<&IApplicationAccessor::SetUsers>, "SetUsers"}, + FunctionInfo{131, D<&IApplicationAccessor::CheckRightsEnvironmentAvailable>, "CheckRightsEnvironmentAvailable"}, + FunctionInfo{132, D<&IApplicationAccessor::GetNsRightsEnvironmentHandle>, "GetNsRightsEnvironmentHandle"}, + FunctionInfo{140, nullptr, "GetDesirableUids"}, + FunctionInfo{150, D<&IApplicationAccessor::ReportApplicationExitTimeout>, "ReportApplicationExitTimeout"}, + FunctionInfo{160, nullptr, "SetApplicationAttribute"}, + FunctionInfo{170, nullptr, "HasSaveDataAccessPermission"}, + FunctionInfo{180, nullptr, "PushToFriendInvitationStorageChannel"}, + FunctionInfo{190, nullptr, "PushToNotificationStorageChannel"}, + FunctionInfo{200, nullptr, "RequestApplicationSoftReset"}, + FunctionInfo{201, nullptr, "RestartApplicationTimer"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IApplicationAccessor::IApplicationAccessor(Core::System& system_, std::shared_ptr applet, WindowSystem& window_system) : ServiceFramework{system_, "IApplicationAccessor"}, m_window_system(window_system), m_applet(std::move(applet)) { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IApplicationAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"}, - {1, nullptr, "IsCompleted"}, - {10, D<&IApplicationAccessor::Start>, "Start"}, - {20, D<&IApplicationAccessor::RequestExit>, "RequestExit"}, - {25, D<&IApplicationAccessor::Terminate>, "Terminate"}, - {30, D<&IApplicationAccessor::GetResult>, "GetResult"}, - {101, D<&IApplicationAccessor::RequestForApplicationToGetForeground>, "RequestForApplicationToGetForeground"}, - {110, nullptr, "TerminateAllLibraryApplets"}, - {111, nullptr, "AreAnyLibraryAppletsLeft"}, - {112, D<&IApplicationAccessor::GetCurrentLibraryApplet>, "GetCurrentLibraryApplet"}, - {120, nullptr, "GetApplicationId"}, - {121, D<&IApplicationAccessor::PushLaunchParameter>, "PushLaunchParameter"}, - {122, D<&IApplicationAccessor::GetApplicationControlProperty>, "GetApplicationControlProperty"}, - {123, nullptr, "GetApplicationLaunchProperty"}, - {124, nullptr, "GetApplicationLaunchRequestInfo"}, - {130, D<&IApplicationAccessor::SetUsers>, "SetUsers"}, - {131, D<&IApplicationAccessor::CheckRightsEnvironmentAvailable>, "CheckRightsEnvironmentAvailable"}, - {132, D<&IApplicationAccessor::GetNsRightsEnvironmentHandle>, "GetNsRightsEnvironmentHandle"}, - {140, nullptr, "GetDesirableUids"}, - {150, D<&IApplicationAccessor::ReportApplicationExitTimeout>, "ReportApplicationExitTimeout"}, - {160, nullptr, "SetApplicationAttribute"}, - {170, nullptr, "HasSaveDataAccessPermission"}, - {180, nullptr, "PushToFriendInvitationStorageChannel"}, - {190, nullptr, "PushToNotificationStorageChannel"}, - {200, nullptr, "RequestApplicationSoftReset"}, - {201, nullptr, "RestartApplicationTimer"}, - }; - // clang-format on - - RegisterHandlers(functions); } IApplicationAccessor::~IApplicationAccessor() = default; diff --git a/src/core/hle/service/am/service/application_accessor.h b/src/core/hle/service/am/service/application_accessor.h index b9797bcc0a..57b222fc19 100644 --- a/src/core/hle/service/am/service/application_accessor.h +++ b/src/core/hle/service/am/service/application_accessor.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -36,6 +39,7 @@ private: Result GetNsRightsEnvironmentHandle(Out out_handle); Result ReportApplicationExitTimeout(); + std::optional FindRequest(u32 key) override; WindowSystem& m_window_system; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/application_creator.cpp b/src/core/hle/service/am/service/application_creator.cpp index 4eb2f29e22..8d57f917fb 100644 --- a/src/core/hle/service/am/service/application_creator.cpp +++ b/src/core/hle/service/am/service/application_creator.cpp @@ -20,6 +20,16 @@ namespace Service::AM { +std::optional IApplicationCreator::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IApplicationCreator::CreateApplication>, "CreateApplication"}, + FunctionInfo{1, nullptr, "PopLaunchRequestedApplication"}, + FunctionInfo{10, D<&IApplicationCreator::CreateSystemApplication>, "CreateSystemApplication"}, + FunctionInfo{100, nullptr, "PopFloatingApplicationForDevelopment"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + namespace { Result CreateGuestApplication(SharedPointer* out_application_accessor, Core::System& system, WindowSystem& window_system, u64 program_id) { @@ -54,16 +64,6 @@ Result CreateGuestApplication(SharedPointer* out_applicati IApplicationCreator::IApplicationCreator(Core::System& system_, WindowSystem& window_system) : ServiceFramework{system_, "IApplicationCreator"}, m_window_system{window_system} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IApplicationCreator::CreateApplication>, "CreateApplication"}, - {1, nullptr, "PopLaunchRequestedApplication"}, - {10, D<&IApplicationCreator::CreateSystemApplication>, "CreateSystemApplication"}, - {100, nullptr, "PopFloatingApplicationForDevelopment"}, - }; - // clang-format on - - RegisterHandlers(functions); } IApplicationCreator::~IApplicationCreator() = default; diff --git a/src/core/hle/service/am/service/application_creator.h b/src/core/hle/service/am/service/application_creator.h index 75975b9596..64434af542 100644 --- a/src/core/hle/service/am/service/application_creator.h +++ b/src/core/hle/service/am/service/application_creator.h @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -24,6 +24,7 @@ private: Result CreateApplication(Out>, u64 application_id); Result CreateSystemApplication(Out>, u64 application_id); + std::optional FindRequest(u32 key) override; WindowSystem& m_window_system; }; diff --git a/src/core/hle/service/am/service/application_functions.cpp b/src/core/hle/service/am/service/application_functions.cpp index 90d292c4a2..4fda5eedd6 100644 --- a/src/core/hle/service/am/service/application_functions.cpp +++ b/src/core/hle/service/am/service/application_functions.cpp @@ -51,84 +51,85 @@ FileSys::PatchManager::Metadata GetApplicationMetadata(Core::System& system, u64 } // Anonymous namespace -IApplicationFunctions::IApplicationFunctions(Core::System& system_, std::shared_ptr applet) - : ServiceFramework{system_, "IApplicationFunctions"}, m_applet{std::move(applet)} { - // clang-format off - static const FunctionInfo functions[] = { - {1, D<&IApplicationFunctions::PopLaunchParameter>, "PopLaunchParameter"}, - {10, nullptr, "CreateApplicationAndPushAndRequestToStart"}, - {11, nullptr, "CreateApplicationAndPushAndRequestToStartForQuest"}, - {12, D<&IApplicationFunctions::CreateApplicationAndRequestToStart>, "CreateApplicationAndRequestToStart"}, - {13, nullptr, "CreateApplicationAndRequestToStartForQuest"}, - {14, nullptr, "CreateApplicationWithAttributeAndPushAndRequestToStartForQuest"}, - {15, nullptr, "CreateApplicationWithAttributeAndRequestToStartForQuest"}, - {20, D<&IApplicationFunctions::EnsureSaveData>, "EnsureSaveData"}, - {21, D<&IApplicationFunctions::GetDesiredLanguage>, "GetDesiredLanguage"}, - {22, D<&IApplicationFunctions::SetTerminateResult>, "SetTerminateResult"}, - {23, D<&IApplicationFunctions::GetDisplayVersion>, "GetDisplayVersion"}, - {24, nullptr, "GetLaunchStorageInfoForDebug"}, - {25, D<&IApplicationFunctions::ExtendSaveData>, "ExtendSaveData"}, - {26, D<&IApplicationFunctions::GetSaveDataSize>, "GetSaveDataSize"}, - {27, D<&IApplicationFunctions::CreateCacheStorage>, "CreateCacheStorage"}, - {28, D<&IApplicationFunctions::GetSaveDataSizeMax>, "GetSaveDataSizeMax"}, - {29, D<&IApplicationFunctions::GetCacheStorageMax>, "GetCacheStorageMax"}, - {30, D<&IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed>, "BeginBlockingHomeButtonShortAndLongPressed"}, - {31, D<&IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed>, "EndBlockingHomeButtonShortAndLongPressed"}, - {32, D<&IApplicationFunctions::BeginBlockingHomeButton>, "BeginBlockingHomeButton"}, - {33, D<&IApplicationFunctions::EndBlockingHomeButton>, "EndBlockingHomeButton"}, - {34, nullptr, "SelectApplicationLicense"}, - {35, nullptr, "GetDeviceSaveDataSizeMax"}, - {36, nullptr, "GetLimitedApplicationLicense"}, - {37, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"}, - {40, D<&IApplicationFunctions::NotifyRunning>, "NotifyRunning"}, - {50, D<&IApplicationFunctions::GetPseudoDeviceId>, "GetPseudoDeviceId"}, - {60, D<&IApplicationFunctions::SetMediaPlaybackStateForApplication>, "SetMediaPlaybackStateForApplication"}, - {65, D<&IApplicationFunctions::IsGamePlayRecordingSupported>, "IsGamePlayRecordingSupported"}, - {66, D<&IApplicationFunctions::InitializeGamePlayRecording>, "InitializeGamePlayRecording"}, - {67, D<&IApplicationFunctions::SetGamePlayRecordingState>, "SetGamePlayRecordingState"}, - {68, nullptr, "RequestFlushGamePlayingMovieForDebug"}, - {70, nullptr, "RequestToShutdown"}, - {71, nullptr, "RequestToReboot"}, - {72, nullptr, "RequestToSleep"}, - {80, nullptr, "ExitAndRequestToShowThanksMessage"}, - {90, D<&IApplicationFunctions::EnableApplicationCrashReport>, "EnableApplicationCrashReport"}, - {100, D<&IApplicationFunctions::InitializeApplicationCopyrightFrameBuffer>, "InitializeApplicationCopyrightFrameBuffer"}, - {101, D<&IApplicationFunctions::SetApplicationCopyrightImage>, "SetApplicationCopyrightImage"}, - {102, D<&IApplicationFunctions::SetApplicationCopyrightVisibility>, "SetApplicationCopyrightVisibility"}, - {110, D<&IApplicationFunctions::QueryApplicationPlayStatistics>, "QueryApplicationPlayStatistics"}, - {111, D<&IApplicationFunctions::QueryApplicationPlayStatisticsByUid>, "QueryApplicationPlayStatisticsByUid"}, - {120, D<&IApplicationFunctions::ExecuteProgram>, "ExecuteProgram"}, - {121, D<&IApplicationFunctions::ClearUserChannel>, "ClearUserChannel"}, - {122, D<&IApplicationFunctions::UnpopToUserChannel>, "UnpopToUserChannel"}, - {123, D<&IApplicationFunctions::GetPreviousProgramIndex>, "GetPreviousProgramIndex"}, - {124, nullptr, "EnableApplicationAllThreadDumpOnCrash"}, - {130, D<&IApplicationFunctions::GetGpuErrorDetectedSystemEvent>, "GetGpuErrorDetectedSystemEvent"}, - {131, nullptr, "SetDelayTimeToAbortOnGpuError"}, - {140, D<&IApplicationFunctions::GetFriendInvitationStorageChannelEvent>, "GetFriendInvitationStorageChannelEvent"}, - {141, D<&IApplicationFunctions::TryPopFromFriendInvitationStorageChannel>, "TryPopFromFriendInvitationStorageChannel"}, - {150, D<&IApplicationFunctions::GetNotificationStorageChannelEvent>, "GetNotificationStorageChannelEvent"}, - {151, nullptr, "TryPopFromNotificationStorageChannel"}, - {160, D<&IApplicationFunctions::GetHealthWarningDisappearedSystemEvent>, "GetHealthWarningDisappearedSystemEvent"}, - {170, nullptr, "SetHdcpAuthenticationActivated"}, - {180, nullptr, "GetLaunchRequiredVersion"}, - {181, nullptr, "UpgradeLaunchRequiredVersion"}, - {190, nullptr, "SendServerMaintenanceOverlayNotification"}, - {200, nullptr, "GetLastApplicationExitReason"}, - {210, D<&IApplicationFunctions::GetUnknownEvent210>, "Unknown210"}, - {220, nullptr, "Unknown220"}, // [20.0.0+] - {300, nullptr, "CreateMovieWriter"}, // [19.0.0+] - {310, nullptr, "Unknown310"}, // [20.0.0+] - {320, nullptr, "Unknown320"}, // [20.0.0+] - {330, D<&IApplicationFunctions::Unknown330>, "Unknown330"}, // [20.0.0+] - {500, nullptr, "StartContinuousRecordingFlushForDebug"}, - {1000, nullptr, "CreateMovieMaker"}, - {1001, D<&IApplicationFunctions::PrepareForJit>, "PrepareForJit"}, - }; - // clang-format on - - RegisterHandlers(functions); +std::optional IApplicationFunctions::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, D<&IApplicationFunctions::PopLaunchParameter>, "PopLaunchParameter"}, + FunctionInfo{10, nullptr, "CreateApplicationAndPushAndRequestToStart"}, + FunctionInfo{11, nullptr, "CreateApplicationAndPushAndRequestToStartForQuest"}, + FunctionInfo{12, D<&IApplicationFunctions::CreateApplicationAndRequestToStart>, "CreateApplicationAndRequestToStart"}, + FunctionInfo{13, nullptr, "CreateApplicationAndRequestToStartForQuest"}, + FunctionInfo{14, nullptr, "CreateApplicationWithAttributeAndPushAndRequestToStartForQuest"}, + FunctionInfo{15, nullptr, "CreateApplicationWithAttributeAndRequestToStartForQuest"}, + FunctionInfo{20, D<&IApplicationFunctions::EnsureSaveData>, "EnsureSaveData"}, + FunctionInfo{21, D<&IApplicationFunctions::GetDesiredLanguage>, "GetDesiredLanguage"}, + FunctionInfo{22, D<&IApplicationFunctions::SetTerminateResult>, "SetTerminateResult"}, + FunctionInfo{23, D<&IApplicationFunctions::GetDisplayVersion>, "GetDisplayVersion"}, + FunctionInfo{24, nullptr, "GetLaunchStorageInfoForDebug"}, + FunctionInfo{25, D<&IApplicationFunctions::ExtendSaveData>, "ExtendSaveData"}, + FunctionInfo{26, D<&IApplicationFunctions::GetSaveDataSize>, "GetSaveDataSize"}, + FunctionInfo{27, D<&IApplicationFunctions::CreateCacheStorage>, "CreateCacheStorage"}, + FunctionInfo{28, D<&IApplicationFunctions::GetSaveDataSizeMax>, "GetSaveDataSizeMax"}, + FunctionInfo{29, D<&IApplicationFunctions::GetCacheStorageMax>, "GetCacheStorageMax"}, + FunctionInfo{30, D<&IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed>, "BeginBlockingHomeButtonShortAndLongPressed"}, + FunctionInfo{31, D<&IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed>, "EndBlockingHomeButtonShortAndLongPressed"}, + FunctionInfo{32, D<&IApplicationFunctions::BeginBlockingHomeButton>, "BeginBlockingHomeButton"}, + FunctionInfo{33, D<&IApplicationFunctions::EndBlockingHomeButton>, "EndBlockingHomeButton"}, + FunctionInfo{34, nullptr, "SelectApplicationLicense"}, + FunctionInfo{35, nullptr, "GetDeviceSaveDataSizeMax"}, + FunctionInfo{36, nullptr, "GetLimitedApplicationLicense"}, + FunctionInfo{37, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"}, + FunctionInfo{40, D<&IApplicationFunctions::NotifyRunning>, "NotifyRunning"}, + FunctionInfo{50, D<&IApplicationFunctions::GetPseudoDeviceId>, "GetPseudoDeviceId"}, + FunctionInfo{60, D<&IApplicationFunctions::SetMediaPlaybackStateForApplication>, "SetMediaPlaybackStateForApplication"}, + FunctionInfo{65, D<&IApplicationFunctions::IsGamePlayRecordingSupported>, "IsGamePlayRecordingSupported"}, + FunctionInfo{66, D<&IApplicationFunctions::InitializeGamePlayRecording>, "InitializeGamePlayRecording"}, + FunctionInfo{67, D<&IApplicationFunctions::SetGamePlayRecordingState>, "SetGamePlayRecordingState"}, + FunctionInfo{68, nullptr, "RequestFlushGamePlayingMovieForDebug"}, + FunctionInfo{70, nullptr, "RequestToShutdown"}, + FunctionInfo{71, nullptr, "RequestToReboot"}, + FunctionInfo{72, nullptr, "RequestToSleep"}, + FunctionInfo{80, nullptr, "ExitAndRequestToShowThanksMessage"}, + FunctionInfo{90, D<&IApplicationFunctions::EnableApplicationCrashReport>, "EnableApplicationCrashReport"}, + FunctionInfo{100, D<&IApplicationFunctions::InitializeApplicationCopyrightFrameBuffer>, "InitializeApplicationCopyrightFrameBuffer"}, + FunctionInfo{101, D<&IApplicationFunctions::SetApplicationCopyrightImage>, "SetApplicationCopyrightImage"}, + FunctionInfo{102, D<&IApplicationFunctions::SetApplicationCopyrightVisibility>, "SetApplicationCopyrightVisibility"}, + FunctionInfo{110, D<&IApplicationFunctions::QueryApplicationPlayStatistics>, "QueryApplicationPlayStatistics"}, + FunctionInfo{111, D<&IApplicationFunctions::QueryApplicationPlayStatisticsByUid>, "QueryApplicationPlayStatisticsByUid"}, + FunctionInfo{120, D<&IApplicationFunctions::ExecuteProgram>, "ExecuteProgram"}, + FunctionInfo{121, D<&IApplicationFunctions::ClearUserChannel>, "ClearUserChannel"}, + FunctionInfo{122, D<&IApplicationFunctions::UnpopToUserChannel>, "UnpopToUserChannel"}, + FunctionInfo{123, D<&IApplicationFunctions::GetPreviousProgramIndex>, "GetPreviousProgramIndex"}, + FunctionInfo{124, nullptr, "EnableApplicationAllThreadDumpOnCrash"}, + FunctionInfo{130, D<&IApplicationFunctions::GetGpuErrorDetectedSystemEvent>, "GetGpuErrorDetectedSystemEvent"}, + FunctionInfo{131, nullptr, "SetDelayTimeToAbortOnGpuError"}, + FunctionInfo{140, D<&IApplicationFunctions::GetFriendInvitationStorageChannelEvent>, "GetFriendInvitationStorageChannelEvent"}, + FunctionInfo{141, D<&IApplicationFunctions::TryPopFromFriendInvitationStorageChannel>, "TryPopFromFriendInvitationStorageChannel"}, + FunctionInfo{150, D<&IApplicationFunctions::GetNotificationStorageChannelEvent>, "GetNotificationStorageChannelEvent"}, + FunctionInfo{151, nullptr, "TryPopFromNotificationStorageChannel"}, + FunctionInfo{160, D<&IApplicationFunctions::GetHealthWarningDisappearedSystemEvent>, "GetHealthWarningDisappearedSystemEvent"}, + FunctionInfo{170, nullptr, "SetHdcpAuthenticationActivated"}, + FunctionInfo{180, nullptr, "GetLaunchRequiredVersion"}, + FunctionInfo{181, nullptr, "UpgradeLaunchRequiredVersion"}, + FunctionInfo{190, nullptr, "SendServerMaintenanceOverlayNotification"}, + FunctionInfo{200, nullptr, "GetLastApplicationExitReason"}, + FunctionInfo{210, D<&IApplicationFunctions::GetUnknownEvent210>, "Unknown210"}, + FunctionInfo{220, nullptr, "Unknown220"}, // [20.0.0+] + FunctionInfo{300, nullptr, "CreateMovieWriter"}, // [19.0.0+] + FunctionInfo{310, nullptr, "Unknown310"}, // [20.0.0+] + FunctionInfo{320, nullptr, "Unknown320"}, // [20.0.0+] + FunctionInfo{330, D<&IApplicationFunctions::Unknown330>, "Unknown330"}, // [20.0.0+] + FunctionInfo{500, nullptr, "StartContinuousRecordingFlushForDebug"}, + FunctionInfo{1000, nullptr, "CreateMovieMaker"}, + FunctionInfo{1001, D<&IApplicationFunctions::PrepareForJit>, "PrepareForJit"} + ); + return HandlerTableGenerateWithFind(key, functions); } +IApplicationFunctions::IApplicationFunctions(Core::System& system_, std::shared_ptr applet) + : ServiceFramework{system_, "IApplicationFunctions"} + , m_applet{std::move(applet)} +{} + IApplicationFunctions::~IApplicationFunctions() = default; Result IApplicationFunctions::PopLaunchParameter(Out> out_storage, diff --git a/src/core/hle/service/am/service/application_functions.h b/src/core/hle/service/am/service/application_functions.h index b97ed7e25e..7093d13f82 100644 --- a/src/core/hle/service/am/service/application_functions.h +++ b/src/core/hle/service/am/service/application_functions.h @@ -84,6 +84,7 @@ private: Result GetUnknownEvent210(OutCopyHandle out_event); Result Unknown330(Out out); Result PrepareForJit(); + std::optional FindRequest(u32 key) override; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/application_proxy.cpp b/src/core/hle/service/am/service/application_proxy.cpp deleted file mode 100644 index 6e1328fee7..0000000000 --- a/src/core/hle/service/am/service/application_proxy.cpp +++ /dev/null @@ -1,106 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/am/service/applet_common_functions.h" -#include "core/hle/service/am/service/application_functions.h" -#include "core/hle/service/am/service/application_proxy.h" -#include "core/hle/service/am/service/audio_controller.h" -#include "core/hle/service/am/service/common_state_getter.h" -#include "core/hle/service/am/service/debug_functions.h" -#include "core/hle/service/am/service/display_controller.h" -#include "core/hle/service/am/service/library_applet_creator.h" -#include "core/hle/service/am/service/process_winding_controller.h" -#include "core/hle/service/am/service/self_controller.h" -#include "core/hle/service/am/service/window_controller.h" -#include "core/hle/service/cmif_serialization.h" - -namespace Service::AM { - -IApplicationProxy::IApplicationProxy(Core::System& system_, std::shared_ptr applet, - Kernel::KProcess* process, WindowSystem& window_system) - : ServiceFramework{system_, "IApplicationProxy"}, - m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IApplicationProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, - {1, D<&IApplicationProxy::GetSelfController>, "GetSelfController"}, - {2, D<&IApplicationProxy::GetWindowController>, "GetWindowController"}, - {3, D<&IApplicationProxy::GetAudioController>, "GetAudioController"}, - {4, D<&IApplicationProxy::GetDisplayController>, "GetDisplayController"}, - {10, D<&IApplicationProxy::GetProcessWindingController>, "GetProcessWindingController"}, - {11, D<&IApplicationProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, - {20, D<&IApplicationProxy::GetApplicationFunctions>, "GetApplicationFunctions"}, - {1000, D<&IApplicationProxy::GetDebugFunctions>, "GetDebugFunctions"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -IApplicationProxy::~IApplicationProxy() = default; - -Result IApplicationProxy::GetAudioController( - Out> out_audio_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_audio_controller = std::make_shared(system); - R_SUCCEED(); -} - -Result IApplicationProxy::GetDisplayController( - Out> out_display_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_display_controller = std::make_shared(system, m_applet); - R_SUCCEED(); -} - -Result IApplicationProxy::GetProcessWindingController( - Out> out_process_winding_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_process_winding_controller = std::make_shared(system, m_applet); - R_SUCCEED(); -} - -Result IApplicationProxy::GetDebugFunctions( - Out> out_debug_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_debug_functions = std::make_shared(system); - R_SUCCEED(); -} - -Result IApplicationProxy::GetWindowController( - Out> out_window_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_window_controller = std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); -} - -Result IApplicationProxy::GetSelfController( - Out> out_self_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_self_controller = std::make_shared(system, m_applet, m_process); - R_SUCCEED(); -} - -Result IApplicationProxy::GetCommonStateGetter( - Out> out_common_state_getter) { - LOG_DEBUG(Service_AM, "called"); - *out_common_state_getter = std::make_shared(system, m_applet); - R_SUCCEED(); -} - -Result IApplicationProxy::GetLibraryAppletCreator( - Out> out_library_applet_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_creator = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); -} - -Result IApplicationProxy::GetApplicationFunctions( - Out> out_application_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_application_functions = std::make_shared(system, m_applet); - R_SUCCEED(); -} - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/application_proxy.h b/src/core/hle/service/am/service/application_proxy.h deleted file mode 100644 index 8c62459c45..0000000000 --- a/src/core/hle/service/am/service/application_proxy.h +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Service::AM { - -struct Applet; -class IAudioController; -class IApplicationFunctions; -class ICommonStateGetter; -class IDebugFunctions; -class IDisplayController; -class ILibraryAppletCreator; -class IProcessWindingController; -class ISelfController; -class IWindowController; -class WindowSystem; - -class IApplicationProxy final : public ServiceFramework { -public: - explicit IApplicationProxy(Core::System& system_, std::shared_ptr applet, - Kernel::KProcess* process, WindowSystem& window_system); - ~IApplicationProxy(); - -private: - Result GetAudioController(Out> out_audio_controller); - Result GetDisplayController(Out> out_display_controller); - Result GetProcessWindingController( - Out> out_process_winding_controller); - Result GetDebugFunctions(Out> out_debug_functions); - Result GetWindowController(Out> out_window_controller); - Result GetSelfController(Out> out_self_controller); - Result GetCommonStateGetter(Out> out_common_state_getter); - Result GetLibraryAppletCreator( - Out> out_library_applet_creator); - Result GetApplicationFunctions( - Out> out_application_functions); - -private: - WindowSystem& m_window_system; - Kernel::KProcess* const m_process; - const std::shared_ptr m_applet; -}; - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/application_proxy_service.cpp b/src/core/hle/service/am/service/application_proxy_service.cpp deleted file mode 100644 index b7d7b3c2d9..0000000000 --- a/src/core/hle/service/am/service/application_proxy_service.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/core.h" -#include "core/hle/service/am/am.h" -#include "core/hle/service/am/applet_manager.h" -#include "core/hle/service/am/service/application_proxy.h" -#include "core/hle/service/am/service/application_proxy_service.h" -#include "core/hle/service/am/window_system.h" -#include "core/hle/service/cmif_serialization.h" - -namespace Service::AM { - -IApplicationProxyService::IApplicationProxyService(Core::System& system_, - WindowSystem& window_system) - : ServiceFramework{system_, "appletOE"}, m_window_system{window_system} { - static const FunctionInfo functions[] = { - {0, D<&IApplicationProxyService::OpenApplicationProxy>, "OpenApplicationProxy"}, - }; - RegisterHandlers(functions); -} - -IApplicationProxyService::~IApplicationProxyService() = default; - -Result IApplicationProxyService::OpenApplicationProxy( - Out> out_application_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_DEBUG(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid)) { - *out_application_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } -} - -std::shared_ptr IApplicationProxyService::GetAppletFromProcessId(ProcessId process_id) { - return m_window_system.GetByAppletResourceUserId(process_id.pid); -} - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/application_proxy_service.h b/src/core/hle/service/am/service/application_proxy_service.h deleted file mode 100644 index e5f4ea345b..0000000000 --- a/src/core/hle/service/am/service/application_proxy_service.h +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Service { - -namespace AM { - -struct Applet; -class IApplicationProxy; -class WindowSystem; - -class IApplicationProxyService final : public ServiceFramework { -public: - explicit IApplicationProxyService(Core::System& system_, WindowSystem& window_system); - ~IApplicationProxyService() override; - -private: - Result OpenApplicationProxy(Out> out_application_proxy, - ClientProcessId pid, InCopyHandle process_handle); - -private: - std::shared_ptr GetAppletFromProcessId(ProcessId pid); - - WindowSystem& m_window_system; -}; - -} // namespace AM -} // namespace Service diff --git a/src/core/hle/service/am/service/audio_controller.cpp b/src/core/hle/service/am/service/audio_controller.cpp index f627b1df0e..2c8494e056 100644 --- a/src/core/hle/service/am/service/audio_controller.cpp +++ b/src/core/hle/service/am/service/audio_controller.cpp @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -9,20 +9,20 @@ namespace Service::AM { +std::optional IAudioController::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IAudioController::SetExpectedMasterVolume>, "SetExpectedMasterVolume"}, + FunctionInfo{1, D<&IAudioController::GetMainAppletExpectedMasterVolume>, "GetMainAppletExpectedMasterVolume"}, + FunctionInfo{2, D<&IAudioController::GetLibraryAppletExpectedMasterVolume>, "GetLibraryAppletExpectedMasterVolume"}, + FunctionInfo{3, D<&IAudioController::ChangeMainAppletMasterVolume>, "ChangeMainAppletMasterVolume"}, + FunctionInfo{4, D<&IAudioController::SetTransparentVolumeRate>, "SetTransparentVolumeRate"}, + FunctionInfo{5, nullptr, "Unknown5", MakeVersionGate({20,0,0})} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IAudioController::IAudioController(Core::System& system_) : ServiceFramework{system_, "IAudioController"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IAudioController::SetExpectedMasterVolume>, "SetExpectedMasterVolume"}, - {1, D<&IAudioController::GetMainAppletExpectedMasterVolume>, "GetMainAppletExpectedMasterVolume"}, - {2, D<&IAudioController::GetLibraryAppletExpectedMasterVolume>, "GetLibraryAppletExpectedMasterVolume"}, - {3, D<&IAudioController::ChangeMainAppletMasterVolume>, "ChangeMainAppletMasterVolume"}, - {4, D<&IAudioController::SetTransparentVolumeRate>, "SetTransparentVolumeRate"}, - {5, nullptr, "Unknown5"}, //20.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); } IAudioController::~IAudioController() = default; diff --git a/src/core/hle/service/am/service/audio_controller.h b/src/core/hle/service/am/service/audio_controller.h index 4b0f3f9aed..9cdb33820d 100644 --- a/src/core/hle/service/am/service/audio_controller.h +++ b/src/core/hle/service/am/service/audio_controller.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -20,6 +23,7 @@ private: Result ChangeMainAppletMasterVolume(f32 volume, s64 fade_time_ns); Result SetTransparentVolumeRate(f32 transparent_volume_rate); + std::optional FindRequest(u32 key) override; static constexpr float MinAllowedVolume = 0.0f; static constexpr float MaxAllowedVolume = 1.0f; diff --git a/src/core/hle/service/am/service/common_state_getter.cpp b/src/core/hle/service/am/service/common_state_getter.cpp index 044929e434..6a6a51f42e 100644 --- a/src/core/hle/service/am/service/common_state_getter.cpp +++ b/src/core/hle/service/am/service/common_state_getter.cpp @@ -8,7 +8,6 @@ #include "core/hle/service/am/am_results.h" #include "core/hle/service/am/applet.h" #include "core/hle/service/am/service/common_state_getter.h" -#include "core/hle/service/am/service/lock_accessor.h" #include "core/hle/service/am/service/storage.h" #include "core/hle/service/apm/apm_interface.h" #include "core/hle/service/cmif_serialization.h" @@ -18,77 +17,147 @@ namespace Service::AM { +std::optional ICommonStateGetter::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ICommonStateGetter::GetEventHandle>, "GetEventHandle"}, + FunctionInfo{1, D<&ICommonStateGetter::ReceiveMessage>, "ReceiveMessage"}, + FunctionInfo{2, nullptr, "GetThisAppletKind"}, + FunctionInfo{3, nullptr, "AllowToEnterSleep"}, + FunctionInfo{4, nullptr, "DisallowToEnterSleep"}, + FunctionInfo{5, D<&ICommonStateGetter::GetOperationMode>, "GetOperationMode"}, + FunctionInfo{6, D<&ICommonStateGetter::GetPerformanceMode>, "GetPerformanceMode"}, + FunctionInfo{7, nullptr, "GetCradleStatus"}, + FunctionInfo{8, D<&ICommonStateGetter::GetBootMode>, "GetBootMode"}, + FunctionInfo{9, D<&ICommonStateGetter::GetCurrentFocusState>, "GetCurrentFocusState"}, + FunctionInfo{10, D<&ICommonStateGetter::RequestToAcquireSleepLock>, "RequestToAcquireSleepLock"}, + FunctionInfo{11, D<&ICommonStateGetter::ReleaseSleepLock>, "ReleaseSleepLock"}, + FunctionInfo{12, D<&ICommonStateGetter::ReleaseSleepLockTransiently>, "ReleaseSleepLockTransiently"}, + FunctionInfo{13, D<&ICommonStateGetter::GetAcquiredSleepLockEvent>, "GetAcquiredSleepLockEvent"}, + FunctionInfo{14, nullptr, "GetWakeupCount", MakeVersionGate({11,0,0})}, + FunctionInfo{15, nullptr, "Unknown15", MakeVersionGate({19,0,0})}, + FunctionInfo{20, D<&ICommonStateGetter::PushToGeneralChannel>, "PushToGeneralChannel"}, + FunctionInfo{30, D<&ICommonStateGetter::GetHomeButtonReaderLockAccessor>, "GetHomeButtonReaderLockAccessor"}, + FunctionInfo{31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx", MakeVersionGate({2,0,0})}, + FunctionInfo{32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx", MakeVersionGate({7,0,0})}, + FunctionInfo{40, nullptr, "GetCradleFwVersion", MakeVersionGate({2,0,0})}, + FunctionInfo{50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled", MakeVersionGate({3,0,0})}, + FunctionInfo{51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled", MakeVersionGate({3,0,0})}, + FunctionInfo{52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled", MakeVersionGate({4,0,0})}, + FunctionInfo{53, D<&ICommonStateGetter::BeginVrModeEx>, "BeginVrModeEx", MakeVersionGate({7,0,0})}, + FunctionInfo{54, D<&ICommonStateGetter::EndVrModeEx>, "EndVrModeEx", MakeVersionGate({7,0,0})}, + FunctionInfo{55, D<&ICommonStateGetter::IsInControllerFirmwareUpdateSection>, "IsInControllerFirmwareUpdateSection", MakeVersionGate({3,0,0})}, + FunctionInfo{59, nullptr, "SetVrPositionForDebug", MakeVersionGate({1,0,0})}, + FunctionInfo{60, D<&ICommonStateGetter::GetDefaultDisplayResolution>, "GetDefaultDisplayResolution"}, + FunctionInfo{61, D<&ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent>, "GetDefaultDisplayResolutionChangeEvent"}, + FunctionInfo{62, D<&ICommonStateGetter::GetHdcpAuthenticationState>, "GetHdcpAuthenticationState"}, + FunctionInfo{63, D<&ICommonStateGetter::GetHdcpAuthenticationStateChangeEvent>, "GetHdcpAuthenticationStateChangeEvent"}, + FunctionInfo{64, nullptr, "SetTvPowerStateMatchingMode"}, + FunctionInfo{65, nullptr, "GetApplicationIdByContentActionName"}, + FunctionInfo{66, &ICommonStateGetter::SetCpuBoostMode, "SetCpuBoostMode"}, + FunctionInfo{67, nullptr, "CancelCpuBoostMode"}, + FunctionInfo{68, D<&ICommonStateGetter::GetBuiltInDisplayType>, "GetBuiltInDisplayType"}, + FunctionInfo{80, D<&ICommonStateGetter::PerformSystemButtonPressingIfInFocus>, "PerformSystemButtonPressingIfInFocus"}, + FunctionInfo{90, nullptr, "SetPerformanceConfigurationChangedNotification"}, + FunctionInfo{91, nullptr, "GetCurrentPerformanceConfiguration"}, + FunctionInfo{100, D<&ICommonStateGetter::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"}, + FunctionInfo{110, nullptr, "OpenMyGpuErrorHandler"}, + FunctionInfo{120, D<&ICommonStateGetter::GetAppletLaunchedHistory>, "GetAppletLaunchedHistory", MakeVersionGate({13,0,0})}, + FunctionInfo{130, D<&ICommonStateGetter::EnableStartupLogoDisappearedMessage>, "EnableStartupLogoDisappearedMessage", MakeVersionGate({21,0,0})}, + FunctionInfo{200, D<&ICommonStateGetter::GetOperationModeSystemInfo>, "GetOperationModeSystemInfo"}, + FunctionInfo{300, D<&ICommonStateGetter::GetSettingsPlatformRegion>, "GetSettingsPlatformRegion"}, + FunctionInfo{400, nullptr, "ActivateMigrationService"}, + FunctionInfo{401, nullptr, "DeactivateMigrationService"}, + FunctionInfo{500, nullptr, "DisableSleepTillShutdown"}, + FunctionInfo{501, nullptr, "SuppressDisablingSleepTemporarily"}, + FunctionInfo{502, nullptr, "IsSleepEnabled"}, + FunctionInfo{503, nullptr, "IsDisablingSleepSuppressed"}, + FunctionInfo{600, nullptr, "SetHidInputMagnificationForApplication", MakeVersionGate({20,0,0})}, + FunctionInfo{610, D<&ICommonStateGetter::Unknown610>, "Unknown610", MakeVersionGate({21,0,0})}, + FunctionInfo{611, D<&ICommonStateGetter::Unknown611>, "Unknown611", MakeVersionGate({22,0,0})}, + FunctionInfo{900, D<&ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled>, "SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled", MakeVersionGate({11,0,0})}, + FunctionInfo{910, nullptr, "GetLaunchRequiredTick", MakeVersionGate({17,0,0})}, + FunctionInfo{1000, D<&ICommonStateGetter::BeginVrMode3d>, "BeginVrMode3d", MakeVersionGate({19,0,0})}, + FunctionInfo{1001, D<&ICommonStateGetter::EndVrMode3d>, "EndVrMode3d", MakeVersionGate({19,0,0})}, + FunctionInfo{1002, D<&ICommonStateGetter::IsVrModeEnabled3d>, "IsVrModeEnabled3d", MakeVersionGate({19,0,0})}, + FunctionInfo{1003, D<&ICommonStateGetter::GetVrLaboGoggleViewport>, "GetVrLaboGoggleViewport", MakeVersionGate({21,0,0})}, + FunctionInfo{1004, D<&ICommonStateGetter::GetPanelPhysicalSizeForSpecificTitle>, "GetPanelPhysicalSizeForSpecificTitle", MakeVersionGate({21,0,0})}, + FunctionInfo{1005, D<&ICommonStateGetter::GetPanelResolutionForSpecificTitle>, "GetPanelResolutionForSpecificTitle", MakeVersionGate({21,0,0})} + ); + return HandlerTableGenerateWithFind(key, functions); +} + +class ILockAccessor final : public ServiceFramework { +public: + explicit ILockAccessor(Core::System& system_) + : ServiceFramework{system_, "ILockAccessor"}, m_context{system_, "ILockAccessor"}, + m_event{m_context} { + m_event.Signal(system.Kernel()); + } + ~ILockAccessor() override = default; + + Result TryLock(Out out_is_locked, OutCopyHandle out_handle, bool return_handle) { + LOG_INFO(Service_AM, "called, return_handle={}", return_handle); + + { + std::scoped_lock lk{m_mutex}; + if (m_is_locked) { + *out_is_locked = false; + } else { + m_is_locked = true; + *out_is_locked = true; + } + } + + if (return_handle) { + *out_handle = m_event.GetHandle(); + } + + R_SUCCEED(); + } + + Result Unlock() { + LOG_INFO(Service_AM, "called"); + + { + std::scoped_lock lk{m_mutex}; + m_is_locked = false; + } + + m_event.Signal(system.Kernel()); + R_SUCCEED(); + } + + Result GetEvent(OutCopyHandle out_handle) { + LOG_INFO(Service_AM, "called"); + *out_handle = m_event.GetHandle(); + R_SUCCEED(); + } + + Result IsLocked(Out out_is_locked) { + LOG_INFO(Service_AM, "called"); + std::scoped_lock lk{m_mutex}; + *out_is_locked = m_is_locked; + R_SUCCEED(); + } + +private: + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, D<&ILockAccessor::TryLock>, "TryLock"}, + FunctionInfo{2, D<&ILockAccessor::Unlock>, "Unlock"}, + FunctionInfo{3, D<&ILockAccessor::GetEvent>, "GetEvent"}, + FunctionInfo{4, D<&ILockAccessor::IsLocked>, "IsLocked"} + ); + KernelHelpers::ServiceContext m_context; + Event m_event; + std::mutex m_mutex{}; + bool m_is_locked{}; +}; + ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr applet) : ServiceFramework{system_, "ICommonStateGetter"}, m_applet{std::move(applet)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&ICommonStateGetter::GetEventHandle>, "GetEventHandle"}, - {1, D<&ICommonStateGetter::ReceiveMessage>, "ReceiveMessage"}, - {2, nullptr, "GetThisAppletKind"}, - {3, nullptr, "AllowToEnterSleep"}, - {4, nullptr, "DisallowToEnterSleep"}, - {5, D<&ICommonStateGetter::GetOperationMode>, "GetOperationMode"}, - {6, D<&ICommonStateGetter::GetPerformanceMode>, "GetPerformanceMode"}, - {7, nullptr, "GetCradleStatus"}, - {8, D<&ICommonStateGetter::GetBootMode>, "GetBootMode"}, - {9, D<&ICommonStateGetter::GetCurrentFocusState>, "GetCurrentFocusState"}, - {10, D<&ICommonStateGetter::RequestToAcquireSleepLock>, "RequestToAcquireSleepLock"}, - {11, D<&ICommonStateGetter::ReleaseSleepLock>, "ReleaseSleepLock"}, - {12, D<&ICommonStateGetter::ReleaseSleepLockTransiently>, "ReleaseSleepLockTransiently"}, - {13, D<&ICommonStateGetter::GetAcquiredSleepLockEvent>, "GetAcquiredSleepLockEvent"}, - {14, nullptr, "GetWakeupCount"}, //11.0.0+ - {15, nullptr, "Unknown15"}, //19.0.0+ - {20, D<&ICommonStateGetter::PushToGeneralChannel>, "PushToGeneralChannel"}, - {30, D<&ICommonStateGetter::GetHomeButtonReaderLockAccessor>, "GetHomeButtonReaderLockAccessor"}, - {31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx"}, //2.0.0+ - {32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx"}, //7.0.0+ - {40, nullptr, "GetCradleFwVersion"}, //2.0.0+ - {50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled"}, //3.0.0+ - {51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled"}, //3.0.0+ - {52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled"}, //4.0.0+ - {53, D<&ICommonStateGetter::BeginVrModeEx>, "BeginVrModeEx"}, //7.0.0+ - {54, D<&ICommonStateGetter::EndVrModeEx>, "EndVrModeEx"}, //7.0.0+ - {55, D<&ICommonStateGetter::IsInControllerFirmwareUpdateSection>, "IsInControllerFirmwareUpdateSection"}, //3.0.0+ - {59, nullptr, "SetVrPositionForDebug"}, //1.0.0+ - {60, D<&ICommonStateGetter::GetDefaultDisplayResolution>, "GetDefaultDisplayResolution"}, - {61, D<&ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent>, "GetDefaultDisplayResolutionChangeEvent"}, - {62, D<&ICommonStateGetter::GetHdcpAuthenticationState>, "GetHdcpAuthenticationState"}, - {63, D<&ICommonStateGetter::GetHdcpAuthenticationStateChangeEvent>, "GetHdcpAuthenticationStateChangeEvent"}, - {64, nullptr, "SetTvPowerStateMatchingMode"}, - {65, nullptr, "GetApplicationIdByContentActionName"}, - {66, &ICommonStateGetter::SetCpuBoostMode, "SetCpuBoostMode"}, - {67, nullptr, "CancelCpuBoostMode"}, - {68, D<&ICommonStateGetter::GetBuiltInDisplayType>, "GetBuiltInDisplayType"}, - {80, D<&ICommonStateGetter::PerformSystemButtonPressingIfInFocus>, "PerformSystemButtonPressingIfInFocus"}, - {90, nullptr, "SetPerformanceConfigurationChangedNotification"}, - {91, nullptr, "GetCurrentPerformanceConfiguration"}, - {100, D<&ICommonStateGetter::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"}, - {110, nullptr, "OpenMyGpuErrorHandler"}, - {120, D<&ICommonStateGetter::GetAppletLaunchedHistory>, "GetAppletLaunchedHistory"}, //13.0.0+ - {130, D<&ICommonStateGetter::EnableStartupLogoDisappearedMessage>, "EnableStartupLogoDisappearedMessage"}, //21.0.0+ - {200, D<&ICommonStateGetter::GetOperationModeSystemInfo>, "GetOperationModeSystemInfo"}, - {300, D<&ICommonStateGetter::GetSettingsPlatformRegion>, "GetSettingsPlatformRegion"}, - {400, nullptr, "ActivateMigrationService"}, - {401, nullptr, "DeactivateMigrationService"}, - {500, nullptr, "DisableSleepTillShutdown"}, - {501, nullptr, "SuppressDisablingSleepTemporarily"}, - {502, nullptr, "IsSleepEnabled"}, - {503, nullptr, "IsDisablingSleepSuppressed"}, - {600, nullptr, "SetHidInputMagnificationForApplication"}, //20.0.0+ - {610, D<&ICommonStateGetter::Unknown610>, "Unknown610"}, //21.0.0+ - {611, D<&ICommonStateGetter::Unknown611>, "Unknown611"}, //22.0.0+ - {900, D<&ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled>, "SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled"}, //11.0.0+ - {910, nullptr, "GetLaunchRequiredTick"}, //17.0.0+ - {1000, D<&ICommonStateGetter::BeginVrMode3d>, "BeginVrMode3d"}, //19.0.0+ - {1001, D<&ICommonStateGetter::EndVrMode3d>, "EndVrMode3d"}, //19.0.0+ - {1002, D<&ICommonStateGetter::IsVrModeEnabled3d>, "IsVrModeEnabled3d"}, //19.0.0+ - {1003, D<&ICommonStateGetter::GetVrLaboGoggleViewport>, "GetVrLaboGoggleViewport"}, //21.0.0+ - {1004, D<&ICommonStateGetter::GetPanelPhysicalSizeForSpecificTitle>, "GetPanelPhysicalSizeForSpecificTitle"}, //21.0.0+ - {1005, D<&ICommonStateGetter::GetPanelResolutionForSpecificTitle>, "GetPanelResolutionForSpecificTitle"}, //21.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); } ICommonStateGetter::~ICommonStateGetter() = default; diff --git a/src/core/hle/service/am/service/common_state_getter.h b/src/core/hle/service/am/service/common_state_getter.h index da86b5d079..ad782ca48e 100644 --- a/src/core/hle/service/am/service/common_state_getter.h +++ b/src/core/hle/service/am/service/common_state_getter.h @@ -76,6 +76,7 @@ private: void SetCpuBoostMode(HLERequestContext& ctx); + std::optional FindRequest(u32 key) override; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/cradle_firmware_updater.cpp b/src/core/hle/service/am/service/cradle_firmware_updater.cpp index 0a8af0858d..a8097ea209 100644 --- a/src/core/hle/service/am/service/cradle_firmware_updater.cpp +++ b/src/core/hle/service/am/service/cradle_firmware_updater.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,22 +9,21 @@ namespace Service::AM { + std::optional ICradleFirmwareUpdater::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ICradleFirmwareUpdater::StartUpdate>, "StartUpdate"}, + FunctionInfo{1, D<&ICradleFirmwareUpdater::FinishUpdate>, "FinishUpdate"}, + FunctionInfo{2, D<&ICradleFirmwareUpdater::GetCradleDeviceInfo>, "GetCradleDeviceInfo"}, + FunctionInfo{3, D<&ICradleFirmwareUpdater::GetCradleDeviceInfoChangeEvent>, "GetCradleDeviceInfoChangeEvent"}, + FunctionInfo{4, nullptr, "GetUpdateProgressInfo"}, + FunctionInfo{5, nullptr, "GetLastInternalResult"} + ); + return HandlerTableGenerateWithFind(key, functions); + } + ICradleFirmwareUpdater::ICradleFirmwareUpdater(Core::System& system_) : ServiceFramework{system_, "ICradleFirmwareUpdater"}, m_context{system, "ICradleFirmwareUpdater"}, m_cradle_device_info_event{m_context} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&ICradleFirmwareUpdater::StartUpdate>, "StartUpdate"}, - {1, D<&ICradleFirmwareUpdater::FinishUpdate>, "FinishUpdate"}, - {2, D<&ICradleFirmwareUpdater::GetCradleDeviceInfo>, "GetCradleDeviceInfo"}, - {3, D<&ICradleFirmwareUpdater::GetCradleDeviceInfoChangeEvent>, "GetCradleDeviceInfoChangeEvent"}, - {4, nullptr, "GetUpdateProgressInfo"}, - {5, nullptr, "GetLastInternalResult"}, - - }; - // clang-format on - - RegisterHandlers(functions); } ICradleFirmwareUpdater::~ICradleFirmwareUpdater() = default; diff --git a/src/core/hle/service/am/service/cradle_firmware_updater.h b/src/core/hle/service/am/service/cradle_firmware_updater.h index 3e803f0ae9..f8e4b93b27 100644 --- a/src/core/hle/service/am/service/cradle_firmware_updater.h +++ b/src/core/hle/service/am/service/cradle_firmware_updater.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -30,6 +33,7 @@ private: Result GetCradleDeviceInfoChangeEvent(OutCopyHandle out_event); private: + std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext m_context; Event m_cradle_device_info_event; }; diff --git a/src/core/hle/service/am/service/debug_functions.cpp b/src/core/hle/service/am/service/debug_functions.cpp deleted file mode 100644 index fcac4776db..0000000000 --- a/src/core/hle/service/am/service/debug_functions.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/am/service/debug_functions.h" - -namespace Service::AM { - -IDebugFunctions::IDebugFunctions(Core::System& system_) - : ServiceFramework{system_, "IDebugFunctions"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "NotifyMessageToHomeMenuForDebug"}, - {1, nullptr, "OpenMainApplication"}, - {10, nullptr, "PerformSystemButtonPressing"}, - {20, nullptr, "InvalidateTransitionLayer"}, - {30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"}, - {31, nullptr, "RequestLaunchApplicationByApplicationLaunchInfoForDebug"}, - {40, nullptr, "GetAppletResourceUsageInfo"}, - {50, nullptr, "AddSystemProgramIdAndAppletIdForDebug"}, - {51, nullptr, "AddOperationConfirmedLibraryAppletIdForDebug"}, - {100, nullptr, "SetCpuBoostModeForApplet"}, - {101, nullptr, "CancelCpuBoostModeForApplet"}, - {110, nullptr, "PushToAppletBoundChannelForDebug"}, - {111, nullptr, "TryPopFromAppletBoundChannelForDebug"}, - {120, nullptr, "AlarmSettingNotificationEnableAppEventReserve"}, - {121, nullptr, "AlarmSettingNotificationDisableAppEventReserve"}, - {122, nullptr, "AlarmSettingNotificationPushAppEventNotify"}, - {130, nullptr, "FriendInvitationSetApplicationParameter"}, - {131, nullptr, "FriendInvitationClearApplicationParameter"}, - {132, nullptr, "FriendInvitationPushApplicationParameter"}, - {140, nullptr, "RestrictPowerOperationForSecureLaunchModeForDebug"}, - {200, nullptr, "CreateFloatingLibraryAppletAccepterForDebug"}, - {300, nullptr, "TerminateAllRunningApplicationsForDebug"}, - {900, nullptr, "GetGrcProcessLaunchedSystemEvent"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -IDebugFunctions::~IDebugFunctions() = default; - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/debug_functions.h b/src/core/hle/service/am/service/debug_functions.h deleted file mode 100644 index d559687439..0000000000 --- a/src/core/hle/service/am/service/debug_functions.h +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/service.h" - -namespace Service::AM { - -class IDebugFunctions final : public ServiceFramework { -public: - explicit IDebugFunctions(Core::System& system_); - ~IDebugFunctions() override; -}; - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/display_controller.cpp b/src/core/hle/service/am/service/display_controller.cpp index 8f87327b17..eb95dd1b86 100644 --- a/src/core/hle/service/am/service/display_controller.cpp +++ b/src/core/hle/service/am/service/display_controller.cpp @@ -12,42 +12,42 @@ namespace Service::AM { +std::optional IDisplayController::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetLastForegroundCaptureImage"}, + FunctionInfo{1, nullptr, "UpdateLastForegroundCaptureImage"}, + FunctionInfo{2, nullptr, "GetLastApplicationCaptureImage"}, + FunctionInfo{3, nullptr, "GetCallerAppletCaptureImage"}, + FunctionInfo{4, nullptr, "UpdateCallerAppletCaptureImage"}, + FunctionInfo{5, D<&IDisplayController::GetLastForegroundCaptureImageEx>, "GetLastForegroundCaptureImageEx"}, + FunctionInfo{6, nullptr, "GetLastApplicationCaptureImageEx"}, + FunctionInfo{7, D<&IDisplayController::GetCallerAppletCaptureImageEx>, "GetCallerAppletCaptureImageEx"}, + FunctionInfo{8, D<&IDisplayController::TakeScreenShotOfOwnLayer>, "TakeScreenShotOfOwnLayer"}, + FunctionInfo{9, nullptr, "CopyBetweenCaptureBuffers"}, + FunctionInfo{10, nullptr, "AcquireLastApplicationCaptureBuffer"}, + FunctionInfo{11, nullptr, "ReleaseLastApplicationCaptureBuffer"}, + FunctionInfo{12, nullptr, "AcquireLastForegroundCaptureBuffer"}, + FunctionInfo{13, nullptr, "ReleaseLastForegroundCaptureBuffer"}, + FunctionInfo{14, nullptr, "AcquireCallerAppletCaptureBuffer"}, + FunctionInfo{15, nullptr, "ReleaseCallerAppletCaptureBuffer"}, + FunctionInfo{16, nullptr, "AcquireLastApplicationCaptureBufferEx"}, + FunctionInfo{17, nullptr, "AcquireLastForegroundCaptureBufferEx"}, + FunctionInfo{18, nullptr, "AcquireCallerAppletCaptureBufferEx"}, + FunctionInfo{20, D<&IDisplayController::ClearCaptureBuffer>, "ClearCaptureBuffer"}, + FunctionInfo{21, nullptr, "ClearAppletTransitionBuffer"}, + FunctionInfo{22, D<&IDisplayController::AcquireLastApplicationCaptureSharedBuffer>, "AcquireLastApplicationCaptureSharedBuffer"}, + FunctionInfo{23, D<&IDisplayController::ReleaseLastApplicationCaptureSharedBuffer>, "ReleaseLastApplicationCaptureSharedBuffer"}, + FunctionInfo{24, D<&IDisplayController::AcquireLastForegroundCaptureSharedBuffer>, "AcquireLastForegroundCaptureSharedBuffer"}, + FunctionInfo{25, D<&IDisplayController::ReleaseLastForegroundCaptureSharedBuffer>, "ReleaseLastForegroundCaptureSharedBuffer"}, + FunctionInfo{26, D<&IDisplayController::AcquireCallerAppletCaptureSharedBuffer>, "AcquireCallerAppletCaptureSharedBuffer"}, + FunctionInfo{27, D<&IDisplayController::ReleaseCallerAppletCaptureSharedBuffer>, "ReleaseCallerAppletCaptureSharedBuffer"}, + FunctionInfo{28, nullptr, "TakeScreenShotOfOwnLayerEx"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IDisplayController::IDisplayController(Core::System& system_, std::shared_ptr applet_) : ServiceFramework{system_, "IDisplayController"}, applet(std::move(applet_)) { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetLastForegroundCaptureImage"}, - {1, nullptr, "UpdateLastForegroundCaptureImage"}, - {2, nullptr, "GetLastApplicationCaptureImage"}, - {3, nullptr, "GetCallerAppletCaptureImage"}, - {4, nullptr, "UpdateCallerAppletCaptureImage"}, - {5, D<&IDisplayController::GetLastForegroundCaptureImageEx>, "GetLastForegroundCaptureImageEx"}, - {6, nullptr, "GetLastApplicationCaptureImageEx"}, - {7, D<&IDisplayController::GetCallerAppletCaptureImageEx>, "GetCallerAppletCaptureImageEx"}, - {8, D<&IDisplayController::TakeScreenShotOfOwnLayer>, "TakeScreenShotOfOwnLayer"}, - {9, nullptr, "CopyBetweenCaptureBuffers"}, - {10, nullptr, "AcquireLastApplicationCaptureBuffer"}, - {11, nullptr, "ReleaseLastApplicationCaptureBuffer"}, - {12, nullptr, "AcquireLastForegroundCaptureBuffer"}, - {13, nullptr, "ReleaseLastForegroundCaptureBuffer"}, - {14, nullptr, "AcquireCallerAppletCaptureBuffer"}, - {15, nullptr, "ReleaseCallerAppletCaptureBuffer"}, - {16, nullptr, "AcquireLastApplicationCaptureBufferEx"}, - {17, nullptr, "AcquireLastForegroundCaptureBufferEx"}, - {18, nullptr, "AcquireCallerAppletCaptureBufferEx"}, - {20, D<&IDisplayController::ClearCaptureBuffer>, "ClearCaptureBuffer"}, - {21, nullptr, "ClearAppletTransitionBuffer"}, - {22, D<&IDisplayController::AcquireLastApplicationCaptureSharedBuffer>, "AcquireLastApplicationCaptureSharedBuffer"}, - {23, D<&IDisplayController::ReleaseLastApplicationCaptureSharedBuffer>, "ReleaseLastApplicationCaptureSharedBuffer"}, - {24, D<&IDisplayController::AcquireLastForegroundCaptureSharedBuffer>, "AcquireLastForegroundCaptureSharedBuffer"}, - {25, D<&IDisplayController::ReleaseLastForegroundCaptureSharedBuffer>, "ReleaseLastForegroundCaptureSharedBuffer"}, - {26, D<&IDisplayController::AcquireCallerAppletCaptureSharedBuffer>, "AcquireCallerAppletCaptureSharedBuffer"}, - {27, D<&IDisplayController::ReleaseCallerAppletCaptureSharedBuffer>, "ReleaseCallerAppletCaptureSharedBuffer"}, - {28, nullptr, "TakeScreenShotOfOwnLayerEx"}, - }; - // clang-format on - - RegisterHandlers(functions); } IDisplayController::~IDisplayController() = default; diff --git a/src/core/hle/service/am/service/display_controller.h b/src/core/hle/service/am/service/display_controller.h index 171feace6e..03d29f93c5 100644 --- a/src/core/hle/service/am/service/display_controller.h +++ b/src/core/hle/service/am/service/display_controller.h @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -35,6 +35,7 @@ private: Out out_fbshare_layer_index); Result ReleaseLastApplicationCaptureSharedBuffer(); + std::optional FindRequest(u32 key) override; const std::shared_ptr applet; }; diff --git a/src/core/hle/service/am/service/global_state_controller.cpp b/src/core/hle/service/am/service/global_state_controller.cpp index 3e3b61b0a0..be080ffcb3 100644 --- a/src/core/hle/service/am/service/global_state_controller.cpp +++ b/src/core/hle/service/am/service/global_state_controller.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,28 +10,28 @@ namespace Service::AM { + std::optional IGlobalStateController::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestToEnterSleep"}, + FunctionInfo{1, nullptr, "EnterSleep"}, + FunctionInfo{2, nullptr, "StartSleepSequence"}, + FunctionInfo{3, D<&IGlobalStateController::StartShutdownSequence>, "StartShutdownSequence"}, + FunctionInfo{4, D<&IGlobalStateController::StartRebootSequence>, "StartRebootSequence"}, + FunctionInfo{9, nullptr, "IsAutoPowerDownRequested"}, + FunctionInfo{10, D<&IGlobalStateController::LoadAndApplyIdlePolicySettings>, "LoadAndApplyIdlePolicySettings"}, + FunctionInfo{11, nullptr, "NotifyCecSettingsChanged"}, + FunctionInfo{12, nullptr, "SetDefaultHomeButtonLongPressTime"}, + FunctionInfo{13, nullptr, "UpdateDefaultDisplayResolution"}, + FunctionInfo{14, D<&IGlobalStateController::ShouldSleepOnBoot>, "ShouldSleepOnBoot"}, + FunctionInfo{15, D<&IGlobalStateController::GetHdcpAuthenticationFailedEvent>, "GetHdcpAuthenticationFailedEvent"}, + FunctionInfo{30, D<&IGlobalStateController::OpenCradleFirmwareUpdater>, "OpenCradleFirmwareUpdater"} + ); + return HandlerTableGenerateWithFind(key, functions); + } + IGlobalStateController::IGlobalStateController(Core::System& system_) : ServiceFramework{system_, "IGlobalStateController"}, m_context{system_, "IGlobalStateController"}, m_hdcp_authentication_failed_event{m_context} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestToEnterSleep"}, - {1, nullptr, "EnterSleep"}, - {2, nullptr, "StartSleepSequence"}, - {3, D<&IGlobalStateController::StartShutdownSequence>, "StartShutdownSequence"}, - {4, D<&IGlobalStateController::StartRebootSequence>, "StartRebootSequence"}, - {9, nullptr, "IsAutoPowerDownRequested"}, - {10, D<&IGlobalStateController::LoadAndApplyIdlePolicySettings>, "LoadAndApplyIdlePolicySettings"}, - {11, nullptr, "NotifyCecSettingsChanged"}, - {12, nullptr, "SetDefaultHomeButtonLongPressTime"}, - {13, nullptr, "UpdateDefaultDisplayResolution"}, - {14, D<&IGlobalStateController::ShouldSleepOnBoot>, "ShouldSleepOnBoot"}, - {15, D<&IGlobalStateController::GetHdcpAuthenticationFailedEvent>, "GetHdcpAuthenticationFailedEvent"}, - {30, D<&IGlobalStateController::OpenCradleFirmwareUpdater>, "OpenCradleFirmwareUpdater"}, - }; - // clang-format on - - RegisterHandlers(functions); } Result IGlobalStateController::StartShutdownSequence() { diff --git a/src/core/hle/service/am/service/global_state_controller.h b/src/core/hle/service/am/service/global_state_controller.h index 83efb57dfc..0de1415295 100644 --- a/src/core/hle/service/am/service/global_state_controller.h +++ b/src/core/hle/service/am/service/global_state_controller.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -23,9 +26,9 @@ private: Result LoadAndApplyIdlePolicySettings(); Result ShouldSleepOnBoot(Out out_should_sleep_on_boot); Result GetHdcpAuthenticationFailedEvent(OutCopyHandle out_event); - Result OpenCradleFirmwareUpdater( - Out> out_cradle_firmware_updater); + Result OpenCradleFirmwareUpdater(Out> out_cradle_firmware_updater); + std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext m_context; Event m_hdcp_authentication_failed_event; }; diff --git a/src/core/hle/service/am/service/home_menu_functions.cpp b/src/core/hle/service/am/service/home_menu_functions.cpp index f9d402ca99..5f61c842a2 100644 --- a/src/core/hle/service/am/service/home_menu_functions.cpp +++ b/src/core/hle/service/am/service/home_menu_functions.cpp @@ -14,31 +14,31 @@ namespace Service::AM { +std::optional IHomeMenuFunctions::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{10, D<&IHomeMenuFunctions::RequestToGetForeground>, "RequestToGetForeground"}, + FunctionInfo{11, D<&IHomeMenuFunctions::LockForeground>, "LockForeground"}, + FunctionInfo{12, D<&IHomeMenuFunctions::UnlockForeground>, "UnlockForeground"}, + FunctionInfo{20, D<&IHomeMenuFunctions::PopFromGeneralChannel>, "PopFromGeneralChannel"}, + FunctionInfo{21, D<&IHomeMenuFunctions::GetPopFromGeneralChannelEvent>, "GetPopFromGeneralChannelEvent"}, + FunctionInfo{30, nullptr, "GetHomeButtonWriterLockAccessor"}, + FunctionInfo{31, nullptr, "GetWriterLockAccessorEx"}, + FunctionInfo{40, D<&IHomeMenuFunctions::IsSleepEnabled>, "IsSleepEnabled"}, + FunctionInfo{41, D<&IHomeMenuFunctions::IsRebootEnabled>, "IsRebootEnabled"}, + FunctionInfo{50, nullptr, "LaunchSystemApplet"}, + FunctionInfo{51, nullptr, "LaunchStarter"}, + FunctionInfo{100, nullptr, "PopRequestLaunchApplicationForDebug"}, + FunctionInfo{110, D<&IHomeMenuFunctions::IsForceTerminateApplicationDisabledForDebug>, "IsForceTerminateApplicationDisabledForDebug"}, + FunctionInfo{200, nullptr, "LaunchDevMenu"}, + FunctionInfo{1000, nullptr, "SetLastApplicationExitReason"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IHomeMenuFunctions::IHomeMenuFunctions(Core::System& system_, std::shared_ptr applet, WindowSystem& window_system) : ServiceFramework{system_, "IHomeMenuFunctions"}, m_window_system{window_system}, m_applet{std::move(applet)}, m_context{system, "IHomeMenuFunctions"} { - // clang-format off - static const FunctionInfo functions[] = { - {10, D<&IHomeMenuFunctions::RequestToGetForeground>, "RequestToGetForeground"}, - {11, D<&IHomeMenuFunctions::LockForeground>, "LockForeground"}, - {12, D<&IHomeMenuFunctions::UnlockForeground>, "UnlockForeground"}, - {20, D<&IHomeMenuFunctions::PopFromGeneralChannel>, "PopFromGeneralChannel"}, - {21, D<&IHomeMenuFunctions::GetPopFromGeneralChannelEvent>, "GetPopFromGeneralChannelEvent"}, - {30, nullptr, "GetHomeButtonWriterLockAccessor"}, - {31, nullptr, "GetWriterLockAccessorEx"}, - {40, D<&IHomeMenuFunctions::IsSleepEnabled>, "IsSleepEnabled"}, - {41, D<&IHomeMenuFunctions::IsRebootEnabled>, "IsRebootEnabled"}, - {50, nullptr, "LaunchSystemApplet"}, - {51, nullptr, "LaunchStarter"}, - {100, nullptr, "PopRequestLaunchApplicationForDebug"}, - {110, D<&IHomeMenuFunctions::IsForceTerminateApplicationDisabledForDebug>, "IsForceTerminateApplicationDisabledForDebug"}, - {200, nullptr, "LaunchDevMenu"}, - {1000, nullptr, "SetLastApplicationExitReason"}, - }; - // clang-format on - - RegisterHandlers(functions); } IHomeMenuFunctions::~IHomeMenuFunctions() = default; diff --git a/src/core/hle/service/am/service/home_menu_functions.h b/src/core/hle/service/am/service/home_menu_functions.h index 2c3ef54375..25eb9db45e 100644 --- a/src/core/hle/service/am/service/home_menu_functions.h +++ b/src/core/hle/service/am/service/home_menu_functions.h @@ -34,6 +34,7 @@ private: Result IsForceTerminateApplicationDisabledForDebug( Out out_is_force_terminate_application_disabled_for_debug); + std::optional FindRequest(u32 key) override; WindowSystem& m_window_system; const std::shared_ptr m_applet; KernelHelpers::ServiceContext m_context; diff --git a/src/core/hle/service/am/service/library_applet_accessor.cpp b/src/core/hle/service/am/service/library_applet_accessor.cpp index 849e5794cf..c5386fb1a1 100644 --- a/src/core/hle/service/am/service/library_applet_accessor.cpp +++ b/src/core/hle/service/am/service/library_applet_accessor.cpp @@ -17,9 +17,7 @@ namespace Service::AM { -namespace { - -void EnableSingleUserPlay(const std::shared_ptr& impl) { +static void EnableSingleUserPlay(const std::shared_ptr& impl) { constexpr s64 DisplayOptionsOffset = 0x90; constexpr s64 IsSkipEnabledOffset = 1; constexpr s64 ShowSkipButtonOffset = 4; @@ -29,7 +27,7 @@ void EnableSingleUserPlay(const std::shared_ptr& impl) { impl->Write(DisplayOptionsOffset + ShowSkipButtonOffset, &enabled, sizeof(enabled)); } -void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr& impl) { +static void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr& impl) { Frontend::UiReturnArg return_arg{}; impl->Read(0, &return_arg, sizeof(return_arg)); @@ -47,42 +45,40 @@ void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr } } -} // namespace + std::optional ILibraryAppletAccessor::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ILibraryAppletAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"}, + FunctionInfo{1, D<&ILibraryAppletAccessor::IsCompleted>, "IsCompleted"}, + FunctionInfo{10, D<&ILibraryAppletAccessor::Start>, "Start"}, + FunctionInfo{20, D<&ILibraryAppletAccessor::RequestExit>, "RequestExit"}, + FunctionInfo{25, D<&ILibraryAppletAccessor::Terminate>, "Terminate"}, + FunctionInfo{30, D<&ILibraryAppletAccessor::GetResult>, "GetResult"}, + FunctionInfo{50, nullptr, "SetOutOfFocusApplicationSuspendingEnabled"}, + FunctionInfo{60, D<&ILibraryAppletAccessor::PresetLibraryAppletGpuTimeSliceZero>, "PresetLibraryAppletGpuTimeSliceZero", MakeVersionGate({10,0,0})}, + FunctionInfo{80, nullptr, "RequestForLibraryAppletToGetForeground", MakeVersionGate({19,0,0})}, + FunctionInfo{81, nullptr, "GetCurrentChildLibraryApplet", MakeVersionGate({19,0,0})}, + FunctionInfo{90, D<&ILibraryAppletAccessor::Unknown90>, "Unknown90", MakeVersionGate({20,0,0})}, + FunctionInfo{100, D<&ILibraryAppletAccessor::PushInData>, "PushInData"}, + FunctionInfo{101, D<&ILibraryAppletAccessor::PopOutData>, "PopOutData"}, + FunctionInfo{102, nullptr, "PushExtraStorage"}, + FunctionInfo{103, D<&ILibraryAppletAccessor::PushInteractiveInData>, "PushInteractiveInData"}, + FunctionInfo{104, D<&ILibraryAppletAccessor::PopInteractiveOutData>, "PopInteractiveOutData"}, + FunctionInfo{105, D<&ILibraryAppletAccessor::GetPopOutDataEvent>, "GetPopOutDataEvent"}, + FunctionInfo{106, D<&ILibraryAppletAccessor::GetPopInteractiveOutDataEvent>, "GetPopInteractiveOutDataEvent"}, + FunctionInfo{110, nullptr, "NeedsToExitProcess"}, + FunctionInfo{120, D<&ILibraryAppletAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"}, + FunctionInfo{150, nullptr, "RequestForAppletToGetForeground"}, + FunctionInfo{160, D<&ILibraryAppletAccessor::GetIndirectLayerConsumerHandle>, "GetIndirectLayerConsumerHandle", MakeVersionGate({2,0,0})}, + FunctionInfo{170, D<&ILibraryAppletAccessor::Unknown170>, "Unknown170", MakeVersionGate({22,0,0})} + ); + return HandlerTableGenerateWithFind(key, functions); + } ILibraryAppletAccessor::ILibraryAppletAccessor(Core::System& system_, std::shared_ptr broker, std::shared_ptr applet) : ServiceFramework{system_, "ILibraryAppletAccessor"}, m_broker{std::move(broker)}, m_applet{std::move(applet)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&ILibraryAppletAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"}, - {1, D<&ILibraryAppletAccessor::IsCompleted>, "IsCompleted"}, - {10, D<&ILibraryAppletAccessor::Start>, "Start"}, - {20, D<&ILibraryAppletAccessor::RequestExit>, "RequestExit"}, - {25, D<&ILibraryAppletAccessor::Terminate>, "Terminate"}, - {30, D<&ILibraryAppletAccessor::GetResult>, "GetResult"}, - {50, nullptr, "SetOutOfFocusApplicationSuspendingEnabled"}, - {60, D<&ILibraryAppletAccessor::PresetLibraryAppletGpuTimeSliceZero>, "PresetLibraryAppletGpuTimeSliceZero"}, //10.0.0+ - {80, nullptr, "RequestForLibraryAppletToGetForeground"}, //19.0.0+ - {81, nullptr, "GetCurrentChildLibraryApplet"}, //19.0.0+ - {90, D<&ILibraryAppletAccessor::Unknown90>, "Unknown90"}, //20.0.0+ - {100, D<&ILibraryAppletAccessor::PushInData>, "PushInData"}, - {101, D<&ILibraryAppletAccessor::PopOutData>, "PopOutData"}, - {102, nullptr, "PushExtraStorage"}, - {103, D<&ILibraryAppletAccessor::PushInteractiveInData>, "PushInteractiveInData"}, - {104, D<&ILibraryAppletAccessor::PopInteractiveOutData>, "PopInteractiveOutData"}, - {105, D<&ILibraryAppletAccessor::GetPopOutDataEvent>, "GetPopOutDataEvent"}, - {106, D<&ILibraryAppletAccessor::GetPopInteractiveOutDataEvent>, "GetPopInteractiveOutDataEvent"}, - {110, nullptr, "NeedsToExitProcess"}, - {120, D<&ILibraryAppletAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"}, - {150, nullptr, "RequestForAppletToGetForeground"}, - {160, D<&ILibraryAppletAccessor::GetIndirectLayerConsumerHandle>, "GetIndirectLayerConsumerHandle"}, //2.0.0+ - {170, D<&ILibraryAppletAccessor::Unknown170>, "Unknown170"}, //22.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); } ILibraryAppletAccessor::~ILibraryAppletAccessor() = default; diff --git a/src/core/hle/service/am/service/library_applet_accessor.h b/src/core/hle/service/am/service/library_applet_accessor.h index ad40bc76c7..e14ddb3bde 100644 --- a/src/core/hle/service/am/service/library_applet_accessor.h +++ b/src/core/hle/service/am/service/library_applet_accessor.h @@ -6,7 +6,6 @@ #pragma once -#include "core/hle/service/am/service/library_applet_self_accessor.h" #include "core/hle/service/cmif_types.h" #include "core/hle/service/service.h" @@ -16,6 +15,26 @@ class AppletDataBroker; struct Applet; class IStorage; +struct LibraryAppletInfo { + AppletId applet_id; + LibraryAppletMode library_applet_mode; +}; +static_assert(sizeof(LibraryAppletInfo) == 0x8, "LibraryAppletInfo has incorrect size."); + +struct ErrorCode { + u32 category; + u32 number; +}; +static_assert(sizeof(ErrorCode) == 0x8, "ErrorCode has incorrect size."); + +struct ErrorContext { + u8 type; + INSERT_PADDING_BYTES_NOINIT(0x7); + std::array data; + Result result; +}; +static_assert(sizeof(ErrorContext) == 0x200, "ErrorContext has incorrect size."); + class ILibraryAppletAccessor final : public ServiceFramework { public: explicit ILibraryAppletAccessor(Core::System& system_, std::shared_ptr broker, @@ -49,6 +68,7 @@ private: void FrontendExecuteInteractive(); void FrontendRequestExit(); + std::optional FindRequest(u32 key) override; const std::shared_ptr m_broker; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/library_applet_creator.cpp b/src/core/hle/service/am/service/library_applet_creator.cpp deleted file mode 100644 index 4ee92908b5..0000000000 --- a/src/core/hle/service/am/service/library_applet_creator.cpp +++ /dev/null @@ -1,287 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "common/settings.h" -#include "core/hle/kernel/k_transfer_memory.h" -#include "core/hle/service/am/applet_data_broker.h" -#include "core/hle/service/am/applet_manager.h" -#include "core/hle/service/am/frontend/applets.h" -#include "core/hle/service/am/library_applet_storage.h" -#include "core/hle/service/am/process_creation.h" -#include "core/hle/service/am/service/library_applet_accessor.h" -#include "core/hle/service/am/service/library_applet_creator.h" - -#include "core/hle/api_version.h" -#include "core/hle/service/am/service/storage.h" -#include "core/hle/service/am/window_system.h" -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/sm/sm.h" - -namespace Service::AM { - -namespace { - -bool ShouldCreateGuestApplet(AppletId applet_id) { -#define X(Name, name) \ - if (applet_id == AppletId::Name && \ - Settings::values.name##_applet_mode.GetValue() != Settings::AppletMode::LLE) { \ - return false; \ - } - - X(Cabinet, cabinet) - X(Controller, controller) - X(DataErase, data_erase) - X(Error, error) - X(NetConnect, net_connect) - X(ProfileSelect, player_select) - X(SoftwareKeyboard, swkbd) - X(MiiEdit, mii_edit) - X(Web, web) - X(Shop, shop) - X(PhotoViewer, photo_viewer) - X(OfflineWeb, offline_web) - X(LoginShare, login_share) - X(WebAuth, wifi_web_auth) - X(MyPage, my_page) - -#undef X - - return true; -} - -AppletProgramId AppletIdToProgramId(AppletId applet_id) { - switch (applet_id) { - case AppletId::OverlayDisplay: - return AppletProgramId::OverlayDisplay; - case AppletId::QLaunch: - return AppletProgramId::QLaunch; - case AppletId::Starter: - return AppletProgramId::Starter; - case AppletId::Auth: - return AppletProgramId::Auth; - case AppletId::Cabinet: - return AppletProgramId::Cabinet; - case AppletId::Controller: - return AppletProgramId::Controller; - case AppletId::DataErase: - return AppletProgramId::DataErase; - case AppletId::Error: - return AppletProgramId::Error; - case AppletId::NetConnect: - return AppletProgramId::NetConnect; - case AppletId::ProfileSelect: - return AppletProgramId::ProfileSelect; - case AppletId::SoftwareKeyboard: - return AppletProgramId::SoftwareKeyboard; - case AppletId::MiiEdit: - return AppletProgramId::MiiEdit; - case AppletId::Web: - return AppletProgramId::Web; - case AppletId::Shop: - return AppletProgramId::Shop; - case AppletId::PhotoViewer: - return AppletProgramId::PhotoViewer; - case AppletId::Settings: - return AppletProgramId::Settings; - case AppletId::OfflineWeb: - return AppletProgramId::OfflineWeb; - case AppletId::LoginShare: - return AppletProgramId::LoginShare; - case AppletId::WebAuth: - return AppletProgramId::WebAuth; - case AppletId::MyPage: - return AppletProgramId::MyPage; - default: - return static_cast(0); - } -} - -std::shared_ptr CreateGuestApplet(Core::System& system, - WindowSystem& window_system, - std::shared_ptr caller_applet, - AppletId applet_id, - LibraryAppletMode mode) { - const auto program_id = static_cast(AppletIdToProgramId(applet_id)); - if (program_id == 0) { - // Unknown applet - return {}; - } - - auto process = CreateProcess(system, program_id, 1, HLE::ApiVersion::HOS_VERSION_MAJOR); - if (process) { - const auto applet = std::make_shared(system, std::move(process), false); - applet->program_id = program_id; - applet->applet_id = applet_id; - applet->type = AppletType::LibraryApplet; - applet->library_applet_mode = mode; - applet->window_visible = mode != LibraryAppletMode::AllForegroundInitiallyHidden; - - auto broker = std::make_shared(system); - applet->caller_applet = caller_applet; - applet->caller_applet_broker = broker; - { - std::scoped_lock lk{caller_applet->lock}; - caller_applet->child_applets.push_back(applet); - } - window_system.TrackApplet(applet, false); - return std::make_shared(system, broker, applet); - } - // Couldn't initialize the guest process - return {}; -} - -std::shared_ptr CreateFrontendApplet(Core::System& system, - WindowSystem& window_system, - std::shared_ptr caller_applet, - AppletId applet_id, - LibraryAppletMode mode) { - const auto program_id = static_cast(AppletIdToProgramId(applet_id)); - - auto process = std::make_unique(system); - auto applet = std::make_shared(system, std::move(process), false); - applet->program_id = program_id; - applet->applet_id = applet_id; - applet->type = AppletType::LibraryApplet; - applet->library_applet_mode = mode; - - auto storage = std::make_shared(system); - applet->caller_applet = caller_applet; - applet->caller_applet_broker = storage; - applet->frontend = system.GetFrontendAppletHolder().GetApplet(applet, applet_id, mode); - { - std::scoped_lock lk{caller_applet->lock}; - caller_applet->child_applets.push_back(applet); - } - return std::make_shared(system, storage, applet); -} - -} // namespace - -ILibraryAppletCreator::ILibraryAppletCreator(Core::System& system_, std::shared_ptr applet, - WindowSystem& window_system) - : ServiceFramework{system_, "ILibraryAppletCreator"}, - m_window_system{window_system}, m_applet{std::move(applet)} { - static const FunctionInfo functions[] = { - {0, D<&ILibraryAppletCreator::CreateLibraryApplet>, "CreateLibraryApplet"}, - {1, nullptr, "TerminateAllLibraryApplets"}, - {2, nullptr, "AreAnyLibraryAppletsLeft"}, - {3, D<&ILibraryAppletCreator::CreateLibraryAppletEx>, "CreateLibraryAppletEx"}, - {10, D<&ILibraryAppletCreator::CreateStorage>, "CreateStorage"}, - {11, D<&ILibraryAppletCreator::CreateTransferMemoryStorage>, "CreateTransferMemoryStorage"}, - {12, D<&ILibraryAppletCreator::CreateHandleStorage>, "CreateHandleStorage"}, - }; - RegisterHandlers(functions); -} - -ILibraryAppletCreator::~ILibraryAppletCreator() = default; - -Result ILibraryAppletCreator::CreateLibraryApplet( - Out> out_library_applet_accessor, AppletId applet_id, - LibraryAppletMode library_applet_mode) { - LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={}", applet_id, - library_applet_mode); - - std::shared_ptr library_applet; - if (ShouldCreateGuestApplet(applet_id)) { - library_applet = - CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); - } - if (!library_applet) { - library_applet = - CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); - } - if (!library_applet) { - LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id); - R_THROW(ResultUnknown); - } - - // Applet is created, can now be launched. - m_applet->library_applet_launchable_event.Signal(system.Kernel()); - *out_library_applet_accessor = library_applet; - R_SUCCEED(); -} - -Result ILibraryAppletCreator::CreateLibraryAppletEx( - Out> out_library_applet_accessor, AppletId applet_id, - LibraryAppletMode library_applet_mode, u64 thread_id) { - LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={} thread_id={}", applet_id, - library_applet_mode, thread_id); - - std::shared_ptr library_applet; - if (ShouldCreateGuestApplet(applet_id)) { - library_applet = - CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); - } - if (!library_applet) { - library_applet = - CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); - } - if (!library_applet) { - LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id); - R_THROW(ResultUnknown); - } - - // Applet is created, can now be launched. - m_applet->library_applet_launchable_event.Signal(system.Kernel()); - *out_library_applet_accessor = library_applet; - R_SUCCEED(); -} - -Result ILibraryAppletCreator::CreateStorage(Out> out_storage, s64 size) { - LOG_DEBUG(Service_AM, "called, size={}", size); - - if (size <= 0) { - LOG_ERROR(Service_AM, "size is less than or equal to 0"); - R_THROW(ResultUnknown); - } - - *out_storage = std::make_shared(system, AM::CreateStorage(std::vector(size))); - R_SUCCEED(); -} - -Result ILibraryAppletCreator::CreateTransferMemoryStorage( - Out> out_storage, bool is_writable, s64 size, - InCopyHandle transfer_memory_handle) { - LOG_DEBUG(Service_AM, "called, is_writable={} size={}", is_writable, size); - - if (size <= 0) { - LOG_ERROR(Service_AM, "size is less than or equal to 0"); - R_THROW(ResultUnknown); - } - - if (!transfer_memory_handle) { - LOG_ERROR(Service_AM, "transfer_memory_handle is null"); - R_THROW(ResultUnknown); - } - - *out_storage = std::make_shared( - system, AM::CreateTransferMemoryStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(), - transfer_memory_handle.Get(), is_writable, size)); - R_SUCCEED(); -} - -Result ILibraryAppletCreator::CreateHandleStorage( - Out> out_storage, s64 size, - InCopyHandle transfer_memory_handle) { - LOG_DEBUG(Service_AM, "called, size={}", size); - - if (size <= 0) { - LOG_ERROR(Service_AM, "size is less than or equal to 0"); - R_THROW(ResultUnknown); - } - - if (!transfer_memory_handle) { - LOG_ERROR(Service_AM, "transfer_memory_handle is null"); - R_THROW(ResultUnknown); - } - - *out_storage = std::make_shared( - system, AM::CreateHandleStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(), - transfer_memory_handle.Get(), size)); - R_SUCCEED(); -} - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/library_applet_creator.h b/src/core/hle/service/am/service/library_applet_creator.h deleted file mode 100644 index 34e7586e8f..0000000000 --- a/src/core/hle/service/am/service/library_applet_creator.h +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/am/am_types.h" -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Service::AM { - -struct Applet; -class ILibraryAppletAccessor; -class IStorage; -class WindowSystem; - -class ILibraryAppletCreator final : public ServiceFramework { -public: - explicit ILibraryAppletCreator(Core::System& system_, std::shared_ptr applet, - WindowSystem& window_system); - ~ILibraryAppletCreator() override; - -private: - Result CreateLibraryApplet( - Out> out_library_applet_accessor, AppletId applet_id, - LibraryAppletMode library_applet_mode); - Result CreateLibraryAppletEx( - Out> out_library_applet_accessor, AppletId applet_id, - LibraryAppletMode library_applet_mode, u64 thread_id); - Result CreateStorage(Out> out_storage, s64 size); - Result CreateTransferMemoryStorage( - Out> out_storage, bool is_writable, s64 size, - InCopyHandle transfer_memory_handle); - Result CreateHandleStorage(Out> out_storage, s64 size, - InCopyHandle transfer_memory_handle); - - WindowSystem& m_window_system; - const std::shared_ptr m_applet; -}; - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/library_applet_proxy.cpp b/src/core/hle/service/am/service/library_applet_proxy.cpp deleted file mode 100644 index f9cfb82a90..0000000000 --- a/src/core/hle/service/am/service/library_applet_proxy.cpp +++ /dev/null @@ -1,134 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/am/service/applet_common_functions.h" -#include "core/hle/service/am/service/audio_controller.h" -#include "core/hle/service/am/service/common_state_getter.h" -#include "core/hle/service/am/service/debug_functions.h" -#include "core/hle/service/am/service/display_controller.h" -#include "core/hle/service/am/service/global_state_controller.h" -#include "core/hle/service/am/service/home_menu_functions.h" -#include "core/hle/service/am/service/library_applet_creator.h" -#include "core/hle/service/am/service/library_applet_proxy.h" -#include "core/hle/service/am/service/library_applet_self_accessor.h" -#include "core/hle/service/am/service/process_winding_controller.h" -#include "core/hle/service/am/service/self_controller.h" -#include "core/hle/service/am/service/window_controller.h" -#include "core/hle/service/cmif_serialization.h" - -namespace Service::AM { - -ILibraryAppletProxy::ILibraryAppletProxy(Core::System& system_, std::shared_ptr applet, - Kernel::KProcess* process, WindowSystem& window_system) - : ServiceFramework{system_, "ILibraryAppletProxy"}, - m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&ILibraryAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, - {1, D<&ILibraryAppletProxy::GetSelfController>, "GetSelfController"}, - {2, D<&ILibraryAppletProxy::GetWindowController>, "GetWindowController"}, - {3, D<&ILibraryAppletProxy::GetAudioController>, "GetAudioController"}, - {4, D<&ILibraryAppletProxy::GetDisplayController>, "GetDisplayController"}, - {10, D<&ILibraryAppletProxy::GetProcessWindingController>, "GetProcessWindingController"}, - {11, D<&ILibraryAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, - {20, D<&ILibraryAppletProxy::OpenLibraryAppletSelfAccessor>, "OpenLibraryAppletSelfAccessor"}, - {21, D<&ILibraryAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"}, - {22, D<&ILibraryAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"}, - {23, D<&ILibraryAppletProxy::GetGlobalStateController>, "GetGlobalStateController"}, - {1000, D<&ILibraryAppletProxy::GetDebugFunctions>, "GetDebugFunctions"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -ILibraryAppletProxy::~ILibraryAppletProxy() = default; - -Result ILibraryAppletProxy::GetAudioController( - Out> out_audio_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_audio_controller = std::make_shared(system); - R_SUCCEED(); -} - -Result ILibraryAppletProxy::GetDisplayController( - Out> out_display_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_display_controller = std::make_shared(system, m_applet); - R_SUCCEED(); -} - -Result ILibraryAppletProxy::GetProcessWindingController( - Out> out_process_winding_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_process_winding_controller = std::make_shared(system, m_applet); - R_SUCCEED(); -} - -Result ILibraryAppletProxy::GetDebugFunctions( - Out> out_debug_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_debug_functions = std::make_shared(system); - R_SUCCEED(); -} - -Result ILibraryAppletProxy::GetWindowController( - Out> out_window_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_window_controller = std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); -} - -Result ILibraryAppletProxy::GetSelfController( - Out> out_self_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_self_controller = std::make_shared(system, m_applet, m_process); - R_SUCCEED(); -} - -Result ILibraryAppletProxy::GetCommonStateGetter( - Out> out_common_state_getter) { - LOG_DEBUG(Service_AM, "called"); - *out_common_state_getter = std::make_shared(system, m_applet); - R_SUCCEED(); -} - -Result ILibraryAppletProxy::GetLibraryAppletCreator( - Out> out_library_applet_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_creator = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); -} - -Result ILibraryAppletProxy::OpenLibraryAppletSelfAccessor( - Out> out_library_applet_self_accessor) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_self_accessor = - std::make_shared(system, m_applet); - R_SUCCEED(); -} - -Result ILibraryAppletProxy::GetAppletCommonFunctions( - Out> out_applet_common_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_applet_common_functions = std::make_shared(system, m_applet); - R_SUCCEED(); -} - -Result ILibraryAppletProxy::GetHomeMenuFunctions( - Out> out_home_menu_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_home_menu_functions = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); -} - -Result ILibraryAppletProxy::GetGlobalStateController( - Out> out_global_state_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_global_state_controller = std::make_shared(system); - R_SUCCEED(); -} - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/library_applet_proxy.h b/src/core/hle/service/am/service/library_applet_proxy.h deleted file mode 100644 index 792d585827..0000000000 --- a/src/core/hle/service/am/service/library_applet_proxy.h +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Service::AM { - -struct Applet; -class IAppletCommonFunctions; -class IAudioController; -class ICommonStateGetter; -class IDebugFunctions; -class IDisplayController; -class IHomeMenuFunctions; -class IGlobalStateController; -class ILibraryAppletCreator; -class ILibraryAppletSelfAccessor; -class IProcessWindingController; -class ISelfController; -class IWindowController; -class WindowSystem; - -class ILibraryAppletProxy final : public ServiceFramework { -public: - explicit ILibraryAppletProxy(Core::System& system_, std::shared_ptr applet, - Kernel::KProcess* process, WindowSystem& window_system); - ~ILibraryAppletProxy(); - -private: - Result GetAudioController(Out> out_audio_controller); - Result GetDisplayController(Out> out_display_controller); - Result GetProcessWindingController( - Out> out_process_winding_controller); - Result GetDebugFunctions(Out> out_debug_functions); - Result GetWindowController(Out> out_window_controller); - Result GetSelfController(Out> out_self_controller); - Result GetCommonStateGetter(Out> out_common_state_getter); - Result GetLibraryAppletCreator( - Out> out_library_applet_creator); - Result OpenLibraryAppletSelfAccessor( - Out> out_library_applet_self_accessor); - Result GetAppletCommonFunctions( - Out> out_applet_common_functions); - Result GetHomeMenuFunctions(Out> out_home_menu_functions); - Result GetGlobalStateController( - Out> out_global_state_controller); - - WindowSystem& m_window_system; - Kernel::KProcess* const m_process; - const std::shared_ptr m_applet; -}; - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/library_applet_self_accessor.cpp b/src/core/hle/service/am/service/library_applet_self_accessor.cpp deleted file mode 100644 index 907be49204..0000000000 --- a/src/core/hle/service/am/service/library_applet_self_accessor.cpp +++ /dev/null @@ -1,332 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/core_timing.h" -#include "core/file_sys/control_metadata.h" -#include "core/file_sys/patch_manager.h" -#include "core/file_sys/registered_cache.h" -#include "core/hle/service/acc/profile_manager.h" -#include "core/hle/service/am/applet_data_broker.h" -#include "core/hle/service/am/applet_manager.h" -#include "core/hle/service/am/frontend/applets.h" -#include "core/hle/service/am/service/library_applet_self_accessor.h" -#include "core/hle/service/am/service/storage.h" -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/filesystem/filesystem.h" -#include "core/hle/service/glue/glue_manager.h" -#include "core/hle/service/ns/application_manager_interface.h" -#include "core/hle/service/ns/service_getter_interface.h" -#include "core/hle/service/sm/sm.h" - -namespace Service::AM { - -namespace { - -AppletIdentityInfo GetCallerIdentity(Applet& applet) { - if (const auto caller_applet = applet.caller_applet.lock(); caller_applet) { - // TODO: is this actually the application ID? - return { - .applet_id = caller_applet->applet_id, - .application_id = caller_applet->program_id, - }; - } else { - return { - .applet_id = AppletId::QLaunch, - .application_id = 0x0100000000001000ull, - }; - } -} - -} // namespace - -ILibraryAppletSelfAccessor::ILibraryAppletSelfAccessor(Core::System& system_, - std::shared_ptr applet) - : ServiceFramework{system_, "ILibraryAppletSelfAccessor"}, m_applet{std::move(applet)}, - m_broker{m_applet->caller_applet_broker} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&ILibraryAppletSelfAccessor::PopInData>, "PopInData"}, - {1, D<&ILibraryAppletSelfAccessor::PushOutData>, "PushOutData"}, - {2, D<&ILibraryAppletSelfAccessor::PopInteractiveInData>, "PopInteractiveInData"}, - {3, D<&ILibraryAppletSelfAccessor::PushInteractiveOutData>, "PushInteractiveOutData"}, - {5, D<&ILibraryAppletSelfAccessor::GetPopInDataEvent>, "GetPopInDataEvent"}, - {6, D<&ILibraryAppletSelfAccessor::GetPopInteractiveInDataEvent>, "GetPopInteractiveInDataEvent"}, - {10, D<&ILibraryAppletSelfAccessor::ExitProcessAndReturn>, "ExitProcessAndReturn"}, - {11, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"}, - {12, D<&ILibraryAppletSelfAccessor::GetMainAppletIdentityInfo>, "GetMainAppletIdentityInfo"}, - {13, D<&ILibraryAppletSelfAccessor::CanUseApplicationCore>, "CanUseApplicationCore"}, - {14, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo>, "GetCallerAppletIdentityInfo"}, - {15, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationControlProperty>, "GetMainAppletApplicationControlProperty"}, - {16, D<&ILibraryAppletSelfAccessor::GetMainAppletStorageId>, "GetMainAppletStorageId"}, - {17, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfoStack>, "GetCallerAppletIdentityInfoStack"}, - {18, nullptr, "GetNextReturnDestinationAppletIdentityInfo"}, - {19, D<&ILibraryAppletSelfAccessor::GetDesirableKeyboardLayout>, "GetDesirableKeyboardLayout"}, - {20, nullptr, "PopExtraStorage"}, - {25, nullptr, "GetPopExtraStorageEvent"}, - {30, D<&ILibraryAppletSelfAccessor::UnpopInData>, "UnpopInData"}, - {31, nullptr, "UnpopExtraStorage"}, - {40, nullptr, "GetIndirectLayerProducerHandle"}, - {50, D<&ILibraryAppletSelfAccessor::ReportVisibleError>, "ReportVisibleError"}, - {51, D<&ILibraryAppletSelfAccessor::ReportVisibleErrorWithErrorContext>, "ReportVisibleErrorWithErrorContext"}, - {60, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage>, "GetMainAppletApplicationDesiredLanguage"}, - {70, D<&ILibraryAppletSelfAccessor::GetCurrentApplicationId>, "GetCurrentApplicationId"}, - {80, nullptr, "RequestExitToSelf"}, - {90, nullptr, "CreateApplicationAndPushAndRequestToLaunch"}, - {100, nullptr, "CreateGameMovieTrimmer"}, - {101, nullptr, "ReserveResourceForMovieOperation"}, - {102, nullptr, "UnreserveResourceForMovieOperation"}, - {110, D<&ILibraryAppletSelfAccessor::GetMainAppletAvailableUsers>, "GetMainAppletAvailableUsers"}, - {120, nullptr, "GetLaunchStorageInfoForDebug"}, - {130, nullptr, "GetGpuErrorDetectedSystemEvent"}, - {140, nullptr, "SetApplicationMemoryReservation"}, - {150, D<&ILibraryAppletSelfAccessor::ShouldSetGpuTimeSliceManually>, "ShouldSetGpuTimeSliceManually"}, - {160, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfoEx>, "GetLibraryAppletInfoEx"}, - }; - // clang-format on - RegisterHandlers(functions); -} - -ILibraryAppletSelfAccessor::~ILibraryAppletSelfAccessor() = default; - -Result ILibraryAppletSelfAccessor::PopInData(Out> out_storage) { - LOG_INFO(Service_AM, "called"); - R_RETURN(m_broker->GetInData().Pop(system.Kernel(), out_storage)); -} - -Result ILibraryAppletSelfAccessor::PushOutData(SharedPointer storage) { - LOG_INFO(Service_AM, "called"); - m_broker->GetOutData().Push(system.Kernel(), storage); - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::PopInteractiveInData(Out> out_storage) { - LOG_INFO(Service_AM, "called"); - R_RETURN(m_broker->GetInteractiveInData().Pop(system.Kernel(), out_storage)); -} - -Result ILibraryAppletSelfAccessor::PushInteractiveOutData(SharedPointer storage) { - LOG_INFO(Service_AM, "called"); - m_broker->GetInteractiveOutData().Push(system.Kernel(), storage); - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::GetPopInDataEvent( - OutCopyHandle out_event) { - LOG_INFO(Service_AM, "called"); - *out_event = m_broker->GetInData().GetEvent(); - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::GetPopInteractiveInDataEvent( - OutCopyHandle out_event) { - LOG_INFO(Service_AM, "called"); - *out_event = m_broker->GetInteractiveInData().GetEvent(); - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::GetLibraryAppletInfo( - Out out_library_applet_info) { - LOG_INFO(Service_AM, "called"); - *out_library_applet_info = { - .applet_id = m_applet->applet_id, - .library_applet_mode = m_applet->library_applet_mode, - }; - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::GetMainAppletIdentityInfo( - Out out_identity_info) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_identity_info = { - .applet_id = AppletId::QLaunch, - .application_id = 0x0100000000001000ull, - }; - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::CanUseApplicationCore(Out out_can_use_application_core) { - // TODO: This appears to read the NPDM from state and check the core mask of the applet. - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_can_use_application_core = false; - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::GetMainAppletApplicationControlProperty( - OutLargeData, BufferAttr_HipcMapAlias> out_nacp) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - - // TODO: this should be the main applet, not the caller applet - const auto application = GetCallerIdentity(*m_applet); - std::vector nacp; - const auto result = - system.GetARPManager().GetControlProperty(&nacp, application.application_id); - - if (R_SUCCEEDED(result)) { - std::memcpy(out_nacp->data(), nacp.data(), (std::min)(nacp.size(), out_nacp->size())); - } - - R_RETURN(result); -} - -Result ILibraryAppletSelfAccessor::GetMainAppletStorageId(Out out_storage_id) { - LOG_INFO(Service_AM, "(STUBBED) called"); - *out_storage_id = FileSys::StorageId::NandUser; - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::ExitProcessAndReturn() { - LOG_INFO(Service_AM, "called"); - - if (const auto caller_applet = m_applet->caller_applet.lock(); caller_applet) { - m_applet->process->Terminate(); - } else { - system.GetUserChannel() = m_applet->user_channel_launch_parameter; - system.ExecuteProgram(0); - } - - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo( - Out out_identity_info) { - LOG_INFO(Service_AM, "called"); - *out_identity_info = GetCallerIdentity(*m_applet); - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfoStack( - Out out_count, OutArray out_identity_info) { - LOG_INFO(Service_AM, "called"); - - std::shared_ptr applet = m_applet; - *out_count = 0; - - do { - if (*out_count >= static_cast(out_identity_info.size())) { - break; - } - out_identity_info[(*out_count)++] = GetCallerIdentity(*applet); - } while ((applet = applet->caller_applet.lock())); - - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::GetDesirableKeyboardLayout(Out out_desirable_layout) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_desirable_layout = 0; - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::ReportVisibleError(ErrorCode error_code) { - LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category, - error_code.number); - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::ReportVisibleErrorWithErrorContext( - ErrorCode error_code, InLargeData error_context) { - LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category, - error_code.number); - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::UnpopInData(SharedPointer storage) { - LOG_INFO(Service_AM, "called"); - m_broker->GetInData().Unpop(system.Kernel(), storage); - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage( - Out out_desired_language) { - // FIXME: this is copied from IApplicationFunctions::GetDesiredLanguage - // FIXME: all of this stuff belongs to ns - auto identity = GetCallerIdentity(*m_applet); - - // TODO(bunnei): This should be configurable - LOG_DEBUG(Service_AM, "called"); - - // Get supported languages from NACP, if possible - // Default to 0 (all languages supported) - u32 supported_languages = 0; - - const auto res = FileSys::PatchManager::GetMetadataFromBaseOrUpdate(system, identity.application_id); - - if (res.first != nullptr) { - supported_languages = res.first->GetSupportedLanguages(); - } - - // Call IApplicationManagerInterface implementation. - auto& service_manager = system.ServiceManager(); - auto ns_am2 = service_manager.GetService("ns:am2"); - - std::shared_ptr app_man; - R_TRY(ns_am2->GetApplicationManagerInterface(&app_man)); - - // Get desired application language - NS::ApplicationLanguage desired_language{}; - R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages)); - - // Convert to settings language code. - u64 language_code{}; - R_TRY(app_man->ConvertApplicationLanguageToLanguageCode(&language_code, desired_language)); - - LOG_DEBUG(Service_AM, "got desired_language={:016X}", language_code); - - *out_desired_language = language_code; - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::GetCurrentApplicationId(Out out_application_id) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - - // TODO: this should be the main applet, not the caller applet - const auto main_applet = GetCallerIdentity(*m_applet); - *out_application_id = main_applet.application_id; - - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::GetMainAppletAvailableUsers( - Out out_can_select_any_user, Out out_users_count, - OutArray out_users) { - const Service::Account::ProfileManager manager{}; - - *out_can_select_any_user = false; - *out_users_count = -1; - - LOG_INFO(Service_AM, "called"); - - if (manager.GetUserCount() > 0) { - *out_can_select_any_user = true; - *out_users_count = static_cast(manager.GetUserCount()); - - const auto users = manager.GetAllUsers(); - for (size_t i = 0; i < users.size() && i < out_users.size(); i++) { - out_users[i] = users[i]; - } - } - - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::ShouldSetGpuTimeSliceManually( - Out out_should_set_gpu_time_slice_manually) { - LOG_INFO(Service_AM, "(STUBBED) called"); - *out_should_set_gpu_time_slice_manually = false; - R_SUCCEED(); -} - -Result ILibraryAppletSelfAccessor::GetLibraryAppletInfoEx( - Out out_library_applet_info) { - LOG_INFO(Service_AM, "called"); - *out_library_applet_info = { - .applet_id = m_applet->applet_id, - .library_applet_mode = m_applet->library_applet_mode, - }; - R_SUCCEED(); -} - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/library_applet_self_accessor.h b/src/core/hle/service/am/service/library_applet_self_accessor.h deleted file mode 100644 index d287f6b403..0000000000 --- a/src/core/hle/service/am/service/library_applet_self_accessor.h +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "common/uuid.h" -#include "core/hle/service/am/am_types.h" -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace FileSys { -enum class StorageId : u8; -} - -namespace Kernel { -class KReadableEvent; -} - -namespace Service::AM { - -class AppletDataBroker; -struct Applet; -class IStorage; - -struct LibraryAppletInfo { - AppletId applet_id; - LibraryAppletMode library_applet_mode; -}; -static_assert(sizeof(LibraryAppletInfo) == 0x8, "LibraryAppletInfo has incorrect size."); - -struct ErrorCode { - u32 category; - u32 number; -}; -static_assert(sizeof(ErrorCode) == 0x8, "ErrorCode has incorrect size."); - -struct ErrorContext { - u8 type; - INSERT_PADDING_BYTES_NOINIT(0x7); - std::array data; - Result result; -}; -static_assert(sizeof(ErrorContext) == 0x200, "ErrorContext has incorrect size."); - -class ILibraryAppletSelfAccessor final : public ServiceFramework { -public: - explicit ILibraryAppletSelfAccessor(Core::System& system_, std::shared_ptr applet); - ~ILibraryAppletSelfAccessor() override; - -private: - Result PopInData(Out> out_storage); - Result PushOutData(SharedPointer storage); - Result PopInteractiveInData(Out> out_storage); - Result PushInteractiveOutData(SharedPointer storage); - Result GetPopInDataEvent(OutCopyHandle out_event); - Result GetPopInteractiveInDataEvent(OutCopyHandle out_event); - Result GetLibraryAppletInfo(Out out_library_applet_info); - Result GetMainAppletIdentityInfo(Out out_identity_info); - Result CanUseApplicationCore(Out out_can_use_application_core); - Result GetMainAppletApplicationControlProperty( - OutLargeData, BufferAttr_HipcMapAlias> out_nacp); - Result GetMainAppletStorageId(Out out_storage_id); - Result ExitProcessAndReturn(); - Result GetCallerAppletIdentityInfo(Out out_identity_info); - Result GetCallerAppletIdentityInfoStack( - Out out_count, - OutArray out_identity_info); - Result GetDesirableKeyboardLayout(Out out_desirable_layout); - Result ReportVisibleError(ErrorCode error_code); - Result ReportVisibleErrorWithErrorContext( - ErrorCode error_code, InLargeData error_context); - Result UnpopInData(SharedPointer storage); - Result GetMainAppletApplicationDesiredLanguage(Out out_desired_language); - Result GetCurrentApplicationId(Out out_application_id); - Result GetMainAppletAvailableUsers(Out out_can_select_any_user, Out out_users_count, - OutArray out_users); - Result ShouldSetGpuTimeSliceManually(Out out_should_set_gpu_time_slice_manually); - Result GetLibraryAppletInfoEx(Out out_library_applet_info); - - const std::shared_ptr m_applet; - const std::shared_ptr m_broker; -}; - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/lock_accessor.cpp b/src/core/hle/service/am/service/lock_accessor.cpp deleted file mode 100644 index 0341254449..0000000000 --- a/src/core/hle/service/am/service/lock_accessor.cpp +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/am/service/lock_accessor.h" -#include "core/hle/service/cmif_serialization.h" - -namespace Service::AM { - -ILockAccessor::ILockAccessor(Core::System& system_) - : ServiceFramework{system_, "ILockAccessor"}, m_context{system_, "ILockAccessor"}, - m_event{m_context} { - // clang-format off - static const FunctionInfo functions[] = { - {1, D<&ILockAccessor::TryLock>, "TryLock"}, - {2, D<&ILockAccessor::Unlock>, "Unlock"}, - {3, D<&ILockAccessor::GetEvent>, "GetEvent"}, - {4, D<&ILockAccessor::IsLocked>, "IsLocked"}, - }; - // clang-format on - - RegisterHandlers(functions); - - m_event.Signal(system.Kernel()); -} - -ILockAccessor::~ILockAccessor() = default; - -Result ILockAccessor::TryLock(Out out_is_locked, - OutCopyHandle out_handle, - bool return_handle) { - LOG_INFO(Service_AM, "called, return_handle={}", return_handle); - - { - std::scoped_lock lk{m_mutex}; - if (m_is_locked) { - *out_is_locked = false; - } else { - m_is_locked = true; - *out_is_locked = true; - } - } - - if (return_handle) { - *out_handle = m_event.GetHandle(); - } - - R_SUCCEED(); -} - -Result ILockAccessor::Unlock() { - LOG_INFO(Service_AM, "called"); - - { - std::scoped_lock lk{m_mutex}; - m_is_locked = false; - } - - m_event.Signal(system.Kernel()); - R_SUCCEED(); -} - -Result ILockAccessor::GetEvent(OutCopyHandle out_handle) { - LOG_INFO(Service_AM, "called"); - *out_handle = m_event.GetHandle(); - R_SUCCEED(); -} - -Result ILockAccessor::IsLocked(Out out_is_locked) { - LOG_INFO(Service_AM, "called"); - std::scoped_lock lk{m_mutex}; - *out_is_locked = m_is_locked; - R_SUCCEED(); -} - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/lock_accessor.h b/src/core/hle/service/am/service/lock_accessor.h deleted file mode 100644 index 9bfb5c0502..0000000000 --- a/src/core/hle/service/am/service/lock_accessor.h +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/kernel_helpers.h" -#include "core/hle/service/os/event.h" -#include "core/hle/service/service.h" - -namespace Service::AM { - -class ILockAccessor final : public ServiceFramework { -public: - explicit ILockAccessor(Core::System& system_); - ~ILockAccessor() override; - -private: - Result TryLock(Out out_is_locked, OutCopyHandle out_handle, - bool return_handle); - Result Unlock(); - Result GetEvent(OutCopyHandle out_handle); - Result IsLocked(Out out_is_locked); - -private: - KernelHelpers::ServiceContext m_context; - Event m_event; - std::mutex m_mutex{}; - bool m_is_locked{}; -}; - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/overlay_applet_proxy.cpp b/src/core/hle/service/am/service/overlay_applet_proxy.cpp deleted file mode 100644 index 5e140fe031..0000000000 --- a/src/core/hle/service/am/service/overlay_applet_proxy.cpp +++ /dev/null @@ -1,120 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "core/hle/service/am/service/common_state_getter.h" -#include "core/hle/service/am/service/display_controller.h" -#include "core/hle/service/am/service/global_state_controller.h" -#include "core/hle/service/am/service/audio_controller.h" -#include "core/hle/service/am/service/applet_common_functions.h" -#include "core/hle/service/am/service/overlay_applet_proxy.h" -#include "core/hle/service/am/service/library_applet_creator.h" -#include "core/hle/service/am/service/process_winding_controller.h" -#include "core/hle/service/am/service/self_controller.h" -#include "core/hle/service/am/service/window_controller.h" -#include "core/hle/service/am/service/debug_functions.h" -#include "core/hle/service/cmif_serialization.h" - -namespace Service::AM { - IOverlayAppletProxy::IOverlayAppletProxy(Core::System &system_, std::shared_ptr applet, - Kernel::KProcess *process, WindowSystem &window_system) - : ServiceFramework{system_, "IOverlayAppletProxy"}, - m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IOverlayAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, - {1, D<&IOverlayAppletProxy::GetSelfController>, "GetSelfController"}, - {2, D<&IOverlayAppletProxy::GetWindowController>, "GetWindowController"}, - {3, D<&IOverlayAppletProxy::GetAudioController>, "GetAudioController"}, - {4, D<&IOverlayAppletProxy::GetDisplayController>, "GetDisplayController"}, - {10, D<&IOverlayAppletProxy::GetProcessWindingController>, "GetProcessWindingController"}, - {11, D<&IOverlayAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, - {20, D<&IOverlayAppletProxy::GetOverlayFunctions>, "GetOverlayFunctions"}, - {21, D<&IOverlayAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"}, - {23, D<&IOverlayAppletProxy::GetGlobalStateController>, "GetGlobalStateController"}, - {1000, D<&IOverlayAppletProxy::GetDebugFunctions>, "GetDebugFunctions"}, - }; - // clang-format on - - RegisterHandlers(functions); - } - - IOverlayAppletProxy::~IOverlayAppletProxy() = default; - - Result IOverlayAppletProxy::GetCommonStateGetter( - Out > out_common_state_getter) { - LOG_DEBUG(Service_AM, "called"); - *out_common_state_getter = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result IOverlayAppletProxy::GetSelfController( - Out > out_self_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_self_controller = std::make_shared(system, m_applet, m_process); - R_SUCCEED(); - } - - Result IOverlayAppletProxy::GetWindowController( - Out > out_window_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_window_controller = std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result IOverlayAppletProxy::GetAudioController( - Out > out_audio_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_audio_controller = std::make_shared(system); - R_SUCCEED(); - } - - Result IOverlayAppletProxy::GetDisplayController( - Out > out_display_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_display_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result IOverlayAppletProxy::GetProcessWindingController( - Out > out_process_winding_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_process_winding_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result IOverlayAppletProxy::GetLibraryAppletCreator( - Out > out_library_applet_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_creator = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result IOverlayAppletProxy::GetOverlayFunctions( - Out > out_overlay_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_overlay_functions = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result IOverlayAppletProxy::GetAppletCommonFunctions( - Out > out_applet_common_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_applet_common_functions = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result IOverlayAppletProxy::GetGlobalStateController( - Out > out_global_state_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_global_state_controller = std::make_shared(system); - R_SUCCEED(); - } - - Result IOverlayAppletProxy::GetDebugFunctions( - Out > out_debug_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_debug_functions = std::make_shared(system); - R_SUCCEED(); - } -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/overlay_applet_proxy.h b/src/core/hle/service/am/service/overlay_applet_proxy.h deleted file mode 100644 index 2c7fa57dfd..0000000000 --- a/src/core/hle/service/am/service/overlay_applet_proxy.h +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" -#include "core/hle/service/am/service/overlay_functions.h" - -namespace Service::AM { - -struct Applet; -class IAppletCommonFunctions; -class IAudioController; -class ICommonStateGetter; -class IDebugFunctions; -class IDisplayController; -class IHomeMenuFunctions; -class IGlobalStateController; -class ILibraryAppletCreator; -class ILibraryAppletSelfAccessor; -class IProcessWindingController; -class ISelfController; -class IWindowController; -class WindowSystem; - -class IOverlayAppletProxy final : public ServiceFramework { -public: - explicit IOverlayAppletProxy(Core::System& system_, std::shared_ptr applet, - Kernel::KProcess* process, WindowSystem& window_system); - ~IOverlayAppletProxy(); - -private: - Result GetCommonStateGetter(Out> out_common_state_getter); - Result GetSelfController(Out> out_self_controller); - Result GetWindowController(Out> out_window_controller); - Result GetAudioController(Out> out_audio_controller); - Result GetDisplayController(Out> out_display_controller); - Result GetProcessWindingController( - Out> out_process_winding_controller); - Result GetLibraryAppletCreator( - Out> out_library_applet_creator); - Result GetOverlayFunctions(Out> out_overlay_functions); - Result GetAppletCommonFunctions( - Out> out_applet_common_functions); - Result GetGlobalStateController( - Out> out_global_state_controller); - Result GetDebugFunctions(Out> out_debug_functions); - - WindowSystem& m_window_system; - Kernel::KProcess* const m_process; - const std::shared_ptr m_applet; -}; - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/overlay_functions.cpp b/src/core/hle/service/am/service/overlay_functions.cpp index 8150b5dd07..006610bd47 100644 --- a/src/core/hle/service/am/service/overlay_functions.cpp +++ b/src/core/hle/service/am/service/overlay_functions.cpp @@ -8,34 +8,34 @@ #include "core/hle/service/am/window_system.h" namespace Service::AM { + std::optional IOverlayFunctions::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IOverlayFunctions::BeginToWatchShortHomeButtonMessage>, "BeginToWatchShortHomeButtonMessage"}, + FunctionInfo{1, D<&IOverlayFunctions::EndToWatchShortHomeButtonMessage>, "EndToWatchShortHomeButtonMessage"}, + FunctionInfo{2, D<&IOverlayFunctions::GetApplicationIdForLogo>, "GetApplicationIdForLogo"}, + FunctionInfo{3, nullptr, "SetGpuTimeSliceBoost"}, + FunctionInfo{4, D<&IOverlayFunctions::SetAutoSleepTimeAndDimmingTimeEnabled>, "SetAutoSleepTimeAndDimmingTimeEnabled"}, + FunctionInfo{5, nullptr, "TerminateApplicationAndSetReason"}, + FunctionInfo{6, nullptr, "SetScreenShotPermissionGlobally"}, + FunctionInfo{10, nullptr, "StartShutdownSequenceForOverlay"}, + FunctionInfo{11, nullptr, "StartRebootSequenceForOverlay"}, + FunctionInfo{20, D<&IOverlayFunctions::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"}, + FunctionInfo{21, D<&IOverlayFunctions::SetHandlingTouchScreenInputEnabled>, "SetHandlingTouchScreenInputEnabled"}, + FunctionInfo{30, nullptr, "SetHealthWarningShowingState"}, + FunctionInfo{31, D<&IOverlayFunctions::IsHealthWarningRequired>, "IsHealthWarningRequired"}, + FunctionInfo{40, nullptr, "GetApplicationNintendoLogo"}, + FunctionInfo{41, nullptr, "GetApplicationStartupMovie"}, + FunctionInfo{50, nullptr, "SetGpuTimeSliceBoostForApplication"}, + FunctionInfo{60, nullptr, "Unknown60"}, + FunctionInfo{70, D<&IOverlayFunctions::Unknown70>, "Unknown70"}, + FunctionInfo{90, nullptr, "SetRequiresGpuResourceUse"}, + FunctionInfo{101, nullptr, "BeginToObserveHidInputForDevelop"} + ); + return HandlerTableGenerateWithFind(key, functions); + } + IOverlayFunctions::IOverlayFunctions(Core::System &system_, std::shared_ptr applet) : ServiceFramework{system_, "IOverlayFunctions"}, m_applet{std::move(applet)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IOverlayFunctions::BeginToWatchShortHomeButtonMessage>, "BeginToWatchShortHomeButtonMessage"}, - {1, D<&IOverlayFunctions::EndToWatchShortHomeButtonMessage>, "EndToWatchShortHomeButtonMessage"}, - {2, D<&IOverlayFunctions::GetApplicationIdForLogo>, "GetApplicationIdForLogo"}, - {3, nullptr, "SetGpuTimeSliceBoost"}, - {4, D<&IOverlayFunctions::SetAutoSleepTimeAndDimmingTimeEnabled>, "SetAutoSleepTimeAndDimmingTimeEnabled"}, - {5, nullptr, "TerminateApplicationAndSetReason"}, - {6, nullptr, "SetScreenShotPermissionGlobally"}, - {10, nullptr, "StartShutdownSequenceForOverlay"}, - {11, nullptr, "StartRebootSequenceForOverlay"}, - {20, D<&IOverlayFunctions::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"}, - {21, D<&IOverlayFunctions::SetHandlingTouchScreenInputEnabled>, "SetHandlingTouchScreenInputEnabled"}, - {30, nullptr, "SetHealthWarningShowingState"}, - {31, D<&IOverlayFunctions::IsHealthWarningRequired>, "IsHealthWarningRequired"}, - {40, nullptr, "GetApplicationNintendoLogo"}, - {41, nullptr, "GetApplicationStartupMovie"}, - {50, nullptr, "SetGpuTimeSliceBoostForApplication"}, - {60, nullptr, "Unknown60"}, - {70, D<&IOverlayFunctions::Unknown70>, "Unknown70"}, - {90, nullptr, "SetRequiresGpuResourceUse"}, - {101, nullptr, "BeginToObserveHidInputForDevelop"}, - }; - // clang-format on - - RegisterHandlers(functions); } IOverlayFunctions::~IOverlayFunctions() = default; diff --git a/src/core/hle/service/am/service/overlay_functions.h b/src/core/hle/service/am/service/overlay_functions.h index eefd8d862b..b94f0cc0d5 100644 --- a/src/core/hle/service/am/service/overlay_functions.h +++ b/src/core/hle/service/am/service/overlay_functions.h @@ -6,24 +6,25 @@ #include "core/hle/service/service.h" namespace Service::AM { - struct Applet; +struct Applet; - class IOverlayFunctions final : public ServiceFramework { - public: - explicit IOverlayFunctions(Core::System &system_, std::shared_ptr applet); - ~IOverlayFunctions() override; +class IOverlayFunctions final : public ServiceFramework { +public: + explicit IOverlayFunctions(Core::System &system_, std::shared_ptr applet); + ~IOverlayFunctions() override; - private: - Result BeginToWatchShortHomeButtonMessage(); - Result EndToWatchShortHomeButtonMessage(); - Result GetApplicationIdForLogo(Out out_application_id); - Result SetAutoSleepTimeAndDimmingTimeEnabled(bool enabled); - Result IsHealthWarningRequired(Out is_required); - Result SetHandlingHomeButtonShortPressedEnabled(bool enabled); - Result SetHandlingTouchScreenInputEnabled(bool enabled); - Result Unknown70(); +private: + Result BeginToWatchShortHomeButtonMessage(); + Result EndToWatchShortHomeButtonMessage(); + Result GetApplicationIdForLogo(Out out_application_id); + Result SetAutoSleepTimeAndDimmingTimeEnabled(bool enabled); + Result IsHealthWarningRequired(Out is_required); + Result SetHandlingHomeButtonShortPressedEnabled(bool enabled); + Result SetHandlingTouchScreenInputEnabled(bool enabled); + Result Unknown70(); - private: - const std::shared_ptr m_applet; - }; +private: + std::optional FindRequest(u32 key) override; + const std::shared_ptr m_applet; +}; } // namespace Service::AM diff --git a/src/core/hle/service/am/service/process_winding_controller.cpp b/src/core/hle/service/am/service/process_winding_controller.cpp index e284aa2d89..159f4dfd5c 100644 --- a/src/core/hle/service/am/service/process_winding_controller.cpp +++ b/src/core/hle/service/am/service/process_winding_controller.cpp @@ -13,23 +13,23 @@ namespace Service::AM { + std::optional IProcessWindingController::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IProcessWindingController::GetLaunchReason>, "GetLaunchReason"}, + FunctionInfo{11, D<&IProcessWindingController::OpenCallingLibraryApplet>, "OpenCallingLibraryApplet"}, + FunctionInfo{21, D<&IProcessWindingController::PushContext>, "PushContext"}, + FunctionInfo{22, D<&IProcessWindingController::PopContext>, "PopContext"}, + FunctionInfo{23, D<&IProcessWindingController::CancelWindingReservation>, "CancelWindingReservation"}, + FunctionInfo{30, D<&IProcessWindingController::WindAndDoReserved>, "WindAndDoReserved"}, + FunctionInfo{40, D<&IProcessWindingController::ReserveToStartAndWaitAndUnwindThis>, "ReserveToStartAndWaitAndUnwindThis"}, + FunctionInfo{41, D<&IProcessWindingController::ReserveToStartAndWait>, "ReserveToStartAndWait"} + ); + return HandlerTableGenerateWithFind(key, functions); + } + IProcessWindingController::IProcessWindingController(Core::System& system_, std::shared_ptr applet) : ServiceFramework{system_, "IProcessWindingController"}, m_applet{std::move(applet)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IProcessWindingController::GetLaunchReason>, "GetLaunchReason"}, - {11, D<&IProcessWindingController::OpenCallingLibraryApplet>, "OpenCallingLibraryApplet"}, - {21, D<&IProcessWindingController::PushContext>, "PushContext"}, - {22, D<&IProcessWindingController::PopContext>, "PopContext"}, - {23, D<&IProcessWindingController::CancelWindingReservation>, "CancelWindingReservation"}, - {30, D<&IProcessWindingController::WindAndDoReserved>, "WindAndDoReserved"}, - {40, D<&IProcessWindingController::ReserveToStartAndWaitAndUnwindThis>, "ReserveToStartAndWaitAndUnwindThis"}, - {41, D<&IProcessWindingController::ReserveToStartAndWait>, "ReserveToStartAndWait"}, - }; - // clang-format on - - RegisterHandlers(functions); } IProcessWindingController::~IProcessWindingController() = default; diff --git a/src/core/hle/service/am/service/process_winding_controller.h b/src/core/hle/service/am/service/process_winding_controller.h index f3417bcd97..91b29ac04b 100644 --- a/src/core/hle/service/am/service/process_winding_controller.h +++ b/src/core/hle/service/am/service/process_winding_controller.h @@ -33,6 +33,7 @@ private: SharedPointer reserved_applet_accessor); Result ReserveToStartAndWait(SharedPointer reserved_applet_accessor); + std::optional FindRequest(u32 key) override; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/self_controller.cpp b/src/core/hle/service/am/service/self_controller.cpp index 3a654b9daa..ce8a308d6a 100644 --- a/src/core/hle/service/am/service/self_controller.cpp +++ b/src/core/hle/service/am/service/self_controller.cpp @@ -17,67 +17,66 @@ namespace Service::AM { + std::optional ISelfController::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ISelfController::Exit>, "Exit"}, + FunctionInfo{1, D<&ISelfController::LockExit>, "LockExit"}, + FunctionInfo{2, D<&ISelfController::UnlockExit>, "UnlockExit"}, + FunctionInfo{3, D<&ISelfController::EnterFatalSection>, "EnterFatalSection"}, + FunctionInfo{4, D<&ISelfController::LeaveFatalSection>, "LeaveFatalSection"}, + FunctionInfo{9, D<&ISelfController::GetLibraryAppletLaunchableEvent>, "GetLibraryAppletLaunchableEvent"}, + FunctionInfo{10, D<&ISelfController::SetScreenShotPermission>, "SetScreenShotPermission"}, + FunctionInfo{11, D<&ISelfController::SetOperationModeChangedNotification>, "SetOperationModeChangedNotification"}, + FunctionInfo{12, D<&ISelfController::SetPerformanceModeChangedNotification>, "SetPerformanceModeChangedNotification"}, + FunctionInfo{13, D<&ISelfController::SetFocusHandlingMode>, "SetFocusHandlingMode"}, + FunctionInfo{14, D<&ISelfController::SetRestartMessageEnabled>, "SetRestartMessageEnabled"}, + FunctionInfo{15, D<&ISelfController::SetScreenShotAppletIdentityInfo>, "SetScreenShotAppletIdentityInfo"}, + FunctionInfo{16, D<&ISelfController::SetOutOfFocusSuspendingEnabled>, "SetOutOfFocusSuspendingEnabled"}, + FunctionInfo{17, nullptr, "SetControllerFirmwareUpdateSection"}, + FunctionInfo{18, nullptr, "SetRequiresCaptureButtonShortPressedMessage"}, + FunctionInfo{19, D<&ISelfController::SetAlbumImageOrientation>, "SetAlbumImageOrientation"}, + FunctionInfo{20, nullptr, "SetDesirableKeyboardLayout"}, + FunctionInfo{21, nullptr, "GetScreenShotProgramId"}, + FunctionInfo{40, D<&ISelfController::CreateManagedDisplayLayer>, "CreateManagedDisplayLayer"}, + FunctionInfo{41, D<&ISelfController::IsSystemBufferSharingEnabled>, "IsSystemBufferSharingEnabled"}, + FunctionInfo{42, D<&ISelfController::GetSystemSharedLayerHandle>, "GetSystemSharedLayerHandle"}, + FunctionInfo{43, D<&ISelfController::GetSystemSharedBufferHandle>, "GetSystemSharedBufferHandle"}, + FunctionInfo{44, D<&ISelfController::CreateManagedDisplaySeparableLayer>, "CreateManagedDisplaySeparableLayer"}, + FunctionInfo{45, nullptr, "SetManagedDisplayLayerSeparationMode"}, + FunctionInfo{46, nullptr, "SetRecordingLayerCompositionEnabled"}, + FunctionInfo{50, D<&ISelfController::SetHandlesRequestToDisplay>, "SetHandlesRequestToDisplay"}, + FunctionInfo{51, D<&ISelfController::ApproveToDisplay>, "ApproveToDisplay"}, + FunctionInfo{60, D<&ISelfController::OverrideAutoSleepTimeAndDimmingTime>, "OverrideAutoSleepTimeAndDimmingTime"}, + FunctionInfo{61, D<&ISelfController::SetMediaPlaybackState>, "SetMediaPlaybackState"}, + FunctionInfo{62, D<&ISelfController::SetIdleTimeDetectionExtension>, "SetIdleTimeDetectionExtension"}, + FunctionInfo{63, D<&ISelfController::GetIdleTimeDetectionExtension>, "GetIdleTimeDetectionExtension"}, + FunctionInfo{64, nullptr, "SetInputDetectionSourceSet"}, + FunctionInfo{65, D<&ISelfController::ReportUserIsActive>, "ReportUserIsActive"}, + FunctionInfo{66, nullptr, "GetCurrentIlluminance"}, + FunctionInfo{67, D<&ISelfController::IsIlluminanceAvailable>, "IsIlluminanceAvailable"}, + FunctionInfo{68, D<&ISelfController::SetAutoSleepDisabled>, "SetAutoSleepDisabled"}, + FunctionInfo{69, D<&ISelfController::IsAutoSleepDisabled>, "IsAutoSleepDisabled"}, + FunctionInfo{70, nullptr, "ReportMultimediaError"}, + FunctionInfo{71, nullptr, "GetCurrentIlluminanceEx"}, + FunctionInfo{72, D<&ISelfController::SetInputDetectionPolicy>, "SetInputDetectionPolicy"}, + FunctionInfo{80, nullptr, "SetWirelessPriorityMode"}, + FunctionInfo{90, D<&ISelfController::GetAccumulatedSuspendedTickValue>, "GetAccumulatedSuspendedTickValue"}, + FunctionInfo{91, D<&ISelfController::GetAccumulatedSuspendedTickChangedEvent>, "GetAccumulatedSuspendedTickChangedEvent"}, + FunctionInfo{100, D<&ISelfController::SetAlbumImageTakenNotificationEnabled>, "SetAlbumImageTakenNotificationEnabled"}, + FunctionInfo{110, nullptr, "SetApplicationAlbumUserData"}, + FunctionInfo{120, D<&ISelfController::SaveCurrentScreenshot>, "SaveCurrentScreenshot"}, + FunctionInfo{130, D<&ISelfController::SetRecordVolumeMuted>, "SetRecordVolumeMuted"}, + FunctionInfo{230, D<&ISelfController::Unknown230>, "Unknown230"}, + FunctionInfo{240, D<&ISelfController::Unknown240>, "Unknown240"}, + FunctionInfo{1000, nullptr, "GetDebugStorageChannel"} + ); + return HandlerTableGenerateWithFind(key, functions); + } + ISelfController::ISelfController(Core::System& system_, std::shared_ptr applet, Kernel::KProcess* process) : ServiceFramework{system_, "ISelfController"}, m_process{process}, m_applet{ std::move(applet)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&ISelfController::Exit>, "Exit"}, - {1, D<&ISelfController::LockExit>, "LockExit"}, - {2, D<&ISelfController::UnlockExit>, "UnlockExit"}, - {3, D<&ISelfController::EnterFatalSection>, "EnterFatalSection"}, - {4, D<&ISelfController::LeaveFatalSection>, "LeaveFatalSection"}, - {9, D<&ISelfController::GetLibraryAppletLaunchableEvent>, "GetLibraryAppletLaunchableEvent"}, - {10, D<&ISelfController::SetScreenShotPermission>, "SetScreenShotPermission"}, - {11, D<&ISelfController::SetOperationModeChangedNotification>, "SetOperationModeChangedNotification"}, - {12, D<&ISelfController::SetPerformanceModeChangedNotification>, "SetPerformanceModeChangedNotification"}, - {13, D<&ISelfController::SetFocusHandlingMode>, "SetFocusHandlingMode"}, - {14, D<&ISelfController::SetRestartMessageEnabled>, "SetRestartMessageEnabled"}, - {15, D<&ISelfController::SetScreenShotAppletIdentityInfo>, "SetScreenShotAppletIdentityInfo"}, - {16, D<&ISelfController::SetOutOfFocusSuspendingEnabled>, "SetOutOfFocusSuspendingEnabled"}, - {17, nullptr, "SetControllerFirmwareUpdateSection"}, - {18, nullptr, "SetRequiresCaptureButtonShortPressedMessage"}, - {19, D<&ISelfController::SetAlbumImageOrientation>, "SetAlbumImageOrientation"}, - {20, nullptr, "SetDesirableKeyboardLayout"}, - {21, nullptr, "GetScreenShotProgramId"}, - {40, D<&ISelfController::CreateManagedDisplayLayer>, "CreateManagedDisplayLayer"}, - {41, D<&ISelfController::IsSystemBufferSharingEnabled>, "IsSystemBufferSharingEnabled"}, - {42, D<&ISelfController::GetSystemSharedLayerHandle>, "GetSystemSharedLayerHandle"}, - {43, D<&ISelfController::GetSystemSharedBufferHandle>, "GetSystemSharedBufferHandle"}, - {44, D<&ISelfController::CreateManagedDisplaySeparableLayer>, "CreateManagedDisplaySeparableLayer"}, - {45, nullptr, "SetManagedDisplayLayerSeparationMode"}, - {46, nullptr, "SetRecordingLayerCompositionEnabled"}, - {50, D<&ISelfController::SetHandlesRequestToDisplay>, "SetHandlesRequestToDisplay"}, - {51, D<&ISelfController::ApproveToDisplay>, "ApproveToDisplay"}, - {60, D<&ISelfController::OverrideAutoSleepTimeAndDimmingTime>, "OverrideAutoSleepTimeAndDimmingTime"}, - {61, D<&ISelfController::SetMediaPlaybackState>, "SetMediaPlaybackState"}, - {62, D<&ISelfController::SetIdleTimeDetectionExtension>, "SetIdleTimeDetectionExtension"}, - {63, D<&ISelfController::GetIdleTimeDetectionExtension>, "GetIdleTimeDetectionExtension"}, - {64, nullptr, "SetInputDetectionSourceSet"}, - {65, D<&ISelfController::ReportUserIsActive>, "ReportUserIsActive"}, - {66, nullptr, "GetCurrentIlluminance"}, - {67, D<&ISelfController::IsIlluminanceAvailable>, "IsIlluminanceAvailable"}, - {68, D<&ISelfController::SetAutoSleepDisabled>, "SetAutoSleepDisabled"}, - {69, D<&ISelfController::IsAutoSleepDisabled>, "IsAutoSleepDisabled"}, - {70, nullptr, "ReportMultimediaError"}, - {71, nullptr, "GetCurrentIlluminanceEx"}, - {72, D<&ISelfController::SetInputDetectionPolicy>, "SetInputDetectionPolicy"}, - {80, nullptr, "SetWirelessPriorityMode"}, - {90, D<&ISelfController::GetAccumulatedSuspendedTickValue>, "GetAccumulatedSuspendedTickValue"}, - {91, D<&ISelfController::GetAccumulatedSuspendedTickChangedEvent>, "GetAccumulatedSuspendedTickChangedEvent"}, - {100, D<&ISelfController::SetAlbumImageTakenNotificationEnabled>, "SetAlbumImageTakenNotificationEnabled"}, - {110, nullptr, "SetApplicationAlbumUserData"}, - {120, D<&ISelfController::SaveCurrentScreenshot>, "SaveCurrentScreenshot"}, - {130, D<&ISelfController::SetRecordVolumeMuted>, "SetRecordVolumeMuted"}, - {230, D<&ISelfController::Unknown230>, "Unknown230"}, - {240, D<&ISelfController::Unknown240>, "Unknown240"}, - {1000, nullptr, "GetDebugStorageChannel"}, - }; - // clang-format on - - RegisterHandlers(functions); - std::scoped_lock lk{m_applet->lock}; m_applet->display_layer_manager.Initialize(system, m_process, m_applet->applet_id, m_applet->library_applet_mode); diff --git a/src/core/hle/service/am/service/self_controller.h b/src/core/hle/service/am/service/self_controller.h index c9f480f575..ce77769da2 100644 --- a/src/core/hle/service/am/service/self_controller.h +++ b/src/core/hle/service/am/service/self_controller.h @@ -70,6 +70,7 @@ private: Result Unknown230(u32 in_val, Out out_val); Result Unknown240(u32 in_val); + std::optional FindRequest(u32 key) override; Kernel::KProcess* const m_process; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/storage.cpp b/src/core/hle/service/am/service/storage.cpp index 5fe191bf2f..110a9f5a42 100644 --- a/src/core/hle/service/am/service/storage.cpp +++ b/src/core/hle/service/am/service/storage.cpp @@ -4,22 +4,86 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include "core/hle/kernel/k_transfer_memory.h" #include "core/hle/service/am/am_results.h" #include "core/hle/service/am/library_applet_storage.h" #include "core/hle/service/am/service/storage.h" -#include "core/hle/service/am/service/storage_accessor.h" #include "core/hle/service/cmif_serialization.h" namespace Service::AM { +class IStorageAccessor final : public ServiceFramework { +public: + explicit IStorageAccessor(Core::System& system_, std::shared_ptr impl) : ServiceFramework{system_, "IStorageAccessor"}, m_impl{std::move(impl)} {} + ~IStorageAccessor() override = default; + + Result GetSize(Out out_size) { + LOG_DEBUG(Service_AM, "called"); + *out_size = m_impl->GetSize(); + R_SUCCEED(); + } + + Result Write(InBuffer buffer, s64 offset) { + LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, buffer.size()); + R_RETURN(m_impl->Write(offset, buffer.data(), buffer.size())); + } + + Result Read(OutBuffer out_buffer, s64 offset) { + LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, out_buffer.size()); + R_RETURN(m_impl->Read(offset, out_buffer.data(), out_buffer.size())); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IStorageAccessor::GetSize>, "GetSize"}, + FunctionInfo{10, D<&IStorageAccessor::Write>, "Write"}, + FunctionInfo{11, D<&IStorageAccessor::Read>, "Read"} + ); + + const std::shared_ptr m_impl; +}; + +class ITransferStorageAccessor final : public ServiceFramework { +public: + explicit ITransferStorageAccessor(Core::System& system_, std::shared_ptr impl) : ServiceFramework{system_, "ITransferStorageAccessor"}, m_impl{std::move(impl)} {} + ~ITransferStorageAccessor() override = default; + + Result GetSize(Out out_size) { + LOG_DEBUG(Service_AM, "called"); + *out_size = m_impl->GetSize(); + R_SUCCEED(); + } + + Result GetHandle(Out out_size, OutCopyHandle out_handle) { + LOG_INFO(Service_AM, "called"); + *out_size = m_impl->GetSize(); + *out_handle = m_impl->GetHandle(); + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ITransferStorageAccessor::GetSize>, "GetSize"}, + FunctionInfo{1, D<&ITransferStorageAccessor::GetHandle>, "GetHandle"} + ); + + const std::shared_ptr m_impl; +}; + +std::optional IStorage::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IStorage::Open>, "Open"}, + FunctionInfo{1, D<&IStorage::OpenTransferStorage>, "OpenTransferStorage"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IStorage::IStorage(Core::System& system_, std::shared_ptr impl) : ServiceFramework{system_, "IStorage"}, m_impl{std::move(impl)} { - static const FunctionInfo functions[] = { - {0, D<&IStorage::Open>, "Open"}, - {1, D<&IStorage::OpenTransferStorage>, "OpenTransferStorage"}, - }; - - RegisterHandlers(functions); } IStorage::IStorage(Core::System& system_, std::vector&& data) diff --git a/src/core/hle/service/am/service/storage.h b/src/core/hle/service/am/service/storage.h index cde2ed0ead..63b7a0ad4c 100644 --- a/src/core/hle/service/am/service/storage.h +++ b/src/core/hle/service/am/service/storage.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -29,6 +32,7 @@ private: Result OpenTransferStorage( Out> out_transfer_storage_accessor); + std::optional FindRequest(u32 key) override; const std::shared_ptr m_impl; }; diff --git a/src/core/hle/service/am/service/storage_accessor.cpp b/src/core/hle/service/am/service/storage_accessor.cpp deleted file mode 100644 index 84577fee45..0000000000 --- a/src/core/hle/service/am/service/storage_accessor.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/kernel/k_transfer_memory.h" -#include "core/hle/service/am/library_applet_storage.h" -#include "core/hle/service/am/service/storage_accessor.h" -#include "core/hle/service/cmif_serialization.h" - -namespace Service::AM { - -IStorageAccessor::IStorageAccessor(Core::System& system_, - std::shared_ptr impl) - : ServiceFramework{system_, "IStorageAccessor"}, m_impl{std::move(impl)} { - static const FunctionInfo functions[] = { - {0, D<&IStorageAccessor::GetSize>, "GetSize"}, - {10, D<&IStorageAccessor::Write>, "Write"}, - {11, D<&IStorageAccessor::Read>, "Read"}, - }; - - RegisterHandlers(functions); -} - -IStorageAccessor::~IStorageAccessor() = default; - -Result IStorageAccessor::GetSize(Out out_size) { - LOG_DEBUG(Service_AM, "called"); - *out_size = m_impl->GetSize(); - R_SUCCEED(); -} - -Result IStorageAccessor::Write(InBuffer buffer, s64 offset) { - LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, buffer.size()); - R_RETURN(m_impl->Write(offset, buffer.data(), buffer.size())); -} - -Result IStorageAccessor::Read(OutBuffer out_buffer, s64 offset) { - LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, out_buffer.size()); - R_RETURN(m_impl->Read(offset, out_buffer.data(), out_buffer.size())); -} - -ITransferStorageAccessor::ITransferStorageAccessor(Core::System& system_, - std::shared_ptr impl) - : ServiceFramework{system_, "ITransferStorageAccessor"}, m_impl{std::move(impl)} { - static const FunctionInfo functions[] = { - {0, D<&ITransferStorageAccessor::GetSize>, "GetSize"}, - {1, D<&ITransferStorageAccessor::GetHandle>, "GetHandle"}, - }; - - RegisterHandlers(functions); -} - -ITransferStorageAccessor::~ITransferStorageAccessor() = default; - -Result ITransferStorageAccessor::GetSize(Out out_size) { - LOG_DEBUG(Service_AM, "called"); - *out_size = m_impl->GetSize(); - R_SUCCEED(); -} - -Result ITransferStorageAccessor::GetHandle(Out out_size, - OutCopyHandle out_handle) { - LOG_INFO(Service_AM, "called"); - *out_size = m_impl->GetSize(); - *out_handle = m_impl->GetHandle(); - R_SUCCEED(); -} - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/storage_accessor.h b/src/core/hle/service/am/service/storage_accessor.h deleted file mode 100644 index 1a01730e00..0000000000 --- a/src/core/hle/service/am/service/storage_accessor.h +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/am/library_applet_storage.h" -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Service::AM { - -class IStorageAccessor final : public ServiceFramework { -public: - explicit IStorageAccessor(Core::System& system_, std::shared_ptr impl); - ~IStorageAccessor() override; - -private: - Result GetSize(Out out_size); - Result Write(InBuffer buffer, s64 offset); - Result Read(OutBuffer out_buffer, s64 offset); - - const std::shared_ptr m_impl; -}; - -class ITransferStorageAccessor final : public ServiceFramework { -public: - explicit ITransferStorageAccessor(Core::System& system_, - std::shared_ptr impl); - ~ITransferStorageAccessor() override; - -private: - Result GetSize(Out out_size); - Result GetHandle(Out out_size, OutCopyHandle out_handle); - - const std::shared_ptr m_impl; -}; - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/system_applet_proxy.cpp b/src/core/hle/service/am/service/system_applet_proxy.cpp deleted file mode 100644 index c435288a26..0000000000 --- a/src/core/hle/service/am/service/system_applet_proxy.cpp +++ /dev/null @@ -1,133 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/am/service/applet_common_functions.h" -#include "core/hle/service/am/service/application_creator.h" -#include "core/hle/service/am/service/audio_controller.h" -#include "core/hle/service/am/service/common_state_getter.h" -#include "core/hle/service/am/service/debug_functions.h" -#include "core/hle/service/am/service/display_controller.h" -#include "core/hle/service/am/service/global_state_controller.h" -#include "core/hle/service/am/service/home_menu_functions.h" -#include "core/hle/service/am/service/library_applet_creator.h" -#include "core/hle/service/am/service/process_winding_controller.h" -#include "core/hle/service/am/service/self_controller.h" -#include "core/hle/service/am/service/system_applet_proxy.h" -#include "core/hle/service/am/service/window_controller.h" -#include "core/hle/service/cmif_serialization.h" - -namespace Service::AM { - -ISystemAppletProxy::ISystemAppletProxy(Core::System& system_, std::shared_ptr applet, - Kernel::KProcess* process, WindowSystem& window_system) - : ServiceFramework{system_, "ISystemAppletProxy"}, - m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&ISystemAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, - {1, D<&ISystemAppletProxy::GetSelfController>, "GetSelfController"}, - {2, D<&ISystemAppletProxy::GetWindowController>, "GetWindowController"}, - {3, D<&ISystemAppletProxy::GetAudioController>, "GetAudioController"}, - {4, D<&ISystemAppletProxy::GetDisplayController>, "GetDisplayController"}, - {10, D<&ISystemAppletProxy::GetProcessWindingController>, "GetProcessWindingController"}, - {11, D<&ISystemAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, - {20, D<&ISystemAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"}, - {21, D<&ISystemAppletProxy::GetGlobalStateController>, "GetGlobalStateController"}, - {22, D<&ISystemAppletProxy::GetApplicationCreator>, "GetApplicationCreator"}, - {23, D<&ISystemAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"}, - {1000, D<&ISystemAppletProxy::GetDebugFunctions>, "GetDebugFunctions"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -ISystemAppletProxy::~ISystemAppletProxy() = default; - -Result ISystemAppletProxy::GetAudioController( - Out> out_audio_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_audio_controller = std::make_shared(system); - R_SUCCEED(); -} - -Result ISystemAppletProxy::GetDisplayController( - Out> out_display_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_display_controller = std::make_shared(system, m_applet); - R_SUCCEED(); -} - -Result ISystemAppletProxy::GetProcessWindingController( - Out> out_process_winding_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_process_winding_controller = std::make_shared(system, m_applet); - R_SUCCEED(); -} - -Result ISystemAppletProxy::GetDebugFunctions( - Out> out_debug_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_debug_functions = std::make_shared(system); - R_SUCCEED(); -} - -Result ISystemAppletProxy::GetWindowController( - Out> out_window_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_window_controller = std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); -} - -Result ISystemAppletProxy::GetSelfController( - Out> out_self_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_self_controller = std::make_shared(system, m_applet, m_process); - R_SUCCEED(); -} - -Result ISystemAppletProxy::GetCommonStateGetter( - Out> out_common_state_getter) { - LOG_DEBUG(Service_AM, "called"); - *out_common_state_getter = std::make_shared(system, m_applet); - R_SUCCEED(); -} - -Result ISystemAppletProxy::GetLibraryAppletCreator( - Out> out_library_applet_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_creator = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); -} - -Result ISystemAppletProxy::GetApplicationCreator( - Out> out_application_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_application_creator = std::make_shared(system, m_window_system); - R_SUCCEED(); -} - -Result ISystemAppletProxy::GetAppletCommonFunctions( - Out> out_applet_common_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_applet_common_functions = std::make_shared(system, m_applet); - R_SUCCEED(); -} - -Result ISystemAppletProxy::GetHomeMenuFunctions( - Out> out_home_menu_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_home_menu_functions = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); -} - -Result ISystemAppletProxy::GetGlobalStateController( - Out> out_global_state_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_global_state_controller = std::make_shared(system); - R_SUCCEED(); -} - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/system_applet_proxy.h b/src/core/hle/service/am/service/system_applet_proxy.h deleted file mode 100644 index ab9769b3d9..0000000000 --- a/src/core/hle/service/am/service/system_applet_proxy.h +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Service::AM { - -struct Applet; -class IAppletCommonFunctions; -class IApplicationCreator; -class IAudioController; -class ICommonStateGetter; -class IDebugFunctions; -class IDisplayController; -class IHomeMenuFunctions; -class IGlobalStateController; -class ILibraryAppletCreator; -class IProcessWindingController; -class ISelfController; -class IWindowController; -class WindowSystem; - -class ISystemAppletProxy final : public ServiceFramework { -public: - explicit ISystemAppletProxy(Core::System& system, std::shared_ptr applet, - Kernel::KProcess* process, WindowSystem& window_system); - ~ISystemAppletProxy(); - -private: - Result GetCommonStateGetter(Out> out_common_state_getter); - Result GetSelfController(Out> out_self_controller); - Result GetWindowController(Out> out_window_controller); - Result GetAudioController(Out> out_audio_controller); - Result GetDisplayController(Out> out_display_controller); - Result GetProcessWindingController( - Out> out_process_winding_controller); - Result GetDebugFunctions(Out> out_debug_functions); - Result GetLibraryAppletCreator( - Out> out_library_applet_creator); - Result GetApplicationCreator(Out> out_application_creator); - Result GetAppletCommonFunctions( - Out> out_applet_common_functions); - Result GetHomeMenuFunctions(Out> out_home_menu_functions); - Result GetGlobalStateController( - Out> out_global_state_controller); - - WindowSystem& m_window_system; - Kernel::KProcess* const m_process; - const std::shared_ptr m_applet; -}; - -} // namespace Service::AM diff --git a/src/core/hle/service/am/service/window_controller.cpp b/src/core/hle/service/am/service/window_controller.cpp index 54396affbe..d07aba0c79 100644 --- a/src/core/hle/service/am/service/window_controller.cpp +++ b/src/core/hle/service/am/service/window_controller.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,24 +12,24 @@ namespace Service::AM { +std::optional IWindowController::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "CreateWindow"}, + FunctionInfo{1, D<&IWindowController::GetAppletResourceUserId>, "GetAppletResourceUserId"}, + FunctionInfo{2, D<&IWindowController::GetAppletResourceUserIdOfCallerApplet>, "GetAppletResourceUserIdOfCallerApplet"}, + FunctionInfo{10, D<&IWindowController::AcquireForegroundRights>, "AcquireForegroundRights"}, + FunctionInfo{11, D<&IWindowController::ReleaseForegroundRights>, "ReleaseForegroundRights"}, + FunctionInfo{12, D<&IWindowController::RejectToChangeIntoBackground>, "RejectToChangeIntoBackground"}, + FunctionInfo{20, D<&IWindowController::SetAppletWindowVisibility>, "SetAppletWindowVisibility"}, + FunctionInfo{21, D<&IWindowController::SetAppletGpuTimeSlice>, "SetAppletGpuTimeSlice"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IWindowController::IWindowController(Core::System& system_, std::shared_ptr applet, WindowSystem& window_system) : ServiceFramework{system_, "IWindowController"}, m_window_system{window_system}, m_applet{std::move(applet)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "CreateWindow"}, - {1, D<&IWindowController::GetAppletResourceUserId>, "GetAppletResourceUserId"}, - {2, D<&IWindowController::GetAppletResourceUserIdOfCallerApplet>, "GetAppletResourceUserIdOfCallerApplet"}, - {10, D<&IWindowController::AcquireForegroundRights>, "AcquireForegroundRights"}, - {11, D<&IWindowController::ReleaseForegroundRights>, "ReleaseForegroundRights"}, - {12, D<&IWindowController::RejectToChangeIntoBackground>, "RejectToChangeIntoBackground"}, - {20, D<&IWindowController::SetAppletWindowVisibility>, "SetAppletWindowVisibility"}, - {21, D<&IWindowController::SetAppletGpuTimeSlice>, "SetAppletGpuTimeSlice"}, - }; - // clang-format on - - RegisterHandlers(functions); } IWindowController::~IWindowController() = default; diff --git a/src/core/hle/service/am/service/window_controller.h b/src/core/hle/service/am/service/window_controller.h index a784dd4a49..29fd723421 100644 --- a/src/core/hle/service/am/service/window_controller.h +++ b/src/core/hle/service/am/service/window_controller.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -26,6 +29,7 @@ private: Result SetAppletWindowVisibility(bool visible); Result SetAppletGpuTimeSlice(s64 time_slice); + std::optional FindRequest(u32 key) override; WindowSystem& m_window_system; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/aoc/addon_content_manager.cpp b/src/core/hle/service/aoc/addon_content_manager.cpp index be2aa34baa..0222d9c52b 100644 --- a/src/core/hle/service/aoc/addon_content_manager.cpp +++ b/src/core/hle/service/aoc/addon_content_manager.cpp @@ -28,6 +28,34 @@ namespace Service::AOC { +std::optional IAddOnContentManager::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "CountAddOnContentByApplicationId"}, + FunctionInfo{1, nullptr, "ListAddOnContentByApplicationId"}, + FunctionInfo{2, D<&IAddOnContentManager::CountAddOnContent>, "CountAddOnContent"}, + FunctionInfo{3, D<&IAddOnContentManager::ListAddOnContent>, "ListAddOnContent"}, + FunctionInfo{4, nullptr, "GetAddOnContentBaseIdByApplicationId"}, + FunctionInfo{5, D<&IAddOnContentManager::GetAddOnContentBaseId>, "GetAddOnContentBaseId"}, + FunctionInfo{6, nullptr, "PrepareAddOnContentByApplicationId"}, + FunctionInfo{7, D<&IAddOnContentManager::PrepareAddOnContent>, "PrepareAddOnContent"}, + FunctionInfo{8, D<&IAddOnContentManager::GetAddOnContentListChangedEvent>, "GetAddOnContentListChangedEvent"}, + FunctionInfo{9, nullptr, "GetAddOnContentLostErrorCode"}, + FunctionInfo{10, D<&IAddOnContentManager::GetAddOnContentListChangedEventWithProcessId>, "GetAddOnContentListChangedEventWithProcessId"}, + FunctionInfo{11, D<&IAddOnContentManager::NotifyMountAddOnContent>, "NotifyMountAddOnContent"}, + FunctionInfo{12, D<&IAddOnContentManager::NotifyUnmountAddOnContent>, "NotifyUnmountAddOnContent"}, + FunctionInfo{13, nullptr, "IsAddOnContentMountedForDebug"}, + FunctionInfo{50, D<&IAddOnContentManager::CheckAddOnContentMountStatus>, "CheckAddOnContentMountStatus"}, + FunctionInfo{100, D<&IAddOnContentManager::CreateEcPurchasedEventManager>, "CreateEcPurchasedEventManager"}, + FunctionInfo{101, D<&IAddOnContentManager::CreatePermanentEcPurchasedEventManager>, "CreatePermanentEcPurchasedEventManager"}, + FunctionInfo{110, nullptr, "CreateContentsServiceManager"}, + FunctionInfo{200, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"}, + FunctionInfo{300, nullptr, "SetupHostAddOnContent"}, + FunctionInfo{301, nullptr, "GetRegisteredAddOnContentPath"}, + FunctionInfo{302, nullptr, "UpdateCachedList"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + static bool CheckAOCTitleIDMatchesBase(u64 title_id, u64 base) { return FileSys::GetBaseTitleID(title_id) == base; } @@ -57,35 +85,6 @@ static std::vector AccumulateAOCTitleIDs(Core::System& system) { IAddOnContentManager::IAddOnContentManager(Core::System& system_) : ServiceFramework{system_, "aoc:u"}, add_on_content{AccumulateAOCTitleIDs(system)}, service_context{system_, "aoc:u"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "CountAddOnContentByApplicationId"}, - {1, nullptr, "ListAddOnContentByApplicationId"}, - {2, D<&IAddOnContentManager::CountAddOnContent>, "CountAddOnContent"}, - {3, D<&IAddOnContentManager::ListAddOnContent>, "ListAddOnContent"}, - {4, nullptr, "GetAddOnContentBaseIdByApplicationId"}, - {5, D<&IAddOnContentManager::GetAddOnContentBaseId>, "GetAddOnContentBaseId"}, - {6, nullptr, "PrepareAddOnContentByApplicationId"}, - {7, D<&IAddOnContentManager::PrepareAddOnContent>, "PrepareAddOnContent"}, - {8, D<&IAddOnContentManager::GetAddOnContentListChangedEvent>, "GetAddOnContentListChangedEvent"}, - {9, nullptr, "GetAddOnContentLostErrorCode"}, - {10, D<&IAddOnContentManager::GetAddOnContentListChangedEventWithProcessId>, "GetAddOnContentListChangedEventWithProcessId"}, - {11, D<&IAddOnContentManager::NotifyMountAddOnContent>, "NotifyMountAddOnContent"}, - {12, D<&IAddOnContentManager::NotifyUnmountAddOnContent>, "NotifyUnmountAddOnContent"}, - {13, nullptr, "IsAddOnContentMountedForDebug"}, - {50, D<&IAddOnContentManager::CheckAddOnContentMountStatus>, "CheckAddOnContentMountStatus"}, - {100, D<&IAddOnContentManager::CreateEcPurchasedEventManager>, "CreateEcPurchasedEventManager"}, - {101, D<&IAddOnContentManager::CreatePermanentEcPurchasedEventManager>, "CreatePermanentEcPurchasedEventManager"}, - {110, nullptr, "CreateContentsServiceManager"}, - {200, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"}, - {300, nullptr, "SetupHostAddOnContent"}, - {301, nullptr, "GetRegisteredAddOnContentPath"}, - {302, nullptr, "UpdateCachedList"}, - }; - // clang-format on - - RegisterHandlers(functions); - aoc_change_event = service_context.CreateEvent("GetAddOnContentListChanged:Event"); } diff --git a/src/core/hle/service/aoc/addon_content_manager.h b/src/core/hle/service/aoc/addon_content_manager.h index 91857df4c7..8ddb86cf19 100644 --- a/src/core/hle/service/aoc/addon_content_manager.h +++ b/src/core/hle/service/aoc/addon_content_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -40,9 +43,9 @@ public: OutInterface out_interface); private: + std::optional FindRequest(u32 key) override; std::vector add_on_content; KernelHelpers::ServiceContext service_context; - Kernel::KEvent* aoc_change_event; }; diff --git a/src/core/hle/service/aoc/purchase_event_manager.cpp b/src/core/hle/service/aoc/purchase_event_manager.cpp index 9e718510b4..eded803b25 100644 --- a/src/core/hle/service/aoc/purchase_event_manager.cpp +++ b/src/core/hle/service/aoc/purchase_event_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,21 +11,20 @@ namespace Service::AOC { constexpr Result ResultNoPurchasedProductInfoAvailable{ErrorModule::NIMShop, 400}; +std::optional IPurchaseEventManager::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IPurchaseEventManager::SetDefaultDeliveryTarget>, "SetDefaultDeliveryTarget"}, + FunctionInfo{1, D<&IPurchaseEventManager::SetDeliveryTarget>, "SetDeliveryTarget"}, + FunctionInfo{2, D<&IPurchaseEventManager::GetPurchasedEvent>, "GetPurchasedEvent"}, + FunctionInfo{3, D<&IPurchaseEventManager::PopPurchasedProductInfo>, "PopPurchasedProductInfo"}, + FunctionInfo{4, D<&IPurchaseEventManager::PopPurchasedProductInfoWithUid>, "PopPurchasedProductInfoWithUid"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IPurchaseEventManager::IPurchaseEventManager(Core::System& system_) - : ServiceFramework{system_, "IPurchaseEventManager"}, service_context{system, - "IPurchaseEventManager"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IPurchaseEventManager::SetDefaultDeliveryTarget>, "SetDefaultDeliveryTarget"}, - {1, D<&IPurchaseEventManager::SetDeliveryTarget>, "SetDeliveryTarget"}, - {2, D<&IPurchaseEventManager::GetPurchasedEvent>, "GetPurchasedEvent"}, - {3, D<&IPurchaseEventManager::PopPurchasedProductInfo>, "PopPurchasedProductInfo"}, - {4, D<&IPurchaseEventManager::PopPurchasedProductInfoWithUid>, "PopPurchasedProductInfoWithUid"}, - }; - // clang-format on - - RegisterHandlers(functions); - + : ServiceFramework{system_, "IPurchaseEventManager"} + , service_context{system, "IPurchaseEventManager"} { purchased_event = service_context.CreateEvent("IPurchaseEventManager:PurchasedEvent"); } diff --git a/src/core/hle/service/aoc/purchase_event_manager.h b/src/core/hle/service/aoc/purchase_event_manager.h index ea3836bc93..d11089e567 100644 --- a/src/core/hle/service/aoc/purchase_event_manager.h +++ b/src/core/hle/service/aoc/purchase_event_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -22,6 +25,8 @@ public: Result PopPurchasedProductInfo(); Result PopPurchasedProductInfoWithUid(); + std::optional FindRequest(u32 key) override; + private: KernelHelpers::ServiceContext service_context; Kernel::KEvent* purchased_event; diff --git a/src/core/hle/service/apm/apm_interface.cpp b/src/core/hle/service/apm/apm_interface.cpp index 51c01e2f25..2b4768478e 100644 --- a/src/core/hle/service/apm/apm_interface.cpp +++ b/src/core/hle/service/apm/apm_interface.cpp @@ -14,15 +14,7 @@ namespace Service::APM { class ISession final : public ServiceFramework { public: - explicit ISession(Core::System& system_, Controller& controller_) - : ServiceFramework{system_, "ISession"}, controller{controller_} { - static const FunctionInfo functions[] = { - {0, &ISession::SetPerformanceConfiguration, "SetPerformanceConfiguration"}, - {1, &ISession::GetPerformanceConfiguration, "GetPerformanceConfiguration"}, - {2, &ISession::SetCpuOverclockEnabled, "SetCpuOverclockEnabled"}, - }; - RegisterHandlers(functions); - } + explicit ISession(Core::System& system_, Controller& controller_) : ServiceFramework{system_, "ISession"}, controller{controller_} {} private: void SetPerformanceConfiguration(HLERequestContext& ctx) { @@ -61,18 +53,20 @@ private: rb.Push(ResultSuccess); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &ISession::SetPerformanceConfiguration, "SetPerformanceConfiguration"}, + FunctionInfo{1, &ISession::GetPerformanceConfiguration, "GetPerformanceConfiguration"}, + FunctionInfo{2, &ISession::SetCpuOverclockEnabled, "SetCpuOverclockEnabled"} + ); Controller& controller; }; APM::APM(Core::System& system_, std::shared_ptr apm_, Controller& controller_, const char* name) : ServiceFramework{system_, name}, apm(std::move(apm_)), controller{controller_} { - static const FunctionInfo functions[] = { - {0, &APM::OpenSession, "OpenSession"}, - {1, &APM::GetPerformanceMode, "GetPerformanceMode"}, - {6, &APM::IsCpuOverclockEnabled, "IsCpuOverclockEnabled"}, - }; - RegisterHandlers(functions); } APM::~APM() = default; @@ -102,20 +96,6 @@ void APM::IsCpuOverclockEnabled(HLERequestContext& ctx) { APM_Sys::APM_Sys(Core::System& system_, Controller& controller_) : ServiceFramework{system_, "apm:sys"}, controller{controller_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestPerformanceMode"}, - {1, &APM_Sys::GetPerformanceEvent, "GetPerformanceEvent"}, - {2, nullptr, "GetThrottlingState"}, - {3, nullptr, "GetLastThrottlingState"}, - {4, nullptr, "ClearLastThrottlingState"}, - {5, nullptr, "LoadAndApplySettings"}, - {6, &APM_Sys::SetCpuBoostMode, "SetCpuBoostMode"}, - {7, &APM_Sys::GetCurrentPerformanceConfiguration, "GetCurrentPerformanceConfiguration"}, - }; - // clang-format on - - RegisterHandlers(functions); } APM_Sys::~APM_Sys() = default; diff --git a/src/core/hle/service/apm/apm_interface.h b/src/core/hle/service/apm/apm_interface.h index 58718453b6..0bbcd185a3 100644 --- a/src/core/hle/service/apm/apm_interface.h +++ b/src/core/hle/service/apm/apm_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -21,6 +24,14 @@ private: void GetPerformanceMode(HLERequestContext& ctx); void IsCpuOverclockEnabled(HLERequestContext& ctx); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &APM::OpenSession, "OpenSession"}, + FunctionInfo{1, &APM::GetPerformanceMode, "GetPerformanceMode"}, + FunctionInfo{6, &APM::IsCpuOverclockEnabled, "IsCpuOverclockEnabled"} + ); std::shared_ptr apm; Controller& controller; }; @@ -36,6 +47,19 @@ private: void GetPerformanceEvent(HLERequestContext& ctx); void GetCurrentPerformanceConfiguration(HLERequestContext& ctx); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestPerformanceMode"}, + FunctionInfo{1, &APM_Sys::GetPerformanceEvent, "GetPerformanceEvent"}, + FunctionInfo{2, nullptr, "GetThrottlingState"}, + FunctionInfo{3, nullptr, "GetLastThrottlingState"}, + FunctionInfo{4, nullptr, "ClearLastThrottlingState"}, + FunctionInfo{5, nullptr, "LoadAndApplySettings"}, + FunctionInfo{6, &APM_Sys::SetCpuBoostMode, "SetCpuBoostMode"}, + FunctionInfo{7, &APM_Sys::GetCurrentPerformanceConfiguration, "GetCurrentPerformanceConfiguration"} + ); Controller& controller; }; diff --git a/src/core/hle/service/audio/audio.cpp b/src/core/hle/service/audio/audio.cpp index fde766a275..6177efd46c 100644 --- a/src/core/hle/service/audio/audio.cpp +++ b/src/core/hle/service/audio/audio.cpp @@ -21,164 +21,164 @@ namespace Service::Audio { class IAudioOutManagerForApplet final : public ServiceFramework { public: explicit IAudioOutManagerForApplet(Core::System& system_) - : ServiceFramework{system_, "audout:a"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestSuspend"}, - {1, nullptr, "RequestResume"}, - {2, nullptr, "GetProcessMasterVolume"}, - {3, nullptr, "SetProcessMasterVolume"}, - {4, nullptr, "GetProcessRecordVolume"}, - {5, nullptr, "SetProcessRecordVolume"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "audout:a"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestSuspend"}, + FunctionInfo{1, nullptr, "RequestResume"}, + FunctionInfo{2, nullptr, "GetProcessMasterVolume"}, + FunctionInfo{3, nullptr, "SetProcessMasterVolume"}, + FunctionInfo{4, nullptr, "GetProcessRecordVolume"}, + FunctionInfo{5, nullptr, "SetProcessRecordVolume"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IAudioSnoopManager final : public ServiceFramework { public: explicit IAudioSnoopManager(Core::System& system_) - : ServiceFramework{system_, "auddev"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetDspStatistics"}, - {1, nullptr, "GetAppletStateSummaries"}, - {2, nullptr, "SetDspStatisticsParameter"}, - {3, nullptr, "GetDspStatisticsParameter"}, - {6, nullptr, "GetDspUsage"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "auddev"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetDspStatistics"}, + FunctionInfo{1, nullptr, "GetAppletStateSummaries"}, + FunctionInfo{2, nullptr, "SetDspStatisticsParameter"}, + FunctionInfo{3, nullptr, "GetDspStatisticsParameter"}, + FunctionInfo{6, nullptr, "GetDspUsage"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IAudioInManagerForApplet final : public ServiceFramework { public: explicit IAudioInManagerForApplet(Core::System& system_) - : ServiceFramework{system_, "audin:a"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestSuspend"}, - {1, nullptr, "RequestResume"}, - {2, nullptr, "GetProcessMasterVolume"}, - {3, nullptr, "SetProcessMasterVolume"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "audin:a"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestSuspend"}, + FunctionInfo{1, nullptr, "RequestResume"}, + FunctionInfo{2, nullptr, "GetProcessMasterVolume"}, + FunctionInfo{3, nullptr, "SetProcessMasterVolume"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IAudioRendererManagerForApplet final : public ServiceFramework { public: explicit IAudioRendererManagerForApplet(Core::System& system_) - : ServiceFramework{system_, "audren:a"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestSuspend"}, - {1, nullptr, "RequestResume"}, - {2, nullptr, "GetProcessMasterVolume"}, - {3, nullptr, "SetProcessMasterVolume"}, - {4, nullptr, "RegisterAppletResourceUserId"}, - {5, nullptr, "UnregisterAppletResourceUserId"}, - {6, nullptr, "GetProcessRecordVolume"}, - {7, nullptr, "SetProcessRecordVolume"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "audren:a"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestSuspend"}, + FunctionInfo{1, nullptr, "RequestResume"}, + FunctionInfo{2, nullptr, "GetProcessMasterVolume"}, + FunctionInfo{3, nullptr, "SetProcessMasterVolume"}, + FunctionInfo{4, nullptr, "RegisterAppletResourceUserId"}, + FunctionInfo{5, nullptr, "UnregisterAppletResourceUserId"}, + FunctionInfo{6, nullptr, "GetProcessRecordVolume"}, + FunctionInfo{7, nullptr, "SetProcessRecordVolume"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IAudioOutManagerForDebugger final : public ServiceFramework { public: explicit IAudioOutManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "audout:d"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestSuspend"}, - {1, nullptr, "RequestResume"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "audout:d"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestSuspend"}, + FunctionInfo{1, nullptr, "RequestResume"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IAudioInManagerForDebugger final : public ServiceFramework { public: explicit IAudioInManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "audin:d"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestSuspend"}, - {1, nullptr, "RequestResume"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "audin:d"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestSuspend"}, + FunctionInfo{1, nullptr, "RequestResume"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IFinalOutputRecorderManagerForDebugger final : public ServiceFramework { public: explicit IFinalOutputRecorderManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "audrec:d"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestSuspend"}, - {1, nullptr, "RequestResume"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "audrec:d"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestSuspend"}, + FunctionInfo{1, nullptr, "RequestResume"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IAudioRendererManagerForDebugger final : public ServiceFramework { public: explicit IAudioRendererManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "audren:d"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestSuspend"}, - {1, nullptr, "RequestResume"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "audren:d"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestSuspend"}, + FunctionInfo{1, nullptr, "RequestResume"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IAudioSystemManagerForApplet final : public ServiceFramework { public: explicit IAudioSystemManagerForApplet(Core::System& system_) - : ServiceFramework{system_, "aud:a"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RegisterAppletResourceUserId"}, - {1, nullptr, "UnregisterAppletResourceUserId"}, - {2, nullptr, "RequestSuspendAudio"}, - {3, nullptr, "RequestResumeAudio"}, - {4, nullptr, "GetAudioOutputProcessMasterVolume"}, - {5, nullptr, "SetAudioOutputProcessMasterVolume"}, - {6, nullptr, "GetAudioInputProcessMasterVolume"}, - {7, nullptr, "SetAudioInputProcessMasterVolume"}, - {8, nullptr, "GetAudioOutputProcessRecordVolume"}, - {9, nullptr, "SetAudioOutputProcessRecordVolume"}, - {10, nullptr, "GetAppletStateSummaries"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "aud:a"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RegisterAppletResourceUserId"}, + FunctionInfo{1, nullptr, "UnregisterAppletResourceUserId"}, + FunctionInfo{2, nullptr, "RequestSuspendAudio"}, + FunctionInfo{3, nullptr, "RequestResumeAudio"}, + FunctionInfo{4, nullptr, "GetAudioOutputProcessMasterVolume"}, + FunctionInfo{5, nullptr, "SetAudioOutputProcessMasterVolume"}, + FunctionInfo{6, nullptr, "GetAudioInputProcessMasterVolume"}, + FunctionInfo{7, nullptr, "SetAudioInputProcessMasterVolume"}, + FunctionInfo{8, nullptr, "GetAudioOutputProcessRecordVolume"}, + FunctionInfo{9, nullptr, "SetAudioOutputProcessRecordVolume"}, + FunctionInfo{10, nullptr, "GetAppletStateSummaries"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IAudioSystemManagerForDebugger final : public ServiceFramework { public: explicit IAudioSystemManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "aud:d"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestSuspendAudioForDebug"}, - {1, nullptr, "RequestResumeAudioForDebug"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "aud:d"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestSuspendAudioForDebug"}, + FunctionInfo{1, nullptr, "RequestResumeAudioForDebug"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/audio/audio_controller.cpp b/src/core/hle/service/audio/audio_controller.cpp index 611e48e8ba..d912a5e86a 100644 --- a/src/core/hle/service/audio/audio_controller.cpp +++ b/src/core/hle/service/audio/audio_controller.cpp @@ -1,7 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -20,77 +20,75 @@ namespace Service::Audio { +std::optional IAudioController::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IAudioController::GetTargetVolume>, "GetTargetVolume"}, + FunctionInfo{1, D<&IAudioController::SetTargetVolume>, "SetTargetVolume"}, + FunctionInfo{2, D<&IAudioController::GetTargetVolumeMin>, "GetTargetVolumeMin"}, + FunctionInfo{3, D<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"}, + FunctionInfo{4, D<&IAudioController::IsTargetMute>, "IsTargetMute"}, + FunctionInfo{5, D<&IAudioController::SetTargetMute>, "SetTargetMute"}, + FunctionInfo{6, nullptr, "IsTargetConnected", MakeVersionGate({20,0,0})}, + FunctionInfo{7, nullptr, "SetDefaultTarget"}, + FunctionInfo{8, nullptr, "GetDefaultTarget"}, + FunctionInfo{9, D<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"}, + FunctionInfo{10, D<&IAudioController::SetAudioOutputMode>, "SetAudioOutputMode"}, + FunctionInfo{11, nullptr, "SetForceMutePolicy"}, + FunctionInfo{12, D<&IAudioController::GetForceMutePolicy>, "GetForceMutePolicy"}, + FunctionInfo{13, D<&IAudioController::GetOutputModeSetting>, "GetOutputModeSetting"}, + FunctionInfo{14, D<&IAudioController::SetOutputModeSetting>, "SetOutputModeSetting"}, + FunctionInfo{15, nullptr, "SetOutputTarget"}, + FunctionInfo{16, nullptr, "SetInputTargetForceEnabled"}, + FunctionInfo{17, D<&IAudioController::SetHeadphoneOutputLevelMode>, "SetHeadphoneOutputLevelMode"}, + FunctionInfo{18, D<&IAudioController::GetHeadphoneOutputLevelMode>, "GetHeadphoneOutputLevelMode"}, + FunctionInfo{19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"}, + FunctionInfo{20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"}, + FunctionInfo{21, nullptr, "GetAudioOutputTargetForPlayReport"}, + FunctionInfo{22, D<&IAudioController::NotifyHeadphoneVolumeWarningDisplayedEvent>, "NotifyHeadphoneVolumeWarningDisplayedEvent"}, + FunctionInfo{23, nullptr, "SetSystemOutputMasterVolume"}, + FunctionInfo{24, nullptr, "GetSystemOutputMasterVolume"}, + FunctionInfo{25, nullptr, "GetAudioVolumeDataForPlayReport"}, + FunctionInfo{26, nullptr, "UpdateHeadphoneSettings"}, + FunctionInfo{27, nullptr, "SetVolumeMappingTableForDev"}, + FunctionInfo{28, nullptr, "GetAudioOutputChannelCountForPlayReport"}, + FunctionInfo{29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"}, + FunctionInfo{30, D<&IAudioController::SetSpeakerAutoMuteEnabled>, "SetSpeakerAutoMuteEnabled"}, + FunctionInfo{31, D<&IAudioController::IsSpeakerAutoMuteEnabled>, "IsSpeakerAutoMuteEnabled"}, + FunctionInfo{32, D<&IAudioController::GetActiveOutputTarget>, "GetActiveOutputTarget"}, + FunctionInfo{33, nullptr, "GetTargetDeviceInfo"}, + FunctionInfo{34, D<&IAudioController::AcquireTargetNotification>, "AcquireTargetNotification"}, + FunctionInfo{35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"}, + FunctionInfo{36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"}, + FunctionInfo{37, nullptr, "SetHearingProtectionSafeguardEnabled"}, + FunctionInfo{38, nullptr, "IsHearingProtectionSafeguardEnabled"}, + FunctionInfo{39, nullptr, "IsHearingProtectionSafeguardMonitoringOutputForDebug"}, + FunctionInfo{40, nullptr, "GetSystemInformationForDebug"}, + FunctionInfo{41, nullptr, "SetVolumeButtonLongPressTime"}, + FunctionInfo{42, nullptr, "SetNativeVolumeForDebug"}, + FunctionInfo{43, nullptr, "Unknown43", MakeVersionGate({21,0,0})}, + FunctionInfo{5000, D<&IAudioController::Unknown5000>, "Unknown5000", MakeVersionGate({19,0,0})}, + FunctionInfo{10000, nullptr, "NotifyAudioOutputTargetForPlayReport"}, + FunctionInfo{10001, nullptr, "NotifyAudioOutputChannelCountForPlayReport"}, + FunctionInfo{10002, nullptr, "NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport"}, + FunctionInfo{10100, nullptr, "GetAudioVolumeDataForPlayReport"}, + FunctionInfo{10101, nullptr, "BindAudioVolumeUpdateEventForPlayReport"}, + FunctionInfo{10102, nullptr, "BindAudioOutputTargetUpdateEventForPlayReport"}, + FunctionInfo{10103, nullptr, "GetAudioOutputTargetForPlayReport"}, + FunctionInfo{10104, nullptr, "GetAudioOutputChannelCountForPlayReport"}, + FunctionInfo{10105, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport", MakeVersionGate({14,0,0}, {19,0,1})}, + FunctionInfo{10106, nullptr, "GetDefaultAudioOutputTargetForPlayReport", MakeVersionGate({14,0,0}, {19,0,1})}, + FunctionInfo{10200, nullptr, "Unknown10200", MakeVersionGate({20,0,0})}, + FunctionInfo{50000, nullptr, "SetAnalogInputBoostGainForPrototyping", MakeVersionGate({15,0,0}, {18,1,0})}, + FunctionInfo{50001, nullptr, "OverrideDefaultTargetForDebug", MakeVersionGate({19,0,0}, {19,0,1})}, + FunctionInfo{50003, nullptr, "SetForceOverrideExternalDeviceNameForDebug", MakeVersionGate({19,0,0})}, + FunctionInfo{50004, nullptr, "ClearForceOverrideExternalDeviceNameForDebug", MakeVersionGate({19,0,0})} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IAudioController::IAudioController(Core::System& system_) : ServiceFramework{system_, "audctl"}, service_context{system, "audctl"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IAudioController::GetTargetVolume>, "GetTargetVolume"}, - {1, D<&IAudioController::SetTargetVolume>, "SetTargetVolume"}, - {2, D<&IAudioController::GetTargetVolumeMin>, "GetTargetVolumeMin"}, - {3, D<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"}, - {4, D<&IAudioController::IsTargetMute>, "IsTargetMute"}, - {5, D<&IAudioController::SetTargetMute>, "SetTargetMute"}, - {6, nullptr, "IsTargetConnected"}, //20.0.0+ - {7, nullptr, "SetDefaultTarget"}, - {8, nullptr, "GetDefaultTarget"}, - {9, D<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"}, - {10, D<&IAudioController::SetAudioOutputMode>, "SetAudioOutputMode"}, - {11, nullptr, "SetForceMutePolicy"}, - {12, D<&IAudioController::GetForceMutePolicy>, "GetForceMutePolicy"}, - {13, D<&IAudioController::GetOutputModeSetting>, "GetOutputModeSetting"}, - {14, D<&IAudioController::SetOutputModeSetting>, "SetOutputModeSetting"}, - {15, nullptr, "SetOutputTarget"}, - {16, nullptr, "SetInputTargetForceEnabled"}, - {17, D<&IAudioController::SetHeadphoneOutputLevelMode>, "SetHeadphoneOutputLevelMode"}, - {18, D<&IAudioController::GetHeadphoneOutputLevelMode>, "GetHeadphoneOutputLevelMode"}, - {19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"}, - {20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"}, - {21, nullptr, "GetAudioOutputTargetForPlayReport"}, - {22, D<&IAudioController::NotifyHeadphoneVolumeWarningDisplayedEvent>, "NotifyHeadphoneVolumeWarningDisplayedEvent"}, - {23, nullptr, "SetSystemOutputMasterVolume"}, - {24, nullptr, "GetSystemOutputMasterVolume"}, - {25, nullptr, "GetAudioVolumeDataForPlayReport"}, - {26, nullptr, "UpdateHeadphoneSettings"}, - {27, nullptr, "SetVolumeMappingTableForDev"}, - {28, nullptr, "GetAudioOutputChannelCountForPlayReport"}, - {29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"}, - {30, D<&IAudioController::SetSpeakerAutoMuteEnabled>, "SetSpeakerAutoMuteEnabled"}, - {31, D<&IAudioController::IsSpeakerAutoMuteEnabled>, "IsSpeakerAutoMuteEnabled"}, - {32, D<&IAudioController::GetActiveOutputTarget>, "GetActiveOutputTarget"}, - {33, nullptr, "GetTargetDeviceInfo"}, - {34, D<&IAudioController::AcquireTargetNotification>, "AcquireTargetNotification"}, - {35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"}, - {36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"}, - {37, nullptr, "SetHearingProtectionSafeguardEnabled"}, - {38, nullptr, "IsHearingProtectionSafeguardEnabled"}, - {39, nullptr, "IsHearingProtectionSafeguardMonitoringOutputForDebug"}, - {40, nullptr, "GetSystemInformationForDebug"}, - {41, nullptr, "SetVolumeButtonLongPressTime"}, - {42, nullptr, "SetNativeVolumeForDebug"}, - {43, nullptr, "Unknown43"}, //21.0.0+ - {5000, D<&IAudioController::Unknown5000>, "Unknown5000"}, //19.0.0+ - {10000, nullptr, "NotifyAudioOutputTargetForPlayReport"}, - {10001, nullptr, "NotifyAudioOutputChannelCountForPlayReport"}, - {10002, nullptr, "NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport"}, - {10100, nullptr, "GetAudioVolumeDataForPlayReport"}, - {10101, nullptr, "BindAudioVolumeUpdateEventForPlayReport"}, - {10102, nullptr, "BindAudioOutputTargetUpdateEventForPlayReport"}, - {10103, nullptr, "GetAudioOutputTargetForPlayReport"}, - {10104, nullptr, "GetAudioOutputChannelCountForPlayReport"}, - {10105, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"}, //14.0.0-19.0.1 - {10106, nullptr, "GetDefaultAudioOutputTargetForPlayReport"}, //14.0.0-19.0.1 - {10200, nullptr, "Unknown10200"}, //20.0.0+ - {50000, nullptr, "SetAnalogInputBoostGainForPrototyping"}, //15.0.0-18.1.0 - {50001, nullptr, "OverrideDefaultTargetForDebug"}, //19.0.0-19.0.1 - {50003, nullptr, "SetForceOverrideExternalDeviceNameForDebug"}, //19.0.0+ - {50004, nullptr, "ClearForceOverrideExternalDeviceNameForDebug"} //19.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); - - m_set_sys = - system.ServiceManager().GetService("set:sys", true); + m_set_sys = system.ServiceManager().GetService("set:sys", true); notification_event = service_context.CreateEvent("IAudioController:NotificationEvent"); // Probably shouldn't do this in constructor? diff --git a/src/core/hle/service/audio/audio_controller.h b/src/core/hle/service/audio/audio_controller.h index ff51f4c244..e5c615fa21 100644 --- a/src/core/hle/service/audio/audio_controller.h +++ b/src/core/hle/service/audio/audio_controller.h @@ -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-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -59,8 +59,8 @@ private: Result AcquireTargetNotification(OutCopyHandle out_notification_event); Result Unknown5000(Out> out_audio_controller); + std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext service_context; - Kernel::KEvent* notification_event; std::shared_ptr m_set_sys; std::array m_target_volumes{{15, 15, 15, 15, 15, 15}}; diff --git a/src/core/hle/service/audio/audio_device.cpp b/src/core/hle/service/audio/audio_device.cpp index e9f7e074a1..fc24bf3ccd 100644 --- a/src/core/hle/service/audio/audio_device.cpp +++ b/src/core/hle/service/audio/audio_device.cpp @@ -12,36 +12,38 @@ namespace Service::Audio { using namespace AudioCore::Renderer; +std::optional IAudioDevice::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IAudioDevice::ListAudioDeviceName>, "ListAudioDeviceName"}, + FunctionInfo{1, D<&IAudioDevice::SetAudioDeviceOutputVolume>, "SetAudioDeviceOutputVolume"}, + FunctionInfo{2, D<&IAudioDevice::GetAudioDeviceOutputVolume>, "GetAudioDeviceOutputVolume"}, + FunctionInfo{3, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioDeviceName"}, + FunctionInfo{4, D<&IAudioDevice::QueryAudioDeviceSystemEvent>, "QueryAudioDeviceSystemEvent"}, + FunctionInfo{5, D<&IAudioDevice::GetActiveChannelCount>, "GetActiveChannelCount"}, + FunctionInfo{6, D<&IAudioDevice::ListAudioDeviceNameAuto>, "ListAudioDeviceNameAuto"}, + FunctionInfo{7, D<&IAudioDevice::SetAudioDeviceOutputVolumeAuto>, "SetAudioDeviceOutputVolumeAuto"}, + FunctionInfo{8, D<&IAudioDevice::GetAudioDeviceOutputVolumeAuto>, "GetAudioDeviceOutputVolumeAuto"}, + FunctionInfo{10, D<&IAudioDevice::GetActiveAudioDeviceNameAuto>, "GetActiveAudioDeviceNameAuto"}, + FunctionInfo{11, D<&IAudioDevice::QueryAudioDeviceInputEvent>, "QueryAudioDeviceInputEvent"}, + FunctionInfo{12, D<&IAudioDevice::QueryAudioDeviceOutputEvent>, "QueryAudioDeviceOutputEvent"}, + FunctionInfo{13, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioOutputDeviceName"}, + FunctionInfo{14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"}, + FunctionInfo{15, nullptr, "AcquireAudioInputDeviceNotification", MakeVersionGate({17,0,0})}, + FunctionInfo{16, nullptr, "ReleaseAudioInputDeviceNotification", MakeVersionGate({17,0,0})}, + FunctionInfo{17, nullptr, "AcquireAudioOutputDeviceNotification", MakeVersionGate({17,0,0})}, + FunctionInfo{18, nullptr, "ReleaseAudioOutputDeviceNotification", MakeVersionGate({17,0,0})}, + FunctionInfo{19, D<&IAudioDevice::SetAudioDeviceOutputVolumeAutoTuneEnabled>, "SetAudioDeviceOutputVolumeAutoTuneEnabled", MakeVersionGate({18,0,0})}, + FunctionInfo{20, D<&IAudioDevice::IsAudioDeviceOutputVolumeAutoTuneEnabled>, "IsAudioDeviceOutputVolumeAutoTuneEnabled", MakeVersionGate({18,0,0})}, + FunctionInfo{21, nullptr, "IsActiveOutputDeviceEstimatedLowLatency", MakeVersionGate({21,0,0})} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IAudioDevice::IAudioDevice(Core::System& system_, u64 applet_resource_user_id, u32 revision, u32 device_num) : ServiceFramework{system_, "IAudioDevice"}, service_context{system_, "IAudioDevice"}, impl{std::make_unique(system_, applet_resource_user_id, revision)}, event{service_context.CreateEvent(fmt::format("IAudioDeviceEvent-{}", device_num))} { - static const FunctionInfo functions[] = { - {0, D<&IAudioDevice::ListAudioDeviceName>, "ListAudioDeviceName"}, - {1, D<&IAudioDevice::SetAudioDeviceOutputVolume>, "SetAudioDeviceOutputVolume"}, - {2, D<&IAudioDevice::GetAudioDeviceOutputVolume>, "GetAudioDeviceOutputVolume"}, - {3, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioDeviceName"}, - {4, D<&IAudioDevice::QueryAudioDeviceSystemEvent>, "QueryAudioDeviceSystemEvent"}, - {5, D<&IAudioDevice::GetActiveChannelCount>, "GetActiveChannelCount"}, - {6, D<&IAudioDevice::ListAudioDeviceNameAuto>, "ListAudioDeviceNameAuto"}, - {7, D<&IAudioDevice::SetAudioDeviceOutputVolumeAuto>, "SetAudioDeviceOutputVolumeAuto"}, - {8, D<&IAudioDevice::GetAudioDeviceOutputVolumeAuto>, "GetAudioDeviceOutputVolumeAuto"}, - {10, D<&IAudioDevice::GetActiveAudioDeviceNameAuto>, "GetActiveAudioDeviceNameAuto"}, - {11, D<&IAudioDevice::QueryAudioDeviceInputEvent>, "QueryAudioDeviceInputEvent"}, - {12, D<&IAudioDevice::QueryAudioDeviceOutputEvent>, "QueryAudioDeviceOutputEvent"}, - {13, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioOutputDeviceName"}, - {14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"}, - {15, nullptr, "AcquireAudioInputDeviceNotification"}, //17.0.0+ - {16, nullptr, "ReleaseAudioInputDeviceNotification"}, //17.0.0+ - {17, nullptr, "AcquireAudioOutputDeviceNotification"}, //17.0.0+ - {18, nullptr, "ReleaseAudioOutputDeviceNotification"}, //17.0.0+ - {19, D<&IAudioDevice::SetAudioDeviceOutputVolumeAutoTuneEnabled>, "SetAudioDeviceOutputVolumeAutoTuneEnabled"}, //18.0.0+ - {20, D<&IAudioDevice::IsAudioDeviceOutputVolumeAutoTuneEnabled>, "IsAudioDeviceOutputVolumeAutoTuneEnabled"}, //18.0.0+ - {21, nullptr, "IsActiveOutputDeviceEstimatedLowLatency"} //21.0.0+ - }; - RegisterHandlers(functions); - event->Signal(system.Kernel()); } diff --git a/src/core/hle/service/audio/audio_device.h b/src/core/hle/service/audio/audio_device.h index f6c12fbfeb..bd0aaa5f7c 100644 --- a/src/core/hle/service/audio/audio_device.h +++ b/src/core/hle/service/audio/audio_device.h @@ -55,6 +55,7 @@ private: Result SetAudioDeviceOutputVolumeAutoTuneEnabled(bool enabled); Result IsAudioDeviceOutputVolumeAutoTuneEnabled(Out out_enabled); + std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext service_context; std::unique_ptr impl; Kernel::KEvent* event; diff --git a/src/core/hle/service/audio/audio_in.cpp b/src/core/hle/service/audio/audio_in.cpp index 6208c2d104..068574dbd2 100644 --- a/src/core/hle/service/audio/audio_in.cpp +++ b/src/core/hle/service/audio/audio_in.cpp @@ -11,35 +11,33 @@ namespace Service::Audio { using namespace AudioCore::AudioIn; +std::optional IAudioIn::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IAudioIn::GetAudioInState>, "GetAudioInState"}, + FunctionInfo{1, D<&IAudioIn::Start>, "Start"}, + FunctionInfo{2, D<&IAudioIn::Stop>, "Stop"}, + FunctionInfo{3, D<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBuffer"}, + FunctionInfo{4, D<&IAudioIn::RegisterBufferEvent>, "RegisterBufferEvent"}, + FunctionInfo{5, D<&IAudioIn::GetReleasedAudioInBuffers>, "GetReleasedAudioInBuffers"}, + FunctionInfo{6, D<&IAudioIn::ContainsAudioInBuffer>, "ContainsAudioInBuffer"}, + FunctionInfo{7, D<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBuffer"}, + FunctionInfo{8, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendAudioInBufferAuto"}, + FunctionInfo{9, D<&IAudioIn::GetReleasedAudioInBuffersAuto>, "GetReleasedAudioInBuffersAuto"}, + FunctionInfo{10, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendUacInBufferAuto"}, + FunctionInfo{11, D<&IAudioIn::GetAudioInBufferCount>, "GetAudioInBufferCount"}, + FunctionInfo{12, D<&IAudioIn::SetDeviceGain>, "SetDeviceGain"}, + FunctionInfo{13, D<&IAudioIn::GetDeviceGain>, "GetDeviceGain"}, + FunctionInfo{14, D<&IAudioIn::FlushAudioInBuffers>, "FlushAudioInBuffers"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IAudioIn::IAudioIn(Core::System& system_, Manager& manager, size_t session_id, const std::string& device_name, const AudioInParameter& in_params, Kernel::KProcess* handle, u64 applet_resource_user_id) - : ServiceFramework{system_, "IAudioIn"}, process{handle}, service_context{system_, "IAudioIn"}, - event{service_context.CreateEvent("AudioInEvent")}, impl{std::make_shared(system_, - manager, event, - session_id)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IAudioIn::GetAudioInState>, "GetAudioInState"}, - {1, D<&IAudioIn::Start>, "Start"}, - {2, D<&IAudioIn::Stop>, "Stop"}, - {3, D<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBuffer"}, - {4, D<&IAudioIn::RegisterBufferEvent>, "RegisterBufferEvent"}, - {5, D<&IAudioIn::GetReleasedAudioInBuffers>, "GetReleasedAudioInBuffers"}, - {6, D<&IAudioIn::ContainsAudioInBuffer>, "ContainsAudioInBuffer"}, - {7, D<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBuffer"}, - {8, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendAudioInBufferAuto"}, - {9, D<&IAudioIn::GetReleasedAudioInBuffersAuto>, "GetReleasedAudioInBuffersAuto"}, - {10, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendUacInBufferAuto"}, - {11, D<&IAudioIn::GetAudioInBufferCount>, "GetAudioInBufferCount"}, - {12, D<&IAudioIn::SetDeviceGain>, "SetDeviceGain"}, - {13, D<&IAudioIn::GetDeviceGain>, "GetDeviceGain"}, - {14, D<&IAudioIn::FlushAudioInBuffers>, "FlushAudioInBuffers"}, - }; - // clang-format on - - RegisterHandlers(functions); - + : ServiceFramework{system_, "IAudioIn"}, process{handle}, service_context{system_, "IAudioIn"} + , event{service_context.CreateEvent("AudioInEvent")}, impl{std::make_shared(system_, manager, event, session_id)} +{ process->Open(system.Kernel()); if (impl->GetSystem() diff --git a/src/core/hle/service/audio/audio_in.h b/src/core/hle/service/audio/audio_in.h index 3fe1e1e870..dd7a41f300 100644 --- a/src/core/hle/service/audio/audio_in.h +++ b/src/core/hle/service/audio/audio_in.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -43,6 +46,7 @@ public: Result FlushAudioInBuffers(Out out_flushed); private: + std::optional FindRequest(u32 key) override; Kernel::KProcess* process; KernelHelpers::ServiceContext service_context; Kernel::KEvent* event; diff --git a/src/core/hle/service/audio/audio_in_manager.cpp b/src/core/hle/service/audio/audio_in_manager.cpp index 2675a57735..422e72148b 100644 --- a/src/core/hle/service/audio/audio_in_manager.cpp +++ b/src/core/hle/service/audio/audio_in_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,23 +12,23 @@ namespace Service::Audio { using namespace AudioCore::AudioIn; -IAudioInManager::IAudioInManager(Core::System& system_) - : ServiceFramework{system_, "audin:u"}, impl{std::make_unique( - system_)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IAudioInManager::ListAudioIns>, "ListAudioIns"}, - {1, D<&IAudioInManager::OpenAudioIn>, "OpenAudioIn"}, - {2, D<&IAudioInManager::ListAudioIns>, "ListAudioInsAuto"}, - {3, D<&IAudioInManager::OpenAudioIn>, "OpenAudioInAuto"}, - {4, D<&IAudioInManager::ListAudioInsAutoFiltered>, "ListAudioInsAutoFiltered"}, - {5, D<&IAudioInManager::OpenAudioInProtocolSpecified>, "OpenAudioInProtocolSpecified"}, - }; - // clang-format on - - RegisterHandlers(functions); +std::optional IAudioInManager::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IAudioInManager::ListAudioIns>, "ListAudioIns"}, + FunctionInfo{1, D<&IAudioInManager::OpenAudioIn>, "OpenAudioIn"}, + FunctionInfo{2, D<&IAudioInManager::ListAudioIns>, "ListAudioInsAuto"}, + FunctionInfo{3, D<&IAudioInManager::OpenAudioIn>, "OpenAudioInAuto"}, + FunctionInfo{4, D<&IAudioInManager::ListAudioInsAutoFiltered>, "ListAudioInsAutoFiltered"}, + FunctionInfo{5, D<&IAudioInManager::OpenAudioInProtocolSpecified>, "OpenAudioInProtocolSpecified"} + ); + return HandlerTableGenerateWithFind(key, functions); } +IAudioInManager::IAudioInManager(Core::System& system_) + : ServiceFramework{system_, "audin:u"} + , impl{std::make_unique(system_)} +{} + IAudioInManager::~IAudioInManager() = default; Result IAudioInManager::ListAudioIns( diff --git a/src/core/hle/service/audio/audio_in_manager.h b/src/core/hle/service/audio/audio_in_manager.h index 2a983bc607..0ee0badba7 100644 --- a/src/core/hle/service/audio/audio_in_manager.h +++ b/src/core/hle/service/audio/audio_in_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -51,6 +54,7 @@ private: AudioCore::AudioIn::AudioInParameter parameter, InCopyHandle process_handle, ClientAppletResourceUserId aruid); + std::optional FindRequest(u32 key) override; std::unique_ptr impl; }; diff --git a/src/core/hle/service/audio/audio_out.cpp b/src/core/hle/service/audio/audio_out.cpp index 996eeede58..a5f06faab8 100644 --- a/src/core/hle/service/audio/audio_out.cpp +++ b/src/core/hle/service/audio/audio_out.cpp @@ -15,6 +15,26 @@ namespace Service::Audio { using namespace AudioCore::AudioOut; +std::optional IAudioOut::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IAudioOut::GetAudioOutState>, "GetAudioOutState"}, + FunctionInfo{1, D<&IAudioOut::Start>, "Start"}, + FunctionInfo{2, D<&IAudioOut::Stop>, "Stop"}, + FunctionInfo{3, D<&IAudioOut::AppendAudioOutBuffer>, "AppendAudioOutBuffer"}, + FunctionInfo{4, D<&IAudioOut::RegisterBufferEvent>, "RegisterBufferEvent"}, + FunctionInfo{5, D<&IAudioOut::GetReleasedAudioOutBuffers>, "GetReleasedAudioOutBuffers"}, + FunctionInfo{6, D<&IAudioOut::ContainsAudioOutBuffer>, "ContainsAudioOutBuffer"}, + FunctionInfo{7, D<&IAudioOut::AppendAudioOutBufferAuto>, "AppendAudioOutBufferAuto"}, + FunctionInfo{8, D<&IAudioOut::GetReleasedAudioOutBuffersAuto>, "GetReleasedAudioOutBuffersAuto"}, + FunctionInfo{9, D<&IAudioOut::GetAudioOutBufferCount>, "GetAudioOutBufferCount"}, + FunctionInfo{10, D<&IAudioOut::GetAudioOutPlayedSampleCount>, "GetAudioOutPlayedSampleCount"}, + FunctionInfo{11, D<&IAudioOut::FlushAudioOutBuffers>, "FlushAudioOutBuffers"}, + FunctionInfo{12, D<&IAudioOut::SetAudioOutVolume>, "SetAudioOutVolume"}, + FunctionInfo{13, D<&IAudioOut::GetAudioOutVolume>, "GetAudioOutVolume"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IAudioOut::IAudioOut(Core::System& system_, Manager& manager, size_t session_id, const std::string& device_name, const AudioOutParameter& in_params, Kernel::KProcess* handle, u64 applet_resource_user_id) @@ -22,26 +42,6 @@ IAudioOut::IAudioOut(Core::System& system_, Manager& manager, size_t session_id, event{service_context.CreateEvent("AudioOutEvent")}, process{handle}, impl{std::make_shared(system_, manager, event, session_id)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IAudioOut::GetAudioOutState>, "GetAudioOutState"}, - {1, D<&IAudioOut::Start>, "Start"}, - {2, D<&IAudioOut::Stop>, "Stop"}, - {3, D<&IAudioOut::AppendAudioOutBuffer>, "AppendAudioOutBuffer"}, - {4, D<&IAudioOut::RegisterBufferEvent>, "RegisterBufferEvent"}, - {5, D<&IAudioOut::GetReleasedAudioOutBuffers>, "GetReleasedAudioOutBuffers"}, - {6, D<&IAudioOut::ContainsAudioOutBuffer>, "ContainsAudioOutBuffer"}, - {7, D<&IAudioOut::AppendAudioOutBufferAuto>, "AppendAudioOutBufferAuto"}, - {8, D<&IAudioOut::GetReleasedAudioOutBuffersAuto>, "GetReleasedAudioOutBuffersAuto"}, - {9, D<&IAudioOut::GetAudioOutBufferCount>, "GetAudioOutBufferCount"}, - {10, D<&IAudioOut::GetAudioOutPlayedSampleCount>, "GetAudioOutPlayedSampleCount"}, - {11, D<&IAudioOut::FlushAudioOutBuffers>, "FlushAudioOutBuffers"}, - {12, D<&IAudioOut::SetAudioOutVolume>, "SetAudioOutVolume"}, - {13, D<&IAudioOut::GetAudioOutVolume>, "GetAudioOutVolume"}, - }; - // clang-format on - RegisterHandlers(functions); - process->Open(system.Kernel()); } diff --git a/src/core/hle/service/audio/audio_out.h b/src/core/hle/service/audio/audio_out.h index 779b213e78..311eb84afe 100644 --- a/src/core/hle/service/audio/audio_out.h +++ b/src/core/hle/service/audio/audio_out.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -49,6 +52,8 @@ public: Result GetAudioOutVolume(Out out_volume); private: + std::optional FindRequest(u32 key) override; + KernelHelpers::ServiceContext service_context; Kernel::KEvent* event; Kernel::KProcess* process; diff --git a/src/core/hle/service/audio/audio_out_manager.cpp b/src/core/hle/service/audio/audio_out_manager.cpp index 3b2087932c..9f24bc3513 100644 --- a/src/core/hle/service/audio/audio_out_manager.cpp +++ b/src/core/hle/service/audio/audio_out_manager.cpp @@ -13,20 +13,20 @@ namespace Service::Audio { using namespace AudioCore::AudioOut; +std::optional IAudioOutManager::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"}, + FunctionInfo{1, D<&IAudioOutManager::OpenAudioOut>, "OpenAudioOut"}, + FunctionInfo{2, D<&IAudioOutManager::ListAudioOutsAuto>, "ListAudioOutsAuto"}, + FunctionInfo{3, D<&IAudioOutManager::OpenAudioOutAuto>, "OpenAudioOutAuto"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IAudioOutManager::IAudioOutManager(Core::System& system_) : ServiceFramework{system_, "audout:u"} , impl(system_) { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"}, - {1, D<&IAudioOutManager::OpenAudioOut>, "OpenAudioOut"}, - {2, D<&IAudioOutManager::ListAudioOutsAuto>, "ListAudioOutsAuto"}, - {3, D<&IAudioOutManager::OpenAudioOutAuto>, "OpenAudioOutAuto"}, - }; - // clang-format on - - RegisterHandlers(functions); } IAudioOutManager::~IAudioOutManager() = default; diff --git a/src/core/hle/service/audio/audio_out_manager.h b/src/core/hle/service/audio/audio_out_manager.h index ec974aaba4..4c71c12cdf 100644 --- a/src/core/hle/service/audio/audio_out_manager.h +++ b/src/core/hle/service/audio/audio_out_manager.h @@ -43,6 +43,7 @@ private: AudioCore::AudioOut::AudioOutParameter parameter, InCopyHandle process_handle, ClientAppletResourceUserId aruid); + std::optional FindRequest(u32 key) override; std::optional impl; }; diff --git a/src/core/hle/service/audio/audio_renderer.cpp b/src/core/hle/service/audio/audio_renderer.cpp index dd76544094..bcb2adaf61 100644 --- a/src/core/hle/service/audio/audio_renderer.cpp +++ b/src/core/hle/service/audio/audio_renderer.cpp @@ -10,38 +10,37 @@ namespace Service::Audio { using namespace AudioCore::Renderer; +std::optional IAudioRenderer::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IAudioRenderer::GetSampleRate>, "GetSampleRate"}, + FunctionInfo{1, D<&IAudioRenderer::GetSampleCount>, "GetSampleCount"}, + FunctionInfo{2, D<&IAudioRenderer::GetMixBufferCount>, "GetMixBufferCount"}, + FunctionInfo{3, D<&IAudioRenderer::GetState>, "GetState"}, + FunctionInfo{4, D<&IAudioRenderer::RequestUpdate>, "RequestUpdate"}, + FunctionInfo{5, D<&IAudioRenderer::Start>, "Start"}, + FunctionInfo{6, D<&IAudioRenderer::Stop>, "Stop"}, + FunctionInfo{7, D<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"}, + FunctionInfo{8, D<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"}, + FunctionInfo{9, D<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"}, + FunctionInfo{10, D<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto", MakeVersionGate({3,0,0})}, + FunctionInfo{11, nullptr, "ExecuteAudioRendererRendering", MakeVersionGate({3,0,0})}, + FunctionInfo{12, D<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter", MakeVersionGate({15,0,0})}, + FunctionInfo{13, D<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter", MakeVersionGate({15,0,0})} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_, AudioCore::AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, Kernel::KProcess* process_handle_, u64 applet_resource_user_id, s32 session_id) - : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"}, - rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_}, - impl{std::make_unique(system_, manager, rendered_event)}, process_handle{ - process_handle_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IAudioRenderer::GetSampleRate>, "GetSampleRate"}, - {1, D<&IAudioRenderer::GetSampleCount>, "GetSampleCount"}, - {2, D<&IAudioRenderer::GetMixBufferCount>, "GetMixBufferCount"}, - {3, D<&IAudioRenderer::GetState>, "GetState"}, - {4, D<&IAudioRenderer::RequestUpdate>, "RequestUpdate"}, - {5, D<&IAudioRenderer::Start>, "Start"}, - {6, D<&IAudioRenderer::Stop>, "Stop"}, - {7, D<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"}, - {8, D<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"}, - {9, D<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"}, - {10, D<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto"}, //3.0.0+ - {11, nullptr, "ExecuteAudioRendererRendering"}, //3.0.0+ - {12, D<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter"}, //15.0.0+ - {13, D<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter"}, //15.0.0+ - }; - // clang-format on - RegisterHandlers(functions); - + : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"} + , rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_} + , impl{std::make_unique(system_, manager, rendered_event)} + , process_handle{process_handle_} { process_handle->Open(system_.Kernel()); - impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle, - applet_resource_user_id, session_id); + impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle, applet_resource_user_id, session_id); } IAudioRenderer::~IAudioRenderer() { diff --git a/src/core/hle/service/audio/audio_renderer.h b/src/core/hle/service/audio/audio_renderer.h index f25c50ce8d..e03fc6551d 100644 --- a/src/core/hle/service/audio/audio_renderer.h +++ b/src/core/hle/service/audio/audio_renderer.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -42,6 +45,7 @@ private: Result SetVoiceDropParameter(f32 voice_drop_parameter); Result GetVoiceDropParameter(Out out_voice_drop_parameter); + std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext service_context; Kernel::KEvent* rendered_event; AudioCore::Renderer::Manager& manager; diff --git a/src/core/hle/service/audio/audio_renderer_manager.cpp b/src/core/hle/service/audio/audio_renderer_manager.cpp index 4756802eeb..98701c79c1 100644 --- a/src/core/hle/service/audio/audio_renderer_manager.cpp +++ b/src/core/hle/service/audio/audio_renderer_manager.cpp @@ -18,21 +18,21 @@ namespace Service::Audio { using namespace AudioCore::Renderer; +std::optional IAudioRendererManager::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"}, + FunctionInfo{1, D<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"}, + FunctionInfo{2, D<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"}, + FunctionInfo{3, nullptr, "OpenAudioRendererForManualExecution"}, + FunctionInfo{4, D<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IAudioRendererManager::IAudioRendererManager(Core::System& system_) : ServiceFramework{system_, "audren:u"} , impl(system_) { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"}, - {1, D<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"}, - {2, D<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"}, - {3, nullptr, "OpenAudioRendererForManualExecution"}, - {4, D<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"}, - }; - // clang-format on - - RegisterHandlers(functions); } IAudioRendererManager::~IAudioRendererManager() = default; diff --git a/src/core/hle/service/audio/audio_renderer_manager.h b/src/core/hle/service/audio/audio_renderer_manager.h index fdce8b6ffa..bd3ea06326 100644 --- a/src/core/hle/service/audio/audio_renderer_manager.h +++ b/src/core/hle/service/audio/audio_renderer_manager.h @@ -33,6 +33,7 @@ private: Result GetAudioDeviceServiceWithRevisionInfo(Out> out_audio_device, u32 revision, ClientAppletResourceUserId aruid); + std::optional FindRequest(u32 key) override; std::optional impl; u32 num_audio_devices{0}; }; diff --git a/src/core/hle/service/audio/final_output_recorder_manager.cpp b/src/core/hle/service/audio/final_output_recorder_manager.cpp index f70a0e62d7..9c51613de6 100644 --- a/src/core/hle/service/audio/final_output_recorder_manager.cpp +++ b/src/core/hle/service/audio/final_output_recorder_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,34 +11,29 @@ namespace Service::Audio { class IFinalOutputRecorder final : public ServiceFramework { public: explicit IFinalOutputRecorder(Core::System& system_) - : ServiceFramework{system_, "IFinalOutputRecorder"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetFinalOutputRecorderState"}, - {1, nullptr, "Start"}, - {2, nullptr, "Stop"}, - {3, nullptr, "AppendFinalOutputRecorderBuffer"}, - {4, nullptr, "RegisterBufferEvent"}, - {5, nullptr, "GetReleasedFinalOutputRecorderBuffers"}, - {6, nullptr, "ContainsFinalOutputRecorderBuffer"}, - {7, nullptr, "GetFinalOutputRecorderBufferEndTime"}, - {8, nullptr, "AppendFinalOutputRecorderBufferAuto"}, - {9, nullptr, "GetReleasedFinalOutputRecorderBufferAuto"}, - {10, nullptr, "FlushFinalOutputRecorderBuffers"}, - {11, nullptr, "AttachWorkBuffer"}, - }; - // clang-format on + : ServiceFramework{system_, "IFinalOutputRecorder"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetFinalOutputRecorderState"}, + FunctionInfo{1, nullptr, "Start"}, + FunctionInfo{2, nullptr, "Stop"}, + FunctionInfo{3, nullptr, "AppendFinalOutputRecorderBuffer"}, + FunctionInfo{4, nullptr, "RegisterBufferEvent"}, + FunctionInfo{5, nullptr, "GetReleasedFinalOutputRecorderBuffers"}, + FunctionInfo{6, nullptr, "ContainsFinalOutputRecorderBuffer"}, + FunctionInfo{7, nullptr, "GetFinalOutputRecorderBufferEndTime"}, + FunctionInfo{8, nullptr, "AppendFinalOutputRecorderBufferAuto"}, + FunctionInfo{9, nullptr, "GetReleasedFinalOutputRecorderBufferAuto"}, + FunctionInfo{10, nullptr, "FlushFinalOutputRecorderBuffers"}, + FunctionInfo{11, nullptr, "AttachWorkBuffer"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; IFinalOutputRecorderManager::IFinalOutputRecorderManager(Core::System& system_) : ServiceFramework{system_, "audrec:u"} { - static const FunctionInfo functions[] = { - {0, nullptr, "OpenFinalOutputRecorder"}, - }; - RegisterHandlers(functions); } IFinalOutputRecorderManager::~IFinalOutputRecorderManager() = default; diff --git a/src/core/hle/service/audio/final_output_recorder_manager.h b/src/core/hle/service/audio/final_output_recorder_manager.h index 0663b894e7..ee392b2ada 100644 --- a/src/core/hle/service/audio/final_output_recorder_manager.h +++ b/src/core/hle/service/audio/final_output_recorder_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,6 +18,13 @@ class IFinalOutputRecorderManager final : public ServiceFramework FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "OpenFinalOutputRecorder"} + ); }; } // namespace Service::Audio diff --git a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp index 7e2e42bbe7..42c08d90ec 100644 --- a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp +++ b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,14 +10,6 @@ namespace Service::Audio { IFinalOutputRecorderManagerForApplet::IFinalOutputRecorderManagerForApplet(Core::System& system_) : ServiceFramework{system_, "audrec:a"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestSuspend"}, - {1, nullptr, "RequestResume"}, - }; - // clang-format on - - RegisterHandlers(functions); } IFinalOutputRecorderManagerForApplet::~IFinalOutputRecorderManagerForApplet() = default; diff --git a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h index 27940f7e0d..7beaa888ff 100644 --- a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h +++ b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -16,6 +19,14 @@ class IFinalOutputRecorderManagerForApplet final public: explicit IFinalOutputRecorderManagerForApplet(Core::System& system_); ~IFinalOutputRecorderManagerForApplet() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestSuspend"}, + FunctionInfo{1, nullptr, "RequestResume"} + ); }; } // namespace Service::Audio diff --git a/src/core/hle/service/audio/hardware_opus_decoder.cpp b/src/core/hle/service/audio/hardware_opus_decoder.cpp index 03d3374c14..f0dde63e14 100644 --- a/src/core/hle/service/audio/hardware_opus_decoder.cpp +++ b/src/core/hle/service/audio/hardware_opus_decoder.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,25 +11,25 @@ namespace Service::Audio { using namespace AudioCore::OpusDecoder; + std::optional IHardwareOpusDecoder::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IHardwareOpusDecoder::DecodeInterleavedOld>, "DecodeInterleavedOld"}, + FunctionInfo{1, D<&IHardwareOpusDecoder::SetContext>, "SetContext"}, + FunctionInfo{2, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamOld>, "DecodeInterleavedForMultiStreamOld"}, + FunctionInfo{3, D<&IHardwareOpusDecoder::SetContextForMultiStream>, "SetContextForMultiStream"}, + FunctionInfo{4, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfOld>, "DecodeInterleavedWithPerfOld"}, + FunctionInfo{5, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfOld>, "DecodeInterleavedForMultiStreamWithPerfOld"}, + FunctionInfo{6, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfAndResetOld>, "DecodeInterleavedWithPerfAndResetOld"}, + FunctionInfo{7, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfAndResetOld>, "DecodeInterleavedForMultiStreamWithPerfAndResetOld"}, + FunctionInfo{8, D<&IHardwareOpusDecoder::DecodeInterleaved>, "DecodeInterleaved"}, + FunctionInfo{9, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStream>, "DecodeInterleavedForMultiStream"} + ); + return HandlerTableGenerateWithFind(key, functions); + } + IHardwareOpusDecoder::IHardwareOpusDecoder(Core::System& system_, HardwareOpus& hardware_opus) : ServiceFramework{system_, "IHardwareOpusDecoder"}, impl{std::make_unique(system_, hardware_opus)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IHardwareOpusDecoder::DecodeInterleavedOld>, "DecodeInterleavedOld"}, - {1, D<&IHardwareOpusDecoder::SetContext>, "SetContext"}, - {2, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamOld>, "DecodeInterleavedForMultiStreamOld"}, - {3, D<&IHardwareOpusDecoder::SetContextForMultiStream>, "SetContextForMultiStream"}, - {4, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfOld>, "DecodeInterleavedWithPerfOld"}, - {5, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfOld>, "DecodeInterleavedForMultiStreamWithPerfOld"}, - {6, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfAndResetOld>, "DecodeInterleavedWithPerfAndResetOld"}, - {7, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfAndResetOld>, "DecodeInterleavedForMultiStreamWithPerfAndResetOld"}, - {8, D<&IHardwareOpusDecoder::DecodeInterleaved>, "DecodeInterleaved"}, - {9, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStream>, "DecodeInterleavedForMultiStream"}, - }; - // clang-format on - - RegisterHandlers(functions); } IHardwareOpusDecoder::~IHardwareOpusDecoder() = default; diff --git a/src/core/hle/service/audio/hardware_opus_decoder.h b/src/core/hle/service/audio/hardware_opus_decoder.h index 511bf46bdb..9f9b17bc81 100644 --- a/src/core/hle/service/audio/hardware_opus_decoder.h +++ b/src/core/hle/service/audio/hardware_opus_decoder.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -55,6 +58,7 @@ private: Out out_data_size, Out out_sample_count, Out out_time_taken, InBuffer opus_data, bool reset); + std::optional FindRequest(u32 key) override; std::unique_ptr impl; Common::ScratchBuffer output_data; diff --git a/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp b/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp index 9de72e30fe..3000ba8c60 100644 --- a/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp +++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,23 +12,24 @@ namespace Service::Audio { using namespace AudioCore::OpusDecoder; +std::optional IHardwareOpusDecoderManager::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoder>, "OpenHardwareOpusDecoder"}, + FunctionInfo{1, D<&IHardwareOpusDecoderManager::GetWorkBufferSize>, "GetWorkBufferSize"}, + FunctionInfo{2, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream>, "OpenOpusDecoderForMultiStream"}, + FunctionInfo{3, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream>, "GetWorkBufferSizeForMultiStream"}, + FunctionInfo{4, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx>, "OpenHardwareOpusDecoderEx"}, + FunctionInfo{5, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeEx>, "GetWorkBufferSizeEx"}, + FunctionInfo{6, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx>, "OpenHardwareOpusDecoderForMultiStreamEx"}, + FunctionInfo{7, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx>, "GetWorkBufferSizeForMultiStreamEx"}, + FunctionInfo{8, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeExEx>, "GetWorkBufferSizeExEx"}, + FunctionInfo{9, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx>, "GetWorkBufferSizeForMultiStreamExEx"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IHardwareOpusDecoderManager::IHardwareOpusDecoderManager(Core::System& system_) : ServiceFramework{system_, "hwopus"}, system{system_}, impl{system} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoder>, "OpenHardwareOpusDecoder"}, - {1, D<&IHardwareOpusDecoderManager::GetWorkBufferSize>, "GetWorkBufferSize"}, - {2, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream>, "OpenOpusDecoderForMultiStream"}, - {3, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream>, "GetWorkBufferSizeForMultiStream"}, - {4, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx>, "OpenHardwareOpusDecoderEx"}, - {5, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeEx>, "GetWorkBufferSizeEx"}, - {6, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx>, "OpenHardwareOpusDecoderForMultiStreamEx"}, - {7, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx>, "GetWorkBufferSizeForMultiStreamEx"}, - {8, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeExEx>, "GetWorkBufferSizeExEx"}, - {9, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx>, "GetWorkBufferSizeForMultiStreamExEx"}, - }; - // clang-format on - RegisterHandlers(functions); } IHardwareOpusDecoderManager::~IHardwareOpusDecoderManager() = default; diff --git a/src/core/hle/service/audio/hardware_opus_decoder_manager.h b/src/core/hle/service/audio/hardware_opus_decoder_manager.h index 4f869c5174..1dbac9addb 100644 --- a/src/core/hle/service/audio/hardware_opus_decoder_manager.h +++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -46,6 +49,7 @@ private: Result GetWorkBufferSizeForMultiStreamExEx( Out out_size, InLargeData params); + std::optional FindRequest(u32 key) override; Core::System& system; AudioCore::OpusDecoder::OpusDecoderManager impl; }; diff --git a/src/core/hle/service/bcat/bcat_service.cpp b/src/core/hle/service/bcat/bcat_service.cpp index bc2a3e3457..85f262f6eb 100644 --- a/src/core/hle/service/bcat/bcat_service.cpp +++ b/src/core/hle/service/bcat/bcat_service.cpp @@ -24,45 +24,46 @@ static u64 GetCurrentBuildID(const Core::System::CurrentBuildProcessID& id) { return out; } -IBcatService::IBcatService(Core::System& system_, BcatBackend& backend_, u64 program_id_) - : ServiceFramework{system_, "IBcatService"}, backend{backend_}, program_id{program_id_}, - progress{{ - ProgressServiceBackend{system_, "Normal"}, - ProgressServiceBackend{system_, "Directory"}, - }} { - // clang-format off - static const FunctionInfo functions[] = { - {10100, D<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"}, - {10101, D<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"}, - {10200, nullptr, "CancelSyncDeliveryCacheRequest"}, - {20100, nullptr, "RequestSyncDeliveryCacheWithApplicationId"}, - {20101, nullptr, "RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName"}, - {20300, nullptr, "GetDeliveryCacheStorageUpdateNotifier"}, - {20301, nullptr, "RequestSuspendDeliveryTask"}, - {20400, nullptr, "RegisterSystemApplicationDeliveryTask"}, - {20401, nullptr, "UnregisterSystemApplicationDeliveryTask"}, - {20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"}, - {30100, D<&IBcatService::SetPassphrase>, "SetPassphrase"}, - {30101, nullptr, "Unknown30101"}, //2.0.0-2.3.0 - {30102, nullptr, "Unknown30102"}, //2.0.0-2.3.0 - {30200, nullptr, "RegisterBackgroundDeliveryTask"}, - {30201, nullptr, "UnregisterBackgroundDeliveryTask"}, - {30202, nullptr, "BlockDeliveryTask"}, - {30203, nullptr, "UnblockDeliveryTask"}, - {30210, nullptr, "SetDeliveryTaskTimer"}, - {30300, D<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"}, - {90100, nullptr, "GetDeliveryTaskList"}, - {90101, nullptr, "GetDeliveryTaskListForSystem"}, //11.0.0+ - {90200, nullptr, "GetDeliveryList"}, - {90201, D<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"}, - {90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"}, - {90300, nullptr, "GetPushNotificationLog"}, - {90301, nullptr, "GetDeliveryCacheStorageUsage"}, //11.0.0+ - }; - // clang-format on - RegisterHandlers(functions); +std::optional IBcatService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{10100, D<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"}, + FunctionInfo{10101, D<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"}, + FunctionInfo{10200, nullptr, "CancelSyncDeliveryCacheRequest"}, + FunctionInfo{20100, nullptr, "RequestSyncDeliveryCacheWithApplicationId"}, + FunctionInfo{20101, nullptr, "RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName"}, + FunctionInfo{20300, nullptr, "GetDeliveryCacheStorageUpdateNotifier"}, + FunctionInfo{20301, nullptr, "RequestSuspendDeliveryTask"}, + FunctionInfo{20400, nullptr, "RegisterSystemApplicationDeliveryTask"}, + FunctionInfo{20401, nullptr, "UnregisterSystemApplicationDeliveryTask"}, + FunctionInfo{20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"}, + FunctionInfo{30100, D<&IBcatService::SetPassphrase>, "SetPassphrase"}, + FunctionInfo{30101, nullptr, "Unknown30101", MakeVersionGate({2,0,0}, {2,3,0})}, + FunctionInfo{30102, nullptr, "Unknown30102", MakeVersionGate({2,0,0}, {2,3,0})}, + FunctionInfo{30200, nullptr, "RegisterBackgroundDeliveryTask"}, + FunctionInfo{30201, nullptr, "UnregisterBackgroundDeliveryTask"}, + FunctionInfo{30202, nullptr, "BlockDeliveryTask"}, + FunctionInfo{30203, nullptr, "UnblockDeliveryTask"}, + FunctionInfo{30210, nullptr, "SetDeliveryTaskTimer"}, + FunctionInfo{30300, D<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"}, + FunctionInfo{90100, nullptr, "GetDeliveryTaskList"}, + FunctionInfo{90101, nullptr, "GetDeliveryTaskListForSystem", MakeVersionGate({11,0,0})}, + FunctionInfo{90200, nullptr, "GetDeliveryList"}, + FunctionInfo{90201, D<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"}, + FunctionInfo{90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"}, + FunctionInfo{90300, nullptr, "GetPushNotificationLog"}, + FunctionInfo{90301, nullptr, "GetDeliveryCacheStorageUsage", MakeVersionGate({11,0,0})} + ); + return HandlerTableGenerateWithFind(key, functions); } +IBcatService::IBcatService(Core::System& system_, BcatBackend& backend_, u64 program_id_) + : ServiceFramework{system_, "IBcatService"}, backend{backend_}, program_id{program_id_} + , progress{{ + ProgressServiceBackend{system_, "Normal"}, + ProgressServiceBackend{system_, "Directory"}, + }} +{} + IBcatService::~IBcatService() = default; Result IBcatService::RequestSyncDeliveryCache( diff --git a/src/core/hle/service/bcat/bcat_service.h b/src/core/hle/service/bcat/bcat_service.h index 5e11059a78..ed95f021d0 100644 --- a/src/core/hle/service/bcat/bcat_service.h +++ b/src/core/hle/service/bcat/bcat_service.h @@ -41,6 +41,7 @@ private: ProgressServiceBackend& GetProgressBackend(SyncType type); const ProgressServiceBackend& GetProgressBackend(SyncType type) const; + std::optional FindRequest(u32 key) override; BcatBackend& backend; u64 program_id; std::array(SyncType::Count)> progress; diff --git a/src/core/hle/service/bcat/delivery_cache_directory_service.cpp b/src/core/hle/service/bcat/delivery_cache_directory_service.cpp index 8ead0bae99..0d464a2fdc 100644 --- a/src/core/hle/service/bcat/delivery_cache_directory_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_directory_service.cpp @@ -27,18 +27,18 @@ static BcatDigest DigestFile(const FileSys::VirtualFile& file) { return out; } +std::optional IDeliveryCacheDirectoryService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IDeliveryCacheDirectoryService::Open>, "Open"}, + FunctionInfo{1, D<&IDeliveryCacheDirectoryService::Read>, "Read"}, + FunctionInfo{2, D<&IDeliveryCacheDirectoryService::GetCount>, "GetCount"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IDeliveryCacheDirectoryService::IDeliveryCacheDirectoryService(Core::System& system_, FileSys::VirtualDir root_) : ServiceFramework{system_, "IDeliveryCacheDirectoryService"}, root(std::move(root_)) { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IDeliveryCacheDirectoryService::Open>, "Open"}, - {1, D<&IDeliveryCacheDirectoryService::Read>, "Read"}, - {2, D<&IDeliveryCacheDirectoryService::GetCount>, "GetCount"}, - }; - // clang-format on - - RegisterHandlers(functions); } IDeliveryCacheDirectoryService::~IDeliveryCacheDirectoryService() = default; diff --git a/src/core/hle/service/bcat/delivery_cache_directory_service.h b/src/core/hle/service/bcat/delivery_cache_directory_service.h index b902c64959..af90680390 100644 --- a/src/core/hle/service/bcat/delivery_cache_directory_service.h +++ b/src/core/hle/service/bcat/delivery_cache_directory_service.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -26,6 +29,7 @@ private: OutArray out_buffer); Result GetCount(Out out_count); + std::optional FindRequest(u32 key) override; FileSys::VirtualDir root; FileSys::VirtualDir current_dir; }; diff --git a/src/core/hle/service/bcat/delivery_cache_file_service.cpp b/src/core/hle/service/bcat/delivery_cache_file_service.cpp index b75fac4bfe..d9b6ff77ee 100644 --- a/src/core/hle/service/bcat/delivery_cache_file_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_file_service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -9,19 +12,19 @@ namespace Service::BCAT { +std::optional IDeliveryCacheFileService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IDeliveryCacheFileService::Open>, "Open"}, + FunctionInfo{1, D<&IDeliveryCacheFileService::Read>, "Read"}, + FunctionInfo{2, D<&IDeliveryCacheFileService::GetSize>, "GetSize"}, + FunctionInfo{3, D<&IDeliveryCacheFileService::GetDigest>, "GetDigest"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IDeliveryCacheFileService::IDeliveryCacheFileService(Core::System& system_, FileSys::VirtualDir root_) : ServiceFramework{system_, "IDeliveryCacheFileService"}, root(std::move(root_)) { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IDeliveryCacheFileService::Open>, "Open"}, - {1, D<&IDeliveryCacheFileService::Read>, "Read"}, - {2, D<&IDeliveryCacheFileService::GetSize>, "GetSize"}, - {3, D<&IDeliveryCacheFileService::GetDigest>, "GetDigest"}, - }; - // clang-format on - - RegisterHandlers(functions); } IDeliveryCacheFileService::~IDeliveryCacheFileService() = default; diff --git a/src/core/hle/service/bcat/delivery_cache_file_service.h b/src/core/hle/service/bcat/delivery_cache_file_service.h index e1012e6873..176c8eb3e5 100644 --- a/src/core/hle/service/bcat/delivery_cache_file_service.h +++ b/src/core/hle/service/bcat/delivery_cache_file_service.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -26,6 +29,7 @@ private: Result GetSize(Out out_size); Result GetDigest(Out out_digest); + std::optional FindRequest(u32 key) override; FileSys::VirtualDir root; FileSys::VirtualFile current_file; }; diff --git a/src/core/hle/service/bcat/delivery_cache_progress_service.cpp b/src/core/hle/service/bcat/delivery_cache_progress_service.cpp index 79e7e0d957..4de42dd580 100644 --- a/src/core/hle/service/bcat/delivery_cache_progress_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_progress_service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -7,18 +10,18 @@ namespace Service::BCAT { +std::optional IDeliveryCacheProgressService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IDeliveryCacheProgressService::GetEvent>, "GetEvent"}, + FunctionInfo{1, D<&IDeliveryCacheProgressService::GetImpl>, "GetImpl"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IDeliveryCacheProgressService::IDeliveryCacheProgressService(Core::System& system_, Kernel::KReadableEvent& event_, const DeliveryCacheProgressImpl& impl_) : ServiceFramework{system_, "IDeliveryCacheProgressService"}, event{event_}, impl{impl_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IDeliveryCacheProgressService::GetEvent>, "Get"}, - {1, D<&IDeliveryCacheProgressService::GetImpl>, "Get"}, - }; - // clang-format on - - RegisterHandlers(functions); } IDeliveryCacheProgressService::~IDeliveryCacheProgressService() = default; diff --git a/src/core/hle/service/bcat/delivery_cache_progress_service.h b/src/core/hle/service/bcat/delivery_cache_progress_service.h index f81a139806..88f49cea85 100644 --- a/src/core/hle/service/bcat/delivery_cache_progress_service.h +++ b/src/core/hle/service/bcat/delivery_cache_progress_service.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -28,6 +31,7 @@ private: Result GetEvent(OutCopyHandle out_event); Result GetImpl(OutLargeData out_impl); + std::optional FindRequest(u32 key) override; Kernel::KReadableEvent& event; const DeliveryCacheProgressImpl& impl; }; diff --git a/src/core/hle/service/bcat/delivery_cache_storage_service.cpp b/src/core/hle/service/bcat/delivery_cache_storage_service.cpp index 46ed4dae67..67dc857642 100644 --- a/src/core/hle/service/bcat/delivery_cache_storage_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_storage_service.cpp @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -12,18 +12,18 @@ namespace Service::BCAT { +std::optional IDeliveryCacheStorageService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IDeliveryCacheStorageService::CreateFileService>, "CreateFileService"}, + FunctionInfo{1, D<&IDeliveryCacheStorageService::CreateDirectoryService>, "CreateDirectoryService"}, + FunctionInfo{10, D<&IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory>, "EnumerateDeliveryCacheDirectory"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IDeliveryCacheStorageService::IDeliveryCacheStorageService(Core::System& system_, FileSys::VirtualDir root_) : ServiceFramework{system_, "IDeliveryCacheStorageService"}, root(std::move(root_)) { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IDeliveryCacheStorageService::CreateFileService>, "CreateFileService"}, - {1, D<&IDeliveryCacheStorageService::CreateDirectoryService>, "CreateDirectoryService"}, - {10, D<&IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory>, "EnumerateDeliveryCacheDirectory"}, - }; - // clang-format on - - RegisterHandlers(functions); } IDeliveryCacheStorageService::~IDeliveryCacheStorageService() = default; diff --git a/src/core/hle/service/bcat/delivery_cache_storage_service.h b/src/core/hle/service/bcat/delivery_cache_storage_service.h index 3b8dfb1a39..b30f24fb47 100644 --- a/src/core/hle/service/bcat/delivery_cache_storage_service.h +++ b/src/core/hle/service/bcat/delivery_cache_storage_service.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -28,6 +31,7 @@ private: Out out_directory_count, OutArray out_directories); + std::optional FindRequest(u32 key) override; FileSys::VirtualDir root; std::vector entries; std::size_t next_read_index = 0; diff --git a/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp b/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp index ed393f7a26..57d71c49d8 100644 --- a/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp +++ b/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -6,17 +9,16 @@ namespace Service::News { -INewlyArrivedEventHolder::INewlyArrivedEventHolder(Core::System& system_) - : ServiceFramework{system_, "INewlyArrivedEventHolder"}, service_context{ - system_, - "INewlyArrivedEventHolder"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&INewlyArrivedEventHolder::Get>, "Get"}, - }; - // clang-format on +std::optional INewlyArrivedEventHolder::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&INewlyArrivedEventHolder::Get>, "Get"} + ); + return HandlerTableGenerateWithFind(key, functions); +} - RegisterHandlers(functions); +INewlyArrivedEventHolder::INewlyArrivedEventHolder(Core::System& system_) + : ServiceFramework{system_, "INewlyArrivedEventHolder"} + , service_context{system_, "INewlyArrivedEventHolder"} { arrived_event = service_context.CreateEvent("INewlyArrivedEventHolder::ArrivedEvent"); } diff --git a/src/core/hle/service/bcat/news/newly_arrived_event_holder.h b/src/core/hle/service/bcat/news/newly_arrived_event_holder.h index 6cc9ae0997..fccc8d6e55 100644 --- a/src/core/hle/service/bcat/news/newly_arrived_event_holder.h +++ b/src/core/hle/service/bcat/news/newly_arrived_event_holder.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -26,6 +29,7 @@ public: private: Result Get(OutCopyHandle out_event); + std::optional FindRequest(u32 key) override; Kernel::KEvent* arrived_event; KernelHelpers::ServiceContext service_context; }; diff --git a/src/core/hle/service/bcat/news/news_data_service.cpp b/src/core/hle/service/bcat/news/news_data_service.cpp index 200d00e785..f5de93db49 100644 --- a/src/core/hle/service/bcat/news/news_data_service.cpp +++ b/src/core/hle/service/bcat/news/news_data_service.cpp @@ -24,16 +24,19 @@ std::string_view ToStringView(std::span buf) { } // namespace +std::optional INewsDataService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&INewsDataService::Open>, "Open"}, + FunctionInfo{1, D<&INewsDataService::OpenWithNewsRecordV1>, "OpenWithNewsRecordV1"}, + FunctionInfo{2, D<&INewsDataService::Read>, "Read"}, + FunctionInfo{3, D<&INewsDataService::GetSize>, "GetSize"}, + FunctionInfo{1001, D<&INewsDataService::OpenWithNewsRecord>, "OpenWithNewsRecord"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + INewsDataService::INewsDataService(Core::System& system_) : ServiceFramework{system_, "INewsDataService"} { - static const FunctionInfo functions[] = { - {0, D<&INewsDataService::Open>, "Open"}, - {1, D<&INewsDataService::OpenWithNewsRecordV1>, "OpenWithNewsRecordV1"}, - {2, D<&INewsDataService::Read>, "Read"}, - {3, D<&INewsDataService::GetSize>, "GetSize"}, - {1001, D<&INewsDataService::OpenWithNewsRecord>, "OpenWithNewsRecord"}, - }; - RegisterHandlers(functions); } INewsDataService::~INewsDataService() = default; diff --git a/src/core/hle/service/bcat/news/news_data_service.h b/src/core/hle/service/bcat/news/news_data_service.h index 8f5e031701..8ce10c045d 100644 --- a/src/core/hle/service/bcat/news/news_data_service.h +++ b/src/core/hle/service/bcat/news/news_data_service.h @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -31,6 +31,7 @@ private: Result Read(Out out_size, s64 offset, OutBuffer out_buffer); Result GetSize(Out out_size); + std::optional FindRequest(u32 key) override; std::vector opened_payload; }; diff --git a/src/core/hle/service/bcat/news/news_database_service.cpp b/src/core/hle/service/bcat/news/news_database_service.cpp index 3580ceb0f7..08fdfcb58b 100644 --- a/src/core/hle/service/bcat/news/news_database_service.cpp +++ b/src/core/hle/service/bcat/news/news_database_service.cpp @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -45,18 +45,21 @@ bool UpdateField(NewsRecord& rec, std::string_view column, s32 value, bool addit } // namespace +std::optional INewsDatabaseService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&INewsDatabaseService::GetListV1>, "GetListV1"}, + FunctionInfo{1, D<&INewsDatabaseService::Count>, "Count"}, + FunctionInfo{2, D<&INewsDatabaseService::CountWithKey>, "CountWithKey"}, + FunctionInfo{3, D<&INewsDatabaseService::UpdateIntegerValue>, "UpdateIntegerValue"}, + FunctionInfo{4, D<&INewsDatabaseService::UpdateIntegerValueWithAddition>, "UpdateIntegerValueWithAddition"}, + FunctionInfo{5, D<&INewsDatabaseService::UpdateStringValue>, "UpdateStringValue"}, + FunctionInfo{1000, D<&INewsDatabaseService::GetList>, "GetList"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + INewsDatabaseService::INewsDatabaseService(Core::System& system_) : ServiceFramework{system_, "INewsDatabaseService"} { - static const FunctionInfo functions[] = { - {0, D<&INewsDatabaseService::GetListV1>, "GetListV1"}, - {1, D<&INewsDatabaseService::Count>, "Count"}, - {2, D<&INewsDatabaseService::CountWithKey>, "CountWithKey"}, - {3, D<&INewsDatabaseService::UpdateIntegerValue>, "UpdateIntegerValue"}, - {4, D<&INewsDatabaseService::UpdateIntegerValueWithAddition>, "UpdateIntegerValueWithAddition"}, - {5, D<&INewsDatabaseService::UpdateStringValue>, "UpdateStringValue"}, - {1000, D<&INewsDatabaseService::GetList>, "GetList"}, - }; - RegisterHandlers(functions); } INewsDatabaseService::~INewsDatabaseService() = default; diff --git a/src/core/hle/service/bcat/news/news_database_service.h b/src/core/hle/service/bcat/news/news_database_service.h index 143864e80e..0a097b97bc 100644 --- a/src/core/hle/service/bcat/news/news_database_service.h +++ b/src/core/hle/service/bcat/news/news_database_service.h @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -49,6 +49,8 @@ private: InBuffer where_phrase, InBuffer order_by_phrase, s32 offset); + + std::optional FindRequest(u32 key) override; }; } // namespace Service::News diff --git a/src/core/hle/service/bcat/news/news_service.cpp b/src/core/hle/service/bcat/news/news_service.cpp index aed1536bfe..7cb931896c 100644 --- a/src/core/hle/service/bcat/news/news_service.cpp +++ b/src/core/hle/service/bcat/news/news_service.cpp @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -12,32 +12,32 @@ namespace Service::News { -INewsService::INewsService(Core::System& system_) : ServiceFramework{system_, "INewsService"} { - // clang-format off - static const FunctionInfo functions[] = { - {10100, D<&INewsService::PostLocalNews>, "PostLocalNews"}, - {20100, D<&INewsService::SetPassphrase>, "SetPassphrase"}, - {30100, D<&INewsService::GetSubscriptionStatus>, "GetSubscriptionStatus"}, - {30101, D<&INewsService::GetTopicList>, "GetTopicList"}, //3.0.0+ - {30110, D<&INewsService::GetTopicList>, "Unknown30110"}, //6.0.0+ (stub) - {30200, D<&INewsService::IsSystemUpdateRequired>, "IsSystemUpdateRequired"}, - {30201, D<&INewsService::IsSystemUpdateRequired>, "Unknown30201"}, //8.0.0+ (stub) - {30210, D<&INewsService::IsSystemUpdateRequired>, "Unknown30210"}, //10.0.0+ (stub) - {30300, nullptr, "RequestImmediateReception"}, - {30400, nullptr, "DecodeArchiveFile"}, //3.0.0-18.1.0 (stub) - {30500, nullptr, "Unknown30500"}, //8.0.0+ (stub) - {30900, nullptr, "Unknown30900"}, //1.0.0 (stub) - {30901, nullptr, "Unknown30901"}, //1.0.0 (stub) - {30902, nullptr, "Unknown30902"}, //1.0.0 (stub) - {40100, nullptr, "SetSubscriptionStatus"}, - {40101, D<&INewsService::RequestAutoSubscription>, "RequestAutoSubscription"}, //3.0.0+ - {40200, D<&INewsService::ClearStorage>, "ClearStorage"}, - {40201, D<&INewsService::ClearSubscriptionStatusAll>, "ClearSubscriptionStatusAll"}, - {90100, D<&INewsService::GetNewsDatabaseDump>, "GetNewsDatabaseDump"}, - }; - // clang-format on +std::optional INewsService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{10100, D<&INewsService::PostLocalNews>, "PostLocalNews"}, + FunctionInfo{20100, D<&INewsService::SetPassphrase>, "SetPassphrase"}, + FunctionInfo{30100, D<&INewsService::GetSubscriptionStatus>, "GetSubscriptionStatus"}, + FunctionInfo{30101, D<&INewsService::GetTopicList>, "GetTopicList", MakeVersionGate({3,0,0})}, + FunctionInfo{30110, D<&INewsService::GetTopicList>, "Unknown30110", MakeVersionGate({6,0,0})}, // stub + FunctionInfo{30200, D<&INewsService::IsSystemUpdateRequired>, "IsSystemUpdateRequired"}, + FunctionInfo{30201, D<&INewsService::IsSystemUpdateRequired>, "Unknown30201", MakeVersionGate({8,0,0})}, // stub + FunctionInfo{30210, D<&INewsService::IsSystemUpdateRequired>, "Unknown30210", MakeVersionGate({10,0,0})}, // stub + FunctionInfo{30300, nullptr, "RequestImmediateReception"}, + FunctionInfo{30400, nullptr, "DecodeArchiveFile", MakeVersionGate({3,0,0}, {18,1,0})}, // stub + FunctionInfo{30500, nullptr, "Unknown30500", MakeVersionGate({8,0,0})}, // stub + FunctionInfo{30900, nullptr, "Unknown30900", MakeVersionGate({1,0,0})}, // stub + FunctionInfo{30901, nullptr, "Unknown30901", MakeVersionGate({1,0,0})}, // stub + FunctionInfo{30902, nullptr, "Unknown30902", MakeVersionGate({1,0,0})}, // stub + FunctionInfo{40100, nullptr, "SetSubscriptionStatus"}, + FunctionInfo{40101, D<&INewsService::RequestAutoSubscription>, "RequestAutoSubscription", MakeVersionGate({3,0,0})}, + FunctionInfo{40200, D<&INewsService::ClearStorage>, "ClearStorage"}, + FunctionInfo{40201, D<&INewsService::ClearSubscriptionStatusAll>, "ClearSubscriptionStatusAll"}, + FunctionInfo{90100, D<&INewsService::GetNewsDatabaseDump>, "GetNewsDatabaseDump"} + ); + return HandlerTableGenerateWithFind(key, functions); +} - RegisterHandlers(functions); +INewsService::INewsService(Core::System& system_) : ServiceFramework{system_, "INewsService"} { } INewsService::~INewsService() = default; diff --git a/src/core/hle/service/bcat/news/news_service.h b/src/core/hle/service/bcat/news/news_service.h index 1a320df02f..577147e604 100644 --- a/src/core/hle/service/bcat/news/news_service.h +++ b/src/core/hle/service/bcat/news/news_service.h @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -22,22 +22,15 @@ public: private: Result PostLocalNews(InBuffer buffer_data); - Result SetPassphrase(InBuffer buffer_data); - Result GetSubscriptionStatus(Out out_status, InBuffer buffer_data); - Result GetTopicList(Out out_count, OutBuffer out_topics, s32 filter); - Result IsSystemUpdateRequired(Out out_is_system_update_required); - Result RequestAutoSubscription(u64 value); - Result ClearStorage(); - Result ClearSubscriptionStatusAll(); - Result GetNewsDatabaseDump(); + std::optional FindRequest(u32 key) override; }; } // namespace Service::News diff --git a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp index 1712971e4d..a6b3029e83 100644 --- a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp +++ b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -6,16 +9,16 @@ namespace Service::News { -IOverwriteEventHolder::IOverwriteEventHolder(Core::System& system_) - : ServiceFramework{system_, "IOverwriteEventHolder"}, service_context{system_, - "IOverwriteEventHolder"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IOverwriteEventHolder::Get>, "Get"}, - }; - // clang-format on +std::optional IOverwriteEventHolder::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IOverwriteEventHolder::Get>, "Get"} + ); + return HandlerTableGenerateWithFind(key, functions); +} - RegisterHandlers(functions); +IOverwriteEventHolder::IOverwriteEventHolder(Core::System& system_) + : ServiceFramework{system_, "IOverwriteEventHolder"} + , service_context{system_, "IOverwriteEventHolder"} { overwrite_event = service_context.CreateEvent("IOverwriteEventHolder::OverwriteEvent"); } diff --git a/src/core/hle/service/bcat/news/overwrite_event_holder.h b/src/core/hle/service/bcat/news/overwrite_event_holder.h index cdc87d782c..ba52a36527 100644 --- a/src/core/hle/service/bcat/news/overwrite_event_holder.h +++ b/src/core/hle/service/bcat/news/overwrite_event_holder.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -26,6 +29,7 @@ public: private: Result Get(OutCopyHandle out_event); + std::optional FindRequest(u32 key) override; Kernel::KEvent* overwrite_event; KernelHelpers::ServiceContext service_context; }; diff --git a/src/core/hle/service/bcat/news/service_creator.cpp b/src/core/hle/service/bcat/news/service_creator.cpp index a1b22c0044..66e3b1277e 100644 --- a/src/core/hle/service/bcat/news/service_creator.cpp +++ b/src/core/hle/service/bcat/news/service_creator.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -11,19 +14,19 @@ namespace Service::News { +std::optional IServiceCreator::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IServiceCreator::CreateNewsService>, "CreateNewsService"}, + FunctionInfo{1, D<&IServiceCreator::CreateNewlyArrivedEventHolder>, "CreateNewlyArrivedEventHolder"}, + FunctionInfo{2, D<&IServiceCreator::CreateNewsDataService>, "CreateNewsDataService"}, + FunctionInfo{3, D<&IServiceCreator::CreateNewsDatabaseService>, "CreateNewsDatabaseService"}, + FunctionInfo{4, D<&IServiceCreator::CreateOverwriteEventHolder>, "CreateOverwriteEventHolder"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IServiceCreator::IServiceCreator(Core::System& system_, u32 permissions_, const char* name_) : ServiceFramework{system_, name_}, permissions{permissions_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IServiceCreator::CreateNewsService>, "CreateNewsService"}, - {1, D<&IServiceCreator::CreateNewlyArrivedEventHolder>, "CreateNewlyArrivedEventHolder"}, - {2, D<&IServiceCreator::CreateNewsDataService>, "CreateNewsDataService"}, - {3, D<&IServiceCreator::CreateNewsDatabaseService>, "CreateNewsDatabaseService"}, - {4, D<&IServiceCreator::CreateOverwriteEventHolder>, "CreateOverwriteEventHolder"}, - }; - // clang-format on - - RegisterHandlers(functions); } IServiceCreator::~IServiceCreator() = default; diff --git a/src/core/hle/service/bcat/news/service_creator.h b/src/core/hle/service/bcat/news/service_creator.h index 5a62e7c1a9..a87f30b67e 100644 --- a/src/core/hle/service/bcat/news/service_creator.h +++ b/src/core/hle/service/bcat/news/service_creator.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -29,6 +32,7 @@ private: Result CreateNewsDatabaseService(OutInterface out_interface); Result CreateOverwriteEventHolder(OutInterface out_interface); + std::optional FindRequest(u32 key) override; u32 permissions; }; diff --git a/src/core/hle/service/bcat/service_creator.cpp b/src/core/hle/service/bcat/service_creator.cpp index 15f59d3056..83f97bb17a 100644 --- a/src/core/hle/service/bcat/service_creator.cpp +++ b/src/core/hle/service/bcat/service_creator.cpp @@ -13,6 +13,17 @@ namespace Service::BCAT { +std::optional IServiceCreator::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IServiceCreator::CreateBcatService>, "CreateBcatService"}, + FunctionInfo{1, D<&IServiceCreator::CreateDeliveryCacheStorageService>, "CreateDeliveryCacheStorageService"}, + FunctionInfo{2, D<&IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId>, "CreateDeliveryCacheStorageServiceWithApplicationId"}, + FunctionInfo{3, nullptr, "CreateDeliveryCacheProgressService"}, + FunctionInfo{4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + std::unique_ptr CreateBackendFromSettings([[maybe_unused]] Core::System& system, DirectoryGetter getter) { return std::make_unique(std::move(getter)); @@ -20,20 +31,7 @@ std::unique_ptr CreateBackendFromSettings([[maybe_unused]] Core::Sy IServiceCreator::IServiceCreator(Core::System& system_, const char* name_) : ServiceFramework{system_, name_}, fsc{system.GetFileSystemController()} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IServiceCreator::CreateBcatService>, "CreateBcatService"}, - {1, D<&IServiceCreator::CreateDeliveryCacheStorageService>, "CreateDeliveryCacheStorageService"}, - {2, D<&IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId>, "CreateDeliveryCacheStorageServiceWithApplicationId"}, - {3, nullptr, "CreateDeliveryCacheProgressService"}, - {4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"}, - }; - // clang-format on - - RegisterHandlers(functions); - - backend = - CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); }); + backend = CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); }); } IServiceCreator::~IServiceCreator() = default; diff --git a/src/core/hle/service/bcat/service_creator.h b/src/core/hle/service/bcat/service_creator.h index 50e6633248..02527574dc 100644 --- a/src/core/hle/service/bcat/service_creator.h +++ b/src/core/hle/service/bcat/service_creator.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -33,6 +36,7 @@ private: Result CreateDeliveryCacheStorageServiceWithApplicationId( u64 application_id, OutInterface out_interface); + std::optional FindRequest(u32 key) override; std::unique_ptr backend; Service::FileSystem::FileSystemController& fsc; }; diff --git a/src/core/hle/service/bpc/bpc.cpp b/src/core/hle/service/bpc/bpc.cpp index 6f2e00b22b..7c31cd190d 100644 --- a/src/core/hle/service/bpc/bpc.cpp +++ b/src/core/hle/service/bpc/bpc.cpp @@ -14,103 +14,101 @@ namespace Service::BPC { class BPC final : public ServiceFramework { public: - explicit BPC(Core::System& system_) : ServiceFramework{system_, "bpc"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "ShutdownSystem"}, - {1, nullptr, "RebootSystem"}, - {2, nullptr, "GetWakeupReason"}, - {3, nullptr, "GetShutdownReason"}, - {4, nullptr, "GetAcOk"}, - {5, nullptr, "GetBoardPowerControlEvent"}, - {6, nullptr, "GetSleepButtonState"}, - {7, nullptr, "GetPowerEvent"}, - {8, nullptr, "CreateWakeupTimer"}, - {9, nullptr, "CancelWakeupTimer"}, - {10, nullptr, "EnableWakeupTimerOnDevice"}, - {11, nullptr, "CreateWakeupTimerEx"}, - {12, nullptr, "GetLastEnabledWakeupTimerType"}, - {13, nullptr, "CleanAllWakeupTimers"}, - {14, nullptr, "GetPowerButton"}, - {15, nullptr, "SetEnableWakeupTimer"}, - }; - // clang-format on + explicit BPC(Core::System& system_) : ServiceFramework{system_, "bpc"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "ShutdownSystem"}, + FunctionInfo{1, nullptr, "RebootSystem"}, + FunctionInfo{2, nullptr, "GetWakeupReason"}, + FunctionInfo{3, nullptr, "GetShutdownReason"}, + FunctionInfo{4, nullptr, "GetAcOk"}, + FunctionInfo{5, nullptr, "GetBoardPowerControlEvent"}, + FunctionInfo{6, nullptr, "GetSleepButtonState"}, + FunctionInfo{7, nullptr, "GetPowerEvent"}, + FunctionInfo{8, nullptr, "CreateWakeupTimer"}, + FunctionInfo{9, nullptr, "CancelWakeupTimer"}, + FunctionInfo{10, nullptr, "EnableWakeupTimerOnDevice"}, + FunctionInfo{11, nullptr, "CreateWakeupTimerEx"}, + FunctionInfo{12, nullptr, "GetLastEnabledWakeupTimerType"}, + FunctionInfo{13, nullptr, "CleanAllWakeupTimers"}, + FunctionInfo{14, nullptr, "GetPowerButton"}, + FunctionInfo{15, nullptr, "SetEnableWakeupTimer"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class BPC_R final : public ServiceFramework { public: - explicit BPC_R(Core::System& system_) : ServiceFramework{system_, "bpc:r"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetRtcTime"}, - {1, nullptr, "SetRtcTime"}, - {2, nullptr, "GetRtcResetDetected"}, - {3, nullptr, "ClearRtcResetDetected"}, - {4, nullptr, "SetUpRtcResetOnShutdown"}, - }; - // clang-format on + explicit BPC_R(Core::System& system_) : ServiceFramework{system_, "bpc:r"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetRtcTime"}, + FunctionInfo{1, nullptr, "SetRtcTime"}, + FunctionInfo{2, nullptr, "GetRtcResetDetected"}, + FunctionInfo{3, nullptr, "ClearRtcResetDetected"}, + FunctionInfo{4, nullptr, "SetUpRtcResetOnShutdown"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class BPC_C final : public ServiceFramework { public: - explicit BPC_C(Core::System& system_) : ServiceFramework{system_, "bpc:c"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "ShutdownSystem"}, - {1, nullptr, "RebootSystem"}, - {2, nullptr, "GetWakeupReason"}, - {3, nullptr, "GetShutdownReason"}, - {4, nullptr, "GetAcOk"}, - {5, nullptr, "GetPowerEvent"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit BPC_C(Core::System& system_) : ServiceFramework{system_, "bpc:c"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "ShutdownSystem"}, + FunctionInfo{1, nullptr, "RebootSystem"}, + FunctionInfo{2, nullptr, "GetWakeupReason"}, + FunctionInfo{3, nullptr, "GetShutdownReason"}, + FunctionInfo{4, nullptr, "GetAcOk"}, + FunctionInfo{5, nullptr, "GetPowerEvent"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class BPC_B final : public ServiceFramework { public: - explicit BPC_B(Core::System& system_) : ServiceFramework{system_, "bpc:b"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetSleepButtonState"}, - {1, nullptr, "GetPowerButtonEvent"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit BPC_B(Core::System& system_) : ServiceFramework{system_, "bpc:b"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetSleepButtonState"}, + FunctionInfo{1, nullptr, "GetPowerButtonEvent"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class BPC_W final : public ServiceFramework { public: - explicit BPC_W(Core::System& system_) : ServiceFramework{system_, "bpc:w"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "CreateWakeupTimer"}, - {1, nullptr, "CancelWakeupTimer"}, - {2, nullptr, "EnableWakeupTimerOnDevice"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit BPC_W(Core::System& system_) : ServiceFramework{system_, "bpc:w"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "CreateWakeupTimer"}, + FunctionInfo{1, nullptr, "CancelWakeupTimer"}, + FunctionInfo{2, nullptr, "EnableWakeupTimerOnDevice"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class BPC_AMS final : public ServiceFramework { public: - explicit BPC_AMS(Core::System& system_) : ServiceFramework{system_, "bpc:ams"} { - // clang-format off - static const FunctionInfo functions[] = { - {65000, nullptr, "RebootToFatalError"}, - {65001, nullptr, "SetRebootPayload"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit BPC_AMS(Core::System& system_) : ServiceFramework{system_, "bpc:ams"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{65000, nullptr, "RebootToFatalError"}, + FunctionInfo{65001, nullptr, "SetRebootPayload"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/btdrv/btdrv.cpp b/src/core/hle/service/btdrv/btdrv.cpp index 256a722a84..913c9475e9 100644 --- a/src/core/hle/service/btdrv/btdrv.cpp +++ b/src/core/hle/service/btdrv/btdrv.cpp @@ -20,26 +20,15 @@ namespace Service::BtDrv { class IBluetoothUser final : public ServiceFramework { public: explicit IBluetoothUser(Core::System& system_) - : ServiceFramework{system_, "bt"}, service_context{system_, "bt"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "LeClientReadCharacteristic"}, - {1, nullptr, "LeClientReadDescriptor"}, - {2, nullptr, "LeClientWriteCharacteristic"}, - {3, nullptr, "LeClientWriteDescriptor"}, - {4, nullptr, "LeClientRegisterNotification"}, - {5, nullptr, "LeClientDeregisterNotification"}, - {6, nullptr, "SetLeResponse"}, - {7, nullptr, "LeSendIndication"}, - {8, nullptr, "GetLeEventInfo"}, - {9, C<&IBluetoothUser::RegisterBleEvent>, "RegisterBleEvent"}, - }; - // clang-format on - RegisterHandlers(functions); - + : ServiceFramework{system_, "bt"} + , service_context{system_, "bt"} { register_event = service_context.CreateEvent("BT:RegisterEvent"); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + ~IBluetoothUser() override { service_context.CloseEvent(register_event); } @@ -52,151 +41,28 @@ private: R_SUCCEED(); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "LeClientReadCharacteristic"}, + FunctionInfo{1, nullptr, "LeClientReadDescriptor"}, + FunctionInfo{2, nullptr, "LeClientWriteCharacteristic"}, + FunctionInfo{3, nullptr, "LeClientWriteDescriptor"}, + FunctionInfo{4, nullptr, "LeClientRegisterNotification"}, + FunctionInfo{5, nullptr, "LeClientDeregisterNotification"}, + FunctionInfo{6, nullptr, "SetLeResponse"}, + FunctionInfo{7, nullptr, "LeSendIndication"}, + FunctionInfo{8, nullptr, "GetLeEventInfo"}, + FunctionInfo{9, C<&IBluetoothUser::RegisterBleEvent>, "RegisterBleEvent"} + ); KernelHelpers::ServiceContext service_context; - Kernel::KEvent* register_event; }; class IBluetoothDriver final : public ServiceFramework { public: - explicit IBluetoothDriver(Core::System& system_) : ServiceFramework{system_, "btdrv"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "InitializeBluetoothDriver"}, - {1, nullptr, "InitializeBluetooth"}, - {2, nullptr, "EnableBluetooth"}, - {3, nullptr, "DisableBluetooth"}, - {4, nullptr, "FinalizeBluetooth"}, - {5, nullptr, "GetAdapterProperties"}, - {6, nullptr, "GetAdapterProperty"}, - {7, nullptr, "SetAdapterProperty"}, - {8, nullptr, "StartInquiry"}, - {9, nullptr, "StopInquiry"}, - {10, nullptr, "CreateBond"}, - {11, nullptr, "RemoveBond"}, - {12, nullptr, "CancelBond"}, - {13, nullptr, "RespondToPinRequest"}, - {14, nullptr, "RespondToSspRequest"}, - {15, nullptr, "GetEventInfo"}, - {16, nullptr, "InitializeHid"}, - {17, nullptr, "OpenHidConnection"}, - {18, nullptr, "CloseHidConnection"}, - {19, nullptr, "WriteHidData"}, - {20, nullptr, "WriteHidData2"}, - {21, nullptr, "SetHidReport"}, - {22, nullptr, "GetHidReport"}, - {23, nullptr, "TriggerConnection"}, - {24, nullptr, "AddPairedDeviceInfo"}, - {25, nullptr, "GetPairedDeviceInfo"}, - {26, nullptr, "FinalizeHid"}, - {27, nullptr, "GetHidEventInfo"}, - {28, nullptr, "SetTsi"}, - {29, nullptr, "EnableBurstMode"}, - {30, nullptr, "SetZeroRetransmission"}, - {31, nullptr, "EnableMcMode"}, - {32, nullptr, "EnableLlrScan"}, - {33, nullptr, "DisableLlrScan"}, - {34, C<&IBluetoothDriver::EnableRadio>, "EnableRadio"}, - {35, nullptr, "SetVisibility"}, - {36, nullptr, "EnableTbfcScan"}, - {37, nullptr, "RegisterHidReportEvent"}, - {38, nullptr, "GetHidReportEventInfo"}, - {39, nullptr, "GetLatestPlr"}, - {40, nullptr, "GetPendingConnections"}, - {41, nullptr, "GetChannelMap"}, - {42, nullptr, "EnableTxPowerBoostSetting"}, - {43, nullptr, "IsTxPowerBoostSettingEnabled"}, - {44, nullptr, "EnableAfhSetting"}, - {45, nullptr, "IsAfhSettingEnabled"}, - {46, nullptr, "InitializeBle"}, - {47, nullptr, "EnableBle"}, - {48, nullptr, "DisableBle"}, - {49, nullptr, "FinalizeBle"}, - {50, nullptr, "SetBleVisibility"}, - {51, nullptr, "SetBleConnectionParameter"}, - {52, nullptr, "SetBleDefaultConnectionParameter"}, - {53, nullptr, "SetBleAdvertiseData"}, - {54, nullptr, "SetBleAdvertiseParameter"}, - {55, nullptr, "StartBleScan"}, - {56, nullptr, "StopBleScan"}, - {57, nullptr, "AddBleScanFilterCondition"}, - {58, nullptr, "DeleteBleScanFilterCondition"}, - {59, nullptr, "DeleteBleScanFilter"}, - {60, nullptr, "ClearBleScanFilters"}, - {61, nullptr, "EnableBleScanFilter"}, - {62, nullptr, "RegisterGattClient"}, - {63, nullptr, "UnregisterGattClient"}, - {64, nullptr, "UnregisterAllGattClients"}, - {65, nullptr, "ConnectGattServer"}, - {66, nullptr, "CancelConnectGattServer"}, - {67, nullptr, "DisconnectGattServer"}, - {68, nullptr, "GetGattAttribute"}, - {69, nullptr, "GetGattService"}, - {70, nullptr, "ConfigureAttMtu"}, - {71, nullptr, "RegisterGattServer"}, - {72, nullptr, "UnregisterGattServer"}, - {73, nullptr, "ConnectGattClient"}, - {74, nullptr, "DisconnectGattClient"}, - {75, nullptr, "AddGattService"}, - {76, nullptr, "EnableGattService"}, - {77, nullptr, "AddGattCharacteristic"}, - {78, nullptr, "AddGattDescriptor"}, - {79, nullptr, "GetBleManagedEventInfo"}, - {80, nullptr, "GetGattFirstCharacteristic"}, - {81, nullptr, "GetGattNextCharacteristic"}, - {82, nullptr, "GetGattFirstDescriptor"}, - {83, nullptr, "GetGattNextDescriptor"}, - {84, nullptr, "RegisterGattManagedDataPath"}, - {85, nullptr, "UnregisterGattManagedDataPath"}, - {86, nullptr, "RegisterGattHidDataPath"}, - {87, nullptr, "UnregisterGattHidDataPath"}, - {88, nullptr, "RegisterGattDataPath"}, - {89, nullptr, "UnregisterGattDataPath"}, - {90, nullptr, "ReadGattCharacteristic"}, - {91, nullptr, "ReadGattDescriptor"}, - {92, nullptr, "WriteGattCharacteristic"}, - {93, nullptr, "WriteGattDescriptor"}, - {94, nullptr, "RegisterGattNotification"}, - {95, nullptr, "UnregisterGattNotification"}, - {96, nullptr, "GetLeHidEventInfo"}, - {97, nullptr, "RegisterBleHidEvent"}, - {98, nullptr, "SetBleScanParameter"}, - {99, nullptr, "MoveToSecondaryPiconet"}, - {100, nullptr, "IsBluetoothEnabled"}, - {128, nullptr, "AcquireAudioEvent"}, - {129, nullptr, "GetAudioEventInfo"}, - {130, nullptr, "OpenAudioConnection"}, - {131, nullptr, "CloseAudioConnection"}, - {132, nullptr, "OpenAudioOut"}, - {133, nullptr, "CloseAudioOut"}, - {134, nullptr, "AcquireAudioOutStateChangedEvent"}, - {135, nullptr, "StartAudioOut"}, - {136, nullptr, "StopAudioOut"}, - {137, nullptr, "GetAudioOutState"}, - {138, nullptr, "GetAudioOutFeedingCodec"}, - {139, nullptr, "GetAudioOutFeedingParameter"}, - {140, nullptr, "AcquireAudioOutBufferAvailableEvent"}, - {141, nullptr, "SendAudioData"}, - {142, nullptr, "AcquireAudioControlInputStateChangedEvent"}, - {143, nullptr, "GetAudioControlInputState"}, - {144, nullptr, "AcquireAudioConnectionStateChangedEvent"}, - {145, nullptr, "GetConnectedAudioDevice"}, - {146, nullptr, "CloseAudioControlInput"}, - {147, nullptr, "RegisterAudioControlNotification"}, - {148, nullptr, "SendAudioControlPassthroughCommand"}, - {149, nullptr, "SendAudioControlSetAbsoluteVolumeCommand"}, - {150, nullptr, "AcquireAudioSinkVolumeLocallyChangedEvent"}, - {151, nullptr, "AcquireAudioSinkVolumeUpdateRequestCompletedEvent"}, - {152, nullptr, "GetAudioSinkVolume"}, - {153, nullptr, "RequestUpdateAudioSinkVolume"}, - {154, nullptr, "IsAudioSinkVolumeSupported"}, - {256, nullptr, "IsManufacturingMode"}, - {257, nullptr, "EmulateBluetoothCrash"}, - {258, nullptr, "GetBleChannelMap"}, - }; - // clang-format on + explicit IBluetoothDriver(Core::System& system_) : ServiceFramework{system_, "btdrv"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -204,6 +70,140 @@ private: LOG_WARNING(Service_BTDRV, "(STUBBED) called"); R_SUCCEED(); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "InitializeBluetoothDriver"}, + FunctionInfo{1, nullptr, "InitializeBluetooth"}, + FunctionInfo{2, nullptr, "EnableBluetooth"}, + FunctionInfo{3, nullptr, "DisableBluetooth"}, + FunctionInfo{4, nullptr, "FinalizeBluetooth"}, + FunctionInfo{5, nullptr, "GetAdapterProperties"}, + FunctionInfo{6, nullptr, "GetAdapterProperty"}, + FunctionInfo{7, nullptr, "SetAdapterProperty"}, + FunctionInfo{8, nullptr, "StartInquiry"}, + FunctionInfo{9, nullptr, "StopInquiry"}, + FunctionInfo{10, nullptr, "CreateBond"}, + FunctionInfo{11, nullptr, "RemoveBond"}, + FunctionInfo{12, nullptr, "CancelBond"}, + FunctionInfo{13, nullptr, "RespondToPinRequest"}, + FunctionInfo{14, nullptr, "RespondToSspRequest"}, + FunctionInfo{15, nullptr, "GetEventInfo"}, + FunctionInfo{16, nullptr, "InitializeHid"}, + FunctionInfo{17, nullptr, "OpenHidConnection"}, + FunctionInfo{18, nullptr, "CloseHidConnection"}, + FunctionInfo{19, nullptr, "WriteHidData"}, + FunctionInfo{20, nullptr, "WriteHidData2"}, + FunctionInfo{21, nullptr, "SetHidReport"}, + FunctionInfo{22, nullptr, "GetHidReport"}, + FunctionInfo{23, nullptr, "TriggerConnection"}, + FunctionInfo{24, nullptr, "AddPairedDeviceInfo"}, + FunctionInfo{25, nullptr, "GetPairedDeviceInfo"}, + FunctionInfo{26, nullptr, "FinalizeHid"}, + FunctionInfo{27, nullptr, "GetHidEventInfo"}, + FunctionInfo{28, nullptr, "SetTsi"}, + FunctionInfo{29, nullptr, "EnableBurstMode"}, + FunctionInfo{30, nullptr, "SetZeroRetransmission"}, + FunctionInfo{31, nullptr, "EnableMcMode"}, + FunctionInfo{32, nullptr, "EnableLlrScan"}, + FunctionInfo{33, nullptr, "DisableLlrScan"}, + FunctionInfo{34, C<&IBluetoothDriver::EnableRadio>, "EnableRadio"}, + FunctionInfo{35, nullptr, "SetVisibility"}, + FunctionInfo{36, nullptr, "EnableTbfcScan"}, + FunctionInfo{37, nullptr, "RegisterHidReportEvent"}, + FunctionInfo{38, nullptr, "GetHidReportEventInfo"}, + FunctionInfo{39, nullptr, "GetLatestPlr"}, + FunctionInfo{40, nullptr, "GetPendingConnections"}, + FunctionInfo{41, nullptr, "GetChannelMap"}, + FunctionInfo{42, nullptr, "EnableTxPowerBoostSetting"}, + FunctionInfo{43, nullptr, "IsTxPowerBoostSettingEnabled"}, + FunctionInfo{44, nullptr, "EnableAfhSetting"}, + FunctionInfo{45, nullptr, "IsAfhSettingEnabled"}, + FunctionInfo{46, nullptr, "InitializeBle"}, + FunctionInfo{47, nullptr, "EnableBle"}, + FunctionInfo{48, nullptr, "DisableBle"}, + FunctionInfo{49, nullptr, "FinalizeBle"}, + FunctionInfo{50, nullptr, "SetBleVisibility"}, + FunctionInfo{51, nullptr, "SetBleConnectionParameter"}, + FunctionInfo{52, nullptr, "SetBleDefaultConnectionParameter"}, + FunctionInfo{53, nullptr, "SetBleAdvertiseData"}, + FunctionInfo{54, nullptr, "SetBleAdvertiseParameter"}, + FunctionInfo{55, nullptr, "StartBleScan"}, + FunctionInfo{56, nullptr, "StopBleScan"}, + FunctionInfo{57, nullptr, "AddBleScanFilterCondition"}, + FunctionInfo{58, nullptr, "DeleteBleScanFilterCondition"}, + FunctionInfo{59, nullptr, "DeleteBleScanFilter"}, + FunctionInfo{60, nullptr, "ClearBleScanFilters"}, + FunctionInfo{61, nullptr, "EnableBleScanFilter"}, + FunctionInfo{62, nullptr, "RegisterGattClient"}, + FunctionInfo{63, nullptr, "UnregisterGattClient"}, + FunctionInfo{64, nullptr, "UnregisterAllGattClients"}, + FunctionInfo{65, nullptr, "ConnectGattServer"}, + FunctionInfo{66, nullptr, "CancelConnectGattServer"}, + FunctionInfo{67, nullptr, "DisconnectGattServer"}, + FunctionInfo{68, nullptr, "GetGattAttribute"}, + FunctionInfo{69, nullptr, "GetGattService"}, + FunctionInfo{70, nullptr, "ConfigureAttMtu"}, + FunctionInfo{71, nullptr, "RegisterGattServer"}, + FunctionInfo{72, nullptr, "UnregisterGattServer"}, + FunctionInfo{73, nullptr, "ConnectGattClient"}, + FunctionInfo{74, nullptr, "DisconnectGattClient"}, + FunctionInfo{75, nullptr, "AddGattService"}, + FunctionInfo{76, nullptr, "EnableGattService"}, + FunctionInfo{77, nullptr, "AddGattCharacteristic"}, + FunctionInfo{78, nullptr, "AddGattDescriptor"}, + FunctionInfo{79, nullptr, "GetBleManagedEventInfo"}, + FunctionInfo{80, nullptr, "GetGattFirstCharacteristic"}, + FunctionInfo{81, nullptr, "GetGattNextCharacteristic"}, + FunctionInfo{82, nullptr, "GetGattFirstDescriptor"}, + FunctionInfo{83, nullptr, "GetGattNextDescriptor"}, + FunctionInfo{84, nullptr, "RegisterGattManagedDataPath"}, + FunctionInfo{85, nullptr, "UnregisterGattManagedDataPath"}, + FunctionInfo{86, nullptr, "RegisterGattHidDataPath"}, + FunctionInfo{87, nullptr, "UnregisterGattHidDataPath"}, + FunctionInfo{88, nullptr, "RegisterGattDataPath"}, + FunctionInfo{89, nullptr, "UnregisterGattDataPath"}, + FunctionInfo{90, nullptr, "ReadGattCharacteristic"}, + FunctionInfo{91, nullptr, "ReadGattDescriptor"}, + FunctionInfo{92, nullptr, "WriteGattCharacteristic"}, + FunctionInfo{93, nullptr, "WriteGattDescriptor"}, + FunctionInfo{94, nullptr, "RegisterGattNotification"}, + FunctionInfo{95, nullptr, "UnregisterGattNotification"}, + FunctionInfo{96, nullptr, "GetLeHidEventInfo"}, + FunctionInfo{97, nullptr, "RegisterBleHidEvent"}, + FunctionInfo{98, nullptr, "SetBleScanParameter"}, + FunctionInfo{99, nullptr, "MoveToSecondaryPiconet"}, + FunctionInfo{100, nullptr, "IsBluetoothEnabled"}, + FunctionInfo{128, nullptr, "AcquireAudioEvent"}, + FunctionInfo{129, nullptr, "GetAudioEventInfo"}, + FunctionInfo{130, nullptr, "OpenAudioConnection"}, + FunctionInfo{131, nullptr, "CloseAudioConnection"}, + FunctionInfo{132, nullptr, "OpenAudioOut"}, + FunctionInfo{133, nullptr, "CloseAudioOut"}, + FunctionInfo{134, nullptr, "AcquireAudioOutStateChangedEvent"}, + FunctionInfo{135, nullptr, "StartAudioOut"}, + FunctionInfo{136, nullptr, "StopAudioOut"}, + FunctionInfo{137, nullptr, "GetAudioOutState"}, + FunctionInfo{138, nullptr, "GetAudioOutFeedingCodec"}, + FunctionInfo{139, nullptr, "GetAudioOutFeedingParameter"}, + FunctionInfo{140, nullptr, "AcquireAudioOutBufferAvailableEvent"}, + FunctionInfo{141, nullptr, "SendAudioData"}, + FunctionInfo{142, nullptr, "AcquireAudioControlInputStateChangedEvent"}, + FunctionInfo{143, nullptr, "GetAudioControlInputState"}, + FunctionInfo{144, nullptr, "AcquireAudioConnectionStateChangedEvent"}, + FunctionInfo{145, nullptr, "GetConnectedAudioDevice"}, + FunctionInfo{146, nullptr, "CloseAudioControlInput"}, + FunctionInfo{147, nullptr, "RegisterAudioControlNotification"}, + FunctionInfo{148, nullptr, "SendAudioControlPassthroughCommand"}, + FunctionInfo{149, nullptr, "SendAudioControlSetAbsoluteVolumeCommand"}, + FunctionInfo{150, nullptr, "AcquireAudioSinkVolumeLocallyChangedEvent"}, + FunctionInfo{151, nullptr, "AcquireAudioSinkVolumeUpdateRequestCompletedEvent"}, + FunctionInfo{152, nullptr, "GetAudioSinkVolume"}, + FunctionInfo{153, nullptr, "RequestUpdateAudioSinkVolume"}, + FunctionInfo{154, nullptr, "IsAudioSinkVolumeSupported"}, + FunctionInfo{256, nullptr, "IsManufacturingMode"}, + FunctionInfo{257, nullptr, "EmulateBluetoothCrash"}, + FunctionInfo{258, nullptr, "GetBleChannelMap"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/btm/btm.cpp b/src/core/hle/service/btm/btm.cpp index 327c2d2ddb..e8fa29af7c 100644 --- a/src/core/hle/service/btm/btm.cpp +++ b/src/core/hle/service/btm/btm.cpp @@ -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-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -6,111 +6,414 @@ #include +#include "common/logging.h" +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/set/system_settings_server.h" +#include "core/hle/service/sm/sm.h" #include "core/hle/service/btm/btm.h" -#include "core/hle/service/btm/btm_debug.h" -#include "core/hle/service/btm/btm_system.h" -#include "core/hle/service/btm/btm_user.h" #include "core/hle/service/server_manager.h" #include "core/hle/service/service.h" +namespace Kernel { +class KEvent; +class KReadableEvent; +} // namespace Kernel + +namespace Core { +class System; +} + +namespace Service::Set { +class ISystemSettingsServer; +} + namespace Service::BTM { +class IBtmSystemCore final : public ServiceFramework { +public: + explicit IBtmSystemCore(Core::System& system_) + : ServiceFramework{system_, "IBtmSystemCore"}, service_context{system_, "IBtmSystemCore"} { + radio_event = service_context.CreateEvent("IBtmSystemCore:RadioEvent"); + audio_device_connection_event = service_context.CreateEvent("IBtmSystemCore:AudioDeviceConnectionEvent"); + m_set_sys = system.ServiceManager().GetService("set:sys", true); + } + + ~IBtmSystemCore() override { + service_context.CloseEvent(radio_event); + service_context.CloseEvent(audio_device_connection_event); + } + + Result StartGamepadPairing() { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + R_SUCCEED(); + } + + Result CancelGamepadPairing() { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + R_SUCCEED(); + } + + Result EnableRadio() { + LOG_DEBUG(Service_BTM, "called"); + + R_RETURN(m_set_sys->SetBluetoothEnableFlag(true)); + } + Result DisableRadio() { + LOG_DEBUG(Service_BTM, "called"); + + R_RETURN(m_set_sys->SetBluetoothEnableFlag(false)); + } + + Result IsRadioEnabled(Out out_is_enabled) { + LOG_DEBUG(Service_BTM, "called"); + + R_RETURN(m_set_sys->GetBluetoothEnableFlag(out_is_enabled)); + } + + Result AcquireRadioEvent(Out out_is_valid, + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &radio_event->GetReadableEvent(); + R_SUCCEED(); + } + + Result GetDiscoveredAudioDevice(OutArray, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out out_total) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + R_SUCCEED(); + } + + Result AcquireAudioDeviceConnectionEvent( + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_event = &audio_device_connection_event->GetReadableEvent(); + R_SUCCEED(); + } + + Result GetConnectedAudioDevices( + Out out_count, OutArray, BufferAttr_HipcPointer> out_audio_devices) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_count = 0; + R_SUCCEED(); + } + + Result GetPairedAudioDevices( + Out out_count, OutArray, BufferAttr_HipcPointer> out_audio_devices) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_count = 0; + R_SUCCEED(); + } + + Result RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) { + LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid); + R_SUCCEED(); + } + + Result CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) { + LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid); + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&IBtmSystemCore::StartGamepadPairing>, "StartGamepadPairing"}, + FunctionInfo{1, C<&IBtmSystemCore::CancelGamepadPairing>, "CancelGamepadPairing"}, + FunctionInfo{2, nullptr, "ClearGamepadPairingDatabase"}, + FunctionInfo{3, nullptr, "GetPairedGamepadCount"}, + FunctionInfo{4, C<&IBtmSystemCore::EnableRadio>, "EnableRadio"}, + FunctionInfo{5, C<&IBtmSystemCore::DisableRadio>, "DisableRadio"}, + FunctionInfo{6, C<&IBtmSystemCore::IsRadioEnabled>, "IsRadioEnabled"}, + FunctionInfo{7, C<&IBtmSystemCore::AcquireRadioEvent>, "AcquireRadioEvent"}, + FunctionInfo{8, nullptr, "AcquireGamepadPairingEvent"}, + FunctionInfo{9, nullptr, "IsGamepadPairingStarted"}, + FunctionInfo{10, nullptr, "StartAudioDeviceDiscovery"}, + FunctionInfo{11, nullptr, "StopAudioDeviceDiscovery"}, + FunctionInfo{12, nullptr, "IsDiscoveryingAudioDevice"}, + FunctionInfo{13, C<&IBtmSystemCore::GetDiscoveredAudioDevice>, "GetDiscoveredAudioDevice"}, + FunctionInfo{14, C<&IBtmSystemCore::AcquireAudioDeviceConnectionEvent>, "AcquireAudioDeviceConnectionEvent"}, + FunctionInfo{15, nullptr, "ConnectAudioDevice"}, + FunctionInfo{16, nullptr, "IsConnectingAudioDevice"}, + FunctionInfo{17, C<&IBtmSystemCore::GetConnectedAudioDevices>, "GetConnectedAudioDevices"}, + FunctionInfo{18, nullptr, "DisconnectAudioDevice"}, + FunctionInfo{19, nullptr, "AcquirePairedAudioDeviceInfoChangedEvent"}, + FunctionInfo{20, C<&IBtmSystemCore::GetPairedAudioDevices>, "GetPairedAudioDevices"}, + FunctionInfo{21, nullptr, "RemoveAudioDevicePairing"}, + FunctionInfo{22, C<&IBtmSystemCore::RequestAudioDeviceConnectionRejection>, "RequestAudioDeviceConnectionRejection"}, + FunctionInfo{23, C<&IBtmSystemCore::CancelAudioDeviceConnectionRejection>, "CancelAudioDeviceConnectionRejection"} + ); + KernelHelpers::ServiceContext service_context; + Kernel::KEvent* radio_event; + Kernel::KEvent* audio_device_connection_event; + std::shared_ptr m_set_sys; +}; + +class IBtmSystem final : public ServiceFramework { +public: + explicit IBtmSystem(Core::System& system_) : ServiceFramework{system_, "btm:sys"} {} + ~IBtmSystem() override = default; + + Result GetCore(OutInterface out_interface) { + LOG_WARNING(Service_BTM, "called"); + + *out_interface = std::make_shared(system); + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&IBtmSystem::GetCore>, "GetCore"} + ); +}; + +class IBtmUserCore final : public ServiceFramework { +public: + explicit IBtmUserCore(Core::System& system_) + : ServiceFramework{system_, "IBtmUserCore"}, service_context{system_, "IBtmUserCore"} { + scan_event = service_context.CreateEvent("IBtmUserCore:ScanEvent"); + connection_event = service_context.CreateEvent("IBtmUserCore:ConnectionEvent"); + service_discovery_event = service_context.CreateEvent("IBtmUserCore:DiscoveryEvent"); + config_event = service_context.CreateEvent("IBtmUserCore:ConfigEvent"); + } + + ~IBtmUserCore() override { + service_context.CloseEvent(scan_event); + service_context.CloseEvent(connection_event); + service_context.CloseEvent(service_discovery_event); + service_context.CloseEvent(config_event); + } + + Result AcquireBleScanEvent(Out out_is_valid, + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &scan_event->GetReadableEvent(); + R_SUCCEED(); + } + + Result AcquireBleConnectionEvent(Out out_is_valid, + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &connection_event->GetReadableEvent(); + R_SUCCEED(); + } + + Result AcquireBleServiceDiscoveryEvent( + Out out_is_valid, OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &service_discovery_event->GetReadableEvent(); + R_SUCCEED(); + } + + Result AcquireBleMtuConfigEvent(Out out_is_valid, + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &config_event->GetReadableEvent(); + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&IBtmUserCore::AcquireBleScanEvent>, "AcquireBleScanEvent"}, + FunctionInfo{1, nullptr, "GetBleScanFilterParameter"}, + FunctionInfo{2, nullptr, "GetBleScanFilterParameter2"}, + FunctionInfo{3, nullptr, "StartBleScanForGeneral"}, + FunctionInfo{4, nullptr, "StopBleScanForGeneral"}, + FunctionInfo{5, nullptr, "GetBleScanResultsForGeneral"}, + FunctionInfo{6, nullptr, "StartBleScanForPaired"}, + FunctionInfo{7, nullptr, "StopBleScanForPaired"}, + FunctionInfo{8, nullptr, "StartBleScanForSmartDevice"}, + FunctionInfo{9, nullptr, "StopBleScanForSmartDevice"}, + FunctionInfo{10, nullptr, "GetBleScanResultsForSmartDevice"}, + FunctionInfo{17, C<&IBtmUserCore::AcquireBleConnectionEvent>, "AcquireBleConnectionEvent"}, + FunctionInfo{18, nullptr, "BleConnect"}, + FunctionInfo{19, nullptr, "BleDisconnect"}, + FunctionInfo{20, nullptr, "BleGetConnectionState"}, + FunctionInfo{21, nullptr, "AcquireBlePairingEvent"}, + FunctionInfo{22, nullptr, "BlePairDevice"}, + FunctionInfo{23, nullptr, "BleUnPairDevice"}, + FunctionInfo{24, nullptr, "BleUnPairDevice2"}, + FunctionInfo{25, nullptr, "BleGetPairedDevices"}, + FunctionInfo{26, C<&IBtmUserCore::AcquireBleServiceDiscoveryEvent>, "AcquireBleServiceDiscoveryEvent"}, + FunctionInfo{27, nullptr, "GetGattServices"}, + FunctionInfo{28, nullptr, "GetGattService"}, + FunctionInfo{29, nullptr, "GetGattIncludedServices"}, + FunctionInfo{30, nullptr, "GetBelongingGattService"}, + FunctionInfo{31, nullptr, "GetGattCharacteristics"}, + FunctionInfo{32, nullptr, "GetGattDescriptors"}, + FunctionInfo{33, C<&IBtmUserCore::AcquireBleMtuConfigEvent>, "AcquireBleMtuConfigEvent"}, + FunctionInfo{34, nullptr, "ConfigureBleMtu"}, + FunctionInfo{35, nullptr, "GetBleMtu"}, + FunctionInfo{36, nullptr, "RegisterBleGattDataPath"}, + FunctionInfo{37, nullptr, "UnregisterBleGattDataPath"} + ); + KernelHelpers::ServiceContext service_context; + Kernel::KEvent* scan_event; + Kernel::KEvent* connection_event; + Kernel::KEvent* service_discovery_event; + Kernel::KEvent* config_event; +}; + +class IBtmUser final : public ServiceFramework { +public: + explicit IBtmUser(Core::System& system_) : ServiceFramework{system_, "btm:u"} {} + ~IBtmUser() override = default; + + Result GetCore(OutInterface out_interface) { + LOG_WARNING(Service_BTM, "called"); + + *out_interface = std::make_shared(system); + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&IBtmUser::GetCore>, "GetCore"} + ); +}; + +class IBtmDebug final : public ServiceFramework { +public: + explicit IBtmDebug(Core::System& system_) : ServiceFramework{system_, "btm:dbg"} {} + ~IBtmDebug() override = default; + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "AcquireDiscoveryEvent"}, + FunctionInfo{1, nullptr, "StartDiscovery"}, + FunctionInfo{2, nullptr, "CancelDiscovery"}, + FunctionInfo{3, nullptr, "GetDeviceProperty"}, + FunctionInfo{4, nullptr, "CreateBond"}, + FunctionInfo{5, nullptr, "CancelBond"}, + FunctionInfo{6, nullptr, "SetTsiMode"}, + FunctionInfo{7, nullptr, "GeneralTest"}, + FunctionInfo{8, nullptr, "HidConnect"}, + FunctionInfo{9, nullptr, "GeneralGet", MakeVersionGate({5,0,0})}, + FunctionInfo{10, nullptr, "GetGattClientDisconnectionReason", MakeVersionGate({5,0,0})}, + FunctionInfo{11, nullptr, "GetBleConnectionParameter", MakeVersionGate({5,1,0})}, + FunctionInfo{12, nullptr, "GetBleConnectionParameterRequest", MakeVersionGate({5,1,0})}, + FunctionInfo{13, nullptr, "GetDiscoveredDevice", MakeVersionGate({12,0,0})}, + FunctionInfo{14, nullptr, "SleepAwakeLoopTest", MakeVersionGate({15,0,0})}, + FunctionInfo{15, nullptr, "SleepTest", MakeVersionGate({15,0,0})}, + FunctionInfo{16, nullptr, "MinimumAwakeTest", MakeVersionGate({15,0,0})}, + FunctionInfo{17, nullptr, "ForceEnableBtm", MakeVersionGate({15,0,0})} + ); +}; + class IBtm final : public ServiceFramework { public: - explicit IBtm(Core::System& system_) : ServiceFramework{system_, "btm"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetState"}, - {1, nullptr, "GetHostDeviceProperty"}, - {2, nullptr, "AcquireDeviceConditionEvent"}, - {3, nullptr, "GetDeviceCondition"}, - {4, nullptr, "SetBurstMode"}, - {5, nullptr, "SetSlotMode"}, - {6, nullptr, "SetBluetoothMode"}, - {7, nullptr, "SetWlanMode"}, - {8, nullptr, "AcquireDeviceInfoEvent"}, - {9, nullptr, "GetDeviceInfo"}, - {10, nullptr, "AddDeviceInfo"}, - {11, nullptr, "RemoveDeviceInfo"}, - {12, nullptr, "IncreaseDeviceInfoOrder"}, - {13, nullptr, "LlrNotify"}, - {14, nullptr, "EnableRadio"}, - {15, nullptr, "DisableRadio"}, - {16, nullptr, "HidDisconnect"}, - {17, nullptr, "HidSetRetransmissionMode"}, - {18, nullptr, "AcquireAwakeReqEvent"}, - {19, nullptr, "AcquireLlrStateEvent"}, - {20, nullptr, "IsLlrStarted"}, - {21, nullptr, "EnableSlotSaving"}, - {22, nullptr, "ProtectDeviceInfo"}, - {23, nullptr, "AcquireBleScanEvent"}, - {24, nullptr, "GetBleScanParameterGeneral"}, - {25, nullptr, "GetBleScanParameterSmartDevice"}, - {26, nullptr, "StartBleScanForGeneral"}, - {27, nullptr, "StopBleScanForGeneral"}, - {28, nullptr, "GetBleScanResultsForGeneral"}, - {29, nullptr, "StartBleScanForPairedDevice"}, - {30, nullptr, "StopBleScanForPairedDevice"}, - {31, nullptr, "StartBleScanForSmartDevice"}, - {32, nullptr, "StopBleScanForSmartDevice"}, - {33, nullptr, "GetBleScanResultsForSmartDevice"}, - {34, nullptr, "AcquireBleConnectionEvent"}, - {35, nullptr, "BleConnect"}, - {36, nullptr, "BleOverrideConnection"}, - {37, nullptr, "BleDisconnect"}, - {38, nullptr, "BleGetConnectionState"}, - {39, nullptr, "BleGetGattClientConditionList"}, - {40, nullptr, "AcquireBlePairingEvent"}, - {41, nullptr, "BlePairDevice"}, - {42, nullptr, "BleUnpairDeviceOnBoth"}, - {43, nullptr, "BleUnpairDevice"}, - {44, nullptr, "BleGetPairedAddresses"}, - {45, nullptr, "AcquireBleServiceDiscoveryEvent"}, - {46, nullptr, "GetGattServices"}, - {47, nullptr, "GetGattService"}, - {48, nullptr, "GetGattIncludedServices"}, - {49, nullptr, "GetBelongingService"}, - {50, nullptr, "GetGattCharacteristics"}, - {51, nullptr, "GetGattDescriptors"}, - {52, nullptr, "AcquireBleMtuConfigEvent"}, - {53, nullptr, "ConfigureBleMtu"}, - {54, nullptr, "GetBleMtu"}, - {55, nullptr, "RegisterBleGattDataPath"}, - {56, nullptr, "UnregisterBleGattDataPath"}, - {57, nullptr, "RegisterAppletResourceUserId"}, - {58, nullptr, "UnregisterAppletResourceUserId"}, - {59, nullptr, "SetAppletResourceUserId"}, - {60, nullptr, "AcquireBleConnectionParameterUpdateEvent"}, //8.0.0+ - {61, nullptr, "SetCeLength"}, //8.0.0+ - {62, nullptr, "EnsureSlotExpansion"}, //9.0.0+ - {63, nullptr, "IsSlotExpansionEnsured"}, //9.0.0+ - {64, nullptr, "CancelConnectionTrigger"}, //10.0.0+ - {65, nullptr, "GetConnectionCapacity"}, //13.0.0+ - {66, nullptr, "GetWlanMode"}, //13.0.0+ - {67, nullptr, "IsSlotSavingEnabled"}, //13.0.0+ - {68, nullptr, "IsSlotSavingForPairingEnabled"}, //13.0.0+ - {69, nullptr, "AcquireAudioDeviceConnectionEvent"}, //13.0.0+ - {70, nullptr, "GetConnectedAudioDevices"}, //13.0.0+ - {71, nullptr, "SetAudioSourceVolume"}, //13.0.0+ - {72, nullptr, "GetAudioSourceVolume"}, //13.0.0+ - {73, nullptr, "RequestAudioDeviceConnectionRejection"}, //13.0.0+ - {74, nullptr, "CancelAudioDeviceConnectionRejection"}, //13.0.0+ - {75, nullptr, "GetPairedAudioDevices"}, //13.0.0+ - {76, nullptr, "SetWlanModeWithOption"}, //13.1.0+ - {100, nullptr, "AcquireConnectionDisallowedEvent"}, //13.0.0+ - {101, nullptr, "GetUsecaseViolationFactor"}, //13.0.0+ - {110, nullptr, "GetShortenedDeviceInfo"}, //13.0.0+ - {111, nullptr, "AcquirePairingCountUpdateEvent"},//13.0.0+ - {112, nullptr, "Unknown112"}, //14.0.0-14.1.2 - {113, nullptr, "Unknown113"}, //14.0.0-14.1.2 - {114, nullptr, "IsFirstAudioControlConnection"}, //14.0.0+ - {115, nullptr, "GetShortenedDeviceCondition"}, //14.0.0+ - {116, nullptr, "SetAudioSinkVolume"}, //15.0.0+ - {117, nullptr, "GetAudioSinkVolume"}, //15.0.0+ - }; - // clang-format on + explicit IBtm(Core::System& system_) : ServiceFramework{system_, "btm"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetState"}, + FunctionInfo{1, nullptr, "GetHostDeviceProperty"}, + FunctionInfo{2, nullptr, "AcquireDeviceConditionEvent"}, + FunctionInfo{3, nullptr, "GetDeviceCondition"}, + FunctionInfo{4, nullptr, "SetBurstMode"}, + FunctionInfo{5, nullptr, "SetSlotMode"}, + FunctionInfo{6, nullptr, "SetBluetoothMode"}, + FunctionInfo{7, nullptr, "SetWlanMode"}, + FunctionInfo{8, nullptr, "AcquireDeviceInfoEvent"}, + FunctionInfo{9, nullptr, "GetDeviceInfo"}, + FunctionInfo{10, nullptr, "AddDeviceInfo"}, + FunctionInfo{11, nullptr, "RemoveDeviceInfo"}, + FunctionInfo{12, nullptr, "IncreaseDeviceInfoOrder"}, + FunctionInfo{13, nullptr, "LlrNotify"}, + FunctionInfo{14, nullptr, "EnableRadio"}, + FunctionInfo{15, nullptr, "DisableRadio"}, + FunctionInfo{16, nullptr, "HidDisconnect"}, + FunctionInfo{17, nullptr, "HidSetRetransmissionMode"}, + FunctionInfo{18, nullptr, "AcquireAwakeReqEvent"}, + FunctionInfo{19, nullptr, "AcquireLlrStateEvent"}, + FunctionInfo{20, nullptr, "IsLlrStarted"}, + FunctionInfo{21, nullptr, "EnableSlotSaving"}, + FunctionInfo{22, nullptr, "ProtectDeviceInfo"}, + FunctionInfo{23, nullptr, "AcquireBleScanEvent"}, + FunctionInfo{24, nullptr, "GetBleScanParameterGeneral"}, + FunctionInfo{25, nullptr, "GetBleScanParameterSmartDevice"}, + FunctionInfo{26, nullptr, "StartBleScanForGeneral"}, + FunctionInfo{27, nullptr, "StopBleScanForGeneral"}, + FunctionInfo{28, nullptr, "GetBleScanResultsForGeneral"}, + FunctionInfo{29, nullptr, "StartBleScanForPairedDevice"}, + FunctionInfo{30, nullptr, "StopBleScanForPairedDevice"}, + FunctionInfo{31, nullptr, "StartBleScanForSmartDevice"}, + FunctionInfo{32, nullptr, "StopBleScanForSmartDevice"}, + FunctionInfo{33, nullptr, "GetBleScanResultsForSmartDevice"}, + FunctionInfo{34, nullptr, "AcquireBleConnectionEvent"}, + FunctionInfo{35, nullptr, "BleConnect"}, + FunctionInfo{36, nullptr, "BleOverrideConnection"}, + FunctionInfo{37, nullptr, "BleDisconnect"}, + FunctionInfo{38, nullptr, "BleGetConnectionState"}, + FunctionInfo{39, nullptr, "BleGetGattClientConditionList"}, + FunctionInfo{40, nullptr, "AcquireBlePairingEvent"}, + FunctionInfo{41, nullptr, "BlePairDevice"}, + FunctionInfo{42, nullptr, "BleUnpairDeviceOnBoth"}, + FunctionInfo{43, nullptr, "BleUnpairDevice"}, + FunctionInfo{44, nullptr, "BleGetPairedAddresses"}, + FunctionInfo{45, nullptr, "AcquireBleServiceDiscoveryEvent"}, + FunctionInfo{46, nullptr, "GetGattServices"}, + FunctionInfo{47, nullptr, "GetGattService"}, + FunctionInfo{48, nullptr, "GetGattIncludedServices"}, + FunctionInfo{49, nullptr, "GetBelongingService"}, + FunctionInfo{50, nullptr, "GetGattCharacteristics"}, + FunctionInfo{51, nullptr, "GetGattDescriptors"}, + FunctionInfo{52, nullptr, "AcquireBleMtuConfigEvent"}, + FunctionInfo{53, nullptr, "ConfigureBleMtu"}, + FunctionInfo{54, nullptr, "GetBleMtu"}, + FunctionInfo{55, nullptr, "RegisterBleGattDataPath"}, + FunctionInfo{56, nullptr, "UnregisterBleGattDataPath"}, + FunctionInfo{57, nullptr, "RegisterAppletResourceUserId"}, + FunctionInfo{58, nullptr, "UnregisterAppletResourceUserId"}, + FunctionInfo{59, nullptr, "SetAppletResourceUserId"}, + FunctionInfo{60, nullptr, "AcquireBleConnectionParameterUpdateEvent", MakeVersionGate({8,0,0})}, + FunctionInfo{61, nullptr, "SetCeLength", MakeVersionGate({8,0,0})}, + FunctionInfo{62, nullptr, "EnsureSlotExpansion", MakeVersionGate({9,0,0})}, + FunctionInfo{63, nullptr, "IsSlotExpansionEnsured", MakeVersionGate({9,0,0})}, + FunctionInfo{64, nullptr, "CancelConnectionTrigger", MakeVersionGate({10,0,0})}, + FunctionInfo{65, nullptr, "GetConnectionCapacity", MakeVersionGate({13,0,0})}, + FunctionInfo{66, nullptr, "GetWlanMode", MakeVersionGate({13,0,0})}, + FunctionInfo{67, nullptr, "IsSlotSavingEnabled", MakeVersionGate({13,0,0})}, + FunctionInfo{68, nullptr, "IsSlotSavingForPairingEnabled", MakeVersionGate({13,0,0})}, + FunctionInfo{69, nullptr, "AcquireAudioDeviceConnectionEvent", MakeVersionGate({13,0,0})}, + FunctionInfo{70, nullptr, "GetConnectedAudioDevices", MakeVersionGate({13,0,0})}, + FunctionInfo{71, nullptr, "SetAudioSourceVolume", MakeVersionGate({13,0,0})}, + FunctionInfo{72, nullptr, "GetAudioSourceVolume", MakeVersionGate({13,0,0})}, + FunctionInfo{73, nullptr, "RequestAudioDeviceConnectionRejection", MakeVersionGate({13,0,0})}, + FunctionInfo{74, nullptr, "CancelAudioDeviceConnectionRejection", MakeVersionGate({13,0,0})}, + FunctionInfo{75, nullptr, "GetPairedAudioDevices", MakeVersionGate({13,0,0})}, + FunctionInfo{76, nullptr, "SetWlanModeWithOption", MakeVersionGate({13,1,0})}, + FunctionInfo{100, nullptr, "AcquireConnectionDisallowedEvent", MakeVersionGate({13,0,0})}, + FunctionInfo{101, nullptr, "GetUsecaseViolationFactor", MakeVersionGate({13,0,0})}, + FunctionInfo{110, nullptr, "GetShortenedDeviceInfo", MakeVersionGate({13,0,0})}, + FunctionInfo{111, nullptr, "AcquirePairingCountUpdateEvent"},//13.0.0+ + FunctionInfo{112, nullptr, "Unknown112", MakeVersionGate({14,0,0}, {14,1,2})}, + FunctionInfo{113, nullptr, "Unknown113", MakeVersionGate({14,0,0}, {14,1,2})}, + FunctionInfo{114, nullptr, "IsFirstAudioControlConnection", MakeVersionGate({14,0,0})}, + FunctionInfo{115, nullptr, "GetShortenedDeviceCondition", MakeVersionGate({14,0,0})}, + FunctionInfo{116, nullptr, "SetAudioSinkVolume", MakeVersionGate({15,0,0})}, + FunctionInfo{117, nullptr, "GetAudioSinkVolume", MakeVersionGate({15,0,0})} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/btm/btm_debug.cpp b/src/core/hle/service/btm/btm_debug.cpp deleted file mode 100644 index 0c9a3a6557..0000000000 --- a/src/core/hle/service/btm/btm_debug.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "core/hle/service/btm/btm_debug.h" - -namespace Service::BTM { - -IBtmDebug::IBtmDebug(Core::System& system_) : ServiceFramework{system_, "btm:dbg"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "AcquireDiscoveryEvent"}, - {1, nullptr, "StartDiscovery"}, - {2, nullptr, "CancelDiscovery"}, - {3, nullptr, "GetDeviceProperty"}, - {4, nullptr, "CreateBond"}, - {5, nullptr, "CancelBond"}, - {6, nullptr, "SetTsiMode"}, - {7, nullptr, "GeneralTest"}, - {8, nullptr, "HidConnect"}, - {9, nullptr, "GeneralGet"}, //5.0.0+ - {10, nullptr, "GetGattClientDisconnectionReason"}, //5.0.0+ - {11, nullptr, "GetBleConnectionParameter"}, //5.1.0+ - {12, nullptr, "GetBleConnectionParameterRequest"}, //5.1.0+ - {13, nullptr, "GetDiscoveredDevice"}, //12.0.0+ - {14, nullptr, "SleepAwakeLoopTest"}, //15.0.0+ - {15, nullptr, "SleepTest"}, //15.0.0+ - {16, nullptr, "MinimumAwakeTest"}, //15.0.0+ - {17, nullptr, "ForceEnableBtm"}, //15.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); -} - -IBtmDebug::~IBtmDebug() = default; - -} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_debug.h b/src/core/hle/service/btm/btm_debug.h deleted file mode 100644 index bf4f7e14fd..0000000000 --- a/src/core/hle/service/btm/btm_debug.h +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Core { -class System; -} - -namespace Service::BTM { - -class IBtmDebug final : public ServiceFramework { -public: - explicit IBtmDebug(Core::System& system_); - ~IBtmDebug() override; -}; - -} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_system.cpp b/src/core/hle/service/btm/btm_system.cpp deleted file mode 100644 index 1684b0193e..0000000000 --- a/src/core/hle/service/btm/btm_system.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "common/logging.h" -#include "core/hle/service/btm/btm_system.h" -#include "core/hle/service/btm/btm_system_core.h" -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/service.h" - -namespace Service::BTM { - -IBtmSystem::IBtmSystem(Core::System& system_) : ServiceFramework{system_, "btm:sys"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&IBtmSystem::GetCore>, "GetCore"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -IBtmSystem::~IBtmSystem() = default; - -Result IBtmSystem::GetCore(OutInterface out_interface) { - LOG_WARNING(Service_BTM, "called"); - - *out_interface = std::make_shared(system); - R_SUCCEED(); -} - -} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_system.h b/src/core/hle/service/btm/btm_system.h deleted file mode 100644 index fe1c6dbd78..0000000000 --- a/src/core/hle/service/btm/btm_system.h +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Core { -class System; -} - -namespace Service::BTM { -class IBtmSystemCore; - -class IBtmSystem final : public ServiceFramework { -public: - explicit IBtmSystem(Core::System& system_); - ~IBtmSystem() override; - -private: - Result GetCore(OutInterface out_interface); -}; - -} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_system_core.cpp b/src/core/hle/service/btm/btm_system_core.cpp deleted file mode 100644 index 318657fc32..0000000000 --- a/src/core/hle/service/btm/btm_system_core.cpp +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "common/logging.h" -#include "core/hle/service/btm/btm_system_core.h" -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/set/system_settings_server.h" -#include "core/hle/service/sm/sm.h" - -namespace Service::BTM { - -IBtmSystemCore::IBtmSystemCore(Core::System& system_) - : ServiceFramework{system_, "IBtmSystemCore"}, service_context{system_, "IBtmSystemCore"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&IBtmSystemCore::StartGamepadPairing>, "StartGamepadPairing"}, - {1, C<&IBtmSystemCore::CancelGamepadPairing>, "CancelGamepadPairing"}, - {2, nullptr, "ClearGamepadPairingDatabase"}, - {3, nullptr, "GetPairedGamepadCount"}, - {4, C<&IBtmSystemCore::EnableRadio>, "EnableRadio"}, - {5, C<&IBtmSystemCore::DisableRadio>, "DisableRadio"}, - {6, C<&IBtmSystemCore::IsRadioEnabled>, "IsRadioEnabled"}, - {7, C<&IBtmSystemCore::AcquireRadioEvent>, "AcquireRadioEvent"}, - {8, nullptr, "AcquireGamepadPairingEvent"}, - {9, nullptr, "IsGamepadPairingStarted"}, - {10, nullptr, "StartAudioDeviceDiscovery"}, - {11, nullptr, "StopAudioDeviceDiscovery"}, - {12, nullptr, "IsDiscoveryingAudioDevice"}, - {13, C<&IBtmSystemCore::GetDiscoveredAudioDevice>, "GetDiscoveredAudioDevice"}, - {14, C<&IBtmSystemCore::AcquireAudioDeviceConnectionEvent>, "AcquireAudioDeviceConnectionEvent"}, - {15, nullptr, "ConnectAudioDevice"}, - {16, nullptr, "IsConnectingAudioDevice"}, - {17, C<&IBtmSystemCore::GetConnectedAudioDevices>, "GetConnectedAudioDevices"}, - {18, nullptr, "DisconnectAudioDevice"}, - {19, nullptr, "AcquirePairedAudioDeviceInfoChangedEvent"}, - {20, C<&IBtmSystemCore::GetPairedAudioDevices>, "GetPairedAudioDevices"}, - {21, nullptr, "RemoveAudioDevicePairing"}, - {22, C<&IBtmSystemCore::RequestAudioDeviceConnectionRejection>, "RequestAudioDeviceConnectionRejection"}, - {23, C<&IBtmSystemCore::CancelAudioDeviceConnectionRejection>, "CancelAudioDeviceConnectionRejection"} - }; - // clang-format on - - RegisterHandlers(functions); - radio_event = service_context.CreateEvent("IBtmSystemCore::RadioEvent"); - audio_device_connection_event = - service_context.CreateEvent("IBtmSystemCore::AudioDeviceConnectionEvent"); - - m_set_sys = - system.ServiceManager().GetService("set:sys", true); -} - -IBtmSystemCore::~IBtmSystemCore() { - service_context.CloseEvent(radio_event); - service_context.CloseEvent(audio_device_connection_event); -} - -Result IBtmSystemCore::StartGamepadPairing() { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - R_SUCCEED(); -} - -Result IBtmSystemCore::CancelGamepadPairing() { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - R_SUCCEED(); -} - -Result IBtmSystemCore::EnableRadio() { - LOG_DEBUG(Service_BTM, "called"); - - R_RETURN(m_set_sys->SetBluetoothEnableFlag(true)); -} -Result IBtmSystemCore::DisableRadio() { - LOG_DEBUG(Service_BTM, "called"); - - R_RETURN(m_set_sys->SetBluetoothEnableFlag(false)); -} - -Result IBtmSystemCore::IsRadioEnabled(Out out_is_enabled) { - LOG_DEBUG(Service_BTM, "called"); - - R_RETURN(m_set_sys->GetBluetoothEnableFlag(out_is_enabled)); -} - -Result IBtmSystemCore::AcquireRadioEvent(Out out_is_valid, - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &radio_event->GetReadableEvent(); - R_SUCCEED(); -} - -Result IBtmSystemCore::GetDiscoveredAudioDevice(OutArray, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out out_total) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - R_SUCCEED(); -} - -Result IBtmSystemCore::AcquireAudioDeviceConnectionEvent( - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_event = &audio_device_connection_event->GetReadableEvent(); - R_SUCCEED(); -} - -Result IBtmSystemCore::GetConnectedAudioDevices( - Out out_count, OutArray, BufferAttr_HipcPointer> out_audio_devices) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_count = 0; - R_SUCCEED(); -} - -Result IBtmSystemCore::GetPairedAudioDevices( - Out out_count, OutArray, BufferAttr_HipcPointer> out_audio_devices) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_count = 0; - R_SUCCEED(); -} - -Result IBtmSystemCore::RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) { - LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid); - R_SUCCEED(); -} - -Result IBtmSystemCore::CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) { - LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid); - R_SUCCEED(); -} - -} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_system_core.h b/src/core/hle/service/btm/btm_system_core.h deleted file mode 100644 index 3fc4c0d56c..0000000000 --- a/src/core/hle/service/btm/btm_system_core.h +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/kernel_helpers.h" -#include "core/hle/service/service.h" - -namespace Kernel { -class KEvent; -class KReadableEvent; -} // namespace Kernel - -namespace Core { -class System; -} - -namespace Service::Set { -class ISystemSettingsServer; -} - -namespace Service::BTM { - -class IBtmSystemCore final : public ServiceFramework { -public: - explicit IBtmSystemCore(Core::System& system_); - ~IBtmSystemCore() override; - -private: - Result StartGamepadPairing(); - Result CancelGamepadPairing(); - Result EnableRadio(); - Result DisableRadio(); - Result IsRadioEnabled(Out out_is_enabled); - - Result AcquireRadioEvent(Out out_is_valid, OutCopyHandle out_event); - Result GetDiscoveredAudioDevice(OutArray, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out out_total); - Result AcquireAudioDeviceConnectionEvent(OutCopyHandle out_event); - - Result GetConnectedAudioDevices( - Out out_count, - OutArray, BufferAttr_HipcPointer> out_audio_devices); - - Result GetPairedAudioDevices( - Out out_count, - OutArray, BufferAttr_HipcPointer> out_audio_devices); - - Result RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid); - Result CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid); - - KernelHelpers::ServiceContext service_context; - - Kernel::KEvent* radio_event; - Kernel::KEvent* audio_device_connection_event; - std::shared_ptr m_set_sys; -}; - -} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_user.cpp b/src/core/hle/service/btm/btm_user.cpp deleted file mode 100644 index c380c573fa..0000000000 --- a/src/core/hle/service/btm/btm_user.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "common/logging.h" -#include "core/hle/service/btm/btm_user.h" -#include "core/hle/service/btm/btm_user_core.h" -#include "core/hle/service/cmif_serialization.h" - -namespace Service::BTM { - -IBtmUser::IBtmUser(Core::System& system_) : ServiceFramework{system_, "btm:u"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&IBtmUser::GetCore>, "GetCore"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -IBtmUser::~IBtmUser() = default; - -Result IBtmUser::GetCore(OutInterface out_interface) { - LOG_WARNING(Service_BTM, "called"); - - *out_interface = std::make_shared(system); - R_SUCCEED(); -} - -} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_user.h b/src/core/hle/service/btm/btm_user.h deleted file mode 100644 index d9ee5db455..0000000000 --- a/src/core/hle/service/btm/btm_user.h +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Core { -class System; -} - -namespace Service::BTM { -class IBtmUserCore; - -class IBtmUser final : public ServiceFramework { -public: - explicit IBtmUser(Core::System& system_); - ~IBtmUser() override; - -private: - Result GetCore(OutInterface out_interface); -}; - -} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_user_core.cpp b/src/core/hle/service/btm/btm_user_core.cpp deleted file mode 100644 index b120df14c0..0000000000 --- a/src/core/hle/service/btm/btm_user_core.cpp +++ /dev/null @@ -1,106 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#include - -#include "common/logging.h" -#include "core/core.h" -#include "core/hle/kernel/k_event.h" -#include "core/hle/service/btm/btm_user_core.h" -#include "core/hle/service/cmif_serialization.h" - -namespace Service::BTM { - -IBtmUserCore::IBtmUserCore(Core::System& system_) - : ServiceFramework{system_, "IBtmUserCore"}, service_context{system_, "IBtmUserCore"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&IBtmUserCore::AcquireBleScanEvent>, "AcquireBleScanEvent"}, - {1, nullptr, "GetBleScanFilterParameter"}, - {2, nullptr, "GetBleScanFilterParameter2"}, - {3, nullptr, "StartBleScanForGeneral"}, - {4, nullptr, "StopBleScanForGeneral"}, - {5, nullptr, "GetBleScanResultsForGeneral"}, - {6, nullptr, "StartBleScanForPaired"}, - {7, nullptr, "StopBleScanForPaired"}, - {8, nullptr, "StartBleScanForSmartDevice"}, - {9, nullptr, "StopBleScanForSmartDevice"}, - {10, nullptr, "GetBleScanResultsForSmartDevice"}, - {17, C<&IBtmUserCore::AcquireBleConnectionEvent>, "AcquireBleConnectionEvent"}, - {18, nullptr, "BleConnect"}, - {19, nullptr, "BleDisconnect"}, - {20, nullptr, "BleGetConnectionState"}, - {21, nullptr, "AcquireBlePairingEvent"}, - {22, nullptr, "BlePairDevice"}, - {23, nullptr, "BleUnPairDevice"}, - {24, nullptr, "BleUnPairDevice2"}, - {25, nullptr, "BleGetPairedDevices"}, - {26, C<&IBtmUserCore::AcquireBleServiceDiscoveryEvent>, "AcquireBleServiceDiscoveryEvent"}, - {27, nullptr, "GetGattServices"}, - {28, nullptr, "GetGattService"}, - {29, nullptr, "GetGattIncludedServices"}, - {30, nullptr, "GetBelongingGattService"}, - {31, nullptr, "GetGattCharacteristics"}, - {32, nullptr, "GetGattDescriptors"}, - {33, C<&IBtmUserCore::AcquireBleMtuConfigEvent>, "AcquireBleMtuConfigEvent"}, - {34, nullptr, "ConfigureBleMtu"}, - {35, nullptr, "GetBleMtu"}, - {36, nullptr, "RegisterBleGattDataPath"}, - {37, nullptr, "UnregisterBleGattDataPath"}, - }; - // clang-format on - RegisterHandlers(functions); - - scan_event = service_context.CreateEvent("IBtmUserCore:ScanEvent"); - connection_event = service_context.CreateEvent("IBtmUserCore:ConnectionEvent"); - service_discovery_event = service_context.CreateEvent("IBtmUserCore:DiscoveryEvent"); - config_event = service_context.CreateEvent("IBtmUserCore:ConfigEvent"); -} - -IBtmUserCore::~IBtmUserCore() { - service_context.CloseEvent(scan_event); - service_context.CloseEvent(connection_event); - service_context.CloseEvent(service_discovery_event); - service_context.CloseEvent(config_event); -} - -Result IBtmUserCore::AcquireBleScanEvent(Out out_is_valid, - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &scan_event->GetReadableEvent(); - R_SUCCEED(); -} - -Result IBtmUserCore::AcquireBleConnectionEvent(Out out_is_valid, - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &connection_event->GetReadableEvent(); - R_SUCCEED(); -} - -Result IBtmUserCore::AcquireBleServiceDiscoveryEvent( - Out out_is_valid, OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &service_discovery_event->GetReadableEvent(); - R_SUCCEED(); -} - -Result IBtmUserCore::AcquireBleMtuConfigEvent(Out out_is_valid, - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &config_event->GetReadableEvent(); - R_SUCCEED(); -} - -} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_user_core.h b/src/core/hle/service/btm/btm_user_core.h deleted file mode 100644 index dc0a22e810..0000000000 --- a/src/core/hle/service/btm/btm_user_core.h +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/kernel_helpers.h" -#include "core/hle/service/service.h" - -namespace Kernel { -class KEvent; -class KReadableEvent; -} // namespace Kernel - -namespace Core { -class System; -} - -namespace Service::BTM { - -class IBtmUserCore final : public ServiceFramework { -public: - explicit IBtmUserCore(Core::System& system_); - ~IBtmUserCore() override; - -private: - Result AcquireBleScanEvent(Out out_is_valid, - OutCopyHandle out_event); - - Result AcquireBleConnectionEvent(Out out_is_valid, - OutCopyHandle out_event); - - Result AcquireBleServiceDiscoveryEvent(Out out_is_valid, - OutCopyHandle out_event); - - Result AcquireBleMtuConfigEvent(Out out_is_valid, - OutCopyHandle out_event); - - KernelHelpers::ServiceContext service_context; - - Kernel::KEvent* scan_event; - Kernel::KEvent* connection_event; - Kernel::KEvent* service_discovery_event; - Kernel::KEvent* config_event; -}; - -} // namespace Service::BTM diff --git a/src/core/hle/service/caps/caps.cpp b/src/core/hle/service/caps/caps.cpp index f07fbd2185..6cc37999f3 100644 --- a/src/core/hle/service/caps/caps.cpp +++ b/src/core/hle/service/caps/caps.cpp @@ -5,7 +5,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "core/hle/service/caps/caps.h" -#include "core/hle/service/caps/caps_a.h" #include "core/hle/service/caps/caps_c.h" #include "core/hle/service/caps/caps_manager.h" #include "core/hle/service/caps/caps_sc.h" @@ -14,24 +13,223 @@ #include "core/hle/service/caps/caps_u.h" #include "core/hle/service/server_manager.h" #include "core/hle/service/service.h" +#include "common/logging.h" #include "frontend_common/firmware_manager.h" +#include "core/hle/service/caps/caps_result.h" +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/ipc_helpers.h" namespace Service::Capture { class IDecoderControlService final : public ServiceFramework { public: - explicit IDecoderControlService(Core::System& system_) : ServiceFramework{system_, "grc:d"} { - // clang-format off - static const FunctionInfo functions[] = { - {3001, nullptr, "DecodeJpeg"}, - {4001, nullptr, "ShrinkJpeg"}, - {4002, nullptr, "ShrinkJpegEx"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit IDecoderControlService(Core::System& system_) : ServiceFramework{system_, "grc:d"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{3001, nullptr, "DecodeJpeg"}, + FunctionInfo{4001, nullptr, "ShrinkJpeg"}, + FunctionInfo{4002, nullptr, "ShrinkJpegEx"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; +class IAlbumAccessorService final : public ServiceFramework { +public: + explicit IAlbumAccessorService(Core::System& system_, std::shared_ptr album_manager) : ServiceFramework{system_, "caps:a"}, manager{album_manager} {} + ~IAlbumAccessorService() override = default; + + Result GetAlbumFileList( + Out out_count, AlbumStorage storage, + OutArray out_entries) { + LOG_INFO(Service_Capture, "called, storage={}", storage); + + const Result result = manager->GetAlbumFileList(out_entries, *out_count, storage, 0); + R_RETURN(TranslateResult(result)); + } + + Result DeleteAlbumFile(AlbumFileId file_id) { + LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}", + file_id.application_id, file_id.storage, file_id.type); + + const Result result = manager->DeleteAlbumFile(file_id); + R_RETURN(TranslateResult(result)); + } + + Result IsAlbumMounted(Out out_is_mounted, AlbumStorage storage) { + LOG_INFO(Service_Capture, "called, storage={}", storage); + + const Result result = manager->IsAlbumMounted(storage); + *out_is_mounted = result.IsSuccess(); + R_RETURN(TranslateResult(result)); + } + + Result Unknown18( + Out out_buffer_size, + OutArray out_buffer) { + LOG_WARNING(Service_Capture, "(STUBBED) called"); + *out_buffer_size = 0; + R_SUCCEED(); + } + + Result GetAlbumFileListEx0( + Out out_entries_size, AlbumStorage storage, u8 flags, + OutArray out_entries) { + LOG_INFO(Service_Capture, "called, storage={}, flags={}", storage, flags); + + const Result result = manager->GetAlbumFileList(out_entries, *out_entries_size, storage, flags); + R_RETURN(TranslateResult(result)); + } + + Result GetAutoSavingStorage(Out out_is_autosaving) { + LOG_WARNING(Service_Capture, "(STUBBED) called"); + + const Result result = manager->GetAutoSavingStorage(*out_is_autosaving); + R_RETURN(TranslateResult(result)); + } + + Result LoadAlbumScreenShotImageEx1( + const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, + OutLargeData out_image_output, + OutArray out_image, + OutArray out_buffer) { + LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}", + file_id.application_id, file_id.storage, file_id.type, decoder_options.flags); + + const Result result = + manager->LoadAlbumScreenShotImage(*out_image_output, out_image, file_id, decoder_options); + R_RETURN(TranslateResult(result)); + } + + Result LoadAlbumScreenShotThumbnailImageEx1( + const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, + OutLargeData out_image_output, + OutArray out_image, + OutArray out_buffer) { + LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}", + file_id.application_id, file_id.storage, file_id.type, decoder_options.flags); + + const Result result = manager->LoadAlbumScreenShotThumbnail(*out_image_output, out_image, + file_id, decoder_options); + R_RETURN(TranslateResult(result)); + } + + Result TranslateResult(Result in_result) { + if (in_result.IsSuccess()) { + return in_result; + } + + if ((in_result.raw & 0x3801ff) == ResultUnknown1024.raw) { + if (in_result.GetDescription() - 0x514 < 100) { + return ResultInvalidFileData; + } + if (in_result.GetDescription() - 0x5dc < 100) { + return ResultInvalidFileData; + } + + if (in_result.GetDescription() - 0x578 < 100) { + if (in_result == ResultFileCountLimit) { + return ResultUnknown22; + } + return ResultUnknown25; + } + + if (in_result.raw < ResultUnknown1801.raw) { + if (in_result == ResultUnknown1202) { + return ResultUnknown810; + } + if (in_result == ResultUnknown1203) { + return ResultUnknown810; + } + if (in_result == ResultUnknown1701) { + return ResultUnknown5; + } + } else if (in_result.raw < ResultUnknown1803.raw) { + if (in_result == ResultUnknown1801) { + return ResultUnknown5; + } + if (in_result == ResultUnknown1802) { + return ResultUnknown6; + } + } else { + if (in_result == ResultUnknown1803) { + return ResultUnknown7; + } + if (in_result == ResultUnknown1804) { + return ResultOutOfRange; + } + } + return ResultUnknown1024; + } + + if (in_result.GetModule() == ErrorModule::FS) { + if ((in_result.GetDescription() >> 0xc < 0x7d) || + (in_result.GetDescription() - 1000 < 2000) || + (((in_result.GetDescription() - 3000) >> 3) < 0x271)) { + // TODO: Translate FS error + return in_result; + } + } + + return in_result; + } + + Result GetAlbumAccessResultForDebug(Out out_result) { + LOG_WARNING(Service_Capture, "(STUBBED) called"); + *out_result = ResultSuccess; + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetAlbumFileCount"}, + FunctionInfo{1, C<&IAlbumAccessorService::GetAlbumFileList>, "GetAlbumFileList"}, + FunctionInfo{2, nullptr, "LoadAlbumFile"}, + FunctionInfo{3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"}, + FunctionInfo{4, nullptr, "StorageCopyAlbumFile"}, + FunctionInfo{5, C<&IAlbumAccessorService::IsAlbumMounted>, "IsAlbumMounted"}, + FunctionInfo{6, nullptr, "GetAlbumUsage"}, + FunctionInfo{7, nullptr, "GetAlbumFileSize"}, + FunctionInfo{8, nullptr, "LoadAlbumFileThumbnail"}, + FunctionInfo{9, nullptr, "LoadAlbumScreenShotImage"}, + FunctionInfo{10, nullptr, "LoadAlbumScreenShotThumbnailImage"}, + FunctionInfo{11, nullptr, "GetAlbumEntryFromApplicationAlbumEntry"}, + FunctionInfo{12, nullptr, "LoadAlbumScreenShotImageEx"}, + FunctionInfo{13, nullptr, "LoadAlbumScreenShotThumbnailImageEx"}, + FunctionInfo{14, nullptr, "LoadAlbumScreenShotImageEx0"}, + FunctionInfo{15, nullptr, "GetAlbumUsage3"}, + FunctionInfo{16, nullptr, "GetAlbumMountResult"}, + FunctionInfo{17, nullptr, "GetAlbumUsage16"}, + FunctionInfo{18, C<&IAlbumAccessorService::Unknown18>, "Unknown18"}, + FunctionInfo{19, nullptr, "Unknown19"}, + FunctionInfo{100, nullptr, "GetAlbumFileCountEx0"}, + FunctionInfo{101, C<&IAlbumAccessorService::GetAlbumFileListEx0>, "GetAlbumFileListEx0"}, + FunctionInfo{202, nullptr, "SaveEditedScreenShot"}, + FunctionInfo{301, nullptr, "GetLastThumbnail"}, + FunctionInfo{302, nullptr, "GetLastOverlayMovieThumbnail"}, + FunctionInfo{401, C<&IAlbumAccessorService::GetAutoSavingStorage>, "GetAutoSavingStorage"}, + FunctionInfo{501, nullptr, "GetRequiredStorageSpaceSizeToCopyAll"}, + FunctionInfo{1001, nullptr, "LoadAlbumScreenShotThumbnailImageEx0"}, + FunctionInfo{1002, C<&IAlbumAccessorService::LoadAlbumScreenShotImageEx1>, "LoadAlbumScreenShotImageEx1"}, + FunctionInfo{1003, C<&IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1>, "LoadAlbumScreenShotThumbnailImageEx1"}, + FunctionInfo{8001, nullptr, "ForceAlbumUnmounted"}, + FunctionInfo{8002, nullptr, "ResetAlbumMountStatus"}, + FunctionInfo{8011, nullptr, "RefreshAlbumCache"}, + FunctionInfo{8012, nullptr, "GetAlbumCache"}, + FunctionInfo{8013, nullptr, "GetAlbumCacheEx"}, + FunctionInfo{8021, nullptr, "GetAlbumEntryFromApplicationAlbumEntryAruid"}, + FunctionInfo{10011, nullptr, "SetInternalErrorConversionEnabled"}, + FunctionInfo{50000, nullptr, "LoadMakerNoteInfoForDebug"}, + FunctionInfo{50011, C<&IAlbumAccessorService::GetAlbumAccessResultForDebug>, "GetAlbumAccessResultForDebug"}, + FunctionInfo{60002, nullptr, "OpenAccessorSession"} + ); + + std::shared_ptr manager = nullptr; +}; + void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); auto album_manager = std::make_shared(system); diff --git a/src/core/hle/service/caps/caps_a.cpp b/src/core/hle/service/caps/caps_a.cpp deleted file mode 100644 index 8f561bfcdc..0000000000 --- a/src/core/hle/service/caps/caps_a.cpp +++ /dev/null @@ -1,211 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "common/logging.h" -#include "core/hle/service/caps/caps_a.h" -#include "core/hle/service/caps/caps_manager.h" -#include "core/hle/service/caps/caps_result.h" -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/ipc_helpers.h" - -namespace Service::Capture { - -IAlbumAccessorService::IAlbumAccessorService(Core::System& system_, - std::shared_ptr album_manager) - : ServiceFramework{system_, "caps:a"}, manager{album_manager} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetAlbumFileCount"}, - {1, C<&IAlbumAccessorService::GetAlbumFileList>, "GetAlbumFileList"}, - {2, nullptr, "LoadAlbumFile"}, - {3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"}, - {4, nullptr, "StorageCopyAlbumFile"}, - {5, C<&IAlbumAccessorService::IsAlbumMounted>, "IsAlbumMounted"}, - {6, nullptr, "GetAlbumUsage"}, - {7, nullptr, "GetAlbumFileSize"}, - {8, nullptr, "LoadAlbumFileThumbnail"}, - {9, nullptr, "LoadAlbumScreenShotImage"}, - {10, nullptr, "LoadAlbumScreenShotThumbnailImage"}, - {11, nullptr, "GetAlbumEntryFromApplicationAlbumEntry"}, - {12, nullptr, "LoadAlbumScreenShotImageEx"}, - {13, nullptr, "LoadAlbumScreenShotThumbnailImageEx"}, - {14, nullptr, "LoadAlbumScreenShotImageEx0"}, - {15, nullptr, "GetAlbumUsage3"}, - {16, nullptr, "GetAlbumMountResult"}, - {17, nullptr, "GetAlbumUsage16"}, - {18, C<&IAlbumAccessorService::Unknown18>, "Unknown18"}, - {19, nullptr, "Unknown19"}, - {100, nullptr, "GetAlbumFileCountEx0"}, - {101, C<&IAlbumAccessorService::GetAlbumFileListEx0>, "GetAlbumFileListEx0"}, - {202, nullptr, "SaveEditedScreenShot"}, - {301, nullptr, "GetLastThumbnail"}, - {302, nullptr, "GetLastOverlayMovieThumbnail"}, - {401, C<&IAlbumAccessorService::GetAutoSavingStorage>, "GetAutoSavingStorage"}, - {501, nullptr, "GetRequiredStorageSpaceSizeToCopyAll"}, - {1001, nullptr, "LoadAlbumScreenShotThumbnailImageEx0"}, - {1002, C<&IAlbumAccessorService::LoadAlbumScreenShotImageEx1>, "LoadAlbumScreenShotImageEx1"}, - {1003, C<&IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1>, "LoadAlbumScreenShotThumbnailImageEx1"}, - {8001, nullptr, "ForceAlbumUnmounted"}, - {8002, nullptr, "ResetAlbumMountStatus"}, - {8011, nullptr, "RefreshAlbumCache"}, - {8012, nullptr, "GetAlbumCache"}, - {8013, nullptr, "GetAlbumCacheEx"}, - {8021, nullptr, "GetAlbumEntryFromApplicationAlbumEntryAruid"}, - {10011, nullptr, "SetInternalErrorConversionEnabled"}, - {50000, nullptr, "LoadMakerNoteInfoForDebug"}, - {50011, C<&IAlbumAccessorService::GetAlbumAccessResultForDebug>, "GetAlbumAccessResultForDebug"}, - {60002, nullptr, "OpenAccessorSession"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -IAlbumAccessorService::~IAlbumAccessorService() = default; - -Result IAlbumAccessorService::GetAlbumFileList( - Out out_count, AlbumStorage storage, - OutArray out_entries) { - LOG_INFO(Service_Capture, "called, storage={}", storage); - - const Result result = manager->GetAlbumFileList(out_entries, *out_count, storage, 0); - R_RETURN(TranslateResult(result)); -} - -Result IAlbumAccessorService::DeleteAlbumFile(AlbumFileId file_id) { - LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}", - file_id.application_id, file_id.storage, file_id.type); - - const Result result = manager->DeleteAlbumFile(file_id); - R_RETURN(TranslateResult(result)); -} - -Result IAlbumAccessorService::IsAlbumMounted(Out out_is_mounted, AlbumStorage storage) { - LOG_INFO(Service_Capture, "called, storage={}", storage); - - const Result result = manager->IsAlbumMounted(storage); - *out_is_mounted = result.IsSuccess(); - R_RETURN(TranslateResult(result)); -} - -Result IAlbumAccessorService::Unknown18( - Out out_buffer_size, - OutArray out_buffer) { - LOG_WARNING(Service_Capture, "(STUBBED) called"); - *out_buffer_size = 0; - R_SUCCEED(); -} - -Result IAlbumAccessorService::GetAlbumFileListEx0( - Out out_entries_size, AlbumStorage storage, u8 flags, - OutArray out_entries) { - LOG_INFO(Service_Capture, "called, storage={}, flags={}", storage, flags); - - const Result result = manager->GetAlbumFileList(out_entries, *out_entries_size, storage, flags); - R_RETURN(TranslateResult(result)); -} - -Result IAlbumAccessorService::GetAutoSavingStorage(Out out_is_autosaving) { - LOG_WARNING(Service_Capture, "(STUBBED) called"); - - const Result result = manager->GetAutoSavingStorage(*out_is_autosaving); - R_RETURN(TranslateResult(result)); -} - -Result IAlbumAccessorService::LoadAlbumScreenShotImageEx1( - const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, - OutLargeData out_image_output, - OutArray out_image, - OutArray out_buffer) { - LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}", - file_id.application_id, file_id.storage, file_id.type, decoder_options.flags); - - const Result result = - manager->LoadAlbumScreenShotImage(*out_image_output, out_image, file_id, decoder_options); - R_RETURN(TranslateResult(result)); -} - -Result IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1( - const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, - OutLargeData out_image_output, - OutArray out_image, - OutArray out_buffer) { - LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}", - file_id.application_id, file_id.storage, file_id.type, decoder_options.flags); - - const Result result = manager->LoadAlbumScreenShotThumbnail(*out_image_output, out_image, - file_id, decoder_options); - R_RETURN(TranslateResult(result)); -} - -Result IAlbumAccessorService::TranslateResult(Result in_result) { - if (in_result.IsSuccess()) { - return in_result; - } - - if ((in_result.raw & 0x3801ff) == ResultUnknown1024.raw) { - if (in_result.GetDescription() - 0x514 < 100) { - return ResultInvalidFileData; - } - if (in_result.GetDescription() - 0x5dc < 100) { - return ResultInvalidFileData; - } - - if (in_result.GetDescription() - 0x578 < 100) { - if (in_result == ResultFileCountLimit) { - return ResultUnknown22; - } - return ResultUnknown25; - } - - if (in_result.raw < ResultUnknown1801.raw) { - if (in_result == ResultUnknown1202) { - return ResultUnknown810; - } - if (in_result == ResultUnknown1203) { - return ResultUnknown810; - } - if (in_result == ResultUnknown1701) { - return ResultUnknown5; - } - } else if (in_result.raw < ResultUnknown1803.raw) { - if (in_result == ResultUnknown1801) { - return ResultUnknown5; - } - if (in_result == ResultUnknown1802) { - return ResultUnknown6; - } - } else { - if (in_result == ResultUnknown1803) { - return ResultUnknown7; - } - if (in_result == ResultUnknown1804) { - return ResultOutOfRange; - } - } - return ResultUnknown1024; - } - - if (in_result.GetModule() == ErrorModule::FS) { - if ((in_result.GetDescription() >> 0xc < 0x7d) || - (in_result.GetDescription() - 1000 < 2000) || - (((in_result.GetDescription() - 3000) >> 3) < 0x271)) { - // TODO: Translate FS error - return in_result; - } - } - - return in_result; -} - - -Result IAlbumAccessorService::GetAlbumAccessResultForDebug(Out out_result) { - LOG_WARNING(Service_Capture, "(STUBBED) called"); - *out_result = ResultSuccess; - R_SUCCEED(); -} - -} // namespace Service::Capture diff --git a/src/core/hle/service/caps/caps_a.h b/src/core/hle/service/caps/caps_a.h deleted file mode 100644 index 1885ba6be0..0000000000 --- a/src/core/hle/service/caps/caps_a.h +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/caps/caps_types.h" -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Core { -class System; -} - -namespace Service::Capture { -class AlbumManager; - -class IAlbumAccessorService final : public ServiceFramework { -public: - explicit IAlbumAccessorService(Core::System& system_, - std::shared_ptr album_manager); - ~IAlbumAccessorService() override; - -private: - Result GetAlbumFileList(Out out_count, AlbumStorage storage, - OutArray out_entries); - - Result DeleteAlbumFile(AlbumFileId file_id); - - Result IsAlbumMounted(Out out_is_mounted, AlbumStorage storage); - - Result Unknown18( - Out out_buffer_size, - OutArray - out_buffer); - - Result GetAlbumFileListEx0(Out out_entries_size, AlbumStorage storage, u8 flags, - OutArray out_entries); - - Result GetAutoSavingStorage(Out out_is_autosaving); - - Result LoadAlbumScreenShotImageEx1( - const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, - OutLargeData out_image_output, - OutArray out_image, - OutArray out_buffer); - - Result LoadAlbumScreenShotThumbnailImageEx1( - const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, - OutLargeData out_image_output, - OutArray out_image, - OutArray out_buffer); - - Result TranslateResult(Result in_result); - - Result GetAlbumAccessResultForDebug(Out out_result); - - std::shared_ptr manager = nullptr; -}; - -} // namespace Service::Capture diff --git a/src/core/hle/service/caps/caps_c.cpp b/src/core/hle/service/caps/caps_c.cpp index 6c9f8e964d..c62c3cd5d3 100644 --- a/src/core/hle/service/caps/caps_c.cpp +++ b/src/core/hle/service/caps/caps_c.cpp @@ -14,34 +14,34 @@ namespace Service::Capture { +std::optional IAlbumControlService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, nullptr, "CaptureRawImage"}, + FunctionInfo{2, nullptr, "CaptureRawImageWithTimeout"}, + FunctionInfo{33, C<&IAlbumControlService::SetShimLibraryVersion>, "SetShimLibraryVersion"}, + FunctionInfo{1001, nullptr, "RequestTakingScreenShot"}, + FunctionInfo{1002, nullptr, "RequestTakingScreenShotWithTimeout"}, + FunctionInfo{1011, nullptr, "NotifyTakingScreenShotRefused"}, + FunctionInfo{2001, nullptr, "NotifyAlbumStorageIsAvailable"}, + FunctionInfo{2002, nullptr, "NotifyAlbumStorageIsUnavailable"}, + FunctionInfo{2011, nullptr, "RegisterAppletResourceUserId"}, + FunctionInfo{2012, nullptr, "UnregisterAppletResourceUserId"}, + FunctionInfo{2013, nullptr, "GetApplicationIdFromAruid"}, + FunctionInfo{2014, nullptr, "CheckApplicationIdRegistered"}, + FunctionInfo{2101, nullptr, "GenerateCurrentAlbumFileId"}, + FunctionInfo{2102, nullptr, "GenerateApplicationAlbumEntry"}, + FunctionInfo{2201, nullptr, "SaveAlbumScreenShotFile"}, + FunctionInfo{2202, nullptr, "SaveAlbumScreenShotFileEx"}, + FunctionInfo{2301, nullptr, "SetOverlayScreenShotThumbnailData"}, + FunctionInfo{2302, nullptr, "SetOverlayMovieThumbnailData"}, + FunctionInfo{60001, nullptr, "OpenControlSession"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IAlbumControlService::IAlbumControlService(Core::System& system_, std::shared_ptr album_manager) : ServiceFramework{system_, "caps:c"}, manager{album_manager} { - // clang-format off - static const FunctionInfo functions[] = { - {1, nullptr, "CaptureRawImage"}, - {2, nullptr, "CaptureRawImageWithTimeout"}, - {33, C<&IAlbumControlService::SetShimLibraryVersion>, "SetShimLibraryVersion"}, - {1001, nullptr, "RequestTakingScreenShot"}, - {1002, nullptr, "RequestTakingScreenShotWithTimeout"}, - {1011, nullptr, "NotifyTakingScreenShotRefused"}, - {2001, nullptr, "NotifyAlbumStorageIsAvailable"}, - {2002, nullptr, "NotifyAlbumStorageIsUnavailable"}, - {2011, nullptr, "RegisterAppletResourceUserId"}, - {2012, nullptr, "UnregisterAppletResourceUserId"}, - {2013, nullptr, "GetApplicationIdFromAruid"}, - {2014, nullptr, "CheckApplicationIdRegistered"}, - {2101, nullptr, "GenerateCurrentAlbumFileId"}, - {2102, nullptr, "GenerateApplicationAlbumEntry"}, - {2201, nullptr, "SaveAlbumScreenShotFile"}, - {2202, nullptr, "SaveAlbumScreenShotFileEx"}, - {2301, nullptr, "SetOverlayScreenShotThumbnailData"}, - {2302, nullptr, "SetOverlayMovieThumbnailData"}, - {60001, nullptr, "OpenControlSession"}, - }; - // clang-format on - - RegisterHandlers(functions); } IAlbumControlService::~IAlbumControlService() = default; diff --git a/src/core/hle/service/caps/caps_c.h b/src/core/hle/service/caps/caps_c.h index 0ecdfa1147..a1f19bbfc3 100644 --- a/src/core/hle/service/caps/caps_c.h +++ b/src/core/hle/service/caps/caps_c.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -16,14 +19,11 @@ enum class ShimLibraryVersion : u64; class IAlbumControlService final : public ServiceFramework { public: - explicit IAlbumControlService(Core::System& system_, - std::shared_ptr album_manager); + explicit IAlbumControlService(Core::System& system_, std::shared_ptr album_manager); ~IAlbumControlService() override; - private: - Result SetShimLibraryVersion(ShimLibraryVersion library_version, - ClientAppletResourceUserId aruid); - + Result SetShimLibraryVersion(ShimLibraryVersion library_version, ClientAppletResourceUserId aruid); + std::optional FindRequest(u32 key) override; std::shared_ptr manager = nullptr; }; diff --git a/src/core/hle/service/caps/caps_sc.cpp b/src/core/hle/service/caps/caps_sc.cpp index 6117cb7c6c..59119d8ed7 100644 --- a/src/core/hle/service/caps/caps_sc.cpp +++ b/src/core/hle/service/caps/caps_sc.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,32 +10,6 @@ namespace Service::Capture { IScreenShotControlService::IScreenShotControlService(Core::System& system_) : ServiceFramework{system_, "caps:sc"} { - // clang-format off - static const FunctionInfo functions[] = { - {1, nullptr, "CaptureRawImage"}, - {2, nullptr, "CaptureRawImageWithTimeout"}, - {3, nullptr, "AttachSharedBuffer"}, - {5, nullptr, "CaptureRawImageToAttachedSharedBuffer"}, - {210, nullptr, "Unknown210"}, - {1001, nullptr, "RequestTakingScreenShot"}, - {1002, nullptr, "RequestTakingScreenShotWithTimeout"}, - {1003, nullptr, "RequestTakingScreenShotEx"}, - {1004, nullptr, "RequestTakingScreenShotEx1"}, - {1009, nullptr, "CancelTakingScreenShot"}, - {1010, nullptr, "SetTakingScreenShotCancelState"}, - {1011, nullptr, "NotifyTakingScreenShotRefused"}, - {1012, nullptr, "NotifyTakingScreenShotFailed"}, - {1101, nullptr, "SetupOverlayMovieThumbnail"}, - {1106, nullptr, "Unknown1106"}, - {1107, nullptr, "Unknown1107"}, - {1201, nullptr, "OpenRawScreenShotReadStream"}, - {1202, nullptr, "CloseRawScreenShotReadStream"}, - {1203, nullptr, "ReadRawScreenShotReadStream"}, - {1204, nullptr, "Unknown1204"}, - }; - // clang-format on - - RegisterHandlers(functions); } IScreenShotControlService::~IScreenShotControlService() = default; diff --git a/src/core/hle/service/caps/caps_sc.h b/src/core/hle/service/caps/caps_sc.h index d555f49792..422f062e59 100644 --- a/src/core/hle/service/caps/caps_sc.h +++ b/src/core/hle/service/caps/caps_sc.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,6 +18,32 @@ class IScreenShotControlService final : public ServiceFramework FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, nullptr, "CaptureRawImage"}, + FunctionInfo{2, nullptr, "CaptureRawImageWithTimeout"}, + FunctionInfo{3, nullptr, "AttachSharedBuffer"}, + FunctionInfo{5, nullptr, "CaptureRawImageToAttachedSharedBuffer"}, + FunctionInfo{210, nullptr, "Unknown210"}, + FunctionInfo{1001, nullptr, "RequestTakingScreenShot"}, + FunctionInfo{1002, nullptr, "RequestTakingScreenShotWithTimeout"}, + FunctionInfo{1003, nullptr, "RequestTakingScreenShotEx"}, + FunctionInfo{1004, nullptr, "RequestTakingScreenShotEx1"}, + FunctionInfo{1009, nullptr, "CancelTakingScreenShot"}, + FunctionInfo{1010, nullptr, "SetTakingScreenShotCancelState"}, + FunctionInfo{1011, nullptr, "NotifyTakingScreenShotRefused"}, + FunctionInfo{1012, nullptr, "NotifyTakingScreenShotFailed"}, + FunctionInfo{1101, nullptr, "SetupOverlayMovieThumbnail"}, + FunctionInfo{1106, nullptr, "Unknown1106"}, + FunctionInfo{1107, nullptr, "Unknown1107"}, + FunctionInfo{1201, nullptr, "OpenRawScreenShotReadStream"}, + FunctionInfo{1202, nullptr, "CloseRawScreenShotReadStream"}, + FunctionInfo{1203, nullptr, "ReadRawScreenShotReadStream"}, + FunctionInfo{1204, nullptr, "Unknown1204"} + ); }; } // namespace Service::Capture diff --git a/src/core/hle/service/caps/caps_ss.cpp b/src/core/hle/service/caps/caps_ss.cpp index 0cd641f551..0c444116b7 100644 --- a/src/core/hle/service/caps/caps_ss.cpp +++ b/src/core/hle/service/caps/caps_ss.cpp @@ -12,22 +12,22 @@ namespace Service::Capture { +std::optional IScreenShotService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{201, nullptr, "SaveScreenShot"}, + FunctionInfo{202, nullptr, "SaveEditedScreenShot"}, + FunctionInfo{203, C<&IScreenShotService::SaveScreenShotEx0>, "SaveScreenShotEx0"}, + FunctionInfo{204, nullptr, "SaveEditedScreenShotEx0"}, + FunctionInfo{206, C<&IScreenShotService::SaveEditedScreenShotEx1>, "SaveEditedScreenShotEx1"}, + FunctionInfo{208, nullptr, "SaveScreenShotOfMovieEx1"}, + FunctionInfo{1000, nullptr, "Unknown1000"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IScreenShotService::IScreenShotService(Core::System& system_, std::shared_ptr album_manager) : ServiceFramework{system_, "caps:ss"}, manager{album_manager} { - // clang-format off - static const FunctionInfo functions[] = { - {201, nullptr, "SaveScreenShot"}, - {202, nullptr, "SaveEditedScreenShot"}, - {203, C<&IScreenShotService::SaveScreenShotEx0>, "SaveScreenShotEx0"}, - {204, nullptr, "SaveEditedScreenShotEx0"}, - {206, C<&IScreenShotService::SaveEditedScreenShotEx1>, "SaveEditedScreenShotEx1"}, - {208, nullptr, "SaveScreenShotOfMovieEx1"}, - {1000, nullptr, "Unknown1000"}, - }; - // clang-format on - - RegisterHandlers(functions); } IScreenShotService::~IScreenShotService() = default; diff --git a/src/core/hle/service/caps/caps_ss.h b/src/core/hle/service/caps/caps_ss.h index da4b4cc5fc..8817637fb8 100644 --- a/src/core/hle/service/caps/caps_ss.h +++ b/src/core/hle/service/caps/caps_ss.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -34,6 +37,7 @@ private: const InBuffer thumbnail_image_data_buffer); + std::optional FindRequest(u32 key) override; std::shared_ptr manager; }; diff --git a/src/core/hle/service/caps/caps_su.cpp b/src/core/hle/service/caps/caps_su.cpp index 4ecfc840e4..e708ddbb68 100644 --- a/src/core/hle/service/caps/caps_su.cpp +++ b/src/core/hle/service/caps/caps_su.cpp @@ -15,20 +15,20 @@ namespace Service::Capture { +std::optional IScreenShotApplicationService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{32, C<&IScreenShotApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"}, + FunctionInfo{201, nullptr, "SaveScreenShot"}, + FunctionInfo{203, C<&IScreenShotApplicationService::SaveScreenShotEx0>, "SaveScreenShotEx0"}, + FunctionInfo{205, C<&IScreenShotApplicationService::SaveScreenShotEx1>, "SaveScreenShotEx1"}, + FunctionInfo{210, nullptr, "SaveScreenShotEx2"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IScreenShotApplicationService::IScreenShotApplicationService( Core::System& system_, std::shared_ptr album_manager) : ServiceFramework{system_, "caps:su"}, manager{album_manager} { - // clang-format off - static const FunctionInfo functions[] = { - {32, C<&IScreenShotApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"}, - {201, nullptr, "SaveScreenShot"}, - {203, C<&IScreenShotApplicationService::SaveScreenShotEx0>, "SaveScreenShotEx0"}, - {205, C<&IScreenShotApplicationService::SaveScreenShotEx1>, "SaveScreenShotEx1"}, - {210, nullptr, "SaveScreenShotEx2"}, - }; - // clang-format on - - RegisterHandlers(functions); } IScreenShotApplicationService::~IScreenShotApplicationService() = default; diff --git a/src/core/hle/service/caps/caps_su.h b/src/core/hle/service/caps/caps_su.h index 4b4cbd09e6..0fdc994a25 100644 --- a/src/core/hle/service/caps/caps_su.h +++ b/src/core/hle/service/caps/caps_su.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -42,8 +45,8 @@ private: const InBuffer image_data_buffer); + std::optional FindRequest(u32 key) override; std::array image_data; - std::shared_ptr manager; }; diff --git a/src/core/hle/service/caps/caps_u.cpp b/src/core/hle/service/caps/caps_u.cpp index 6472b2bac6..c1fa418e03 100644 --- a/src/core/hle/service/caps/caps_u.cpp +++ b/src/core/hle/service/caps/caps_u.cpp @@ -13,29 +13,29 @@ namespace Service::Capture { +std::optional IAlbumApplicationService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{32, C<&IAlbumApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"}, + FunctionInfo{102, C<&IAlbumApplicationService::GetAlbumFileList0AafeAruidDeprecated>, "GetAlbumFileList0AafeAruidDeprecated"}, + FunctionInfo{103, nullptr, "DeleteAlbumFileByAruid"}, + FunctionInfo{104, nullptr, "GetAlbumFileSizeByAruid"}, + FunctionInfo{105, nullptr, "DeleteAlbumFileByAruidForDebug"}, + FunctionInfo{110, nullptr, "LoadAlbumScreenShotImageByAruid"}, + FunctionInfo{120, nullptr, "LoadAlbumScreenShotThumbnailImageByAruid"}, + FunctionInfo{130, nullptr, "PrecheckToCreateContentsByAruid"}, + FunctionInfo{140, nullptr, "GetAlbumFileList1AafeAruidDeprecated"}, + FunctionInfo{141, nullptr, "GetAlbumFileList2AafeUidAruidDeprecated"}, + FunctionInfo{142, C<&IAlbumApplicationService::GetAlbumFileList3AaeAruid>, "GetAlbumFileList3AaeAruid"}, + FunctionInfo{143, nullptr, "GetAlbumFileList4AaeUidAruid"}, + FunctionInfo{144, nullptr, "GetAllAlbumFileList3AaeAruid"}, + FunctionInfo{60002, nullptr, "OpenAccessorSessionForApplication"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IAlbumApplicationService::IAlbumApplicationService(Core::System& system_, std::shared_ptr album_manager) : ServiceFramework{system_, "caps:u"}, manager{album_manager} { - // clang-format off - static const FunctionInfo functions[] = { - {32, C<&IAlbumApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"}, - {102, C<&IAlbumApplicationService::GetAlbumFileList0AafeAruidDeprecated>, "GetAlbumFileList0AafeAruidDeprecated"}, - {103, nullptr, "DeleteAlbumFileByAruid"}, - {104, nullptr, "GetAlbumFileSizeByAruid"}, - {105, nullptr, "DeleteAlbumFileByAruidForDebug"}, - {110, nullptr, "LoadAlbumScreenShotImageByAruid"}, - {120, nullptr, "LoadAlbumScreenShotThumbnailImageByAruid"}, - {130, nullptr, "PrecheckToCreateContentsByAruid"}, - {140, nullptr, "GetAlbumFileList1AafeAruidDeprecated"}, - {141, nullptr, "GetAlbumFileList2AafeUidAruidDeprecated"}, - {142, C<&IAlbumApplicationService::GetAlbumFileList3AaeAruid>, "GetAlbumFileList3AaeAruid"}, - {143, nullptr, "GetAlbumFileList4AaeUidAruid"}, - {144, nullptr, "GetAllAlbumFileList3AaeAruid"}, - {60002, nullptr, "OpenAccessorSessionForApplication"}, - }; - // clang-format on - - RegisterHandlers(functions); } IAlbumApplicationService::~IAlbumApplicationService() = default; diff --git a/src/core/hle/service/caps/caps_u.h b/src/core/hle/service/caps/caps_u.h index 023ee1fe79..52e151bbe2 100644 --- a/src/core/hle/service/caps/caps_u.h +++ b/src/core/hle/service/caps/caps_u.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -33,6 +36,7 @@ private: AlbumFileDateTime end_date_time, ClientAppletResourceUserId aruid, OutArray out_entries); + std::optional FindRequest(u32 key) override; std::shared_ptr manager = nullptr; }; diff --git a/src/core/hle/service/erpt/erpt.cpp b/src/core/hle/service/erpt/erpt.cpp index 014f1da62f..7bed893bd7 100644 --- a/src/core/hle/service/erpt/erpt.cpp +++ b/src/core/hle/service/erpt/erpt.cpp @@ -17,30 +17,10 @@ namespace Service::ERPT { class ErrorReportContext final : public ServiceFramework { public: - explicit ErrorReportContext(Core::System& system_) : ServiceFramework{system_, "erpt:c"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&ErrorReportContext::SubmitContext>, "SubmitContext"}, - {1, C<&ErrorReportContext::CreateReportV0>, "CreateReportV0"}, - {2, nullptr, "SetInitialLaunchSettingsCompletionTime"}, - {3, nullptr, "ClearInitialLaunchSettingsCompletionTime"}, - {4, nullptr, "UpdatePowerOnTime"}, - {5, D<&ErrorReportContext::UpdateAwakeTime>, "UpdateAwakeTime"}, - {6, nullptr, "SubmitMultipleCategoryContext"}, - {7, nullptr, "UpdateApplicationLaunchTime"}, - {8, nullptr, "ClearApplicationLaunchTime"}, - {9, nullptr, "SubmitAttachment"}, - {10, nullptr, "CreateReportWithAttachments"}, - {11, C<&ErrorReportContext::CreateReportV1>, "CreateReportV1"}, - {12, C<&ErrorReportContext::CreateReport>, "CreateReport"}, - {20, nullptr, "RegisterRunningApplet"}, - {21, nullptr, "UnregisterRunningApplet"}, - {22, nullptr, "UpdateAppletSuspendedDuration"}, - {30, nullptr, "InvalidateForcedShutdownDetection"}, - }; - // clang-format on + explicit ErrorReportContext(Core::System& system_) : ServiceFramework{system_, "erpt:c"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -85,21 +65,41 @@ private: data_a.size(), data_b.size(), flag_a, flag_b); R_SUCCEED(); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&ErrorReportContext::SubmitContext>, "SubmitContext"}, + FunctionInfo{1, C<&ErrorReportContext::CreateReportV0>, "CreateReportV0"}, + FunctionInfo{2, nullptr, "SetInitialLaunchSettingsCompletionTime"}, + FunctionInfo{3, nullptr, "ClearInitialLaunchSettingsCompletionTime"}, + FunctionInfo{4, nullptr, "UpdatePowerOnTime"}, + FunctionInfo{5, D<&ErrorReportContext::UpdateAwakeTime>, "UpdateAwakeTime"}, + FunctionInfo{6, nullptr, "SubmitMultipleCategoryContext"}, + FunctionInfo{7, nullptr, "UpdateApplicationLaunchTime"}, + FunctionInfo{8, nullptr, "ClearApplicationLaunchTime"}, + FunctionInfo{9, nullptr, "SubmitAttachment"}, + FunctionInfo{10, nullptr, "CreateReportWithAttachments"}, + FunctionInfo{11, C<&ErrorReportContext::CreateReportV1>, "CreateReportV1"}, + FunctionInfo{12, C<&ErrorReportContext::CreateReport>, "CreateReport"}, + FunctionInfo{20, nullptr, "RegisterRunningApplet"}, + FunctionInfo{21, nullptr, "UnregisterRunningApplet"}, + FunctionInfo{22, nullptr, "UpdateAppletSuspendedDuration"}, + FunctionInfo{30, nullptr, "InvalidateForcedShutdownDetection"} + ); }; class ErrorReportSession final : public ServiceFramework { public: - explicit ErrorReportSession(Core::System& system_) : ServiceFramework{system_, "erpt:r"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "OpenReport"}, - {1, nullptr, "OpenManager"}, - {2, nullptr, "OpenAttachment"}, - }; - // clang-format on + explicit ErrorReportSession(Core::System& system_) : ServiceFramework{system_, "erpt:r"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "OpenReport"}, + FunctionInfo{1, nullptr, "OpenManager"}, + FunctionInfo{2, nullptr, "OpenAttachment"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/es/es.cpp b/src/core/hle/service/es/es.cpp index 432783f96e..01d11183c9 100644 --- a/src/core/hle/service/es/es.cpp +++ b/src/core/hle/service/es/es.cpp @@ -19,110 +19,14 @@ constexpr Result ERROR_INVALID_RIGHTS_ID{ErrorModule::ETicket, 3}; class ETicket final : public ServiceFramework { public: explicit ETicket(Core::System& system_) : ServiceFramework{system_, "es"} { - // clang-format off - static const FunctionInfo functions[] = { - {1, &ETicket::ImportTicket, "ImportTicket"}, - {2, nullptr, "ImportTicketCertificateSet"}, - {3, nullptr, "DeleteTicket"}, - {4, nullptr, "DeletePersonalizedTicket"}, - {5, nullptr, "DeleteAllCommonTicket"}, - {6, nullptr, "DeleteAllPersonalizedTicket"}, - {7, nullptr, "DeleteAllPersonalizedTicketEx"}, - {8, &ETicket::GetTitleKey, "GetTitleKey"}, - {9, &ETicket::CountCommonTicket, "CountCommonTicket"}, - {10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"}, - {11, &ETicket::ListCommonTicketRightsIds, "ListCommonTicketRightsIds"}, - {12, &ETicket::ListPersonalizedTicketRightsIds, "ListPersonalizedTicketRightsIds"}, - {13, nullptr, "ListMissingPersonalizedTicket"}, - {14, &ETicket::GetCommonTicketSize, "GetCommonTicketSize"}, - {15, &ETicket::GetPersonalizedTicketSize, "GetPersonalizedTicketSize"}, - {16, &ETicket::GetCommonTicketData, "GetCommonTicketData"}, - {17, &ETicket::GetPersonalizedTicketData, "GetPersonalizedTicketData"}, - {18, nullptr, "OwnTicket"}, - {19, nullptr, "GetTicketInfo"}, - {20, nullptr, "ListLightTicketInfo"}, - {21, nullptr, "SignData"}, - {22, nullptr, "GetCommonTicketAndCertificateSize"}, - {23, nullptr, "GetCommonTicketAndCertificateData"}, - {24, nullptr, "ImportPrepurchaseRecord"}, - {25, nullptr, "DeletePrepurchaseRecord"}, - {26, nullptr, "DeleteAllPrepurchaseRecord"}, - {27, nullptr, "CountPrepurchaseRecord"}, - {28, nullptr, "ListPrepurchaseRecordRightsIds"}, - {29, nullptr, "ListPrepurchaseRecordInfo"}, - {30, nullptr, "CountTicket"}, - {31, nullptr, "ListTicketRightsIds"}, - {32, nullptr, "CountPrepurchaseRecordEx"}, - {33, nullptr, "ListPrepurchaseRecordRightsIdsEx"}, - {34, nullptr, "GetEncryptedTicketSize"}, - {35, nullptr, "GetEncryptedTicketData"}, - {36, nullptr, "DeleteAllInactiveELicenseRequiredPersonalizedTicket"}, - {37, nullptr, "OwnTicket2"}, - {38, nullptr, "OwnTicket3"}, - {39, nullptr, "DeleteAllInactivePersonalizedTicket"}, - {40, nullptr, "DeletePrepurchaseRecordByNintendoAccountId"}, - {101, nullptr, "Unknown101"}, //18.0.0+ - {102, nullptr, "Unknown102"}, //18.0.0+ - {103, nullptr, "Unknown103"}, //18.0.0+ - {104, nullptr, "Unknown104"}, //18.0.0+ - {105, nullptr, "Unknown105"}, //20.0.0+ - {201, nullptr, "Unknown201"}, //18.0.0+ - {202, nullptr, "Unknown202"}, //18.0.0+ - {203, nullptr, "Unknown203"}, //18.0.0+ - {204, nullptr, "Unknown204"}, //18.0.0+ - {205, nullptr, "Unknown205"}, //18.0.0+ - {501, nullptr, "Unknown501"}, - {502, nullptr, "Unknown502"}, - {503, nullptr, "GetTitleKey"}, - {504, nullptr, "Unknown504"}, - {508, nullptr, "Unknown508"}, - {509, nullptr, "Unknown509"}, - {510, nullptr, "Unknown510"}, - {511, nullptr, "Unknown511"}, - {1001, nullptr, "Unknown1001"}, - {1002, nullptr, "Unknown1001"}, - {1003, nullptr, "Unknown1003"}, - {1004, nullptr, "Unknown1004"}, - {1005, nullptr, "Unknown1005"}, - {1006, nullptr, "Unknown1006"}, - {1007, nullptr, "Unknown1007"}, - {1009, nullptr, "Unknown1009"}, - {1010, nullptr, "Unknown1010"}, - {1011, nullptr, "Unknown1011"}, - {1012, nullptr, "Unknown1012"}, - {1013, nullptr, "Unknown1013"}, - {1014, nullptr, "Unknown1014"}, - {1015, nullptr, "Unknown1015"}, - {1016, nullptr, "Unknown1016"}, - {1017, nullptr, "Unknown1017"}, - {1018, nullptr, "Unknown1018"}, - {1019, nullptr, "Unknown1019"}, - {1020, nullptr, "Unknown1020"}, - {1021, nullptr, "Unknown1021"}, - {1501, nullptr, "Unknown1501"}, - {1502, nullptr, "Unknown1502"}, - {1503, nullptr, "Unknown1503"}, - {1504, nullptr, "Unknown1504"}, - {1505, nullptr, "Unknown1505"}, - {1506, nullptr, "Unknown1506"}, - {2000, nullptr, "Unknown2000"}, - {2001, nullptr, "Unknown2001"}, - {2002, nullptr, "Unknown2002"}, - {2003, nullptr, "Unknown2003"}, - {2100, nullptr, "Unknown2100"}, - {2501, nullptr, "Unknown2501"}, - {2502, nullptr, "Unknown2502"}, - {2601, nullptr, "Unknown2601"}, - {3001, nullptr, "Unknown3001"}, - {3002, nullptr, "Unknown3002"}, - }; - // clang-format on - RegisterHandlers(functions); - keys.PopulateTickets(); keys.SynthesizeTickets(); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + private: bool CheckRightsId(HLERequestContext& ctx, const u128& rights_id) { if (rights_id == u128{}) { @@ -317,89 +221,185 @@ private: rb.Push(write_size); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, &ETicket::ImportTicket, "ImportTicket"}, + FunctionInfo{2, nullptr, "ImportTicketCertificateSet"}, + FunctionInfo{3, nullptr, "DeleteTicket"}, + FunctionInfo{4, nullptr, "DeletePersonalizedTicket"}, + FunctionInfo{5, nullptr, "DeleteAllCommonTicket"}, + FunctionInfo{6, nullptr, "DeleteAllPersonalizedTicket"}, + FunctionInfo{7, nullptr, "DeleteAllPersonalizedTicketEx"}, + FunctionInfo{8, &ETicket::GetTitleKey, "GetTitleKey"}, + FunctionInfo{9, &ETicket::CountCommonTicket, "CountCommonTicket"}, + FunctionInfo{10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"}, + FunctionInfo{11, &ETicket::ListCommonTicketRightsIds, "ListCommonTicketRightsIds"}, + FunctionInfo{12, &ETicket::ListPersonalizedTicketRightsIds, "ListPersonalizedTicketRightsIds"}, + FunctionInfo{13, nullptr, "ListMissingPersonalizedTicket"}, + FunctionInfo{14, &ETicket::GetCommonTicketSize, "GetCommonTicketSize"}, + FunctionInfo{15, &ETicket::GetPersonalizedTicketSize, "GetPersonalizedTicketSize"}, + FunctionInfo{16, &ETicket::GetCommonTicketData, "GetCommonTicketData"}, + FunctionInfo{17, &ETicket::GetPersonalizedTicketData, "GetPersonalizedTicketData"}, + FunctionInfo{18, nullptr, "OwnTicket"}, + FunctionInfo{19, nullptr, "GetTicketInfo"}, + FunctionInfo{20, nullptr, "ListLightTicketInfo"}, + FunctionInfo{21, nullptr, "SignData"}, + FunctionInfo{22, nullptr, "GetCommonTicketAndCertificateSize"}, + FunctionInfo{23, nullptr, "GetCommonTicketAndCertificateData"}, + FunctionInfo{24, nullptr, "ImportPrepurchaseRecord"}, + FunctionInfo{25, nullptr, "DeletePrepurchaseRecord"}, + FunctionInfo{26, nullptr, "DeleteAllPrepurchaseRecord"}, + FunctionInfo{27, nullptr, "CountPrepurchaseRecord"}, + FunctionInfo{28, nullptr, "ListPrepurchaseRecordRightsIds"}, + FunctionInfo{29, nullptr, "ListPrepurchaseRecordInfo"}, + FunctionInfo{30, nullptr, "CountTicket"}, + FunctionInfo{31, nullptr, "ListTicketRightsIds"}, + FunctionInfo{32, nullptr, "CountPrepurchaseRecordEx"}, + FunctionInfo{33, nullptr, "ListPrepurchaseRecordRightsIdsEx"}, + FunctionInfo{34, nullptr, "GetEncryptedTicketSize"}, + FunctionInfo{35, nullptr, "GetEncryptedTicketData"}, + FunctionInfo{36, nullptr, "DeleteAllInactiveELicenseRequiredPersonalizedTicket"}, + FunctionInfo{37, nullptr, "OwnTicket2"}, + FunctionInfo{38, nullptr, "OwnTicket3"}, + FunctionInfo{39, nullptr, "DeleteAllInactivePersonalizedTicket"}, + FunctionInfo{40, nullptr, "DeletePrepurchaseRecordByNintendoAccountId"}, + FunctionInfo{101, nullptr, "Unknown101", MakeVersionGate({18,0,0})}, + FunctionInfo{102, nullptr, "Unknown102", MakeVersionGate({18,0,0})}, + FunctionInfo{103, nullptr, "Unknown103", MakeVersionGate({18,0,0})}, + FunctionInfo{104, nullptr, "Unknown104", MakeVersionGate({18,0,0})}, + FunctionInfo{105, nullptr, "Unknown105", MakeVersionGate({20,0,0})}, + FunctionInfo{201, nullptr, "Unknown201", MakeVersionGate({18,0,0})}, + FunctionInfo{202, nullptr, "Unknown202", MakeVersionGate({18,0,0})}, + FunctionInfo{203, nullptr, "Unknown203", MakeVersionGate({18,0,0})}, + FunctionInfo{204, nullptr, "Unknown204", MakeVersionGate({18,0,0})}, + FunctionInfo{205, nullptr, "Unknown205", MakeVersionGate({18,0,0})}, + FunctionInfo{501, nullptr, "Unknown501"}, + FunctionInfo{502, nullptr, "Unknown502"}, + FunctionInfo{503, nullptr, "GetTitleKey"}, + FunctionInfo{504, nullptr, "Unknown504"}, + FunctionInfo{508, nullptr, "Unknown508"}, + FunctionInfo{509, nullptr, "Unknown509"}, + FunctionInfo{510, nullptr, "Unknown510"}, + FunctionInfo{511, nullptr, "Unknown511"}, + FunctionInfo{1001, nullptr, "Unknown1001"}, + FunctionInfo{1002, nullptr, "Unknown1001"}, + FunctionInfo{1003, nullptr, "Unknown1003"}, + FunctionInfo{1004, nullptr, "Unknown1004"}, + FunctionInfo{1005, nullptr, "Unknown1005"}, + FunctionInfo{1006, nullptr, "Unknown1006"}, + FunctionInfo{1007, nullptr, "Unknown1007"}, + FunctionInfo{1009, nullptr, "Unknown1009"}, + FunctionInfo{1010, nullptr, "Unknown1010"}, + FunctionInfo{1011, nullptr, "Unknown1011"}, + FunctionInfo{1012, nullptr, "Unknown1012"}, + FunctionInfo{1013, nullptr, "Unknown1013"}, + FunctionInfo{1014, nullptr, "Unknown1014"}, + FunctionInfo{1015, nullptr, "Unknown1015"}, + FunctionInfo{1016, nullptr, "Unknown1016"}, + FunctionInfo{1017, nullptr, "Unknown1017"}, + FunctionInfo{1018, nullptr, "Unknown1018"}, + FunctionInfo{1019, nullptr, "Unknown1019"}, + FunctionInfo{1020, nullptr, "Unknown1020"}, + FunctionInfo{1021, nullptr, "Unknown1021"}, + FunctionInfo{1501, nullptr, "Unknown1501"}, + FunctionInfo{1502, nullptr, "Unknown1502"}, + FunctionInfo{1503, nullptr, "Unknown1503"}, + FunctionInfo{1504, nullptr, "Unknown1504"}, + FunctionInfo{1505, nullptr, "Unknown1505"}, + FunctionInfo{1506, nullptr, "Unknown1506"}, + FunctionInfo{2000, nullptr, "Unknown2000"}, + FunctionInfo{2001, nullptr, "Unknown2001"}, + FunctionInfo{2002, nullptr, "Unknown2002"}, + FunctionInfo{2003, nullptr, "Unknown2003"}, + FunctionInfo{2100, nullptr, "Unknown2100"}, + FunctionInfo{2501, nullptr, "Unknown2501"}, + FunctionInfo{2502, nullptr, "Unknown2502"}, + FunctionInfo{2601, nullptr, "Unknown2601"}, + FunctionInfo{3001, nullptr, "Unknown3001"}, + FunctionInfo{3002, nullptr, "Unknown3002"} + ); Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::Instance(); }; class NDRM_LU final : public ServiceFramework { public: explicit NDRM_LU(Core::System& system_) - : ServiceFramework{system_, "ndrm:lu"} { - // clang-format off - static const FunctionInfo functions[] = { - {1, nullptr, "Cmd1"}, - {2, nullptr, "Cmd2"}, - {3, nullptr, "Cmd3"}, - {1000, nullptr, "Cmd1000"}, - {8000, nullptr, "Cmd8000"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "ndrm:lu"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, nullptr, "Cmd1"}, + FunctionInfo{2, nullptr, "Cmd2"}, + FunctionInfo{3, nullptr, "Cmd3"}, + FunctionInfo{1000, nullptr, "Cmd1000"}, + FunctionInfo{8000, nullptr, "Cmd8000"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class NDRM_LA final : public ServiceFramework { public: explicit NDRM_LA(Core::System& system_) - : ServiceFramework{system_, "ndrm:la"} { - // clang-format off - static const FunctionInfo functions[] = { - {1, nullptr, "Cmd1"}, - {2, nullptr, "Cmd2"}, - {3, nullptr, "Cmd3"}, - {4, nullptr, "Cmd4"}, - {5, nullptr, "Cmd5"}, - {6, nullptr, "Cmd6"}, - {7, nullptr, "Cmd7"}, - {8, nullptr, "Cmd8"}, - {9, nullptr, "Cmd9"}, - {10, nullptr, "Cmd10"}, - {11, nullptr, "Cmd11"}, - {12, nullptr, "Cmd12"}, - {13, nullptr, "Cmd13"}, - {14, nullptr, "Cmd14"}, - {15, nullptr, "Cmd15"}, - {16, nullptr, "Cmd16"}, - {17, nullptr, "Cmd17"}, - {18, nullptr, "Cmd18"}, - {19, nullptr, "Cmd19"}, - {20, nullptr, "Cmd20"}, - {21, nullptr, "Cmd21"}, - {22, nullptr, "Cmd22"}, - {23, nullptr, "Cmd23"}, - {24, nullptr, "Cmd24"}, - {25, nullptr, "Cmd25"}, - {26, nullptr, "Cmd26"}, - {27, nullptr, "Cmd27"}, - {28, nullptr, "Cmd28"}, - {29, nullptr, "Cmd29"}, - {30, nullptr, "Cmd30"}, - {31, nullptr, "Cmd31"}, - {32, nullptr, "Cmd32"}, - {33, nullptr, "Cmd33"}, - {34, nullptr, "Cmd34"}, - {35, nullptr, "Cmd35"}, - {36, nullptr, "Cmd36"}, - {37, nullptr, "Cmd37"}, - {38, nullptr, "Cmd38"}, - {39, nullptr, "Cmd39"}, - {40, nullptr, "Cmd40"}, - {42, nullptr, "Cmd42"}, - {43, nullptr, "Cmd43"}, - {44, nullptr, "Cmd44"}, - {45, nullptr, "Cmd45"}, - {46, nullptr, "Cmd46"}, - {47, nullptr, "Cmd47"}, - {48, nullptr, "Cmd48"}, - {49, nullptr, "Cmd49"}, - {50, nullptr, "Cmd50"}, - {51, nullptr, "Cmd51"}, - {8000, nullptr, "Cmd8000"}, - {8001, nullptr, "Cmd8001"}, - {8002, nullptr, "Cmd8002"}, - {8003, nullptr, "Cmd8003"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "ndrm:la"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, nullptr, "Cmd1"}, + FunctionInfo{2, nullptr, "Cmd2"}, + FunctionInfo{3, nullptr, "Cmd3"}, + FunctionInfo{4, nullptr, "Cmd4"}, + FunctionInfo{5, nullptr, "Cmd5"}, + FunctionInfo{6, nullptr, "Cmd6"}, + FunctionInfo{7, nullptr, "Cmd7"}, + FunctionInfo{8, nullptr, "Cmd8"}, + FunctionInfo{9, nullptr, "Cmd9"}, + FunctionInfo{10, nullptr, "Cmd10"}, + FunctionInfo{11, nullptr, "Cmd11"}, + FunctionInfo{12, nullptr, "Cmd12"}, + FunctionInfo{13, nullptr, "Cmd13"}, + FunctionInfo{14, nullptr, "Cmd14"}, + FunctionInfo{15, nullptr, "Cmd15"}, + FunctionInfo{16, nullptr, "Cmd16"}, + FunctionInfo{17, nullptr, "Cmd17"}, + FunctionInfo{18, nullptr, "Cmd18"}, + FunctionInfo{19, nullptr, "Cmd19"}, + FunctionInfo{20, nullptr, "Cmd20"}, + FunctionInfo{21, nullptr, "Cmd21"}, + FunctionInfo{22, nullptr, "Cmd22"}, + FunctionInfo{23, nullptr, "Cmd23"}, + FunctionInfo{24, nullptr, "Cmd24"}, + FunctionInfo{25, nullptr, "Cmd25"}, + FunctionInfo{26, nullptr, "Cmd26"}, + FunctionInfo{27, nullptr, "Cmd27"}, + FunctionInfo{28, nullptr, "Cmd28"}, + FunctionInfo{29, nullptr, "Cmd29"}, + FunctionInfo{30, nullptr, "Cmd30"}, + FunctionInfo{31, nullptr, "Cmd31"}, + FunctionInfo{32, nullptr, "Cmd32"}, + FunctionInfo{33, nullptr, "Cmd33"}, + FunctionInfo{34, nullptr, "Cmd34"}, + FunctionInfo{35, nullptr, "Cmd35"}, + FunctionInfo{36, nullptr, "Cmd36"}, + FunctionInfo{37, nullptr, "Cmd37"}, + FunctionInfo{38, nullptr, "Cmd38"}, + FunctionInfo{39, nullptr, "Cmd39"}, + FunctionInfo{40, nullptr, "Cmd40"}, + FunctionInfo{42, nullptr, "Cmd42"}, + FunctionInfo{43, nullptr, "Cmd43"}, + FunctionInfo{44, nullptr, "Cmd44"}, + FunctionInfo{45, nullptr, "Cmd45"}, + FunctionInfo{46, nullptr, "Cmd46"}, + FunctionInfo{47, nullptr, "Cmd47"}, + FunctionInfo{48, nullptr, "Cmd48"}, + FunctionInfo{49, nullptr, "Cmd49"}, + FunctionInfo{50, nullptr, "Cmd50"}, + FunctionInfo{51, nullptr, "Cmd51"}, + FunctionInfo{8000, nullptr, "Cmd8000"}, + FunctionInfo{8001, nullptr, "Cmd8001"}, + FunctionInfo{8002, nullptr, "Cmd8002"}, + FunctionInfo{8003, nullptr, "Cmd8003"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/eupld/eupld.cpp b/src/core/hle/service/eupld/eupld.cpp index 3cf27513ae..ed1e1c19c5 100644 --- a/src/core/hle/service/eupld/eupld.cpp +++ b/src/core/hle/service/eupld/eupld.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,36 +14,34 @@ namespace Service::EUPLD { class ErrorUploadContext final : public ServiceFramework { public: - explicit ErrorUploadContext(Core::System& system_) : ServiceFramework{system_, "eupld:c"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "SetUrl"}, - {1, nullptr, "ImportCrt"}, - {2, nullptr, "ImportPki"}, - {3, nullptr, "SetAutoUpload"}, - {4, nullptr, "GetAutoUpload"}, - }; - // clang-format on + explicit ErrorUploadContext(Core::System& system_) : ServiceFramework{system_, "eupld:c"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "SetUrl"}, + FunctionInfo{1, nullptr, "ImportCrt"}, + FunctionInfo{2, nullptr, "ImportPki"}, + FunctionInfo{3, nullptr, "SetAutoUpload"}, + FunctionInfo{4, nullptr, "GetAutoUpload"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class ErrorUploadRequest final : public ServiceFramework { public: - explicit ErrorUploadRequest(Core::System& system_) : ServiceFramework{system_, "eupld:r"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Initialize"}, - {1, nullptr, "UploadAll"}, - {2, nullptr, "UploadSelected"}, - {3, nullptr, "GetUploadStatus"}, - {4, nullptr, "CancelUpload"}, - {5, nullptr, "GetResult"}, - }; - // clang-format on + explicit ErrorUploadRequest(Core::System& system_) : ServiceFramework{system_, "eupld:r"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Initialize"}, + FunctionInfo{1, nullptr, "UploadAll"}, + FunctionInfo{2, nullptr, "UploadSelected"}, + FunctionInfo{3, nullptr, "GetUploadStatus"}, + FunctionInfo{4, nullptr, "CancelUpload"}, + FunctionInfo{5, nullptr, "GetResult"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/fatal/fatal.cpp b/src/core/hle/service/fatal/fatal.cpp index db48526614..4c9eca5d5b 100644 --- a/src/core/hle/service/fatal/fatal.cpp +++ b/src/core/hle/service/fatal/fatal.cpp @@ -13,8 +13,6 @@ #include "common/swap.h" #include "core/core.h" #include "core/hle/service/fatal/fatal.h" -#include "core/hle/service/fatal/fatal_p.h" -#include "core/hle/service/fatal/fatal_u.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/server_manager.h" #include "core/reporter.h" @@ -167,6 +165,35 @@ void Module::Interface::ThrowFatalWithCpuContext(HLERequestContext& ctx) { rb.Push(ResultSuccess); } +class Fatal_P final : public Module::Interface { +public: + explicit Fatal_P(std::shared_ptr module_, Core::System& system_) : Interface(std::move(module_), system_, "fatal:p") {} + ~Fatal_P() override = default; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetFatalEvent"}, + FunctionInfo{10, nullptr, "GetFatalContext"} + ); +}; + +class Fatal_U final : public Module::Interface { +public: + explicit Fatal_U(std::shared_ptr module_, Core::System& system_) : Interface(std::move(module_), system_, "fatal:u") {} + ~Fatal_U() override = default; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &Fatal_U::ThrowFatal, "ThrowFatal"}, + FunctionInfo{1, &Fatal_U::ThrowFatalWithPolicy, "ThrowFatalWithPolicy"}, + FunctionInfo{2, &Fatal_U::ThrowFatalWithCpuContext, "ThrowFatalWithCpuContext"} + ); +}; + void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); auto module = std::make_shared(); diff --git a/src/core/hle/service/fatal/fatal_p.cpp b/src/core/hle/service/fatal/fatal_p.cpp deleted file mode 100644 index 4a81bb5e2f..0000000000 --- a/src/core/hle/service/fatal/fatal_p.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/fatal/fatal_p.h" - -namespace Service::Fatal { - -Fatal_P::Fatal_P(std::shared_ptr module_, Core::System& system_) - : Interface(std::move(module_), system_, "fatal:p") { - static const FunctionInfo functions[] = { - {0, nullptr, "GetFatalEvent"}, - {10, nullptr, "GetFatalContext"}, - }; - RegisterHandlers(functions); -} - -Fatal_P::~Fatal_P() = default; - -} // namespace Service::Fatal diff --git a/src/core/hle/service/fatal/fatal_p.h b/src/core/hle/service/fatal/fatal_p.h deleted file mode 100644 index f743368350..0000000000 --- a/src/core/hle/service/fatal/fatal_p.h +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/fatal/fatal.h" - -namespace Service::Fatal { - -class Fatal_P final : public Module::Interface { -public: - explicit Fatal_P(std::shared_ptr module_, Core::System& system_); - ~Fatal_P() override; -}; - -} // namespace Service::Fatal diff --git a/src/core/hle/service/fatal/fatal_u.cpp b/src/core/hle/service/fatal/fatal_u.cpp deleted file mode 100644 index 3739711fce..0000000000 --- a/src/core/hle/service/fatal/fatal_u.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/fatal/fatal_u.h" - -namespace Service::Fatal { - -Fatal_U::Fatal_U(std::shared_ptr module_, Core::System& system_) - : Interface(std::move(module_), system_, "fatal:u") { - static const FunctionInfo functions[] = { - {0, &Fatal_U::ThrowFatal, "ThrowFatal"}, - {1, &Fatal_U::ThrowFatalWithPolicy, "ThrowFatalWithPolicy"}, - {2, &Fatal_U::ThrowFatalWithCpuContext, "ThrowFatalWithCpuContext"}, - }; - RegisterHandlers(functions); -} - -Fatal_U::~Fatal_U() = default; - -} // namespace Service::Fatal diff --git a/src/core/hle/service/fatal/fatal_u.h b/src/core/hle/service/fatal/fatal_u.h deleted file mode 100644 index 65fbe26961..0000000000 --- a/src/core/hle/service/fatal/fatal_u.h +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/fatal/fatal.h" - -namespace Service::Fatal { - -class Fatal_U final : public Module::Interface { -public: - explicit Fatal_U(std::shared_ptr module_, Core::System& system_); - ~Fatal_U() override; -}; - -} // namespace Service::Fatal diff --git a/src/core/hle/service/fgm/fgm.cpp b/src/core/hle/service/fgm/fgm.cpp index cac03ae24c..96ea3478ea 100644 --- a/src/core/hle/service/fgm/fgm.cpp +++ b/src/core/hle/service/fgm/fgm.cpp @@ -16,30 +16,26 @@ namespace Service::FGM { class IRequest final : public ServiceFramework { public: - explicit IRequest(Core::System& system_) : ServiceFramework{system_, "IRequest"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Initialize"}, - {1, nullptr, "Set"}, - {2, nullptr, "Get"}, - {3, nullptr, "Cancel"}, - }; - // clang-format on + explicit IRequest(Core::System& system_) : ServiceFramework{system_, "IRequest"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Initialize"}, + FunctionInfo{1, nullptr, "Set"}, + FunctionInfo{2, nullptr, "Get"}, + FunctionInfo{3, nullptr, "Cancel"} + ); }; class FGM final : public ServiceFramework { public: - explicit FGM(Core::System& system_, const char* name) : ServiceFramework{system_, name} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &FGM::Initialize, "Initialize"}, - }; - // clang-format on + explicit FGM(Core::System& system_, const char* name) : ServiceFramework{system_, name} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -50,21 +46,25 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &FGM::Initialize, "Initialize"} + ); }; class FGM_DBG final : public ServiceFramework { public: - explicit FGM_DBG(Core::System& system_) : ServiceFramework{system_, "fgm:dbg"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Initialize"}, - {1, nullptr, "Read"}, - {2, nullptr, "Cancel"}, - }; - // clang-format on + explicit FGM_DBG(Core::System& system_) : ServiceFramework{system_, "fgm:dbg"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Initialize"}, + FunctionInfo{1, nullptr, "Read"}, + FunctionInfo{2, nullptr, "Cancel"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp b/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp index 8483394d0c..793b86cc51 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 @@ -8,15 +11,18 @@ namespace Service::FileSystem { +std::optional IDirectory::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IDirectory::Read>, "Read"}, + FunctionInfo{1, D<&IDirectory::GetEntryCount>, "GetEntryCount"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IDirectory::IDirectory(Core::System& system_, FileSys::VirtualDir directory_, FileSys::OpenDirectoryMode mode) : ServiceFramework{system_, "IDirectory"}, backend(std::make_unique(directory_, mode)) { - static const FunctionInfo functions[] = { - {0, D<&IDirectory::Read>, "Read"}, - {1, D<&IDirectory::GetEntryCount>, "GetEntryCount"}, - }; - RegisterHandlers(functions); } Result IDirectory::Read( diff --git a/src/core/hle/service/filesystem/fsp/fs_i_directory.h b/src/core/hle/service/filesystem/fsp/fs_i_directory.h index b6251f7fdb..f2a57260e1 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_directory.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_directory.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 @@ -26,6 +29,8 @@ private: Result Read(Out out_count, const OutArray out_entries); Result GetEntryCount(Out out_count); + + std::optional FindRequest(u32 key) override; }; } // namespace Service::FileSystem diff --git a/src/core/hle/service/filesystem/fsp/fs_i_file.cpp b/src/core/hle/service/filesystem/fsp/fs_i_file.cpp index 22cbe2be2c..78ca90a4af 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_file.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_file.cpp @@ -12,18 +12,6 @@ namespace Service::FileSystem { IFile::IFile(Core::System& system_, FileSys::VirtualFile file_) : ServiceFramework{system_, "IFile"}, backend{std::make_unique(file_)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IFile::Read>, "Read"}, - {1, D<&IFile::Write>, "Write"}, - {2, D<&IFile::Flush>, "Flush"}, - {3, D<&IFile::SetSize>, "SetSize"}, - {4, D<&IFile::GetSize>, "GetSize"}, - {5, nullptr, "OperateRange"}, - {6, nullptr, "OperateRangeWithBuffer"}, - }; - // clang-format on - RegisterHandlers(functions); } Result IFile::Read( diff --git a/src/core/hle/service/filesystem/fsp/fs_i_file.h b/src/core/hle/service/filesystem/fsp/fs_i_file.h index e8599ee2f8..992330e149 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_file.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_file.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 @@ -27,6 +30,19 @@ private: Result Flush(); Result SetSize(s64 size); Result GetSize(Out out_size); + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IFile::Read>, "Read"}, + FunctionInfo{1, D<&IFile::Write>, "Write"}, + FunctionInfo{2, D<&IFile::Flush>, "Flush"}, + FunctionInfo{3, D<&IFile::SetSize>, "SetSize"}, + FunctionInfo{4, D<&IFile::GetSize>, "GetSize"}, + FunctionInfo{5, nullptr, "OperateRange"}, + FunctionInfo{6, nullptr, "OperateRangeWithBuffer"} + ); }; } // namespace Service::FileSystem diff --git a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp index edd381f57c..6ab4916a36 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp @@ -13,30 +13,33 @@ namespace Service::FileSystem { +std::optional IFileSystem::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IFileSystem::CreateFile>, "CreateFile"}, + FunctionInfo{1, D<&IFileSystem::DeleteFile>, "DeleteFile"}, + FunctionInfo{2, D<&IFileSystem::CreateDirectory>, "CreateDirectory"}, + FunctionInfo{3, D<&IFileSystem::DeleteDirectory>, "DeleteDirectory"}, + FunctionInfo{4, D<&IFileSystem::DeleteDirectoryRecursively>, "DeleteDirectoryRecursively"}, + FunctionInfo{5, D<&IFileSystem::RenameFile>, "RenameFile"}, + FunctionInfo{6, D<&IFileSystem::RenameDirectory>, "RenameDirectory"}, + FunctionInfo{7, D<&IFileSystem::GetEntryType>, "GetEntryType"}, + FunctionInfo{8, D<&IFileSystem::OpenFile>, "OpenFile"}, + FunctionInfo{9, D<&IFileSystem::OpenDirectory>, "OpenDirectory"}, + FunctionInfo{10, D<&IFileSystem::Commit>, "Commit"}, + FunctionInfo{11, D<&IFileSystem::GetFreeSpaceSize>, "GetFreeSpaceSize"}, + FunctionInfo{12, D<&IFileSystem::GetTotalSpaceSize>, "GetTotalSpaceSize"}, + FunctionInfo{13, D<&IFileSystem::CleanDirectoryRecursively>, "CleanDirectoryRecursively"}, + FunctionInfo{14, D<&IFileSystem::GetFileTimeStampRaw>, "GetFileTimeStampRaw"}, + FunctionInfo{15, nullptr, "QueryEntry"}, + FunctionInfo{16, D<&IFileSystem::GetFileSystemAttribute>, "GetFileSystemAttribute"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IFileSystem::IFileSystem(Core::System& system_, FileSys::VirtualDir dir_, SizeGetter size_getter_) : ServiceFramework{system_, "IFileSystem"}, backend{std::make_unique( dir_)}, size_getter{std::move(size_getter_)} { - static const FunctionInfo functions[] = { - {0, D<&IFileSystem::CreateFile>, "CreateFile"}, - {1, D<&IFileSystem::DeleteFile>, "DeleteFile"}, - {2, D<&IFileSystem::CreateDirectory>, "CreateDirectory"}, - {3, D<&IFileSystem::DeleteDirectory>, "DeleteDirectory"}, - {4, D<&IFileSystem::DeleteDirectoryRecursively>, "DeleteDirectoryRecursively"}, - {5, D<&IFileSystem::RenameFile>, "RenameFile"}, - {6, D<&IFileSystem::RenameDirectory>, "RenameDirectory"}, - {7, D<&IFileSystem::GetEntryType>, "GetEntryType"}, - {8, D<&IFileSystem::OpenFile>, "OpenFile"}, - {9, D<&IFileSystem::OpenDirectory>, "OpenDirectory"}, - {10, D<&IFileSystem::Commit>, "Commit"}, - {11, D<&IFileSystem::GetFreeSpaceSize>, "GetFreeSpaceSize"}, - {12, D<&IFileSystem::GetTotalSpaceSize>, "GetTotalSpaceSize"}, - {13, D<&IFileSystem::CleanDirectoryRecursively>, "CleanDirectoryRecursively"}, - {14, D<&IFileSystem::GetFileTimeStampRaw>, "GetFileTimeStampRaw"}, - {15, nullptr, "QueryEntry"}, - {16, D<&IFileSystem::GetFileSystemAttribute>, "GetFileSystemAttribute"}, - }; - RegisterHandlers(functions); } Result IFileSystem::CreateFile(const InLargeData path, diff --git a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h index ed03c3ef83..11d3c7fb31 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h @@ -58,6 +58,7 @@ public: Result GetFileSystemAttribute(Out out_attribute); private: + std::optional FindRequest(u32 key) override; std::unique_ptr backend; SizeGetter size_getter; }; diff --git a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp index 6263282344..f6eac6ca10 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,11 +12,6 @@ namespace Service::FileSystem { IMultiCommitManager::IMultiCommitManager(Core::System& system_) : ServiceFramework{system_, "IMultiCommitManager"} { - static const FunctionInfo functions[] = { - {1, D<&IMultiCommitManager::Add>, "Add"}, - {2, D<&IMultiCommitManager::Commit>, "Commit"}, - }; - RegisterHandlers(functions); } IMultiCommitManager::~IMultiCommitManager() = default; diff --git a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h index 8ebf7c7d96..31182e9159 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -17,6 +20,13 @@ private: Result Add(std::shared_ptr filesystem); Result Commit(); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, D<&IMultiCommitManager::Add>, "Add"}, + FunctionInfo{2, D<&IMultiCommitManager::Commit>, "Commit"} + ); FileSys::VirtualFile backend; }; diff --git a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp index 495b131df4..8353b72c24 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp @@ -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-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -17,11 +17,6 @@ ISaveDataInfoReader::ISaveDataInfoReader(Core::System& system_, FileSys::SaveDataSpaceId space) : ServiceFramework{system_, "ISaveDataInfoReader"}, save_data_controller{ save_data_controller_} { - static const FunctionInfo functions[] = { - {0, D<&ISaveDataInfoReader::ReadSaveDataInfo>, "ReadSaveDataInfo"}, - }; - RegisterHandlers(functions); - FindAllSaves(space); } diff --git a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h index e45ad852ba..7faa4291c0 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -42,6 +45,12 @@ private: void FindNormalSaves(FileSys::SaveDataSpaceId space, const FileSys::VirtualDir& type); void FindTemporaryStorageSaves(FileSys::SaveDataSpaceId space, const FileSys::VirtualDir& type); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ISaveDataInfoReader::ReadSaveDataInfo>, "ReadSaveDataInfo"} + ); std::shared_ptr save_data_controller; std::vector info; u64 next_entry_index = 0; diff --git a/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp b/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp index 50b7d1e765..ac884b3b28 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp @@ -12,15 +12,6 @@ namespace Service::FileSystem { IStorage::IStorage(Core::System& system_, FileSys::VirtualFile backend_) : ServiceFramework{system_, "IStorage"}, backend(std::move(backend_)) { - static const FunctionInfo functions[] = { - {0, D<&IStorage::Read>, "Read"}, - {1, nullptr, "Write"}, - {2, nullptr, "Flush"}, - {3, nullptr, "SetSize"}, - {4, D<&IStorage::GetSize>, "GetSize"}, - {5, nullptr, "OperateRange"}, - }; - RegisterHandlers(functions); } Result IStorage::Read( diff --git a/src/core/hle/service/filesystem/fsp/fs_i_storage.h b/src/core/hle/service/filesystem/fsp/fs_i_storage.h index 74d879386f..44d5a6c8bb 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_storage.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_storage.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 @@ -15,12 +18,23 @@ public: explicit IStorage(Core::System& system_, FileSys::VirtualFile backend_); private: - FileSys::VirtualFile backend; - Result Read( OutBuffer out_bytes, s64 offset, s64 length); Result GetSize(Out out_size); + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IStorage::Read>, "Read"}, + FunctionInfo{1, nullptr, "Write"}, + FunctionInfo{2, nullptr, "Flush"}, + FunctionInfo{3, nullptr, "SetSize"}, + FunctionInfo{4, D<&IStorage::GetSize>, "GetSize"}, + FunctionInfo{5, nullptr, "OperateRange"} + ); + FileSys::VirtualFile backend; }; } // namespace Service::FileSystem diff --git a/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp b/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp index 8ee733f474..1f83d6509b 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,15 +9,6 @@ namespace Service::FileSystem { FSP_LDR::FSP_LDR(Core::System& system_) : ServiceFramework{system_, "fsp:ldr"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "OpenCodeFileSystem"}, - {1, nullptr, "IsArchivedProgram"}, - {2, nullptr, "SetCurrentProcess"}, - }; - // clang-format on - - RegisterHandlers(functions); } FSP_LDR::~FSP_LDR() = default; diff --git a/src/core/hle/service/filesystem/fsp/fsp_ldr.h b/src/core/hle/service/filesystem/fsp/fsp_ldr.h index 358739a872..fe3abeff1d 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_ldr.h +++ b/src/core/hle/service/filesystem/fsp/fsp_ldr.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,6 +18,15 @@ class FSP_LDR final : public ServiceFramework { public: explicit FSP_LDR(Core::System& system_); ~FSP_LDR() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "OpenCodeFileSystem"}, + FunctionInfo{1, nullptr, "IsArchivedProgram"}, + FunctionInfo{2, nullptr, "SetCurrentProcess"} + ); }; } // namespace Service::FileSystem diff --git a/src/core/hle/service/filesystem/fsp/fsp_pr.cpp b/src/core/hle/service/filesystem/fsp/fsp_pr.cpp index 7c03ebaeae..9378e6e0c6 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_pr.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_pr.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,16 +9,6 @@ namespace Service::FileSystem { FSP_PR::FSP_PR(Core::System& system_) : ServiceFramework{system_, "fsp:pr"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RegisterProgram"}, - {1, nullptr, "UnregisterProgram"}, - {2, nullptr, "SetCurrentProcess"}, - {256, nullptr, "SetEnabledProgramVerification"}, - }; - // clang-format on - - RegisterHandlers(functions); } FSP_PR::~FSP_PR() = default; diff --git a/src/core/hle/service/filesystem/fsp/fsp_pr.h b/src/core/hle/service/filesystem/fsp/fsp_pr.h index bd4e0a730c..bc692151a5 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_pr.h +++ b/src/core/hle/service/filesystem/fsp/fsp_pr.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,6 +18,16 @@ class FSP_PR final : public ServiceFramework { public: explicit FSP_PR(Core::System& system_); ~FSP_PR() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RegisterProgram"}, + FunctionInfo{1, nullptr, "UnregisterProgram"}, + FunctionInfo{2, nullptr, "SetCurrentProcess"}, + FunctionInfo{256, nullptr, "SetEnabledProgramVerification"} + ); }; } // namespace Service::FileSystem diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp index 58303a0bd6..cb349636d5 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp @@ -47,143 +47,142 @@ namespace Service::FileSystem { -FSP_SRV::FSP_SRV(Core::System& system_) - : ServiceFramework{system_, "fsp-srv"}, fsc{system.GetFileSystemController()}, - content_provider{system.GetContentProvider()}, reporter{system.GetReporter()} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "OpenFileSystem"}, - {1, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"}, - {2, D<&FSP_SRV::OpenDataFileSystemByCurrentProcess>, "OpenDataFileSystemByCurrentProcess"}, - {7, D<&FSP_SRV::OpenFileSystemWithPatch>, "OpenFileSystemWithPatch"}, - {8, nullptr, "OpenFileSystemWithId"}, - {9, nullptr, "OpenDataFileSystemByApplicationId"}, - {11, nullptr, "OpenBisFileSystem"}, - {12, nullptr, "OpenBisStorage"}, - {13, nullptr, "InvalidateBisCache"}, - {17, nullptr, "OpenHostFileSystem"}, - {18, D<&FSP_SRV::OpenSdCardFileSystem>, "OpenSdCardFileSystem"}, - {19, nullptr, "FormatSdCardFileSystem"}, - {21, nullptr, "DeleteSaveDataFileSystem"}, - {22, D<&FSP_SRV::CreateSaveDataFileSystem>, "CreateSaveDataFileSystem"}, - {23, D<&FSP_SRV::CreateSaveDataFileSystemBySystemSaveDataId>, "CreateSaveDataFileSystemBySystemSaveDataId"}, - {24, nullptr, "RegisterSaveDataFileSystemAtomicDeletion"}, - {25, nullptr, "DeleteSaveDataFileSystemBySaveDataSpaceId"}, - {26, nullptr, "FormatSdCardDryRun"}, - {27, D<&FSP_SRV::IsExFatSupported>, "IsExFatSupported"}, - {28, nullptr, "DeleteSaveDataFileSystemBySaveDataAttribute"}, - {30, nullptr, "OpenGameCardStorage"}, - {31, nullptr, "OpenGameCardFileSystem"}, - {32, D<&FSP_SRV::ExtendSaveDataFileSystem>, "ExtendSaveDataFileSystem"}, - {33, nullptr, "DeleteCacheStorage"}, - {34, D<&FSP_SRV::GetCacheStorageSize>, "GetCacheStorageSize"}, - {35, nullptr, "CreateSaveDataFileSystemByHashSalt"}, - {36, nullptr, "OpenHostFileSystemWithOption"}, - {37, D<&FSP_SRV::CreateSaveDataFileSystemWithCreationInfo2>, "CreateSaveDataFileSystemWithCreationInfo2"}, - {51, D<&FSP_SRV::OpenSaveDataFileSystem>, "OpenSaveDataFileSystem"}, - {52, D<&FSP_SRV::OpenSaveDataFileSystemBySystemSaveDataId>, "OpenSaveDataFileSystemBySystemSaveDataId"}, - {53, D<&FSP_SRV::OpenReadOnlySaveDataFileSystem>, "OpenReadOnlySaveDataFileSystem"}, - {57, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataSpaceId>, "ReadSaveDataFileSystemExtraDataBySaveDataSpaceId"}, - {58, D<&FSP_SRV::ReadSaveDataFileSystemExtraData>, "ReadSaveDataFileSystemExtraData"}, - {59, D<&FSP_SRV::WriteSaveDataFileSystemExtraData>, "WriteSaveDataFileSystemExtraData"}, - {60, nullptr, "OpenSaveDataInfoReader"}, - {61, D<&FSP_SRV::OpenSaveDataInfoReaderBySaveDataSpaceId>, "OpenSaveDataInfoReaderBySaveDataSpaceId"}, - {62, D<&FSP_SRV::OpenSaveDataInfoReaderOnlyCacheStorage>, "OpenSaveDataInfoReaderOnlyCacheStorage"}, - {64, nullptr, "OpenSaveDataInternalStorageFileSystem"}, - {65, nullptr, "UpdateSaveDataMacForDebug"}, - {66, nullptr, "WriteSaveDataFileSystemExtraData2"}, - {67, D<&FSP_SRV::FindSaveDataWithFilter>, "FindSaveDataWithFilter"}, - {68, nullptr, "OpenSaveDataInfoReaderBySaveDataFilter"}, - {69, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataBySaveDataAttribute"}, - {70, D<&FSP_SRV::WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"}, - {71, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"}, - {80, nullptr, "OpenSaveDataMetaFile"}, - {81, nullptr, "OpenSaveDataTransferManager"}, - {82, nullptr, "OpenSaveDataTransferManagerVersion2"}, - {83, D<&FSP_SRV::OpenSaveDataTransferProhibiter>, "OpenSaveDataTransferProhibiter"}, - {84, nullptr, "ListApplicationAccessibleSaveDataOwnerId"}, - {85, nullptr, "OpenSaveDataTransferManagerForSaveDataRepair"}, - {86, nullptr, "OpenSaveDataMover"}, - {87, nullptr, "OpenSaveDataTransferManagerForRepair"}, - {100, nullptr, "OpenImageDirectoryFileSystem"}, - {101, nullptr, "OpenBaseFileSystem"}, - {102, nullptr, "FormatBaseFileSystem"}, - {110, nullptr, "OpenContentStorageFileSystem"}, - {120, nullptr, "OpenCloudBackupWorkStorageFileSystem"}, - {130, nullptr, "OpenCustomStorageFileSystem"}, - {200, D<&FSP_SRV::OpenDataStorageByCurrentProcess>, "OpenDataStorageByCurrentProcess"}, - {201, nullptr, "OpenDataStorageByProgramId"}, - {202, D<&FSP_SRV::OpenDataStorageByDataId>, "OpenDataStorageByDataId"}, - {203, D<&FSP_SRV::OpenPatchDataStorageByCurrentProcess>, "OpenPatchDataStorageByCurrentProcess"}, - {204, nullptr, "OpenDataFileSystemByProgramIndex"}, - {205, D<&FSP_SRV::OpenDataStorageWithProgramIndex>, "OpenDataStorageWithProgramIndex"}, - {206, nullptr, "OpenDataStorageByPath"}, - {210, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"}, - {400, nullptr, "OpenDeviceOperator"}, - {500, nullptr, "OpenSdCardDetectionEventNotifier"}, - {501, nullptr, "OpenGameCardDetectionEventNotifier"}, - {510, nullptr, "OpenSystemDataUpdateEventNotifier"}, - {511, nullptr, "NotifySystemDataUpdateEvent"}, - {520, nullptr, "SimulateGameCardDetectionEvent"}, - {600, nullptr, "SetCurrentPosixTime"}, - {601, nullptr, "QuerySaveDataTotalSize"}, - {602, nullptr, "VerifySaveDataFileSystem"}, - {603, nullptr, "CorruptSaveDataFileSystem"}, - {604, nullptr, "CreatePaddingFile"}, - {605, nullptr, "DeleteAllPaddingFiles"}, - {606, nullptr, "GetRightsId"}, - {607, nullptr, "RegisterExternalKey"}, - {608, nullptr, "UnregisterAllExternalKey"}, - {609, nullptr, "GetRightsIdByPath"}, - {610, nullptr, "GetRightsIdAndKeyGenerationByPath"}, - {611, nullptr, "SetCurrentPosixTimeWithTimeDifference"}, - {612, nullptr, "GetFreeSpaceSizeForSaveData"}, - {613, nullptr, "VerifySaveDataFileSystemBySaveDataSpaceId"}, - {614, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId"}, - {615, nullptr, "QuerySaveDataInternalStorageTotalSize"}, - {616, nullptr, "GetSaveDataCommitId"}, - {617, nullptr, "UnregisterExternalKey"}, - {620, nullptr, "SetSdCardEncryptionSeed"}, - {630, nullptr, "SetSdCardAccessibility"}, - {631, D<&FSP_SRV::IsSdCardAccessible>, "IsSdCardAccessible"}, - {640, nullptr, "IsSignedSystemPartitionOnSdCardValid"}, - {700, nullptr, "OpenAccessFailureResolver"}, - {701, nullptr, "GetAccessFailureDetectionEvent"}, - {702, nullptr, "IsAccessFailureDetected"}, - {710, nullptr, "ResolveAccessFailure"}, - {720, nullptr, "AbandonAccessFailure"}, - {800, nullptr, "GetAndClearFileSystemProxyErrorInfo"}, - {810, nullptr, "RegisterProgramIndexMapInfo"}, - {820, nullptr, "GetContentStorageInfoIndex"}, - {830, nullptr, "EncryptStreamPlaySaveData"}, - {831, nullptr, "DecryptStreamPlaySaveData"}, - {1000, nullptr, "SetBisRootForHost"}, - {1001, nullptr, "SetSaveDataSize"}, - {1002, nullptr, "SetSaveDataRootPath"}, - {1003, D<&FSP_SRV::DisableAutoSaveDataCreation>, "DisableAutoSaveDataCreation"}, - {1004, D<&FSP_SRV::SetGlobalAccessLogMode>, "SetGlobalAccessLogMode"}, - {1005, D<&FSP_SRV::GetGlobalAccessLogMode>, "GetGlobalAccessLogMode"}, - {1006, D<&FSP_SRV::OutputAccessLogToSdCard>, "OutputAccessLogToSdCard"}, - {1007, nullptr, "RegisterUpdatePartition"}, - {1008, nullptr, "OpenRegisteredUpdatePartition"}, - {1009, nullptr, "GetAndClearMemoryReportInfo"}, - {1010, nullptr, "SetDataStorageRedirectTarget"}, - {1011, D<&FSP_SRV::GetProgramIndexForAccessLog>, "GetProgramIndexForAccessLog"}, - {1012, nullptr, "GetFsStackUsage"}, - {1013, nullptr, "UnsetSaveDataRootPath"}, - {1014, nullptr, "OutputMultiProgramTagAccessLog"}, - {1016, D<&FSP_SRV::FlushAccessLogOnSdCard>, "FlushAccessLogOnSdCard"}, - {1017, nullptr, "OutputApplicationInfoAccessLog"}, - {1018, nullptr, "SetDebugOption"}, - {1019, nullptr, "UnsetDebugOption"}, - {1100, nullptr, "OverrideSaveDataTransferTokenSignVerificationKey"}, - {1110, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId2"}, - {1200, D<&FSP_SRV::OpenMultiCommitManager>, "OpenMultiCommitManager"}, - {1300, nullptr, "OpenBisWiper"}, - }; - // clang-format on - RegisterHandlers(functions); +std::optional FSP_SRV::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "OpenFileSystem"}, + FunctionInfo{1, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"}, + FunctionInfo{2, D<&FSP_SRV::OpenDataFileSystemByCurrentProcess>, "OpenDataFileSystemByCurrentProcess"}, + FunctionInfo{7, D<&FSP_SRV::OpenFileSystemWithPatch>, "OpenFileSystemWithPatch"}, + FunctionInfo{8, nullptr, "OpenFileSystemWithId"}, + FunctionInfo{9, nullptr, "OpenDataFileSystemByApplicationId"}, + FunctionInfo{11, nullptr, "OpenBisFileSystem"}, + FunctionInfo{12, nullptr, "OpenBisStorage"}, + FunctionInfo{13, nullptr, "InvalidateBisCache"}, + FunctionInfo{17, nullptr, "OpenHostFileSystem"}, + FunctionInfo{18, D<&FSP_SRV::OpenSdCardFileSystem>, "OpenSdCardFileSystem"}, + FunctionInfo{19, nullptr, "FormatSdCardFileSystem"}, + FunctionInfo{21, nullptr, "DeleteSaveDataFileSystem"}, + FunctionInfo{22, D<&FSP_SRV::CreateSaveDataFileSystem>, "CreateSaveDataFileSystem"}, + FunctionInfo{23, D<&FSP_SRV::CreateSaveDataFileSystemBySystemSaveDataId>, "CreateSaveDataFileSystemBySystemSaveDataId"}, + FunctionInfo{24, nullptr, "RegisterSaveDataFileSystemAtomicDeletion"}, + FunctionInfo{25, nullptr, "DeleteSaveDataFileSystemBySaveDataSpaceId"}, + FunctionInfo{26, nullptr, "FormatSdCardDryRun"}, + FunctionInfo{27, D<&FSP_SRV::IsExFatSupported>, "IsExFatSupported"}, + FunctionInfo{28, nullptr, "DeleteSaveDataFileSystemBySaveDataAttribute"}, + FunctionInfo{30, nullptr, "OpenGameCardStorage"}, + FunctionInfo{31, nullptr, "OpenGameCardFileSystem"}, + FunctionInfo{32, D<&FSP_SRV::ExtendSaveDataFileSystem>, "ExtendSaveDataFileSystem"}, + FunctionInfo{33, nullptr, "DeleteCacheStorage"}, + FunctionInfo{34, D<&FSP_SRV::GetCacheStorageSize>, "GetCacheStorageSize"}, + FunctionInfo{35, nullptr, "CreateSaveDataFileSystemByHashSalt"}, + FunctionInfo{36, nullptr, "OpenHostFileSystemWithOption"}, + FunctionInfo{37, D<&FSP_SRV::CreateSaveDataFileSystemWithCreationInfo2>, "CreateSaveDataFileSystemWithCreationInfo2"}, + FunctionInfo{51, D<&FSP_SRV::OpenSaveDataFileSystem>, "OpenSaveDataFileSystem"}, + FunctionInfo{52, D<&FSP_SRV::OpenSaveDataFileSystemBySystemSaveDataId>, "OpenSaveDataFileSystemBySystemSaveDataId"}, + FunctionInfo{53, D<&FSP_SRV::OpenReadOnlySaveDataFileSystem>, "OpenReadOnlySaveDataFileSystem"}, + FunctionInfo{57, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataSpaceId>, "ReadSaveDataFileSystemExtraDataBySaveDataSpaceId"}, + FunctionInfo{58, D<&FSP_SRV::ReadSaveDataFileSystemExtraData>, "ReadSaveDataFileSystemExtraData"}, + FunctionInfo{59, D<&FSP_SRV::WriteSaveDataFileSystemExtraData>, "WriteSaveDataFileSystemExtraData"}, + FunctionInfo{60, nullptr, "OpenSaveDataInfoReader"}, + FunctionInfo{61, D<&FSP_SRV::OpenSaveDataInfoReaderBySaveDataSpaceId>, "OpenSaveDataInfoReaderBySaveDataSpaceId"}, + FunctionInfo{62, D<&FSP_SRV::OpenSaveDataInfoReaderOnlyCacheStorage>, "OpenSaveDataInfoReaderOnlyCacheStorage"}, + FunctionInfo{64, nullptr, "OpenSaveDataInternalStorageFileSystem"}, + FunctionInfo{65, nullptr, "UpdateSaveDataMacForDebug"}, + FunctionInfo{66, nullptr, "WriteSaveDataFileSystemExtraData2"}, + FunctionInfo{67, D<&FSP_SRV::FindSaveDataWithFilter>, "FindSaveDataWithFilter"}, + FunctionInfo{68, nullptr, "OpenSaveDataInfoReaderBySaveDataFilter"}, + FunctionInfo{69, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataBySaveDataAttribute"}, + FunctionInfo{70, D<&FSP_SRV::WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"}, + FunctionInfo{71, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"}, + FunctionInfo{80, nullptr, "OpenSaveDataMetaFile"}, + FunctionInfo{81, nullptr, "OpenSaveDataTransferManager"}, + FunctionInfo{82, nullptr, "OpenSaveDataTransferManagerVersion2"}, + FunctionInfo{83, D<&FSP_SRV::OpenSaveDataTransferProhibiter>, "OpenSaveDataTransferProhibiter"}, + FunctionInfo{84, nullptr, "ListApplicationAccessibleSaveDataOwnerId"}, + FunctionInfo{85, nullptr, "OpenSaveDataTransferManagerForSaveDataRepair"}, + FunctionInfo{86, nullptr, "OpenSaveDataMover"}, + FunctionInfo{87, nullptr, "OpenSaveDataTransferManagerForRepair"}, + FunctionInfo{100, nullptr, "OpenImageDirectoryFileSystem"}, + FunctionInfo{101, nullptr, "OpenBaseFileSystem"}, + FunctionInfo{102, nullptr, "FormatBaseFileSystem"}, + FunctionInfo{110, nullptr, "OpenContentStorageFileSystem"}, + FunctionInfo{120, nullptr, "OpenCloudBackupWorkStorageFileSystem"}, + FunctionInfo{130, nullptr, "OpenCustomStorageFileSystem"}, + FunctionInfo{200, D<&FSP_SRV::OpenDataStorageByCurrentProcess>, "OpenDataStorageByCurrentProcess"}, + FunctionInfo{201, nullptr, "OpenDataStorageByProgramId"}, + FunctionInfo{202, D<&FSP_SRV::OpenDataStorageByDataId>, "OpenDataStorageByDataId"}, + FunctionInfo{203, D<&FSP_SRV::OpenPatchDataStorageByCurrentProcess>, "OpenPatchDataStorageByCurrentProcess"}, + FunctionInfo{204, nullptr, "OpenDataFileSystemByProgramIndex"}, + FunctionInfo{205, D<&FSP_SRV::OpenDataStorageWithProgramIndex>, "OpenDataStorageWithProgramIndex"}, + FunctionInfo{206, nullptr, "OpenDataStorageByPath"}, + FunctionInfo{210, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"}, + FunctionInfo{400, nullptr, "OpenDeviceOperator"}, + FunctionInfo{500, nullptr, "OpenSdCardDetectionEventNotifier"}, + FunctionInfo{501, nullptr, "OpenGameCardDetectionEventNotifier"}, + FunctionInfo{510, nullptr, "OpenSystemDataUpdateEventNotifier"}, + FunctionInfo{511, nullptr, "NotifySystemDataUpdateEvent"}, + FunctionInfo{520, nullptr, "SimulateGameCardDetectionEvent"}, + FunctionInfo{600, nullptr, "SetCurrentPosixTime"}, + FunctionInfo{601, nullptr, "QuerySaveDataTotalSize"}, + FunctionInfo{602, nullptr, "VerifySaveDataFileSystem"}, + FunctionInfo{603, nullptr, "CorruptSaveDataFileSystem"}, + FunctionInfo{604, nullptr, "CreatePaddingFile"}, + FunctionInfo{605, nullptr, "DeleteAllPaddingFiles"}, + FunctionInfo{606, nullptr, "GetRightsId"}, + FunctionInfo{607, nullptr, "RegisterExternalKey"}, + FunctionInfo{608, nullptr, "UnregisterAllExternalKey"}, + FunctionInfo{609, nullptr, "GetRightsIdByPath"}, + FunctionInfo{610, nullptr, "GetRightsIdAndKeyGenerationByPath"}, + FunctionInfo{611, nullptr, "SetCurrentPosixTimeWithTimeDifference"}, + FunctionInfo{612, nullptr, "GetFreeSpaceSizeForSaveData"}, + FunctionInfo{613, nullptr, "VerifySaveDataFileSystemBySaveDataSpaceId"}, + FunctionInfo{614, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId"}, + FunctionInfo{615, nullptr, "QuerySaveDataInternalStorageTotalSize"}, + FunctionInfo{616, nullptr, "GetSaveDataCommitId"}, + FunctionInfo{617, nullptr, "UnregisterExternalKey"}, + FunctionInfo{620, nullptr, "SetSdCardEncryptionSeed"}, + FunctionInfo{630, nullptr, "SetSdCardAccessibility"}, + FunctionInfo{631, D<&FSP_SRV::IsSdCardAccessible>, "IsSdCardAccessible"}, + FunctionInfo{640, nullptr, "IsSignedSystemPartitionOnSdCardValid"}, + FunctionInfo{700, nullptr, "OpenAccessFailureResolver"}, + FunctionInfo{701, nullptr, "GetAccessFailureDetectionEvent"}, + FunctionInfo{702, nullptr, "IsAccessFailureDetected"}, + FunctionInfo{710, nullptr, "ResolveAccessFailure"}, + FunctionInfo{720, nullptr, "AbandonAccessFailure"}, + FunctionInfo{800, nullptr, "GetAndClearFileSystemProxyErrorInfo"}, + FunctionInfo{810, nullptr, "RegisterProgramIndexMapInfo"}, + FunctionInfo{820, nullptr, "GetContentStorageInfoIndex"}, + FunctionInfo{830, nullptr, "EncryptStreamPlaySaveData"}, + FunctionInfo{831, nullptr, "DecryptStreamPlaySaveData"}, + FunctionInfo{1000, nullptr, "SetBisRootForHost"}, + FunctionInfo{1001, nullptr, "SetSaveDataSize"}, + FunctionInfo{1002, nullptr, "SetSaveDataRootPath"}, + FunctionInfo{1003, D<&FSP_SRV::DisableAutoSaveDataCreation>, "DisableAutoSaveDataCreation"}, + FunctionInfo{1004, D<&FSP_SRV::SetGlobalAccessLogMode>, "SetGlobalAccessLogMode"}, + FunctionInfo{1005, D<&FSP_SRV::GetGlobalAccessLogMode>, "GetGlobalAccessLogMode"}, + FunctionInfo{1006, D<&FSP_SRV::OutputAccessLogToSdCard>, "OutputAccessLogToSdCard"}, + FunctionInfo{1007, nullptr, "RegisterUpdatePartition"}, + FunctionInfo{1008, nullptr, "OpenRegisteredUpdatePartition"}, + FunctionInfo{1009, nullptr, "GetAndClearMemoryReportInfo"}, + FunctionInfo{1010, nullptr, "SetDataStorageRedirectTarget"}, + FunctionInfo{1011, D<&FSP_SRV::GetProgramIndexForAccessLog>, "GetProgramIndexForAccessLog"}, + FunctionInfo{1012, nullptr, "GetFsStackUsage"}, + FunctionInfo{1013, nullptr, "UnsetSaveDataRootPath"}, + FunctionInfo{1014, nullptr, "OutputMultiProgramTagAccessLog"}, + FunctionInfo{1016, D<&FSP_SRV::FlushAccessLogOnSdCard>, "FlushAccessLogOnSdCard"}, + FunctionInfo{1017, nullptr, "OutputApplicationInfoAccessLog"}, + FunctionInfo{1018, nullptr, "SetDebugOption"}, + FunctionInfo{1019, nullptr, "UnsetDebugOption"}, + FunctionInfo{1100, nullptr, "OverrideSaveDataTransferTokenSignVerificationKey"}, + FunctionInfo{1110, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId2"}, + FunctionInfo{1200, D<&FSP_SRV::OpenMultiCommitManager>, "OpenMultiCommitManager"}, + FunctionInfo{1300, nullptr, "OpenBisWiper"} + ); + return HandlerTableGenerateWithFind(key, functions); +} +FSP_SRV::FSP_SRV(Core::System& system_) + : ServiceFramework{system_, "fsp-srv"}, fsc{system.GetFileSystemController()}, content_provider{system.GetContentProvider()}, reporter{system.GetReporter()} { if (Settings::values.enable_fs_access_log) { access_log_mode = AccessLogMode::SdCard; } diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.h b/src/core/hle/service/filesystem/fsp/fsp_srv.h index 156cf4e571..ebda008bcc 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_srv.h +++ b/src/core/hle/service/filesystem/fsp/fsp_srv.h @@ -115,6 +115,7 @@ private: s64 available_size, s64 journal_size); Result GetCacheStorageSize(s32 index, Out out_data_size, Out out_journal_size); + std::optional FindRequest(u32 key) override; FileSystemController& fsc; const FileSys::ContentProvider& content_provider; const Core::Reporter& reporter; diff --git a/src/core/hle/service/friend/friend.cpp b/src/core/hle/service/friend/friend.cpp index f8690dbb8b..5480d22b83 100644 --- a/src/core/hle/service/friend/friend.cpp +++ b/src/core/hle/service/friend/friend.cpp @@ -11,139 +11,38 @@ #include "core/hle/kernel/k_event.h" #include "core/hle/service/acc/errors.h" #include "core/hle/service/friend/friend.h" -#include "core/hle/service/friend/friend_interface.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/kernel_helpers.h" #include "core/hle/service/server_manager.h" namespace Service::Friend { +class Friend final : public Module::Interface { +public: + explicit Friend(std::shared_ptr module_, Core::System& system_, const char* name) : Interface(std::move(module_), system_, name) {} + ~Friend() override = default; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &Friend::CreateFriendService, "CreateFriendService"}, + FunctionInfo{1, &Friend::CreateNotificationService, "CreateNotificationService"}, + FunctionInfo{2, nullptr, "CreateDaemonSuspendSessionService"} + ); +}; + class IFriendService final : public ServiceFramework { public: explicit IFriendService(Core::System& system_) : ServiceFramework{system_, "IFriendService"}, service_context{system, "IFriendService"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IFriendService::GetCompletionEvent, "GetCompletionEvent"}, - {1, &IFriendService::Cancel, "Cancel"}, - {10100, nullptr, "GetFriendListIds"}, - {10101, &IFriendService::GetFriendList, "GetFriendList"}, - {10102, nullptr, "UpdateFriendInfo"}, - {10110, nullptr, "GetFriendProfileImage"}, - {10111, nullptr, "GetFriendProfileImageWithImageSize"}, // 18.0.0+ - {10120, &IFriendService::CheckFriendListAvailability, "CheckFriendListAvailability"}, - {10121, nullptr, "EnsureFriendListAvailable"}, - {10200, nullptr, "SendFriendRequestForApplication"}, - {10211, nullptr, "AddFacedFriendRequestForApplication"}, - {10400, &IFriendService::GetBlockedUserListIds, "GetBlockedUserListIds"}, - {10420, &IFriendService::CheckBlockedUserListAvailability, "CheckBlockedUserListAvailability"}, - {10421, nullptr, "EnsureBlockedUserListAvailable"}, - {10500, nullptr, "GetProfileList"}, - {10501, nullptr, "GetProfileListV2"}, // 18.0.0+ - {10600, nullptr, "DeclareOpenOnlinePlaySession"}, - {10601, &IFriendService::DeclareCloseOnlinePlaySession, "DeclareCloseOnlinePlaySession"}, - {10610, &IFriendService::UpdateUserPresence, "UpdateUserPresence"}, - {10700, &IFriendService::GetPlayHistoryRegistrationKey, "GetPlayHistoryRegistrationKey"}, - {10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"}, - {10702, nullptr, "AddPlayHistory"}, - {11000, nullptr, "GetProfileImageUrl"}, - {11001, nullptr, "GetProfileImageUrlV2"}, // 18.0.0+ - {20100, &IFriendService::GetFriendCount, "GetFriendCount"}, - {20101, &IFriendService::GetNewlyFriendCount, "GetNewlyFriendCount"}, - {20102, nullptr, "GetFriendDetailedInfo"}, - {20103, nullptr, "SyncFriendList"}, - {20104, &IFriendService::RequestSyncFriendList, "RequestSyncFriendList"}, - {20105, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV1"}, - {20106, nullptr, "UpdateFriendInfoForViewerV1"}, - {20107, nullptr, "GetFriendDetailedInfoV2"}, // 20.0.0+ - {20108, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV2"}, // 22.0.0+ - {20109, nullptr, "UpdateFriendInfoForViewerV2"}, // 22.0.0+ - {20110, nullptr, "LoadFriendSettingV1"}, - {20111, nullptr, "LoadFriendSettingV2"}, // 22.0.0+ - {20200, &IFriendService::GetReceivedFriendRequestCount, "GetReceivedFriendRequestCount"}, - {20201, nullptr, "GetFriendRequestListV1"}, - {20202, nullptr, "GetFriendRequestListV2"}, // 20.0.0+ - {20203, nullptr, "GetFriendRequestReceivedNotificationCount"}, // 22.0.0+ - {20300, nullptr, "GetFriendCandidateList"}, - {20301, nullptr, "GetNintendoNetworkIdInfo"}, - {20302, nullptr, "GetSnsAccountLinkage"}, // 5.0.0-19.0.1 - {20303, nullptr, "GetSnsAccountProfile"}, // 5.0.0-19.0.1 - {20304, nullptr, "GetSnsAccountFriendList"}, // 5.0.0-19.0.1 - {20400, nullptr, "GetBlockedUserListV1"}, - {20401, nullptr, "SyncBlockedUserList"}, - {20402, nullptr, "GetBlockedUserListV2"}, // 20.0.0+ - {20500, nullptr, "GetProfileExtraListV1"}, - {20501, nullptr, "GetRelationship"}, - {20502, nullptr, "GetProfileExtraListV2"}, // 19.0.0+ - {20600, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV1"}, - {20601, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV2"}, // 19.0.0+ - {20700, nullptr, "GetPlayHistoryListV1"}, - {20701, &IFriendService::GetPlayHistoryStatistics, "GetPlayHistoryStatistics"}, - {20702, nullptr, "GetPlayHistoryListV2"}, // 19.0.0+ - {20800, &IFriendService::LoadUserSetting, "LoadUserSettingV1"}, - {20801, nullptr, "SyncUserSetting"}, - {20802, &IFriendService::LoadUserSetting, "LoadUserSettingV2"}, // 19.0.0+ - {20900, &IFriendService::RequestListSummaryOverlayNotification, "RequestListSummaryOverlayNotification"}, - {21000, nullptr, "GetExternalApplicationCatalog"}, - {22000, nullptr, "GetReceivedFriendInvitationListV1"}, - {22001, nullptr, "GetReceivedFriendInvitationDetailedInfoV1"}, - {22002, nullptr, "GetReceivedFriendInvitationListV2"}, // 19.0.0+ - {22003, nullptr, "GetReceivedFriendInvitationDetailedInfoV2"}, // 19.0.0+ - {22010, &IFriendService::GetReceivedFriendInvitationCountCache, "GetReceivedFriendInvitationCountCache"}, - {30100, nullptr, "DropFriendNewlyFlags"}, - {30101, nullptr, "DeleteFriend"}, - {30110, nullptr, "DropFriendNewlyFlag"}, - {30120, nullptr, "ChangeFriendFavoriteFlag"}, - {30121, nullptr, "ChangeFriendOnlineNotificationFlag"}, - {30130, nullptr, "SetFriendNote"}, // 22.0.0+ - {30131, nullptr, "RequestUploadPendingNote"}, // 22.0.0+ - {30190, nullptr, "RequestSyncLocalUpdates"}, // 22.0.0+ - {30200, nullptr, "SendFriendRequest"}, - {30201, nullptr, "SendFriendRequestWithApplicationInfoV1"}, - {30202, nullptr, "CancelFriendRequest"}, - {30203, nullptr, "AcceptFriendRequest"}, - {30204, nullptr, "RejectFriendRequest"}, - {30205, nullptr, "ReadFriendRequest"}, - {30210, nullptr, "GetFacedFriendRequestRegistrationKey"}, - {30211, nullptr, "AddFacedFriendRequest"}, - {30212, nullptr, "CancelFacedFriendRequest"}, - {30213, nullptr, "GetFacedFriendRequestProfileImage"}, - {30214, nullptr, "GetFacedFriendRequestProfileImageFromPath"}, - {30215, nullptr, "SendFriendRequestWithExternalApplicationCatalogId"}, - {30216, nullptr, "ResendFacedFriendRequest"}, - {30217, nullptr, "SendFriendRequestWithNintendoNetworkIdInfo"}, - {30218, nullptr, "SendFriendRequestWithApplicationInfoV2"}, // 20.0.0+ - {30300, nullptr, "GetSnsAccountLinkPageUrl"}, // 5.0.0-19.0.1 - {30301, nullptr, "UnlinkSnsAccount"}, // 5.0.0-19.0.1 - {30400, nullptr, "BlockUser"}, - {30401, nullptr, "BlockUserWithApplicationInfoV1"}, - {30402, nullptr, "UnblockUser"}, - {30403, nullptr, "BlockUserWithApplicationInfoV2"}, // 20.0.0+ - {30500, nullptr, "GetProfileExtraFromFriendCodeV1"}, - {30501, nullptr, "GetProfileExtraFromFriendCodeV2"}, // 19.0.0+ - {30700, nullptr, "DeletePlayHistory"}, - {30701, nullptr, "AddPlayHistoryWithApplication"}, // 19.0.0+ - {30810, nullptr, "ChangePresencePermission"}, - {30811, nullptr, "ChangeFriendRequestReception"}, - {30812, nullptr, "ChangePlayLogPermission"}, - {30820, nullptr, "IssueFriendCode"}, - {30830, nullptr, "ClearPlayLog"}, - {30900, nullptr, "SendFriendInvitationV1"}, - {30901, nullptr, "SendFriendInvitationV2"}, // 19.0.0+ - {30910, nullptr, "ReadFriendInvitation"}, - {30911, nullptr, "ReadAllFriendInvitations"}, - {31000, nullptr, "OpenUser"}, // 19.0.0+ - {40100, nullptr, "DeleteFriendListCache"}, - {40400, nullptr, "DeleteBlockedUserListCache"}, - {49900, nullptr, "DeleteNetworkServiceAccountCache"}, - }; - // clang-format on - - RegisterHandlers(functions); - completion_event = service_context.CreateEvent("IFriendService:CompletionEvent"); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + ~IFriendService() override { service_context.CloseEvent(completion_event); } @@ -367,29 +266,136 @@ private: rb.Push(0); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IFriendService::GetCompletionEvent, "GetCompletionEvent"}, + FunctionInfo{1, &IFriendService::Cancel, "Cancel"}, + FunctionInfo{10100, nullptr, "GetFriendListIds"}, + FunctionInfo{10101, &IFriendService::GetFriendList, "GetFriendList"}, + FunctionInfo{10102, nullptr, "UpdateFriendInfo"}, + FunctionInfo{10110, nullptr, "GetFriendProfileImage"}, + FunctionInfo{10111, nullptr, "GetFriendProfileImageWithImageSize", MakeVersionGate({18,0,0})}, + FunctionInfo{10120, &IFriendService::CheckFriendListAvailability, "CheckFriendListAvailability"}, + FunctionInfo{10121, nullptr, "EnsureFriendListAvailable"}, + FunctionInfo{10200, nullptr, "SendFriendRequestForApplication"}, + FunctionInfo{10211, nullptr, "AddFacedFriendRequestForApplication"}, + FunctionInfo{10400, &IFriendService::GetBlockedUserListIds, "GetBlockedUserListIds"}, + FunctionInfo{10420, &IFriendService::CheckBlockedUserListAvailability, "CheckBlockedUserListAvailability"}, + FunctionInfo{10421, nullptr, "EnsureBlockedUserListAvailable"}, + FunctionInfo{10500, nullptr, "GetProfileList"}, + FunctionInfo{10501, nullptr, "GetProfileListV2", MakeVersionGate({18,0,0})}, + FunctionInfo{10600, nullptr, "DeclareOpenOnlinePlaySession"}, + FunctionInfo{10601, &IFriendService::DeclareCloseOnlinePlaySession, "DeclareCloseOnlinePlaySession"}, + FunctionInfo{10610, &IFriendService::UpdateUserPresence, "UpdateUserPresence"}, + FunctionInfo{10700, &IFriendService::GetPlayHistoryRegistrationKey, "GetPlayHistoryRegistrationKey"}, + FunctionInfo{10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"}, + FunctionInfo{10702, nullptr, "AddPlayHistory"}, + FunctionInfo{11000, nullptr, "GetProfileImageUrl"}, + FunctionInfo{11001, nullptr, "GetProfileImageUrlV2", MakeVersionGate({18,0,0})}, + FunctionInfo{20100, &IFriendService::GetFriendCount, "GetFriendCount"}, + FunctionInfo{20101, &IFriendService::GetNewlyFriendCount, "GetNewlyFriendCount"}, + FunctionInfo{20102, nullptr, "GetFriendDetailedInfo"}, + FunctionInfo{20103, nullptr, "SyncFriendList"}, + FunctionInfo{20104, &IFriendService::RequestSyncFriendList, "RequestSyncFriendList"}, + FunctionInfo{20105, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV1"}, + FunctionInfo{20106, nullptr, "UpdateFriendInfoForViewerV1"}, + FunctionInfo{20107, nullptr, "GetFriendDetailedInfoV2", MakeVersionGate({20,0,0})}, + FunctionInfo{20108, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV2", MakeVersionGate({22,0,0})}, + FunctionInfo{20109, nullptr, "UpdateFriendInfoForViewerV2", MakeVersionGate({22,0,0})}, + FunctionInfo{20110, nullptr, "LoadFriendSettingV1"}, + FunctionInfo{20111, nullptr, "LoadFriendSettingV2", MakeVersionGate({22,0,0})}, + FunctionInfo{20200, &IFriendService::GetReceivedFriendRequestCount, "GetReceivedFriendRequestCount"}, + FunctionInfo{20201, nullptr, "GetFriendRequestListV1"}, + FunctionInfo{20202, nullptr, "GetFriendRequestListV2", MakeVersionGate({20,0,0})}, + FunctionInfo{20203, nullptr, "GetFriendRequestReceivedNotificationCount", MakeVersionGate({22,0,0})}, + FunctionInfo{20300, nullptr, "GetFriendCandidateList"}, + FunctionInfo{20301, nullptr, "GetNintendoNetworkIdInfo"}, + FunctionInfo{20302, nullptr, "GetSnsAccountLinkage", MakeVersionGate({5,0,0}, {19,0,1})}, + FunctionInfo{20303, nullptr, "GetSnsAccountProfile", MakeVersionGate({5,0,0}, {19,0,1})}, + FunctionInfo{20304, nullptr, "GetSnsAccountFriendList", MakeVersionGate({5,0,0}, {19,0,1})}, + FunctionInfo{20400, nullptr, "GetBlockedUserListV1"}, + FunctionInfo{20401, nullptr, "SyncBlockedUserList"}, + FunctionInfo{20402, nullptr, "GetBlockedUserListV2", MakeVersionGate({20,0,0})}, + FunctionInfo{20500, nullptr, "GetProfileExtraListV1"}, + FunctionInfo{20501, nullptr, "GetRelationship"}, + FunctionInfo{20502, nullptr, "GetProfileExtraListV2", MakeVersionGate({19,0,0})}, + FunctionInfo{20600, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV1"}, + FunctionInfo{20601, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV2", MakeVersionGate({19,0,0})}, + FunctionInfo{20700, nullptr, "GetPlayHistoryListV1"}, + FunctionInfo{20701, &IFriendService::GetPlayHistoryStatistics, "GetPlayHistoryStatistics"}, + FunctionInfo{20702, nullptr, "GetPlayHistoryListV2", MakeVersionGate({19,0,0})}, + FunctionInfo{20800, &IFriendService::LoadUserSetting, "LoadUserSettingV1"}, + FunctionInfo{20801, nullptr, "SyncUserSetting"}, + FunctionInfo{20802, &IFriendService::LoadUserSetting, "LoadUserSettingV2", MakeVersionGate({19,0,0})}, + FunctionInfo{20900, &IFriendService::RequestListSummaryOverlayNotification, "RequestListSummaryOverlayNotification"}, + FunctionInfo{21000, nullptr, "GetExternalApplicationCatalog"}, + FunctionInfo{22000, nullptr, "GetReceivedFriendInvitationListV1"}, + FunctionInfo{22001, nullptr, "GetReceivedFriendInvitationDetailedInfoV1"}, + FunctionInfo{22002, nullptr, "GetReceivedFriendInvitationListV2", MakeVersionGate({19,0,0})}, + FunctionInfo{22003, nullptr, "GetReceivedFriendInvitationDetailedInfoV2", MakeVersionGate({19,0,0})}, + FunctionInfo{22010, &IFriendService::GetReceivedFriendInvitationCountCache, "GetReceivedFriendInvitationCountCache"}, + FunctionInfo{30100, nullptr, "DropFriendNewlyFlags"}, + FunctionInfo{30101, nullptr, "DeleteFriend"}, + FunctionInfo{30110, nullptr, "DropFriendNewlyFlag"}, + FunctionInfo{30120, nullptr, "ChangeFriendFavoriteFlag"}, + FunctionInfo{30121, nullptr, "ChangeFriendOnlineNotificationFlag"}, + FunctionInfo{30130, nullptr, "SetFriendNote", MakeVersionGate({22,0,0})}, + FunctionInfo{30131, nullptr, "RequestUploadPendingNote", MakeVersionGate({22,0,0})}, + FunctionInfo{30190, nullptr, "RequestSyncLocalUpdates", MakeVersionGate({22,0,0})}, + FunctionInfo{30200, nullptr, "SendFriendRequest"}, + FunctionInfo{30201, nullptr, "SendFriendRequestWithApplicationInfoV1"}, + FunctionInfo{30202, nullptr, "CancelFriendRequest"}, + FunctionInfo{30203, nullptr, "AcceptFriendRequest"}, + FunctionInfo{30204, nullptr, "RejectFriendRequest"}, + FunctionInfo{30205, nullptr, "ReadFriendRequest"}, + FunctionInfo{30210, nullptr, "GetFacedFriendRequestRegistrationKey"}, + FunctionInfo{30211, nullptr, "AddFacedFriendRequest"}, + FunctionInfo{30212, nullptr, "CancelFacedFriendRequest"}, + FunctionInfo{30213, nullptr, "GetFacedFriendRequestProfileImage"}, + FunctionInfo{30214, nullptr, "GetFacedFriendRequestProfileImageFromPath"}, + FunctionInfo{30215, nullptr, "SendFriendRequestWithExternalApplicationCatalogId"}, + FunctionInfo{30216, nullptr, "ResendFacedFriendRequest"}, + FunctionInfo{30217, nullptr, "SendFriendRequestWithNintendoNetworkIdInfo"}, + FunctionInfo{30218, nullptr, "SendFriendRequestWithApplicationInfoV2", MakeVersionGate({20,0,0})}, + FunctionInfo{30300, nullptr, "GetSnsAccountLinkPageUrl", MakeVersionGate({5,0,0}, {19,0,1})}, + FunctionInfo{30301, nullptr, "UnlinkSnsAccount", MakeVersionGate({5,0,0}, {19,0,1})}, + FunctionInfo{30400, nullptr, "BlockUser"}, + FunctionInfo{30401, nullptr, "BlockUserWithApplicationInfoV1"}, + FunctionInfo{30402, nullptr, "UnblockUser"}, + FunctionInfo{30403, nullptr, "BlockUserWithApplicationInfoV2", MakeVersionGate({20,0,0})}, + FunctionInfo{30500, nullptr, "GetProfileExtraFromFriendCodeV1"}, + FunctionInfo{30501, nullptr, "GetProfileExtraFromFriendCodeV2", MakeVersionGate({19,0,0})}, + FunctionInfo{30700, nullptr, "DeletePlayHistory"}, + FunctionInfo{30701, nullptr, "AddPlayHistoryWithApplication", MakeVersionGate({19,0,0})}, + FunctionInfo{30810, nullptr, "ChangePresencePermission"}, + FunctionInfo{30811, nullptr, "ChangeFriendRequestReception"}, + FunctionInfo{30812, nullptr, "ChangePlayLogPermission"}, + FunctionInfo{30820, nullptr, "IssueFriendCode"}, + FunctionInfo{30830, nullptr, "ClearPlayLog"}, + FunctionInfo{30900, nullptr, "SendFriendInvitationV1"}, + FunctionInfo{30901, nullptr, "SendFriendInvitationV2", MakeVersionGate({19,0,0})}, + FunctionInfo{30910, nullptr, "ReadFriendInvitation"}, + FunctionInfo{30911, nullptr, "ReadAllFriendInvitations"}, + FunctionInfo{31000, nullptr, "OpenUser", MakeVersionGate({19,0,0})}, + FunctionInfo{40100, nullptr, "DeleteFriendListCache"}, + FunctionInfo{40400, nullptr, "DeleteBlockedUserListCache"}, + FunctionInfo{49900, nullptr, "DeleteNetworkServiceAccountCache"} + ); KernelHelpers::ServiceContext service_context; - Kernel::KEvent* completion_event; }; class INotificationService final : public ServiceFramework { public: explicit INotificationService(Core::System& system_, Common::UUID uuid_) - : ServiceFramework{system_, "INotificationService"}, uuid{uuid_}, - service_context{system_, "INotificationService"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &INotificationService::GetEvent, "GetEvent"}, - {1, &INotificationService::Clear, "Clear"}, - {2, &INotificationService::Pop, "Pop"} - }; - // clang-format on - - RegisterHandlers(functions); - + : ServiceFramework{system_, "INotificationService"}, uuid{uuid_} + , service_context{system_, "INotificationService"} { notification_event = service_context.CreateEvent("INotificationService:NotifyEvent"); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + ~INotificationService() override { service_context.CloseEvent(notification_event); } @@ -465,9 +471,13 @@ private: bool has_received_friend_request; }; + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &INotificationService::GetEvent, "GetEvent"}, + FunctionInfo{1, &INotificationService::Clear, "Clear"}, + FunctionInfo{2, &INotificationService::Pop, "Pop"} + ); Common::UUID uuid; KernelHelpers::ServiceContext service_context; - Kernel::KEvent* notification_event; std::queue notifications; States states{}; @@ -501,61 +511,67 @@ class IServiceForApplication final : public ServiceFramework FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetReceivableNeighborInfoCountMax"}, + FunctionInfo{10, nullptr, "IsNeighborDetectionEnabled"} + ); }; class IServiceForSystem final : public ServiceFramework { public: explicit IServiceForSystem(Core::System& system_) : ServiceFramework{system_, "nd:sys"} - { - static const FunctionInfo functions[] = { - {0, nullptr, "GetReceivableNeighborInfoCountMax"}, - {10, nullptr, "IsNeighborDetectionEnabled"}, - {200, nullptr, "SetSystemData"}, - {201, nullptr, "ClearSystemData"}, - {203, nullptr, "GetReceivableNeighborInfoCountForSystem"}, - {204, nullptr, "ReceiveNeighborInfoForSystem"}, - {205, nullptr, "SetSender"}, - {206, nullptr, "GetSender"}, - {207, nullptr, "CreateScannerForSystem"}, - {208, nullptr, "CreateReceiveEventHolderForSystem"}, - {223, nullptr, "EnableNeighborDetection"}, - {224, nullptr, "DisableNeighborDetection"}, - {226, nullptr, "EnablePowerSave"}, - {227, nullptr, "DisablePowerSave"}, - {228, nullptr, "IsPowerSaveEnabled"}, - {232, nullptr, "ClearBlockedUsers"}, - {233, nullptr, "GetBlockedUserCount"}, - {234, nullptr, "BlockUserByLocalUserId"}, - {235, nullptr, "BlockUserByNetworkUserId"}, - {236, nullptr, "UnblockUserByLocalUserId"}, - {237, nullptr, "UnblockUserByNetworkUserId"}, - {240, nullptr, "DeleteApplication"}, - {250, nullptr, "InitializeApplicationInfo"}, - {260, nullptr, "CreateAccountSystemSaveDataAccessSuppressor"}, - {300, nullptr, "AddReceivedNeighborInfoForSystemForDebug"}, - {301, nullptr, "GetSendDataForDebug"}, - {302, nullptr, "ClearReceiveCounterForDebug"}, - {303, nullptr, "GetNextReceiveCounterForDebug"}, - {304, nullptr, "ListBlockedUsersForDebug"}, - {305, nullptr, "RefreshSendDataIdForDebug"}, - {306, nullptr, "ReloadFwdbgSettingsForDebug"}, - {307, nullptr, "EnableApplicationForDebug"}, - {308, nullptr, "GetNextReceiveCountersForDebug"}, - {309, nullptr, "ListApplicationInfoForDebug"}, - {310, nullptr, "SetApplicationDataForDebug"}, - {400, nullptr, "GetNetworkUserId"}, - {401, nullptr, "DeleteNetworkUserId"}, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetReceivableNeighborInfoCountMax"}, + FunctionInfo{10, nullptr, "IsNeighborDetectionEnabled"}, + FunctionInfo{200, nullptr, "SetSystemData"}, + FunctionInfo{201, nullptr, "ClearSystemData"}, + FunctionInfo{203, nullptr, "GetReceivableNeighborInfoCountForSystem"}, + FunctionInfo{204, nullptr, "ReceiveNeighborInfoForSystem"}, + FunctionInfo{205, nullptr, "SetSender"}, + FunctionInfo{206, nullptr, "GetSender"}, + FunctionInfo{207, nullptr, "CreateScannerForSystem"}, + FunctionInfo{208, nullptr, "CreateReceiveEventHolderForSystem"}, + FunctionInfo{223, nullptr, "EnableNeighborDetection"}, + FunctionInfo{224, nullptr, "DisableNeighborDetection"}, + FunctionInfo{226, nullptr, "EnablePowerSave"}, + FunctionInfo{227, nullptr, "DisablePowerSave"}, + FunctionInfo{228, nullptr, "IsPowerSaveEnabled"}, + FunctionInfo{232, nullptr, "ClearBlockedUsers"}, + FunctionInfo{233, nullptr, "GetBlockedUserCount"}, + FunctionInfo{234, nullptr, "BlockUserByLocalUserId"}, + FunctionInfo{235, nullptr, "BlockUserByNetworkUserId"}, + FunctionInfo{236, nullptr, "UnblockUserByLocalUserId"}, + FunctionInfo{237, nullptr, "UnblockUserByNetworkUserId"}, + FunctionInfo{240, nullptr, "DeleteApplication"}, + FunctionInfo{250, nullptr, "InitializeApplicationInfo"}, + FunctionInfo{260, nullptr, "CreateAccountSystemSaveDataAccessSuppressor"}, + FunctionInfo{300, nullptr, "AddReceivedNeighborInfoForSystemForDebug"}, + FunctionInfo{301, nullptr, "GetSendDataForDebug"}, + FunctionInfo{302, nullptr, "ClearReceiveCounterForDebug"}, + FunctionInfo{303, nullptr, "GetNextReceiveCounterForDebug"}, + FunctionInfo{304, nullptr, "ListBlockedUsersForDebug"}, + FunctionInfo{305, nullptr, "RefreshSendDataIdForDebug"}, + FunctionInfo{306, nullptr, "ReloadFwdbgSettingsForDebug"}, + FunctionInfo{307, nullptr, "EnableApplicationForDebug"}, + FunctionInfo{308, nullptr, "GetNextReceiveCountersForDebug"}, + FunctionInfo{309, nullptr, "ListApplicationInfoForDebug"}, + FunctionInfo{310, nullptr, "SetApplicationDataForDebug"}, + FunctionInfo{400, nullptr, "GetNetworkUserId"}, + FunctionInfo{401, nullptr, "DeleteNetworkUserId"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/friend/friend_interface.cpp b/src/core/hle/service/friend/friend_interface.cpp deleted file mode 100644 index c8b98b1f0c..0000000000 --- a/src/core/hle/service/friend/friend_interface.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/friend/friend_interface.h" - -namespace Service::Friend { - -Friend::Friend(std::shared_ptr module_, Core::System& system_, const char* name) - : Interface(std::move(module_), system_, name) { - static const FunctionInfo functions[] = { - {0, &Friend::CreateFriendService, "CreateFriendService"}, - {1, &Friend::CreateNotificationService, "CreateNotificationService"}, - {2, nullptr, "CreateDaemonSuspendSessionService"}, - }; - RegisterHandlers(functions); -} - -Friend::~Friend() = default; - -} // namespace Service::Friend diff --git a/src/core/hle/service/friend/friend_interface.h b/src/core/hle/service/friend/friend_interface.h deleted file mode 100644 index 3a2184c347..0000000000 --- a/src/core/hle/service/friend/friend_interface.h +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/friend/friend.h" - -namespace Service::Friend { - -class Friend final : public Module::Interface { -public: - explicit Friend(std::shared_ptr module_, Core::System& system_, const char* name); - ~Friend() override; -}; - -} // namespace Service::Friend diff --git a/src/core/hle/service/glue/arp.cpp b/src/core/hle/service/glue/arp.cpp index 7eda57ddc3..203adb7ca7 100644 --- a/src/core/hle/service/glue/arp.cpp +++ b/src/core/hle/service/glue/arp.cpp @@ -35,22 +35,6 @@ std::optional GetTitleIDForProcessID(Core::System& system, u64 process_id) ARP_R::ARP_R(Core::System& system_, const ARPManager& manager_) : ServiceFramework{system_, "arp:r"}, manager{manager_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &ARP_R::GetApplicationLaunchProperty, "GetApplicationLaunchProperty"}, - {1, &ARP_R::GetApplicationLaunchPropertyWithApplicationId, "GetApplicationLaunchPropertyWithApplicationId"}, - {2, &ARP_R::GetApplicationControlProperty, "GetApplicationControlProperty"}, - {3, &ARP_R::GetApplicationControlPropertyWithApplicationId, "GetApplicationControlPropertyWithApplicationId"}, - {4, nullptr, "GetApplicationInstanceUnregistrationNotifier"}, - {5, nullptr, "ListApplicationInstanceId"}, - {6, nullptr, "GetMicroApplicationInstanceId"}, - {7, nullptr, "GetApplicationCertificate"}, - {9998, nullptr, "GetPreomiaApplicationLaunchProperty"}, - {9999, nullptr, "GetPreomiaApplicationControlProperty"}, - }; - // clang-format on - - RegisterHandlers(functions); } ARP_R::~ARP_R() = default; @@ -164,16 +148,10 @@ public: using IssuerFn = std::function)>; explicit IRegistrar(Core::System& system_, IssuerFn&& issuer) - : ServiceFramework{system_, "IRegistrar"}, issue_process_id{std::move(issuer)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IRegistrar::Issue, "Issue"}, - {1, &IRegistrar::SetApplicationLaunchProperty, "SetApplicationLaunchProperty"}, - {2, &IRegistrar::SetApplicationControlProperty, "SetApplicationControlProperty"}, - }; - // clang-format on + : ServiceFramework{system_, "IRegistrar"}, issue_process_id{std::move(issuer)} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -238,6 +216,11 @@ private: rb.Push(ResultSuccess); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IRegistrar::Issue, "Issue"}, + FunctionInfo{1, &IRegistrar::SetApplicationLaunchProperty, "SetApplicationLaunchProperty"}, + FunctionInfo{2, &IRegistrar::SetApplicationControlProperty, "SetApplicationControlProperty"} + ); IssuerFn issue_process_id; bool issued = false; ApplicationLaunchProperty launch{}; @@ -246,15 +229,6 @@ private: ARP_W::ARP_W(Core::System& system_, ARPManager& manager_) : ServiceFramework{system_, "arp:w"}, manager{manager_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &ARP_W::AcquireRegistrar, "AcquireRegistrar"}, - {1, &ARP_W::UnregisterApplicationInstance , "UnregisterApplicationInstance "}, - {2, nullptr, "AcquireUpdater"}, - }; - // clang-format on - - RegisterHandlers(functions); } ARP_W::~ARP_W() = default; diff --git a/src/core/hle/service/glue/arp.h b/src/core/hle/service/glue/arp.h index 5bce801755..de966475f9 100644 --- a/src/core/hle/service/glue/arp.h +++ b/src/core/hle/service/glue/arp.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -21,6 +24,21 @@ private: void GetApplicationControlProperty(HLERequestContext& ctx); void GetApplicationControlPropertyWithApplicationId(HLERequestContext& ctx); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &ARP_R::GetApplicationLaunchProperty, "GetApplicationLaunchProperty"}, + FunctionInfo{1, &ARP_R::GetApplicationLaunchPropertyWithApplicationId, "GetApplicationLaunchPropertyWithApplicationId"}, + FunctionInfo{2, &ARP_R::GetApplicationControlProperty, "GetApplicationControlProperty"}, + FunctionInfo{3, &ARP_R::GetApplicationControlPropertyWithApplicationId, "GetApplicationControlPropertyWithApplicationId"}, + FunctionInfo{4, nullptr, "GetApplicationInstanceUnregistrationNotifier"}, + FunctionInfo{5, nullptr, "ListApplicationInstanceId"}, + FunctionInfo{6, nullptr, "GetMicroApplicationInstanceId"}, + FunctionInfo{7, nullptr, "GetApplicationCertificate"}, + FunctionInfo{9998, nullptr, "GetPreomiaApplicationLaunchProperty"}, + FunctionInfo{9999, nullptr, "GetPreomiaApplicationControlProperty"} + ); const ARPManager& manager; }; @@ -33,6 +51,14 @@ private: void AcquireRegistrar(HLERequestContext& ctx); void UnregisterApplicationInstance(HLERequestContext& ctx); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &ARP_W::AcquireRegistrar, "AcquireRegistrar"}, + FunctionInfo{1, &ARP_W::UnregisterApplicationInstance , "UnregisterApplicationInstance "}, + FunctionInfo{2, nullptr, "AcquireUpdater"} + ); ARPManager& manager; std::shared_ptr registrar; }; diff --git a/src/core/hle/service/glue/bgtc.cpp b/src/core/hle/service/glue/bgtc.cpp index 360f16f0dd..7c7b5ea13c 100644 --- a/src/core/hle/service/glue/bgtc.cpp +++ b/src/core/hle/service/glue/bgtc.cpp @@ -11,15 +11,7 @@ namespace Service::Glue { -BGTC_T::BGTC_T(Core::System& system_) : ServiceFramework{system_, "bgtc:t"} { - // clang-format off - static const FunctionInfo functions[] = { - {100, &BGTC_T::OpenTaskService, "OpenTaskService"}, - }; - // clang-format on - - RegisterHandlers(functions); -} +BGTC_T::BGTC_T(Core::System& system_) : ServiceFramework{system_, "bgtc:t"} {} BGTC_T::~BGTC_T() = default; @@ -32,44 +24,11 @@ void BGTC_T::OpenTaskService(HLERequestContext& ctx) { } ITaskService::ITaskService(Core::System& system_) : ServiceFramework{system_, "ITaskService"} { - // clang-format off - static const FunctionInfo functions[] = { - {1, nullptr, "NotifyTaskStarting"}, - {2, nullptr, "NotifyTaskFinished"}, - {3, nullptr, "GetTriggerEvent"}, - {4, nullptr, "IsInHalfAwake"}, - {5, nullptr, "NotifyClientName"}, - {6, nullptr, "IsInFullAwake"}, - {11, nullptr, "ScheduleTask"}, - {12, nullptr, "GetScheduledTaskInterval"}, - {13, nullptr, "UnscheduleTask"}, - {14, nullptr, "GetScheduleEvent"}, - {15, nullptr, "SchedulePeriodicTask"}, - {16, nullptr, "Unknown16"}, - {101, nullptr, "GetOperationMode"}, - {102, nullptr, "WillDisconnectNetworkWhenEnteringSleep"}, - {103, nullptr, "WillStayHalfAwakeInsteadSleep"}, - {200, nullptr, "Unknown200"}, - }; - // clang-format on - - RegisterHandlers(functions); } ITaskService::~ITaskService() = default; BGTC_SC::BGTC_SC(Core::System& system_) : ServiceFramework{system_, "bgtc:sc"} { - // clang-format off - static const FunctionInfo functions[] = { - {1, nullptr, "GetState"}, - {2, nullptr, "GetStateChangedEvent"}, - {3, nullptr, "NotifyEnteringHalfAwake"}, - {4, nullptr, "NotifyLeavingHalfAwake"}, - {5, nullptr, "SetIsUsingSleepUnsupportedDevices"}, - }; - // clang-format on - - RegisterHandlers(functions); } BGTC_SC::~BGTC_SC() = default; diff --git a/src/core/hle/service/glue/bgtc.h b/src/core/hle/service/glue/bgtc.h index 5a5d9c9a7a..0ef0ab902f 100644 --- a/src/core/hle/service/glue/bgtc.h +++ b/src/core/hle/service/glue/bgtc.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -17,18 +20,57 @@ public: ~BGTC_T() override; void OpenTaskService(HLERequestContext& ctx); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{100, &BGTC_T::OpenTaskService, "OpenTaskService"} + ); }; class ITaskService final : public ServiceFramework { public: explicit ITaskService(Core::System& system_); ~ITaskService() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, nullptr, "NotifyTaskStarting"}, + FunctionInfo{2, nullptr, "NotifyTaskFinished"}, + FunctionInfo{3, nullptr, "GetTriggerEvent"}, + FunctionInfo{4, nullptr, "IsInHalfAwake"}, + FunctionInfo{5, nullptr, "NotifyClientName"}, + FunctionInfo{6, nullptr, "IsInFullAwake"}, + FunctionInfo{11, nullptr, "ScheduleTask"}, + FunctionInfo{12, nullptr, "GetScheduledTaskInterval"}, + FunctionInfo{13, nullptr, "UnscheduleTask"}, + FunctionInfo{14, nullptr, "GetScheduleEvent"}, + FunctionInfo{15, nullptr, "SchedulePeriodicTask"}, + FunctionInfo{16, nullptr, "Unknown16"}, + FunctionInfo{101, nullptr, "GetOperationMode"}, + FunctionInfo{102, nullptr, "WillDisconnectNetworkWhenEnteringSleep"}, + FunctionInfo{103, nullptr, "WillStayHalfAwakeInsteadSleep"}, + FunctionInfo{200, nullptr, "Unknown200"} + ); }; class BGTC_SC final : public ServiceFramework { public: explicit BGTC_SC(Core::System& system_); ~BGTC_SC() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, nullptr, "GetState"}, + FunctionInfo{2, nullptr, "GetStateChangedEvent"}, + FunctionInfo{3, nullptr, "NotifyEnteringHalfAwake"}, + FunctionInfo{4, nullptr, "NotifyLeavingHalfAwake"}, + FunctionInfo{5, nullptr, "SetIsUsingSleepUnsupportedDevices"} + ); }; } // namespace Service::Glue diff --git a/src/core/hle/service/glue/ectx.cpp b/src/core/hle/service/glue/ectx.cpp index 322ae45254..80d22a0ca7 100644 --- a/src/core/hle/service/glue/ectx.cpp +++ b/src/core/hle/service/glue/ectx.cpp @@ -12,14 +12,10 @@ namespace Service::Glue { // This is nn::err::context::IContextRegistrar class IContextRegistrar : public ServiceFramework { public: - IContextRegistrar(Core::System& system_) : ServiceFramework{system_, "IContextRegistrar"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IContextRegistrar::Complete, "Complete"}, - }; - // clang-format on + IContextRegistrar(Core::System& system_) : ServiceFramework{system_, "IContextRegistrar"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } ~IContextRegistrar() override = default; @@ -41,41 +37,21 @@ private: rb.Push(ResultSuccess); rb.Push(0); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IContextRegistrar::Complete, "Complete"} + ); }; ECTX_W::ECTX_W(Core::System& system_) : ServiceFramework{system_, "ectx:w"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "CreateContextRegistrar"}, - {1, nullptr, "CommitContext"}, - {2, nullptr, "RemoveContext"}, - }; - // clang-format on - RegisterHandlers(functions); } ECTX_W::~ECTX_W() = default; ECTX_R::ECTX_R(Core::System& system_) : ServiceFramework{system_, "ectx:r"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetContextInfo"}, - {1, nullptr, "PullContext"}, - {2, nullptr, "ListContextDescriptorWithResultForDebug"}, - }; - // clang-format on - RegisterHandlers(functions); } ECTX_R::~ECTX_R() = default; ECTX_AW::ECTX_AW(Core::System& system_) : ServiceFramework{system_, "ectx:aw"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &ECTX_AW::CreateContextRegistrar, "CreateContextRegistrar"}, - {1, nullptr, "CommitContext"}, - }; - // clang-format on - - RegisterHandlers(functions); } ECTX_AW::~ECTX_AW() = default; diff --git a/src/core/hle/service/glue/ectx.h b/src/core/hle/service/glue/ectx.h index ff48075eda..01f109c609 100644 --- a/src/core/hle/service/glue/ectx.h +++ b/src/core/hle/service/glue/ectx.h @@ -18,12 +18,30 @@ class ECTX_W final : public ServiceFramework { public: explicit ECTX_W(Core::System& system_); ~ECTX_W() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "CreateContextRegistrar"}, + FunctionInfo{1, nullptr, "CommitContext"}, + FunctionInfo{2, nullptr, "RemoveContext"} + ); }; class ECTX_R final : public ServiceFramework { public: explicit ECTX_R(Core::System& system_); ~ECTX_R() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetContextInfo"}, + FunctionInfo{1, nullptr, "PullContext"}, + FunctionInfo{2, nullptr, "ListContextDescriptorWithResultForDebug"} + ); }; class ECTX_AW final : public ServiceFramework { @@ -33,6 +51,14 @@ public: private: void CreateContextRegistrar(HLERequestContext& ctx); + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &ECTX_AW::CreateContextRegistrar, "CreateContextRegistrar"}, + FunctionInfo{1, nullptr, "CommitContext"} + ); }; } // namespace Service::Glue diff --git a/src/core/hle/service/glue/notif.cpp b/src/core/hle/service/glue/notif.cpp index 716e4da32d..a369b78ddd 100644 --- a/src/core/hle/service/glue/notif.cpp +++ b/src/core/hle/service/glue/notif.cpp @@ -17,9 +17,45 @@ namespace Service::Glue { namespace { - constexpr inline std::size_t MaxAlarms = 8; +} +std::optional INotificationServicesForApplication::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{500, D<&INotificationServicesForApplication::RegisterAlarmSetting>, "RegisterAlarmSetting"}, + FunctionInfo{510, D<&INotificationServicesForApplication::UpdateAlarmSetting>, "UpdateAlarmSetting"}, + FunctionInfo{520, D<&INotificationServicesForApplication::ListAlarmSettings>, "ListAlarmSettings"}, + FunctionInfo{530, D<&INotificationServicesForApplication::LoadApplicationParameter>, "LoadApplicationParameter"}, + FunctionInfo{540, D<&INotificationServicesForApplication::DeleteAlarmSetting>, "DeleteAlarmSetting"}, + FunctionInfo{1000, D<&INotificationServicesForApplication::Initialize>, "Initialize"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + +std::optional INotificationServices::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{500, D<&INotificationServices::RegisterAlarmSetting>, "RegisterAlarmSetting"}, + FunctionInfo{510, D<&INotificationServices::UpdateAlarmSetting>, "UpdateAlarmSetting"}, + FunctionInfo{520, D<&INotificationServices::ListAlarmSettings>, "ListAlarmSettings"}, + FunctionInfo{530, D<&INotificationServices::LoadApplicationParameter>, "LoadApplicationParameter"}, + FunctionInfo{540, D<&INotificationServices::DeleteAlarmSetting>, "DeleteAlarmSetting"}, + FunctionInfo{1000, D<&INotificationServices::Initialize>, "Initialize"}, + FunctionInfo{1010, nullptr, "ListNotifications"}, + FunctionInfo{1020, nullptr, "DeleteNotification"}, + FunctionInfo{1030, nullptr, "ClearNotifications"}, + FunctionInfo{1040, D<&INotificationServices::OpenNotificationSystemEventAccessor>, "OpenNotificationSystemEventAccessor"}, + FunctionInfo{1500, nullptr, "SetNotificationPresentationSetting"}, + FunctionInfo{1510, D<&INotificationServices::GetNotificationPresentationSetting>, "GetNotificationPresentationSetting"}, + FunctionInfo{2000, nullptr, "GetAlarmSetting"}, + FunctionInfo{2001, nullptr, "GetAlarmSettingWithApplicationParameter"}, + FunctionInfo{2010, nullptr, "MuteAlarmSetting"}, + FunctionInfo{2020, nullptr, "IsAlarmSettingReady"}, + FunctionInfo{8000, nullptr, "RegisterAppletResourceUserId"}, + FunctionInfo{8010, nullptr, "UnregisterAppletResourceUserId"}, + FunctionInfo{8999, nullptr, "GetCurrentTime"}, + FunctionInfo{9000, nullptr, "GetAlarmSettingNextNotificationTime"} + ); + return HandlerTableGenerateWithFind(key, functions); } Result NotificationServiceImpl::RegisterAlarmSetting(AlarmSettingId* out_alarm_setting_id, @@ -124,18 +160,6 @@ std::vector::iterator NotificationServiceImpl::GetAlarmFromId(Alar INotificationServicesForApplication::INotificationServicesForApplication(Core::System& system_) : ServiceFramework{system_, "notif:a"} { - // clang-format off - static const FunctionInfo functions[] = { - {500, D<&INotificationServicesForApplication::RegisterAlarmSetting>, "RegisterAlarmSetting"}, - {510, D<&INotificationServicesForApplication::UpdateAlarmSetting>, "UpdateAlarmSetting"}, - {520, D<&INotificationServicesForApplication::ListAlarmSettings>, "ListAlarmSettings"}, - {530, D<&INotificationServicesForApplication::LoadApplicationParameter>, "LoadApplicationParameter"}, - {540, D<&INotificationServicesForApplication::DeleteAlarmSetting>, "DeleteAlarmSetting"}, - {1000, D<&INotificationServicesForApplication::Initialize>, "Initialize"}, - }; - // clang-format on - - RegisterHandlers(functions); } INotificationServicesForApplication::~INotificationServicesForApplication() = default; @@ -178,18 +202,13 @@ class INotificationSystemEventAccessor final : public ServiceFramework { public: explicit INotificationSystemEventAccessor(Core::System& system_) - : ServiceFramework{system_, "INotificationSystemEventAccessor"}, - service_context{system_, "INotificationSystemEventAccessor"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&INotificationSystemEventAccessor::GetSystemEvent>, "GetSystemEvent"}, - }; - // clang-format on + : ServiceFramework{system_, "INotificationSystemEventAccessor"} + , service_context{system_, "INotificationSystemEventAccessor"} { + notification_event = service_context.CreateEvent("INotificationSystemEventAccessor:NotificationEvent"); + } - RegisterHandlers(functions); - - notification_event = - service_context.CreateEvent("INotificationSystemEventAccessor:NotificationEvent"); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } ~INotificationSystemEventAccessor() { @@ -204,38 +223,15 @@ private: R_SUCCEED(); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&INotificationSystemEventAccessor::GetSystemEvent>, "GetSystemEvent"} + ); KernelHelpers::ServiceContext service_context; Kernel::KEvent* notification_event; }; INotificationServices::INotificationServices(Core::System& system_) : ServiceFramework{system_, "notif:s"} { - // clang-format off - static const FunctionInfo functions[] = { - {500, D<&INotificationServices::RegisterAlarmSetting>, "RegisterAlarmSetting"}, - {510, D<&INotificationServices::UpdateAlarmSetting>, "UpdateAlarmSetting"}, - {520, D<&INotificationServices::ListAlarmSettings>, "ListAlarmSettings"}, - {530, D<&INotificationServices::LoadApplicationParameter>, "LoadApplicationParameter"}, - {540, D<&INotificationServices::DeleteAlarmSetting>, "DeleteAlarmSetting"}, - {1000, D<&INotificationServices::Initialize>, "Initialize"}, - {1010, nullptr, "ListNotifications"}, - {1020, nullptr, "DeleteNotification"}, - {1030, nullptr, "ClearNotifications"}, - {1040, D<&INotificationServices::OpenNotificationSystemEventAccessor>, "OpenNotificationSystemEventAccessor"}, - {1500, nullptr, "SetNotificationPresentationSetting"}, - {1510, D<&INotificationServices::GetNotificationPresentationSetting>, "GetNotificationPresentationSetting"}, - {2000, nullptr, "GetAlarmSetting"}, - {2001, nullptr, "GetAlarmSettingWithApplicationParameter"}, - {2010, nullptr, "MuteAlarmSetting"}, - {2020, nullptr, "IsAlarmSettingReady"}, - {8000, nullptr, "RegisterAppletResourceUserId"}, - {8010, nullptr, "UnregisterAppletResourceUserId"}, - {8999, nullptr, "GetCurrentTime"}, - {9000, nullptr, "GetAlarmSettingNextNotificationTime"}, - }; - // clang-format on - - RegisterHandlers(functions); } INotificationServices::~INotificationServices() = default; diff --git a/src/core/hle/service/glue/notif.h b/src/core/hle/service/glue/notif.h index ef2522fdfb..c5367e5da4 100644 --- a/src/core/hle/service/glue/notif.h +++ b/src/core/hle/service/glue/notif.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -98,6 +101,7 @@ private: Result DeleteAlarmSetting(AlarmSettingId alarm_setting_id); Result Initialize(ClientAppletResourceUserId aruid); + std::optional FindRequest(u32 key) override; NotificationServiceImpl impl; }; @@ -127,6 +131,7 @@ private: Out out_notification_presentation_setting, NotificationChannel notification_channel); + std::optional FindRequest(u32 key) override; NotificationServiceImpl impl; }; } // namespace Service::Glue diff --git a/src/core/hle/service/glue/time/static.cpp b/src/core/hle/service/glue/time/static.cpp index d8672b7248..dc7651fd1f 100644 --- a/src/core/hle/service/glue/time/static.cpp +++ b/src/core/hle/service/glue/time/static.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 @@ -21,42 +24,42 @@ namespace Service::Glue::Time { +std::optional StaticService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"}, + FunctionInfo{1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"}, + FunctionInfo{2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"}, + FunctionInfo{3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"}, + FunctionInfo{4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"}, + FunctionInfo{5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"}, + FunctionInfo{20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"}, + FunctionInfo{50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"}, + FunctionInfo{51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"}, + FunctionInfo{100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"}, + FunctionInfo{101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"}, + FunctionInfo{102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"}, + FunctionInfo{200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"}, + FunctionInfo{201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"}, + FunctionInfo{300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"}, + FunctionInfo{400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"}, + FunctionInfo{401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"}, + FunctionInfo{500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"}, + FunctionInfo{501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + StaticService::StaticService(Core::System& system_, Service::PSC::Time::StaticServiceSetupInfo setup_info, std::shared_ptr time, const char* name) - : ServiceFramework{system_, name}, m_system{system_}, m_time_m{time->m_time_m}, + : ServiceFramework{system_, name}, m_time_m{time->m_time_m}, m_setup_info{setup_info}, m_time_sm{time->m_time_sm}, m_file_timestamp_worker{time->m_file_timestamp_worker}, m_standard_steady_clock_resource{time->m_steady_clock_resource}, m_time_zone_binary{time->m_time_zone_binary} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"}, - {1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"}, - {2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"}, - {3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"}, - {4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"}, - {5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"}, - {20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"}, - {50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"}, - {51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"}, - {100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"}, - {101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"}, - {102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"}, - {200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"}, - {201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"}, - {300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"}, - {400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"}, - {401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"}, - {500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"}, - {501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"}, - }; - // clang-format on - - RegisterHandlers(functions); m_set_sys = - m_system.ServiceManager().GetService("set:sys", true); + system.ServiceManager().GetService("set:sys", true); if (m_setup_info.can_write_local_clock && m_setup_info.can_write_user_clock && !m_setup_info.can_write_network_clock && m_setup_info.can_write_timezone_device_location && @@ -106,7 +109,7 @@ Result StaticService::GetTimeZoneService(OutInterface out_servi LOG_DEBUG(Service_Time, "called."); *out_service = std::make_shared( - m_system, m_file_timestamp_worker, m_setup_info.can_write_timezone_device_location, + system, m_file_timestamp_worker, m_setup_info.can_write_timezone_device_location, m_time_zone_binary, m_time_zone); R_SUCCEED(); } diff --git a/src/core/hle/service/glue/time/static.h b/src/core/hle/service/glue/time/static.h index 7bb0e0b36e..5856553461 100644 --- a/src/core/hle/service/glue/time/static.h +++ b/src/core/hle/service/glue/time/static.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 @@ -69,12 +72,11 @@ public: Result CalculateSpanBetween(Out out_time, InClockSnapshot a, InClockSnapshot b); private: - Core::System& m_system; + std::optional FindRequest(u32 key) override; std::shared_ptr m_set_sys; std::shared_ptr m_time_m; std::shared_ptr m_wrapped_service; - Service::PSC::Time::StaticServiceSetupInfo m_setup_info; std::shared_ptr m_time_sm; std::shared_ptr m_time_zone; diff --git a/src/core/hle/service/glue/time/time_zone.cpp b/src/core/hle/service/glue/time/time_zone.cpp index 52bd651f2b..6e861b4060 100644 --- a/src/core/hle/service/glue/time/time_zone.cpp +++ b/src/core/hle/service/glue/time/time_zone.cpp @@ -19,6 +19,26 @@ namespace Service::Glue::Time { +std::optional TimeZoneService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"}, + FunctionInfo{1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"}, + FunctionInfo{2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"}, + FunctionInfo{3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"}, + FunctionInfo{4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"}, + FunctionInfo{5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"}, + FunctionInfo{6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"}, + FunctionInfo{7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"}, + FunctionInfo{8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"}, + FunctionInfo{20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"}, + FunctionInfo{100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"}, + FunctionInfo{101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"}, + FunctionInfo{201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"}, + FunctionInfo{202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + TimeZoneService::TimeZoneService( Core::System& system_, FileTimestampWorker& file_timestamp_worker, bool can_write_timezone_device_location, TimeZoneBinary& time_zone_binary, @@ -30,26 +50,6 @@ TimeZoneService::TimeZoneService( , m_operation_event{system} , m_time_zone_binary{time_zone_binary} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"}, - {1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"}, - {2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"}, - {3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"}, - {4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"}, - {5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"}, - {6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"}, - {7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"}, - {8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"}, - {20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"}, - {100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"}, - {101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"}, - {201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"}, - {202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"}, - }; - // clang-format on - RegisterHandlers(functions); - m_set_sys = system.ServiceManager().GetService("set:sys", true); } diff --git a/src/core/hle/service/glue/time/time_zone.h b/src/core/hle/service/glue/time/time_zone.h index 635070263b..839d823e67 100644 --- a/src/core/hle/service/glue/time/time_zone.h +++ b/src/core/hle/service/glue/time/time_zone.h @@ -80,6 +80,7 @@ public: const Service::PSC::Time::CalendarTime& calendar_time); private: + std::optional FindRequest(u32 key) override; std::shared_ptr m_set_sys; bool m_can_write_timezone_device_location; FileTimestampWorker& m_file_timestamp_worker; diff --git a/src/core/hle/service/gpio/gpio.cpp b/src/core/hle/service/gpio/gpio.cpp index 8b4aa0f5ab..5441149c65 100644 --- a/src/core/hle/service/gpio/gpio.cpp +++ b/src/core/hle/service/gpio/gpio.cpp @@ -13,15 +13,15 @@ namespace Service::GPIO { class GPIO final : public ServiceFramework { public: - explicit GPIO(Core::System& system_) - : ServiceFramework{system_, "gpio"} - { - static const FunctionInfo functions[] = { - {0, nullptr, "Cmd0"}, - }; - RegisterHandlers(functions); - } + explicit GPIO(Core::System& system_) : ServiceFramework{system_, "gpio"} {} ~GPIO() override = default; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Cmd0"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/grc/grc.cpp b/src/core/hle/service/grc/grc.cpp index e8e901662d..5f6c84e914 100644 --- a/src/core/hle/service/grc/grc.cpp +++ b/src/core/hle/service/grc/grc.cpp @@ -14,32 +14,31 @@ namespace Service::GRC { class GRC final : public ServiceFramework { public: - explicit GRC(Core::System& system_) : ServiceFramework{system_, "grc:c"} { - // clang-format off - static const FunctionInfo functions[] = { - {1, nullptr, "OpenContinuousRecorder"}, - {2, nullptr, "OpenGameMovieTrimmer"}, - {3, nullptr, "OpenOffscreenRecorder"}, - {101, nullptr, "CreateMovieMaker"}, - {9903, nullptr, "SetOffscreenRecordingMarker"} - }; - // clang-format on + explicit GRC(Core::System& system_) : ServiceFramework{system_, "grc:c"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, nullptr, "OpenContinuousRecorder"}, + FunctionInfo{2, nullptr, "OpenGameMovieTrimmer"}, + FunctionInfo{3, nullptr, "OpenOffscreenRecorder"}, + FunctionInfo{101, nullptr, "CreateMovieMaker"}, + FunctionInfo{9903, nullptr, "SetOffscreenRecordingMarker"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class GRC_D final : public ServiceFramework { public: - explicit GRC_D(Core::System& system_) : ServiceFramework{system_, "grc:d"} { - // clang-format off - static const FunctionInfo functions[] = { - {1, nullptr, "Initialize"}, - {2, nullptr, "Transfer"}, - {3, nullptr, "Cmd3"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit GRC_D(Core::System& system_) : ServiceFramework{system_, "grc:d"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, nullptr, "Initialize"}, + FunctionInfo{2, nullptr, "Transfer"}, + FunctionInfo{3, nullptr, "Cmd3"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/hid/active_vibration_device_list.cpp b/src/core/hle/service/hid/active_vibration_device_list.cpp index e0d6d3f2d9..7a4f4cce2c 100644 --- a/src/core/hle/service/hid/active_vibration_device_list.cpp +++ b/src/core/hle/service/hid/active_vibration_device_list.cpp @@ -14,16 +14,16 @@ namespace Service::HID { +std::optional IActiveVibrationDeviceList::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&IActiveVibrationDeviceList::ActivateVibrationDevice>, "ActivateVibrationDevice"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IActiveVibrationDeviceList::IActiveVibrationDeviceList(Core::System& system_, std::shared_ptr resource) : ServiceFramework{system_, "IActiveVibrationDeviceList"}, resource_manager(resource) { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&IActiveVibrationDeviceList::ActivateVibrationDevice>, "ActivateVibrationDevice"}, - }; - // clang-format on - - RegisterHandlers(functions); } IActiveVibrationDeviceList::~IActiveVibrationDeviceList() = default; diff --git a/src/core/hle/service/hid/active_vibration_device_list.h b/src/core/hle/service/hid/active_vibration_device_list.h index beaa44d97a..57c31a8df1 100644 --- a/src/core/hle/service/hid/active_vibration_device_list.h +++ b/src/core/hle/service/hid/active_vibration_device_list.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -26,8 +29,8 @@ public: private: static constexpr std::size_t MaxVibrationDevicesHandles{0x100}; - Result ActivateVibrationDevice(Core::HID::VibrationDeviceHandle vibration_device_handle); + std::optional FindRequest(u32 key) override; mutable std::mutex mutex; std::size_t list_size{}; diff --git a/src/core/hle/service/hid/applet_resource.cpp b/src/core/hle/service/hid/applet_resource.cpp index 44ae767841..6f658fa875 100644 --- a/src/core/hle/service/hid/applet_resource.cpp +++ b/src/core/hle/service/hid/applet_resource.cpp @@ -12,14 +12,17 @@ namespace Service::HID { +std::optional IAppletResource::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&IAppletResource::GetSharedMemoryHandle>, "GetSharedMemoryHandle"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IAppletResource::IAppletResource(Core::System& system_, std::shared_ptr resource, u64 applet_resource_user_id) : ServiceFramework{system_, "IAppletResource"}, aruid{applet_resource_user_id}, resource_manager{resource} { - static const FunctionInfo functions[] = { - {0, C<&IAppletResource::GetSharedMemoryHandle>, "GetSharedMemoryHandle"}, - }; - RegisterHandlers(functions); } IAppletResource::~IAppletResource() { diff --git a/src/core/hle/service/hid/applet_resource.h b/src/core/hle/service/hid/applet_resource.h index d1e7db9b1e..7b5d915218 100644 --- a/src/core/hle/service/hid/applet_resource.h +++ b/src/core/hle/service/hid/applet_resource.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -29,6 +32,7 @@ public: private: Result GetSharedMemoryHandle(OutCopyHandle out_shared_memory_handle); + std::optional FindRequest(u32 key) override; u64 aruid{}; std::shared_ptr resource_manager; }; diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 25096ff36f..0ea587312b 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -16,19 +16,24 @@ #include "core/hle/service/server_manager.h" #include "hid_core/resource_manager.h" #include "hid_core/resources/hid_firmware_settings.h" +#include "core/hle/service/ipc_helpers.h" +#include "hid_core/hid_types.h" +#include "hid_core/resources/touch_screen/gesture.h" +#include "hid_core/resources/touch_screen/touch_screen.h" +#include "core/hle/service/cmif_serialization.h" namespace Service::HID { class IHidTemporaryServer final : public ServiceFramework { public: explicit IHidTemporaryServer(Core::System& system_) - : ServiceFramework{system_, "hid:tmp"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetConsoleSixAxisSensorCalibrationValues"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "hid:tmp"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetConsoleSixAxisSensorCalibrationValues"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } ~IHidTemporaryServer() override = default; }; @@ -36,17 +41,17 @@ public: class AHID_CD final : public ServiceFramework { public: explicit AHID_CD(Core::System& system_) - : ServiceFramework{system_, "ahid:cd"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "AcquireDevice"}, - {1, nullptr, "ReleaseDevice"}, - {2, nullptr, "GetCtrlSession"}, - {3, nullptr, "GetReadSession"}, - {4, nullptr, "GetWriteSession"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "ahid:cd"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "AcquireDevice"}, + FunctionInfo{1, nullptr, "ReleaseDevice"}, + FunctionInfo{2, nullptr, "GetCtrlSession"}, + FunctionInfo{3, nullptr, "GetReadSession"}, + FunctionInfo{4, nullptr, "GetWriteSession"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } ~AHID_CD() override = default; }; @@ -54,22 +59,322 @@ public: class AHID_HDR final : public ServiceFramework { public: explicit AHID_HDR(Core::System& system_) - : ServiceFramework{system_, "ahid:hdr"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetDeviceEntries"}, - {1, nullptr, "GetDeviceList"}, - {2, nullptr, "GetDeviceParameters"}, - {3, nullptr, "AttachDevice"}, - {4, nullptr, "DetachDevice"}, - {5, nullptr, "SetDeviceFilter"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "ahid:hdr"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetDeviceEntries"}, + FunctionInfo{1, nullptr, "GetDeviceList"}, + FunctionInfo{2, nullptr, "GetDeviceParameters"}, + FunctionInfo{3, nullptr, "AttachDevice"}, + FunctionInfo{4, nullptr, "DetachDevice"}, + FunctionInfo{5, nullptr, "SetDeviceFilter"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } ~AHID_HDR() override = default; }; +class IHidDebugServer final : public ServiceFramework { +public: + explicit IHidDebugServer(Core::System& system_, std::shared_ptr resource, + std::shared_ptr settings) + : ServiceFramework{system_, "hid:dbg"} + , resource_manager{resource} + , firmware_settings{settings} + {} + + ~IHidDebugServer() override = default; + + Result DeactivateTouchScreen() { + LOG_INFO(Service_HID, "called"); + + if (!firmware_settings->IsDeviceManaged()) { + R_RETURN(GetResourceManager()->GetTouchScreen()->Deactivate()); + } + + R_SUCCEED(); + } + + Result SetTouchScreenAutoPilotState( + InArray auto_pilot_buffer) { + AutoPilotState auto_pilot{}; + + auto_pilot.count = + static_cast((std::min)(auto_pilot_buffer.size(), auto_pilot.state.size())); + memcpy(auto_pilot.state.data(), auto_pilot_buffer.data(), + auto_pilot.count * sizeof(TouchState)); + + LOG_INFO(Service_HID, "called, auto_pilot_count={}", auto_pilot.count); + + R_RETURN(GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot)); + } + + Result UnsetTouchScreenAutoPilotState() { + LOG_INFO(Service_HID, "called"); + R_RETURN(GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState()); + } + + Result GetTouchScreenConfiguration( + Out out_touchscreen_config, + ClientAppletResourceUserId aruid) { + LOG_INFO(Service_HID, "called, applet_resource_user_id={}", aruid.pid); + + R_TRY(GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration( + *out_touchscreen_config, aruid.pid)); + + if (out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Heat2 && + out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Finger) { + out_touchscreen_config->mode = Core::HID::TouchScreenModeForNx::UseSystemSetting; + } + + R_SUCCEED(); + } + + Result ProcessTouchScreenAutoTune() { + LOG_INFO(Service_HID, "called"); + R_RETURN(GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune()); + } + + Result ForceStopTouchScreenManagement() { + LOG_INFO(Service_HID, "called"); + + if (!firmware_settings->IsDeviceManaged()) { + R_SUCCEED(); + } + + auto touch_screen = GetResourceManager()->GetTouchScreen(); + auto gesture = GetResourceManager()->GetGesture(); + + if (firmware_settings->IsTouchI2cManaged()) { + bool is_touch_active{}; + bool is_gesture_active{}; + R_TRY(touch_screen->IsActive(is_touch_active)); + R_TRY(gesture->IsActive(is_gesture_active)); + + if (is_touch_active) { + R_TRY(touch_screen->Deactivate()); + } + if (is_gesture_active) { + R_TRY(gesture->Deactivate()); + } + } + + R_SUCCEED(); + } + + Result ForceRestartTouchScreenManagement(u32 basic_gesture_id, + ClientAppletResourceUserId aruid) { + LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}", + basic_gesture_id, aruid.pid); + + auto touch_screen = GetResourceManager()->GetTouchScreen(); + auto gesture = GetResourceManager()->GetGesture(); + + if (firmware_settings->IsDeviceManaged() && firmware_settings->IsTouchI2cManaged()) { + R_TRY(gesture->Activate()); + R_TRY(gesture->Activate(aruid.pid, basic_gesture_id)); + R_TRY(touch_screen->Activate()); + R_TRY(touch_screen->Activate(aruid.pid)); + } + + R_SUCCEED(); + } + + Result IsTouchScreenManaged(Out out_is_managed) { + LOG_INFO(Service_HID, "called"); + + bool is_touch_active{}; + bool is_gesture_active{}; + R_TRY(GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active)); + R_TRY(GetResourceManager()->GetGesture()->IsActive(is_gesture_active)); + + *out_is_managed = is_touch_active || is_gesture_active; + R_SUCCEED(); + } + + Result DeactivateGesture() { + LOG_INFO(Service_HID, "called"); + + if (!firmware_settings->IsDeviceManaged()) { + R_RETURN(GetResourceManager()->GetGesture()->Deactivate()); + } + + R_SUCCEED(); + } + + std::shared_ptr GetResourceManager() { + resource_manager->Initialize(); + return resource_manager; + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "DeactivateDebugPad"}, + FunctionInfo{1, nullptr, "SetDebugPadAutoPilotState"}, + FunctionInfo{2, nullptr, "UnsetDebugPadAutoPilotState"}, + FunctionInfo{10, C<&IHidDebugServer::DeactivateTouchScreen>, "DeactivateTouchScreen"}, + FunctionInfo{11, C<&IHidDebugServer::SetTouchScreenAutoPilotState>, "SetTouchScreenAutoPilotState"}, + FunctionInfo{12, C<&IHidDebugServer::UnsetTouchScreenAutoPilotState>, "UnsetTouchScreenAutoPilotState"}, + FunctionInfo{13, C<&IHidDebugServer::GetTouchScreenConfiguration>, "GetTouchScreenConfiguration"}, + FunctionInfo{14, C<&IHidDebugServer::ProcessTouchScreenAutoTune>, "ProcessTouchScreenAutoTune"}, + FunctionInfo{15, C<&IHidDebugServer::ForceStopTouchScreenManagement>, "ForceStopTouchScreenManagement"}, + FunctionInfo{16, C<&IHidDebugServer::ForceRestartTouchScreenManagement>, "ForceRestartTouchScreenManagement"}, + FunctionInfo{17, C<&IHidDebugServer::IsTouchScreenManaged>, "IsTouchScreenManaged"}, + FunctionInfo{20, nullptr, "DeactivateMouse"}, + FunctionInfo{21, nullptr, "SetMouseAutoPilotState"}, + FunctionInfo{22, nullptr, "UnsetMouseAutoPilotState"}, + FunctionInfo{23, nullptr, "AddMouseSideWheelDelta"}, + FunctionInfo{25, nullptr, "SetDebugMouseAutoPilotState"}, + FunctionInfo{26, nullptr, "UnsetDebugMouseAutoPilotState"}, + FunctionInfo{30, nullptr, "DeactivateKeyboard"}, + FunctionInfo{31, nullptr, "SetKeyboardAutoPilotState"}, + FunctionInfo{32, nullptr, "UnsetKeyboardAutoPilotState"}, + FunctionInfo{50, nullptr, "DeactivateXpad"}, + FunctionInfo{51, nullptr, "SetXpadAutoPilotState"}, + FunctionInfo{52, nullptr, "UnsetXpadAutoPilotState"}, + FunctionInfo{53, nullptr, "DeactivateJoyXpad"}, + FunctionInfo{60, nullptr, "ClearNpadSystemCommonPolicy"}, + FunctionInfo{61, nullptr, "DeactivateNpad"}, + FunctionInfo{62, nullptr, "ForceDisconnectNpad"}, + FunctionInfo{91, C<&IHidDebugServer::DeactivateGesture>, "DeactivateGesture"}, + FunctionInfo{110, nullptr, "DeactivateHomeButton"}, + FunctionInfo{111, nullptr, "SetHomeButtonAutoPilotState"}, + FunctionInfo{112, nullptr, "UnsetHomeButtonAutoPilotState"}, + FunctionInfo{120, nullptr, "DeactivateSleepButton"}, + FunctionInfo{121, nullptr, "SetSleepButtonAutoPilotState"}, + FunctionInfo{122, nullptr, "UnsetSleepButtonAutoPilotState"}, + FunctionInfo{123, nullptr, "DeactivateInputDetector"}, + FunctionInfo{130, nullptr, "DeactivateCaptureButton"}, + FunctionInfo{131, nullptr, "SetCaptureButtonAutoPilotState"}, + FunctionInfo{132, nullptr, "UnsetCaptureButtonAutoPilotState"}, + FunctionInfo{133, nullptr, "SetShiftAccelerometerCalibrationValue"}, + FunctionInfo{134, nullptr, "GetShiftAccelerometerCalibrationValue"}, + FunctionInfo{135, nullptr, "SetShiftGyroscopeCalibrationValue"}, + FunctionInfo{136, nullptr, "GetShiftGyroscopeCalibrationValue"}, + FunctionInfo{140, nullptr, "DeactivateConsoleSixAxisSensor"}, + FunctionInfo{141, nullptr, "GetConsoleSixAxisSensorSamplingFrequency"}, + FunctionInfo{142, nullptr, "DeactivateSevenSixAxisSensor"}, + FunctionInfo{143, nullptr, "GetConsoleSixAxisSensorCountStates"}, + FunctionInfo{144, nullptr, "GetAccelerometerFsr"}, + FunctionInfo{145, nullptr, "SetAccelerometerFsr"}, + FunctionInfo{146, nullptr, "GetAccelerometerOdr"}, + FunctionInfo{147, nullptr, "SetAccelerometerOdr"}, + FunctionInfo{148, nullptr, "GetGyroscopeFsr"}, + FunctionInfo{149, nullptr, "SetGyroscopeFsr"}, + FunctionInfo{150, nullptr, "GetGyroscopeOdr"}, + FunctionInfo{151, nullptr, "SetGyroscopeOdr"}, + FunctionInfo{152, nullptr, "GetWhoAmI"}, + FunctionInfo{201, nullptr, "ActivateFirmwareUpdate"}, + FunctionInfo{202, nullptr, "DeactivateFirmwareUpdate"}, + FunctionInfo{203, nullptr, "StartFirmwareUpdate"}, + FunctionInfo{204, nullptr, "GetFirmwareUpdateStage"}, + FunctionInfo{205, nullptr, "GetFirmwareVersion"}, + FunctionInfo{206, nullptr, "GetDestinationFirmwareVersion"}, + FunctionInfo{207, nullptr, "DiscardFirmwareInfoCacheForRevert"}, + FunctionInfo{208, nullptr, "StartFirmwareUpdateForRevert"}, + FunctionInfo{209, nullptr, "GetAvailableFirmwareVersionForRevert"}, + FunctionInfo{210, nullptr, "IsFirmwareUpdatingDevice"}, + FunctionInfo{211, nullptr, "StartFirmwareUpdateIndividual"}, + FunctionInfo{212, nullptr, "GetDetailFirmwareVersion", MakeVersionGate({19,0,0})}, + FunctionInfo{215, nullptr, "SetUsbFirmwareForceUpdateEnabled"}, + FunctionInfo{216, nullptr, "SetAllKuinaDevicesToFirmwareUpdateMode"}, + FunctionInfo{221, nullptr, "UpdateControllerColor"}, + FunctionInfo{222, nullptr, "ConnectUsbPadsAsync"}, + FunctionInfo{223, nullptr, "DisconnectUsbPadsAsync"}, + FunctionInfo{224, nullptr, "UpdateDesignInfo"}, + FunctionInfo{225, nullptr, "GetUniquePadDriverState"}, + FunctionInfo{226, nullptr, "GetSixAxisSensorDriverStates"}, + FunctionInfo{227, nullptr, "GetRxPacketHistory"}, + FunctionInfo{228, nullptr, "AcquireOperationEventHandle"}, + FunctionInfo{229, nullptr, "ReadSerialFlash"}, + FunctionInfo{230, nullptr, "WriteSerialFlash"}, + FunctionInfo{231, nullptr, "GetOperationResult"}, + FunctionInfo{232, nullptr, "EnableShipmentMode"}, + FunctionInfo{233, nullptr, "ClearPairingInfo"}, + FunctionInfo{234, nullptr, "GetUniquePadDeviceTypeSetInternal"}, + FunctionInfo{235, nullptr, "EnableAnalogStickPower"}, + FunctionInfo{236, nullptr, "RequestKuinaUartClockCal"}, + FunctionInfo{237, nullptr, "GetKuinaUartClockCal"}, + FunctionInfo{238, nullptr, "SetKuinaUartClockTrim"}, + FunctionInfo{239, nullptr, "KuinaLoopbackTest"}, + FunctionInfo{240, nullptr, "RequestBatteryVoltage"}, + FunctionInfo{241, nullptr, "GetBatteryVoltage"}, + FunctionInfo{242, nullptr, "GetUniquePadPowerInfo"}, + FunctionInfo{243, nullptr, "RebootUniquePad"}, + FunctionInfo{244, nullptr, "RequestKuinaFirmwareVersion"}, + FunctionInfo{245, nullptr, "GetKuinaFirmwareVersion"}, + FunctionInfo{246, nullptr, "GetVidPid"}, + FunctionInfo{247, nullptr, "GetAnalogStickCalibrationValue"}, + FunctionInfo{248, nullptr, "GetUniquePadIdsFull"}, + FunctionInfo{249, nullptr, "ConnectUniquePad"}, + FunctionInfo{250, nullptr, "IsVirtual"}, + FunctionInfo{251, nullptr, "GetAnalogStickModuleParam"}, + FunctionInfo{253, nullptr, "ClearStorageForShipment", MakeVersionGate({19,0,0})}, + FunctionInfo{261, nullptr, "UpdateDesignInfo12", MakeVersionGate({21,0,0})}, + FunctionInfo{262, nullptr, "GetUniquePadButtonCount", MakeVersionGate({21,0,0})}, + FunctionInfo{267, nullptr, "SetAnalogStickCalibration", MakeVersionGate({21,0,0})}, + FunctionInfo{268, nullptr, "ResetAnalogStickCalibration", MakeVersionGate({21,0,0})}, + FunctionInfo{301, nullptr, "GetAbstractedPadHandles"}, + FunctionInfo{302, nullptr, "GetAbstractedPadState"}, + FunctionInfo{303, nullptr, "GetAbstractedPadsState"}, + FunctionInfo{321, nullptr, "SetAutoPilotVirtualPadState"}, + FunctionInfo{322, nullptr, "UnsetAutoPilotVirtualPadState"}, + FunctionInfo{323, nullptr, "UnsetAllAutoPilotVirtualPadState"}, + FunctionInfo{324, nullptr, "AttachHdlsWorkBuffer"}, + FunctionInfo{325, nullptr, "ReleaseHdlsWorkBuffer"}, + FunctionInfo{326, nullptr, "DumpHdlsNpadAssignmentState"}, + FunctionInfo{327, nullptr, "DumpHdlsStates"}, + FunctionInfo{328, nullptr, "ApplyHdlsNpadAssignmentState"}, + FunctionInfo{329, nullptr, "ApplyHdlsStateList"}, + FunctionInfo{330, nullptr, "AttachHdlsVirtualDevice"}, + FunctionInfo{331, nullptr, "DetachHdlsVirtualDevice"}, + FunctionInfo{332, nullptr, "SetHdlsState"}, + FunctionInfo{350, nullptr, "AddRegisteredDevice"}, + FunctionInfo{351, nullptr, "GetRegisteredDevicesCountDebug", MakeVersionGate({17,0,0}, {18,1,0})}, + FunctionInfo{352, nullptr, "DeleteRegisteredDevicesDebug", MakeVersionGate({17,0,0}, {18,1,0})}, + FunctionInfo{400, nullptr, "DisableExternalMcuOnNxDevice"}, + FunctionInfo{401, nullptr, "DisableRailDeviceFiltering"}, + FunctionInfo{402, nullptr, "EnableWiredPairing"}, + FunctionInfo{403, nullptr, "EnableShipmentModeAutoClear"}, + FunctionInfo{404, nullptr, "SetRailEnabled"}, + FunctionInfo{500, nullptr, "SetFactoryInt"}, + FunctionInfo{501, nullptr, "IsFactoryBootEnabled"}, + FunctionInfo{550, nullptr, "SetAnalogStickModelDataTemporarily"}, + FunctionInfo{551, nullptr, "GetAnalogStickModelData"}, + FunctionInfo{552, nullptr, "ResetAnalogStickModelData"}, + FunctionInfo{600, nullptr, "ConvertPadState"}, + FunctionInfo{601, nullptr, "IsButtonConfigSupported", MakeVersionGate({18,0,0})}, + FunctionInfo{602, nullptr, "IsButtonConfigEmbeddedSupported", MakeVersionGate({18,0,0})}, + FunctionInfo{603, nullptr, "DeleteButtonConfig", MakeVersionGate({18,0,0})}, + FunctionInfo{604, nullptr, "DeleteButtonConfigEmbedded", MakeVersionGate({18,0,0})}, + FunctionInfo{605, nullptr, "SetButtonConfigEnabled", MakeVersionGate({18,0,0})}, + FunctionInfo{606, nullptr, "SetButtonConfigEmbeddedEnabled", MakeVersionGate({18,0,0})}, + FunctionInfo{607, nullptr, "IsButtonConfigEnabled", MakeVersionGate({18,0,0})}, + FunctionInfo{608, nullptr, "IsButtonConfigEmbeddedEnabled", MakeVersionGate({18,0,0})}, + FunctionInfo{609, nullptr, "SetButtonConfigEmbedded", MakeVersionGate({18,0,0})}, + FunctionInfo{610, nullptr, "SetButtonConfigFull", MakeVersionGate({18,0,0})}, + FunctionInfo{611, nullptr, "SetButtonConfigLeft", MakeVersionGate({18,0,0})}, + FunctionInfo{612, nullptr, "SetButtonConfigRight", MakeVersionGate({18,0,0})}, + FunctionInfo{613, nullptr, "GetButtonConfigEmbedded", MakeVersionGate({18,0,0})}, + FunctionInfo{614, nullptr, "GetButtonConfigFull", MakeVersionGate({18,0,0})}, + FunctionInfo{615, nullptr, "GetButtonConfigLeft", MakeVersionGate({18,0,0})}, + FunctionInfo{616, nullptr, "GetButtonConfigRight", MakeVersionGate({18,0,0})}, + FunctionInfo{650, nullptr, "AddButtonPlayData"}, + FunctionInfo{651, nullptr, "StartButtonPlayData"}, + FunctionInfo{652, nullptr, "StopButtonPlayData"}, + FunctionInfo{700, nullptr, "GetRailAttachEventCount", MakeVersionGate({21,0,0})}, + FunctionInfo{2000, nullptr, "DeactivateDigitizer"}, + FunctionInfo{2001, nullptr, "SetDigitizerAutoPilotState"}, + FunctionInfo{2002, nullptr, "UnsetDigitizerAutoPilotState"}, + FunctionInfo{3000, nullptr, "ReloadFirmwareDebugSettings"} + ); + std::shared_ptr resource_manager; + std::shared_ptr firmware_settings; +}; + void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); auto firmware_settings = std::make_shared(system); diff --git a/src/core/hle/service/hid/hid_debug_server.cpp b/src/core/hle/service/hid/hid_debug_server.cpp index 43fe0f3a19..091d09dae5 100644 --- a/src/core/hle/service/hid/hid_debug_server.cpp +++ b/src/core/hle/service/hid/hid_debug_server.cpp @@ -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-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -18,298 +18,4 @@ namespace Service::HID { -IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr resource, - std::shared_ptr settings) - : ServiceFramework{system_, "hid:dbg"}, resource_manager{resource}, firmware_settings{ - settings} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "DeactivateDebugPad"}, - {1, nullptr, "SetDebugPadAutoPilotState"}, - {2, nullptr, "UnsetDebugPadAutoPilotState"}, - {10, C<&IHidDebugServer::DeactivateTouchScreen>, "DeactivateTouchScreen"}, - {11, C<&IHidDebugServer::SetTouchScreenAutoPilotState>, "SetTouchScreenAutoPilotState"}, - {12, C<&IHidDebugServer::UnsetTouchScreenAutoPilotState>, "UnsetTouchScreenAutoPilotState"}, - {13, C<&IHidDebugServer::GetTouchScreenConfiguration>, "GetTouchScreenConfiguration"}, - {14, C<&IHidDebugServer::ProcessTouchScreenAutoTune>, "ProcessTouchScreenAutoTune"}, - {15, C<&IHidDebugServer::ForceStopTouchScreenManagement>, "ForceStopTouchScreenManagement"}, - {16, C<&IHidDebugServer::ForceRestartTouchScreenManagement>, "ForceRestartTouchScreenManagement"}, - {17, C<&IHidDebugServer::IsTouchScreenManaged>, "IsTouchScreenManaged"}, - {20, nullptr, "DeactivateMouse"}, - {21, nullptr, "SetMouseAutoPilotState"}, - {22, nullptr, "UnsetMouseAutoPilotState"}, - {23, nullptr, "AddMouseSideWheelDelta"}, - {25, nullptr, "SetDebugMouseAutoPilotState"}, - {26, nullptr, "UnsetDebugMouseAutoPilotState"}, - {30, nullptr, "DeactivateKeyboard"}, - {31, nullptr, "SetKeyboardAutoPilotState"}, - {32, nullptr, "UnsetKeyboardAutoPilotState"}, - {50, nullptr, "DeactivateXpad"}, - {51, nullptr, "SetXpadAutoPilotState"}, - {52, nullptr, "UnsetXpadAutoPilotState"}, - {53, nullptr, "DeactivateJoyXpad"}, - {60, nullptr, "ClearNpadSystemCommonPolicy"}, - {61, nullptr, "DeactivateNpad"}, - {62, nullptr, "ForceDisconnectNpad"}, - {91, C<&IHidDebugServer::DeactivateGesture>, "DeactivateGesture"}, - {110, nullptr, "DeactivateHomeButton"}, - {111, nullptr, "SetHomeButtonAutoPilotState"}, - {112, nullptr, "UnsetHomeButtonAutoPilotState"}, - {120, nullptr, "DeactivateSleepButton"}, - {121, nullptr, "SetSleepButtonAutoPilotState"}, - {122, nullptr, "UnsetSleepButtonAutoPilotState"}, - {123, nullptr, "DeactivateInputDetector"}, - {130, nullptr, "DeactivateCaptureButton"}, - {131, nullptr, "SetCaptureButtonAutoPilotState"}, - {132, nullptr, "UnsetCaptureButtonAutoPilotState"}, - {133, nullptr, "SetShiftAccelerometerCalibrationValue"}, - {134, nullptr, "GetShiftAccelerometerCalibrationValue"}, - {135, nullptr, "SetShiftGyroscopeCalibrationValue"}, - {136, nullptr, "GetShiftGyroscopeCalibrationValue"}, - {140, nullptr, "DeactivateConsoleSixAxisSensor"}, - {141, nullptr, "GetConsoleSixAxisSensorSamplingFrequency"}, - {142, nullptr, "DeactivateSevenSixAxisSensor"}, - {143, nullptr, "GetConsoleSixAxisSensorCountStates"}, - {144, nullptr, "GetAccelerometerFsr"}, - {145, nullptr, "SetAccelerometerFsr"}, - {146, nullptr, "GetAccelerometerOdr"}, - {147, nullptr, "SetAccelerometerOdr"}, - {148, nullptr, "GetGyroscopeFsr"}, - {149, nullptr, "SetGyroscopeFsr"}, - {150, nullptr, "GetGyroscopeOdr"}, - {151, nullptr, "SetGyroscopeOdr"}, - {152, nullptr, "GetWhoAmI"}, - {201, nullptr, "ActivateFirmwareUpdate"}, - {202, nullptr, "DeactivateFirmwareUpdate"}, - {203, nullptr, "StartFirmwareUpdate"}, - {204, nullptr, "GetFirmwareUpdateStage"}, - {205, nullptr, "GetFirmwareVersion"}, - {206, nullptr, "GetDestinationFirmwareVersion"}, - {207, nullptr, "DiscardFirmwareInfoCacheForRevert"}, - {208, nullptr, "StartFirmwareUpdateForRevert"}, - {209, nullptr, "GetAvailableFirmwareVersionForRevert"}, - {210, nullptr, "IsFirmwareUpdatingDevice"}, - {211, nullptr, "StartFirmwareUpdateIndividual"}, - {212, nullptr, "GetDetailFirmwareVersion"}, // 19.0.0+ - {215, nullptr, "SetUsbFirmwareForceUpdateEnabled"}, - {216, nullptr, "SetAllKuinaDevicesToFirmwareUpdateMode"}, - {221, nullptr, "UpdateControllerColor"}, - {222, nullptr, "ConnectUsbPadsAsync"}, - {223, nullptr, "DisconnectUsbPadsAsync"}, - {224, nullptr, "UpdateDesignInfo"}, - {225, nullptr, "GetUniquePadDriverState"}, - {226, nullptr, "GetSixAxisSensorDriverStates"}, - {227, nullptr, "GetRxPacketHistory"}, - {228, nullptr, "AcquireOperationEventHandle"}, - {229, nullptr, "ReadSerialFlash"}, - {230, nullptr, "WriteSerialFlash"}, - {231, nullptr, "GetOperationResult"}, - {232, nullptr, "EnableShipmentMode"}, - {233, nullptr, "ClearPairingInfo"}, - {234, nullptr, "GetUniquePadDeviceTypeSetInternal"}, - {235, nullptr, "EnableAnalogStickPower"}, - {236, nullptr, "RequestKuinaUartClockCal"}, - {237, nullptr, "GetKuinaUartClockCal"}, - {238, nullptr, "SetKuinaUartClockTrim"}, - {239, nullptr, "KuinaLoopbackTest"}, - {240, nullptr, "RequestBatteryVoltage"}, - {241, nullptr, "GetBatteryVoltage"}, - {242, nullptr, "GetUniquePadPowerInfo"}, - {243, nullptr, "RebootUniquePad"}, - {244, nullptr, "RequestKuinaFirmwareVersion"}, - {245, nullptr, "GetKuinaFirmwareVersion"}, - {246, nullptr, "GetVidPid"}, - {247, nullptr, "GetAnalogStickCalibrationValue"}, - {248, nullptr, "GetUniquePadIdsFull"}, - {249, nullptr, "ConnectUniquePad"}, - {250, nullptr, "IsVirtual"}, - {251, nullptr, "GetAnalogStickModuleParam"}, - {253, nullptr, "ClearStorageForShipment"}, //19.0.0+ - {261, nullptr, "UpdateDesignInfo12"}, //21.0.0+ - {262, nullptr, "GetUniquePadButtonCount"}, //21.0.0+ - {267, nullptr, "SetAnalogStickCalibration"}, //21.0.0+ - {268, nullptr, "ResetAnalogStickCalibration"}, //21.0.0+ - {301, nullptr, "GetAbstractedPadHandles"}, - {302, nullptr, "GetAbstractedPadState"}, - {303, nullptr, "GetAbstractedPadsState"}, - {321, nullptr, "SetAutoPilotVirtualPadState"}, - {322, nullptr, "UnsetAutoPilotVirtualPadState"}, - {323, nullptr, "UnsetAllAutoPilotVirtualPadState"}, - {324, nullptr, "AttachHdlsWorkBuffer"}, - {325, nullptr, "ReleaseHdlsWorkBuffer"}, - {326, nullptr, "DumpHdlsNpadAssignmentState"}, - {327, nullptr, "DumpHdlsStates"}, - {328, nullptr, "ApplyHdlsNpadAssignmentState"}, - {329, nullptr, "ApplyHdlsStateList"}, - {330, nullptr, "AttachHdlsVirtualDevice"}, - {331, nullptr, "DetachHdlsVirtualDevice"}, - {332, nullptr, "SetHdlsState"}, - {350, nullptr, "AddRegisteredDevice"}, - {351, nullptr, "GetRegisteredDevicesCountDebug"}, //17.0.0-18.1.0 - {352, nullptr, "DeleteRegisteredDevicesDebug"}, //17.0.0-18.1.0 - {400, nullptr, "DisableExternalMcuOnNxDevice"}, - {401, nullptr, "DisableRailDeviceFiltering"}, - {402, nullptr, "EnableWiredPairing"}, - {403, nullptr, "EnableShipmentModeAutoClear"}, - {404, nullptr, "SetRailEnabled"}, - {500, nullptr, "SetFactoryInt"}, - {501, nullptr, "IsFactoryBootEnabled"}, - {550, nullptr, "SetAnalogStickModelDataTemporarily"}, - {551, nullptr, "GetAnalogStickModelData"}, - {552, nullptr, "ResetAnalogStickModelData"}, - {600, nullptr, "ConvertPadState"}, - {601, nullptr, "IsButtonConfigSupported"}, //18.0.0+ - {602, nullptr, "IsButtonConfigEmbeddedSupported"}, //18.0.0+ - {603, nullptr, "DeleteButtonConfig"}, //18.0.0+ - {604, nullptr, "DeleteButtonConfigEmbedded"}, //18.0.0+ - {605, nullptr, "SetButtonConfigEnabled"}, //18.0.0+ - {606, nullptr, "SetButtonConfigEmbeddedEnabled"}, //18.0.0+ - {607, nullptr, "IsButtonConfigEnabled"}, //18.0.0+ - {608, nullptr, "IsButtonConfigEmbeddedEnabled"}, //18.0.0+ - {609, nullptr, "SetButtonConfigEmbedded"}, //18.0.0+ - {610, nullptr, "SetButtonConfigFull"}, //18.0.0+ - {611, nullptr, "SetButtonConfigLeft"}, //18.0.0+ - {612, nullptr, "SetButtonConfigRight"}, //18.0.0+ - {613, nullptr, "GetButtonConfigEmbedded"}, //18.0.0+ - {614, nullptr, "GetButtonConfigFull"}, //18.0.0+ - {615, nullptr, "GetButtonConfigLeft"}, //18.0.0+ - {616, nullptr, "GetButtonConfigRight"}, //18.0.0+ - {650, nullptr, "AddButtonPlayData"}, - {651, nullptr, "StartButtonPlayData"}, - {652, nullptr, "StopButtonPlayData"}, - {700, nullptr, "GetRailAttachEventCount"}, //21.0.0+ - {2000, nullptr, "DeactivateDigitizer"}, - {2001, nullptr, "SetDigitizerAutoPilotState"}, - {2002, nullptr, "UnsetDigitizerAutoPilotState"}, - {3000, nullptr, "ReloadFirmwareDebugSettings"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -IHidDebugServer::~IHidDebugServer() = default; - -Result IHidDebugServer::DeactivateTouchScreen() { - LOG_INFO(Service_HID, "called"); - - if (!firmware_settings->IsDeviceManaged()) { - R_RETURN(GetResourceManager()->GetTouchScreen()->Deactivate()); - } - - R_SUCCEED(); -} - -Result IHidDebugServer::SetTouchScreenAutoPilotState( - InArray auto_pilot_buffer) { - AutoPilotState auto_pilot{}; - - auto_pilot.count = - static_cast((std::min)(auto_pilot_buffer.size(), auto_pilot.state.size())); - memcpy(auto_pilot.state.data(), auto_pilot_buffer.data(), - auto_pilot.count * sizeof(TouchState)); - - LOG_INFO(Service_HID, "called, auto_pilot_count={}", auto_pilot.count); - - R_RETURN(GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot)); -} - -Result IHidDebugServer::UnsetTouchScreenAutoPilotState() { - LOG_INFO(Service_HID, "called"); - R_RETURN(GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState()); -} - -Result IHidDebugServer::GetTouchScreenConfiguration( - Out out_touchscreen_config, - ClientAppletResourceUserId aruid) { - LOG_INFO(Service_HID, "called, applet_resource_user_id={}", aruid.pid); - - R_TRY(GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration( - *out_touchscreen_config, aruid.pid)); - - if (out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Heat2 && - out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Finger) { - out_touchscreen_config->mode = Core::HID::TouchScreenModeForNx::UseSystemSetting; - } - - R_SUCCEED(); -} - -Result IHidDebugServer::ProcessTouchScreenAutoTune() { - LOG_INFO(Service_HID, "called"); - R_RETURN(GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune()); -} - -Result IHidDebugServer::ForceStopTouchScreenManagement() { - LOG_INFO(Service_HID, "called"); - - if (!firmware_settings->IsDeviceManaged()) { - R_SUCCEED(); - } - - auto touch_screen = GetResourceManager()->GetTouchScreen(); - auto gesture = GetResourceManager()->GetGesture(); - - if (firmware_settings->IsTouchI2cManaged()) { - bool is_touch_active{}; - bool is_gesture_active{}; - R_TRY(touch_screen->IsActive(is_touch_active)); - R_TRY(gesture->IsActive(is_gesture_active)); - - if (is_touch_active) { - R_TRY(touch_screen->Deactivate()); - } - if (is_gesture_active) { - R_TRY(gesture->Deactivate()); - } - } - - R_SUCCEED(); -} - -Result IHidDebugServer::ForceRestartTouchScreenManagement(u32 basic_gesture_id, - ClientAppletResourceUserId aruid) { - LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}", - basic_gesture_id, aruid.pid); - - auto touch_screen = GetResourceManager()->GetTouchScreen(); - auto gesture = GetResourceManager()->GetGesture(); - - if (firmware_settings->IsDeviceManaged() && firmware_settings->IsTouchI2cManaged()) { - R_TRY(gesture->Activate()); - R_TRY(gesture->Activate(aruid.pid, basic_gesture_id)); - R_TRY(touch_screen->Activate()); - R_TRY(touch_screen->Activate(aruid.pid)); - } - - R_SUCCEED(); -} - -Result IHidDebugServer::IsTouchScreenManaged(Out out_is_managed) { - LOG_INFO(Service_HID, "called"); - - bool is_touch_active{}; - bool is_gesture_active{}; - R_TRY(GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active)); - R_TRY(GetResourceManager()->GetGesture()->IsActive(is_gesture_active)); - - *out_is_managed = is_touch_active || is_gesture_active; - R_SUCCEED(); -} - -Result IHidDebugServer::DeactivateGesture() { - LOG_INFO(Service_HID, "called"); - - if (!firmware_settings->IsDeviceManaged()) { - R_RETURN(GetResourceManager()->GetGesture()->Deactivate()); - } - - R_SUCCEED(); -} - -std::shared_ptr IHidDebugServer::GetResourceManager() { - resource_manager->Initialize(); - return resource_manager; -} - } // namespace Service::HID diff --git a/src/core/hle/service/hid/hid_debug_server.h b/src/core/hle/service/hid/hid_debug_server.h index 3a483f07e5..20cc1ed541 100644 --- a/src/core/hle/service/hid/hid_debug_server.h +++ b/src/core/hle/service/hid/hid_debug_server.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -15,31 +18,5 @@ namespace Service::HID { class ResourceManager; class HidFirmwareSettings; -class IHidDebugServer final : public ServiceFramework { -public: - explicit IHidDebugServer(Core::System& system_, std::shared_ptr resource, - std::shared_ptr settings); - ~IHidDebugServer() override; - -private: - Result DeactivateTouchScreen(); - Result SetTouchScreenAutoPilotState( - InArray auto_pilot_buffer); - Result UnsetTouchScreenAutoPilotState(); - Result GetTouchScreenConfiguration( - Out out_touchscreen_config, - ClientAppletResourceUserId aruid); - Result ProcessTouchScreenAutoTune(); - Result ForceStopTouchScreenManagement(); - Result ForceRestartTouchScreenManagement(u32 basic_gesture_id, - ClientAppletResourceUserId aruid); - Result IsTouchScreenManaged(Out out_is_managed); - Result DeactivateGesture(); - - std::shared_ptr GetResourceManager(); - - std::shared_ptr resource_manager; - std::shared_ptr firmware_settings; -}; } // namespace Service::HID diff --git a/src/core/hle/service/hid/hid_server.cpp b/src/core/hle/service/hid/hid_server.cpp index 9689bce8dd..18e57628d0 100644 --- a/src/core/hle/service/hid/hid_server.cpp +++ b/src/core/hle/service/hid/hid_server.cpp @@ -42,207 +42,207 @@ namespace Service::HID { +std::optional IHidServer::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&IHidServer::CreateAppletResource>, "CreateAppletResource"}, + FunctionInfo{1, C<&IHidServer::ActivateDebugPad>, "ActivateDebugPad"}, + FunctionInfo{11, C<&IHidServer::ActivateTouchScreen>, "ActivateTouchScreen"}, + FunctionInfo{21, C<&IHidServer::ActivateMouse>, "ActivateMouse"}, + FunctionInfo{26, C<&IHidServer::ActivateDebugMouse>, "ActivateDebugMouse"}, + FunctionInfo{31, C<&IHidServer::ActivateKeyboard>, "ActivateKeyboard"}, + FunctionInfo{32, C<&IHidServer::SendKeyboardLockKeyEvent>, "SendKeyboardLockKeyEvent"}, + FunctionInfo{40, C<&IHidServer::AcquireXpadIdEventHandle>, "AcquireXpadIdEventHandle"}, + FunctionInfo{41, C<&IHidServer::ReleaseXpadIdEventHandle>, "ReleaseXpadIdEventHandle"}, + FunctionInfo{51, C<&IHidServer::ActivateXpad>, "ActivateXpad"}, + FunctionInfo{55, C<&IHidServer::GetXpadIds>, "GetXpadIds"}, + FunctionInfo{56, C<&IHidServer::ActivateJoyXpad>, "ActivateJoyXpad"}, + FunctionInfo{58, C<&IHidServer::GetJoyXpadLifoHandle>, "GetJoyXpadLifoHandle"}, + FunctionInfo{59, C<&IHidServer::GetJoyXpadIds>, "GetJoyXpadIds"}, + FunctionInfo{60, C<&IHidServer::ActivateSixAxisSensor>, "ActivateSixAxisSensor"}, + FunctionInfo{61, C<&IHidServer::DeactivateSixAxisSensor>, "DeactivateSixAxisSensor"}, + FunctionInfo{62, C<&IHidServer::GetSixAxisSensorLifoHandle>, "GetSixAxisSensorLifoHandle"}, + FunctionInfo{63, C<&IHidServer::ActivateJoySixAxisSensor>, "ActivateJoySixAxisSensor"}, + FunctionInfo{64, C<&IHidServer::DeactivateJoySixAxisSensor>, "DeactivateJoySixAxisSensor"}, + FunctionInfo{65, C<&IHidServer::GetJoySixAxisSensorLifoHandle>, "GetJoySixAxisSensorLifoHandle"}, + FunctionInfo{66, C<&IHidServer::StartSixAxisSensor>, "StartSixAxisSensor"}, + FunctionInfo{67, C<&IHidServer::StopSixAxisSensor>, "StopSixAxisSensor"}, + FunctionInfo{68, C<&IHidServer::IsSixAxisSensorFusionEnabled>, "IsSixAxisSensorFusionEnabled"}, + FunctionInfo{69, C<&IHidServer::EnableSixAxisSensorFusion>, "EnableSixAxisSensorFusion"}, + FunctionInfo{70, C<&IHidServer::SetSixAxisSensorFusionParameters>, "SetSixAxisSensorFusionParameters"}, + FunctionInfo{71, C<&IHidServer::GetSixAxisSensorFusionParameters>, "GetSixAxisSensorFusionParameters"}, + FunctionInfo{72, C<&IHidServer::ResetSixAxisSensorFusionParameters>, "ResetSixAxisSensorFusionParameters"}, + FunctionInfo{73, nullptr, "SetAccelerometerParameters"}, + FunctionInfo{74, nullptr, "GetAccelerometerParameters"}, + FunctionInfo{75, nullptr, "ResetAccelerometerParameters"}, + FunctionInfo{76, nullptr, "SetAccelerometerPlayMode"}, + FunctionInfo{77, nullptr, "GetAccelerometerPlayMode"}, + FunctionInfo{78, nullptr, "ResetAccelerometerPlayMode"}, + FunctionInfo{79, C<&IHidServer::SetGyroscopeZeroDriftMode>, "SetGyroscopeZeroDriftMode"}, + FunctionInfo{80, C<&IHidServer::GetGyroscopeZeroDriftMode>, "GetGyroscopeZeroDriftMode"}, + FunctionInfo{81, C<&IHidServer::ResetGyroscopeZeroDriftMode>, "ResetGyroscopeZeroDriftMode"}, + FunctionInfo{82, C<&IHidServer::IsSixAxisSensorAtRest>, "IsSixAxisSensorAtRest"}, + FunctionInfo{83, C<&IHidServer::IsFirmwareUpdateAvailableForSixAxisSensor>, "IsFirmwareUpdateAvailableForSixAxisSensor"}, + FunctionInfo{84, C<&IHidServer::EnableSixAxisSensorUnalteredPassthrough>, "EnableSixAxisSensorUnalteredPassthrough"}, + FunctionInfo{85, C<&IHidServer::IsSixAxisSensorUnalteredPassthroughEnabled>, "IsSixAxisSensorUnalteredPassthroughEnabled"}, + FunctionInfo{86, nullptr, "StoreSixAxisSensorCalibrationParameter"}, + FunctionInfo{87, C<&IHidServer::LoadSixAxisSensorCalibrationParameter>, "LoadSixAxisSensorCalibrationParameter"}, + FunctionInfo{88, C<&IHidServer::GetSixAxisSensorIcInformation>, "GetSixAxisSensorIcInformation"}, + FunctionInfo{89, C<&IHidServer::ResetIsSixAxisSensorDeviceNewlyAssigned>, "ResetIsSixAxisSensorDeviceNewlyAssigned"}, + FunctionInfo{91, C<&IHidServer::ActivateGesture>, "ActivateGesture"}, + FunctionInfo{92, C<&IHidServer::SetGestureOutputRanges>, "SetGestureOutputRanges"}, + FunctionInfo{100, C<&IHidServer::SetSupportedNpadStyleSet>, "SetSupportedNpadStyleSet"}, + FunctionInfo{101, C<&IHidServer::GetSupportedNpadStyleSet>, "GetSupportedNpadStyleSet"}, + FunctionInfo{102, C<&IHidServer::SetSupportedNpadIdType>, "SetSupportedNpadIdType"}, + FunctionInfo{103, C<&IHidServer::ActivateNpad>, "ActivateNpad"}, + FunctionInfo{104, C<&IHidServer::DeactivateNpad>, "DeactivateNpad"}, + FunctionInfo{106, C<&IHidServer::AcquireNpadStyleSetUpdateEventHandle>, "AcquireNpadStyleSetUpdateEventHandle"}, + FunctionInfo{107, C<&IHidServer::DisconnectNpad>, "DisconnectNpad"}, + FunctionInfo{108, C<&IHidServer::GetPlayerLedPattern>, "GetPlayerLedPattern"}, + FunctionInfo{109, C<&IHidServer::ActivateNpadWithRevision>, "ActivateNpadWithRevision"}, + FunctionInfo{120, C<&IHidServer::SetNpadJoyHoldType>, "SetNpadJoyHoldType"}, + FunctionInfo{121, C<&IHidServer::GetNpadJoyHoldType>, "GetNpadJoyHoldType"}, + FunctionInfo{122, C<&IHidServer::SetNpadJoyAssignmentModeSingleByDefault>, "SetNpadJoyAssignmentModeSingleByDefault"}, + FunctionInfo{123, C<&IHidServer::SetNpadJoyAssignmentModeSingle>, "SetNpadJoyAssignmentModeSingle"}, + FunctionInfo{124, C<&IHidServer::SetNpadJoyAssignmentModeDual>, "SetNpadJoyAssignmentModeDual"}, + FunctionInfo{125, C<&IHidServer::MergeSingleJoyAsDualJoy>, "MergeSingleJoyAsDualJoy"}, + FunctionInfo{126, C<&IHidServer::StartLrAssignmentMode>, "StartLrAssignmentMode"}, + FunctionInfo{127, C<&IHidServer::StopLrAssignmentMode>, "StopLrAssignmentMode"}, + FunctionInfo{128, C<&IHidServer::SetNpadHandheldActivationMode>, "SetNpadHandheldActivationMode"}, + FunctionInfo{129, C<&IHidServer::GetNpadHandheldActivationMode>, "GetNpadHandheldActivationMode"}, + FunctionInfo{130, C<&IHidServer::SwapNpadAssignment>, "SwapNpadAssignment"}, + FunctionInfo{131, C<&IHidServer::IsUnintendedHomeButtonInputProtectionEnabled>, "IsUnintendedHomeButtonInputProtectionEnabled"}, + FunctionInfo{132, C<&IHidServer::EnableUnintendedHomeButtonInputProtection>, "EnableUnintendedHomeButtonInputProtection"}, + FunctionInfo{133, C<&IHidServer::SetNpadJoyAssignmentModeSingleWithDestination>, "SetNpadJoyAssignmentModeSingleWithDestination"}, + FunctionInfo{134, C<&IHidServer::SetNpadAnalogStickUseCenterClamp>, "SetNpadAnalogStickUseCenterClamp"}, + FunctionInfo{135, C<&IHidServer::SetNpadCaptureButtonAssignment>, "SetNpadCaptureButtonAssignment"}, + FunctionInfo{136, C<&IHidServer::ClearNpadCaptureButtonAssignment>, "ClearNpadCaptureButtonAssignment"}, + FunctionInfo{200, C<&IHidServer::GetVibrationDeviceInfo>, "GetVibrationDeviceInfo"}, + FunctionInfo{201, C<&IHidServer::SendVibrationValue>, "SendVibrationValue"}, + FunctionInfo{202, C<&IHidServer::GetActualVibrationValue>, "GetActualVibrationValue"}, + FunctionInfo{203, C<&IHidServer::CreateActiveVibrationDeviceList>, "CreateActiveVibrationDeviceList"}, + FunctionInfo{204, C<&IHidServer::PermitVibration>, "PermitVibration"}, + FunctionInfo{205, C<&IHidServer::IsVibrationPermitted>, "IsVibrationPermitted"}, + FunctionInfo{206, C<&IHidServer::SendVibrationValues>, "SendVibrationValues"}, + FunctionInfo{207, C<&IHidServer::SendVibrationGcErmCommand>, "SendVibrationGcErmCommand"}, + FunctionInfo{208, C<&IHidServer::GetActualVibrationGcErmCommand>, "GetActualVibrationGcErmCommand"}, + FunctionInfo{209, C<&IHidServer::BeginPermitVibrationSession>, "BeginPermitVibrationSession"}, + FunctionInfo{210, C<&IHidServer::EndPermitVibrationSession>, "EndPermitVibrationSession"}, + FunctionInfo{211, C<&IHidServer::IsVibrationDeviceMounted>, "IsVibrationDeviceMounted"}, + FunctionInfo{212, C<&IHidServer::SendVibrationValueInBool>, "SendVibrationValueInBool"}, + FunctionInfo{300, C<&IHidServer::ActivateConsoleSixAxisSensor>, "ActivateConsoleSixAxisSensor"}, + FunctionInfo{301, C<&IHidServer::StartConsoleSixAxisSensor>, "StartConsoleSixAxisSensor"}, + FunctionInfo{302, C<&IHidServer::StopConsoleSixAxisSensor>, "StopConsoleSixAxisSensor"}, + FunctionInfo{303, C<&IHidServer::ActivateSevenSixAxisSensor>, "ActivateSevenSixAxisSensor"}, + FunctionInfo{304, C<&IHidServer::StartSevenSixAxisSensor>, "StartSevenSixAxisSensor"}, + FunctionInfo{305, C<&IHidServer::StopSevenSixAxisSensor>, "StopSevenSixAxisSensor"}, + FunctionInfo{306, C<&IHidServer::InitializeSevenSixAxisSensor>, "InitializeSevenSixAxisSensor"}, + FunctionInfo{307, C<&IHidServer::FinalizeSevenSixAxisSensor>, "FinalizeSevenSixAxisSensor"}, + FunctionInfo{308, nullptr, "SetSevenSixAxisSensorFusionStrength"}, + FunctionInfo{309, nullptr, "GetSevenSixAxisSensorFusionStrength"}, + FunctionInfo{310, C<&IHidServer::ResetSevenSixAxisSensorTimestamp>, "ResetSevenSixAxisSensorTimestamp"}, + FunctionInfo{320, nullptr, "EnableNpadImu", MakeVersionGate({21,0,0})}, + FunctionInfo{321, nullptr, "DisableNpadImu", MakeVersionGate({21,0,0})}, + FunctionInfo{400, C<&IHidServer::IsUsbFullKeyControllerEnabled>, "IsUsbFullKeyControllerEnabled"}, + FunctionInfo{401, nullptr, "EnableUsbFullKeyController"}, + FunctionInfo{402, nullptr, "IsUsbFullKeyControllerConnected"}, + FunctionInfo{403, nullptr, "HasBattery"}, + FunctionInfo{404, nullptr, "HasLeftRightBattery"}, + FunctionInfo{405, nullptr, "GetNpadInterfaceType"}, + FunctionInfo{406, nullptr, "GetNpadLeftRightInterfaceType"}, + FunctionInfo{407, nullptr, "GetNpadOfHighestBatteryLevel"}, + FunctionInfo{408, nullptr, "GetNpadOfHighestBatteryLevelForJoyRight"}, + FunctionInfo{500, C<&IHidServer::GetPalmaConnectionHandle>, "GetPalmaConnectionHandle"}, + FunctionInfo{501, C<&IHidServer::InitializePalma>, "InitializePalma"}, + FunctionInfo{502, C<&IHidServer::AcquirePalmaOperationCompleteEvent>, "AcquirePalmaOperationCompleteEvent"}, + FunctionInfo{503, C<&IHidServer::GetPalmaOperationInfo>, "GetPalmaOperationInfo"}, + FunctionInfo{504, C<&IHidServer::PlayPalmaActivity>, "PlayPalmaActivity"}, + FunctionInfo{505, C<&IHidServer::SetPalmaFrModeType>, "SetPalmaFrModeType"}, + FunctionInfo{506, C<&IHidServer::ReadPalmaStep>, "ReadPalmaStep"}, + FunctionInfo{507, C<&IHidServer::EnablePalmaStep>, "EnablePalmaStep"}, + FunctionInfo{508, C<&IHidServer::ResetPalmaStep>, "ResetPalmaStep"}, + FunctionInfo{509, C<&IHidServer::ReadPalmaApplicationSection>, "ReadPalmaApplicationSection"}, + FunctionInfo{510, C<&IHidServer::WritePalmaApplicationSection>, "WritePalmaApplicationSection"}, + FunctionInfo{511, C<&IHidServer::ReadPalmaUniqueCode>, "ReadPalmaUniqueCode"}, + FunctionInfo{512, C<&IHidServer::SetPalmaUniqueCodeInvalid>, "SetPalmaUniqueCodeInvalid"}, + FunctionInfo{513, C<&IHidServer::WritePalmaActivityEntry>, "WritePalmaActivityEntry"}, + FunctionInfo{514, C<&IHidServer::WritePalmaRgbLedPatternEntry>, "WritePalmaRgbLedPatternEntry"}, + FunctionInfo{515, C<&IHidServer::WritePalmaWaveEntry>, "WritePalmaWaveEntry"}, + FunctionInfo{516, C<&IHidServer::SetPalmaDataBaseIdentificationVersion>, "SetPalmaDataBaseIdentificationVersion"}, + FunctionInfo{517, C<&IHidServer::GetPalmaDataBaseIdentificationVersion>, "GetPalmaDataBaseIdentificationVersion"}, + FunctionInfo{518, C<&IHidServer::SuspendPalmaFeature>, "SuspendPalmaFeature"}, + FunctionInfo{519, C<&IHidServer::GetPalmaOperationResult>, "GetPalmaOperationResult"}, + FunctionInfo{520, C<&IHidServer::ReadPalmaPlayLog>, "ReadPalmaPlayLog"}, + FunctionInfo{521, C<&IHidServer::ResetPalmaPlayLog>, "ResetPalmaPlayLog"}, + FunctionInfo{522, C<&IHidServer::SetIsPalmaAllConnectable>, "SetIsPalmaAllConnectable"}, + FunctionInfo{523, C<&IHidServer::SetIsPalmaPairedConnectable>, "SetIsPalmaPairedConnectable"}, + FunctionInfo{524, C<&IHidServer::PairPalma>, "PairPalma"}, + FunctionInfo{525, C<&IHidServer::SetPalmaBoostMode>, "SetPalmaBoostMode"}, + FunctionInfo{526, C<&IHidServer::CancelWritePalmaWaveEntry>, "CancelWritePalmaWaveEntry"}, + FunctionInfo{527, C<&IHidServer::EnablePalmaBoostMode>, "EnablePalmaBoostMode"}, + FunctionInfo{528, C<&IHidServer::GetPalmaBluetoothAddress>, "GetPalmaBluetoothAddress"}, + FunctionInfo{529, C<&IHidServer::SetDisallowedPalmaConnection>, "SetDisallowedPalmaConnection"}, + FunctionInfo{1000, C<&IHidServer::SetNpadCommunicationMode>, "SetNpadCommunicationMode"}, + FunctionInfo{1001, C<&IHidServer::GetNpadCommunicationMode>, "GetNpadCommunicationMode"}, + FunctionInfo{1002, C<&IHidServer::SetTouchScreenConfiguration>, "SetTouchScreenConfiguration"}, + FunctionInfo{1003, C<&IHidServer::IsFirmwareUpdateNeededForNotification>, "IsFirmwareUpdateNeededForNotification"}, + FunctionInfo{1004, C<&IHidServer::SetTouchScreenResolution>, "SetTouchScreenResolution"}, + FunctionInfo{1270, nullptr, "DeleteButtonConfigStorageRight"}, + FunctionInfo{1271, nullptr, "IsUsingCustomButtonConfig"}, + FunctionInfo{1272, nullptr, "IsAnyCustomButtonConfigEnabled"}, + FunctionInfo{1273, nullptr, "SetAllCustomButtonConfigEnabled"}, + FunctionInfo{1274, nullptr, "SetDefaultButtonConfig"}, + FunctionInfo{1275, nullptr, "SetAllDefaultButtonConfig"}, + FunctionInfo{1276, nullptr, "SetHidButtonConfigEmbedded"}, + FunctionInfo{1277, nullptr, "SetHidButtonConfigFull"}, + FunctionInfo{1278, nullptr, "SetHidButtonConfigLeft"}, + FunctionInfo{1279, nullptr, "SetHidButtonConfigRight"}, + FunctionInfo{1280, nullptr, "GetHidButtonConfigEmbedded"}, + FunctionInfo{1281, nullptr, "GetHidButtonConfigFull"}, + FunctionInfo{1282, nullptr, "GetHidButtonConfigLeft"}, + FunctionInfo{1283, nullptr, "GetHidButtonConfigRight"}, + FunctionInfo{1284, nullptr, "GetButtonConfigStorageEmbedded"}, + FunctionInfo{1285, nullptr, "GetButtonConfigStorageFull"}, + FunctionInfo{1286, nullptr, "GetButtonConfigStorageLeft"}, + FunctionInfo{1287, nullptr, "GetButtonConfigStorageRight"}, + FunctionInfo{1288, nullptr, "SetButtonConfigStorageEmbedded"}, + FunctionInfo{1289, nullptr, "SetButtonConfigStorageFull"}, + FunctionInfo{1290, nullptr, "SetButtonConfigStorageLeft"}, + FunctionInfo{1291, nullptr, "SetButtonConfigStorageRight"}, + FunctionInfo{1308, nullptr, "SetButtonConfigVisible"}, + FunctionInfo{1309, nullptr, "IsButtonConfigVisible"}, + FunctionInfo{1320, nullptr, "WakeTouchScreenUp"}, + FunctionInfo{1321, nullptr, "PutTouchScreenToSleep"}, + FunctionInfo{1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent"}, + FunctionInfo{1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings"}, + FunctionInfo{1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent"}, + FunctionInfo{1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement"}, + FunctionInfo{1420, nullptr, "GetAppletResourceProperty"}, + FunctionInfo{2000, nullptr, "ActivateDigitizer"}, + FunctionInfo{3000, nullptr, "GetDebugPadGenericPadMap"}, + FunctionInfo{3001, nullptr, "SetDebugPadGenericPadMap"}, + FunctionInfo{3002, nullptr, "ResetDebugPadGenericPadMap"}, + FunctionInfo{3003, nullptr, "GetDebugPadKeyboardMap"}, + FunctionInfo{3004, nullptr, "SetDebugPadKeyboardMap"}, + FunctionInfo{3005, nullptr, "ResetDebugPadKeyboardMap"}, + FunctionInfo{3006, nullptr, "GetFullKeyGenericPadMap"}, + FunctionInfo{3007, nullptr, "SetFullKeyGenericPadMap"}, + FunctionInfo{3008, nullptr, "ResetFullKeyGenericPadMap"}, + FunctionInfo{3009, nullptr, "GetFullKeyKeyboardMap"}, + FunctionInfo{3010, nullptr, "SetFullKeyKeyboardMap"}, + FunctionInfo{3011, nullptr, "ResetFullKeyKeyboardMap"}, + FunctionInfo{3012, nullptr, "GetDebugPadGenericPadMap", MakeVersionGate({21,0,0})}, + FunctionInfo{3013, nullptr, "SetDebugPadGenericPadMap", MakeVersionGate({21,0,0})}, + FunctionInfo{3014, nullptr, "GetDebugPadKeyboardMap", MakeVersionGate({21,0,0})}, + FunctionInfo{3015, nullptr, "SetDebugPadKeyboardMap", MakeVersionGate({21,0,0})}, + FunctionInfo{3150, C<&IHidServer::SetMouseLibraryVersion>, "SetMouseLibraryVersion", MakeVersionGate({21,0,0})} + // What? -- {12010, nullptr, "SetButtonConfigLeft"}, + ); + return HandlerTableGenerateWithFind(key, functions); +} + IHidServer::IHidServer(Core::System& system_, std::shared_ptr resource, std::shared_ptr settings) : ServiceFramework{system_, "hid"}, resource_manager{resource}, firmware_settings{settings} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&IHidServer::CreateAppletResource>, "CreateAppletResource"}, - {1, C<&IHidServer::ActivateDebugPad>, "ActivateDebugPad"}, - {11, C<&IHidServer::ActivateTouchScreen>, "ActivateTouchScreen"}, - {21, C<&IHidServer::ActivateMouse>, "ActivateMouse"}, - {26, C<&IHidServer::ActivateDebugMouse>, "ActivateDebugMouse"}, - {31, C<&IHidServer::ActivateKeyboard>, "ActivateKeyboard"}, - {32, C<&IHidServer::SendKeyboardLockKeyEvent>, "SendKeyboardLockKeyEvent"}, - {40, C<&IHidServer::AcquireXpadIdEventHandle>, "AcquireXpadIdEventHandle"}, - {41, C<&IHidServer::ReleaseXpadIdEventHandle>, "ReleaseXpadIdEventHandle"}, - {51, C<&IHidServer::ActivateXpad>, "ActivateXpad"}, - {55, C<&IHidServer::GetXpadIds>, "GetXpadIds"}, - {56, C<&IHidServer::ActivateJoyXpad>, "ActivateJoyXpad"}, - {58, C<&IHidServer::GetJoyXpadLifoHandle>, "GetJoyXpadLifoHandle"}, - {59, C<&IHidServer::GetJoyXpadIds>, "GetJoyXpadIds"}, - {60, C<&IHidServer::ActivateSixAxisSensor>, "ActivateSixAxisSensor"}, - {61, C<&IHidServer::DeactivateSixAxisSensor>, "DeactivateSixAxisSensor"}, - {62, C<&IHidServer::GetSixAxisSensorLifoHandle>, "GetSixAxisSensorLifoHandle"}, - {63, C<&IHidServer::ActivateJoySixAxisSensor>, "ActivateJoySixAxisSensor"}, - {64, C<&IHidServer::DeactivateJoySixAxisSensor>, "DeactivateJoySixAxisSensor"}, - {65, C<&IHidServer::GetJoySixAxisSensorLifoHandle>, "GetJoySixAxisSensorLifoHandle"}, - {66, C<&IHidServer::StartSixAxisSensor>, "StartSixAxisSensor"}, - {67, C<&IHidServer::StopSixAxisSensor>, "StopSixAxisSensor"}, - {68, C<&IHidServer::IsSixAxisSensorFusionEnabled>, "IsSixAxisSensorFusionEnabled"}, - {69, C<&IHidServer::EnableSixAxisSensorFusion>, "EnableSixAxisSensorFusion"}, - {70, C<&IHidServer::SetSixAxisSensorFusionParameters>, "SetSixAxisSensorFusionParameters"}, - {71, C<&IHidServer::GetSixAxisSensorFusionParameters>, "GetSixAxisSensorFusionParameters"}, - {72, C<&IHidServer::ResetSixAxisSensorFusionParameters>, "ResetSixAxisSensorFusionParameters"}, - {73, nullptr, "SetAccelerometerParameters"}, - {74, nullptr, "GetAccelerometerParameters"}, - {75, nullptr, "ResetAccelerometerParameters"}, - {76, nullptr, "SetAccelerometerPlayMode"}, - {77, nullptr, "GetAccelerometerPlayMode"}, - {78, nullptr, "ResetAccelerometerPlayMode"}, - {79, C<&IHidServer::SetGyroscopeZeroDriftMode>, "SetGyroscopeZeroDriftMode"}, - {80, C<&IHidServer::GetGyroscopeZeroDriftMode>, "GetGyroscopeZeroDriftMode"}, - {81, C<&IHidServer::ResetGyroscopeZeroDriftMode>, "ResetGyroscopeZeroDriftMode"}, - {82, C<&IHidServer::IsSixAxisSensorAtRest>, "IsSixAxisSensorAtRest"}, - {83, C<&IHidServer::IsFirmwareUpdateAvailableForSixAxisSensor>, "IsFirmwareUpdateAvailableForSixAxisSensor"}, - {84, C<&IHidServer::EnableSixAxisSensorUnalteredPassthrough>, "EnableSixAxisSensorUnalteredPassthrough"}, - {85, C<&IHidServer::IsSixAxisSensorUnalteredPassthroughEnabled>, "IsSixAxisSensorUnalteredPassthroughEnabled"}, - {86, nullptr, "StoreSixAxisSensorCalibrationParameter"}, - {87, C<&IHidServer::LoadSixAxisSensorCalibrationParameter>, "LoadSixAxisSensorCalibrationParameter"}, - {88, C<&IHidServer::GetSixAxisSensorIcInformation>, "GetSixAxisSensorIcInformation"}, - {89, C<&IHidServer::ResetIsSixAxisSensorDeviceNewlyAssigned>, "ResetIsSixAxisSensorDeviceNewlyAssigned"}, - {91, C<&IHidServer::ActivateGesture>, "ActivateGesture"}, - {92, C<&IHidServer::SetGestureOutputRanges>, "SetGestureOutputRanges"}, - {100, C<&IHidServer::SetSupportedNpadStyleSet>, "SetSupportedNpadStyleSet"}, - {101, C<&IHidServer::GetSupportedNpadStyleSet>, "GetSupportedNpadStyleSet"}, - {102, C<&IHidServer::SetSupportedNpadIdType>, "SetSupportedNpadIdType"}, - {103, C<&IHidServer::ActivateNpad>, "ActivateNpad"}, - {104, C<&IHidServer::DeactivateNpad>, "DeactivateNpad"}, - {106, C<&IHidServer::AcquireNpadStyleSetUpdateEventHandle>, "AcquireNpadStyleSetUpdateEventHandle"}, - {107, C<&IHidServer::DisconnectNpad>, "DisconnectNpad"}, - {108, C<&IHidServer::GetPlayerLedPattern>, "GetPlayerLedPattern"}, - {109, C<&IHidServer::ActivateNpadWithRevision>, "ActivateNpadWithRevision"}, - {120, C<&IHidServer::SetNpadJoyHoldType>, "SetNpadJoyHoldType"}, - {121, C<&IHidServer::GetNpadJoyHoldType>, "GetNpadJoyHoldType"}, - {122, C<&IHidServer::SetNpadJoyAssignmentModeSingleByDefault>, "SetNpadJoyAssignmentModeSingleByDefault"}, - {123, C<&IHidServer::SetNpadJoyAssignmentModeSingle>, "SetNpadJoyAssignmentModeSingle"}, - {124, C<&IHidServer::SetNpadJoyAssignmentModeDual>, "SetNpadJoyAssignmentModeDual"}, - {125, C<&IHidServer::MergeSingleJoyAsDualJoy>, "MergeSingleJoyAsDualJoy"}, - {126, C<&IHidServer::StartLrAssignmentMode>, "StartLrAssignmentMode"}, - {127, C<&IHidServer::StopLrAssignmentMode>, "StopLrAssignmentMode"}, - {128, C<&IHidServer::SetNpadHandheldActivationMode>, "SetNpadHandheldActivationMode"}, - {129, C<&IHidServer::GetNpadHandheldActivationMode>, "GetNpadHandheldActivationMode"}, - {130, C<&IHidServer::SwapNpadAssignment>, "SwapNpadAssignment"}, - {131, C<&IHidServer::IsUnintendedHomeButtonInputProtectionEnabled>, "IsUnintendedHomeButtonInputProtectionEnabled"}, - {132, C<&IHidServer::EnableUnintendedHomeButtonInputProtection>, "EnableUnintendedHomeButtonInputProtection"}, - {133, C<&IHidServer::SetNpadJoyAssignmentModeSingleWithDestination>, "SetNpadJoyAssignmentModeSingleWithDestination"}, - {134, C<&IHidServer::SetNpadAnalogStickUseCenterClamp>, "SetNpadAnalogStickUseCenterClamp"}, - {135, C<&IHidServer::SetNpadCaptureButtonAssignment>, "SetNpadCaptureButtonAssignment"}, - {136, C<&IHidServer::ClearNpadCaptureButtonAssignment>, "ClearNpadCaptureButtonAssignment"}, - {200, C<&IHidServer::GetVibrationDeviceInfo>, "GetVibrationDeviceInfo"}, - {201, C<&IHidServer::SendVibrationValue>, "SendVibrationValue"}, - {202, C<&IHidServer::GetActualVibrationValue>, "GetActualVibrationValue"}, - {203, C<&IHidServer::CreateActiveVibrationDeviceList>, "CreateActiveVibrationDeviceList"}, - {204, C<&IHidServer::PermitVibration>, "PermitVibration"}, - {205, C<&IHidServer::IsVibrationPermitted>, "IsVibrationPermitted"}, - {206, C<&IHidServer::SendVibrationValues>, "SendVibrationValues"}, - {207, C<&IHidServer::SendVibrationGcErmCommand>, "SendVibrationGcErmCommand"}, - {208, C<&IHidServer::GetActualVibrationGcErmCommand>, "GetActualVibrationGcErmCommand"}, - {209, C<&IHidServer::BeginPermitVibrationSession>, "BeginPermitVibrationSession"}, - {210, C<&IHidServer::EndPermitVibrationSession>, "EndPermitVibrationSession"}, - {211, C<&IHidServer::IsVibrationDeviceMounted>, "IsVibrationDeviceMounted"}, - {212, C<&IHidServer::SendVibrationValueInBool>, "SendVibrationValueInBool"}, - {300, C<&IHidServer::ActivateConsoleSixAxisSensor>, "ActivateConsoleSixAxisSensor"}, - {301, C<&IHidServer::StartConsoleSixAxisSensor>, "StartConsoleSixAxisSensor"}, - {302, C<&IHidServer::StopConsoleSixAxisSensor>, "StopConsoleSixAxisSensor"}, - {303, C<&IHidServer::ActivateSevenSixAxisSensor>, "ActivateSevenSixAxisSensor"}, - {304, C<&IHidServer::StartSevenSixAxisSensor>, "StartSevenSixAxisSensor"}, - {305, C<&IHidServer::StopSevenSixAxisSensor>, "StopSevenSixAxisSensor"}, - {306, C<&IHidServer::InitializeSevenSixAxisSensor>, "InitializeSevenSixAxisSensor"}, - {307, C<&IHidServer::FinalizeSevenSixAxisSensor>, "FinalizeSevenSixAxisSensor"}, - {308, nullptr, "SetSevenSixAxisSensorFusionStrength"}, - {309, nullptr, "GetSevenSixAxisSensorFusionStrength"}, - {310, C<&IHidServer::ResetSevenSixAxisSensorTimestamp>, "ResetSevenSixAxisSensorTimestamp"}, - {320, nullptr, "EnableNpadImu"}, //21.0.0+ - {321, nullptr, "DisableNpadImu"}, //21.0.0+ - {400, C<&IHidServer::IsUsbFullKeyControllerEnabled>, "IsUsbFullKeyControllerEnabled"}, - {401, nullptr, "EnableUsbFullKeyController"}, - {402, nullptr, "IsUsbFullKeyControllerConnected"}, - {403, nullptr, "HasBattery"}, - {404, nullptr, "HasLeftRightBattery"}, - {405, nullptr, "GetNpadInterfaceType"}, - {406, nullptr, "GetNpadLeftRightInterfaceType"}, - {407, nullptr, "GetNpadOfHighestBatteryLevel"}, - {408, nullptr, "GetNpadOfHighestBatteryLevelForJoyRight"}, - {500, C<&IHidServer::GetPalmaConnectionHandle>, "GetPalmaConnectionHandle"}, - {501, C<&IHidServer::InitializePalma>, "InitializePalma"}, - {502, C<&IHidServer::AcquirePalmaOperationCompleteEvent>, "AcquirePalmaOperationCompleteEvent"}, - {503, C<&IHidServer::GetPalmaOperationInfo>, "GetPalmaOperationInfo"}, - {504, C<&IHidServer::PlayPalmaActivity>, "PlayPalmaActivity"}, - {505, C<&IHidServer::SetPalmaFrModeType>, "SetPalmaFrModeType"}, - {506, C<&IHidServer::ReadPalmaStep>, "ReadPalmaStep"}, - {507, C<&IHidServer::EnablePalmaStep>, "EnablePalmaStep"}, - {508, C<&IHidServer::ResetPalmaStep>, "ResetPalmaStep"}, - {509, C<&IHidServer::ReadPalmaApplicationSection>, "ReadPalmaApplicationSection"}, - {510, C<&IHidServer::WritePalmaApplicationSection>, "WritePalmaApplicationSection"}, - {511, C<&IHidServer::ReadPalmaUniqueCode>, "ReadPalmaUniqueCode"}, - {512, C<&IHidServer::SetPalmaUniqueCodeInvalid>, "SetPalmaUniqueCodeInvalid"}, - {513, C<&IHidServer::WritePalmaActivityEntry>, "WritePalmaActivityEntry"}, - {514, C<&IHidServer::WritePalmaRgbLedPatternEntry>, "WritePalmaRgbLedPatternEntry"}, - {515, C<&IHidServer::WritePalmaWaveEntry>, "WritePalmaWaveEntry"}, - {516, C<&IHidServer::SetPalmaDataBaseIdentificationVersion>, "SetPalmaDataBaseIdentificationVersion"}, - {517, C<&IHidServer::GetPalmaDataBaseIdentificationVersion>, "GetPalmaDataBaseIdentificationVersion"}, - {518, C<&IHidServer::SuspendPalmaFeature>, "SuspendPalmaFeature"}, - {519, C<&IHidServer::GetPalmaOperationResult>, "GetPalmaOperationResult"}, - {520, C<&IHidServer::ReadPalmaPlayLog>, "ReadPalmaPlayLog"}, - {521, C<&IHidServer::ResetPalmaPlayLog>, "ResetPalmaPlayLog"}, - {522, C<&IHidServer::SetIsPalmaAllConnectable>, "SetIsPalmaAllConnectable"}, - {523, C<&IHidServer::SetIsPalmaPairedConnectable>, "SetIsPalmaPairedConnectable"}, - {524, C<&IHidServer::PairPalma>, "PairPalma"}, - {525, C<&IHidServer::SetPalmaBoostMode>, "SetPalmaBoostMode"}, - {526, C<&IHidServer::CancelWritePalmaWaveEntry>, "CancelWritePalmaWaveEntry"}, - {527, C<&IHidServer::EnablePalmaBoostMode>, "EnablePalmaBoostMode"}, - {528, C<&IHidServer::GetPalmaBluetoothAddress>, "GetPalmaBluetoothAddress"}, - {529, C<&IHidServer::SetDisallowedPalmaConnection>, "SetDisallowedPalmaConnection"}, - {1000, C<&IHidServer::SetNpadCommunicationMode>, "SetNpadCommunicationMode"}, - {1001, C<&IHidServer::GetNpadCommunicationMode>, "GetNpadCommunicationMode"}, - {1002, C<&IHidServer::SetTouchScreenConfiguration>, "SetTouchScreenConfiguration"}, - {1003, C<&IHidServer::IsFirmwareUpdateNeededForNotification>, "IsFirmwareUpdateNeededForNotification"}, - {1004, C<&IHidServer::SetTouchScreenResolution>, "SetTouchScreenResolution"}, - {1270, nullptr, "DeleteButtonConfigStorageRight"}, - {1271, nullptr, "IsUsingCustomButtonConfig"}, - {1272, nullptr, "IsAnyCustomButtonConfigEnabled"}, - {1273, nullptr, "SetAllCustomButtonConfigEnabled"}, - {1274, nullptr, "SetDefaultButtonConfig"}, - {1275, nullptr, "SetAllDefaultButtonConfig"}, - {1276, nullptr, "SetHidButtonConfigEmbedded"}, - {1277, nullptr, "SetHidButtonConfigFull"}, - {1278, nullptr, "SetHidButtonConfigLeft"}, - {1279, nullptr, "SetHidButtonConfigRight"}, - {1280, nullptr, "GetHidButtonConfigEmbedded"}, - {1281, nullptr, "GetHidButtonConfigFull"}, - {1282, nullptr, "GetHidButtonConfigLeft"}, - {1283, nullptr, "GetHidButtonConfigRight"}, - {1284, nullptr, "GetButtonConfigStorageEmbedded"}, - {1285, nullptr, "GetButtonConfigStorageFull"}, - {1286, nullptr, "GetButtonConfigStorageLeft"}, - {1287, nullptr, "GetButtonConfigStorageRight"}, - {1288, nullptr, "SetButtonConfigStorageEmbedded"}, - {1289, nullptr, "SetButtonConfigStorageFull"}, - {1290, nullptr, "SetButtonConfigStorageLeft"}, - {1291, nullptr, "SetButtonConfigStorageRight"}, - {1308, nullptr, "SetButtonConfigVisible"}, - {1309, nullptr, "IsButtonConfigVisible"}, - {1320, nullptr, "WakeTouchScreenUp"}, - {1321, nullptr, "PutTouchScreenToSleep"}, - {1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent"}, - {1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings"}, - {1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent"}, - {1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement"}, - {1420, nullptr, "GetAppletResourceProperty"}, - {2000, nullptr, "ActivateDigitizer"}, - {3000, nullptr, "GetDebugPadGenericPadMap"}, - {3001, nullptr, "SetDebugPadGenericPadMap"}, - {3002, nullptr, "ResetDebugPadGenericPadMap"}, - {3003, nullptr, "GetDebugPadKeyboardMap"}, - {3004, nullptr, "SetDebugPadKeyboardMap"}, - {3005, nullptr, "ResetDebugPadKeyboardMap"}, - {3006, nullptr, "GetFullKeyGenericPadMap"}, - {3007, nullptr, "SetFullKeyGenericPadMap"}, - {3008, nullptr, "ResetFullKeyGenericPadMap"}, - {3009, nullptr, "GetFullKeyKeyboardMap"}, - {3010, nullptr, "SetFullKeyKeyboardMap"}, - {3011, nullptr, "ResetFullKeyKeyboardMap"}, - {3012, nullptr, "GetDebugPadGenericPadMap"}, //21.0.0+ - {3013, nullptr, "SetDebugPadGenericPadMap"}, //21.0.0+ - {3014, nullptr, "GetDebugPadKeyboardMap"}, //21.0.0+ - {3015, nullptr, "SetDebugPadKeyboardMap"}, //21.0.0+ - {3150, C<&IHidServer::SetMouseLibraryVersion>, "SetMouseLibraryVersion"}, //21.0.0+ - // What? -- {12010, nullptr, "SetButtonConfigLeft"}, - }; - // clang-format on - - RegisterHandlers(functions); } IHidServer::~IHidServer() = default; diff --git a/src/core/hle/service/hid/hid_server.h b/src/core/hle/service/hid/hid_server.h index 57a1a04b9c..f2c08e9df8 100644 --- a/src/core/hle/service/hid/hid_server.h +++ b/src/core/hle/service/hid/hid_server.h @@ -265,6 +265,8 @@ private: Result SetTouchScreenResolution(u32 width, u32 height, ClientAppletResourceUserId aruid); Result SetMouseLibraryVersion(ClientAppletResourceUserId aruid); + std::optional FindRequest(u32 key) override; + std::shared_ptr resource_manager; std::shared_ptr firmware_settings; }; diff --git a/src/core/hle/service/hid/hid_system_server.cpp b/src/core/hle/service/hid/hid_system_server.cpp index e544adf03c..4df021f443 100644 --- a/src/core/hle/service/hid/hid_system_server.cpp +++ b/src/core/hle/service/hid/hid_system_server.cpp @@ -22,252 +22,6 @@ IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr settings) : ServiceFramework{system_, "hid:sys"}, service_context{system_, service_name}, resource_manager{resource}, firmware_settings{settings} { - // clang-format off - static const FunctionInfo functions[] = { - {31, nullptr, "SendKeyboardLockKeyEvent"}, - {101, nullptr, "AcquireHomeButtonEventHandle"}, - {111, nullptr, "ActivateHomeButton"}, - {121, nullptr, "AcquireSleepButtonEventHandle"}, - {131, nullptr, "ActivateSleepButton"}, - {141, nullptr, "AcquireCaptureButtonEventHandle"}, - {151, nullptr, "ActivateCaptureButton"}, - {161, &IHidSystemServer::GetPlatformConfig, "GetPlatformConfig"}, - {210, nullptr, "AcquireNfcDeviceUpdateEventHandle"}, - {211, nullptr, "GetNpadsWithNfc"}, - {212, nullptr, "AcquireNfcActivateEventHandle"}, - {213, nullptr, "ActivateNfc"}, - {214, nullptr, "GetXcdHandleForNpadWithNfc"}, - {215, nullptr, "IsNfcActivated"}, - {216, nullptr, "GetAbstractedPadIdForNpadWithNfc"}, - {217, nullptr, "SetNfcEvent"}, - {218, nullptr, "GetNfcInfo"}, - {219, nullptr, "StartNfcDiscovery"}, - {220, nullptr, "StopNfcDiscovery"}, - {221, nullptr, "StartNtagRead"}, - {222, nullptr, "StartNtagWrite"}, - {223, nullptr, "SendNfcRawData"}, - {224, nullptr, "RegisterMifareKey"}, - {225, nullptr, "ClearMifareKey"}, - {226, nullptr, "StartMifareRead"}, - {227, nullptr, "StartMifareWrite"}, - {230, nullptr, "AcquireIrSensorEventHndle" }, - {231, nullptr, "ActivateIrSensor"}, - {232, nullptr, "GetIrSensorState"}, - {233, nullptr, "GetXcdHandleForNpadWihIrSensor" }, - {234, nullptr, "GetNpadJoyHoldType"}, - {241, nullptr, "GetDataFormat"}, - {242, nullptr, "SetDataFormat"}, - {243, nullptr, "GetMcuState"}, - {244, nullptr, "SetMcuState"}, - {245, nullptr, "GetMcuVersionForNfc"}, - {246, nullptr, "CheckNfcDevicePower"}, - {247, nullptr, "SetMcuStateImmediate"}, - {301, nullptr, "ActivateNpadSystem"}, - {303, &IHidSystemServer::ApplyNpadSystemCommonPolicy, "ApplyNpadSystemCommonPolicy"}, - {304, &IHidSystemServer::EnableAssigningSingleOnSlSrPress, "EnableAssigningSingleOnSlSrPress"}, - {305, &IHidSystemServer::DisableAssigningSingleOnSlSrPress, "DisableAssigningSingleOnSlSrPress"}, - {306, &IHidSystemServer::GetLastActiveNpad, "GetLastActiveNpad"}, - {307, nullptr, "GetNpadSystemExtStyle"}, - {308, &IHidSystemServer::ApplyNpadSystemCommonPolicyFull, "ApplyNpadSystemCommonPolicyFull"}, - {309, &IHidSystemServer::GetNpadFullKeyGripColor, "GetNpadFullKeyGripColor"}, - {310, &IHidSystemServer::GetMaskedSupportedNpadStyleSet, "GetMaskedSupportedNpadStyleSet"}, - {311, nullptr, "SetNpadPlayerLedBlinkingDevice"}, - {312, &IHidSystemServer::SetSupportedNpadStyleSetAll, "SetSupportedNpadStyleSetAll"}, - {313, &IHidSystemServer::GetNpadCaptureButtonAssignment, "GetNpadCaptureButtonAssignment"}, - {314, nullptr, "GetAppletFooterUiType"}, - {315, &IHidSystemServer::GetAppletDetailedUiType, "GetAppletDetailedUiType"}, - {316, &IHidSystemServer::GetNpadInterfaceType, "GetNpadInterfaceType"}, - {317, &IHidSystemServer::GetNpadLeftRightInterfaceType, "GetNpadLeftRightInterfaceType"}, - {318, &IHidSystemServer::HasBattery, "HasBattery"}, - {319, &IHidSystemServer::HasLeftRightBattery, "HasLeftRightBattery"}, - {321, &IHidSystemServer::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"}, - {322, &IHidSystemServer::SetNpadSystemExtStateEnabled, "SetNpadSystemExtStateEnabled"}, - {323, nullptr, "GetLastActiveUniquePad"}, - {324, nullptr, "GetUniquePadButtonSet"}, - {325, nullptr, "GetUniquePadColor"}, - {326, nullptr, "GetUniquePadAppletDetailedUiType"}, - {327, nullptr, "GetAbstractedPadIdDataFromNpad"}, - {328, nullptr, "AttachAbstractedPadToNpad"}, - {329, nullptr, "DetachAbstractedPadAll"}, - {330, nullptr, "CheckAbstractedPadConnection"}, - {332, nullptr, "ConvertAppletDetailedUiTypeFromPlayReportType"}, //19.0.0+ - {333, nullptr, "SetNpadUserSpgApplet"}, //20.0.0+ - {334, nullptr, "AcquireUniquePadButtonStateChangedEventHandle"}, //20.0.0+ - {501, &IHidSystemServer::RegisterAppletResourceUserId, "RegisterAppletResourceUserId"}, - {502, &IHidSystemServer::UnregisterAppletResourceUserId, "UnregisterAppletResourceUserId"}, - {503, &IHidSystemServer::EnableAppletToGetInput, "EnableAppletToGetInput"}, - {504, &IHidSystemServer::SetAruidValidForVibration, "SetAruidValidForVibration"}, - {505, &IHidSystemServer::EnableAppletToGetSixAxisSensor, "EnableAppletToGetSixAxisSensor"}, - {506, &IHidSystemServer::EnableAppletToGetPadInput, "EnableAppletToGetPadInput"}, - {507, &IHidSystemServer::EnableAppletToGetTouchScreen, "EnableAppletToGetTouchScreen"}, - {510, &IHidSystemServer::SetVibrationMasterVolume, "SetVibrationMasterVolume"}, - {511, &IHidSystemServer::GetVibrationMasterVolume, "GetVibrationMasterVolume"}, - {512, &IHidSystemServer::BeginPermitVibrationSession, "BeginPermitVibrationSession"}, - {513, &IHidSystemServer::EndPermitVibrationSession, "EndPermitVibrationSession"}, - {514, nullptr, "Unknown514"}, - {520, nullptr, "EnableHandheldHids"}, - {521, nullptr, "DisableHandheldHids"}, - {522, nullptr, "SetJoyConRailEnabled"}, - {523, &IHidSystemServer::IsJoyConRailEnabled, "IsJoyConRailEnabled"}, - {524, nullptr, "IsHandheldHidsEnabled"}, - {525, &IHidSystemServer::IsJoyConAttachedOnAllRail, "IsJoyConAttachedOnAllRail"}, - {540, nullptr, "AcquirePlayReportControllerUsageUpdateEvent"}, - {541, nullptr, "GetPlayReportControllerUsages"}, - {542, nullptr, "AcquirePlayReportRegisteredDeviceUpdateEvent"}, - {543, nullptr, "GetRegisteredDevicesOld"}, - {544, &IHidSystemServer::AcquireConnectionTriggerTimeoutEvent, "AcquireConnectionTriggerTimeoutEvent"}, - {545, nullptr, "SendConnectionTrigger"}, - {546, &IHidSystemServer::AcquireDeviceRegisteredEventForControllerSupport, "AcquireDeviceRegisteredEventForControllerSupport"}, - {547, nullptr, "GetAllowedBluetoothLinksCount"}, - {548, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevices"}, - {549, nullptr, "GetConnectableRegisteredDevices"}, - {551, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevicesForControllerSupport"}, //20.0.0+ //mocked via 548 for Diablo 3 (at least) - {700, nullptr, "ActivateUniquePad"}, - {702, &IHidSystemServer::AcquireUniquePadConnectionEventHandle, "AcquireUniquePadConnectionEventHandle"}, - {703, &IHidSystemServer::GetUniquePadIds, "GetUniquePadIds"}, - {711, nullptr, "AcquireUniquePadConnectionOnHandheldForNsEventHandle"}, //20.0.0+ - {712, nullptr, "GetUniquePadColor12"}, //20.0.0+ - {751, &IHidSystemServer::AcquireJoyDetachOnBluetoothOffEventHandle, "AcquireJoyDetachOnBluetoothOffEventHandle"}, - {800, nullptr, "ListSixAxisSensorHandles"}, - {801, nullptr, "IsSixAxisSensorUserCalibrationSupported"}, - {802, nullptr, "ResetSixAxisSensorCalibrationValues"}, - {803, nullptr, "StartSixAxisSensorUserCalibration"}, - {804, nullptr, "CancelSixAxisSensorUserCalibration"}, - {805, nullptr, "GetUniquePadBluetoothAddress"}, - {806, nullptr, "DisconnectUniquePad"}, - {807, nullptr, "GetUniquePadType"}, - {808, nullptr, "GetUniquePadInterface"}, - {809, nullptr, "GetUniquePadSerialNumber"}, - {810, nullptr, "GetUniquePadControllerNumber"}, - {811, nullptr, "GetSixAxisSensorUserCalibrationStage"}, - {812, nullptr, "GetConsoleUniqueSixAxisSensorHandle"}, - {813, nullptr, "GetDeviceType"}, - {821, nullptr, "StartAnalogStickManualCalibration"}, - {822, nullptr, "RetryCurrentAnalogStickManualCalibrationStage"}, - {823, nullptr, "CancelAnalogStickManualCalibration"}, - {824, nullptr, "ResetAnalogStickManualCalibration"}, - {825, nullptr, "GetAnalogStickState"}, - {826, nullptr, "GetAnalogStickManualCalibrationStage"}, - {827, nullptr, "IsAnalogStickButtonPressed"}, - {828, nullptr, "IsAnalogStickInReleasePosition"}, - {829, nullptr, "IsAnalogStickInCircumference"}, - {830, nullptr, "SetNotificationLedPattern"}, - {831, nullptr, "SetNotificationLedPatternWithTimeout"}, - {832, nullptr, "PrepareHidsForNotificationWake"}, - {850, &IHidSystemServer::IsUsbFullKeyControllerEnabled, "IsUsbFullKeyControllerEnabled"}, - {851, &IHidSystemServer::EnableUsbFullKeyController, "EnableUsbFullKeyController"}, - {852, nullptr, "IsUsbConnected"}, - {870, &IHidSystemServer::IsHandheldButtonPressedOnConsoleMode, "IsHandheldButtonPressedOnConsoleMode"}, - {900, nullptr, "ActivateInputDetector"}, - {901, nullptr, "NotifyInputDetector"}, - {1000, &IHidSystemServer::InitializeFirmwareUpdate, "InitializeFirmwareUpdate"}, - {1001, nullptr, "GetFirmwareVersion"}, - {1002, nullptr, "GetAvailableFirmwareVersion"}, - {1003, nullptr, "IsFirmwareUpdateAvailable"}, - {1004, &IHidSystemServer::CheckFirmwareUpdateRequired, "CheckFirmwareUpdateRequired"}, - {1005, nullptr, "StartFirmwareUpdate"}, - {1006, nullptr, "AbortFirmwareUpdate"}, - {1007, nullptr, "GetFirmwareUpdateState"}, - {1008, nullptr, "ActivateAudioControl"}, - {1009, nullptr, "AcquireAudioControlEventHandle"}, - {1010, nullptr, "GetAudioControlStates"}, - {1011, nullptr, "DeactivateAudioControl"}, - {1012, nullptr, "GetFirmwareVersionStringForUserSupportPage"}, - {1050, nullptr, "IsSixAxisSensorAccurateUserCalibrationSupported"}, - {1051, nullptr, "StartSixAxisSensorAccurateUserCalibration"}, - {1052, nullptr, "CancelSixAxisSensorAccurateUserCalibration"}, - {1053, nullptr, "GetSixAxisSensorAccurateUserCalibrationState"}, - {1100, nullptr, "GetHidbusSystemServiceObject"}, - {1120, &IHidSystemServer::SetFirmwareHotfixUpdateSkipEnabled, "SetFirmwareHotfixUpdateSkipEnabled"}, - {1130, &IHidSystemServer::InitializeUsbFirmwareUpdate, "InitializeUsbFirmwareUpdate"}, - {1131, &IHidSystemServer::FinalizeUsbFirmwareUpdate, "FinalizeUsbFirmwareUpdate"}, - {1132, &IHidSystemServer::CheckUsbFirmwareUpdateRequired, "CheckUsbFirmwareUpdateRequired"}, - {1133, nullptr, "StartUsbFirmwareUpdate"}, - {1134, nullptr, "GetUsbFirmwareUpdateState"}, - {1135, &IHidSystemServer::InitializeUsbFirmwareUpdateWithoutMemory, "InitializeUsbFirmwareUpdateWithoutMemory"}, - {1150, &IHidSystemServer::SetTouchScreenMagnification, "SetTouchScreenMagnification"}, - {1151, &IHidSystemServer::GetTouchScreenFirmwareVersion, "GetTouchScreenFirmwareVersion"}, - {1152, &IHidSystemServer::SetTouchScreenDefaultConfiguration, "SetTouchScreenDefaultConfiguration"}, - {1153, &IHidSystemServer::GetTouchScreenDefaultConfiguration, "GetTouchScreenDefaultConfiguration"}, - {1154, nullptr, "IsFirmwareAvailableForNotification"}, - {1155, &IHidSystemServer::SetForceHandheldStyleVibration, "SetForceHandheldStyleVibration"}, - {1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"}, - {1157, nullptr, "CancelConnectionTrigger"}, - {1158, nullptr, "SetConnectionLimitForSplay"}, //20.1.0+ - {1159, nullptr, "ClearConnectionLimitForSplay"}, //20.1.0+ - {1200, nullptr, "IsButtonConfigSupported"}, - {1201, nullptr, "IsButtonConfigEmbeddedSupported"}, - {1202, nullptr, "DeleteButtonConfig"}, - {1203, nullptr, "DeleteButtonConfigEmbedded"}, - {1204, nullptr, "SetButtonConfigEnabled"}, - {1205, nullptr, "SetButtonConfigEmbeddedEnabled"}, - {1206, nullptr, "IsButtonConfigEnabled"}, - {1207, nullptr, "IsButtonConfigEmbeddedEnabled"}, - {1208, nullptr, "SetButtonConfigEmbedded"}, - {1209, nullptr, "SetButtonConfigFull"}, - {1210, nullptr, "SetButtonConfigLeft"}, - {1211, nullptr, "SetButtonConfigRight"}, - {1212, nullptr, "GetButtonConfigEmbedded"}, - {1213, nullptr, "GetButtonConfigFull"}, - {1214, nullptr, "GetButtonConfigLeft"}, - {1215, nullptr, "GetButtonConfigRight"}, - {1250, nullptr, "IsCustomButtonConfigSupported"}, - {1251, nullptr, "IsDefaultButtonConfigEmbedded"}, - {1252, nullptr, "IsDefaultButtonConfigFull"}, - {1253, nullptr, "IsDefaultButtonConfigLeft"}, - {1254, nullptr, "IsDefaultButtonConfigRight"}, - {1255, nullptr, "IsButtonConfigStorageEmbeddedEmpty"}, - {1256, nullptr, "IsButtonConfigStorageFullEmpty"}, - {1257, nullptr, "IsButtonConfigStorageLeftEmpty"}, - {1258, nullptr, "IsButtonConfigStorageRightEmpty"}, - {1259, nullptr, "GetButtonConfigStorageEmbeddedDeprecated"}, - {1260, nullptr, "GetButtonConfigStorageFullDeprecated"}, - {1261, nullptr, "GetButtonConfigStorageLeftDeprecated"}, - {1262, nullptr, "GetButtonConfigStorageRightDeprecated"}, - {1263, nullptr, "SetButtonConfigStorageEmbeddedDeprecated"}, - {1264, nullptr, "SetButtonConfigStorageFullDeprecated"}, - {1265, nullptr, "SetButtonConfigStorageLeftDeprecated"}, - {1266, nullptr, "SetButtonConfigStorageRightDeprecated"}, - {1267, nullptr, "DeleteButtonConfigStorageEmbedded"}, - {1268, nullptr, "DeleteButtonConfigStorageFull"}, - {1269, nullptr, "DeleteButtonConfigStorageLeft"}, - {1270, nullptr, "DeleteButtonConfigStorageRight"}, - {1271, &IHidSystemServer::IsUsingCustomButtonConfig, "IsUsingCustomButtonConfig"}, - {1272, &IHidSystemServer::IsAnyCustomButtonConfigEnabled, "IsAnyCustomButtonConfigEnabled"}, - {1273, nullptr, "SetAllCustomButtonConfigEnabled"}, - {1274, nullptr, "SetDefaultButtonConfig"}, - {1275, nullptr, "SetAllDefaultButtonConfig"}, - {1276, nullptr, "SetHidButtonConfigEmbedded"}, - {1277, nullptr, "SetHidButtonConfigFull"}, - {1278, nullptr, "SetHidButtonConfigLeft"}, - {1279, nullptr, "SetHidButtonConfigRight"}, - {1280, nullptr, "GetHidButtonConfigEmbedded"}, - {1281, nullptr, "GetHidButtonConfigFull"}, - {1282, nullptr, "GetHidButtonConfigLeft"}, - {1283, nullptr, "GetHidButtonConfigRight"}, - {1284, nullptr, "GetButtonConfigStorageEmbedded"}, - {1285, nullptr, "GetButtonConfigStorageFull"}, - {1286, nullptr, "GetButtonConfigStorageLeft"}, - {1287, nullptr, "GetButtonConfigStorageRight"}, - {1288, nullptr, "SetButtonConfigStorageEmbedded"}, - {1289, nullptr, "SetButtonConfigStorageFull"}, - {1290, nullptr, "DeleteButtonConfigStorageRight"}, - {1291, nullptr, "DeleteButtonConfigStorageRight"}, - {1308, nullptr, "SetButtonConfigVisible"}, //18.0.0+ - {1309, nullptr, "IsButtonConfigVisible"}, //18.0.0+ - {1320, nullptr, "WakeTouchScreenUp"}, //17.0.0+ - {1321, nullptr, "PutTouchScreenToSleep"}, //17.0.0+ - {1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent"}, //20.0.0+ - {1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings"}, //21.0.0+ - {1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent"}, //21.0.0+ - {1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement"}, //21.0.0+ - {1326, nullptr, "SetTouchScreenOffset"}, //21.0.0+ - {1420, nullptr, "GetAppletResourceProperty"}, //19.0.0+ - {12010, nullptr, "SetButtonConfigLeft"} //11.0.0-17.0.1 - }; - // clang-format on - - RegisterHandlers(functions); joy_detach_event = service_context.CreateEvent("IHidSystemServer::JoyDetachEvent"); acquire_device_registered_event = diff --git a/src/core/hle/service/hid/hid_system_server.h b/src/core/hle/service/hid/hid_system_server.h index 1a4f244d72..e5da7bbdac 100644 --- a/src/core/hle/service/hid/hid_system_server.h +++ b/src/core/hle/service/hid/hid_system_server.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -81,6 +84,252 @@ private: std::shared_ptr GetResourceManager(); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{31, nullptr, "SendKeyboardLockKeyEvent"}, + FunctionInfo{101, nullptr, "AcquireHomeButtonEventHandle"}, + FunctionInfo{111, nullptr, "ActivateHomeButton"}, + FunctionInfo{121, nullptr, "AcquireSleepButtonEventHandle"}, + FunctionInfo{131, nullptr, "ActivateSleepButton"}, + FunctionInfo{141, nullptr, "AcquireCaptureButtonEventHandle"}, + FunctionInfo{151, nullptr, "ActivateCaptureButton"}, + FunctionInfo{161, &IHidSystemServer::GetPlatformConfig, "GetPlatformConfig"}, + FunctionInfo{210, nullptr, "AcquireNfcDeviceUpdateEventHandle"}, + FunctionInfo{211, nullptr, "GetNpadsWithNfc"}, + FunctionInfo{212, nullptr, "AcquireNfcActivateEventHandle"}, + FunctionInfo{213, nullptr, "ActivateNfc"}, + FunctionInfo{214, nullptr, "GetXcdHandleForNpadWithNfc"}, + FunctionInfo{215, nullptr, "IsNfcActivated"}, + FunctionInfo{216, nullptr, "GetAbstractedPadIdForNpadWithNfc"}, + FunctionInfo{217, nullptr, "SetNfcEvent"}, + FunctionInfo{218, nullptr, "GetNfcInfo"}, + FunctionInfo{219, nullptr, "StartNfcDiscovery"}, + FunctionInfo{220, nullptr, "StopNfcDiscovery"}, + FunctionInfo{221, nullptr, "StartNtagRead"}, + FunctionInfo{222, nullptr, "StartNtagWrite"}, + FunctionInfo{223, nullptr, "SendNfcRawData"}, + FunctionInfo{224, nullptr, "RegisterMifareKey"}, + FunctionInfo{225, nullptr, "ClearMifareKey"}, + FunctionInfo{226, nullptr, "StartMifareRead"}, + FunctionInfo{227, nullptr, "StartMifareWrite"}, + FunctionInfo{230, nullptr, "AcquireIrSensorEventHndle" }, + FunctionInfo{231, nullptr, "ActivateIrSensor"}, + FunctionInfo{232, nullptr, "GetIrSensorState"}, + FunctionInfo{233, nullptr, "GetXcdHandleForNpadWihIrSensor" }, + FunctionInfo{234, nullptr, "GetNpadJoyHoldType"}, + FunctionInfo{241, nullptr, "GetDataFormat"}, + FunctionInfo{242, nullptr, "SetDataFormat"}, + FunctionInfo{243, nullptr, "GetMcuState"}, + FunctionInfo{244, nullptr, "SetMcuState"}, + FunctionInfo{245, nullptr, "GetMcuVersionForNfc"}, + FunctionInfo{246, nullptr, "CheckNfcDevicePower"}, + FunctionInfo{247, nullptr, "SetMcuStateImmediate"}, + FunctionInfo{301, nullptr, "ActivateNpadSystem"}, + FunctionInfo{303, &IHidSystemServer::ApplyNpadSystemCommonPolicy, "ApplyNpadSystemCommonPolicy"}, + FunctionInfo{304, &IHidSystemServer::EnableAssigningSingleOnSlSrPress, "EnableAssigningSingleOnSlSrPress"}, + FunctionInfo{305, &IHidSystemServer::DisableAssigningSingleOnSlSrPress, "DisableAssigningSingleOnSlSrPress"}, + FunctionInfo{306, &IHidSystemServer::GetLastActiveNpad, "GetLastActiveNpad"}, + FunctionInfo{307, nullptr, "GetNpadSystemExtStyle"}, + FunctionInfo{308, &IHidSystemServer::ApplyNpadSystemCommonPolicyFull, "ApplyNpadSystemCommonPolicyFull"}, + FunctionInfo{309, &IHidSystemServer::GetNpadFullKeyGripColor, "GetNpadFullKeyGripColor"}, + FunctionInfo{310, &IHidSystemServer::GetMaskedSupportedNpadStyleSet, "GetMaskedSupportedNpadStyleSet"}, + FunctionInfo{311, nullptr, "SetNpadPlayerLedBlinkingDevice"}, + FunctionInfo{312, &IHidSystemServer::SetSupportedNpadStyleSetAll, "SetSupportedNpadStyleSetAll"}, + FunctionInfo{313, &IHidSystemServer::GetNpadCaptureButtonAssignment, "GetNpadCaptureButtonAssignment"}, + FunctionInfo{314, nullptr, "GetAppletFooterUiType"}, + FunctionInfo{315, &IHidSystemServer::GetAppletDetailedUiType, "GetAppletDetailedUiType"}, + FunctionInfo{316, &IHidSystemServer::GetNpadInterfaceType, "GetNpadInterfaceType"}, + FunctionInfo{317, &IHidSystemServer::GetNpadLeftRightInterfaceType, "GetNpadLeftRightInterfaceType"}, + FunctionInfo{318, &IHidSystemServer::HasBattery, "HasBattery"}, + FunctionInfo{319, &IHidSystemServer::HasLeftRightBattery, "HasLeftRightBattery"}, + FunctionInfo{321, &IHidSystemServer::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"}, + FunctionInfo{322, &IHidSystemServer::SetNpadSystemExtStateEnabled, "SetNpadSystemExtStateEnabled"}, + FunctionInfo{323, nullptr, "GetLastActiveUniquePad"}, + FunctionInfo{324, nullptr, "GetUniquePadButtonSet"}, + FunctionInfo{325, nullptr, "GetUniquePadColor"}, + FunctionInfo{326, nullptr, "GetUniquePadAppletDetailedUiType"}, + FunctionInfo{327, nullptr, "GetAbstractedPadIdDataFromNpad"}, + FunctionInfo{328, nullptr, "AttachAbstractedPadToNpad"}, + FunctionInfo{329, nullptr, "DetachAbstractedPadAll"}, + FunctionInfo{330, nullptr, "CheckAbstractedPadConnection"}, + FunctionInfo{332, nullptr, "ConvertAppletDetailedUiTypeFromPlayReportType", MakeVersionGate({19,0,0})}, + FunctionInfo{333, nullptr, "SetNpadUserSpgApplet", MakeVersionGate({20,0,0})}, + FunctionInfo{334, nullptr, "AcquireUniquePadButtonStateChangedEventHandle", MakeVersionGate({20,0,0})}, + FunctionInfo{501, &IHidSystemServer::RegisterAppletResourceUserId, "RegisterAppletResourceUserId"}, + FunctionInfo{502, &IHidSystemServer::UnregisterAppletResourceUserId, "UnregisterAppletResourceUserId"}, + FunctionInfo{503, &IHidSystemServer::EnableAppletToGetInput, "EnableAppletToGetInput"}, + FunctionInfo{504, &IHidSystemServer::SetAruidValidForVibration, "SetAruidValidForVibration"}, + FunctionInfo{505, &IHidSystemServer::EnableAppletToGetSixAxisSensor, "EnableAppletToGetSixAxisSensor"}, + FunctionInfo{506, &IHidSystemServer::EnableAppletToGetPadInput, "EnableAppletToGetPadInput"}, + FunctionInfo{507, &IHidSystemServer::EnableAppletToGetTouchScreen, "EnableAppletToGetTouchScreen"}, + FunctionInfo{510, &IHidSystemServer::SetVibrationMasterVolume, "SetVibrationMasterVolume"}, + FunctionInfo{511, &IHidSystemServer::GetVibrationMasterVolume, "GetVibrationMasterVolume"}, + FunctionInfo{512, &IHidSystemServer::BeginPermitVibrationSession, "BeginPermitVibrationSession"}, + FunctionInfo{513, &IHidSystemServer::EndPermitVibrationSession, "EndPermitVibrationSession"}, + FunctionInfo{514, nullptr, "Unknown514"}, + FunctionInfo{520, nullptr, "EnableHandheldHids"}, + FunctionInfo{521, nullptr, "DisableHandheldHids"}, + FunctionInfo{522, nullptr, "SetJoyConRailEnabled"}, + FunctionInfo{523, &IHidSystemServer::IsJoyConRailEnabled, "IsJoyConRailEnabled"}, + FunctionInfo{524, nullptr, "IsHandheldHidsEnabled"}, + FunctionInfo{525, &IHidSystemServer::IsJoyConAttachedOnAllRail, "IsJoyConAttachedOnAllRail"}, + FunctionInfo{540, nullptr, "AcquirePlayReportControllerUsageUpdateEvent"}, + FunctionInfo{541, nullptr, "GetPlayReportControllerUsages"}, + FunctionInfo{542, nullptr, "AcquirePlayReportRegisteredDeviceUpdateEvent"}, + FunctionInfo{543, nullptr, "GetRegisteredDevicesOld"}, + FunctionInfo{544, &IHidSystemServer::AcquireConnectionTriggerTimeoutEvent, "AcquireConnectionTriggerTimeoutEvent"}, + FunctionInfo{545, nullptr, "SendConnectionTrigger"}, + FunctionInfo{546, &IHidSystemServer::AcquireDeviceRegisteredEventForControllerSupport, "AcquireDeviceRegisteredEventForControllerSupport"}, + FunctionInfo{547, nullptr, "GetAllowedBluetoothLinksCount"}, + FunctionInfo{548, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevices"}, + FunctionInfo{549, nullptr, "GetConnectableRegisteredDevices"}, + FunctionInfo{551, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevicesForControllerSupport", MakeVersionGate({20,0,0})}, //mocked via 548 for Diablo 3 (at least) + FunctionInfo{700, nullptr, "ActivateUniquePad"}, + FunctionInfo{702, &IHidSystemServer::AcquireUniquePadConnectionEventHandle, "AcquireUniquePadConnectionEventHandle"}, + FunctionInfo{703, &IHidSystemServer::GetUniquePadIds, "GetUniquePadIds"}, + FunctionInfo{711, nullptr, "AcquireUniquePadConnectionOnHandheldForNsEventHandle", MakeVersionGate({20,0,0})}, + FunctionInfo{712, nullptr, "GetUniquePadColor12", MakeVersionGate({20,0,0})}, + FunctionInfo{751, &IHidSystemServer::AcquireJoyDetachOnBluetoothOffEventHandle, "AcquireJoyDetachOnBluetoothOffEventHandle"}, + FunctionInfo{800, nullptr, "ListSixAxisSensorHandles"}, + FunctionInfo{801, nullptr, "IsSixAxisSensorUserCalibrationSupported"}, + FunctionInfo{802, nullptr, "ResetSixAxisSensorCalibrationValues"}, + FunctionInfo{803, nullptr, "StartSixAxisSensorUserCalibration"}, + FunctionInfo{804, nullptr, "CancelSixAxisSensorUserCalibration"}, + FunctionInfo{805, nullptr, "GetUniquePadBluetoothAddress"}, + FunctionInfo{806, nullptr, "DisconnectUniquePad"}, + FunctionInfo{807, nullptr, "GetUniquePadType"}, + FunctionInfo{808, nullptr, "GetUniquePadInterface"}, + FunctionInfo{809, nullptr, "GetUniquePadSerialNumber"}, + FunctionInfo{810, nullptr, "GetUniquePadControllerNumber"}, + FunctionInfo{811, nullptr, "GetSixAxisSensorUserCalibrationStage"}, + FunctionInfo{812, nullptr, "GetConsoleUniqueSixAxisSensorHandle"}, + FunctionInfo{813, nullptr, "GetDeviceType"}, + FunctionInfo{821, nullptr, "StartAnalogStickManualCalibration"}, + FunctionInfo{822, nullptr, "RetryCurrentAnalogStickManualCalibrationStage"}, + FunctionInfo{823, nullptr, "CancelAnalogStickManualCalibration"}, + FunctionInfo{824, nullptr, "ResetAnalogStickManualCalibration"}, + FunctionInfo{825, nullptr, "GetAnalogStickState"}, + FunctionInfo{826, nullptr, "GetAnalogStickManualCalibrationStage"}, + FunctionInfo{827, nullptr, "IsAnalogStickButtonPressed"}, + FunctionInfo{828, nullptr, "IsAnalogStickInReleasePosition"}, + FunctionInfo{829, nullptr, "IsAnalogStickInCircumference"}, + FunctionInfo{830, nullptr, "SetNotificationLedPattern"}, + FunctionInfo{831, nullptr, "SetNotificationLedPatternWithTimeout"}, + FunctionInfo{832, nullptr, "PrepareHidsForNotificationWake"}, + FunctionInfo{850, &IHidSystemServer::IsUsbFullKeyControllerEnabled, "IsUsbFullKeyControllerEnabled"}, + FunctionInfo{851, &IHidSystemServer::EnableUsbFullKeyController, "EnableUsbFullKeyController"}, + FunctionInfo{852, nullptr, "IsUsbConnected"}, + FunctionInfo{870, &IHidSystemServer::IsHandheldButtonPressedOnConsoleMode, "IsHandheldButtonPressedOnConsoleMode"}, + FunctionInfo{900, nullptr, "ActivateInputDetector"}, + FunctionInfo{901, nullptr, "NotifyInputDetector"}, + FunctionInfo{1000, &IHidSystemServer::InitializeFirmwareUpdate, "InitializeFirmwareUpdate"}, + FunctionInfo{1001, nullptr, "GetFirmwareVersion"}, + FunctionInfo{1002, nullptr, "GetAvailableFirmwareVersion"}, + FunctionInfo{1003, nullptr, "IsFirmwareUpdateAvailable"}, + FunctionInfo{1004, &IHidSystemServer::CheckFirmwareUpdateRequired, "CheckFirmwareUpdateRequired"}, + FunctionInfo{1005, nullptr, "StartFirmwareUpdate"}, + FunctionInfo{1006, nullptr, "AbortFirmwareUpdate"}, + FunctionInfo{1007, nullptr, "GetFirmwareUpdateState"}, + FunctionInfo{1008, nullptr, "ActivateAudioControl"}, + FunctionInfo{1009, nullptr, "AcquireAudioControlEventHandle"}, + FunctionInfo{1010, nullptr, "GetAudioControlStates"}, + FunctionInfo{1011, nullptr, "DeactivateAudioControl"}, + FunctionInfo{1012, nullptr, "GetFirmwareVersionStringForUserSupportPage"}, + FunctionInfo{1050, nullptr, "IsSixAxisSensorAccurateUserCalibrationSupported"}, + FunctionInfo{1051, nullptr, "StartSixAxisSensorAccurateUserCalibration"}, + FunctionInfo{1052, nullptr, "CancelSixAxisSensorAccurateUserCalibration"}, + FunctionInfo{1053, nullptr, "GetSixAxisSensorAccurateUserCalibrationState"}, + FunctionInfo{1100, nullptr, "GetHidbusSystemServiceObject"}, + FunctionInfo{1120, &IHidSystemServer::SetFirmwareHotfixUpdateSkipEnabled, "SetFirmwareHotfixUpdateSkipEnabled"}, + FunctionInfo{1130, &IHidSystemServer::InitializeUsbFirmwareUpdate, "InitializeUsbFirmwareUpdate"}, + FunctionInfo{1131, &IHidSystemServer::FinalizeUsbFirmwareUpdate, "FinalizeUsbFirmwareUpdate"}, + FunctionInfo{1132, &IHidSystemServer::CheckUsbFirmwareUpdateRequired, "CheckUsbFirmwareUpdateRequired"}, + FunctionInfo{1133, nullptr, "StartUsbFirmwareUpdate"}, + FunctionInfo{1134, nullptr, "GetUsbFirmwareUpdateState"}, + FunctionInfo{1135, &IHidSystemServer::InitializeUsbFirmwareUpdateWithoutMemory, "InitializeUsbFirmwareUpdateWithoutMemory"}, + FunctionInfo{1150, &IHidSystemServer::SetTouchScreenMagnification, "SetTouchScreenMagnification"}, + FunctionInfo{1151, &IHidSystemServer::GetTouchScreenFirmwareVersion, "GetTouchScreenFirmwareVersion"}, + FunctionInfo{1152, &IHidSystemServer::SetTouchScreenDefaultConfiguration, "SetTouchScreenDefaultConfiguration"}, + FunctionInfo{1153, &IHidSystemServer::GetTouchScreenDefaultConfiguration, "GetTouchScreenDefaultConfiguration"}, + FunctionInfo{1154, nullptr, "IsFirmwareAvailableForNotification"}, + FunctionInfo{1155, &IHidSystemServer::SetForceHandheldStyleVibration, "SetForceHandheldStyleVibration"}, + FunctionInfo{1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"}, + FunctionInfo{1157, nullptr, "CancelConnectionTrigger"}, + FunctionInfo{1158, nullptr, "SetConnectionLimitForSplay", MakeVersionGate({20,1,0})}, + FunctionInfo{1159, nullptr, "ClearConnectionLimitForSplay", MakeVersionGate({20,1,0})}, + FunctionInfo{1200, nullptr, "IsButtonConfigSupported"}, + FunctionInfo{1201, nullptr, "IsButtonConfigEmbeddedSupported"}, + FunctionInfo{1202, nullptr, "DeleteButtonConfig"}, + FunctionInfo{1203, nullptr, "DeleteButtonConfigEmbedded"}, + FunctionInfo{1204, nullptr, "SetButtonConfigEnabled"}, + FunctionInfo{1205, nullptr, "SetButtonConfigEmbeddedEnabled"}, + FunctionInfo{1206, nullptr, "IsButtonConfigEnabled"}, + FunctionInfo{1207, nullptr, "IsButtonConfigEmbeddedEnabled"}, + FunctionInfo{1208, nullptr, "SetButtonConfigEmbedded"}, + FunctionInfo{1209, nullptr, "SetButtonConfigFull"}, + FunctionInfo{1210, nullptr, "SetButtonConfigLeft"}, + FunctionInfo{1211, nullptr, "SetButtonConfigRight"}, + FunctionInfo{1212, nullptr, "GetButtonConfigEmbedded"}, + FunctionInfo{1213, nullptr, "GetButtonConfigFull"}, + FunctionInfo{1214, nullptr, "GetButtonConfigLeft"}, + FunctionInfo{1215, nullptr, "GetButtonConfigRight"}, + FunctionInfo{1250, nullptr, "IsCustomButtonConfigSupported"}, + FunctionInfo{1251, nullptr, "IsDefaultButtonConfigEmbedded"}, + FunctionInfo{1252, nullptr, "IsDefaultButtonConfigFull"}, + FunctionInfo{1253, nullptr, "IsDefaultButtonConfigLeft"}, + FunctionInfo{1254, nullptr, "IsDefaultButtonConfigRight"}, + FunctionInfo{1255, nullptr, "IsButtonConfigStorageEmbeddedEmpty"}, + FunctionInfo{1256, nullptr, "IsButtonConfigStorageFullEmpty"}, + FunctionInfo{1257, nullptr, "IsButtonConfigStorageLeftEmpty"}, + FunctionInfo{1258, nullptr, "IsButtonConfigStorageRightEmpty"}, + FunctionInfo{1259, nullptr, "GetButtonConfigStorageEmbeddedDeprecated"}, + FunctionInfo{1260, nullptr, "GetButtonConfigStorageFullDeprecated"}, + FunctionInfo{1261, nullptr, "GetButtonConfigStorageLeftDeprecated"}, + FunctionInfo{1262, nullptr, "GetButtonConfigStorageRightDeprecated"}, + FunctionInfo{1263, nullptr, "SetButtonConfigStorageEmbeddedDeprecated"}, + FunctionInfo{1264, nullptr, "SetButtonConfigStorageFullDeprecated"}, + FunctionInfo{1265, nullptr, "SetButtonConfigStorageLeftDeprecated"}, + FunctionInfo{1266, nullptr, "SetButtonConfigStorageRightDeprecated"}, + FunctionInfo{1267, nullptr, "DeleteButtonConfigStorageEmbedded"}, + FunctionInfo{1268, nullptr, "DeleteButtonConfigStorageFull"}, + FunctionInfo{1269, nullptr, "DeleteButtonConfigStorageLeft"}, + FunctionInfo{1270, nullptr, "DeleteButtonConfigStorageRight"}, + FunctionInfo{1271, &IHidSystemServer::IsUsingCustomButtonConfig, "IsUsingCustomButtonConfig"}, + FunctionInfo{1272, &IHidSystemServer::IsAnyCustomButtonConfigEnabled, "IsAnyCustomButtonConfigEnabled"}, + FunctionInfo{1273, nullptr, "SetAllCustomButtonConfigEnabled"}, + FunctionInfo{1274, nullptr, "SetDefaultButtonConfig"}, + FunctionInfo{1275, nullptr, "SetAllDefaultButtonConfig"}, + FunctionInfo{1276, nullptr, "SetHidButtonConfigEmbedded"}, + FunctionInfo{1277, nullptr, "SetHidButtonConfigFull"}, + FunctionInfo{1278, nullptr, "SetHidButtonConfigLeft"}, + FunctionInfo{1279, nullptr, "SetHidButtonConfigRight"}, + FunctionInfo{1280, nullptr, "GetHidButtonConfigEmbedded"}, + FunctionInfo{1281, nullptr, "GetHidButtonConfigFull"}, + FunctionInfo{1282, nullptr, "GetHidButtonConfigLeft"}, + FunctionInfo{1283, nullptr, "GetHidButtonConfigRight"}, + FunctionInfo{1284, nullptr, "GetButtonConfigStorageEmbedded"}, + FunctionInfo{1285, nullptr, "GetButtonConfigStorageFull"}, + FunctionInfo{1286, nullptr, "GetButtonConfigStorageLeft"}, + FunctionInfo{1287, nullptr, "GetButtonConfigStorageRight"}, + FunctionInfo{1288, nullptr, "SetButtonConfigStorageEmbedded"}, + FunctionInfo{1289, nullptr, "SetButtonConfigStorageFull"}, + FunctionInfo{1290, nullptr, "DeleteButtonConfigStorageRight"}, + FunctionInfo{1291, nullptr, "DeleteButtonConfigStorageRight"}, + FunctionInfo{1308, nullptr, "SetButtonConfigVisible", MakeVersionGate({18,0,0})}, + FunctionInfo{1309, nullptr, "IsButtonConfigVisible", MakeVersionGate({18,0,0})}, + FunctionInfo{1320, nullptr, "WakeTouchScreenUp", MakeVersionGate({17,0,0})}, + FunctionInfo{1321, nullptr, "PutTouchScreenToSleep", MakeVersionGate({17,0,0})}, + FunctionInfo{1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent", MakeVersionGate({20,0,0})}, + FunctionInfo{1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings", MakeVersionGate({21,0,0})}, + FunctionInfo{1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent", MakeVersionGate({21,0,0})}, + FunctionInfo{1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement", MakeVersionGate({21,0,0})}, + FunctionInfo{1326, nullptr, "SetTouchScreenOffset", MakeVersionGate({21,0,0})}, + FunctionInfo{1420, nullptr, "GetAppletResourceProperty", MakeVersionGate({19,0,0})}, + FunctionInfo{12010, nullptr, "SetButtonConfigLeft", MakeVersionGate({11,0,0}, {17,0,1})} + ); + Kernel::KEvent* acquire_connection_trigger_timeout_event; Kernel::KEvent* acquire_device_registered_event; Kernel::KEvent* joy_detach_event; diff --git a/src/core/hle/service/hid/hidbus.cpp b/src/core/hle/service/hid/hidbus.cpp index 70bb5437e3..326cfbf74b 100644 --- a/src/core/hle/service/hid/hidbus.cpp +++ b/src/core/hle/service/hid/hidbus.cpp @@ -26,30 +26,28 @@ namespace Service::HID { // (15ms, 66Hz) constexpr auto hidbus_update_ns = std::chrono::nanoseconds{15 * 1000 * 1000}; +std::optional Hidbus::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, C<&Hidbus::GetBusHandle>, "GetBusHandle"}, + FunctionInfo{2, C<&Hidbus::IsExternalDeviceConnected>, "IsExternalDeviceConnected"}, + FunctionInfo{3, C<&Hidbus::Initialize>, "Initialize"}, + FunctionInfo{4, C<&Hidbus::Finalize>, "Finalize"}, + FunctionInfo{5, C<&Hidbus::EnableExternalDevice>, "EnableExternalDevice"}, + FunctionInfo{6, C<&Hidbus::GetExternalDeviceId>, "GetExternalDeviceId"}, + FunctionInfo{7, C<&Hidbus::SendCommandAsync>, "SendCommandAsync"}, + FunctionInfo{8, C<&Hidbus::GetSendCommandAsynceResult>, "GetSendCommandAsynceResult"}, + FunctionInfo{9, C<&Hidbus::SetEventForSendCommandAsycResult>, "SetEventForSendCommandAsycResult"}, + FunctionInfo{10, C<&Hidbus::GetSharedMemoryHandle>, "GetSharedMemoryHandle"}, + FunctionInfo{11, C<&Hidbus::EnableJoyPollingReceiveMode>, "EnableJoyPollingReceiveMode"}, + FunctionInfo{12, C<&Hidbus::DisableJoyPollingReceiveMode>, "DisableJoyPollingReceiveMode"}, + FunctionInfo{13, nullptr, "GetPollingData"}, + FunctionInfo{14, C<&Hidbus::SetStatusManagerType>, "SetStatusManagerType"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + Hidbus::Hidbus(Core::System& system_) : ServiceFramework{system_, "hidbus"}, service_context{system_, service_name} { - - // clang-format off - static const FunctionInfo functions[] = { - {1, C<&Hidbus::GetBusHandle>, "GetBusHandle"}, - {2, C<&Hidbus::IsExternalDeviceConnected>, "IsExternalDeviceConnected"}, - {3, C<&Hidbus::Initialize>, "Initialize"}, - {4, C<&Hidbus::Finalize>, "Finalize"}, - {5, C<&Hidbus::EnableExternalDevice>, "EnableExternalDevice"}, - {6, C<&Hidbus::GetExternalDeviceId>, "GetExternalDeviceId"}, - {7, C<&Hidbus::SendCommandAsync>, "SendCommandAsync"}, - {8, C<&Hidbus::GetSendCommandAsynceResult>, "GetSendCommandAsynceResult"}, - {9, C<&Hidbus::SetEventForSendCommandAsycResult>, "SetEventForSendCommandAsycResult"}, - {10, C<&Hidbus::GetSharedMemoryHandle>, "GetSharedMemoryHandle"}, - {11, C<&Hidbus::EnableJoyPollingReceiveMode>, "EnableJoyPollingReceiveMode"}, - {12, C<&Hidbus::DisableJoyPollingReceiveMode>, "DisableJoyPollingReceiveMode"}, - {13, nullptr, "GetPollingData"}, - {14, C<&Hidbus::SetStatusManagerType>, "SetStatusManagerType"}, - }; - // clang-format on - - RegisterHandlers(functions); - // Register update callbacks hidbus_update_event = Core::Timing::CreateEvent( "Hidbus::UpdateCallback", diff --git a/src/core/hle/service/hid/hidbus.h b/src/core/hle/service/hid/hidbus.h index af4d956673..9ad097150e 100644 --- a/src/core/hle/service/hid/hidbus.h +++ b/src/core/hle/service/hid/hidbus.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -144,6 +147,8 @@ private: } } + std::optional FindRequest(u32 key) override; + bool is_hidbus_enabled{false}; HidbusStatusManager hidbus_status{}; std::array devices{}; diff --git a/src/core/hle/service/hid/irs.cpp b/src/core/hle/service/hid/irs.cpp index 3d87e6788d..a17395b596 100644 --- a/src/core/hle/service/hid/irs.cpp +++ b/src/core/hle/service/hid/irs.cpp @@ -29,32 +29,32 @@ namespace Service::IRS { -IRS::IRS(Core::System& system_) : ServiceFramework{system_, "irs"} { - // clang-format off - static const FunctionInfo functions[] = { - {302, C<&IRS::ActivateIrsensor>, "ActivateIrsensor"}, - {303, C<&IRS::DeactivateIrsensor>, "DeactivateIrsensor"}, - {304, C<&IRS::GetIrsensorSharedMemoryHandle>, "GetIrsensorSharedMemoryHandle"}, - {305, C<&IRS::StopImageProcessor>, "StopImageProcessor"}, - {306, C<&IRS::RunMomentProcessor>, "RunMomentProcessor"}, - {307, C<&IRS::RunClusteringProcessor>, "RunClusteringProcessor"}, - {308, C<&IRS::RunImageTransferProcessor>, "RunImageTransferProcessor"}, - {309, C<&IRS::GetImageTransferProcessorState>, "GetImageTransferProcessorState"}, - {310, C<&IRS::RunTeraPluginProcessor>, "RunTeraPluginProcessor"}, - {311, C<&IRS::GetNpadIrCameraHandle>, "GetNpadIrCameraHandle"}, - {312, C<&IRS::RunPointingProcessor>, "RunPointingProcessor"}, - {313, C<&IRS::SuspendImageProcessor>, "SuspendImageProcessor"}, - {314, C<&IRS::CheckFirmwareVersion>, "CheckFirmwareVersion"}, - {315, C<&IRS::SetFunctionLevel>, "SetFunctionLevel"}, - {316, C<&IRS::RunImageTransferExProcessor>, "RunImageTransferExProcessor"}, - {317, C<&IRS::RunIrLedProcessor>, "RunIrLedProcessor"}, - {318, C<&IRS::StopImageProcessorAsync>, "StopImageProcessorAsync"}, - {319, C<&IRS::ActivateIrsensorWithFunctionLevel>, "ActivateIrsensorWithFunctionLevel"}, - }; - // clang-format on +std::optional IRS::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{302, C<&IRS::ActivateIrsensor>, "ActivateIrsensor"}, + FunctionInfo{303, C<&IRS::DeactivateIrsensor>, "DeactivateIrsensor"}, + FunctionInfo{304, C<&IRS::GetIrsensorSharedMemoryHandle>, "GetIrsensorSharedMemoryHandle"}, + FunctionInfo{305, C<&IRS::StopImageProcessor>, "StopImageProcessor"}, + FunctionInfo{306, C<&IRS::RunMomentProcessor>, "RunMomentProcessor"}, + FunctionInfo{307, C<&IRS::RunClusteringProcessor>, "RunClusteringProcessor"}, + FunctionInfo{308, C<&IRS::RunImageTransferProcessor>, "RunImageTransferProcessor"}, + FunctionInfo{309, C<&IRS::GetImageTransferProcessorState>, "GetImageTransferProcessorState"}, + FunctionInfo{310, C<&IRS::RunTeraPluginProcessor>, "RunTeraPluginProcessor"}, + FunctionInfo{311, C<&IRS::GetNpadIrCameraHandle>, "GetNpadIrCameraHandle"}, + FunctionInfo{312, C<&IRS::RunPointingProcessor>, "RunPointingProcessor"}, + FunctionInfo{313, C<&IRS::SuspendImageProcessor>, "SuspendImageProcessor"}, + FunctionInfo{314, C<&IRS::CheckFirmwareVersion>, "CheckFirmwareVersion"}, + FunctionInfo{315, C<&IRS::SetFunctionLevel>, "SetFunctionLevel"}, + FunctionInfo{316, C<&IRS::RunImageTransferExProcessor>, "RunImageTransferExProcessor"}, + FunctionInfo{317, C<&IRS::RunIrLedProcessor>, "RunIrLedProcessor"}, + FunctionInfo{318, C<&IRS::StopImageProcessorAsync>, "StopImageProcessorAsync"}, + FunctionInfo{319, C<&IRS::ActivateIrsensorWithFunctionLevel>, "ActivateIrsensorWithFunctionLevel"} + ); + return HandlerTableGenerateWithFind(key, functions); +} +IRS::IRS(Core::System& system_) : ServiceFramework{system_, "irs"} { u8* raw_shared_memory = system.Kernel().GetIrsSharedMem().GetPointer(); - RegisterHandlers(functions); shared_memory = std::construct_at(reinterpret_cast(raw_shared_memory)); npad_device = system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); @@ -369,16 +369,6 @@ Core::IrSensor::DeviceFormat& IRS::GetIrCameraSharedMemoryDeviceEntry( } IRS_SYS::IRS_SYS(Core::System& system_) : ServiceFramework{system_, "irs:sys"} { - // clang-format off - static const FunctionInfo functions[] = { - {500, nullptr, "SetAppletResourceUserId"}, - {501, nullptr, "RegisterAppletResourceUserId"}, - {502, nullptr, "UnregisterAppletResourceUserId"}, - {503, nullptr, "EnableAppletToGetInput"}, - }; - // clang-format on - - RegisterHandlers(functions); } IRS_SYS::~IRS_SYS() = default; diff --git a/src/core/hle/service/hid/irs.h b/src/core/hle/service/hid/irs.h index 58dfee6c36..be81ea75a9 100644 --- a/src/core/hle/service/hid/irs.h +++ b/src/core/hle/service/hid/irs.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -154,6 +157,8 @@ private: return static_cast(*processors[index]); } + std::optional FindRequest(u32 key) override; + Core::HID::EmulatedController* npad_device = nullptr; StatusManager* shared_memory = nullptr; std::array, 9> processors{}; @@ -163,6 +168,16 @@ class IRS_SYS final : public ServiceFramework { public: explicit IRS_SYS(Core::System& system); ~IRS_SYS() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{500, nullptr, "SetAppletResourceUserId"}, + FunctionInfo{501, nullptr, "RegisterAppletResourceUserId"}, + FunctionInfo{502, nullptr, "UnregisterAppletResourceUserId"}, + FunctionInfo{503, nullptr, "EnableAppletToGetInput"} + ); }; } // namespace Service::IRS diff --git a/src/core/hle/service/hid/xcd.cpp b/src/core/hle/service/hid/xcd.cpp index 75cc266ea9..6b8ae7048c 100644 --- a/src/core/hle/service/hid/xcd.cpp +++ b/src/core/hle/service/hid/xcd.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,33 +9,6 @@ namespace Service::HID { XCD_SYS::XCD_SYS(Core::System& system_) : ServiceFramework{system_, "xcd:sys"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetDataFormat"}, - {1, nullptr, "SetDataFormat"}, - {2, nullptr, "GetMcuState"}, - {3, nullptr, "SetMcuState"}, - {4, nullptr, "GetMcuVersionForNfc"}, - {5, nullptr, "CheckNfcDevicePower"}, - {10, nullptr, "SetNfcEvent"}, - {11, nullptr, "GetNfcInfo"}, - {12, nullptr, "StartNfcDiscovery"}, - {13, nullptr, "StopNfcDiscovery"}, - {14, nullptr, "StartNtagRead"}, - {15, nullptr, "StartNtagWrite"}, - {16, nullptr, "SendNfcRawData"}, - {17, nullptr, "RegisterMifareKey"}, - {18, nullptr, "ClearMifareKey"}, - {19, nullptr, "StartMifareRead"}, - {20, nullptr, "StartMifareWrite"}, - {101, nullptr, "GetAwakeTriggerReasonForLeftRail"}, - {102, nullptr, "GetAwakeTriggerReasonForRightRail"}, - {103, nullptr, "GetAwakeTriggerBatteryLevelTransitionForLeftRail"}, - {104, nullptr, "GetAwakeTriggerBatteryLevelTransitionForRightRail"}, - }; - // clang-format on - - RegisterHandlers(functions); } XCD_SYS::~XCD_SYS() = default; diff --git a/src/core/hle/service/hid/xcd.h b/src/core/hle/service/hid/xcd.h index fe0b91b919..af1dd88ef7 100644 --- a/src/core/hle/service/hid/xcd.h +++ b/src/core/hle/service/hid/xcd.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,6 +18,33 @@ class XCD_SYS final : public ServiceFramework { public: explicit XCD_SYS(Core::System& system_); ~XCD_SYS() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetDataFormat"}, + FunctionInfo{1, nullptr, "SetDataFormat"}, + FunctionInfo{2, nullptr, "GetMcuState"}, + FunctionInfo{3, nullptr, "SetMcuState"}, + FunctionInfo{4, nullptr, "GetMcuVersionForNfc"}, + FunctionInfo{5, nullptr, "CheckNfcDevicePower"}, + FunctionInfo{10, nullptr, "SetNfcEvent"}, + FunctionInfo{11, nullptr, "GetNfcInfo"}, + FunctionInfo{12, nullptr, "StartNfcDiscovery"}, + FunctionInfo{13, nullptr, "StopNfcDiscovery"}, + FunctionInfo{14, nullptr, "StartNtagRead"}, + FunctionInfo{15, nullptr, "StartNtagWrite"}, + FunctionInfo{16, nullptr, "SendNfcRawData"}, + FunctionInfo{17, nullptr, "RegisterMifareKey"}, + FunctionInfo{18, nullptr, "ClearMifareKey"}, + FunctionInfo{19, nullptr, "StartMifareRead"}, + FunctionInfo{20, nullptr, "StartMifareWrite"}, + FunctionInfo{101, nullptr, "GetAwakeTriggerReasonForLeftRail"}, + FunctionInfo{102, nullptr, "GetAwakeTriggerReasonForRightRail"}, + FunctionInfo{103, nullptr, "GetAwakeTriggerBatteryLevelTransitionForLeftRail"}, + FunctionInfo{104, nullptr, "GetAwakeTriggerBatteryLevelTransitionForRightRail"} + ); }; } // namespace Service::HID diff --git a/src/core/hle/service/i2c/i2c.cpp b/src/core/hle/service/i2c/i2c.cpp index 0b242768c2..d0a5e29f8c 100644 --- a/src/core/hle/service/i2c/i2c.cpp +++ b/src/core/hle/service/i2c/i2c.cpp @@ -17,25 +17,26 @@ namespace Service::I2C { class I2CSession final : public ServiceFramework { public: - explicit I2CSession(Core::System& system_) - : ServiceFramework{system_, "I2CSession"} - { - static const FunctionInfo functions[] = { - {0, nullptr, "SendOld"}, - {1, nullptr, "ReceiveOld"}, - {2, nullptr, "ExecuteCommandListOld"}, - {10, C<&I2CSession::Send>, "Send"}, - {11, nullptr, "Receive"}, - {12, nullptr, "ExecuteCommandList"}, - {13, nullptr, "SetRetryPolicy"}, - }; - RegisterHandlers(functions); - } + explicit I2CSession(Core::System& system_) : ServiceFramework{system_, "I2CSession"} {} ~I2CSession() override = default; + Result Send(InBuffer in_data, u32 transaction_option) { LOG_WARNING(Service, "(stubbed) topt={}", transaction_option); R_THROW(ResultUnknown); } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "SendOld"}, + FunctionInfo{1, nullptr, "ReceiveOld"}, + FunctionInfo{2, nullptr, "ExecuteCommandListOld"}, + FunctionInfo{10, C<&I2CSession::Send>, "Send"}, + FunctionInfo{11, nullptr, "Receive"}, + FunctionInfo{12, nullptr, "ExecuteCommandList"}, + FunctionInfo{13, nullptr, "SetRetryPolicy"} + ); }; enum class I2CDevice : u32 { @@ -45,19 +46,9 @@ enum class I2CDevice : u32 { class I2C final : public ServiceFramework { public: - explicit I2C(Core::System& system_) - : ServiceFramework{system_, "i2c"} - { - static const FunctionInfo functions[] = { - {0, C<&I2C::OpenSessionForDev>, "OpenSessionForDev"}, - {1, C<&I2C::OpenSession>, "OpenSession"}, - {2, C<&I2C::HasDevice>, "HasDevice"}, - {3, C<&I2C::HasDeviceForDev>, "HasDeviceForDev"}, - {4, C<&I2C::OpenSession2>, "OpenSession2"}, - }; - RegisterHandlers(functions); - } + explicit I2C(Core::System& system_) : ServiceFramework{system_, "i2c"} {} ~I2C() override = default; + Result OpenSessionForDev(OutInterface out_session, s32 bus_idx, u32 slave_address, u32 addressing_mode, u32 speed_mode) { LOG_DEBUG(Service, "(stubbed)"); *out_session = std::make_shared(system); @@ -83,6 +74,17 @@ public: *out_session = std::make_shared(system); R_SUCCEED(); } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&I2C::OpenSessionForDev>, "OpenSessionForDev"}, + FunctionInfo{1, C<&I2C::OpenSession>, "OpenSession"}, + FunctionInfo{2, C<&I2C::HasDevice>, "HasDevice"}, + FunctionInfo{3, C<&I2C::HasDeviceForDev>, "HasDeviceForDev"}, + FunctionInfo{4, C<&I2C::OpenSession2>, "OpenSession2"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/jit/jit.cpp b/src/core/hle/service/jit/jit.cpp index ec3a3a8dcb..9059aaf518 100644 --- a/src/core/hle/service/jit/jit.cpp +++ b/src/core/hle/service/jit/jit.cpp @@ -37,18 +37,6 @@ public: , user_ro{std::move(user_ro_)} , context{process_->GetMemory()} { - - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&IJitEnvironment::GenerateCode>, "GenerateCode"}, - {1, C<&IJitEnvironment::Control>, "Control"}, - {1000, C<&IJitEnvironment::LoadPlugin>, "LoadPlugin"}, - {1001, C<&IJitEnvironment::GetCodeAddress>, "GetCodeAddress"}, - }; - // clang-format on - - RegisterHandlers(functions); - // Identity map user code range into sysmodule context configuration.user_rx_memory.size = user_rx.GetSize(); configuration.user_rx_memory.offset = user_rx.GetAddress(); @@ -59,6 +47,10 @@ public: configuration.sys_ro_memory = configuration.user_ro_memory; } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + ~IJitEnvironment() { user_rx.Finalize(system.Kernel()); user_ro.Finalize(system.Kernel()); @@ -248,6 +240,13 @@ private: return in; } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&IJitEnvironment::GenerateCode>, "GenerateCode"}, + FunctionInfo{1, C<&IJitEnvironment::Control>, "Control"}, + FunctionInfo{1000, C<&IJitEnvironment::LoadPlugin>, "LoadPlugin"}, + FunctionInfo{1001, C<&IJitEnvironment::GetCodeAddress>, "GetCodeAddress"} + ); + Kernel::KScopedAutoObject process; CodeMemory user_rx; CodeMemory user_ro; @@ -258,14 +257,10 @@ private: class JITU final : public ServiceFramework { public: - explicit JITU(Core::System& system_) : ServiceFramework{system_, "jit:u"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&JITU::CreateJitEnvironment>, "CreateJitEnvironment"}, - }; - // clang-format on + explicit JITU(Core::System& system_) : ServiceFramework{system_, "jit:u"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -294,6 +289,10 @@ private: } private: + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&JITU::CreateJitEnvironment>, "CreateJitEnvironment"} + ); + std::mt19937_64 generate_random{}; }; diff --git a/src/core/hle/service/lbl/lbl.cpp b/src/core/hle/service/lbl/lbl.cpp index 68a9bff2df..9b245201ff 100644 --- a/src/core/hle/service/lbl/lbl.cpp +++ b/src/core/hle/service/lbl/lbl.cpp @@ -18,43 +18,10 @@ namespace Service::LBL { class LBL final : public ServiceFramework { public: - explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &LBL::SaveCurrentSetting, "SaveCurrentSetting"}, - {1, &LBL::LoadCurrentSetting, "LoadCurrentSetting"}, - {2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"}, - {3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"}, - {4, nullptr, "ApplyCurrentBrightnessSettingToBacklight"}, - {5, nullptr, "GetBrightnessSettingAppliedToBacklight"}, - {6, &LBL::SwitchBacklightOn, "SwitchBacklightOn"}, - {7, &LBL::SwitchBacklightOff, "SwitchBacklightOff"}, - {8, &LBL::GetBacklightSwitchStatus, "GetBacklightSwitchStatus"}, - {9, &LBL::EnableDimming, "EnableDimming"}, - {10, &LBL::DisableDimming, "DisableDimming"}, - {11, &LBL::IsDimmingEnabled, "IsDimmingEnabled"}, - {12, &LBL::EnableAutoBrightnessControl, "EnableAutoBrightnessControl"}, - {13, &LBL::DisableAutoBrightnessControl, "DisableAutoBrightnessControl"}, - {14, &LBL::IsAutoBrightnessControlEnabled, "IsAutoBrightnessControlEnabled"}, - {15, &LBL::SetAmbientLightSensorValue, "SetAmbientLightSensorValue"}, - {16, &LBL::GetAmbientLightSensorValue, "GetAmbientLightSensorValue"}, - {17, &LBL::SetBrightnessReflectionDelayLevel, "SetBrightnessReflectionDelayLevel"}, - {18, &LBL::GetBrightnessReflectionDelayLevel, "GetBrightnessReflectionDelayLevel"}, - {19, &LBL::SetCurrentBrightnessMapping, "SetCurrentBrightnessMapping"}, - {20, &LBL::GetCurrentBrightnessMapping, "GetCurrentBrightnessMapping"}, - {21, &LBL::SetCurrentAmbientLightSensorMapping, "SetCurrentAmbientLightSensorMapping"}, - {22, &LBL::GetCurrentAmbientLightSensorMapping, "GetCurrentAmbientLightSensorMapping"}, - {23, &LBL::IsAmbientLightSensorAvailable, "IsAmbientLightSensorAvailable"}, - {24, &LBL::SetCurrentBrightnessSettingForVrMode, "SetCurrentBrightnessSettingForVrMode"}, - {25, &LBL::GetCurrentBrightnessSettingForVrMode, "GetCurrentBrightnessSettingForVrMode"}, - {26, &LBL::EnableVrMode, "EnableVrMode"}, - {27, &LBL::DisableVrMode, "DisableVrMode"}, - {28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"}, - {29, &LBL::IsAutoBrightnessControlSupported, "IsAutoBrightnessControlSupported"}, - }; - // clang-format on + explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -335,6 +302,38 @@ private: rb.Push(auto_brightness_supported); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &LBL::SaveCurrentSetting, "SaveCurrentSetting"}, + FunctionInfo{1, &LBL::LoadCurrentSetting, "LoadCurrentSetting"}, + FunctionInfo{2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"}, + FunctionInfo{3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"}, + FunctionInfo{4, nullptr, "ApplyCurrentBrightnessSettingToBacklight"}, + FunctionInfo{5, nullptr, "GetBrightnessSettingAppliedToBacklight"}, + FunctionInfo{6, &LBL::SwitchBacklightOn, "SwitchBacklightOn"}, + FunctionInfo{7, &LBL::SwitchBacklightOff, "SwitchBacklightOff"}, + FunctionInfo{8, &LBL::GetBacklightSwitchStatus, "GetBacklightSwitchStatus"}, + FunctionInfo{9, &LBL::EnableDimming, "EnableDimming"}, + FunctionInfo{10, &LBL::DisableDimming, "DisableDimming"}, + FunctionInfo{11, &LBL::IsDimmingEnabled, "IsDimmingEnabled"}, + FunctionInfo{12, &LBL::EnableAutoBrightnessControl, "EnableAutoBrightnessControl"}, + FunctionInfo{13, &LBL::DisableAutoBrightnessControl, "DisableAutoBrightnessControl"}, + FunctionInfo{14, &LBL::IsAutoBrightnessControlEnabled, "IsAutoBrightnessControlEnabled"}, + FunctionInfo{15, &LBL::SetAmbientLightSensorValue, "SetAmbientLightSensorValue"}, + FunctionInfo{16, &LBL::GetAmbientLightSensorValue, "GetAmbientLightSensorValue"}, + FunctionInfo{17, &LBL::SetBrightnessReflectionDelayLevel, "SetBrightnessReflectionDelayLevel"}, + FunctionInfo{18, &LBL::GetBrightnessReflectionDelayLevel, "GetBrightnessReflectionDelayLevel"}, + FunctionInfo{19, &LBL::SetCurrentBrightnessMapping, "SetCurrentBrightnessMapping"}, + FunctionInfo{20, &LBL::GetCurrentBrightnessMapping, "GetCurrentBrightnessMapping"}, + FunctionInfo{21, &LBL::SetCurrentAmbientLightSensorMapping, "SetCurrentAmbientLightSensorMapping"}, + FunctionInfo{22, &LBL::GetCurrentAmbientLightSensorMapping, "GetCurrentAmbientLightSensorMapping"}, + FunctionInfo{23, &LBL::IsAmbientLightSensorAvailable, "IsAmbientLightSensorAvailable"}, + FunctionInfo{24, &LBL::SetCurrentBrightnessSettingForVrMode, "SetCurrentBrightnessSettingForVrMode"}, + FunctionInfo{25, &LBL::GetCurrentBrightnessSettingForVrMode, "GetCurrentBrightnessSettingForVrMode"}, + FunctionInfo{26, &LBL::EnableVrMode, "EnableVrMode"}, + FunctionInfo{27, &LBL::DisableVrMode, "DisableVrMode"}, + FunctionInfo{28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"}, + FunctionInfo{29, &LBL::IsAutoBrightnessControlSupported, "IsAutoBrightnessControlSupported"} + ); bool vr_mode_enabled = false; float current_brightness = 1.0f; float ambient_light_value = 0.0f; diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp index 1a0165fd2e..838fe85f79 100644 --- a/src/core/hle/service/ldn/ldn.cpp +++ b/src/core/hle/service/ldn/ldn.cpp @@ -9,7 +9,6 @@ #include "core/hle/service/ldn/ldn.h" #include "core/hle/service/ldn/monitor_service.h" #include "core/hle/service/ldn/sf_monitor_service.h" -#include "core/hle/service/ldn/sf_service.h" #include "core/hle/service/ldn/sf_service_monitor.h" #include "core/hle/service/ldn/system_local_communication_service.h" #include "core/hle/service/ldn/user_local_communication_service.h" @@ -19,14 +18,10 @@ namespace Service::LDN { class IClientProcessMonitor final : public ServiceFramework { public: - explicit IClientProcessMonitor(Core::System& system_) - : ServiceFramework{system_, "IClientProcessMonitor"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit IClientProcessMonitor(Core::System& system_) : ServiceFramework{system_, "IClientProcessMonitor"} {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } ~IClientProcessMonitor() override = default; private: @@ -34,19 +29,19 @@ private: LOG_WARNING(Service_LDN, "(STUBBED) called"); R_SUCCEED(); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"} + ); }; class IMonitorServiceCreator final : public ServiceFramework { public: - explicit IMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:m"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&IMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"} - }; - // clang-format on - RegisterHandlers(functions); - } + explicit IMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:m"} {} + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } private: Result CreateMonitorService(OutInterface out_interface) { LOG_DEBUG(Service_LDN, "called"); @@ -54,21 +49,19 @@ private: *out_interface = std::make_shared(system); R_SUCCEED(); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&IMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"} + ); }; class ISystemServiceCreator final : public ServiceFramework { public: - explicit ISystemServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:s"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"}, - {1, C<&ISystemServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+ - }; - // clang-format on + explicit ISystemServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:s"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } - private: Result CreateSystemLocalCommunicationService( OutInterface out_interface) { @@ -85,21 +78,20 @@ private: *out_interface = std::make_shared(system); R_SUCCEED(); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"}, + FunctionInfo{1, C<&ISystemServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor", MakeVersionGate({18,0,0})} + ); }; class IUserServiceCreator final : public ServiceFramework { public: - explicit IUserServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:u"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"}, - {1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+ - }; - // clang-format on + explicit IUserServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:u"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } - private: Result CreateUserLocalCommunicationService( OutInterface out_interface) { @@ -116,22 +108,50 @@ private: *out_interface = std::make_shared(system); R_SUCCEED(); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"}, + FunctionInfo{1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor", MakeVersionGate({18,0,0})} + ); +}; + +class ISfService final : public ServiceFramework { +public: + explicit ISfService(Core::System& system_) : ServiceFramework{system_, "ISfService"} {} + ~ISfService() override = default; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Initialize"}, + FunctionInfo{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"}, + FunctionInfo{264, nullptr, "GetNetworkInterfaceLastError"}, + FunctionInfo{272, nullptr, "GetRole"}, + FunctionInfo{280, nullptr, "GetAdvertiseData"}, + FunctionInfo{288, nullptr, "GetGroupInfo"}, + FunctionInfo{296, nullptr, "GetGroupInfo2"}, + FunctionInfo{304, nullptr, "GetGroupOwner"}, + FunctionInfo{312, nullptr, "GetIpConfig"}, + FunctionInfo{320, nullptr, "GetLinkLevel"}, + FunctionInfo{512, nullptr, "Scan"}, + FunctionInfo{768, nullptr, "CreateGroup"}, + FunctionInfo{776, nullptr, "DestroyGroup"}, + FunctionInfo{784, nullptr, "SetAdvertiseData"}, + FunctionInfo{1536, nullptr, "SendToOtherGroup"}, + FunctionInfo{1544, nullptr, "RecvFromOtherGroup"}, + FunctionInfo{1552, nullptr, "AddAcceptableGroupId"}, + FunctionInfo{1560, nullptr, "ClearAcceptableGroupId"} + ); }; class ISfServiceCreator final : public ServiceFramework { public: - explicit ISfServiceCreator(Core::System& system_, bool is_system_, const char* name_) - : ServiceFramework{system_, name_}, is_system{is_system_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&ISfServiceCreator::CreateNetworkService>, "CreateNetworkService"}, - {8, C<&ISfServiceCreator::CreateNetworkServiceMonitor>, "CreateNetworkServiceMonitor"}, - }; - // clang-format on + explicit ISfServiceCreator(Core::System& system_, bool is_system_, const char* name_) : ServiceFramework{system_, name_}, is_system{is_system_} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } - private: Result CreateNetworkService(OutInterface out_interface, u32 input, u64 reserved_input) { @@ -150,21 +170,20 @@ private: R_SUCCEED(); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&ISfServiceCreator::CreateNetworkService>, "CreateNetworkService"}, + FunctionInfo{8, C<&ISfServiceCreator::CreateNetworkServiceMonitor>, "CreateNetworkServiceMonitor"} + ); bool is_system{}; }; class ISfMonitorServiceCreator final : public ServiceFramework { public: - explicit ISfMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "lp2p:m"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&ISfMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"}, - }; - // clang-format on + explicit ISfMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "lp2p:m"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } - private: Result CreateMonitorService(OutInterface out_interface, u64 reserved_input) { LOG_INFO(Service_LDN, "called, reserved_input={}", reserved_input); @@ -172,6 +191,10 @@ private: *out_interface = std::make_shared(system); R_SUCCEED(); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&ISfMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"} + ); }; void LoopProcess(Core::System& system) { @@ -181,12 +204,9 @@ void LoopProcess(Core::System& system) { server_manager->RegisterNamedService("ldn:s", std::make_shared(system)); server_manager->RegisterNamedService("ldn:u", std::make_shared(system)); - server_manager->RegisterNamedService( - "lp2p:app", std::make_shared(system, false, "lp2p:app")); - server_manager->RegisterNamedService( - "lp2p:sys", std::make_shared(system, true, "lp2p:sys")); - server_manager->RegisterNamedService("lp2p:m", - std::make_shared(system)); + server_manager->RegisterNamedService("lp2p:app", std::make_shared(system, false, "lp2p:app")); + server_manager->RegisterNamedService("lp2p:sys", std::make_shared(system, true, "lp2p:sys")); + server_manager->RegisterNamedService("lp2p:m", std::make_shared(system)); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/ldn/monitor_service.cpp b/src/core/hle/service/ldn/monitor_service.cpp index ea6ac4d5dd..6a60b0b3d8 100644 --- a/src/core/hle/service/ldn/monitor_service.cpp +++ b/src/core/hle/service/ldn/monitor_service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -7,22 +10,22 @@ namespace Service::LDN { +std::optional IMonitorService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&IMonitorService::GetStateForMonitor>, "GetStateForMonitor"}, + FunctionInfo{1, nullptr, "GetNetworkInfoForMonitor"}, + FunctionInfo{2, nullptr, "GetIpv4AddressForMonitor"}, + FunctionInfo{3, nullptr, "GetDisconnectReasonForMonitor"}, + FunctionInfo{4, nullptr, "GetSecurityParameterForMonitor"}, + FunctionInfo{5, nullptr, "GetNetworkConfigForMonitor"}, + FunctionInfo{100, C<&IMonitorService::InitializeMonitor>, "InitializeMonitor"}, + FunctionInfo{101, C<&IMonitorService::FinalizeMonitor>, "FinalizeMonitor"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IMonitorService::IMonitorService(Core::System& system_) : ServiceFramework{system_, "IMonitorService"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&IMonitorService::GetStateForMonitor>, "GetStateForMonitor"}, - {1, nullptr, "GetNetworkInfoForMonitor"}, - {2, nullptr, "GetIpv4AddressForMonitor"}, - {3, nullptr, "GetDisconnectReasonForMonitor"}, - {4, nullptr, "GetSecurityParameterForMonitor"}, - {5, nullptr, "GetNetworkConfigForMonitor"}, - {100, C<&IMonitorService::InitializeMonitor>, "InitializeMonitor"}, - {101, C<&IMonitorService::FinalizeMonitor>, "FinalizeMonitor"}, - }; - // clang-format on - - RegisterHandlers(functions); } IMonitorService::~IMonitorService() = default; diff --git a/src/core/hle/service/ldn/monitor_service.h b/src/core/hle/service/ldn/monitor_service.h index e663145b4f..9c1acd0a1e 100644 --- a/src/core/hle/service/ldn/monitor_service.h +++ b/src/core/hle/service/ldn/monitor_service.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -23,6 +26,7 @@ private: Result InitializeMonitor(); Result FinalizeMonitor(); + std::optional FindRequest(u32 key) override; State state{State::None}; }; diff --git a/src/core/hle/service/ldn/sf_monitor_service.cpp b/src/core/hle/service/ldn/sf_monitor_service.cpp index 9e6736ff2c..ebe06b2059 100644 --- a/src/core/hle/service/ldn/sf_monitor_service.cpp +++ b/src/core/hle/service/ldn/sf_monitor_service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -7,17 +10,17 @@ namespace Service::LDN { +std::optional ISfMonitorService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&ISfMonitorService::Initialize>, "Initialize"}, + FunctionInfo{288, C<&ISfMonitorService::GetGroupInfo>, "GetGroupInfo"}, + FunctionInfo{320, nullptr, "GetLinkLevel"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + ISfMonitorService::ISfMonitorService(Core::System& system_) : ServiceFramework{system_, "ISfMonitorService"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&ISfMonitorService::Initialize>, "Initialize"}, - {288, C<&ISfMonitorService::GetGroupInfo>, "GetGroupInfo"}, - {320, nullptr, "GetLinkLevel"}, - }; - // clang-format on - - RegisterHandlers(functions); } ISfMonitorService::~ISfMonitorService() = default; diff --git a/src/core/hle/service/ldn/sf_monitor_service.h b/src/core/hle/service/ldn/sf_monitor_service.h index d021152010..09ca16727d 100644 --- a/src/core/hle/service/ldn/sf_monitor_service.h +++ b/src/core/hle/service/ldn/sf_monitor_service.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -21,6 +24,7 @@ public: private: Result Initialize(Out out_value); Result GetGroupInfo(OutLargeData out_group_info); + std::optional FindRequest(u32 key) override; }; } // namespace Service::LDN diff --git a/src/core/hle/service/ldn/sf_service.cpp b/src/core/hle/service/ldn/sf_service.cpp deleted file mode 100644 index 61cabe219a..0000000000 --- a/src/core/hle/service/ldn/sf_service.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "core/hle/service/ldn/sf_service.h" - -namespace Service::LDN { - -ISfService::ISfService(Core::System& system_) : ServiceFramework{system_, "ISfService"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Initialize"}, - {256, nullptr, "AttachNetworkInterfaceStateChangeEvent"}, - {264, nullptr, "GetNetworkInterfaceLastError"}, - {272, nullptr, "GetRole"}, - {280, nullptr, "GetAdvertiseData"}, - {288, nullptr, "GetGroupInfo"}, - {296, nullptr, "GetGroupInfo2"}, - {304, nullptr, "GetGroupOwner"}, - {312, nullptr, "GetIpConfig"}, - {320, nullptr, "GetLinkLevel"}, - {512, nullptr, "Scan"}, - {768, nullptr, "CreateGroup"}, - {776, nullptr, "DestroyGroup"}, - {784, nullptr, "SetAdvertiseData"}, - {1536, nullptr, "SendToOtherGroup"}, - {1544, nullptr, "RecvFromOtherGroup"}, - {1552, nullptr, "AddAcceptableGroupId"}, - {1560, nullptr, "ClearAcceptableGroupId"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -ISfService::~ISfService() = default; - -} // namespace Service::LDN diff --git a/src/core/hle/service/ldn/sf_service.h b/src/core/hle/service/ldn/sf_service.h deleted file mode 100644 index 05534b5677..0000000000 --- a/src/core/hle/service/ldn/sf_service.h +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Core { -class System; -} - -namespace Service::LDN { - -class ISfService final : public ServiceFramework { -public: - explicit ISfService(Core::System& system_); - ~ISfService() override; -}; - -} // namespace Service::LDN diff --git a/src/core/hle/service/ldn/sf_service_monitor.cpp b/src/core/hle/service/ldn/sf_service_monitor.cpp index 9a1cde6881..574ba82a0b 100644 --- a/src/core/hle/service/ldn/sf_service_monitor.cpp +++ b/src/core/hle/service/ldn/sf_service_monitor.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -7,27 +10,27 @@ namespace Service::LDN { +std::optional ISfServiceMonitor::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&ISfServiceMonitor::Initialize>, "Initialize"}, + FunctionInfo{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"}, + FunctionInfo{264, nullptr, "GetNetworkInterfaceLastError"}, + FunctionInfo{272, nullptr, "GetRole"}, + FunctionInfo{280, nullptr, "GetAdvertiseData"}, + FunctionInfo{281, nullptr, "GetAdvertiseData2"}, + FunctionInfo{288, C<&ISfServiceMonitor::GetGroupInfo>, "GetGroupInfo"}, + FunctionInfo{296, nullptr, "GetGroupInfo2"}, + FunctionInfo{304, nullptr, "GetGroupOwner"}, + FunctionInfo{312, nullptr, "GetIpConfig"}, + FunctionInfo{320, nullptr, "GetLinkLevel"}, + FunctionInfo{328, nullptr, "AttachJoinEvent"}, + FunctionInfo{336, nullptr, "GetMembers"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + ISfServiceMonitor::ISfServiceMonitor(Core::System& system_) : ServiceFramework{system_, "ISfServiceMonitor"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&ISfServiceMonitor::Initialize>, "Initialize"}, - {256, nullptr, "AttachNetworkInterfaceStateChangeEvent"}, - {264, nullptr, "GetNetworkInterfaceLastError"}, - {272, nullptr, "GetRole"}, - {280, nullptr, "GetAdvertiseData"}, - {281, nullptr, "GetAdvertiseData2"}, - {288, C<&ISfServiceMonitor::GetGroupInfo>, "GetGroupInfo"}, - {296, nullptr, "GetGroupInfo2"}, - {304, nullptr, "GetGroupOwner"}, - {312, nullptr, "GetIpConfig"}, - {320, nullptr, "GetLinkLevel"}, - {328, nullptr, "AttachJoinEvent"}, - {336, nullptr, "GetMembers"}, - }; - // clang-format on - - RegisterHandlers(functions); } ISfServiceMonitor::~ISfServiceMonitor() = default; diff --git a/src/core/hle/service/ldn/sf_service_monitor.h b/src/core/hle/service/ldn/sf_service_monitor.h index 924cc17594..5e5e64ae6c 100644 --- a/src/core/hle/service/ldn/sf_service_monitor.h +++ b/src/core/hle/service/ldn/sf_service_monitor.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -20,8 +23,8 @@ public: private: Result Initialize(Out out_value); - Result GetGroupInfo(OutLargeData out_group_info, - GroupInfo in_group_info); + Result GetGroupInfo(OutLargeData out_group_info, GroupInfo in_group_info); + std::optional FindRequest(u32 key) override; }; } // namespace Service::LDN diff --git a/src/core/hle/service/ldn/system_local_communication_service.cpp b/src/core/hle/service/ldn/system_local_communication_service.cpp index 7b52223cdc..9d3d49aac4 100644 --- a/src/core/hle/service/ldn/system_local_communication_service.cpp +++ b/src/core/hle/service/ldn/system_local_communication_service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -6,44 +9,44 @@ namespace Service::LDN { +std::optional ISystemLocalCommunicationService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetState"}, + FunctionInfo{1, nullptr, "GetNetworkInfo"}, + FunctionInfo{2, nullptr, "GetIpv4Address"}, + FunctionInfo{3, nullptr, "GetDisconnectReason"}, + FunctionInfo{4, nullptr, "GetSecurityParameter"}, + FunctionInfo{5, nullptr, "GetNetworkConfig"}, + FunctionInfo{100, nullptr, "AttachStateChangeEvent"}, + FunctionInfo{101, nullptr, "GetNetworkInfoLatestUpdate"}, + FunctionInfo{102, nullptr, "Scan"}, + FunctionInfo{103, nullptr, "ScanPrivate"}, + FunctionInfo{104, nullptr, "SetWirelessControllerRestriction"}, + FunctionInfo{200, nullptr, "OpenAccessPoint"}, + FunctionInfo{201, nullptr, "CloseAccessPoint"}, + FunctionInfo{202, nullptr, "CreateNetwork"}, + FunctionInfo{203, nullptr, "CreateNetworkPrivate"}, + FunctionInfo{204, nullptr, "DestroyNetwork"}, + FunctionInfo{205, nullptr, "Reject"}, + FunctionInfo{206, nullptr, "SetAdvertiseData"}, + FunctionInfo{207, nullptr, "SetStationAcceptPolicy"}, + FunctionInfo{208, nullptr, "AddAcceptFilterEntry"}, + FunctionInfo{209, nullptr, "ClearAcceptFilter"}, + FunctionInfo{300, nullptr, "OpenStation"}, + FunctionInfo{301, nullptr, "CloseStation"}, + FunctionInfo{302, nullptr, "Connect"}, + FunctionInfo{303, nullptr, "ConnectPrivate"}, + FunctionInfo{304, nullptr, "Disconnect"}, + FunctionInfo{400, nullptr, "InitializeSystem"}, + FunctionInfo{401, nullptr, "FinalizeSystem"}, + FunctionInfo{402, nullptr, "SetOperationMode"}, + FunctionInfo{403, C<&ISystemLocalCommunicationService::InitializeSystem2>, "InitializeSystem2"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + ISystemLocalCommunicationService::ISystemLocalCommunicationService(Core::System& system_) : ServiceFramework{system_, "ISystemLocalCommunicationService"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetState"}, - {1, nullptr, "GetNetworkInfo"}, - {2, nullptr, "GetIpv4Address"}, - {3, nullptr, "GetDisconnectReason"}, - {4, nullptr, "GetSecurityParameter"}, - {5, nullptr, "GetNetworkConfig"}, - {100, nullptr, "AttachStateChangeEvent"}, - {101, nullptr, "GetNetworkInfoLatestUpdate"}, - {102, nullptr, "Scan"}, - {103, nullptr, "ScanPrivate"}, - {104, nullptr, "SetWirelessControllerRestriction"}, - {200, nullptr, "OpenAccessPoint"}, - {201, nullptr, "CloseAccessPoint"}, - {202, nullptr, "CreateNetwork"}, - {203, nullptr, "CreateNetworkPrivate"}, - {204, nullptr, "DestroyNetwork"}, - {205, nullptr, "Reject"}, - {206, nullptr, "SetAdvertiseData"}, - {207, nullptr, "SetStationAcceptPolicy"}, - {208, nullptr, "AddAcceptFilterEntry"}, - {209, nullptr, "ClearAcceptFilter"}, - {300, nullptr, "OpenStation"}, - {301, nullptr, "CloseStation"}, - {302, nullptr, "Connect"}, - {303, nullptr, "ConnectPrivate"}, - {304, nullptr, "Disconnect"}, - {400, nullptr, "InitializeSystem"}, - {401, nullptr, "FinalizeSystem"}, - {402, nullptr, "SetOperationMode"}, - {403, C<&ISystemLocalCommunicationService::InitializeSystem2>, "InitializeSystem2"}, - }; - // clang-format on - - RegisterHandlers(functions); } ISystemLocalCommunicationService::~ISystemLocalCommunicationService() = default; diff --git a/src/core/hle/service/ldn/system_local_communication_service.h b/src/core/hle/service/ldn/system_local_communication_service.h index a02b097ea7..c7e937e3a2 100644 --- a/src/core/hle/service/ldn/system_local_communication_service.h +++ b/src/core/hle/service/ldn/system_local_communication_service.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -20,6 +23,7 @@ public: private: Result InitializeSystem2(); + std::optional FindRequest(u32 key) override; }; } // namespace Service::LDN diff --git a/src/core/hle/service/ldn/user_local_communication_service.cpp b/src/core/hle/service/ldn/user_local_communication_service.cpp index 572aea6314..26a742bf0b 100644 --- a/src/core/hle/service/ldn/user_local_communication_service.cpp +++ b/src/core/hle/service/ldn/user_local_communication_service.cpp @@ -21,46 +21,46 @@ namespace Service::LDN { +std::optional IUserLocalCommunicationService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IUserLocalCommunicationService::GetState>, "GetState"}, + FunctionInfo{1, D<&IUserLocalCommunicationService::GetNetworkInfo>, "GetNetworkInfo"}, + FunctionInfo{2, D<&IUserLocalCommunicationService::GetIpv4Address>, "GetIpv4Address"}, + FunctionInfo{3, D<&IUserLocalCommunicationService::GetDisconnectReason>, "GetDisconnectReason"}, + FunctionInfo{4, D<&IUserLocalCommunicationService::GetSecurityParameter>, "GetSecurityParameter"}, + FunctionInfo{5, D<&IUserLocalCommunicationService::GetNetworkConfig>, "GetNetworkConfig"}, + FunctionInfo{100, D<&IUserLocalCommunicationService::AttachStateChangeEvent>, "AttachStateChangeEvent"}, + FunctionInfo{101, D<&IUserLocalCommunicationService::GetNetworkInfoLatestUpdate>, "GetNetworkInfoLatestUpdate"}, + FunctionInfo{102, D<&IUserLocalCommunicationService::Scan>, "Scan"}, + FunctionInfo{103, D<&IUserLocalCommunicationService::ScanPrivate>, "ScanPrivate"}, + FunctionInfo{104, D<&IUserLocalCommunicationService::SetWirelessControllerRestriction>, "SetWirelessControllerRestriction"}, + FunctionInfo{106, D<&IUserLocalCommunicationService::SetProtocol>, "SetProtocol" }, + FunctionInfo{200, D<&IUserLocalCommunicationService::OpenAccessPoint>, "OpenAccessPoint"}, + FunctionInfo{201, D<&IUserLocalCommunicationService::CloseAccessPoint>, "CloseAccessPoint"}, + FunctionInfo{202, D<&IUserLocalCommunicationService::CreateNetwork>, "CreateNetwork"}, + FunctionInfo{203, D<&IUserLocalCommunicationService::CreateNetworkPrivate>, "CreateNetworkPrivate"}, + FunctionInfo{204, D<&IUserLocalCommunicationService::DestroyNetwork>, "DestroyNetwork"}, + FunctionInfo{205, nullptr, "Reject"}, + FunctionInfo{206, D<&IUserLocalCommunicationService::SetAdvertiseData>, "SetAdvertiseData"}, + FunctionInfo{207, D<&IUserLocalCommunicationService::SetStationAcceptPolicy>, "SetStationAcceptPolicy"}, + FunctionInfo{208, D<&IUserLocalCommunicationService::AddAcceptFilterEntry>, "AddAcceptFilterEntry"}, + FunctionInfo{209, nullptr, "ClearAcceptFilter"}, + FunctionInfo{300, D<&IUserLocalCommunicationService::OpenStation>, "OpenStation"}, + FunctionInfo{301, D<&IUserLocalCommunicationService::CloseStation>, "CloseStation"}, + FunctionInfo{302, D<&IUserLocalCommunicationService::Connect>, "Connect"}, + FunctionInfo{303, nullptr, "ConnectPrivate"}, + FunctionInfo{304, D<&IUserLocalCommunicationService::Disconnect>, "Disconnect"}, + FunctionInfo{400, D<&IUserLocalCommunicationService::Initialize>, "Initialize"}, + FunctionInfo{401, D<&IUserLocalCommunicationService::Finalize>, "Finalize"}, + FunctionInfo{402, D<&IUserLocalCommunicationService::Initialize2>, "Initialize2"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IUserLocalCommunicationService::IUserLocalCommunicationService(Core::System& system_) : ServiceFramework{system_, "IUserLocalCommunicationService"}, service_context{system, "IUserLocalCommunicationService"}, lan_discovery{} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IUserLocalCommunicationService::GetState>, "GetState"}, - {1, D<&IUserLocalCommunicationService::GetNetworkInfo>, "GetNetworkInfo"}, - {2, D<&IUserLocalCommunicationService::GetIpv4Address>, "GetIpv4Address"}, - {3, D<&IUserLocalCommunicationService::GetDisconnectReason>, "GetDisconnectReason"}, - {4, D<&IUserLocalCommunicationService::GetSecurityParameter>, "GetSecurityParameter"}, - {5, D<&IUserLocalCommunicationService::GetNetworkConfig>, "GetNetworkConfig"}, - {100, D<&IUserLocalCommunicationService::AttachStateChangeEvent>, "AttachStateChangeEvent"}, - {101, D<&IUserLocalCommunicationService::GetNetworkInfoLatestUpdate>, "GetNetworkInfoLatestUpdate"}, - {102, D<&IUserLocalCommunicationService::Scan>, "Scan"}, - {103, D<&IUserLocalCommunicationService::ScanPrivate>, "ScanPrivate"}, - {104, D<&IUserLocalCommunicationService::SetWirelessControllerRestriction>, "SetWirelessControllerRestriction"}, - { 106, D<&IUserLocalCommunicationService::SetProtocol>, "SetProtocol" }, - {200, D<&IUserLocalCommunicationService::OpenAccessPoint>, "OpenAccessPoint"}, - {201, D<&IUserLocalCommunicationService::CloseAccessPoint>, "CloseAccessPoint"}, - {202, D<&IUserLocalCommunicationService::CreateNetwork>, "CreateNetwork"}, - {203, D<&IUserLocalCommunicationService::CreateNetworkPrivate>, "CreateNetworkPrivate"}, - {204, D<&IUserLocalCommunicationService::DestroyNetwork>, "DestroyNetwork"}, - {205, nullptr, "Reject"}, - {206, D<&IUserLocalCommunicationService::SetAdvertiseData>, "SetAdvertiseData"}, - {207, D<&IUserLocalCommunicationService::SetStationAcceptPolicy>, "SetStationAcceptPolicy"}, - {208, D<&IUserLocalCommunicationService::AddAcceptFilterEntry>, "AddAcceptFilterEntry"}, - {209, nullptr, "ClearAcceptFilter"}, - {300, D<&IUserLocalCommunicationService::OpenStation>, "OpenStation"}, - {301, D<&IUserLocalCommunicationService::CloseStation>, "CloseStation"}, - {302, D<&IUserLocalCommunicationService::Connect>, "Connect"}, - {303, nullptr, "ConnectPrivate"}, - {304, D<&IUserLocalCommunicationService::Disconnect>, "Disconnect"}, - {400, D<&IUserLocalCommunicationService::Initialize>, "Initialize"}, - {401, D<&IUserLocalCommunicationService::Finalize>, "Finalize"}, - {402, D<&IUserLocalCommunicationService::Initialize2>, "Initialize2"}, - }; - // clang-format on - - RegisterHandlers(functions); state_change_event = service_context.CreateEvent("IUserLocalCommunicationService:StateChangeEvent"); diff --git a/src/core/hle/service/ldn/user_local_communication_service.h b/src/core/hle/service/ldn/user_local_communication_service.h index 1e725ed531..6f832b7a23 100644 --- a/src/core/hle/service/ldn/user_local_communication_service.h +++ b/src/core/hle/service/ldn/user_local_communication_service.h @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once @@ -89,6 +89,7 @@ private: /// Callback to parse and handle a received LDN packet. void OnLDNPacketReceived(const Network::LDNPacket& packet); void OnEventFired(); + std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext service_context; Kernel::KEvent* state_change_event; diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp index db4d51b49d..25ecc58fa4 100644 --- a/src/core/hle/service/ldr/ldr.cpp +++ b/src/core/hle/service/ldr/ldr.cpp @@ -12,47 +12,44 @@ namespace Service::LDR { class DebugMonitor final : public ServiceFramework { public: - explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "ldr:dmnt"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "SetProgramArgument"}, - {1, nullptr, "FlushArguments"}, - {2, nullptr, "GetProcessModuleInfo"}, - }; - // clang-format on + explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "ldr:dmnt"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "SetProgramArgument"}, + FunctionInfo{1, nullptr, "FlushArguments"}, + FunctionInfo{2, nullptr, "GetProcessModuleInfo"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class ProcessManager final : public ServiceFramework { public: - explicit ProcessManager(Core::System& system_) : ServiceFramework{system_, "ldr:pm"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "CreateProcess"}, - {1, nullptr, "GetProgramInfo"}, - {2, nullptr, "PinProgram"}, - {3, nullptr, "UnpinProgram"}, - {4, nullptr, "SetEnabledProgramVerification"}, - }; - // clang-format on + explicit ProcessManager(Core::System& system_) : ServiceFramework{system_, "ldr:pm"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "CreateProcess"}, + FunctionInfo{1, nullptr, "GetProgramInfo"}, + FunctionInfo{2, nullptr, "PinProgram"}, + FunctionInfo{3, nullptr, "UnpinProgram"}, + FunctionInfo{4, nullptr, "SetEnabledProgramVerification"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class Shell final : public ServiceFramework { public: - explicit Shell(Core::System& system_) : ServiceFramework{system_, "ldr:shel"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "SetProgramArgument"}, - {1, nullptr, "FlushArguments"}, - }; - // clang-format on + explicit Shell(Core::System& system_) : ServiceFramework{system_, "ldr:shel"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "SetProgramArgument"}, + FunctionInfo{1, nullptr, "FlushArguments"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp index d631a6dd80..be8cdf9aa9 100644 --- a/src/core/hle/service/lm/lm.cpp +++ b/src/core/hle/service/lm/lm.cpp @@ -87,16 +87,7 @@ DECLARE_ENUM_FLAG_OPERATORS(LogPacketFlags); class ILogger final : public ServiceFramework { public: - explicit ILogger(Core::System& system_) : ServiceFramework{system_, "ILogger"} { - static const FunctionInfo functions[] = { - {0, &ILogger::Log, "Log"}, - {1, &ILogger::SetDestination, "SetDestination"}, - {2, nullptr, "TransmitHashedLog"}, //20.0.0+ - {3, nullptr, "DevNotify"}, //20.0.0+ - }; - RegisterHandlers(functions); - } - + explicit ILogger(Core::System& system_) : ServiceFramework{system_, "ILogger"} {} private: void Log(HLERequestContext& ctx) { std::size_t offset{}; @@ -331,20 +322,25 @@ private: }; static_assert(sizeof(LogPacketHeader) == 0x18, "LogPacketHeader is an invalid size"); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &ILogger::Log, "Log"}, + FunctionInfo{1, &ILogger::SetDestination, "SetDestination"}, + FunctionInfo{2, nullptr, "TransmitHashedLog", MakeVersionGate({20,0,0})}, + FunctionInfo{3, nullptr, "DevNotify", MakeVersionGate({20,0,0})} + ); ::Common::unordered_map> entries{}; LogDestination destination{LogDestination::All}; }; class LM final : public ServiceFramework { public: - explicit LM(Core::System& system_) : ServiceFramework{system_, "lm"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &LM::OpenLogger, "OpenLogger"}, - }; - // clang-format on + explicit LM(Core::System& system_) : ServiceFramework{system_, "lm"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -355,21 +351,26 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &LM::OpenLogger, "OpenLogger"} + ); }; class LM_GET final : public ServiceFramework { public: - explicit LM_GET(Core::System& system_) - : ServiceFramework{system_, "lm:get"} - { - static const FunctionInfo functions[] = { - {0, nullptr, "StartLogging"}, - {1, nullptr, "StopLogging"}, - {2, nullptr, "GetLog"}, - {100, nullptr, "CreateDevNotificationReceiver"}, - }; - RegisterHandlers(functions); + explicit LM_GET(Core::System& system_) : ServiceFramework{system_, "lm:get"} {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "StartLogging"}, + FunctionInfo{1, nullptr, "StopLogging"}, + FunctionInfo{2, nullptr, "GetLog"}, + FunctionInfo{100, nullptr, "CreateDevNotificationReceiver"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/mig/mig.cpp b/src/core/hle/service/mig/mig.cpp index edc96506c0..2560050622 100644 --- a/src/core/hle/service/mig/mig.cpp +++ b/src/core/hle/service/mig/mig.cpp @@ -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-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -14,50 +14,50 @@ namespace Service::Migration { class MIG_USR final : public ServiceFramework { public: - explicit MIG_USR(Core::System& system_) : ServiceFramework{system_, "mig:usr"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Unknown0"}, //19.0.0+ - {1, nullptr, "Unknown1"}, //20.0.0+ - {2, nullptr, "Unknown2"}, //20.0.0+ - {10, nullptr, "TryGetLastMigrationInfo"}, - {11, nullptr, "Unknown11"}, //20.0.0+ - {100, nullptr, "CreateUserMigrationServer"}, //7.0.0+ - {101, nullptr, "ResumeUserMigrationServer"}, //7.0.0+ - {200, nullptr, "CreateUserMigrationClient"}, //7.0.0+ - {201, nullptr, "ResumeUserMigrationClient"}, //7.0.0+ - {1001, nullptr, "GetSaveDataMigrationPolicyInfoAsync"}, //8.0.0-20.5.0 - {1010, nullptr, "TryGetLastSaveDataMigrationInfo"}, //7.0.0+ - {1100, nullptr, "CreateSaveDataMigrationServer"}, //7.0.0-19.0.1 - {1101, nullptr, "ResumeSaveDataMigrationServer"}, //7.0.0+ - {1110, nullptr, "Unknown1101"}, //17.0.0+ - {1200, nullptr, "CreateSaveDataMigrationClient"}, //7.0.0+ - {1201, nullptr, "ResumeSaveDataMigrationClient"}, //7.0.0+ - {2001, nullptr, "Unknown2001"}, //20.0.0+ - {2010, nullptr, "Unknown2010"}, //20.0.0+ - {2100, nullptr, "Unknown2100"}, //20.0.0+ - {2110, nullptr, "Unknown2110"}, //20.0.0+ - {2200, nullptr, "Unknown2200"}, //20.0.0+ - {2210, nullptr, "Unknown2210"}, //20.0.0+ - {2220, nullptr, "Unknown2220"}, //20.0.0+ - {2230, nullptr, "Unknown2230"}, //20.0.0+ - {2231, nullptr, "Unknown2231"}, //20.0.0+ - {2232, nullptr, "Unknown2232"}, //20.0.0+ - {2233, nullptr, "Unknown2233"}, //20.0.0+ - {2234, nullptr, "Unknown2234"}, //20.0.0+ - {2250, nullptr, "Unknown2250"}, //20.0.0+ - {2260, nullptr, "Unknown2260"}, //20.0.0+ - {2270, nullptr, "Unknown2270"}, //20.0.0+ - {2280, nullptr, "Unknown2280"}, //20.0.0+ - {2300, nullptr, "Unknown2300"}, //20.0.0+ - {2310, nullptr, "Unknown2310"}, //20.0.0+ - {2400, nullptr, "Unknown2400"}, //20.0.0+ - {2420, nullptr, "Unknown2420"}, //20.0.0+ - }; - // clang-format on + explicit MIG_USR(Core::System& system_) : ServiceFramework{system_, "mig:usr"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Unknown0", MakeVersionGate({19,0,0})}, + FunctionInfo{1, nullptr, "Unknown1", MakeVersionGate({20,0,0})}, + FunctionInfo{2, nullptr, "Unknown2", MakeVersionGate({20,0,0})}, + FunctionInfo{10, nullptr, "TryGetLastMigrationInfo"}, + FunctionInfo{11, nullptr, "Unknown11", MakeVersionGate({20,0,0})}, + FunctionInfo{100, nullptr, "CreateUserMigrationServer", MakeVersionGate({7,0,0})}, + FunctionInfo{101, nullptr, "ResumeUserMigrationServer", MakeVersionGate({7,0,0})}, + FunctionInfo{200, nullptr, "CreateUserMigrationClient", MakeVersionGate({7,0,0})}, + FunctionInfo{201, nullptr, "ResumeUserMigrationClient", MakeVersionGate({7,0,0})}, + FunctionInfo{1001, nullptr, "GetSaveDataMigrationPolicyInfoAsync", MakeVersionGate({8,0,0}, {20,5,0})}, + FunctionInfo{1010, nullptr, "TryGetLastSaveDataMigrationInfo", MakeVersionGate({7,0,0})}, + FunctionInfo{1100, nullptr, "CreateSaveDataMigrationServer", MakeVersionGate({7,0,0}, {19,0,1})}, + FunctionInfo{1101, nullptr, "ResumeSaveDataMigrationServer", MakeVersionGate({7,0,0})}, + FunctionInfo{1110, nullptr, "Unknown1101", MakeVersionGate({17,0,0})}, + FunctionInfo{1200, nullptr, "CreateSaveDataMigrationClient", MakeVersionGate({7,0,0})}, + FunctionInfo{1201, nullptr, "ResumeSaveDataMigrationClient", MakeVersionGate({7,0,0})}, + FunctionInfo{2001, nullptr, "Unknown2001", MakeVersionGate({20,0,0})}, + FunctionInfo{2010, nullptr, "Unknown2010", MakeVersionGate({20,0,0})}, + FunctionInfo{2100, nullptr, "Unknown2100", MakeVersionGate({20,0,0})}, + FunctionInfo{2110, nullptr, "Unknown2110", MakeVersionGate({20,0,0})}, + FunctionInfo{2200, nullptr, "Unknown2200", MakeVersionGate({20,0,0})}, + FunctionInfo{2210, nullptr, "Unknown2210", MakeVersionGate({20,0,0})}, + FunctionInfo{2220, nullptr, "Unknown2220", MakeVersionGate({20,0,0})}, + FunctionInfo{2230, nullptr, "Unknown2230", MakeVersionGate({20,0,0})}, + FunctionInfo{2231, nullptr, "Unknown2231", MakeVersionGate({20,0,0})}, + FunctionInfo{2232, nullptr, "Unknown2232", MakeVersionGate({20,0,0})}, + FunctionInfo{2233, nullptr, "Unknown2233", MakeVersionGate({20,0,0})}, + FunctionInfo{2234, nullptr, "Unknown2234", MakeVersionGate({20,0,0})}, + FunctionInfo{2250, nullptr, "Unknown2250", MakeVersionGate({20,0,0})}, + FunctionInfo{2260, nullptr, "Unknown2260", MakeVersionGate({20,0,0})}, + FunctionInfo{2270, nullptr, "Unknown2270", MakeVersionGate({20,0,0})}, + FunctionInfo{2280, nullptr, "Unknown2280", MakeVersionGate({20,0,0})}, + FunctionInfo{2300, nullptr, "Unknown2300", MakeVersionGate({20,0,0})}, + FunctionInfo{2310, nullptr, "Unknown2310", MakeVersionGate({20,0,0})}, + FunctionInfo{2400, nullptr, "Unknown2400", MakeVersionGate({20,0,0})}, + FunctionInfo{2420, nullptr, "Unknown2420", MakeVersionGate({20,0,0})} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/mii/mii.cpp b/src/core/hle/service/mii/mii.cpp index 513bb671f8..642a9e4907 100644 --- a/src/core/hle/service/mii/mii.cpp +++ b/src/core/hle/service/mii/mii.cpp @@ -22,51 +22,27 @@ namespace Service::Mii { +std::optional IStaticService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IStaticService::GetDatabaseService>, "GetDatabaseService"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + class IDatabaseService final : public ServiceFramework { public: - explicit IDatabaseService(Core::System& system_, std::shared_ptr mii_manager, - bool is_system_) - : ServiceFramework{system_, "IDatabaseService"}, manager{mii_manager}, is_system{ - is_system_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IDatabaseService::IsUpdated>, "IsUpdated"}, - {1, D<&IDatabaseService::IsFullDatabase>, "IsFullDatabase"}, - {2, D<&IDatabaseService::GetCount>, "GetCount"}, - {3, D<&IDatabaseService::Get>, "Get"}, - {4, D<&IDatabaseService::Get1>, "Get1"}, - {5, D<&IDatabaseService::UpdateLatest>, "UpdateLatest"}, - {6, D<&IDatabaseService::BuildRandom>, "BuildRandom"}, - {7, D<&IDatabaseService::BuildDefault>, "BuildDefault"}, - {8, D<&IDatabaseService::Get2>, "Get2"}, - {9, D<&IDatabaseService::Get3>, "Get3"}, - {10, D<&IDatabaseService::UpdateLatest1>, "UpdateLatest1"}, - {11, D<&IDatabaseService::FindIndex>, "FindIndex"}, - {12, D<&IDatabaseService::Move>, "Move"}, - {13, D<&IDatabaseService::AddOrReplace>, "AddOrReplace"}, - {14, D<&IDatabaseService::Delete>, "Delete"}, - {15, D<&IDatabaseService::DestroyFile>, "DestroyFile"}, - {16, D<&IDatabaseService::DeleteFile>, "DeleteFile"}, - {17, D<&IDatabaseService::Format>, "Format"}, - {18, nullptr, "Import"}, - {19, nullptr, "Export"}, - {20, D<&IDatabaseService::IsBrokenDatabaseWithClearFlag>, "IsBrokenDatabaseWithClearFlag"}, - {21, D<&IDatabaseService::GetIndex>, "GetIndex"}, - {22, D<&IDatabaseService::SetInterfaceVersion>, "SetInterfaceVersion"}, - {23, D<&IDatabaseService::Convert>, "Convert"}, - {24, D<&IDatabaseService::ConvertCoreDataToCharInfo>, "ConvertCoreDataToCharInfo"}, - {25, D<&IDatabaseService::ConvertCharInfoToCoreData>, "ConvertCharInfoToCoreData"}, - {26, D<&IDatabaseService::Append>, "Append"}, - }; - // clang-format on - - RegisterHandlers(functions); - - m_set_sys = system.ServiceManager().GetService( - "set:sys", true); + explicit IDatabaseService(Core::System& system_, std::shared_ptr mii_manager, bool is_system_) + : ServiceFramework{system_, "IDatabaseService"} + , manager{mii_manager} + , is_system{is_system_} { + m_set_sys = system.ServiceManager().GetService("set:sys", true); manager->Initialize(metadata); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + private: Result IsUpdated(Out out_is_updated, SourceFlag source_flag) { LOG_DEBUG(Service_Mii, "called with source_flag={}", source_flag); @@ -288,23 +264,45 @@ private: R_RETURN(manager->Append(metadata, char_info)); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IDatabaseService::IsUpdated>, "IsUpdated"}, + FunctionInfo{1, D<&IDatabaseService::IsFullDatabase>, "IsFullDatabase"}, + FunctionInfo{2, D<&IDatabaseService::GetCount>, "GetCount"}, + FunctionInfo{3, D<&IDatabaseService::Get>, "Get"}, + FunctionInfo{4, D<&IDatabaseService::Get1>, "Get1"}, + FunctionInfo{5, D<&IDatabaseService::UpdateLatest>, "UpdateLatest"}, + FunctionInfo{6, D<&IDatabaseService::BuildRandom>, "BuildRandom"}, + FunctionInfo{7, D<&IDatabaseService::BuildDefault>, "BuildDefault"}, + FunctionInfo{8, D<&IDatabaseService::Get2>, "Get2"}, + FunctionInfo{9, D<&IDatabaseService::Get3>, "Get3"}, + FunctionInfo{10, D<&IDatabaseService::UpdateLatest1>, "UpdateLatest1"}, + FunctionInfo{11, D<&IDatabaseService::FindIndex>, "FindIndex"}, + FunctionInfo{12, D<&IDatabaseService::Move>, "Move"}, + FunctionInfo{13, D<&IDatabaseService::AddOrReplace>, "AddOrReplace"}, + FunctionInfo{14, D<&IDatabaseService::Delete>, "Delete"}, + FunctionInfo{15, D<&IDatabaseService::DestroyFile>, "DestroyFile"}, + FunctionInfo{16, D<&IDatabaseService::DeleteFile>, "DeleteFile"}, + FunctionInfo{17, D<&IDatabaseService::Format>, "Format"}, + FunctionInfo{18, nullptr, "Import"}, + FunctionInfo{19, nullptr, "Export"}, + FunctionInfo{20, D<&IDatabaseService::IsBrokenDatabaseWithClearFlag>, "IsBrokenDatabaseWithClearFlag"}, + FunctionInfo{21, D<&IDatabaseService::GetIndex>, "GetIndex"}, + FunctionInfo{22, D<&IDatabaseService::SetInterfaceVersion>, "SetInterfaceVersion"}, + FunctionInfo{23, D<&IDatabaseService::Convert>, "Convert"}, + FunctionInfo{24, D<&IDatabaseService::ConvertCoreDataToCharInfo>, "ConvertCoreDataToCharInfo"}, + FunctionInfo{25, D<&IDatabaseService::ConvertCharInfoToCoreData>, "ConvertCharInfoToCoreData"}, + FunctionInfo{26, D<&IDatabaseService::Append>, "Append"} + ); + std::shared_ptr manager = nullptr; DatabaseSessionMetadata metadata{}; bool is_system{}; - std::shared_ptr m_set_sys; }; IStaticService::IStaticService(Core::System& system_, const char* name_, std::shared_ptr mii_manager, bool is_system_) : ServiceFramework{system_, name_}, manager{mii_manager}, is_system{is_system_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IStaticService::GetDatabaseService>, "GetDatabaseService"}, - }; - // clang-format on - - RegisterHandlers(functions); } IStaticService::~IStaticService() = default; @@ -324,27 +322,10 @@ std::shared_ptr IStaticService::GetMiiManager() { class IImageDatabaseService final : public ServiceFramework { public: - explicit IImageDatabaseService(Core::System& system_) : ServiceFramework{system_, "miiimg"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IImageDatabaseService::Initialize>, "Initialize"}, - {10, nullptr, "Reload"}, - {11, D<&IImageDatabaseService::GetCount>, "GetCount"}, - {12, nullptr, "IsEmpty"}, - {13, nullptr, "IsFull"}, - {14, nullptr, "GetAttribute"}, - {15, nullptr, "LoadImage"}, - {16, nullptr, "AddOrUpdateImage"}, - {17, nullptr, "DeleteImages"}, - {100, nullptr, "DeleteFile"}, - {101, nullptr, "DestroyFile"}, - {102, nullptr, "ImportFile"}, - {103, nullptr, "ExportFile"}, - {104, nullptr, "ForceInitialize"}, - }; - // clang-format on + explicit IImageDatabaseService(Core::System& system_) : ServiceFramework{system_, "miiimg"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -361,6 +342,23 @@ private: R_SUCCEED(); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IImageDatabaseService::Initialize>, "Initialize"}, + FunctionInfo{10, nullptr, "Reload"}, + FunctionInfo{11, D<&IImageDatabaseService::GetCount>, "GetCount"}, + FunctionInfo{12, nullptr, "IsEmpty"}, + FunctionInfo{13, nullptr, "IsFull"}, + FunctionInfo{14, nullptr, "GetAttribute"}, + FunctionInfo{15, nullptr, "LoadImage"}, + FunctionInfo{16, nullptr, "AddOrUpdateImage"}, + FunctionInfo{17, nullptr, "DeleteImages"}, + FunctionInfo{100, nullptr, "DeleteFile"}, + FunctionInfo{101, nullptr, "DestroyFile"}, + FunctionInfo{102, nullptr, "ImportFile"}, + FunctionInfo{103, nullptr, "ExportFile"}, + FunctionInfo{104, nullptr, "ForceInitialize"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/mii/mii.h b/src/core/hle/service/mii/mii.h index 8683ac1a52..ba20db40d7 100644 --- a/src/core/hle/service/mii/mii.h +++ b/src/core/hle/service/mii/mii.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -24,6 +27,7 @@ public: private: Result GetDatabaseService(Out> out_database_service); + std::optional FindRequest(u32 key) override; std::shared_ptr manager{nullptr}; bool is_system{}; }; diff --git a/src/core/hle/service/mm/mm_u.cpp b/src/core/hle/service/mm/mm_u.cpp index e5353ee42c..0b361ecdd2 100644 --- a/src/core/hle/service/mm/mm_u.cpp +++ b/src/core/hle/service/mm/mm_u.cpp @@ -49,21 +49,10 @@ public: class MM_U final : public ServiceFramework { public: - explicit MM_U(Core::System& system_) : ServiceFramework{system_, "mm:u"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &MM_U::InitializeOld, "InitializeOld"}, - {1, &MM_U::FinalizeOld, "FinalizeOld"}, - {2, &MM_U::SetAndWaitOld, "SetAndWaitOld"}, - {3, &MM_U::GetOld, "GetOld"}, - {4, &MM_U::Initialize, "Initialize"}, - {5, &MM_U::Finalize, "Finalize"}, - {6, &MM_U::SetAndWait, "SetAndWait"}, - {7, &MM_U::Get, "Get"}, - }; - // clang-format on + explicit MM_U(Core::System& system_) : ServiceFramework{system_, "mm:u"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -212,6 +201,16 @@ private: rb.Push(0); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &MM_U::InitializeOld, "InitializeOld"}, + FunctionInfo{1, &MM_U::FinalizeOld, "FinalizeOld"}, + FunctionInfo{2, &MM_U::SetAndWaitOld, "SetAndWaitOld"}, + FunctionInfo{3, &MM_U::GetOld, "GetOld"}, + FunctionInfo{4, &MM_U::Initialize, "Initialize"}, + FunctionInfo{5, &MM_U::Finalize, "Finalize"}, + FunctionInfo{6, &MM_U::SetAndWait, "SetAndWait"}, + FunctionInfo{7, &MM_U::Get, "Get"} + ); std::vector sessions; u32 request_id{1}; }; diff --git a/src/core/hle/service/mnpp/mnpp.cpp b/src/core/hle/service/mnpp/mnpp.cpp index 11b6f3a386..c5bc306302 100644 --- a/src/core/hle/service/mnpp/mnpp.cpp +++ b/src/core/hle/service/mnpp/mnpp.cpp @@ -14,15 +14,10 @@ namespace Service::MNPP { class MNPP_APP final : public ServiceFramework { public: - explicit MNPP_APP(Core::System& system_) : ServiceFramework{system_, "mnpp:app"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &MNPP_APP::Cmd0, "Cmd0"}, - {1, &MNPP_APP::Cmd1, "Cmd1"}, - }; - // clang-format on + explicit MNPP_APP(Core::System& system_) : ServiceFramework{system_, "mnpp:app"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -39,38 +34,43 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &MNPP_APP::Cmd0, "Cmd0"}, + FunctionInfo{1, &MNPP_APP::Cmd1, "Cmd1"} + ); }; class MNPP_SYS final : public ServiceFramework { public: - explicit MNPP_SYS(Core::System& system_) : ServiceFramework{system_, "mnpp:sys"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Cmd0"}, - {10, nullptr, "Cmd10"}, - {100, nullptr, "Cmd100"}, - {200, nullptr, "Cmd200"}, - {300, nullptr, "Cmd300"}, - {400, nullptr, "Cmd400"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit MNPP_SYS(Core::System& system_) : ServiceFramework{system_, "mnpp:sys"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Cmd0"}, + FunctionInfo{10, nullptr, "Cmd10"}, + FunctionInfo{100, nullptr, "Cmd100"}, + FunctionInfo{200, nullptr, "Cmd200"}, + FunctionInfo{300, nullptr, "Cmd300"}, + FunctionInfo{400, nullptr, "Cmd400"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class MNPP_WEB final : public ServiceFramework { public: - explicit MNPP_WEB(Core::System& system_) : ServiceFramework{system_, "mnpp:web"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Cmd0"}, - {1, nullptr, "Cmd1"}, - {10, nullptr, "Cmd10"}, - {20, nullptr, "Cmd20"}, - {100, nullptr, "Cmd100"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit MNPP_WEB(Core::System& system_) : ServiceFramework{system_, "mnpp:web"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Cmd0"}, + FunctionInfo{1, nullptr, "Cmd1"}, + FunctionInfo{10, nullptr, "Cmd10"}, + FunctionInfo{20, nullptr, "Cmd20"}, + FunctionInfo{100, nullptr, "Cmd100"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/ncm/ncm.cpp b/src/core/hle/service/ncm/ncm.cpp index 6c754d5567..4091eadcf9 100644 --- a/src/core/hle/service/ncm/ncm.cpp +++ b/src/core/hle/service/ncm/ncm.cpp @@ -24,33 +24,32 @@ namespace Service::NCM { class ILocationResolver final : public ServiceFramework { public: explicit ILocationResolver(Core::System& system_, FileSys::StorageId id) - : ServiceFramework{system_, "ILocationResolver"}, storage{id} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "ResolveProgramPath"}, - {1, nullptr, "RedirectProgramPath"}, - {2, nullptr, "ResolveApplicationControlPath"}, - {3, nullptr, "ResolveApplicationHtmlDocumentPath"}, - {4, nullptr, "ResolveDataPath"}, - {5, nullptr, "RedirectApplicationControlPath"}, - {6, nullptr, "RedirectApplicationHtmlDocumentPath"}, - {7, nullptr, "ResolveApplicationLegalInformationPath"}, - {8, nullptr, "RedirectApplicationLegalInformationPath"}, - {9, nullptr, "Refresh"}, - {10, nullptr, "RedirectApplicationProgramPath"}, - {11, nullptr, "ClearApplicationRedirection"}, - {12, nullptr, "EraseProgramRedirection"}, - {13, nullptr, "EraseApplicationControlRedirection"}, - {14, nullptr, "EraseApplicationHtmlDocumentRedirection"}, - {15, nullptr, "EraseApplicationLegalInformationRedirection"}, - {16, nullptr, "ResolveProgramPathForDebug"}, - {17, nullptr, "RedirectProgramPathForDebug"}, - {18, nullptr, "RedirectApplicationProgramPathForDebug"}, - {19, nullptr, "EraseProgramRedirectionForDebug"}, - }; - // clang-format on + : ServiceFramework{system_, "ILocationResolver"}, storage{id} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "ResolveProgramPath"}, + FunctionInfo{1, nullptr, "RedirectProgramPath"}, + FunctionInfo{2, nullptr, "ResolveApplicationControlPath"}, + FunctionInfo{3, nullptr, "ResolveApplicationHtmlDocumentPath"}, + FunctionInfo{4, nullptr, "ResolveDataPath"}, + FunctionInfo{5, nullptr, "RedirectApplicationControlPath"}, + FunctionInfo{6, nullptr, "RedirectApplicationHtmlDocumentPath"}, + FunctionInfo{7, nullptr, "ResolveApplicationLegalInformationPath"}, + FunctionInfo{8, nullptr, "RedirectApplicationLegalInformationPath"}, + FunctionInfo{9, nullptr, "Refresh"}, + FunctionInfo{10, nullptr, "RedirectApplicationProgramPath"}, + FunctionInfo{11, nullptr, "ClearApplicationRedirection"}, + FunctionInfo{12, nullptr, "EraseProgramRedirection"}, + FunctionInfo{13, nullptr, "EraseApplicationControlRedirection"}, + FunctionInfo{14, nullptr, "EraseApplicationHtmlDocumentRedirection"}, + FunctionInfo{15, nullptr, "EraseApplicationLegalInformationRedirection"}, + FunctionInfo{16, nullptr, "ResolveProgramPathForDebug"}, + FunctionInfo{17, nullptr, "RedirectProgramPathForDebug"}, + FunctionInfo{18, nullptr, "RedirectApplicationProgramPathForDebug"}, + FunctionInfo{19, nullptr, "EraseProgramRedirectionForDebug"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -60,60 +59,49 @@ private: class IRegisteredLocationResolver final : public ServiceFramework { public: explicit IRegisteredLocationResolver(Core::System& system_) - : ServiceFramework{system_, "IRegisteredLocationResolver"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "ResolveProgramPath"}, - {1, nullptr, "RegisterProgramPath"}, - {2, nullptr, "UnregisterProgramPath"}, - {3, nullptr, "RedirectProgramPath"}, - {4, nullptr, "ResolveHtmlDocumentPath"}, - {5, nullptr, "RegisterHtmlDocumentPath"}, - {6, nullptr, "UnregisterHtmlDocumentPath"}, - {7, nullptr, "RedirectHtmlDocumentPath"}, - {8, nullptr, "Refresh"}, - {9, nullptr, "RefreshExcluding"}, - }; - // clang-format on + : ServiceFramework{system_, "IRegisteredLocationResolver"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "ResolveProgramPath"}, + FunctionInfo{1, nullptr, "RegisterProgramPath"}, + FunctionInfo{2, nullptr, "UnregisterProgramPath"}, + FunctionInfo{3, nullptr, "RedirectProgramPath"}, + FunctionInfo{4, nullptr, "ResolveHtmlDocumentPath"}, + FunctionInfo{5, nullptr, "RegisterHtmlDocumentPath"}, + FunctionInfo{6, nullptr, "UnregisterHtmlDocumentPath"}, + FunctionInfo{7, nullptr, "RedirectHtmlDocumentPath"}, + FunctionInfo{8, nullptr, "Refresh"}, + FunctionInfo{9, nullptr, "RefreshExcluding"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IAddOnContentLocationResolver final : public ServiceFramework { public: explicit IAddOnContentLocationResolver(Core::System& system_) - : ServiceFramework{system_, "IAddOnContentLocationResolver"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "ResolveAddOnContentPath"}, - {1, nullptr, "RegisterAddOnContentStorage"}, - {2, nullptr, "UnregisterAllAddOnContentPath"}, - {3, nullptr, "RefreshApplicationAddOnContent"}, - {4, nullptr, "UnregisterApplicationAddOnContent"}, - }; - // clang-format on + : ServiceFramework{system_, "IAddOnContentLocationResolver"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "ResolveAddOnContentPath"}, + FunctionInfo{1, nullptr, "RegisterAddOnContentStorage"}, + FunctionInfo{2, nullptr, "UnregisterAllAddOnContentPath"}, + FunctionInfo{3, nullptr, "RefreshApplicationAddOnContent"}, + FunctionInfo{4, nullptr, "UnregisterApplicationAddOnContent"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IContentStorage final : public ServiceFramework { public: explicit IContentStorage(Core::System& system_, FileSys::StorageId id) - : ServiceFramework{system_, "IContentStorage"}, storage{id} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IContentStorage::GeneratePlaceHolderId, "GeneratePlaceHolderId"}, - {1, &IContentStorage::CreatePlaceHolder, "CreatePlaceHolder"}, - {2, &IContentStorage::DeletePlaceHolder, "DeletePlaceHolder"}, - {4, &IContentStorage::WritePlaceHolder, "WritePlaceHolder"}, - {5, &IContentStorage::Register, "Register"}, - {6, &IContentStorage::Delete, "Delete"}, - }; - // clang-format on + : ServiceFramework{system_, "IContentStorage"}, storage{id} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -252,23 +240,24 @@ private: rb.Push(succeeded ? ResultSuccess : ResultUnknown); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IContentStorage::GeneratePlaceHolderId, "GeneratePlaceHolderId"}, + FunctionInfo{1, &IContentStorage::CreatePlaceHolder, "CreatePlaceHolder"}, + FunctionInfo{2, &IContentStorage::DeletePlaceHolder, "DeletePlaceHolder"}, + FunctionInfo{4, &IContentStorage::WritePlaceHolder, "WritePlaceHolder"}, + FunctionInfo{5, &IContentStorage::Register, "Register"}, + FunctionInfo{6, &IContentStorage::Delete, "Delete"} + ); FileSys::StorageId storage; }; class IContentMetaDatabase final : public ServiceFramework { public: explicit IContentMetaDatabase(Core::System& system_, FileSys::StorageId id) - : ServiceFramework{system_, "IContentMetaDatabase"}, storage{id} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IContentMetaDatabase::Set, "Set"}, - {2, &IContentMetaDatabase::Remove, "Remove"}, - {8, &IContentMetaDatabase::Has, "Has"}, - {15, &IContentMetaDatabase::Commit, "Commit"}, - }; - // clang-format on + : ServiceFramework{system_, "IContentMetaDatabase"}, storage{id} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -356,51 +345,37 @@ private: rb.Push(ResultSuccess); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IContentMetaDatabase::Set, "Set"}, + FunctionInfo{2, &IContentMetaDatabase::Remove, "Remove"}, + FunctionInfo{8, &IContentMetaDatabase::Has, "Has"}, + FunctionInfo{15, &IContentMetaDatabase::Commit, "Commit"} + ); FileSys::StorageId storage; std::vector entries; }; class LR final : public ServiceFramework { public: - explicit LR(Core::System& system_) : ServiceFramework{system_, "lr"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "OpenLocationResolver"}, - {1, nullptr, "OpenRegisteredLocationResolver"}, - {2, nullptr, "RefreshLocationResolver"}, - {3, nullptr, "OpenAddOnContentLocationResolver"}, - }; - // clang-format on + explicit LR(Core::System& system_) : ServiceFramework{system_, "lr"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "OpenLocationResolver"}, + FunctionInfo{1, nullptr, "OpenRegisteredLocationResolver"}, + FunctionInfo{2, nullptr, "RefreshLocationResolver"}, + FunctionInfo{3, nullptr, "OpenAddOnContentLocationResolver"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class NCM final : public ServiceFramework { public: - explicit NCM(Core::System& system_) : ServiceFramework{system_, "ncm"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "CreateContentStorage"}, - {1, nullptr, "CreateContentMetaDatabase"}, - {2, nullptr, "VerifyContentStorage"}, - {3, nullptr, "VerifyContentMetaDatabase"}, - {4, &NCM::OpenContentStorage, "OpenContentStorage"}, - {5, &NCM::OpenContentMetaDatabase, "OpenContentMetaDatabase"}, - {6, nullptr, "CloseContentStorageForcibly"}, - {7, nullptr, "CloseContentMetaDatabaseForcibly"}, - {8, nullptr, "CleanupContentMetaDatabase"}, - {9, nullptr, "ActivateContentStorage"}, - {10, nullptr, "InactivateContentStorage"}, - {11, nullptr, "ActivateContentMetaDatabase"}, - {12, nullptr, "InactivateContentMetaDatabase"}, - {13, nullptr, "InvalidateRightsIdCache"}, - {14, nullptr, "GetMemoryReport"}, - {15, nullptr, "ActivateFsContentStorage"}, - }; - // clang-format on + explicit NCM(Core::System& system_) : ServiceFramework{system_, "ncm"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -425,18 +400,39 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system, storage_id); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "CreateContentStorage"}, + FunctionInfo{1, nullptr, "CreateContentMetaDatabase"}, + FunctionInfo{2, nullptr, "VerifyContentStorage"}, + FunctionInfo{3, nullptr, "VerifyContentMetaDatabase"}, + FunctionInfo{4, &NCM::OpenContentStorage, "OpenContentStorage"}, + FunctionInfo{5, &NCM::OpenContentMetaDatabase, "OpenContentMetaDatabase"}, + FunctionInfo{6, nullptr, "CloseContentStorageForcibly"}, + FunctionInfo{7, nullptr, "CloseContentMetaDatabaseForcibly"}, + FunctionInfo{8, nullptr, "CleanupContentMetaDatabase"}, + FunctionInfo{9, nullptr, "ActivateContentStorage"}, + FunctionInfo{10, nullptr, "InactivateContentStorage"}, + FunctionInfo{11, nullptr, "ActivateContentMetaDatabase"}, + FunctionInfo{12, nullptr, "InactivateContentMetaDatabase"}, + FunctionInfo{13, nullptr, "InvalidateRightsIdCache"}, + FunctionInfo{14, nullptr, "GetMemoryReport"}, + FunctionInfo{15, nullptr, "ActivateFsContentStorage"} + ); }; class NCM_V final : public ServiceFramework { public: explicit NCM_V(Core::System& system_) : ServiceFramework{system_, "ncm:v"} - { - static const FunctionInfo functions[] = { - {0, nullptr, "GetSystemVersion"}, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetSystemVersion"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/nfc/nfc.cpp b/src/core/hle/service/nfc/nfc.cpp index f64445835e..d3a986faea 100644 --- a/src/core/hle/service/nfc/nfc.cpp +++ b/src/core/hle/service/nfc/nfc.cpp @@ -18,74 +18,71 @@ namespace Service::NFC { class IUser final : public NfcInterface { public: - explicit IUser(Core::System& system_) : NfcInterface(system_, "NFC::IUser", BackendType::Nfc) { - // clang-format off - static const FunctionInfo functions[] = { - {0, &NfcInterface::Initialize, "InitializeOld"}, - {1, &NfcInterface::Finalize, "FinalizeOld"}, - {2, &NfcInterface::GetState, "GetStateOld"}, - {3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"}, - {400, &NfcInterface::Initialize, "Initialize"}, - {401, &NfcInterface::Finalize, "Finalize"}, - {402, &NfcInterface::GetState, "GetState"}, - {403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"}, - {404, &NfcInterface::ListDevices, "ListDevices"}, - {405, &NfcInterface::GetDeviceState, "GetDeviceState"}, - {406, &NfcInterface::GetNpadId, "GetNpadId"}, - {407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - {408, &NfcInterface::StartDetection, "StartDetection"}, - {409, &NfcInterface::StopDetection, "StopDetection"}, - {410, &NfcInterface::GetTagInfo, "GetTagInfo"}, - {411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"}, - {412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"}, - {1000, &NfcInterface::ReadMifare, "ReadMifare"}, - {1001, &NfcInterface::WriteMifare ,"WriteMifare"}, - {1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"}, - {1301, nullptr, "KeepPassThroughSession"}, - {1302, nullptr, "ReleasePassThroughSession"}, - }; - // clang-format on + explicit IUser(Core::System& system_) : NfcInterface(system_, "NFC::IUser", BackendType::Nfc) {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMapWithClass( + FunctionInfoTyped{0, &NfcInterface::Initialize, "InitializeOld"}, + FunctionInfoTyped{1, &NfcInterface::Finalize, "FinalizeOld"}, + FunctionInfoTyped{2, &NfcInterface::GetState, "GetStateOld"}, + FunctionInfoTyped{3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"}, + FunctionInfoTyped{400, &NfcInterface::Initialize, "Initialize"}, + FunctionInfoTyped{401, &NfcInterface::Finalize, "Finalize"}, + FunctionInfoTyped{402, &NfcInterface::GetState, "GetState"}, + FunctionInfoTyped{403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"}, + FunctionInfoTyped{404, &NfcInterface::ListDevices, "ListDevices"}, + FunctionInfoTyped{405, &NfcInterface::GetDeviceState, "GetDeviceState"}, + FunctionInfoTyped{406, &NfcInterface::GetNpadId, "GetNpadId"}, + FunctionInfoTyped{407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, + FunctionInfoTyped{408, &NfcInterface::StartDetection, "StartDetection"}, + FunctionInfoTyped{409, &NfcInterface::StopDetection, "StopDetection"}, + FunctionInfoTyped{410, &NfcInterface::GetTagInfo, "GetTagInfo"}, + FunctionInfoTyped{411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"}, + FunctionInfoTyped{412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"}, + FunctionInfoTyped{1000, &NfcInterface::ReadMifare, "ReadMifare"}, + FunctionInfoTyped{1001, &NfcInterface::WriteMifare ,"WriteMifare"}, + FunctionInfoTyped{1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"}, + FunctionInfoTyped{1301, nullptr, "KeepPassThroughSession"}, + FunctionInfoTyped{1302, nullptr, "ReleasePassThroughSession"} + ); }; class ISystem final : public NfcInterface { public: - explicit ISystem(Core::System& system_) - : NfcInterface{system_, "NFC::ISystem", BackendType::Nfc} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &NfcInterface::Initialize, "InitializeOld"}, - {1, &NfcInterface::Finalize, "FinalizeOld"}, - {2, &NfcInterface::GetState, "GetStateOld"}, - {3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"}, - {100, &NfcInterface::SetNfcEnabled, "SetNfcEnabledOld"}, - {400, &NfcInterface::Initialize, "Initialize"}, - {401, &NfcInterface::Finalize, "Finalize"}, - {402, &NfcInterface::GetState, "GetState"}, - {403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"}, - {404, &NfcInterface::ListDevices, "ListDevices"}, - {405, &NfcInterface::GetDeviceState, "GetDeviceState"}, - {406, &NfcInterface::GetNpadId, "GetNpadId"}, - {407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - {408, &NfcInterface::StartDetection, "StartDetection"}, - {409, &NfcInterface::StopDetection, "StopDetection"}, - {410, &NfcInterface::GetTagInfo, "GetTagInfo"}, - {411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"}, - {412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"}, - {500, &NfcInterface::SetNfcEnabled, "SetNfcEnabled"}, - {510, nullptr, "OutputTestWave"}, - {1000, &NfcInterface::ReadMifare, "ReadMifare"}, - {1001, &NfcInterface::WriteMifare, "WriteMifare"}, - {1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"}, - {1301, nullptr, "KeepPassThroughSession"}, - {1302, nullptr, "ReleasePassThroughSession"}, - }; - // clang-format on + explicit ISystem(Core::System& system_) : NfcInterface{system_, "NFC::ISystem", BackendType::Nfc} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMapWithClass( + FunctionInfoTyped{0, &NfcInterface::Initialize, "InitializeOld"}, + FunctionInfoTyped{1, &NfcInterface::Finalize, "FinalizeOld"}, + FunctionInfoTyped{2, &NfcInterface::GetState, "GetStateOld"}, + FunctionInfoTyped{3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"}, + FunctionInfoTyped{100, &NfcInterface::SetNfcEnabled, "SetNfcEnabledOld"}, + FunctionInfoTyped{400, &NfcInterface::Initialize, "Initialize"}, + FunctionInfoTyped{401, &NfcInterface::Finalize, "Finalize"}, + FunctionInfoTyped{402, &NfcInterface::GetState, "GetState"}, + FunctionInfoTyped{403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"}, + FunctionInfoTyped{404, &NfcInterface::ListDevices, "ListDevices"}, + FunctionInfoTyped{405, &NfcInterface::GetDeviceState, "GetDeviceState"}, + FunctionInfoTyped{406, &NfcInterface::GetNpadId, "GetNpadId"}, + FunctionInfoTyped{407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, + FunctionInfoTyped{408, &NfcInterface::StartDetection, "StartDetection"}, + FunctionInfoTyped{409, &NfcInterface::StopDetection, "StopDetection"}, + FunctionInfoTyped{410, &NfcInterface::GetTagInfo, "GetTagInfo"}, + FunctionInfoTyped{411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"}, + FunctionInfoTyped{412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"}, + FunctionInfoTyped{500, &NfcInterface::SetNfcEnabled, "SetNfcEnabled"}, + FunctionInfoTyped{510, nullptr, "OutputTestWave"}, + FunctionInfoTyped{1000, &NfcInterface::ReadMifare, "ReadMifare"}, + FunctionInfoTyped{1001, &NfcInterface::WriteMifare, "WriteMifare"}, + FunctionInfoTyped{1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"}, + FunctionInfoTyped{1301, nullptr, "KeepPassThroughSession"}, + FunctionInfoTyped{1302, nullptr, "ReleasePassThroughSession"} + ); }; // MFInterface has an unique interface but it's identical to NfcInterface so we can keep the code @@ -93,56 +90,49 @@ public: using MFInterface = NfcInterface; class MFIUser final : public MFInterface { public: - explicit MFIUser(Core::System& system_) - : MFInterface{system_, "NFC::MFInterface", BackendType::Mifare} { - // clang-format off - static const FunctionInfoTyped functions[] = { - {0, &MFIUser::Initialize, "Initialize"}, - {1, &MFIUser::Finalize, "Finalize"}, - {2, &MFIUser::ListDevices, "ListDevices"}, - {3, &MFIUser::StartDetection, "StartDetection"}, - {4, &MFIUser::StopDetection, "StopDetection"}, - {5, &MFIUser::ReadMifare, "Read"}, - {6, &MFIUser::WriteMifare, "Write"}, - {7, &MFIUser::GetTagInfo, "GetTagInfo"}, - {8, &MFIUser::AttachActivateEvent, "GetActivateEventHandle"}, - {9, &MFIUser::AttachDeactivateEvent, "GetDeactivateEventHandle"}, - {10, &MFIUser::GetState, "GetState"}, - {11, &MFIUser::GetDeviceState, "GetDeviceState"}, - {12, &MFIUser::GetNpadId, "GetNpadId"}, - {13, &MFIUser::AttachAvailabilityChangeEvent, "GetAvailabilityChangeEventHandle"}, - }; - // clang-format on + explicit MFIUser(Core::System& system_) : MFInterface{system_, "NFC::MFInterface", BackendType::Mifare} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMapWithClass( + FunctionInfoTyped{0, &MFIUser::Initialize, "Initialize"}, + FunctionInfoTyped{1, &MFIUser::Finalize, "Finalize"}, + FunctionInfoTyped{2, &MFIUser::ListDevices, "ListDevices"}, + FunctionInfoTyped{3, &MFIUser::StartDetection, "StartDetection"}, + FunctionInfoTyped{4, &MFIUser::StopDetection, "StopDetection"}, + FunctionInfoTyped{5, &MFIUser::ReadMifare, "Read"}, + FunctionInfoTyped{6, &MFIUser::WriteMifare, "Write"}, + FunctionInfoTyped{7, &MFIUser::GetTagInfo, "GetTagInfo"}, + FunctionInfoTyped{8, &MFIUser::AttachActivateEvent, "GetActivateEventHandle"}, + FunctionInfoTyped{9, &MFIUser::AttachDeactivateEvent, "GetDeactivateEventHandle"}, + FunctionInfoTyped{10, &MFIUser::GetState, "GetState"}, + FunctionInfoTyped{11, &MFIUser::GetDeviceState, "GetDeviceState"}, + FunctionInfoTyped{12, &MFIUser::GetNpadId, "GetNpadId"}, + FunctionInfoTyped{13, &MFIUser::AttachAvailabilityChangeEvent, "GetAvailabilityChangeEventHandle"} + ); }; class IAm final : public ServiceFramework { public: - explicit IAm(Core::System& system_) : ServiceFramework{system_, "NFC::IAm"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Initialize"}, - {1, nullptr, "Finalize"}, - {2, nullptr, "NotifyForegroundApplet"}, - }; - // clang-format on + explicit IAm(Core::System& system_) : ServiceFramework{system_, "NFC::IAm"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Initialize"}, + FunctionInfo{1, nullptr, "Finalize"}, + FunctionInfo{2, nullptr, "NotifyForegroundApplet"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class NFC_AM final : public ServiceFramework { public: - explicit NFC_AM(Core::System& system_) : ServiceFramework{system_, "nfc:am"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &NFC_AM::CreateAmNfcInterface, "CreateAmNfcInterface"}, - }; - // clang-format on + explicit NFC_AM(Core::System& system_) : ServiceFramework{system_, "nfc:am"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -153,18 +143,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &NFC_AM::CreateAmNfcInterface, "CreateAmNfcInterface"} + ); }; class NFC_MF_U final : public ServiceFramework { public: - explicit NFC_MF_U(Core::System& system_) : ServiceFramework{system_, "nfc:mf:u"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &NFC_MF_U::CreateUserNfcInterface, "CreateUserNfcInterface"}, - }; - // clang-format on + explicit NFC_MF_U(Core::System& system_) : ServiceFramework{system_, "nfc:mf:u"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -175,18 +165,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &NFC_MF_U::CreateUserNfcInterface, "CreateUserNfcInterface"} + ); }; class NFC_U final : public ServiceFramework { public: - explicit NFC_U(Core::System& system_) : ServiceFramework{system_, "nfc:user"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &NFC_U::CreateUserNfcInterface, "CreateUserNfcInterface"}, - }; - // clang-format on + explicit NFC_U(Core::System& system_) : ServiceFramework{system_, "nfc:user"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -197,18 +187,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &NFC_U::CreateUserNfcInterface, "CreateUserNfcInterface"} + ); }; class NFC_SYS final : public ServiceFramework { public: - explicit NFC_SYS(Core::System& system_) : ServiceFramework{system_, "nfc:sys"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &NFC_SYS::CreateSystemNfcInterface, "CreateSystemNfcInterface"}, - }; - // clang-format on + explicit NFC_SYS(Core::System& system_) : ServiceFramework{system_, "nfc:sys"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -219,6 +209,10 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &NFC_SYS::CreateSystemNfcInterface, "CreateSystemNfcInterface"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp index e0c24679ab..bfeb7d5553 100644 --- a/src/core/hle/service/nfp/nfp.cpp +++ b/src/core/hle/service/nfp/nfp.cpp @@ -14,145 +14,134 @@ namespace Service::NFP { class IUser final : public Interface { public: - explicit IUser(Core::System& system_) : Interface(system_, "NFP:IUser") { - // clang-format off - static const FunctionInfoTyped functions[] = { - {0, &IUser::Initialize, "Initialize"}, - {1, &IUser::Finalize, "Finalize"}, - {2, &IUser::ListDevices, "ListDevices"}, - {3, &IUser::StartDetection, "StartDetection"}, - {4, &IUser::StopDetection, "StopDetection"}, - {5, &IUser::Mount, "Mount"}, - {6, &IUser::Unmount, "Unmount"}, - {7, &IUser::OpenApplicationArea, "OpenApplicationArea"}, - {8, &IUser::GetApplicationArea, "GetApplicationArea"}, - {9, &IUser::SetApplicationArea, "SetApplicationArea"}, - {10, &IUser::Flush, "Flush"}, - {11, &IUser::Restore, "Restore"}, - {12, &IUser::CreateApplicationArea, "CreateApplicationArea"}, - {13, &IUser::GetTagInfo, "GetTagInfo"}, - {14, &IUser::GetRegisterInfo, "GetRegisterInfo"}, - {15, &IUser::GetCommonInfo, "GetCommonInfo"}, - {16, &IUser::GetModelInfo, "GetModelInfo"}, - {17, &IUser::AttachActivateEvent, "AttachActivateEvent"}, - {18, &IUser::AttachDeactivateEvent, "AttachDeactivateEvent"}, - {19, &IUser::GetState, "GetState"}, - {20, &IUser::GetDeviceState, "GetDeviceState"}, - {21, &IUser::GetNpadId, "GetNpadId"}, - {22, &IUser::GetApplicationAreaSize, "GetApplicationAreaSize"}, - {23, &IUser::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - {24, &IUser::RecreateApplicationArea, "RecreateApplicationArea"}, - {25, &IUser::StartDetection, "StartDetectionWithFilter"}, - }; - // clang-format on + explicit IUser(Core::System& system_) : Interface(system_, "NFP:IUser") {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMapWithClass( + FunctionInfoTyped{0, &IUser::Initialize, "Initialize"}, + FunctionInfoTyped{1, &IUser::Finalize, "Finalize"}, + FunctionInfoTyped{2, &IUser::ListDevices, "ListDevices"}, + FunctionInfoTyped{3, &IUser::StartDetection, "StartDetection"}, + FunctionInfoTyped{4, &IUser::StopDetection, "StopDetection"}, + FunctionInfoTyped{5, &IUser::Mount, "Mount"}, + FunctionInfoTyped{6, &IUser::Unmount, "Unmount"}, + FunctionInfoTyped{7, &IUser::OpenApplicationArea, "OpenApplicationArea"}, + FunctionInfoTyped{8, &IUser::GetApplicationArea, "GetApplicationArea"}, + FunctionInfoTyped{9, &IUser::SetApplicationArea, "SetApplicationArea"}, + FunctionInfoTyped{10, &IUser::Flush, "Flush"}, + FunctionInfoTyped{11, &IUser::Restore, "Restore"}, + FunctionInfoTyped{12, &IUser::CreateApplicationArea, "CreateApplicationArea"}, + FunctionInfoTyped{13, &IUser::GetTagInfo, "GetTagInfo"}, + FunctionInfoTyped{14, &IUser::GetRegisterInfo, "GetRegisterInfo"}, + FunctionInfoTyped{15, &IUser::GetCommonInfo, "GetCommonInfo"}, + FunctionInfoTyped{16, &IUser::GetModelInfo, "GetModelInfo"}, + FunctionInfoTyped{17, &IUser::AttachActivateEvent, "AttachActivateEvent"}, + FunctionInfoTyped{18, &IUser::AttachDeactivateEvent, "AttachDeactivateEvent"}, + FunctionInfoTyped{19, &IUser::GetState, "GetState"}, + FunctionInfoTyped{20, &IUser::GetDeviceState, "GetDeviceState"}, + FunctionInfoTyped{21, &IUser::GetNpadId, "GetNpadId"}, + FunctionInfoTyped{22, &IUser::GetApplicationAreaSize, "GetApplicationAreaSize"}, + FunctionInfoTyped{23, &IUser::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, + FunctionInfoTyped{24, &IUser::RecreateApplicationArea, "RecreateApplicationArea"}, + FunctionInfoTyped{25, &IUser::StartDetection, "StartDetectionWithFilter"} + ); }; class ISystem final : public Interface { public: - explicit ISystem(Core::System& system_) : Interface(system_, "NFP:ISystem") { - // clang-format off - static const FunctionInfoTyped functions[] = { - {0, &ISystem::InitializeSystem, "InitializeSystem"}, - {1, &ISystem::FinalizeSystem, "FinalizeSystem"}, - {2, &ISystem::ListDevices, "ListDevices"}, - {3, &ISystem::StartDetection, "StartDetection"}, - {4, &ISystem::StopDetection, "StopDetection"}, - {5, &ISystem::Mount, "Mount"}, - {6, &ISystem::Unmount, "Unmount"}, - {10, &ISystem::Flush, "Flush"}, - {11, &ISystem::Restore, "Restore"}, - {12, &ISystem::CreateApplicationArea, "CreateApplicationArea"}, - {13, &ISystem::GetTagInfo, "GetTagInfo"}, - {14, &ISystem::GetRegisterInfo, "GetRegisterInfo"}, - {15, &ISystem::GetCommonInfo, "GetCommonInfo"}, - {16, &ISystem::GetModelInfo, "GetModelInfo"}, - {17, &ISystem::AttachActivateEvent, "AttachActivateEvent"}, - {18, &ISystem::AttachDeactivateEvent, "AttachDeactivateEvent"}, - {19, &ISystem::GetState, "GetState"}, - {20, &ISystem::GetDeviceState, "GetDeviceState"}, - {21, &ISystem::GetNpadId, "GetNpadId"}, - {23, &ISystem::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - {25, &ISystem::StartDetection, "StartDetectionWithFilter"}, - {100, &ISystem::Format, "Format"}, - {101, &ISystem::GetAdminInfo, "GetAdminInfo"}, - {102, &ISystem::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"}, - {103, &ISystem::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"}, - {104, &ISystem::DeleteRegisterInfo, "DeleteRegisterInfo"}, - {105, &ISystem::DeleteApplicationArea, "DeleteApplicationArea"}, - {106, &ISystem::ExistsApplicationArea, "ExistsApplicationArea"}, - }; - // clang-format on + explicit ISystem(Core::System& system_) : Interface(system_, "NFP:ISystem") {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMapWithClass( + FunctionInfoTyped{0, &ISystem::InitializeSystem, "InitializeSystem"}, + FunctionInfoTyped{1, &ISystem::FinalizeSystem, "FinalizeSystem"}, + FunctionInfoTyped{2, &ISystem::ListDevices, "ListDevices"}, + FunctionInfoTyped{3, &ISystem::StartDetection, "StartDetection"}, + FunctionInfoTyped{4, &ISystem::StopDetection, "StopDetection"}, + FunctionInfoTyped{5, &ISystem::Mount, "Mount"}, + FunctionInfoTyped{6, &ISystem::Unmount, "Unmount"}, + FunctionInfoTyped{10, &ISystem::Flush, "Flush"}, + FunctionInfoTyped{11, &ISystem::Restore, "Restore"}, + FunctionInfoTyped{12, &ISystem::CreateApplicationArea, "CreateApplicationArea"}, + FunctionInfoTyped{13, &ISystem::GetTagInfo, "GetTagInfo"}, + FunctionInfoTyped{14, &ISystem::GetRegisterInfo, "GetRegisterInfo"}, + FunctionInfoTyped{15, &ISystem::GetCommonInfo, "GetCommonInfo"}, + FunctionInfoTyped{16, &ISystem::GetModelInfo, "GetModelInfo"}, + FunctionInfoTyped{17, &ISystem::AttachActivateEvent, "AttachActivateEvent"}, + FunctionInfoTyped{18, &ISystem::AttachDeactivateEvent, "AttachDeactivateEvent"}, + FunctionInfoTyped{19, &ISystem::GetState, "GetState"}, + FunctionInfoTyped{20, &ISystem::GetDeviceState, "GetDeviceState"}, + FunctionInfoTyped{21, &ISystem::GetNpadId, "GetNpadId"}, + FunctionInfoTyped{23, &ISystem::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, + FunctionInfoTyped{25, &ISystem::StartDetection, "StartDetectionWithFilter"}, + FunctionInfoTyped{100, &ISystem::Format, "Format"}, + FunctionInfoTyped{101, &ISystem::GetAdminInfo, "GetAdminInfo"}, + FunctionInfoTyped{102, &ISystem::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"}, + FunctionInfoTyped{103, &ISystem::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"}, + FunctionInfoTyped{104, &ISystem::DeleteRegisterInfo, "DeleteRegisterInfo"}, + FunctionInfoTyped{105, &ISystem::DeleteApplicationArea, "DeleteApplicationArea"}, + FunctionInfoTyped{106, &ISystem::ExistsApplicationArea, "ExistsApplicationArea"} + ); }; class IDebug final : public Interface { public: - explicit IDebug(Core::System& system_) : Interface(system_, "NFP:IDebug") { - // clang-format off - static const FunctionInfoTyped functions[] = { - {0, &IDebug::InitializeDebug, "InitializeDebug"}, - {1, &IDebug::FinalizeDebug, "FinalizeDebug"}, - {2, &IDebug::ListDevices, "ListDevices"}, - {3, &IDebug::StartDetection, "StartDetection"}, - {4, &IDebug::StopDetection, "StopDetection"}, - {5, &IDebug::Mount, "Mount"}, - {6, &IDebug::Unmount, "Unmount"}, - {7, &IDebug::OpenApplicationArea, "OpenApplicationArea"}, - {8, &IDebug::GetApplicationArea, "GetApplicationArea"}, - {9, &IDebug::SetApplicationArea, "SetApplicationArea"}, - {10, &IDebug::Flush, "Flush"}, - {11, &IDebug::Restore, "Restore"}, - {12, &IDebug::CreateApplicationArea, "CreateApplicationArea"}, - {13, &IDebug::GetTagInfo, "GetTagInfo"}, - {14, &IDebug::GetRegisterInfo, "GetRegisterInfo"}, - {15, &IDebug::GetCommonInfo, "GetCommonInfo"}, - {16, &IDebug::GetModelInfo, "GetModelInfo"}, - {17, &IDebug::AttachActivateEvent, "AttachActivateEvent"}, - {18, &IDebug::AttachDeactivateEvent, "AttachDeactivateEvent"}, - {19, &IDebug::GetState, "GetState"}, - {20, &IDebug::GetDeviceState, "GetDeviceState"}, - {21, &IDebug::GetNpadId, "GetNpadId"}, - {22, &IDebug::GetApplicationAreaSize, "GetApplicationAreaSize"}, - {23, &IDebug::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - {24, &IDebug::RecreateApplicationArea, "RecreateApplicationArea"}, - {25, &IDebug::StartDetection, "StartDetectionWithFilter"}, - {100, &IDebug::Format, "Format"}, - {101, &IDebug::GetAdminInfo, "GetAdminInfo"}, - {102, &IDebug::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"}, - {103, &IDebug::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"}, - {104, &IDebug::DeleteRegisterInfo, "DeleteRegisterInfo"}, - {105, &IDebug::DeleteApplicationArea, "DeleteApplicationArea"}, - {106, &IDebug::ExistsApplicationArea, "ExistsApplicationArea"}, - {200, &IDebug::GetAll, "GetAll"}, - {201, &IDebug::SetAll, "SetAll"}, - {202, &IDebug::FlushDebug, "FlushDebug"}, - {203, &IDebug::BreakTag, "BreakTag"}, - {204, &IDebug::ReadBackupData, "ReadBackupData"}, - {205, &IDebug::WriteBackupData, "WriteBackupData"}, - {206, &IDebug::WriteNtf, "WriteNtf"}, - }; - // clang-format on + explicit IDebug(Core::System& system_) : Interface(system_, "NFP:IDebug") {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMapWithClass( + FunctionInfoTyped{0, &IDebug::InitializeDebug, "InitializeDebug"}, + FunctionInfoTyped{1, &IDebug::FinalizeDebug, "FinalizeDebug"}, + FunctionInfoTyped{2, &IDebug::ListDevices, "ListDevices"}, + FunctionInfoTyped{3, &IDebug::StartDetection, "StartDetection"}, + FunctionInfoTyped{4, &IDebug::StopDetection, "StopDetection"}, + FunctionInfoTyped{5, &IDebug::Mount, "Mount"}, + FunctionInfoTyped{6, &IDebug::Unmount, "Unmount"}, + FunctionInfoTyped{7, &IDebug::OpenApplicationArea, "OpenApplicationArea"}, + FunctionInfoTyped{8, &IDebug::GetApplicationArea, "GetApplicationArea"}, + FunctionInfoTyped{9, &IDebug::SetApplicationArea, "SetApplicationArea"}, + FunctionInfoTyped{10, &IDebug::Flush, "Flush"}, + FunctionInfoTyped{11, &IDebug::Restore, "Restore"}, + FunctionInfoTyped{12, &IDebug::CreateApplicationArea, "CreateApplicationArea"}, + FunctionInfoTyped{13, &IDebug::GetTagInfo, "GetTagInfo"}, + FunctionInfoTyped{14, &IDebug::GetRegisterInfo, "GetRegisterInfo"}, + FunctionInfoTyped{15, &IDebug::GetCommonInfo, "GetCommonInfo"}, + FunctionInfoTyped{16, &IDebug::GetModelInfo, "GetModelInfo"}, + FunctionInfoTyped{17, &IDebug::AttachActivateEvent, "AttachActivateEvent"}, + FunctionInfoTyped{18, &IDebug::AttachDeactivateEvent, "AttachDeactivateEvent"}, + FunctionInfoTyped{19, &IDebug::GetState, "GetState"}, + FunctionInfoTyped{20, &IDebug::GetDeviceState, "GetDeviceState"}, + FunctionInfoTyped{21, &IDebug::GetNpadId, "GetNpadId"}, + FunctionInfoTyped{22, &IDebug::GetApplicationAreaSize, "GetApplicationAreaSize"}, + FunctionInfoTyped{23, &IDebug::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, + FunctionInfoTyped{24, &IDebug::RecreateApplicationArea, "RecreateApplicationArea"}, + FunctionInfoTyped{25, &IDebug::StartDetection, "StartDetectionWithFilter"}, + FunctionInfoTyped{100, &IDebug::Format, "Format"}, + FunctionInfoTyped{101, &IDebug::GetAdminInfo, "GetAdminInfo"}, + FunctionInfoTyped{102, &IDebug::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"}, + FunctionInfoTyped{103, &IDebug::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"}, + FunctionInfoTyped{104, &IDebug::DeleteRegisterInfo, "DeleteRegisterInfo"}, + FunctionInfoTyped{105, &IDebug::DeleteApplicationArea, "DeleteApplicationArea"}, + FunctionInfoTyped{106, &IDebug::ExistsApplicationArea, "ExistsApplicationArea"}, + FunctionInfoTyped{200, &IDebug::GetAll, "GetAll"}, + FunctionInfoTyped{201, &IDebug::SetAll, "SetAll"}, + FunctionInfoTyped{202, &IDebug::FlushDebug, "FlushDebug"}, + FunctionInfoTyped{203, &IDebug::BreakTag, "BreakTag"}, + FunctionInfoTyped{204, &IDebug::ReadBackupData, "ReadBackupData"}, + FunctionInfoTyped{205, &IDebug::WriteBackupData, "WriteBackupData"}, + FunctionInfoTyped{206, &IDebug::WriteNtf, "WriteNtf"} + ); }; class IUserManager final : public ServiceFramework { public: - explicit IUserManager(Core::System& system_) : ServiceFramework{system_, "nfp:user"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IUserManager::CreateUserInterface, "CreateUserInterface"}, - }; - // clang-format on - - RegisterHandlers(functions); - } + explicit IUserManager(Core::System& system_) : ServiceFramework{system_, "nfp:user"} {} private: void CreateUserInterface(HLERequestContext& ctx) { @@ -162,18 +151,21 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IUserManager::CreateUserInterface, "CreateUserInterface"} + ); }; class ISystemManager final : public ServiceFramework { public: - explicit ISystemManager(Core::System& system_) : ServiceFramework{system_, "nfp:sys"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &ISystemManager::CreateSystemInterface, "CreateSystemInterface"}, - }; - // clang-format on + explicit ISystemManager(Core::System& system_) : ServiceFramework{system_, "nfp:sys"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -184,18 +176,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &ISystemManager::CreateSystemInterface, "CreateSystemInterface"} + ); }; class IDebugManager final : public ServiceFramework { public: - explicit IDebugManager(Core::System& system_) : ServiceFramework{system_, "nfp:dbg"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IDebugManager::CreateDebugInterface, "CreateDebugInterface"}, - }; - // clang-format on + explicit IDebugManager(Core::System& system_) : ServiceFramework{system_, "nfp:dbg"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -206,6 +198,10 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IDebugManager::CreateDebugInterface, "CreateDebugInterface"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/ngc/ngc.cpp b/src/core/hle/service/ngc/ngc.cpp index e79108a1eb..fb3ef39093 100644 --- a/src/core/hle/service/ngc/ngc.cpp +++ b/src/core/hle/service/ngc/ngc.cpp @@ -21,15 +21,10 @@ namespace Service::NGC { class IService final : public ServiceFramework { public: - explicit IService(Core::System& system_) : ServiceFramework{system_, "ngct:u"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IService::Match, "Match"}, - {1, &IService::Filter, "Filter"}, - }; - // clang-format on + explicit IService(Core::System& system_) : ServiceFramework{system_, "ngct:u"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -61,23 +56,19 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IService::Match, "Match"}, + FunctionInfo{1, &IService::Filter, "Filter"} + ); }; class NgcServiceImpl final : public ServiceFramework { public: - explicit NgcServiceImpl(Core::System& system_) : ServiceFramework(system_, "ngc:u") { - // clang-format off - static const FunctionInfo functions[] = { - {0, &NgcServiceImpl::GetContentVersion, "GetContentVersion"}, - {1, &NgcServiceImpl::Check, "Check"}, - {2, &NgcServiceImpl::Mask, "Mask"}, - {3, &NgcServiceImpl::Reload, "Reload"}, - {4, &NgcServiceImpl::Check, "Check2"}, - {5, &NgcServiceImpl::Mask, "Mask2"}, - }; - // clang-format on + explicit NgcServiceImpl(Core::System& system_) : ServiceFramework(system_, "ngc:u") {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -150,25 +141,34 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &NgcServiceImpl::GetContentVersion, "GetContentVersion"}, + FunctionInfo{1, &NgcServiceImpl::Check, "Check"}, + FunctionInfo{2, &NgcServiceImpl::Mask, "Mask"}, + FunctionInfo{3, &NgcServiceImpl::Reload, "Reload"}, + FunctionInfo{4, &NgcServiceImpl::Check, "Check2"}, + FunctionInfo{5, &NgcServiceImpl::Mask, "Mask2"} + ); }; class IServiceWithManagementApi final : public ServiceFramework { public: - explicit IServiceWithManagementApi(Core::System& system_) : ServiceFramework(system_, "ngct:s") { - // clang-format off - static const FunctionInfo functions[] = { - {0 , nullptr, "Match"}, - {1 , nullptr, "Filter"}, - {100, nullptr, "ConfigureAutoUpdateSetting"}, - {101, nullptr, "RequestResourceUpdateCheck"}, - {110, nullptr, "Reload"}, - {111, nullptr, "IsReloadRequired"}, - {112, nullptr, "TryAcquireReloadRequestNotifier"}, - {120, nullptr, "CalculateContentFingerprint"}, - {130, nullptr, "TryEnableTemporalPassThrough"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit IServiceWithManagementApi(Core::System& system_) : ServiceFramework(system_, "ngct:s") {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Match"}, + FunctionInfo{1, nullptr, "Filter"}, + FunctionInfo{100, nullptr, "ConfigureAutoUpdateSetting"}, + FunctionInfo{101, nullptr, "RequestResourceUpdateCheck"}, + FunctionInfo{110, nullptr, "Reload"}, + FunctionInfo{111, nullptr, "IsReloadRequired"}, + FunctionInfo{112, nullptr, "TryAcquireReloadRequestNotifier"}, + FunctionInfo{120, nullptr, "CalculateContentFingerprint"}, + FunctionInfo{130, nullptr, "TryEnableTemporalPassThrough"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; @@ -179,20 +179,10 @@ static_assert(sizeof(SaveDataHandle) == 0x08); class IUserShimScopedObject final : public ServiceFramework { public: - explicit IUserShimScopedObject(Core::System& system_) : ServiceFramework(system_, "IUserShimScopedObject") { - // clang-format off - static const FunctionInfo functions[] = { - {450, nullptr, "InitializeForSaveData"}, - {451, nullptr, "FinalizeForSaveData"}, - {452, D<&IUserShimScopedObject::OpenSaveData>, "OpenSaveData"}, - {453, nullptr, "CloseSaveData"}, - {454, D<&IUserShimScopedObject::ReadSaveSlot>, "ReadSaveSlot"}, - {455, D<&IUserShimScopedObject::WriteSaveSlot>, "WriteSaveSlot"}, - {456, nullptr, "FlushSaveSlot"}, - {457, nullptr, "CommitSaveData"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit IUserShimScopedObject(Core::System& system_) : ServiceFramework(system_, "IUserShimScopedObject") {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } Result OpenSaveData(Account::Uid unk0, Out unk1) { @@ -210,42 +200,43 @@ public: // to implement R_SUCCEED(); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{450, nullptr, "InitializeForSaveData"}, + FunctionInfo{451, nullptr, "FinalizeForSaveData"}, + FunctionInfo{452, D<&IUserShimScopedObject::OpenSaveData>, "OpenSaveData"}, + FunctionInfo{453, nullptr, "CloseSaveData"}, + FunctionInfo{454, D<&IUserShimScopedObject::ReadSaveSlot>, "ReadSaveSlot"}, + FunctionInfo{455, D<&IUserShimScopedObject::WriteSaveSlot>, "WriteSaveSlot"}, + FunctionInfo{456, nullptr, "FlushSaveSlot"}, + FunctionInfo{457, nullptr, "CommitSaveData"} + ); }; class IUserService final : public ServiceFramework { public: - explicit IUserService(Core::System& system_) : ServiceFramework(system_, "stpl:u") { - // clang-format off - static const FunctionInfo functions[] = { - {0 , D<&IUserService::Cmd0>, "Cmd0"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit IUserService(Core::System& system_) : ServiceFramework(system_, "stpl:u") {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } Result Cmd0(u32 unk0, OutInterface out_interface) { LOG_WARNING(Service_NGC, "stubbed"); *out_interface = std::make_shared(system); R_SUCCEED(); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IUserService::Cmd0>, "Cmd0"} + ); }; class ISystemShimScopedObject final : public ServiceFramework { public: - explicit ISystemShimScopedObject(Core::System& system_) : ServiceFramework(system_, "ISystemShimScopedObject") { - // clang-format off - static const FunctionInfo functions[] = { - {106, nullptr, "Cmd106"}, - {107, nullptr, "Cmd107"}, - {108, D<&ISystemShimScopedObject::Cmd108>, "Cmd108"}, - {207, nullptr, "Cmd207"}, - {208, D<&ISystemShimScopedObject::Cmd208>, "Cmd208"}, - {209, nullptr, "Cmd209"}, - {210, nullptr, "Cmd210"}, - {211, nullptr, "Cmd211"}, - {212, nullptr, "Cmd212"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit ISystemShimScopedObject(Core::System& system_) : ServiceFramework(system_, "ISystemShimScopedObject") {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } Result Cmd108() { @@ -257,23 +248,36 @@ public: LOG_WARNING(Service_NGC, "stubbed"); R_THROW(IPC::ResultNotSupported); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{106, nullptr, "Cmd106"}, + FunctionInfo{107, nullptr, "Cmd107"}, + FunctionInfo{108, D<&ISystemShimScopedObject::Cmd108>, "Cmd108"}, + FunctionInfo{207, nullptr, "Cmd207"}, + FunctionInfo{208, D<&ISystemShimScopedObject::Cmd208>, "Cmd208"}, + FunctionInfo{209, nullptr, "Cmd209"}, + FunctionInfo{210, nullptr, "Cmd210"}, + FunctionInfo{211, nullptr, "Cmd211"}, + FunctionInfo{212, nullptr, "Cmd212"} + ); }; class ISystemService final : public ServiceFramework { public: - explicit ISystemService(Core::System& system_) : ServiceFramework(system_, "stpl:sys") { - // clang-format off - static const FunctionInfo functions[] = { - {0 , D<&ISystemService::Cmd0>, "Cmd0"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit ISystemService(Core::System& system_) : ServiceFramework(system_, "stpl:sys") {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } Result Cmd0(OutInterface out_interface) { LOG_WARNING(Service_NGC, "stubbed"); *out_interface = std::make_shared(system); R_SUCCEED(); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ISystemService::Cmd0>, "Cmd0"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index efada9b807..5befe8e943 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -235,15 +235,6 @@ public: explicit IScanRequest(Core::System& system_) : ServiceFramework{system_, "IScanRequest"}, svc_ctx{system_, "IScanRequest"} { - static const FunctionInfo functions[] = { - {0, &IScanRequest::Submit, "Submit"}, - {1, &IScanRequest::IsProcessing, "IsProcessing"}, - {2, &IScanRequest::GetResult, "GetResult"}, - {3, &IScanRequest::GetSystemEventReadableHandle, "GetSystemEventReadableHandle"}, - {4, &IScanRequest::SetChannels, "SetChannels"}, - }; - RegisterHandlers(functions); - evt_scan_complete = CreateKEvent(svc_ctx, "IScanRequest:Complete"); evt_processing = CreateKEvent(svc_ctx, "IScanRequest:Processing"); } @@ -257,8 +248,6 @@ public: } private: - std::vector scan_results; - void Submit(HLERequestContext& ctx) { if (state.load() == State::Finished) { @@ -329,6 +318,17 @@ private: evt_scan_complete->Signal(system.Kernel()); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IScanRequest::Submit, "Submit"}, + FunctionInfo{1, &IScanRequest::IsProcessing, "IsProcessing"}, + FunctionInfo{2, &IScanRequest::GetResult, "GetResult"}, + FunctionInfo{3, &IScanRequest::GetSystemEventReadableHandle, "GetSystemEventReadableHandle"}, + FunctionInfo{4, &IScanRequest::SetChannels, "SetChannels"} + ); + std::vector scan_results; KernelHelpers::ServiceContext svc_ctx; Kernel::KEvent* evt_scan_complete{}; @@ -342,36 +342,6 @@ class IRequest final : public ServiceFramework { public: explicit IRequest(Core::System& system_) : ServiceFramework{system_, "IRequest"}, service_context{system_, "IRequest"} { - static const FunctionInfo functions[] = { - {0, &IRequest::GetRequestState, "GetRequestState"}, - {1, &IRequest::GetResult, "GetResult"}, - {2, &IRequest::GetSystemEventReadableHandles, "GetSystemEventReadableHandles"}, - {3, &IRequest::Cancel, "Cancel"}, - {4, &IRequest::Submit, "Submit"}, - {5, nullptr, "SetRequirement"}, - {6, &IRequest::SetRequirementPreset, "SetRequirementPreset"}, - {8, nullptr, "SetPriority"}, - {9, &IRequest::SetNetworkProfileId, "SetNetworkProfileId"}, - {10, nullptr, "SetRejectable"}, - {11, &IRequest::SetConnectionConfirmationOption, "SetConnectionConfirmationOption"}, - {12, nullptr, "SetPersistent"}, - {13, nullptr, "SetInstant"}, - {14, nullptr, "SetSustainable"}, - {15, nullptr, "SetRawPriority"}, - {16, nullptr, "SetGreedy"}, - {17, nullptr, "SetSharable"}, - {18, nullptr, "SetRequirementByRevision"}, - {19, nullptr, "GetRequirement"}, - {20, nullptr, "GetRevision"}, - {21, &IRequest::GetAppletInfo, "GetAppletInfo"}, - {22, nullptr, "GetAdditionalInfo"}, - {23, nullptr, "SetKeptInSleep"}, - {24, nullptr, "RegisterSocketDescriptor"}, - {25, nullptr, "UnregisterSocketDescriptor"}, - {26, nullptr, "GetNetworkAccessStatus"}, //21.0.0+ - }; - RegisterHandlers(functions); - event1 = CreateKEvent(service_context, "IRequest:Event1"); event2 = CreateKEvent(service_context, "IRequest:Event2"); state = RequestState::NotSubmitted; @@ -494,6 +464,37 @@ private: event1->Signal(system.Kernel()); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IRequest::GetRequestState, "GetRequestState"}, + FunctionInfo{1, &IRequest::GetResult, "GetResult"}, + FunctionInfo{2, &IRequest::GetSystemEventReadableHandles, "GetSystemEventReadableHandles"}, + FunctionInfo{3, &IRequest::Cancel, "Cancel"}, + FunctionInfo{4, &IRequest::Submit, "Submit"}, + FunctionInfo{5, nullptr, "SetRequirement"}, + FunctionInfo{6, &IRequest::SetRequirementPreset, "SetRequirementPreset"}, + FunctionInfo{8, nullptr, "SetPriority"}, + FunctionInfo{9, &IRequest::SetNetworkProfileId, "SetNetworkProfileId"}, + FunctionInfo{10, nullptr, "SetRejectable"}, + FunctionInfo{11, &IRequest::SetConnectionConfirmationOption, "SetConnectionConfirmationOption"}, + FunctionInfo{12, nullptr, "SetPersistent"}, + FunctionInfo{13, nullptr, "SetInstant"}, + FunctionInfo{14, nullptr, "SetSustainable"}, + FunctionInfo{15, nullptr, "SetRawPriority"}, + FunctionInfo{16, nullptr, "SetGreedy"}, + FunctionInfo{17, nullptr, "SetSharable"}, + FunctionInfo{18, nullptr, "SetRequirementByRevision"}, + FunctionInfo{19, nullptr, "GetRequirement"}, + FunctionInfo{20, nullptr, "GetRevision"}, + FunctionInfo{21, &IRequest::GetAppletInfo, "GetAppletInfo"}, + FunctionInfo{22, nullptr, "GetAdditionalInfo"}, + FunctionInfo{23, nullptr, "SetKeptInSleep"}, + FunctionInfo{24, nullptr, "RegisterSocketDescriptor"}, + FunctionInfo{25, nullptr, "UnregisterSocketDescriptor"}, + FunctionInfo{26, nullptr, "GetNetworkAccessStatus", MakeVersionGate({21,0,0})} + ); KernelHelpers::ServiceContext service_context; RequestState state; @@ -508,14 +509,16 @@ private: class INetworkProfile final : public ServiceFramework { public: - explicit INetworkProfile(Core::System& system_) : ServiceFramework{system_, "INetworkProfile"} { - static const FunctionInfo functions[] = { - {0, nullptr, "Update"}, - {1, nullptr, "PersistOld"}, - {2, nullptr, "Persist"}, - }; - RegisterHandlers(functions); + explicit INetworkProfile(Core::System& system_) : ServiceFramework{system_, "INetworkProfile"} {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Update"}, + FunctionInfo{1, nullptr, "PersistOld"}, + FunctionInfo{2, nullptr, "Persist"} + ); }; void IGeneralService::GetClientId(HLERequestContext& ctx) { @@ -1050,78 +1053,70 @@ void IGeneralService::GetCurrentAccessPoint(HLERequestContext& ctx) { rb.Push(ResultSuccess); } +std::optional IGeneralService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, &IGeneralService::GetClientId, "GetClientId"}, + FunctionInfo{2, &IGeneralService::CreateScanRequest, "CreateScanRequest"}, + FunctionInfo{4, &IGeneralService::CreateRequest, "CreateRequest"}, + FunctionInfo{5, &IGeneralService::GetCurrentNetworkProfile, "GetCurrentNetworkProfile"}, + FunctionInfo{6, &IGeneralService::EnumerateNetworkInterfaces, "EnumerateNetworkInterfaces"}, + FunctionInfo{7, &IGeneralService::EnumerateNetworkProfiles, "EnumerateNetworkProfiles"}, + FunctionInfo{8, &IGeneralService::GetNetworkProfile, "GetNetworkProfile"}, + FunctionInfo{9, &IGeneralService::SetNetworkProfile, "SetNetworkProfile"}, + FunctionInfo{10, &IGeneralService::RemoveNetworkProfile, "RemoveNetworkProfile"}, + FunctionInfo{11, &IGeneralService::GetScanData, "GetScanDataOld"}, + FunctionInfo{12, &IGeneralService::GetCurrentIpAddress, "GetCurrentIpAddress"}, + FunctionInfo{13, nullptr, "GetCurrentAccessPointOld"}, + FunctionInfo{14, &IGeneralService::CreateTemporaryNetworkProfile, "CreateTemporaryNetworkProfile"}, + FunctionInfo{15, &IGeneralService::GetCurrentIpConfigInfo, "GetCurrentIpConfigInfo"}, + FunctionInfo{16, &IGeneralService::SetWirelessCommunicationEnabled, "SetWirelessCommunicationEnabled"}, + FunctionInfo{17, &IGeneralService::IsWirelessCommunicationEnabled, "IsWirelessCommunicationEnabled"}, + FunctionInfo{18, &IGeneralService::GetInternetConnectionStatus, "GetInternetConnectionStatus"}, + FunctionInfo{19, &IGeneralService::SetEthernetCommunicationEnabled, "SetEthernetCommunicationEnabled"}, + FunctionInfo{20, &IGeneralService::IsEthernetCommunicationEnabled, "IsEthernetCommunicationEnabled"}, + FunctionInfo{21, &IGeneralService::IsAnyInternetRequestAccepted, "IsAnyInternetRequestAccepted"}, + FunctionInfo{22, &IGeneralService::IsAnyForegroundRequestAccepted, "IsAnyForegroundRequestAccepted"}, + FunctionInfo{23, nullptr, "PutToSleep"}, + FunctionInfo{24, nullptr, "WakeUp"}, + FunctionInfo{25, &IGeneralService::GetSsidListVersion, "GetSsidListVersion"}, + FunctionInfo{26, nullptr, "SetExclusiveClient"}, + FunctionInfo{27, nullptr, "GetDefaultIpSetting"}, + FunctionInfo{28, nullptr, "SetDefaultIpSetting"}, + FunctionInfo{29, nullptr, "SetWirelessCommunicationEnabledForTest"}, + FunctionInfo{30, nullptr, "SetEthernetCommunicationEnabledForTest"}, + FunctionInfo{31, nullptr, "GetTelemetorySystemEventReadableHandle"}, + FunctionInfo{32, nullptr, "GetTelemetryInfo"}, + FunctionInfo{33, &IGeneralService::ConfirmSystemAvailability, "ConfirmSystemAvailability", MakeVersionGate({2,0,0})}, + FunctionInfo{34, &IGeneralService::SetBackgroundRequestEnabled, "SetBackgroundRequestEnabled", MakeVersionGate({4,0,0})}, + FunctionInfo{35, &IGeneralService::GetScanDataV2, "GetScanData"}, + FunctionInfo{36, &IGeneralService::GetCurrentAccessPoint, "GetCurrentAccessPoint"}, + FunctionInfo{37, nullptr, "Shutdown"}, + FunctionInfo{38, nullptr, "GetAllowedChannels"}, + FunctionInfo{39, nullptr, "NotifyApplicationSuspended"}, + FunctionInfo{40, nullptr, "SetAcceptableNetworkTypeFlag"}, + FunctionInfo{41, nullptr, "GetAcceptableNetworkTypeFlag"}, + FunctionInfo{42, nullptr, "NotifyConnectionStateChanged"}, + FunctionInfo{43, nullptr, "SetWowlDelayedWakeTime"}, + FunctionInfo{44, nullptr, "IsWiredConnectionAvailable", MakeVersionGate({18,0,0})}, + FunctionInfo{45, nullptr, "IsNetworkEmulationFeatureEnabled", MakeVersionGate({18,0,0})}, + FunctionInfo{46, nullptr, "SelectActiveNetworkEmulationProfileIdForDebug", MakeVersionGate({18,0,0})}, + FunctionInfo{47, &IGeneralService::GetScanDataV3, "GetScanData", MakeVersionGate({19,0,0})}, + FunctionInfo{50, nullptr, "IsRewriteFeatureEnabled", MakeVersionGate({18,0,0})}, + FunctionInfo{51, nullptr, "CreateRewriteRule", MakeVersionGate({18,0,0})}, + FunctionInfo{52, nullptr, "DestroyRewriteRule", MakeVersionGate({18,0,0})} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IGeneralService::IGeneralService(Core::System& system_) : ServiceFramework{system_, "IGeneralService"} { - // clang-format off - - static const FunctionInfo functions[] = { - {1, &IGeneralService::GetClientId, "GetClientId"}, - {2, &IGeneralService::CreateScanRequest, "CreateScanRequest"}, - {4, &IGeneralService::CreateRequest, "CreateRequest"}, - {5, &IGeneralService::GetCurrentNetworkProfile, "GetCurrentNetworkProfile"}, - {6, &IGeneralService::EnumerateNetworkInterfaces, "EnumerateNetworkInterfaces"}, - {7, &IGeneralService::EnumerateNetworkProfiles, "EnumerateNetworkProfiles"}, - {8, &IGeneralService::GetNetworkProfile, "GetNetworkProfile"}, - {9, &IGeneralService::SetNetworkProfile, "SetNetworkProfile"}, - {10, &IGeneralService::RemoveNetworkProfile, "RemoveNetworkProfile"}, - {11, &IGeneralService::GetScanData, "GetScanDataOld"}, - {12, &IGeneralService::GetCurrentIpAddress, "GetCurrentIpAddress"}, - {13, nullptr, "GetCurrentAccessPointOld"}, - {14, &IGeneralService::CreateTemporaryNetworkProfile, "CreateTemporaryNetworkProfile"}, - {15, &IGeneralService::GetCurrentIpConfigInfo, "GetCurrentIpConfigInfo"}, - {16, &IGeneralService::SetWirelessCommunicationEnabled, "SetWirelessCommunicationEnabled"}, - {17, &IGeneralService::IsWirelessCommunicationEnabled, "IsWirelessCommunicationEnabled"}, - {18, &IGeneralService::GetInternetConnectionStatus, "GetInternetConnectionStatus"}, - {19, &IGeneralService::SetEthernetCommunicationEnabled, "SetEthernetCommunicationEnabled"}, - {20, &IGeneralService::IsEthernetCommunicationEnabled, "IsEthernetCommunicationEnabled"}, - {21, &IGeneralService::IsAnyInternetRequestAccepted, "IsAnyInternetRequestAccepted"}, - {22, &IGeneralService::IsAnyForegroundRequestAccepted, "IsAnyForegroundRequestAccepted"}, - {23, nullptr, "PutToSleep"}, - {24, nullptr, "WakeUp"}, - {25, &IGeneralService::GetSsidListVersion, "GetSsidListVersion"}, - {26, nullptr, "SetExclusiveClient"}, - {27, nullptr, "GetDefaultIpSetting"}, - {28, nullptr, "SetDefaultIpSetting"}, - {29, nullptr, "SetWirelessCommunicationEnabledForTest"}, - {30, nullptr, "SetEthernetCommunicationEnabledForTest"}, - {31, nullptr, "GetTelemetorySystemEventReadableHandle"}, - {32, nullptr, "GetTelemetryInfo"}, - {33, &IGeneralService::ConfirmSystemAvailability, "ConfirmSystemAvailability"}, // 2.0.0+ - {34, &IGeneralService::SetBackgroundRequestEnabled, "SetBackgroundRequestEnabled"}, // 4.0.0+ - {35, &IGeneralService::GetScanDataV2, "GetScanData"}, - {36, &IGeneralService::GetCurrentAccessPoint, "GetCurrentAccessPoint"}, - {37, nullptr, "Shutdown"}, - {38, nullptr, "GetAllowedChannels"}, - {39, nullptr, "NotifyApplicationSuspended"}, - {40, nullptr, "SetAcceptableNetworkTypeFlag"}, - {41, nullptr, "GetAcceptableNetworkTypeFlag"}, - {42, nullptr, "NotifyConnectionStateChanged"}, - {43, nullptr, "SetWowlDelayedWakeTime"}, - {44, nullptr, "IsWiredConnectionAvailable"}, // 18.0.0+ - {45, nullptr, "IsNetworkEmulationFeatureEnabled"}, // 18.0.0+ - {46, nullptr, "SelectActiveNetworkEmulationProfileIdForDebug"}, // 18.0.0+ - {47, &IGeneralService::GetScanDataV3, "GetScanData"}, // 19.0.0+ - {50, nullptr, "IsRewriteFeatureEnabled"}, // 18.0.0+ - {51, nullptr, "CreateRewriteRule"}, // 18.0.0+ - {52, nullptr, "DestroyRewriteRule"} // 18.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); } IGeneralService::~IGeneralService() = default; class NetworkInterface final : public ServiceFramework { public: - explicit NetworkInterface(const char* name, Core::System& system_) - : ServiceFramework{system_, name} { - static const FunctionInfo functions[] = { - {4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"}, - {5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"}, - }; - RegisterHandlers(functions); - } + explicit NetworkInterface(const char* name, Core::System& system_) : ServiceFramework{system_, name} {} private: void CreateGeneralServiceOld(HLERequestContext& ctx) { @@ -1139,6 +1134,14 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"}, + FunctionInfo{5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/nifm/nifm.h b/src/core/hle/service/nifm/nifm.h index 3b5a438c75..3f3535fa93 100644 --- a/src/core/hle/service/nifm/nifm.h +++ b/src/core/hle/service/nifm/nifm.h @@ -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-FileCopyrightText: Copyright 2018 yuzu Emulator @@ -51,6 +51,7 @@ private: void SetBackgroundRequestEnabled(HLERequestContext& ctx); void GetCurrentAccessPoint(HLERequestContext& ctx); void GetScanDataV3(HLERequestContext& ctx); + std::optional FindRequest(u32 key) override; }; } // namespace Service::NIFM diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp index e5f2d85dde..c48bf54646 100644 --- a/src/core/hle/service/nim/nim.cpp +++ b/src/core/hle/service/nim/nim.cpp @@ -24,24 +24,15 @@ namespace Service::NIM { class IShopServiceAsync final : public ServiceFramework { public: explicit IShopServiceAsync(Core::System& system_) - : ServiceFramework{system_, "IShopServiceAsync"}, - service_context{system_, "IShopServiceAsync"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IShopServiceAsync::Cancel>, "Cancel"}, - {1, D<&IShopServiceAsync::GetSize>, "GetSize"}, - {2, D<&IShopServiceAsync::Read>, "Read"}, - {3, D<&IShopServiceAsync::GetErrorCode>, "GetErrorCode"}, - {4, D<&IShopServiceAsync::Request>, "Request"}, - {5, D<&IShopServiceAsync::Prepare>, "Prepare"}, - }; - // clang-format on - - RegisterHandlers(functions); - + : ServiceFramework{system_, "IShopServiceAsync"} + , service_context{system_, "IShopServiceAsync"} { completion_event = service_context.CreateEvent("IShopServiceAsync:Completion"); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + ~IShopServiceAsync() override { CancelImpl(); service_context.CloseEvent(completion_event); @@ -52,15 +43,6 @@ public: } private: - KernelHelpers::ServiceContext service_context; - Kernel::KEvent* completion_event; - - std::jthread worker; - std::atomic error_code{0}; - - std::mutex data_mutex; - std::vector download_data; - void CancelImpl() { worker.request_stop(); if (worker.joinable()) { @@ -136,19 +118,30 @@ private: } R_SUCCEED(); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IShopServiceAsync::Cancel>, "Cancel"}, + FunctionInfo{1, D<&IShopServiceAsync::GetSize>, "GetSize"}, + FunctionInfo{2, D<&IShopServiceAsync::Read>, "Read"}, + FunctionInfo{3, D<&IShopServiceAsync::GetErrorCode>, "GetErrorCode"}, + FunctionInfo{4, D<&IShopServiceAsync::Request>, "Request"}, + FunctionInfo{5, D<&IShopServiceAsync::Prepare>, "Prepare"} + ); + KernelHelpers::ServiceContext service_context; + Kernel::KEvent* completion_event; + std::jthread worker; + std::atomic error_code{0}; + std::mutex data_mutex; + std::vector download_data; }; class IShopServiceAccessor final : public ServiceFramework { public: explicit IShopServiceAccessor(Core::System& system_) - : ServiceFramework{system_, "IShopServiceAccessor"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IShopServiceAccessor::CreateAsyncInterface, "CreateAsyncInterface"}, - }; - // clang-format on + : ServiceFramework{system_, "IShopServiceAccessor"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -160,19 +153,19 @@ private: rb.PushCopyObjects(ctx, async_interface->GetEvent()); rb.PushIpcInterface(ctx, std::move(async_interface)); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IShopServiceAccessor::CreateAsyncInterface, "CreateAsyncInterface"} + ); }; class IShopServiceAccessServer final : public ServiceFramework { public: explicit IShopServiceAccessServer(Core::System& system_) - : ServiceFramework{system_, "IShopServiceAccessServer"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IShopServiceAccessServer::CreateAccessorInterface, "CreateAccessorInterface"}, - }; - // clang-format on + : ServiceFramework{system_, "IShopServiceAccessServer"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -182,258 +175,252 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IShopServiceAccessServer::CreateAccessorInterface, "CreateAccessorInterface"} + ); }; class NIM final : public ServiceFramework { public: - explicit NIM(Core::System& system_) : ServiceFramework{system_, "nim"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "CreateSystemUpdateTask"}, - {1, nullptr, "DestroySystemUpdateTask"}, - {2, nullptr, "ListSystemUpdateTask"}, - {3, nullptr, "RequestSystemUpdateTaskRun"}, - {4, nullptr, "GetSystemUpdateTaskInfo"}, - {5, nullptr, "CommitSystemUpdateTask"}, - {6, nullptr, "CreateNetworkInstallTask"}, - {7, nullptr, "DestroyNetworkInstallTask"}, - {8, nullptr, "ListNetworkInstallTask"}, - {9, nullptr, "RequestNetworkInstallTaskRun"}, - {10, nullptr, "GetNetworkInstallTaskInfo"}, - {11, nullptr, "CommitNetworkInstallTask"}, - {12, nullptr, "RequestLatestSystemUpdateMeta"}, - {14, nullptr, "ListApplicationNetworkInstallTask"}, - {15, nullptr, "ListNetworkInstallTaskContentMeta"}, - {16, nullptr, "RequestLatestVersion"}, - {17, nullptr, "SetNetworkInstallTaskAttribute"}, - {18, nullptr, "AddNetworkInstallTaskContentMeta"}, - {19, nullptr, "GetDownloadedSystemDataPath"}, - {20, nullptr, "CalculateNetworkInstallTaskRequiredSize"}, - {21, nullptr, "IsExFatDriverIncluded"}, - {22, nullptr, "GetBackgroundDownloadStressTaskInfo"}, - {23, nullptr, "RequestDeviceAuthenticationToken"}, - {24, nullptr, "RequestGameCardRegistrationStatus"}, - {25, nullptr, "RequestRegisterGameCard"}, - {26, nullptr, "RequestRegisterNotificationToken"}, - {27, nullptr, "RequestDownloadTaskList"}, - {28, nullptr, "RequestApplicationControl"}, - {29, nullptr, "RequestLatestApplicationControl"}, - {30, nullptr, "RequestVersionList"}, - {31, nullptr, "CreateApplyDeltaTask"}, - {32, nullptr, "DestroyApplyDeltaTask"}, - {33, nullptr, "ListApplicationApplyDeltaTask"}, - {34, nullptr, "RequestApplyDeltaTaskRun"}, - {35, nullptr, "GetApplyDeltaTaskInfo"}, - {36, nullptr, "ListApplyDeltaTask"}, - {37, nullptr, "CommitApplyDeltaTask"}, - {38, nullptr, "CalculateApplyDeltaTaskRequiredSize"}, - {39, nullptr, "PrepareShutdown"}, - {40, nullptr, "ListApplyDeltaTask"}, - {41, nullptr, "ClearNotEnoughSpaceStateOfApplyDeltaTask"}, - {42, nullptr, "CreateApplyDeltaTaskFromDownloadTask"}, - {43, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"}, - {44, nullptr, "GetApplyDeltaTaskRequiredStorage"}, - {45, nullptr, "CalculateNetworkInstallTaskContentsSize"}, - {46, nullptr, "PrepareShutdownForSystemUpdate"}, - {47, nullptr, "FindMaxRequiredApplicationVersionOfTask"}, - {48, nullptr, "CommitNetworkInstallTaskPartially"}, - {49, nullptr, "ListNetworkInstallTaskCommittedContentMeta"}, - {50, nullptr, "ListNetworkInstallTaskNotCommittedContentMeta"}, - {51, nullptr, "FindMaxRequiredSystemVersionOfTask"}, - {52, nullptr, "GetNetworkInstallTaskErrorContext"}, - {53, nullptr, "CreateLocalCommunicationReceiveApplicationTask"}, - {54, nullptr, "DestroyLocalCommunicationReceiveApplicationTask"}, - {55, nullptr, "ListLocalCommunicationReceiveApplicationTask"}, - {56, nullptr, "RequestLocalCommunicationReceiveApplicationTaskRun"}, - {57, nullptr, "GetLocalCommunicationReceiveApplicationTaskInfo"}, - {58, nullptr, "CommitLocalCommunicationReceiveApplicationTask"}, - {59, nullptr, "ListLocalCommunicationReceiveApplicationTaskContentMeta"}, - {60, nullptr, "CreateLocalCommunicationSendApplicationTask"}, - {61, nullptr, "RequestLocalCommunicationSendApplicationTaskRun"}, - {62, nullptr, "GetLocalCommunicationReceiveApplicationTaskErrorContext"}, - {63, nullptr, "GetLocalCommunicationSendApplicationTaskInfo"}, - {64, nullptr, "DestroyLocalCommunicationSendApplicationTask"}, - {65, nullptr, "GetLocalCommunicationSendApplicationTaskErrorContext"}, - {66, nullptr, "CalculateLocalCommunicationReceiveApplicationTaskRequiredSize"}, - {67, nullptr, "ListApplicationLocalCommunicationReceiveApplicationTask"}, - {68, nullptr, "ListApplicationLocalCommunicationSendApplicationTask"}, - {69, nullptr, "CreateLocalCommunicationReceiveSystemUpdateTask"}, - {70, nullptr, "DestroyLocalCommunicationReceiveSystemUpdateTask"}, - {71, nullptr, "ListLocalCommunicationReceiveSystemUpdateTask"}, - {72, nullptr, "RequestLocalCommunicationReceiveSystemUpdateTaskRun"}, - {73, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskInfo"}, - {74, nullptr, "CommitLocalCommunicationReceiveSystemUpdateTask"}, - {75, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskErrorContext"}, - {76, nullptr, "CreateLocalCommunicationSendSystemUpdateTask"}, - {77, nullptr, "RequestLocalCommunicationSendSystemUpdateTaskRun"}, - {78, nullptr, "GetLocalCommunicationSendSystemUpdateTaskInfo"}, - {79, nullptr, "DestroyLocalCommunicationSendSystemUpdateTask"}, - {80, nullptr, "GetLocalCommunicationSendSystemUpdateTaskErrorContext"}, - {81, nullptr, "ListLocalCommunicationSendSystemUpdateTask"}, - {82, nullptr, "GetReceivedSystemDataPath"}, - {83, nullptr, "CalculateApplyDeltaTaskOccupiedSize"}, - {84, nullptr, "ReloadErrorSimulation"}, - {85, nullptr, "ListNetworkInstallTaskContentMetaFromInstallMeta"}, - {86, nullptr, "ListNetworkInstallTaskOccupiedSize"}, - {87, nullptr, "RequestQueryAvailableELicenses"}, - {88, nullptr, "RequestAssignELicenses"}, - {89, nullptr, "RequestExtendELicenses"}, - {90, nullptr, "RequestSyncELicenses"}, - {91, nullptr, "Unknown91"}, //6.0.0-14.1.2 - {92, nullptr, "Unknown92"}, //21.0.0+ - {93, nullptr, "RequestReportActiveELicenses"}, - {94, nullptr, "RequestReportActiveELicensesPassively"}, - {95, nullptr, "RequestRegisterDynamicRightsNotificationToken"}, - {96, nullptr, "RequestAssignAllDeviceLinkedELicenses"}, - {97, nullptr, "RequestRevokeAllELicenses"}, - {98, nullptr, "RequestPrefetchForDynamicRights"}, - {99, nullptr, "CreateNetworkInstallTask"}, - {100, nullptr, "ListNetworkInstallTaskRightsIds"}, - {101, nullptr, "RequestDownloadETickets"}, - {102, nullptr, "RequestQueryDownloadableContents"}, - {103, nullptr, "DeleteNetworkInstallTaskContentMeta"}, - {104, nullptr, "RequestIssueEdgeTokenForDebug"}, - {105, nullptr, "RequestQueryAvailableELicenses2"}, - {106, nullptr, "RequestAssignELicenses2"}, - {107, nullptr, "GetNetworkInstallTaskStateCounter"}, - {108, nullptr, "InvalidateDynamicRightsNaIdTokenCacheForDebug"}, - {109, nullptr, "ListNetworkInstallTaskPartialInstallContentMeta"}, - {110, nullptr, "ListNetworkInstallTaskRightsIdsFromIndex"}, - {111, nullptr, "AddNetworkInstallTaskContentMetaForUser"}, - {112, nullptr, "RequestAssignELicensesAndDownloadETickets"}, - {113, nullptr, "RequestQueryAvailableCommonELicenses"}, - {114, nullptr, "SetNetworkInstallTaskExtendedAttribute"}, - {115, nullptr, "GetNetworkInstallTaskExtendedAttribute"}, - {116, nullptr, "GetAllocatorInfo"}, - {117, nullptr, "RequestQueryDownloadableContentsByApplicationId"}, - {118, nullptr, "MarkNoDownloadRightsErrorResolved"}, - {119, nullptr, "GetApplyDeltaTaskAllAppliedContentMeta"}, - {120, nullptr, "PrioritizeNetworkInstallTask"}, - {121, nullptr, "RequestQueryAvailableCommonELicenses2"}, - {122, nullptr, "RequestAssignCommonELicenses"}, - {123, nullptr, "RequestAssignCommonELicenses2"}, - {124, nullptr, "IsNetworkInstallTaskFrontOfQueue"}, - {125, nullptr, "PrioritizeApplyDeltaTask"}, - {126, nullptr, "RerouteDownloadingPatch"}, - {127, nullptr, "UnmarkNoDownloadRightsErrorResolved"}, - {128, nullptr, "RequestContentsSize"}, - {129, nullptr, "RequestContentsAuthorizationToken"}, - {130, nullptr, "RequestCdnVendorDiscovery"}, - {131, nullptr, "RefreshDebugAvailability"}, - {132, nullptr, "ClearResponseSimulationEntry"}, - {133, nullptr, "RegisterResponseSimulationEntry"}, - {134, nullptr, "GetProcessedCdnVendors"}, - {135, nullptr, "RefreshRuntimeBehaviorsForDebug"}, - {136, nullptr, "RequestOnlineSubscriptionFreeTrialAvailability"}, - {137, nullptr, "GetNetworkInstallTaskContentMetaCount"}, - {138, nullptr, "RequestRevokeELicenses"}, - {139, nullptr, "EnableNetworkConnectionToUseApplicationCore"}, - {140, nullptr, "DisableNetworkConnectionToUseApplicationCore"}, - {141, nullptr, "IsNetworkConnectionEnabledToUseApplicationCore"}, - {142, nullptr, "RequestCheckSafeSystemVersion"}, - {143, nullptr, "RequestApplicationIcon"}, - {144, nullptr, "RequestDownloadIdbeIconFile"}, - {147, nullptr, "Unknown147"}, //18.0.0+ - {148, nullptr, "Unknown148"}, //18.0.0+ - {150, nullptr, "Unknown150"}, //19.0.0+ - {151, nullptr, "Unknown151"}, //20.0.0+ - {152, nullptr, "Unknown152"}, //20.0.0+ - {153, nullptr, "Unknown153"}, //20.0.0+ - {154, nullptr, "Unknown154"}, //20.0.0+ - {155, nullptr, "Unknown155"}, //20.0.0+ - {156, nullptr, "Unknown156"}, //20.0.0+ - {157, nullptr, "Unknown157"}, //20.0.0+ - {158, nullptr, "Unknown158"}, //20.0.0+ - {159, nullptr, "Unknown159"}, //20.0.0+ - {160, nullptr, "Unknown160"}, //20.0.0+ - {161, nullptr, "Unknown161"}, //20.0.0+ - {162, nullptr, "Unknown162"}, //20.0.0+ - {163, nullptr, "Unknown163"}, //20.0.0+ - {164, nullptr, "Unknown164"}, //20.0.0+ - {165, nullptr, "Unknown165"}, //20.0.0+ - {166, nullptr, "Unknown166"}, //20.0.0+ - {167, nullptr, "Unknown167"}, //20.0.0+ - {168, nullptr, "Unknown168"}, //20.0.0+ - {169, nullptr, "Unknown169"}, //20.0.0+ - {170, nullptr, "Unknown170"}, //20.0.0+ - {171, nullptr, "Unknown171"}, //20.0.0+ - {172, nullptr, "Unknown172"}, //20.0.0+ - {173, nullptr, "Unknown173"}, //20.0.0+ - {174, nullptr, "Unknown174"}, //20.0.0+ - {175, nullptr, "Unknown175"}, //20.0.0+ - {176, nullptr, "Unknown176"}, //20.0.0+ - {177, nullptr, "Unknown177"}, //20.0.0+ - {2000, nullptr, "Unknown2000"}, //20.0.0+ - {2001, nullptr, "Unknown2001"}, //20.0.0+ - {2002, nullptr, "Unknown2002"}, //20.0.0+ - {2003, nullptr, "Unknown2003"}, //20.0.0+ - {2004, nullptr, "Unknown2004"}, //20.0.0+ - {2007, nullptr, "Unknown2007"}, //20.0.0+ - {2011, nullptr, "Unknown2011"}, //20.0.0+ - {2012, nullptr, "Unknown2012"}, //20.0.0+ - {2013, nullptr, "Unknown2013"}, //20.0.0+ - {2014, nullptr, "Unknown2014"}, //20.0.0+ - {2015, nullptr, "Unknown2015"}, //20.0.0+ - {2016, nullptr, "Unknown2016"}, //20.0.0+ - {2017, nullptr, "Unknown2017"}, //20.0.0+ - {2018, nullptr, "Unknown2018"}, //20.0.0+ - {2019, nullptr, "Unknown2019"}, //20.0.0+ - {2020, nullptr, "Unknown2020"}, //20.0.0+ - {2021, nullptr, "Unknown2021"}, //20.0.0+ - {2022, nullptr, "Unknown2022"}, //20.0.0+ - {2023, nullptr, "Unknown2023"}, //20.0.0+ - {2024, nullptr, "Unknown2024"}, //20.0.0+ - {2025, nullptr, "Unknown2025"}, //20.0.0+ - {2026, nullptr, "Unknown2026"}, //20.0.0+ - {2027, nullptr, "Unknown2027"}, //20.0.0+ - {2028, nullptr, "Unknown2028"}, //20.0.0+ - {2029, nullptr, "Unknown2029"}, //20.0.0+ - {2030, nullptr, "Unknown2030"}, //20.0.0+ - {2031, nullptr, "Unknown2031"}, //20.0.0+ - {2032, nullptr, "Unknown2032"}, //20.0.0+ - {2033, nullptr, "Unknown2033"}, //20.0.0+ - {2034, nullptr, "Unknown2034"}, //20.0.0+ - {2035, nullptr, "Unknown2035"}, //20.0.0+ - {2036, nullptr, "Unknown2036"}, //20.0.0+ - {2037, nullptr, "Unknown2037"}, //20.0.0+ - {2038, nullptr, "Unknown2038"}, //20.0.0+ - {2039, nullptr, "Unknown2039"}, //20.0.0+ - {2040, nullptr, "Unknown2040"}, //20.0.0+ - {2041, nullptr, "Unknown2041"}, //20.0.0+ - {2042, nullptr, "Unknown2042"}, //20.0.0+ - {2043, nullptr, "Unknown2043"}, //20.0.0+ - {2044, nullptr, "Unknown2044"}, //20.0.0+ - {2045, nullptr, "Unknown2045"}, //20.0.0+ - {2046, nullptr, "Unknown2046"}, //20.0.0+ - {2047, nullptr, "Unknown2047"}, //20.0.0+ - {2048, nullptr, "Unknown2048"}, //20.0.0+ - {2049, nullptr, "Unknown2049"}, //20.0.0+ - {2050, nullptr, "Unknown2050"}, //20.0.0+ - {2051, nullptr, "Unknown2051"}, //20.0.0+ - {3000, nullptr, "RequestLatestApplicationIcon"}, //17.0.0+ - {3001, nullptr, "RequestDownloadIdbeLatestIconFile"}, //17.0.0+ - }; - // clang-format on + explicit NIM(Core::System& system_) : ServiceFramework{system_, "nim"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "CreateSystemUpdateTask"}, + FunctionInfo{1, nullptr, "DestroySystemUpdateTask"}, + FunctionInfo{2, nullptr, "ListSystemUpdateTask"}, + FunctionInfo{3, nullptr, "RequestSystemUpdateTaskRun"}, + FunctionInfo{4, nullptr, "GetSystemUpdateTaskInfo"}, + FunctionInfo{5, nullptr, "CommitSystemUpdateTask"}, + FunctionInfo{6, nullptr, "CreateNetworkInstallTask"}, + FunctionInfo{7, nullptr, "DestroyNetworkInstallTask"}, + FunctionInfo{8, nullptr, "ListNetworkInstallTask"}, + FunctionInfo{9, nullptr, "RequestNetworkInstallTaskRun"}, + FunctionInfo{10, nullptr, "GetNetworkInstallTaskInfo"}, + FunctionInfo{11, nullptr, "CommitNetworkInstallTask"}, + FunctionInfo{12, nullptr, "RequestLatestSystemUpdateMeta"}, + FunctionInfo{14, nullptr, "ListApplicationNetworkInstallTask"}, + FunctionInfo{15, nullptr, "ListNetworkInstallTaskContentMeta"}, + FunctionInfo{16, nullptr, "RequestLatestVersion"}, + FunctionInfo{17, nullptr, "SetNetworkInstallTaskAttribute"}, + FunctionInfo{18, nullptr, "AddNetworkInstallTaskContentMeta"}, + FunctionInfo{19, nullptr, "GetDownloadedSystemDataPath"}, + FunctionInfo{20, nullptr, "CalculateNetworkInstallTaskRequiredSize"}, + FunctionInfo{21, nullptr, "IsExFatDriverIncluded"}, + FunctionInfo{22, nullptr, "GetBackgroundDownloadStressTaskInfo"}, + FunctionInfo{23, nullptr, "RequestDeviceAuthenticationToken"}, + FunctionInfo{24, nullptr, "RequestGameCardRegistrationStatus"}, + FunctionInfo{25, nullptr, "RequestRegisterGameCard"}, + FunctionInfo{26, nullptr, "RequestRegisterNotificationToken"}, + FunctionInfo{27, nullptr, "RequestDownloadTaskList"}, + FunctionInfo{28, nullptr, "RequestApplicationControl"}, + FunctionInfo{29, nullptr, "RequestLatestApplicationControl"}, + FunctionInfo{30, nullptr, "RequestVersionList"}, + FunctionInfo{31, nullptr, "CreateApplyDeltaTask"}, + FunctionInfo{32, nullptr, "DestroyApplyDeltaTask"}, + FunctionInfo{33, nullptr, "ListApplicationApplyDeltaTask"}, + FunctionInfo{34, nullptr, "RequestApplyDeltaTaskRun"}, + FunctionInfo{35, nullptr, "GetApplyDeltaTaskInfo"}, + FunctionInfo{36, nullptr, "ListApplyDeltaTask"}, + FunctionInfo{37, nullptr, "CommitApplyDeltaTask"}, + FunctionInfo{38, nullptr, "CalculateApplyDeltaTaskRequiredSize"}, + FunctionInfo{39, nullptr, "PrepareShutdown"}, + FunctionInfo{40, nullptr, "ListApplyDeltaTask"}, + FunctionInfo{41, nullptr, "ClearNotEnoughSpaceStateOfApplyDeltaTask"}, + FunctionInfo{42, nullptr, "CreateApplyDeltaTaskFromDownloadTask"}, + FunctionInfo{43, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"}, + FunctionInfo{44, nullptr, "GetApplyDeltaTaskRequiredStorage"}, + FunctionInfo{45, nullptr, "CalculateNetworkInstallTaskContentsSize"}, + FunctionInfo{46, nullptr, "PrepareShutdownForSystemUpdate"}, + FunctionInfo{47, nullptr, "FindMaxRequiredApplicationVersionOfTask"}, + FunctionInfo{48, nullptr, "CommitNetworkInstallTaskPartially"}, + FunctionInfo{49, nullptr, "ListNetworkInstallTaskCommittedContentMeta"}, + FunctionInfo{50, nullptr, "ListNetworkInstallTaskNotCommittedContentMeta"}, + FunctionInfo{51, nullptr, "FindMaxRequiredSystemVersionOfTask"}, + FunctionInfo{52, nullptr, "GetNetworkInstallTaskErrorContext"}, + FunctionInfo{53, nullptr, "CreateLocalCommunicationReceiveApplicationTask"}, + FunctionInfo{54, nullptr, "DestroyLocalCommunicationReceiveApplicationTask"}, + FunctionInfo{55, nullptr, "ListLocalCommunicationReceiveApplicationTask"}, + FunctionInfo{56, nullptr, "RequestLocalCommunicationReceiveApplicationTaskRun"}, + FunctionInfo{57, nullptr, "GetLocalCommunicationReceiveApplicationTaskInfo"}, + FunctionInfo{58, nullptr, "CommitLocalCommunicationReceiveApplicationTask"}, + FunctionInfo{59, nullptr, "ListLocalCommunicationReceiveApplicationTaskContentMeta"}, + FunctionInfo{60, nullptr, "CreateLocalCommunicationSendApplicationTask"}, + FunctionInfo{61, nullptr, "RequestLocalCommunicationSendApplicationTaskRun"}, + FunctionInfo{62, nullptr, "GetLocalCommunicationReceiveApplicationTaskErrorContext"}, + FunctionInfo{63, nullptr, "GetLocalCommunicationSendApplicationTaskInfo"}, + FunctionInfo{64, nullptr, "DestroyLocalCommunicationSendApplicationTask"}, + FunctionInfo{65, nullptr, "GetLocalCommunicationSendApplicationTaskErrorContext"}, + FunctionInfo{66, nullptr, "CalculateLocalCommunicationReceiveApplicationTaskRequiredSize"}, + FunctionInfo{67, nullptr, "ListApplicationLocalCommunicationReceiveApplicationTask"}, + FunctionInfo{68, nullptr, "ListApplicationLocalCommunicationSendApplicationTask"}, + FunctionInfo{69, nullptr, "CreateLocalCommunicationReceiveSystemUpdateTask"}, + FunctionInfo{70, nullptr, "DestroyLocalCommunicationReceiveSystemUpdateTask"}, + FunctionInfo{71, nullptr, "ListLocalCommunicationReceiveSystemUpdateTask"}, + FunctionInfo{72, nullptr, "RequestLocalCommunicationReceiveSystemUpdateTaskRun"}, + FunctionInfo{73, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskInfo"}, + FunctionInfo{74, nullptr, "CommitLocalCommunicationReceiveSystemUpdateTask"}, + FunctionInfo{75, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskErrorContext"}, + FunctionInfo{76, nullptr, "CreateLocalCommunicationSendSystemUpdateTask"}, + FunctionInfo{77, nullptr, "RequestLocalCommunicationSendSystemUpdateTaskRun"}, + FunctionInfo{78, nullptr, "GetLocalCommunicationSendSystemUpdateTaskInfo"}, + FunctionInfo{79, nullptr, "DestroyLocalCommunicationSendSystemUpdateTask"}, + FunctionInfo{80, nullptr, "GetLocalCommunicationSendSystemUpdateTaskErrorContext"}, + FunctionInfo{81, nullptr, "ListLocalCommunicationSendSystemUpdateTask"}, + FunctionInfo{82, nullptr, "GetReceivedSystemDataPath"}, + FunctionInfo{83, nullptr, "CalculateApplyDeltaTaskOccupiedSize"}, + FunctionInfo{84, nullptr, "ReloadErrorSimulation"}, + FunctionInfo{85, nullptr, "ListNetworkInstallTaskContentMetaFromInstallMeta"}, + FunctionInfo{86, nullptr, "ListNetworkInstallTaskOccupiedSize"}, + FunctionInfo{87, nullptr, "RequestQueryAvailableELicenses"}, + FunctionInfo{88, nullptr, "RequestAssignELicenses"}, + FunctionInfo{89, nullptr, "RequestExtendELicenses"}, + FunctionInfo{90, nullptr, "RequestSyncELicenses"}, + FunctionInfo{91, nullptr, "Unknown91", MakeVersionGate({6,0,0}, {14,1,2})}, + FunctionInfo{92, nullptr, "Unknown92", MakeVersionGate({21,0,0})}, + FunctionInfo{93, nullptr, "RequestReportActiveELicenses"}, + FunctionInfo{94, nullptr, "RequestReportActiveELicensesPassively"}, + FunctionInfo{95, nullptr, "RequestRegisterDynamicRightsNotificationToken"}, + FunctionInfo{96, nullptr, "RequestAssignAllDeviceLinkedELicenses"}, + FunctionInfo{97, nullptr, "RequestRevokeAllELicenses"}, + FunctionInfo{98, nullptr, "RequestPrefetchForDynamicRights"}, + FunctionInfo{99, nullptr, "CreateNetworkInstallTask"}, + FunctionInfo{100, nullptr, "ListNetworkInstallTaskRightsIds"}, + FunctionInfo{101, nullptr, "RequestDownloadETickets"}, + FunctionInfo{102, nullptr, "RequestQueryDownloadableContents"}, + FunctionInfo{103, nullptr, "DeleteNetworkInstallTaskContentMeta"}, + FunctionInfo{104, nullptr, "RequestIssueEdgeTokenForDebug"}, + FunctionInfo{105, nullptr, "RequestQueryAvailableELicenses2"}, + FunctionInfo{106, nullptr, "RequestAssignELicenses2"}, + FunctionInfo{107, nullptr, "GetNetworkInstallTaskStateCounter"}, + FunctionInfo{108, nullptr, "InvalidateDynamicRightsNaIdTokenCacheForDebug"}, + FunctionInfo{109, nullptr, "ListNetworkInstallTaskPartialInstallContentMeta"}, + FunctionInfo{110, nullptr, "ListNetworkInstallTaskRightsIdsFromIndex"}, + FunctionInfo{111, nullptr, "AddNetworkInstallTaskContentMetaForUser"}, + FunctionInfo{112, nullptr, "RequestAssignELicensesAndDownloadETickets"}, + FunctionInfo{113, nullptr, "RequestQueryAvailableCommonELicenses"}, + FunctionInfo{114, nullptr, "SetNetworkInstallTaskExtendedAttribute"}, + FunctionInfo{115, nullptr, "GetNetworkInstallTaskExtendedAttribute"}, + FunctionInfo{116, nullptr, "GetAllocatorInfo"}, + FunctionInfo{117, nullptr, "RequestQueryDownloadableContentsByApplicationId"}, + FunctionInfo{118, nullptr, "MarkNoDownloadRightsErrorResolved"}, + FunctionInfo{119, nullptr, "GetApplyDeltaTaskAllAppliedContentMeta"}, + FunctionInfo{120, nullptr, "PrioritizeNetworkInstallTask"}, + FunctionInfo{121, nullptr, "RequestQueryAvailableCommonELicenses2"}, + FunctionInfo{122, nullptr, "RequestAssignCommonELicenses"}, + FunctionInfo{123, nullptr, "RequestAssignCommonELicenses2"}, + FunctionInfo{124, nullptr, "IsNetworkInstallTaskFrontOfQueue"}, + FunctionInfo{125, nullptr, "PrioritizeApplyDeltaTask"}, + FunctionInfo{126, nullptr, "RerouteDownloadingPatch"}, + FunctionInfo{127, nullptr, "UnmarkNoDownloadRightsErrorResolved"}, + FunctionInfo{128, nullptr, "RequestContentsSize"}, + FunctionInfo{129, nullptr, "RequestContentsAuthorizationToken"}, + FunctionInfo{130, nullptr, "RequestCdnVendorDiscovery"}, + FunctionInfo{131, nullptr, "RefreshDebugAvailability"}, + FunctionInfo{132, nullptr, "ClearResponseSimulationEntry"}, + FunctionInfo{133, nullptr, "RegisterResponseSimulationEntry"}, + FunctionInfo{134, nullptr, "GetProcessedCdnVendors"}, + FunctionInfo{135, nullptr, "RefreshRuntimeBehaviorsForDebug"}, + FunctionInfo{136, nullptr, "RequestOnlineSubscriptionFreeTrialAvailability"}, + FunctionInfo{137, nullptr, "GetNetworkInstallTaskContentMetaCount"}, + FunctionInfo{138, nullptr, "RequestRevokeELicenses"}, + FunctionInfo{139, nullptr, "EnableNetworkConnectionToUseApplicationCore"}, + FunctionInfo{140, nullptr, "DisableNetworkConnectionToUseApplicationCore"}, + FunctionInfo{141, nullptr, "IsNetworkConnectionEnabledToUseApplicationCore"}, + FunctionInfo{142, nullptr, "RequestCheckSafeSystemVersion"}, + FunctionInfo{143, nullptr, "RequestApplicationIcon"}, + FunctionInfo{144, nullptr, "RequestDownloadIdbeIconFile"}, + FunctionInfo{147, nullptr, "Unknown147", MakeVersionGate({18,0,0})}, + FunctionInfo{148, nullptr, "Unknown148", MakeVersionGate({18,0,0})}, + FunctionInfo{150, nullptr, "Unknown150", MakeVersionGate({19,0,0})}, + FunctionInfo{151, nullptr, "Unknown151", MakeVersionGate({20,0,0})}, + FunctionInfo{152, nullptr, "Unknown152", MakeVersionGate({20,0,0})}, + FunctionInfo{153, nullptr, "Unknown153", MakeVersionGate({20,0,0})}, + FunctionInfo{154, nullptr, "Unknown154", MakeVersionGate({20,0,0})}, + FunctionInfo{155, nullptr, "Unknown155", MakeVersionGate({20,0,0})}, + FunctionInfo{156, nullptr, "Unknown156", MakeVersionGate({20,0,0})}, + FunctionInfo{157, nullptr, "Unknown157", MakeVersionGate({20,0,0})}, + FunctionInfo{158, nullptr, "Unknown158", MakeVersionGate({20,0,0})}, + FunctionInfo{159, nullptr, "Unknown159", MakeVersionGate({20,0,0})}, + FunctionInfo{160, nullptr, "Unknown160", MakeVersionGate({20,0,0})}, + FunctionInfo{161, nullptr, "Unknown161", MakeVersionGate({20,0,0})}, + FunctionInfo{162, nullptr, "Unknown162", MakeVersionGate({20,0,0})}, + FunctionInfo{163, nullptr, "Unknown163", MakeVersionGate({20,0,0})}, + FunctionInfo{164, nullptr, "Unknown164", MakeVersionGate({20,0,0})}, + FunctionInfo{165, nullptr, "Unknown165", MakeVersionGate({20,0,0})}, + FunctionInfo{166, nullptr, "Unknown166", MakeVersionGate({20,0,0})}, + FunctionInfo{167, nullptr, "Unknown167", MakeVersionGate({20,0,0})}, + FunctionInfo{168, nullptr, "Unknown168", MakeVersionGate({20,0,0})}, + FunctionInfo{169, nullptr, "Unknown169", MakeVersionGate({20,0,0})}, + FunctionInfo{170, nullptr, "Unknown170", MakeVersionGate({20,0,0})}, + FunctionInfo{171, nullptr, "Unknown171", MakeVersionGate({20,0,0})}, + FunctionInfo{172, nullptr, "Unknown172", MakeVersionGate({20,0,0})}, + FunctionInfo{173, nullptr, "Unknown173", MakeVersionGate({20,0,0})}, + FunctionInfo{174, nullptr, "Unknown174", MakeVersionGate({20,0,0})}, + FunctionInfo{175, nullptr, "Unknown175", MakeVersionGate({20,0,0})}, + FunctionInfo{176, nullptr, "Unknown176", MakeVersionGate({20,0,0})}, + FunctionInfo{177, nullptr, "Unknown177", MakeVersionGate({20,0,0})}, + FunctionInfo{2000, nullptr, "Unknown2000", MakeVersionGate({20,0,0})}, + FunctionInfo{2001, nullptr, "Unknown2001", MakeVersionGate({20,0,0})}, + FunctionInfo{2002, nullptr, "Unknown2002", MakeVersionGate({20,0,0})}, + FunctionInfo{2003, nullptr, "Unknown2003", MakeVersionGate({20,0,0})}, + FunctionInfo{2004, nullptr, "Unknown2004", MakeVersionGate({20,0,0})}, + FunctionInfo{2007, nullptr, "Unknown2007", MakeVersionGate({20,0,0})}, + FunctionInfo{2011, nullptr, "Unknown2011", MakeVersionGate({20,0,0})}, + FunctionInfo{2012, nullptr, "Unknown2012", MakeVersionGate({20,0,0})}, + FunctionInfo{2013, nullptr, "Unknown2013", MakeVersionGate({20,0,0})}, + FunctionInfo{2014, nullptr, "Unknown2014", MakeVersionGate({20,0,0})}, + FunctionInfo{2015, nullptr, "Unknown2015", MakeVersionGate({20,0,0})}, + FunctionInfo{2016, nullptr, "Unknown2016", MakeVersionGate({20,0,0})}, + FunctionInfo{2017, nullptr, "Unknown2017", MakeVersionGate({20,0,0})}, + FunctionInfo{2018, nullptr, "Unknown2018", MakeVersionGate({20,0,0})}, + FunctionInfo{2019, nullptr, "Unknown2019", MakeVersionGate({20,0,0})}, + FunctionInfo{2020, nullptr, "Unknown2020", MakeVersionGate({20,0,0})}, + FunctionInfo{2021, nullptr, "Unknown2021", MakeVersionGate({20,0,0})}, + FunctionInfo{2022, nullptr, "Unknown2022", MakeVersionGate({20,0,0})}, + FunctionInfo{2023, nullptr, "Unknown2023", MakeVersionGate({20,0,0})}, + FunctionInfo{2024, nullptr, "Unknown2024", MakeVersionGate({20,0,0})}, + FunctionInfo{2025, nullptr, "Unknown2025", MakeVersionGate({20,0,0})}, + FunctionInfo{2026, nullptr, "Unknown2026", MakeVersionGate({20,0,0})}, + FunctionInfo{2027, nullptr, "Unknown2027", MakeVersionGate({20,0,0})}, + FunctionInfo{2028, nullptr, "Unknown2028", MakeVersionGate({20,0,0})}, + FunctionInfo{2029, nullptr, "Unknown2029", MakeVersionGate({20,0,0})}, + FunctionInfo{2030, nullptr, "Unknown2030", MakeVersionGate({20,0,0})}, + FunctionInfo{2031, nullptr, "Unknown2031", MakeVersionGate({20,0,0})}, + FunctionInfo{2032, nullptr, "Unknown2032", MakeVersionGate({20,0,0})}, + FunctionInfo{2033, nullptr, "Unknown2033", MakeVersionGate({20,0,0})}, + FunctionInfo{2034, nullptr, "Unknown2034", MakeVersionGate({20,0,0})}, + FunctionInfo{2035, nullptr, "Unknown2035", MakeVersionGate({20,0,0})}, + FunctionInfo{2036, nullptr, "Unknown2036", MakeVersionGate({20,0,0})}, + FunctionInfo{2037, nullptr, "Unknown2037", MakeVersionGate({20,0,0})}, + FunctionInfo{2038, nullptr, "Unknown2038", MakeVersionGate({20,0,0})}, + FunctionInfo{2039, nullptr, "Unknown2039", MakeVersionGate({20,0,0})}, + FunctionInfo{2040, nullptr, "Unknown2040", MakeVersionGate({20,0,0})}, + FunctionInfo{2041, nullptr, "Unknown2041", MakeVersionGate({20,0,0})}, + FunctionInfo{2042, nullptr, "Unknown2042", MakeVersionGate({20,0,0})}, + FunctionInfo{2043, nullptr, "Unknown2043", MakeVersionGate({20,0,0})}, + FunctionInfo{2044, nullptr, "Unknown2044", MakeVersionGate({20,0,0})}, + FunctionInfo{2045, nullptr, "Unknown2045", MakeVersionGate({20,0,0})}, + FunctionInfo{2046, nullptr, "Unknown2046", MakeVersionGate({20,0,0})}, + FunctionInfo{2047, nullptr, "Unknown2047", MakeVersionGate({20,0,0})}, + FunctionInfo{2048, nullptr, "Unknown2048", MakeVersionGate({20,0,0})}, + FunctionInfo{2049, nullptr, "Unknown2049", MakeVersionGate({20,0,0})}, + FunctionInfo{2050, nullptr, "Unknown2050", MakeVersionGate({20,0,0})}, + FunctionInfo{2051, nullptr, "Unknown2051", MakeVersionGate({20,0,0})}, + FunctionInfo{3000, nullptr, "RequestLatestApplicationIcon", MakeVersionGate({17,0,0})}, + FunctionInfo{3001, nullptr, "RequestDownloadIdbeLatestIconFile", MakeVersionGate({17,0,0})} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class NIM_ECA final : public ServiceFramework { public: - explicit NIM_ECA(Core::System& system_) : ServiceFramework{system_, "nim:eca"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &NIM_ECA::CreateServerInterface, "CreateServerInterface"}, - {1, nullptr, "RefreshDebugAvailability"}, - {2, nullptr, "ClearDebugResponse"}, - {3, nullptr, "RegisterDebugResponse"}, - {4, &NIM_ECA::IsLargeResourceAvailable, "IsLargeResourceAvailable"}, - {5, &NIM_ECA::CreateServerInterface2, "CreateServerInterface2"} // 17.0.0+ - }; - // clang-format on + explicit NIM_ECA(Core::System& system_) : ServiceFramework{system_, "nim:eca"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -463,45 +450,53 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &NIM_ECA::CreateServerInterface, "CreateServerInterface"}, + FunctionInfo{1, nullptr, "RefreshDebugAvailability"}, + FunctionInfo{2, nullptr, "ClearDebugResponse"}, + FunctionInfo{3, nullptr, "RegisterDebugResponse"}, + FunctionInfo{4, &NIM_ECA::IsLargeResourceAvailable, "IsLargeResourceAvailable"}, + FunctionInfo{5, &NIM_ECA::CreateServerInterface2, "CreateServerInterface2", MakeVersionGate({17,0,0})} + ); }; class NIM_SHP final : public ServiceFramework { public: - explicit NIM_SHP(Core::System& system_) : ServiceFramework{system_, "nim:shp"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestDeviceAuthenticationToken"}, - {1, nullptr, "RequestCachedDeviceAuthenticationToken"}, - {2, nullptr, "RequestEdgeToken"}, - {3, nullptr, "RequestCachedEdgeToken"}, - {100, nullptr, "RequestRegisterDeviceAccount"}, - {101, nullptr, "RequestUnregisterDeviceAccount"}, - {102, nullptr, "RequestDeviceAccountStatus"}, - {103, nullptr, "GetDeviceAccountInfo"}, - {104, nullptr, "RequestDeviceRegistrationInfo"}, - {105, nullptr, "RequestTransferDeviceAccount"}, - {106, nullptr, "RequestSyncRegistration"}, - {107, nullptr, "IsOwnDeviceId"}, - {200, nullptr, "RequestRegisterNotificationToken"}, - {300, nullptr, "RequestUnlinkDevice"}, - {301, nullptr, "RequestUnlinkDeviceIntegrated"}, - {302, nullptr, "RequestLinkDevice"}, - {303, nullptr, "HasDeviceLink"}, - {304, nullptr, "RequestUnlinkDeviceAll"}, - {305, nullptr, "RequestCreateVirtualAccount"}, - {306, nullptr, "RequestDeviceLinkStatus"}, - {400, nullptr, "GetAccountByVirtualAccount"}, - {401, nullptr, "GetVirtualAccount"}, - {500, nullptr, "RequestSyncTicketLegacy"}, - {501, nullptr, "RequestDownloadTicket"}, - {502, nullptr, "RequestDownloadTicketForPrepurchasedContents"}, - {503, nullptr, "RequestSyncTicket"}, - {504, nullptr, "RequestDownloadTicketForPrepurchasedContents2"}, - {505, nullptr, "RequestDownloadTicketForPrepurchasedContentsForAccount"}, - }; - // clang-format on + explicit NIM_SHP(Core::System& system_) : ServiceFramework{system_, "nim:shp"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestDeviceAuthenticationToken"}, + FunctionInfo{1, nullptr, "RequestCachedDeviceAuthenticationToken"}, + FunctionInfo{2, nullptr, "RequestEdgeToken"}, + FunctionInfo{3, nullptr, "RequestCachedEdgeToken"}, + FunctionInfo{100, nullptr, "RequestRegisterDeviceAccount"}, + FunctionInfo{101, nullptr, "RequestUnregisterDeviceAccount"}, + FunctionInfo{102, nullptr, "RequestDeviceAccountStatus"}, + FunctionInfo{103, nullptr, "GetDeviceAccountInfo"}, + FunctionInfo{104, nullptr, "RequestDeviceRegistrationInfo"}, + FunctionInfo{105, nullptr, "RequestTransferDeviceAccount"}, + FunctionInfo{106, nullptr, "RequestSyncRegistration"}, + FunctionInfo{107, nullptr, "IsOwnDeviceId"}, + FunctionInfo{200, nullptr, "RequestRegisterNotificationToken"}, + FunctionInfo{300, nullptr, "RequestUnlinkDevice"}, + FunctionInfo{301, nullptr, "RequestUnlinkDeviceIntegrated"}, + FunctionInfo{302, nullptr, "RequestLinkDevice"}, + FunctionInfo{303, nullptr, "HasDeviceLink"}, + FunctionInfo{304, nullptr, "RequestUnlinkDeviceAll"}, + FunctionInfo{305, nullptr, "RequestCreateVirtualAccount"}, + FunctionInfo{306, nullptr, "RequestDeviceLinkStatus"}, + FunctionInfo{400, nullptr, "GetAccountByVirtualAccount"}, + FunctionInfo{401, nullptr, "GetVirtualAccount"}, + FunctionInfo{500, nullptr, "RequestSyncTicketLegacy"}, + FunctionInfo{501, nullptr, "RequestDownloadTicket"}, + FunctionInfo{502, nullptr, "RequestDownloadTicketForPrepurchasedContents"}, + FunctionInfo{503, nullptr, "RequestSyncTicket"}, + FunctionInfo{504, nullptr, "RequestDownloadTicketForPrepurchasedContents2"}, + FunctionInfo{505, nullptr, "RequestDownloadTicketForPrepurchasedContentsForAccount"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; @@ -511,19 +506,7 @@ public: explicit IEnsureNetworkClockAvailabilityService(Core::System& system_) : ServiceFramework{system_, "IEnsureNetworkClockAvailabilityService"}, service_context{system_, "IEnsureNetworkClockAvailabilityService"} { - static const FunctionInfo functions[] = { - {0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"}, - {1, &IEnsureNetworkClockAvailabilityService::GetFinishNotificationEvent, - "GetFinishNotificationEvent"}, - {2, &IEnsureNetworkClockAvailabilityService::GetResult, "GetResult"}, - {3, &IEnsureNetworkClockAvailabilityService::Cancel, "Cancel"}, - {4, &IEnsureNetworkClockAvailabilityService::IsProcessing, "IsProcessing"}, - {5, &IEnsureNetworkClockAvailabilityService::GetServerTime, "GetServerTime"}, - }; - RegisterHandlers(functions); - - finished_event = - service_context.CreateEvent("IEnsureNetworkClockAvailabilityService:FinishEvent"); + finished_event = service_context.CreateEvent("IEnsureNetworkClockAvailabilityService:FinishEvent"); } ~IEnsureNetworkClockAvailabilityService() override { @@ -580,23 +563,27 @@ private: rb.PushRaw(server_time); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"}, + FunctionInfo{1, &IEnsureNetworkClockAvailabilityService::GetFinishNotificationEvent, "GetFinishNotificationEvent"}, + FunctionInfo{2, &IEnsureNetworkClockAvailabilityService::GetResult, "GetResult"}, + FunctionInfo{3, &IEnsureNetworkClockAvailabilityService::Cancel, "Cancel"}, + FunctionInfo{4, &IEnsureNetworkClockAvailabilityService::IsProcessing, "IsProcessing"}, + FunctionInfo{5, &IEnsureNetworkClockAvailabilityService::GetServerTime, "GetServerTime"} + ); KernelHelpers::ServiceContext service_context; - Kernel::KEvent* finished_event; }; class NTC final : public ServiceFramework { public: - explicit NTC(Core::System& system_) : ServiceFramework{system_, "ntc"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &NTC::OpenEnsureNetworkClockAvailabilityService, "OpenEnsureNetworkClockAvailabilityService"}, - {100, &NTC::SuspendAutonomicTimeCorrection, "SuspendAutonomicTimeCorrection"}, - {101, &NTC::ResumeAutonomicTimeCorrection, "ResumeAutonomicTimeCorrection"}, - }; - // clang-format on + explicit NTC(Core::System& system_) : ServiceFramework{system_, "ntc"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -622,18 +609,24 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &NTC::OpenEnsureNetworkClockAvailabilityService, "OpenEnsureNetworkClockAvailabilityService"}, + FunctionInfo{100, &NTC::SuspendAutonomicTimeCorrection, "SuspendAutonomicTimeCorrection"}, + FunctionInfo{101, &NTC::ResumeAutonomicTimeCorrection, "ResumeAutonomicTimeCorrection"} + ); }; class NIM_ECAS final : public ServiceFramework { public: - explicit NIM_ECAS(Core::System& system_) : ServiceFramework{system_, "nim:ecas"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RegisterSpecialClient"}, - {1, nullptr, "UnregisterSpecialClient"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit NIM_ECAS(Core::System& system_) : ServiceFramework{system_, "nim:ecas"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RegisterSpecialClient"}, + FunctionInfo{1, nullptr, "UnregisterSpecialClient"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/npns/npns.cpp b/src/core/hle/service/npns/npns.cpp index b0f74bef06..90bf633e8b 100644 --- a/src/core/hle/service/npns/npns.cpp +++ b/src/core/hle/service/npns/npns.cpp @@ -19,79 +19,10 @@ class INpnsSystem final : public ServiceFramework { public: explicit INpnsSystem(Core::System& system_) : ServiceFramework{system_, "npns:s"}, service_context{system, "npns:s"}, - get_receive_event{service_context}, get_request_change_state_cancel_event{service_context} { - // clang-format off - static const FunctionInfo functions[] = { - {1, nullptr, "ListenAll"}, - {2, C<&INpnsSystem::ListenTo>, "ListenTo"}, - {3, nullptr, "Receive"}, - {4, nullptr, "ReceiveRaw"}, - {5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"}, - {6, nullptr, "ListenUndelivered"}, - {7, nullptr, "GetStateChangeEvent"}, - {8, C<&INpnsSystem::ListenToByName>, "ListenToByName"}, - {11, nullptr, "SubscribeTopic"}, - {12, nullptr, "UnsubscribeTopic"}, - {13, nullptr, "QueryIsTopicExist"}, - {14, nullptr, "SubscribeTopicByAccount"}, // 18.0.0+ - {15, nullptr, "UnsubscribeTopicByAccount"}, // 18.0.0+ - {16, nullptr, "DownloadSubscriptionList"}, // 18.0.0+ - {21, nullptr, "CreateToken"}, - {22, nullptr, "CreateTokenWithApplicationId"}, - {23, nullptr, "DestroyToken"}, - {24, nullptr, "DestroyTokenWithApplicationId"}, - {25, nullptr, "QueryIsTokenValid"}, - {26, nullptr, "ListenToMyApplicationId"}, - {27, nullptr, "DestroyTokenAll"}, - {28, nullptr, "CreateTokenWithName"}, // 18.0.0+ - {29, nullptr, "DestroyTokenWithName"}, // 18.0.0+ - {31, nullptr, "UploadTokenToBaaS"}, - {32, nullptr, "DestroyTokenForBaaS"}, - {33, nullptr, "CreateTokenForBaaS"}, - {34, nullptr, "SetBaaSDeviceAccountIdList"}, - {35, nullptr, "LinkNsaId"}, // 17.0.0+ - {36, nullptr, "UnlinkNsaId"}, // 17.0.0+ - {37, nullptr, "RelinkNsaId"}, // 18.0.0+ - {40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent"}, // 17.0.0+ - {41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid"}, // 17.0.0+ - {42, nullptr, "SetNetworkServiceAccountIdTokenSuccess"}, // 17.0.0+ - {43, nullptr, "SetNetworkServiceAccountIdTokenFailure"}, // 17.0.0+ - {44, nullptr, "SetUidList"}, // 17.0.0+ - {45, nullptr, "PutDigitalTwinKeyValue"}, // 17.0.0+ - {51, nullptr, "DeleteDigitalTwinKeyValue"}, // 18.0.0+ - {101, nullptr, "Suspend"}, - {102, nullptr, "Resume"}, - {103, C<&INpnsSystem::GetState>, "GetState"}, - {104, nullptr, "GetStatistics"}, - {105, nullptr, "GetPlayReportRequestEvent"}, - {106, C<&INpnsSystem::GetLastNotifiedTime>, "GetLastNotifiedTime"}, // 18.0.0+ - {107, nullptr, "SetLastNotifiedTime"}, // 18.0.0+ - {111, nullptr, "GetJid"}, - {112, nullptr, "CreateJid"}, - {113, nullptr, "DestroyJid"}, - {114, nullptr, "AttachJid"}, - {115, nullptr, "DetachJid"}, - {120, nullptr, "CreateNotificationReceiver"}, - {151, nullptr, "GetStateWithHandover"}, - {152, nullptr, "GetStateChangeEventWithHandover"}, - {153, nullptr, "GetDropEventWithHandover"}, - {154, nullptr, "CreateTokenAsync"}, - {155, nullptr, "CreateTokenAsyncWithApplicationId"}, - {156, nullptr, "CreateTokenWithNameAsync"}, // 18.0.0+ - {161, C<&INpnsSystem::GetRequestChangeStateCancelEvent>, "GetRequestChangeStateCancelEvent"}, // 10.0.0+ - {162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"}, - {201, nullptr, "RequestChangeStateForceTimed"}, - {202, nullptr, "RequestChangeStateForceAsync"}, - {301, nullptr, "GetPassword"}, // 18.0.0+ - {302, nullptr, "GetAllImmigration"}, // 18.0.0+ - {303, nullptr, "GetNotificationHistories"}, // 18.0.0+ - {304, nullptr, "GetPersistentConnectionSummary"}, // 18.0.0+ - {305, nullptr, "GetDigitalTwinSummary"}, // 18.0.0+ - {306, nullptr, "GetDigitalTwinValue"}, // 18.0.0+ - }; - // clang-format on + get_receive_event{service_context}, get_request_change_state_cancel_event{service_context} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } ~INpnsSystem() override = default; @@ -140,6 +71,74 @@ private: R_SUCCEED(); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, nullptr, "ListenAll"}, + FunctionInfo{2, C<&INpnsSystem::ListenTo>, "ListenTo"}, + FunctionInfo{3, nullptr, "Receive"}, + FunctionInfo{4, nullptr, "ReceiveRaw"}, + FunctionInfo{5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"}, + FunctionInfo{6, nullptr, "ListenUndelivered"}, + FunctionInfo{7, nullptr, "GetStateChangeEvent"}, + FunctionInfo{8, C<&INpnsSystem::ListenToByName>, "ListenToByName"}, + FunctionInfo{11, nullptr, "SubscribeTopic"}, + FunctionInfo{12, nullptr, "UnsubscribeTopic"}, + FunctionInfo{13, nullptr, "QueryIsTopicExist"}, + FunctionInfo{14, nullptr, "SubscribeTopicByAccount", MakeVersionGate({18,0,0})}, + FunctionInfo{15, nullptr, "UnsubscribeTopicByAccount", MakeVersionGate({18,0,0})}, + FunctionInfo{16, nullptr, "DownloadSubscriptionList", MakeVersionGate({18,0,0})}, + FunctionInfo{21, nullptr, "CreateToken"}, + FunctionInfo{22, nullptr, "CreateTokenWithApplicationId"}, + FunctionInfo{23, nullptr, "DestroyToken"}, + FunctionInfo{24, nullptr, "DestroyTokenWithApplicationId"}, + FunctionInfo{25, nullptr, "QueryIsTokenValid"}, + FunctionInfo{26, nullptr, "ListenToMyApplicationId"}, + FunctionInfo{27, nullptr, "DestroyTokenAll"}, + FunctionInfo{28, nullptr, "CreateTokenWithName", MakeVersionGate({18,0,0})}, + FunctionInfo{29, nullptr, "DestroyTokenWithName", MakeVersionGate({18,0,0})}, + FunctionInfo{31, nullptr, "UploadTokenToBaaS"}, + FunctionInfo{32, nullptr, "DestroyTokenForBaaS"}, + FunctionInfo{33, nullptr, "CreateTokenForBaaS"}, + FunctionInfo{34, nullptr, "SetBaaSDeviceAccountIdList"}, + FunctionInfo{35, nullptr, "LinkNsaId", MakeVersionGate({17,0,0})}, + FunctionInfo{36, nullptr, "UnlinkNsaId", MakeVersionGate({17,0,0})}, + FunctionInfo{37, nullptr, "RelinkNsaId", MakeVersionGate({18,0,0})}, + FunctionInfo{40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent", MakeVersionGate({17,0,0})}, + FunctionInfo{41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid", MakeVersionGate({17,0,0})}, + FunctionInfo{42, nullptr, "SetNetworkServiceAccountIdTokenSuccess", MakeVersionGate({17,0,0})}, + FunctionInfo{43, nullptr, "SetNetworkServiceAccountIdTokenFailure", MakeVersionGate({17,0,0})}, + FunctionInfo{44, nullptr, "SetUidList", MakeVersionGate({17,0,0})}, + FunctionInfo{45, nullptr, "PutDigitalTwinKeyValue", MakeVersionGate({17,0,0})}, + FunctionInfo{51, nullptr, "DeleteDigitalTwinKeyValue", MakeVersionGate({18,0,0})}, + FunctionInfo{101, nullptr, "Suspend"}, + FunctionInfo{102, nullptr, "Resume"}, + FunctionInfo{103, C<&INpnsSystem::GetState>, "GetState"}, + FunctionInfo{104, nullptr, "GetStatistics"}, + FunctionInfo{105, nullptr, "GetPlayReportRequestEvent"}, + FunctionInfo{106, C<&INpnsSystem::GetLastNotifiedTime>, "GetLastNotifiedTime", MakeVersionGate({18,0,0})}, + FunctionInfo{107, nullptr, "SetLastNotifiedTime", MakeVersionGate({18,0,0})}, + FunctionInfo{111, nullptr, "GetJid"}, + FunctionInfo{112, nullptr, "CreateJid"}, + FunctionInfo{113, nullptr, "DestroyJid"}, + FunctionInfo{114, nullptr, "AttachJid"}, + FunctionInfo{115, nullptr, "DetachJid"}, + FunctionInfo{120, nullptr, "CreateNotificationReceiver"}, + FunctionInfo{151, nullptr, "GetStateWithHandover"}, + FunctionInfo{152, nullptr, "GetStateChangeEventWithHandover"}, + FunctionInfo{153, nullptr, "GetDropEventWithHandover"}, + FunctionInfo{154, nullptr, "CreateTokenAsync"}, + FunctionInfo{155, nullptr, "CreateTokenAsyncWithApplicationId"}, + FunctionInfo{156, nullptr, "CreateTokenWithNameAsync", MakeVersionGate({18,0,0})}, + FunctionInfo{161, C<&INpnsSystem::GetRequestChangeStateCancelEvent>, "GetRequestChangeStateCancelEvent", MakeVersionGate({10,0,0})}, + FunctionInfo{162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"}, + FunctionInfo{201, nullptr, "RequestChangeStateForceTimed"}, + FunctionInfo{202, nullptr, "RequestChangeStateForceAsync"}, + FunctionInfo{301, nullptr, "GetPassword", MakeVersionGate({18,0,0})}, + FunctionInfo{302, nullptr, "GetAllImmigration", MakeVersionGate({18,0,0})}, + FunctionInfo{303, nullptr, "GetNotificationHistories", MakeVersionGate({18,0,0})}, + FunctionInfo{304, nullptr, "GetPersistentConnectionSummary", MakeVersionGate({18,0,0})}, + FunctionInfo{305, nullptr, "GetDigitalTwinSummary", MakeVersionGate({18,0,0})}, + FunctionInfo{306, nullptr, "GetDigitalTwinValue", MakeVersionGate({18,0,0})} + ); KernelHelpers::ServiceContext service_context; Event get_receive_event; Event get_request_change_state_cancel_event; @@ -148,34 +147,10 @@ private: class INpnsUser final : public ServiceFramework { public: explicit INpnsUser(Core::System& system_) - : ServiceFramework{system_, "npns:u"}, service_context{system, "npns:u"}, get_receive_event{service_context} { - // clang-format off - static const FunctionInfo functions[] = { - {1, nullptr, "ListenAll"}, - {2, nullptr, "ListenTo"}, - {3, nullptr, "Receive"}, - {4, nullptr, "ReceiveRaw"}, - {5, C<&INpnsUser::GetReceiveEvent>, "GetReceiveEvent"}, - {7, nullptr, "GetStateChangeEvent"}, - {8, C<&INpnsUser::ListenToByName>, "ListenToByName"}, // 18.0.0+ - {21, nullptr, "CreateToken"}, - {23, nullptr, "DestroyToken"}, - {25, nullptr, "QueryIsTokenValid"}, - {26, nullptr, "ListenToMyApplicationId"}, - {101, nullptr, "Suspend"}, - {102, nullptr, "Resume"}, - {103, nullptr, "GetState"}, - {104, nullptr, "GetStatistics"}, - {111, nullptr, "GetJid"}, - {120, nullptr, "CreateNotificationReceiver"}, - {151, nullptr, "GetStateWithHandover"}, - {152, nullptr, "GetStateChangeEventWithHandover"}, - {153, nullptr, "GetDropEventWithHandover"}, - {154, nullptr, "CreateTokenAsync"}, - }; - // clang-format on + : ServiceFramework{system_, "npns:u"}, service_context{system, "npns:u"}, get_receive_event{service_context} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -195,6 +170,29 @@ private: R_SUCCEED(); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, nullptr, "ListenAll"}, + FunctionInfo{2, nullptr, "ListenTo"}, + FunctionInfo{3, nullptr, "Receive"}, + FunctionInfo{4, nullptr, "ReceiveRaw"}, + FunctionInfo{5, C<&INpnsUser::GetReceiveEvent>, "GetReceiveEvent"}, + FunctionInfo{7, nullptr, "GetStateChangeEvent"}, + FunctionInfo{8, C<&INpnsUser::ListenToByName>, "ListenToByName", MakeVersionGate({18,0,0})}, + FunctionInfo{21, nullptr, "CreateToken"}, + FunctionInfo{23, nullptr, "DestroyToken"}, + FunctionInfo{25, nullptr, "QueryIsTokenValid"}, + FunctionInfo{26, nullptr, "ListenToMyApplicationId"}, + FunctionInfo{101, nullptr, "Suspend"}, + FunctionInfo{102, nullptr, "Resume"}, + FunctionInfo{103, nullptr, "GetState"}, + FunctionInfo{104, nullptr, "GetStatistics"}, + FunctionInfo{111, nullptr, "GetJid"}, + FunctionInfo{120, nullptr, "CreateNotificationReceiver"}, + FunctionInfo{151, nullptr, "GetStateWithHandover"}, + FunctionInfo{152, nullptr, "GetStateChangeEventWithHandover"}, + FunctionInfo{153, nullptr, "GetDropEventWithHandover"}, + FunctionInfo{154, nullptr, "CreateTokenAsync"} + ); KernelHelpers::ServiceContext service_context; Event get_receive_event; }; diff --git a/src/core/hle/service/ns/account_proxy_interface.cpp b/src/core/hle/service/ns/account_proxy_interface.cpp index e5041af66b..0107e16b72 100644 --- a/src/core/hle/service/ns/account_proxy_interface.cpp +++ b/src/core/hle/service/ns/account_proxy_interface.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,13 +10,6 @@ namespace Service::NS { IAccountProxyInterface::IAccountProxyInterface(Core::System& system_) : ServiceFramework{system_, "IAccountProxyInterface"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "CreateUserAccount"}, - }; - // clang-format on - - RegisterHandlers(functions); } IAccountProxyInterface::~IAccountProxyInterface() = default; diff --git a/src/core/hle/service/ns/account_proxy_interface.h b/src/core/hle/service/ns/account_proxy_interface.h index e944d2a75f..37248726a9 100644 --- a/src/core/hle/service/ns/account_proxy_interface.h +++ b/src/core/hle/service/ns/account_proxy_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,6 +14,13 @@ class IAccountProxyInterface final : public ServiceFramework FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "CreateUserAccount"} + ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/application_manager_interface.cpp b/src/core/hle/service/ns/application_manager_interface.cpp index 348649917e..7220c52dcb 100644 --- a/src/core/hle/service/ns/application_manager_interface.cpp +++ b/src/core/hle/service/ns/application_manager_interface.cpp @@ -25,6 +25,458 @@ namespace Service::NS { +std::optional IApplicationManagerInterface::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IApplicationManagerInterface::ListApplicationRecord>, "ListApplicationRecord"}, + FunctionInfo{1, nullptr, "GenerateApplicationRecordCount"}, + FunctionInfo{2, D<&IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent>, "GetApplicationRecordUpdateSystemEvent"}, + FunctionInfo{3, nullptr, "GetApplicationViewDeprecated"}, + FunctionInfo{4, D<&IApplicationManagerInterface::DeleteApplicationEntity>, "DeleteApplicationEntity"}, + FunctionInfo{5, D<&IApplicationManagerInterface::DeleteApplicationCompletely>, "DeleteApplicationCompletely"}, + FunctionInfo{6, nullptr, "IsAnyApplicationEntityRedundant"}, + FunctionInfo{7, nullptr, "DeleteRedundantApplicationEntity"}, + FunctionInfo{8, nullptr, "IsApplicationEntityMovable"}, + FunctionInfo{9, nullptr, "MoveApplicationEntity"}, + FunctionInfo{11, nullptr, "CalculateApplicationOccupiedSize"}, + FunctionInfo{16, &IApplicationManagerInterface::PushApplicationRecord, "PushApplicationRecord"}, + FunctionInfo{17, nullptr, "ListApplicationRecordContentMeta"}, + FunctionInfo{19, nullptr, "LaunchApplicationOld"}, + FunctionInfo{21, nullptr, "GetApplicationContentPath"}, + FunctionInfo{22, nullptr, "TerminateApplication"}, + FunctionInfo{23, nullptr, "ResolveApplicationContentPath"}, + FunctionInfo{26, nullptr, "BeginInstallApplication"}, + FunctionInfo{27, nullptr, "DeleteApplicationRecord"}, + FunctionInfo{30, nullptr, "RequestApplicationUpdateInfo"}, + FunctionInfo{31, nullptr, "RequestUpdateApplication"}, + FunctionInfo{32, nullptr, "CancelApplicationDownload"}, + FunctionInfo{33, nullptr, "ResumeApplicationDownload"}, + FunctionInfo{35, nullptr, "UpdateVersionList"}, + FunctionInfo{36, nullptr, "PushLaunchVersion"}, + FunctionInfo{37, nullptr, "ListRequiredVersion"}, + FunctionInfo{38, D<&IApplicationManagerInterface::CheckApplicationLaunchVersion>, "CheckApplicationLaunchVersion"}, + FunctionInfo{39, nullptr, "CheckApplicationLaunchRights"}, + FunctionInfo{40, D<&IApplicationManagerInterface::GetApplicationLogoData>, "GetApplicationLogoData"}, + FunctionInfo{41, nullptr, "CalculateApplicationDownloadRequiredSize"}, + FunctionInfo{42, nullptr, "CleanupSdCard"}, + FunctionInfo{43, D<&IApplicationManagerInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"}, + FunctionInfo{44, D<&IApplicationManagerInterface::GetSdCardMountStatusChangedEvent>, "GetSdCardMountStatusChangedEvent"}, + FunctionInfo{45, nullptr, "GetGameCardAttachmentEvent"}, + FunctionInfo{46, nullptr, "GetGameCardAttachmentInfo"}, + FunctionInfo{47, D<&IApplicationManagerInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"}, + FunctionInfo{48, D<&IApplicationManagerInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"}, + FunctionInfo{49, nullptr, "GetSdCardRemovedEvent"}, + FunctionInfo{52, D<&IApplicationManagerInterface::GetGameCardUpdateDetectionEvent>, "GetGameCardUpdateDetectionEvent"}, + FunctionInfo{53, nullptr, "DisableApplicationAutoDelete"}, + FunctionInfo{54, nullptr, "EnableApplicationAutoDelete"}, + FunctionInfo{55, D<&IApplicationManagerInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"}, + FunctionInfo{56, nullptr, "SetApplicationTerminateResult"}, + FunctionInfo{57, nullptr, "ClearApplicationTerminateResult"}, + FunctionInfo{58, nullptr, "GetLastSdCardMountUnexpectedResult"}, + FunctionInfo{59, D<&IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"}, + FunctionInfo{60, nullptr, "ConvertLanguageCodeToApplicationLanguage"}, + FunctionInfo{61, nullptr, "GetBackgroundDownloadStressTaskInfo"}, + FunctionInfo{62, nullptr, "GetGameCardStopper"}, + FunctionInfo{63, nullptr, "IsSystemProgramInstalled"}, + FunctionInfo{64, nullptr, "StartApplyDeltaTask"}, + FunctionInfo{65, nullptr, "GetRequestServerStopper"}, + FunctionInfo{66, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"}, + FunctionInfo{67, nullptr, "CancelApplicationApplyDelta"}, + FunctionInfo{68, nullptr, "ResumeApplicationApplyDelta"}, + FunctionInfo{69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"}, + FunctionInfo{70, D<&IApplicationManagerInterface::ResumeAll>, "ResumeAll"}, + FunctionInfo{71, D<&IApplicationManagerInterface::GetStorageSize>, "GetStorageSize"}, + FunctionInfo{80, nullptr, "RequestDownloadApplication"}, + FunctionInfo{81, nullptr, "RequestDownloadAddOnContent"}, + FunctionInfo{82, nullptr, "DownloadApplication"}, + FunctionInfo{83, nullptr, "CheckApplicationResumeRights"}, + FunctionInfo{84, nullptr, "GetDynamicCommitEvent"}, + FunctionInfo{85, nullptr, "RequestUpdateApplication2"}, + FunctionInfo{86, nullptr, "EnableApplicationCrashReport"}, + FunctionInfo{87, nullptr, "IsApplicationCrashReportEnabled"}, + FunctionInfo{90, nullptr, "BoostSystemMemoryResourceLimit"}, + FunctionInfo{91, nullptr, "DeprecatedLaunchApplication"}, + FunctionInfo{92, nullptr, "GetRunningApplicationProgramId"}, + FunctionInfo{93, nullptr, "GetMainApplicationProgramIndex"}, + FunctionInfo{94, nullptr, "LaunchApplication"}, + FunctionInfo{95, nullptr, "GetApplicationLaunchInfo"}, + FunctionInfo{96, nullptr, "AcquireApplicationLaunchInfo"}, + FunctionInfo{97, nullptr, "GetMainApplicationProgramIndexByApplicationLaunchInfo"}, + FunctionInfo{98, nullptr, "EnableApplicationAllThreadDumpOnCrash"}, + FunctionInfo{99, nullptr, "LaunchDevMenu"}, + FunctionInfo{100, nullptr, "ResetToFactorySettings"}, + FunctionInfo{101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"}, + FunctionInfo{102, nullptr, "ResetToFactorySettingsForRefurbishment"}, + FunctionInfo{103, nullptr, "ResetToFactorySettingsWithPlatformRegion"}, + FunctionInfo{104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"}, + FunctionInfo{105, nullptr, "RequestResetToFactorySettingsSecurely"}, + FunctionInfo{106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"}, + FunctionInfo{200, nullptr, "CalculateUserSaveDataStatistics"}, + FunctionInfo{201, nullptr, "DeleteUserSaveDataAll"}, + FunctionInfo{210, nullptr, "DeleteUserSystemSaveData"}, + FunctionInfo{211, nullptr, "DeleteSaveData"}, + FunctionInfo{220, nullptr, "UnregisterNetworkServiceAccount"}, + FunctionInfo{221, D<&IApplicationManagerInterface::UnregisterNetworkServiceAccountWithUserSaveDataDeletion>, "UnregisterNetworkServiceAccountWithUserSaveDataDeletion"}, + FunctionInfo{300, nullptr, "GetApplicationShellEvent"}, + FunctionInfo{301, nullptr, "PopApplicationShellEventInfo"}, + FunctionInfo{302, nullptr, "LaunchLibraryApplet"}, + FunctionInfo{303, nullptr, "TerminateLibraryApplet"}, + FunctionInfo{304, nullptr, "LaunchSystemApplet"}, + FunctionInfo{305, nullptr, "TerminateSystemApplet"}, + FunctionInfo{306, nullptr, "LaunchOverlayApplet"}, + FunctionInfo{307, nullptr, "TerminateOverlayApplet"}, + FunctionInfo{400, D<&IApplicationManagerInterface::GetApplicationControlData>, "GetApplicationControlData"}, + FunctionInfo{401, nullptr, "InvalidateAllApplicationControlCache"}, + FunctionInfo{402, nullptr, "RequestDownloadApplicationControlData"}, + FunctionInfo{403, nullptr, "GetMaxApplicationControlCacheCount"}, + FunctionInfo{404, nullptr, "InvalidateApplicationControlCache"}, + FunctionInfo{405, nullptr, "ListApplicationControlCacheEntryInfo"}, + FunctionInfo{406, nullptr, "GetApplicationControlProperty"}, + FunctionInfo{407, &IApplicationManagerInterface::ListApplicationTitle, "ListApplicationTitle"}, + FunctionInfo{408, &IApplicationManagerInterface::ListApplicationIcon, "ListApplicationIcon"}, + FunctionInfo{411, nullptr, "Unknown411", MakeVersionGate({19,0,0})}, + FunctionInfo{412, nullptr, "Unknown412", MakeVersionGate({19,0,0})}, + FunctionInfo{413, nullptr, "Unknown413", MakeVersionGate({19,0,0})}, + FunctionInfo{414, nullptr, "Unknown414", MakeVersionGate({19,0,0})}, + FunctionInfo{415, nullptr, "Unknown415", MakeVersionGate({19,0,0})}, + FunctionInfo{416, nullptr, "Unknown416", MakeVersionGate({19,0,0})}, + FunctionInfo{417, nullptr, "InvalidateAllApplicationControlCacheOfTheStage", MakeVersionGate({19,0,0})}, + FunctionInfo{418, nullptr, "InvalidateApplicationControlCacheOfTheStage", MakeVersionGate({19,0,0})}, + FunctionInfo{419, D<&IApplicationManagerInterface::RequestDownloadApplicationControlDataInBackground>, "RequestDownloadApplicationControlDataInBackground"}, + FunctionInfo{420, nullptr, "CloneApplicationControlDataCacheForDebug"}, + FunctionInfo{421, nullptr, "Unknown421", MakeVersionGate({20,0,0})}, + FunctionInfo{422, nullptr, "Unknown422", MakeVersionGate({20,0,0})}, + FunctionInfo{423, nullptr, "Unknown423", MakeVersionGate({20,0,0})}, + FunctionInfo{424, nullptr, "Unknown424", MakeVersionGate({20,0,0})}, + FunctionInfo{425, nullptr, "Unknown425", MakeVersionGate({20,0,0})}, + FunctionInfo{426, nullptr, "Unknown426", MakeVersionGate({20,0,0})}, + FunctionInfo{427, nullptr, "Unknown427", MakeVersionGate({20,0,0})}, + FunctionInfo{428, nullptr, "Unknown428", MakeVersionGate({21,0,0})}, + FunctionInfo{429, nullptr, "Unknown429", MakeVersionGate({21,0,0})}, + FunctionInfo{430, nullptr, "Unknown430", MakeVersionGate({21,0,0})}, + FunctionInfo{502, nullptr, "RequestCheckGameCardRegistration"}, + FunctionInfo{503, nullptr, "RequestGameCardRegistrationGoldPoint"}, + FunctionInfo{504, nullptr, "RequestRegisterGameCard"}, + FunctionInfo{505, D<&IApplicationManagerInterface::GetGameCardMountFailureEvent>, "GetGameCardMountFailureEvent"}, + FunctionInfo{506, nullptr, "IsGameCardInserted"}, + FunctionInfo{507, nullptr, "EnsureGameCardAccess"}, + FunctionInfo{508, nullptr, "GetLastGameCardMountFailureResult"}, + FunctionInfo{509, nullptr, "ListApplicationIdOnGameCard"}, + FunctionInfo{510, nullptr, "GetGameCardPlatformRegion"}, + FunctionInfo{511, D<&IApplicationManagerInterface::GetGameCardWakenReadyEvent>, "GetGameCardWakenReadyEvent"}, + FunctionInfo{512, D<&IApplicationManagerInterface::IsGameCardApplicationRunning>, "IsGameCardApplicationRunning"}, + FunctionInfo{513, nullptr, "Unknown513", MakeVersionGate({20,0,0})}, + FunctionInfo{514, nullptr, "Unknown514", MakeVersionGate({20,0,0})}, + FunctionInfo{515, nullptr, "Unknown515", MakeVersionGate({20,0,0})}, + FunctionInfo{516, nullptr, "Unknown516", MakeVersionGate({21,0,0})}, + FunctionInfo{517, nullptr, "Unknown517", MakeVersionGate({21,0,0})}, + FunctionInfo{518, nullptr, "Unknown518", MakeVersionGate({21,0,0})}, + FunctionInfo{519, nullptr, "Unknown519", MakeVersionGate({21,0,0})}, + FunctionInfo{600, nullptr, "CountApplicationContentMeta"}, + FunctionInfo{601, nullptr, "ListApplicationContentMetaStatus"}, + FunctionInfo{602, nullptr, "ListAvailableAddOnContent"}, + FunctionInfo{603, nullptr, "GetOwnedApplicationContentMetaStatus"}, + FunctionInfo{604, nullptr, "RegisterContentsExternalKey"}, + FunctionInfo{605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"}, + FunctionInfo{606, nullptr, "GetContentMetaStorage"}, + FunctionInfo{607, nullptr, "ListAvailableAddOnContent"}, + FunctionInfo{609, nullptr, "ListAvailabilityAssuredAddOnContent"}, + FunctionInfo{610, nullptr, "GetInstalledContentMetaStorage"}, + FunctionInfo{611, nullptr, "PrepareAddOnContent"}, + FunctionInfo{700, nullptr, "PushDownloadTaskList"}, + FunctionInfo{701, nullptr, "ClearTaskStatusList"}, + FunctionInfo{702, nullptr, "RequestDownloadTaskList"}, + FunctionInfo{703, nullptr, "RequestEnsureDownloadTask"}, + FunctionInfo{704, nullptr, "ListDownloadTaskStatus"}, + FunctionInfo{705, nullptr, "RequestDownloadTaskListData"}, + FunctionInfo{800, nullptr, "RequestVersionList"}, + FunctionInfo{801, nullptr, "ListVersionList"}, + FunctionInfo{802, nullptr, "RequestVersionListData"}, + FunctionInfo{900, nullptr, "GetApplicationRecord"}, + FunctionInfo{901, nullptr, "GetApplicationRecordProperty"}, + FunctionInfo{902, nullptr, "EnableApplicationAutoUpdate"}, + FunctionInfo{903, nullptr, "DisableApplicationAutoUpdate"}, + FunctionInfo{904, D<&IApplicationManagerInterface::TouchApplication>, "TouchApplication"}, + FunctionInfo{905, nullptr, "RequestApplicationUpdate"}, + FunctionInfo{906, D<&IApplicationManagerInterface::IsApplicationUpdateRequested>, "IsApplicationUpdateRequested"}, + FunctionInfo{907, nullptr, "WithdrawApplicationUpdateRequest"}, + FunctionInfo{908, nullptr, "ListApplicationRecordInstalledContentMeta"}, + FunctionInfo{909, nullptr, "WithdrawCleanupAddOnContentsWithNoRightsRecommendation"}, + FunctionInfo{910, nullptr, "HasApplicationRecord"}, + FunctionInfo{911, nullptr, "SetPreInstalledApplication"}, + FunctionInfo{912, nullptr, "ClearPreInstalledApplicationFlag"}, + FunctionInfo{913, nullptr, "ListAllApplicationRecord"}, + FunctionInfo{914, nullptr, "HideApplicationRecord"}, + FunctionInfo{915, nullptr, "ShowApplicationRecord"}, + FunctionInfo{916, nullptr, "IsApplicationAutoDeleteDisabled"}, + FunctionInfo{916, nullptr, "Unknown916", MakeVersionGate({20,0,0})}, + FunctionInfo{917, nullptr, "Unknown917", MakeVersionGate({20,0,0})}, + FunctionInfo{918, nullptr, "Unknown918", MakeVersionGate({20,0,0})}, + FunctionInfo{919, nullptr, "Unknown919", MakeVersionGate({20,0,0})}, + FunctionInfo{920, nullptr, "Unknown920", MakeVersionGate({20,0,0})}, + FunctionInfo{921, nullptr, "Unknown921", MakeVersionGate({20,0,0})}, + FunctionInfo{922, nullptr, "Unknown922", MakeVersionGate({20,0,0})}, + FunctionInfo{923, nullptr, "Unknown923", MakeVersionGate({20,0,0})}, + FunctionInfo{928, nullptr, "Unknown928", MakeVersionGate({20,0,0})}, + FunctionInfo{929, nullptr, "Unknown929", MakeVersionGate({20,0,0})}, + FunctionInfo{930, nullptr, "Unknown930", MakeVersionGate({20,0,0})}, + FunctionInfo{931, nullptr, "Unknown931", MakeVersionGate({20,0,0})}, + FunctionInfo{933, nullptr, "Unknown933", MakeVersionGate({20,0,0})}, + FunctionInfo{934, nullptr, "Unknown934", MakeVersionGate({21,0,0})}, + FunctionInfo{935, nullptr, "Unknown935", MakeVersionGate({21,0,0})}, + FunctionInfo{936, D<&IApplicationManagerInterface::Unknown936>, "Unknown936", MakeVersionGate({21,0,0})}, + FunctionInfo{1000, nullptr, "RequestVerifyApplicationDeprecated"}, + FunctionInfo{1001, nullptr, "CorruptApplicationForDebug"}, + FunctionInfo{1002, nullptr, "RequestVerifyAddOnContentsRights"}, + FunctionInfo{1003, nullptr, "RequestVerifyApplication"}, + FunctionInfo{1004, nullptr, "CorruptContentForDebug"}, + FunctionInfo{1200, nullptr, "NeedsUpdateVulnerability"}, + FunctionInfo{1300, D<&IApplicationManagerInterface::IsAnyApplicationEntityInstalled>, "IsAnyApplicationEntityInstalled"}, + FunctionInfo{1301, nullptr, "DeleteApplicationContentEntities"}, + FunctionInfo{1302, nullptr, "CleanupUnrecordedApplicationEntity"}, + FunctionInfo{1303, nullptr, "CleanupAddOnContentsWithNoRights"}, + FunctionInfo{1304, nullptr, "DeleteApplicationContentEntity"}, + FunctionInfo{1305, nullptr, "TryDeleteRunningApplicationEntity"}, + FunctionInfo{1306, nullptr, "TryDeleteRunningApplicationCompletely"}, + FunctionInfo{1307, nullptr, "TryDeleteRunningApplicationContentEntities"}, + FunctionInfo{1308, nullptr, "DeleteApplicationCompletelyForDebug"}, + FunctionInfo{1309, nullptr, "CleanupUnavailableAddOnContents"}, + FunctionInfo{1310, nullptr, "RequestMoveApplicationEntity"}, + FunctionInfo{1311, nullptr, "EstimateSizeToMove"}, + FunctionInfo{1312, nullptr, "HasMovableEntity"}, + FunctionInfo{1313, nullptr, "CleanupOrphanContents"}, + FunctionInfo{1314, nullptr, "CheckPreconditionSatisfiedToMove"}, + FunctionInfo{1400, nullptr, "PrepareShutdown"}, + FunctionInfo{1500, nullptr, "FormatSdCard"}, + FunctionInfo{1501, nullptr, "NeedsSystemUpdateToFormatSdCard"}, + FunctionInfo{1502, nullptr, "GetLastSdCardFormatUnexpectedResult"}, + FunctionInfo{1504, nullptr, "InsertSdCard"}, + FunctionInfo{1505, nullptr, "RemoveSdCard"}, + FunctionInfo{1506, nullptr, "GetSdCardStartupStatus"}, + FunctionInfo{1508, nullptr, "Unknown1508", MakeVersionGate({20,0,0})}, + FunctionInfo{1509, nullptr, "Unknown1509", MakeVersionGate({20,0,0})}, + FunctionInfo{1510, nullptr, "Unknown1510", MakeVersionGate({20,0,0})}, + FunctionInfo{1511, nullptr, "Unknown1511", MakeVersionGate({20,0,0})}, + FunctionInfo{1512, nullptr, "Unknown1512", MakeVersionGate({20,0,0})}, + FunctionInfo{1600, nullptr, "GetSystemSeedForPseudoDeviceId"}, + FunctionInfo{1601, nullptr, "ResetSystemSeedForPseudoDeviceId"}, + FunctionInfo{1700, nullptr, "ListApplicationDownloadingContentMeta"}, + FunctionInfo{1701, D<&IApplicationManagerInterface::GetApplicationViewDeprecated>, "GetApplicationViewDeprecated"}, + FunctionInfo{1702, nullptr, "GetApplicationDownloadTaskStatus"}, + FunctionInfo{1703, nullptr, "GetApplicationViewDownloadErrorContext"}, + FunctionInfo{1704, D<&IApplicationManagerInterface::GetApplicationViewWithPromotionInfo>, "GetApplicationViewWithPromotionInfo"}, + FunctionInfo{1705, nullptr, "IsPatchAutoDeletableApplication"}, + FunctionInfo{1706, D<&IApplicationManagerInterface::GetApplicationView>, "GetApplicationView"}, + FunctionInfo{1800, nullptr, "IsNotificationSetupCompleted"}, + FunctionInfo{1801, nullptr, "GetLastNotificationInfoCount"}, + FunctionInfo{1802, nullptr, "ListLastNotificationInfo"}, + FunctionInfo{1803, nullptr, "ListNotificationTask"}, + FunctionInfo{1900, nullptr, "IsActiveAccount"}, + FunctionInfo{1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"}, + FunctionInfo{1902, nullptr, "GetApplicationTicketInfo"}, + FunctionInfo{1903, nullptr, "RequestDownloadApplicationPrepurchasedRightsForAccount"}, + FunctionInfo{2000, nullptr, "GetSystemDeliveryInfo"}, + FunctionInfo{2001, nullptr, "SelectLatestSystemDeliveryInfo"}, + FunctionInfo{2002, nullptr, "VerifyDeliveryProtocolVersion"}, + FunctionInfo{2003, nullptr, "GetApplicationDeliveryInfo"}, + FunctionInfo{2004, nullptr, "HasAllContentsToDeliver"}, + FunctionInfo{2005, nullptr, "CompareApplicationDeliveryInfo"}, + FunctionInfo{2006, nullptr, "CanDeliverApplication"}, + FunctionInfo{2007, nullptr, "ListContentMetaKeyToDeliverApplication"}, + FunctionInfo{2008, nullptr, "NeedsSystemUpdateToDeliverApplication"}, + FunctionInfo{2009, nullptr, "EstimateRequiredSize"}, + FunctionInfo{2010, nullptr, "RequestReceiveApplication"}, + FunctionInfo{2011, nullptr, "CommitReceiveApplication"}, + FunctionInfo{2012, nullptr, "GetReceiveApplicationProgress"}, + FunctionInfo{2013, nullptr, "RequestSendApplication"}, + FunctionInfo{2014, nullptr, "GetSendApplicationProgress"}, + FunctionInfo{2015, nullptr, "CompareSystemDeliveryInfo"}, + FunctionInfo{2016, nullptr, "ListNotCommittedContentMeta"}, + FunctionInfo{2017, nullptr, "CreateDownloadTask"}, + FunctionInfo{2018, nullptr, "GetApplicationDeliveryInfoHash"}, + FunctionInfo{2019, nullptr, "Unknown2019", MakeVersionGate({20,0,0})}, + FunctionInfo{2050, D<&IApplicationManagerInterface::GetApplicationRightsOnClient>, "GetApplicationRightsOnClient"}, + FunctionInfo{2051, nullptr, "InvalidateRightsIdCache"}, + FunctionInfo{2052, nullptr, "Unknown2052", MakeVersionGate({20,0,0})}, + FunctionInfo{2053, nullptr, "Unknown2053", MakeVersionGate({20,0,0})}, + FunctionInfo{2100, D<&IApplicationManagerInterface::GetApplicationTerminateResult>, "GetApplicationTerminateResult"}, + FunctionInfo{2101, nullptr, "GetRawApplicationTerminateResult"}, + FunctionInfo{2150, nullptr, "CreateRightsEnvironment"}, + FunctionInfo{2151, nullptr, "DestroyRightsEnvironment"}, + FunctionInfo{2152, nullptr, "ActivateRightsEnvironment"}, + FunctionInfo{2153, nullptr, "DeactivateRightsEnvironment"}, + FunctionInfo{2154, nullptr, "ForceActivateRightsContextForExit"}, + FunctionInfo{2155, nullptr, "UpdateRightsEnvironmentStatus"}, + FunctionInfo{2156, nullptr, "CreateRightsEnvironmentForMicroApplication"}, + FunctionInfo{2160, nullptr, "AddTargetApplicationToRightsEnvironment"}, + FunctionInfo{2161, nullptr, "SetUsersToRightsEnvironment"}, + FunctionInfo{2170, nullptr, "GetRightsEnvironmentStatus"}, + FunctionInfo{2171, nullptr, "GetRightsEnvironmentStatusChangedEvent"}, + FunctionInfo{2180, nullptr, "RequestExtendRightsInRightsEnvironment"}, + FunctionInfo{2181, nullptr, "GetResultOfExtendRightsInRightsEnvironment"}, + FunctionInfo{2182, nullptr, "SetActiveRightsContextUsingStateToRightsEnvironment"}, + FunctionInfo{2183, nullptr, "Unknown2183", MakeVersionGate({20,1,0})}, + FunctionInfo{2190, nullptr, "GetRightsEnvironmentHandleForApplication"}, + FunctionInfo{2199, nullptr, "GetRightsEnvironmentCountForDebug"}, + FunctionInfo{2200, nullptr, "GetGameCardApplicationCopyIdentifier"}, + FunctionInfo{2201, nullptr, "GetInstalledApplicationCopyIdentifier"}, + FunctionInfo{2250, nullptr, "RequestReportActiveELicence"}, + FunctionInfo{2300, nullptr, "ListEventLog"}, + FunctionInfo{2350, nullptr, "PerformAutoUpdateByApplicationId"}, + FunctionInfo{2351, nullptr, "RequestNoDownloadRightsErrorResolution"}, + FunctionInfo{2352, nullptr, "RequestResolveNoDownloadRightsError"}, + FunctionInfo{2353, nullptr, "GetApplicationDownloadTaskInfo"}, + FunctionInfo{2354, nullptr, "PrioritizeApplicationBackgroundTask"}, + FunctionInfo{2355, nullptr, "PreferStorageEfficientUpdate"}, + FunctionInfo{2356, nullptr, "RequestStorageEfficientUpdatePreferable"}, + FunctionInfo{2357, nullptr, "EnableMultiCoreDownload"}, + FunctionInfo{2358, nullptr, "DisableMultiCoreDownload"}, + FunctionInfo{2359, nullptr, "IsMultiCoreDownloadEnabled"}, + FunctionInfo{2360, nullptr, "GetApplicationDownloadTaskCount", MakeVersionGate({19,0,0})}, + FunctionInfo{2361, nullptr, "GetMaxApplicationDownloadTaskCount", MakeVersionGate({19,0,0})}, + FunctionInfo{2362, nullptr, "Unknown2362", MakeVersionGate({20,0,0})}, + FunctionInfo{2363, nullptr, "Unknown2363", MakeVersionGate({20,0,0})}, + FunctionInfo{2364, nullptr, "Unknown2364", MakeVersionGate({20,0,0})}, + FunctionInfo{2365, nullptr, "Unknown2365", MakeVersionGate({20,0,0})}, + FunctionInfo{2366, nullptr, "Unknown2366", MakeVersionGate({20,0,0})}, + FunctionInfo{2367, nullptr, "Unknown2367", MakeVersionGate({20,0,0})}, + FunctionInfo{2368, nullptr, "Unknown2368", MakeVersionGate({20,0,0})}, + FunctionInfo{2369, nullptr, "Unknown2369", MakeVersionGate({21,0,0})}, + FunctionInfo{2400, nullptr, "GetPromotionInfo"}, + FunctionInfo{2401, nullptr, "CountPromotionInfo"}, + FunctionInfo{2402, nullptr, "ListPromotionInfo"}, + FunctionInfo{2403, nullptr, "ImportPromotionJsonForDebug"}, + FunctionInfo{2404, nullptr, "ClearPromotionInfoForDebug"}, + FunctionInfo{2500, nullptr, "ConfirmAvailableTime"}, + FunctionInfo{2510, nullptr, "CreateApplicationResource"}, + FunctionInfo{2511, nullptr, "GetApplicationResource"}, + FunctionInfo{2513, nullptr, "LaunchMicroApplication"}, + FunctionInfo{2514, nullptr, "ClearTaskOfAsyncTaskManager"}, + FunctionInfo{2515, nullptr, "CleanupAllPlaceHolderAndFragmentsIfNoTask"}, + FunctionInfo{2516, nullptr, "EnsureApplicationCertificate"}, + FunctionInfo{2517, nullptr, "CreateApplicationInstance"}, + FunctionInfo{2518, nullptr, "UpdateQualificationForDebug"}, + FunctionInfo{2519, nullptr, "IsQualificationTransitionSupported"}, + FunctionInfo{2520, D<&IApplicationManagerInterface::IsQualificationTransitionSupportedByProcessId>, "IsQualificationTransitionSupportedByProcessId"}, + FunctionInfo{2521, nullptr, "GetRightsUserChangedEvent"}, + FunctionInfo{2522, nullptr, "IsRomRedirectionAvailable"}, + FunctionInfo{2523, nullptr, "GetProgramId", MakeVersionGate({17,0,0})}, + FunctionInfo{2524, nullptr, "Unknown2524", MakeVersionGate({19,0,0})}, + FunctionInfo{2525, nullptr, "Unknown2525", MakeVersionGate({20,0,0})}, + FunctionInfo{2800, nullptr, "GetApplicationIdOfPreomia"}, + FunctionInfo{3000, nullptr, "RegisterDeviceLockKey"}, + FunctionInfo{3001, nullptr, "UnregisterDeviceLockKey"}, + FunctionInfo{3002, nullptr, "VerifyDeviceLockKey"}, + FunctionInfo{3003, nullptr, "HideApplicationIcon"}, + FunctionInfo{3004, nullptr, "ShowApplicationIcon"}, + FunctionInfo{3005, nullptr, "HideApplicationTitle"}, + FunctionInfo{3006, nullptr, "ShowApplicationTitle"}, + FunctionInfo{3007, nullptr, "EnableGameCard"}, + FunctionInfo{3008, nullptr, "DisableGameCard"}, + FunctionInfo{3009, nullptr, "EnableLocalContentShare"}, + FunctionInfo{3010, nullptr, "DisableLocalContentShare"}, + FunctionInfo{3011, nullptr, "IsApplicationIconHidden"}, + FunctionInfo{3012, nullptr, "IsApplicationTitleHidden"}, + FunctionInfo{3013, nullptr, "IsGameCardEnabled"}, + FunctionInfo{3014, nullptr, "IsLocalContentShareEnabled"}, + FunctionInfo{3050, nullptr, "ListAssignELicenseTaskResult"}, + FunctionInfo{3104, nullptr, "GetApplicationNintendoLogo", MakeVersionGate({18,0,0})}, + FunctionInfo{3105, nullptr, "GetApplicationStartupMovie", MakeVersionGate({18,0,0})}, + FunctionInfo{4000, nullptr, "Unknown4000", MakeVersionGate({20,0,0})}, + FunctionInfo{4004, nullptr, "Unknown4004", MakeVersionGate({20,0,0})}, + FunctionInfo{4006, nullptr, "Unknown4006", MakeVersionGate({20,0,0})}, + FunctionInfo{4007, nullptr, "Unknown4007", MakeVersionGate({20,0,0})}, + FunctionInfo{4008, nullptr, "Unknown4008", MakeVersionGate({20,0,0})}, + FunctionInfo{4009, nullptr, "Unknown4009", MakeVersionGate({20,0,0})}, + FunctionInfo{4010, nullptr, "Unknown4010", MakeVersionGate({20,0,0})}, + FunctionInfo{4011, nullptr, "Unknown4011", MakeVersionGate({20,0,0})}, + FunctionInfo{4012, nullptr, "Unknown4012", MakeVersionGate({20,0,0})}, + FunctionInfo{4013, nullptr, "Unknown4013", MakeVersionGate({20,0,0})}, + FunctionInfo{4015, nullptr, "Unknown4015", MakeVersionGate({20,0,0})}, + FunctionInfo{4017, nullptr, "Unknown4017", MakeVersionGate({20,0,0})}, + FunctionInfo{4019, nullptr, "Unknown4019", MakeVersionGate({20,0,0})}, + FunctionInfo{4020, nullptr, "Unknown4020", MakeVersionGate({20,0,0})}, + FunctionInfo{4021, nullptr, "Unknown4021", MakeVersionGate({20,0,0})}, + FunctionInfo{4022, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4022", MakeVersionGate({20,0,0})}, + FunctionInfo{4023, D<&IApplicationManagerInterface::Unknown4023>, "Unknown4023", MakeVersionGate({20,0,0})}, + FunctionInfo{4024, nullptr, "Unknown4024", MakeVersionGate({20,0,0})}, + FunctionInfo{4025, nullptr, "Unknown4025", MakeVersionGate({20,0,0})}, + FunctionInfo{4026, nullptr, "Unknown4026", MakeVersionGate({20,0,0})}, + FunctionInfo{4027, nullptr, "Unknown4027", MakeVersionGate({20,0,0})}, + FunctionInfo{4028, nullptr, "Unknown4028", MakeVersionGate({20,0,0})}, + FunctionInfo{4029, nullptr, "Unknown4029", MakeVersionGate({20,0,0})}, + FunctionInfo{4030, nullptr, "Unknown4030", MakeVersionGate({20,0,0})}, + FunctionInfo{4031, nullptr, "Unknown4031", MakeVersionGate({20,0,0})}, + FunctionInfo{4032, nullptr, "Unknown4032", MakeVersionGate({20,0,0})}, + FunctionInfo{4033, nullptr, "Unknown4033", MakeVersionGate({20,0,0})}, + FunctionInfo{4034, nullptr, "Unknown4034", MakeVersionGate({20,0,0})}, + FunctionInfo{4035, nullptr, "Unknown4035", MakeVersionGate({20,0,0})}, + FunctionInfo{4037, nullptr, "Unknown4037", MakeVersionGate({20,0,0})}, + FunctionInfo{4038, nullptr, "Unknown4038", MakeVersionGate({20,0,0})}, + FunctionInfo{4039, nullptr, "Unknown4039", MakeVersionGate({20,0,0})}, + FunctionInfo{4040, nullptr, "Unknown4040", MakeVersionGate({20,0,0})}, + FunctionInfo{4041, nullptr, "Unknown4041", MakeVersionGate({20,0,0})}, + FunctionInfo{4042, D<&IApplicationManagerInterface::Unknown4042>, "Unknown4042", MakeVersionGate({20,0,0})}, + FunctionInfo{4043, nullptr, "Unknown4043", MakeVersionGate({20,0,0})}, + FunctionInfo{4044, nullptr, "Unknown4044", MakeVersionGate({20,0,0})}, + FunctionInfo{4045, nullptr, "Unknown4045", MakeVersionGate({20,0,0})}, + FunctionInfo{4046, nullptr, "Unknown4046", MakeVersionGate({20,0,0})}, + FunctionInfo{4049, nullptr, "Unknown4049", MakeVersionGate({20,0,0})}, + FunctionInfo{4050, nullptr, "Unknown4050", MakeVersionGate({20,0,0})}, + FunctionInfo{4051, nullptr, "Unknown4051", MakeVersionGate({20,0,0})}, + FunctionInfo{4052, nullptr, "Unknown4052", MakeVersionGate({20,0,0})}, + FunctionInfo{4053, D<&IApplicationManagerInterface::Unknown4053>, "Unknown4053", MakeVersionGate({20,0,0})}, + FunctionInfo{4054, nullptr, "Unknown4054", MakeVersionGate({20,0,0})}, + FunctionInfo{4055, nullptr, "Unknown4055", MakeVersionGate({20,0,0})}, + FunctionInfo{4056, nullptr, "Unknown4056", MakeVersionGate({20,0,0})}, + FunctionInfo{4057, nullptr, "Unknown4057", MakeVersionGate({20,0,0})}, + FunctionInfo{4058, nullptr, "Unknown4058", MakeVersionGate({20,0,0})}, + FunctionInfo{4059, nullptr, "Unknown4059", MakeVersionGate({20,0,0})}, + FunctionInfo{4060, nullptr, "Unknown4060", MakeVersionGate({20,0,0})}, + FunctionInfo{4061, nullptr, "Unknown4061", MakeVersionGate({20,0,0})}, + FunctionInfo{4062, nullptr, "Unknown4062", MakeVersionGate({20,0,0})}, + FunctionInfo{4063, nullptr, "Unknown4063", MakeVersionGate({20,0,0})}, + FunctionInfo{4064, nullptr, "Unknown4064", MakeVersionGate({20,0,0})}, + FunctionInfo{4065, nullptr, "Unknown4065", MakeVersionGate({20,0,0})}, + FunctionInfo{4066, nullptr, "Unknown4066", MakeVersionGate({20,0,0})}, + FunctionInfo{4067, nullptr, "Unknown4067", MakeVersionGate({20,0,0})}, + FunctionInfo{4068, nullptr, "Unknown4068", MakeVersionGate({20,0,0})}, + FunctionInfo{4069, nullptr, "Unknown4069", MakeVersionGate({20,0,0})}, + FunctionInfo{4070, nullptr, "Unknown4070", MakeVersionGate({20,0,0})}, + FunctionInfo{4071, nullptr, "Unknown4071", MakeVersionGate({20,0,0})}, + FunctionInfo{4072, nullptr, "Unknown4072", MakeVersionGate({20,0,0})}, + FunctionInfo{4073, nullptr, "Unknown4073", MakeVersionGate({20,0,0})}, + FunctionInfo{4074, nullptr, "Unknown4074", MakeVersionGate({20,0,0})}, + FunctionInfo{4075, nullptr, "Unknown4075", MakeVersionGate({20,0,0})}, + FunctionInfo{4076, nullptr, "Unknown4076", MakeVersionGate({20,0,0})}, + FunctionInfo{4077, nullptr, "Unknown4077", MakeVersionGate({20,0,0})}, + FunctionInfo{4078, nullptr, "Unknown4078", MakeVersionGate({20,0,0})}, + FunctionInfo{4079, nullptr, "Unknown4079", MakeVersionGate({20,0,0})}, + FunctionInfo{4080, nullptr, "Unknown4080", MakeVersionGate({20,0,0})}, + FunctionInfo{4081, nullptr, "Unknown4081", MakeVersionGate({20,0,0})}, + FunctionInfo{4083, nullptr, "Unknown4083", MakeVersionGate({20,0,0})}, + FunctionInfo{4084, nullptr, "Unknown4084", MakeVersionGate({20,0,0})}, + FunctionInfo{4085, nullptr, "Unknown4085", MakeVersionGate({20,0,0})}, + FunctionInfo{4086, nullptr, "Unknown4086", MakeVersionGate({20,0,0})}, + FunctionInfo{4087, nullptr, "Unknown4087", MakeVersionGate({20,0,0})}, + FunctionInfo{4088, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4088", MakeVersionGate({20,0,0})}, + FunctionInfo{4089, nullptr, "Unknown4089", MakeVersionGate({20,0,0})}, + FunctionInfo{4090, nullptr, "Unknown4090", MakeVersionGate({20,0,0})}, + FunctionInfo{4091, nullptr, "Unknown4091", MakeVersionGate({20,0,0})}, + FunctionInfo{4092, nullptr, "Unknown4092", MakeVersionGate({20,0,0})}, + FunctionInfo{4093, nullptr, "Unknown4093", MakeVersionGate({20,0,0})}, + FunctionInfo{4094, nullptr, "Unknown4094", MakeVersionGate({20,0,0})}, + FunctionInfo{4095, nullptr, "Unknown4095", MakeVersionGate({20,0,0})}, + FunctionInfo{4096, nullptr, "Unknown4096", MakeVersionGate({20,0,0})}, + FunctionInfo{4097, nullptr, "Unknown4097", MakeVersionGate({20,0,0})}, + FunctionInfo{4099, nullptr, "Unknown4099", MakeVersionGate({21,0,0})}, + FunctionInfo{4105, D<&IApplicationManagerInterface::Unknown4105>, "Unknown4105", MakeVersionGate({23,0,0})}, + FunctionInfo{5000, nullptr, "Unknown5000", MakeVersionGate({18,0,0})}, + FunctionInfo{5001, nullptr, "Unknown5001", MakeVersionGate({18,0,0})}, + FunctionInfo{9999, nullptr, "GetApplicationCertificate", MakeVersionGate({10,0,0}, {10,2,0})} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_) : ServiceFramework{system_, "IApplicationManagerInterface"}, service_context{system, "IApplicationManagerInterface"}, @@ -32,458 +484,6 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_ gamecard_update_detection_event{service_context}, gamecard_mount_status_event{service_context}, gamecard_mount_failure_event{service_context}, gamecard_waken_ready_event{service_context}, unknown_event{service_context} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IApplicationManagerInterface::ListApplicationRecord>, "ListApplicationRecord"}, - {1, nullptr, "GenerateApplicationRecordCount"}, - {2, D<&IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent>, "GetApplicationRecordUpdateSystemEvent"}, - {3, nullptr, "GetApplicationViewDeprecated"}, - {4, D<&IApplicationManagerInterface::DeleteApplicationEntity>, "DeleteApplicationEntity"}, - {5, D<&IApplicationManagerInterface::DeleteApplicationCompletely>, "DeleteApplicationCompletely"}, - {6, nullptr, "IsAnyApplicationEntityRedundant"}, - {7, nullptr, "DeleteRedundantApplicationEntity"}, - {8, nullptr, "IsApplicationEntityMovable"}, - {9, nullptr, "MoveApplicationEntity"}, - {11, nullptr, "CalculateApplicationOccupiedSize"}, - {16, &IApplicationManagerInterface::PushApplicationRecord, "PushApplicationRecord"}, - {17, nullptr, "ListApplicationRecordContentMeta"}, - {19, nullptr, "LaunchApplicationOld"}, - {21, nullptr, "GetApplicationContentPath"}, - {22, nullptr, "TerminateApplication"}, - {23, nullptr, "ResolveApplicationContentPath"}, - {26, nullptr, "BeginInstallApplication"}, - {27, nullptr, "DeleteApplicationRecord"}, - {30, nullptr, "RequestApplicationUpdateInfo"}, - {31, nullptr, "RequestUpdateApplication"}, - {32, nullptr, "CancelApplicationDownload"}, - {33, nullptr, "ResumeApplicationDownload"}, - {35, nullptr, "UpdateVersionList"}, - {36, nullptr, "PushLaunchVersion"}, - {37, nullptr, "ListRequiredVersion"}, - {38, D<&IApplicationManagerInterface::CheckApplicationLaunchVersion>, "CheckApplicationLaunchVersion"}, - {39, nullptr, "CheckApplicationLaunchRights"}, - {40, D<&IApplicationManagerInterface::GetApplicationLogoData>, "GetApplicationLogoData"}, - {41, nullptr, "CalculateApplicationDownloadRequiredSize"}, - {42, nullptr, "CleanupSdCard"}, - {43, D<&IApplicationManagerInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"}, - {44, D<&IApplicationManagerInterface::GetSdCardMountStatusChangedEvent>, "GetSdCardMountStatusChangedEvent"}, - {45, nullptr, "GetGameCardAttachmentEvent"}, - {46, nullptr, "GetGameCardAttachmentInfo"}, - {47, D<&IApplicationManagerInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"}, - {48, D<&IApplicationManagerInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"}, - {49, nullptr, "GetSdCardRemovedEvent"}, - {52, D<&IApplicationManagerInterface::GetGameCardUpdateDetectionEvent>, "GetGameCardUpdateDetectionEvent"}, - {53, nullptr, "DisableApplicationAutoDelete"}, - {54, nullptr, "EnableApplicationAutoDelete"}, - {55, D<&IApplicationManagerInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"}, - {56, nullptr, "SetApplicationTerminateResult"}, - {57, nullptr, "ClearApplicationTerminateResult"}, - {58, nullptr, "GetLastSdCardMountUnexpectedResult"}, - {59, D<&IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"}, - {60, nullptr, "ConvertLanguageCodeToApplicationLanguage"}, - {61, nullptr, "GetBackgroundDownloadStressTaskInfo"}, - {62, nullptr, "GetGameCardStopper"}, - {63, nullptr, "IsSystemProgramInstalled"}, - {64, nullptr, "StartApplyDeltaTask"}, - {65, nullptr, "GetRequestServerStopper"}, - {66, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"}, - {67, nullptr, "CancelApplicationApplyDelta"}, - {68, nullptr, "ResumeApplicationApplyDelta"}, - {69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"}, - {70, D<&IApplicationManagerInterface::ResumeAll>, "ResumeAll"}, - {71, D<&IApplicationManagerInterface::GetStorageSize>, "GetStorageSize"}, - {80, nullptr, "RequestDownloadApplication"}, - {81, nullptr, "RequestDownloadAddOnContent"}, - {82, nullptr, "DownloadApplication"}, - {83, nullptr, "CheckApplicationResumeRights"}, - {84, nullptr, "GetDynamicCommitEvent"}, - {85, nullptr, "RequestUpdateApplication2"}, - {86, nullptr, "EnableApplicationCrashReport"}, - {87, nullptr, "IsApplicationCrashReportEnabled"}, - {90, nullptr, "BoostSystemMemoryResourceLimit"}, - {91, nullptr, "DeprecatedLaunchApplication"}, - {92, nullptr, "GetRunningApplicationProgramId"}, - {93, nullptr, "GetMainApplicationProgramIndex"}, - {94, nullptr, "LaunchApplication"}, - {95, nullptr, "GetApplicationLaunchInfo"}, - {96, nullptr, "AcquireApplicationLaunchInfo"}, - {97, nullptr, "GetMainApplicationProgramIndexByApplicationLaunchInfo"}, - {98, nullptr, "EnableApplicationAllThreadDumpOnCrash"}, - {99, nullptr, "LaunchDevMenu"}, - {100, nullptr, "ResetToFactorySettings"}, - {101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"}, - {102, nullptr, "ResetToFactorySettingsForRefurbishment"}, - {103, nullptr, "ResetToFactorySettingsWithPlatformRegion"}, - {104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"}, - {105, nullptr, "RequestResetToFactorySettingsSecurely"}, - {106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"}, - {200, nullptr, "CalculateUserSaveDataStatistics"}, - {201, nullptr, "DeleteUserSaveDataAll"}, - {210, nullptr, "DeleteUserSystemSaveData"}, - {211, nullptr, "DeleteSaveData"}, - {220, nullptr, "UnregisterNetworkServiceAccount"}, - {221, D<&IApplicationManagerInterface::UnregisterNetworkServiceAccountWithUserSaveDataDeletion>, "UnregisterNetworkServiceAccountWithUserSaveDataDeletion"}, - {300, nullptr, "GetApplicationShellEvent"}, - {301, nullptr, "PopApplicationShellEventInfo"}, - {302, nullptr, "LaunchLibraryApplet"}, - {303, nullptr, "TerminateLibraryApplet"}, - {304, nullptr, "LaunchSystemApplet"}, - {305, nullptr, "TerminateSystemApplet"}, - {306, nullptr, "LaunchOverlayApplet"}, - {307, nullptr, "TerminateOverlayApplet"}, - {400, D<&IApplicationManagerInterface::GetApplicationControlData>, "GetApplicationControlData"}, - {401, nullptr, "InvalidateAllApplicationControlCache"}, - {402, nullptr, "RequestDownloadApplicationControlData"}, - {403, nullptr, "GetMaxApplicationControlCacheCount"}, - {404, nullptr, "InvalidateApplicationControlCache"}, - {405, nullptr, "ListApplicationControlCacheEntryInfo"}, - {406, nullptr, "GetApplicationControlProperty"}, - {407, &IApplicationManagerInterface::ListApplicationTitle, "ListApplicationTitle"}, - {408, &IApplicationManagerInterface::ListApplicationIcon, "ListApplicationIcon"}, - {411, nullptr, "Unknown411"}, //19.0.0+ - {412, nullptr, "Unknown412"}, //19.0.0+ - {413, nullptr, "Unknown413"}, //19.0.0+ - {414, nullptr, "Unknown414"}, //19.0.0+ - {415, nullptr, "Unknown415"}, //19.0.0+ - {416, nullptr, "Unknown416"}, //19.0.0+ - {417, nullptr, "InvalidateAllApplicationControlCacheOfTheStage"}, //19.0.0+ - {418, nullptr, "InvalidateApplicationControlCacheOfTheStage"}, //19.0.0+ - {419, D<&IApplicationManagerInterface::RequestDownloadApplicationControlDataInBackground>, "RequestDownloadApplicationControlDataInBackground"}, - {420, nullptr, "CloneApplicationControlDataCacheForDebug"}, - {421, nullptr, "Unknown421"}, //20.0.0+ - {422, nullptr, "Unknown422"}, //20.0.0+ - {423, nullptr, "Unknown423"}, //20.0.0+ - {424, nullptr, "Unknown424"}, //20.0.0+ - {425, nullptr, "Unknown425"}, //20.0.0+ - {426, nullptr, "Unknown426"}, //20.0.0+ - {427, nullptr, "Unknown427"}, //20.0.0+ - {428, nullptr, "Unknown428"}, //21.0.0+ - {429, nullptr, "Unknown429"}, //21.0.0+ - {430, nullptr, "Unknown430"}, //21.0.0+ - {502, nullptr, "RequestCheckGameCardRegistration"}, - {503, nullptr, "RequestGameCardRegistrationGoldPoint"}, - {504, nullptr, "RequestRegisterGameCard"}, - {505, D<&IApplicationManagerInterface::GetGameCardMountFailureEvent>, "GetGameCardMountFailureEvent"}, - {506, nullptr, "IsGameCardInserted"}, - {507, nullptr, "EnsureGameCardAccess"}, - {508, nullptr, "GetLastGameCardMountFailureResult"}, - {509, nullptr, "ListApplicationIdOnGameCard"}, - {510, nullptr, "GetGameCardPlatformRegion"}, - {511, D<&IApplicationManagerInterface::GetGameCardWakenReadyEvent>, "GetGameCardWakenReadyEvent"}, - {512, D<&IApplicationManagerInterface::IsGameCardApplicationRunning>, "IsGameCardApplicationRunning"}, - {513, nullptr, "Unknown513"}, //20.0.0+ - {514, nullptr, "Unknown514"}, //20.0.0+ - {515, nullptr, "Unknown515"}, //20.0.0+ - {516, nullptr, "Unknown516"}, //21.0.0+ - {517, nullptr, "Unknown517"}, //21.0.0+ - {518, nullptr, "Unknown518"}, //21.0.0+ - {519, nullptr, "Unknown519"}, //21.0.0+ - {600, nullptr, "CountApplicationContentMeta"}, - {601, nullptr, "ListApplicationContentMetaStatus"}, - {602, nullptr, "ListAvailableAddOnContent"}, - {603, nullptr, "GetOwnedApplicationContentMetaStatus"}, - {604, nullptr, "RegisterContentsExternalKey"}, - {605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"}, - {606, nullptr, "GetContentMetaStorage"}, - {607, nullptr, "ListAvailableAddOnContent"}, - {609, nullptr, "ListAvailabilityAssuredAddOnContent"}, - {610, nullptr, "GetInstalledContentMetaStorage"}, - {611, nullptr, "PrepareAddOnContent"}, - {700, nullptr, "PushDownloadTaskList"}, - {701, nullptr, "ClearTaskStatusList"}, - {702, nullptr, "RequestDownloadTaskList"}, - {703, nullptr, "RequestEnsureDownloadTask"}, - {704, nullptr, "ListDownloadTaskStatus"}, - {705, nullptr, "RequestDownloadTaskListData"}, - {800, nullptr, "RequestVersionList"}, - {801, nullptr, "ListVersionList"}, - {802, nullptr, "RequestVersionListData"}, - {900, nullptr, "GetApplicationRecord"}, - {901, nullptr, "GetApplicationRecordProperty"}, - {902, nullptr, "EnableApplicationAutoUpdate"}, - {903, nullptr, "DisableApplicationAutoUpdate"}, - {904, D<&IApplicationManagerInterface::TouchApplication>, "TouchApplication"}, - {905, nullptr, "RequestApplicationUpdate"}, - {906, D<&IApplicationManagerInterface::IsApplicationUpdateRequested>, "IsApplicationUpdateRequested"}, - {907, nullptr, "WithdrawApplicationUpdateRequest"}, - {908, nullptr, "ListApplicationRecordInstalledContentMeta"}, - {909, nullptr, "WithdrawCleanupAddOnContentsWithNoRightsRecommendation"}, - {910, nullptr, "HasApplicationRecord"}, - {911, nullptr, "SetPreInstalledApplication"}, - {912, nullptr, "ClearPreInstalledApplicationFlag"}, - {913, nullptr, "ListAllApplicationRecord"}, - {914, nullptr, "HideApplicationRecord"}, - {915, nullptr, "ShowApplicationRecord"}, - {916, nullptr, "IsApplicationAutoDeleteDisabled"}, - {916, nullptr, "Unknown916"}, //20.0.0+ - {917, nullptr, "Unknown917"}, //20.0.0+ - {918, nullptr, "Unknown918"}, //20.0.0+ - {919, nullptr, "Unknown919"}, //20.0.0+ - {920, nullptr, "Unknown920"}, //20.0.0+ - {921, nullptr, "Unknown921"}, //20.0.0+ - {922, nullptr, "Unknown922"}, //20.0.0+ - {923, nullptr, "Unknown923"}, //20.0.0+ - {928, nullptr, "Unknown928"}, //20.0.0+ - {929, nullptr, "Unknown929"}, //20.0.0+ - {930, nullptr, "Unknown930"}, //20.0.0+ - {931, nullptr, "Unknown931"}, //20.0.0+ - {933, nullptr, "Unknown933"}, //20.0.0+ - {934, nullptr, "Unknown934"}, //21.0.0+ - {935, nullptr, "Unknown935"}, //21.0.0+ - {936, D<&IApplicationManagerInterface::Unknown936>, "Unknown936"}, //21.0.0+ - {1000, nullptr, "RequestVerifyApplicationDeprecated"}, - {1001, nullptr, "CorruptApplicationForDebug"}, - {1002, nullptr, "RequestVerifyAddOnContentsRights"}, - {1003, nullptr, "RequestVerifyApplication"}, - {1004, nullptr, "CorruptContentForDebug"}, - {1200, nullptr, "NeedsUpdateVulnerability"}, - {1300, D<&IApplicationManagerInterface::IsAnyApplicationEntityInstalled>, "IsAnyApplicationEntityInstalled"}, - {1301, nullptr, "DeleteApplicationContentEntities"}, - {1302, nullptr, "CleanupUnrecordedApplicationEntity"}, - {1303, nullptr, "CleanupAddOnContentsWithNoRights"}, - {1304, nullptr, "DeleteApplicationContentEntity"}, - {1305, nullptr, "TryDeleteRunningApplicationEntity"}, - {1306, nullptr, "TryDeleteRunningApplicationCompletely"}, - {1307, nullptr, "TryDeleteRunningApplicationContentEntities"}, - {1308, nullptr, "DeleteApplicationCompletelyForDebug"}, - {1309, nullptr, "CleanupUnavailableAddOnContents"}, - {1310, nullptr, "RequestMoveApplicationEntity"}, - {1311, nullptr, "EstimateSizeToMove"}, - {1312, nullptr, "HasMovableEntity"}, - {1313, nullptr, "CleanupOrphanContents"}, - {1314, nullptr, "CheckPreconditionSatisfiedToMove"}, - {1400, nullptr, "PrepareShutdown"}, - {1500, nullptr, "FormatSdCard"}, - {1501, nullptr, "NeedsSystemUpdateToFormatSdCard"}, - {1502, nullptr, "GetLastSdCardFormatUnexpectedResult"}, - {1504, nullptr, "InsertSdCard"}, - {1505, nullptr, "RemoveSdCard"}, - {1506, nullptr, "GetSdCardStartupStatus"}, - {1508, nullptr, "Unknown1508"}, //20.0.0+ - {1509, nullptr, "Unknown1509"}, //20.0.0+ - {1510, nullptr, "Unknown1510"}, //20.0.0+ - {1511, nullptr, "Unknown1511"}, //20.0.0+ - {1512, nullptr, "Unknown1512"}, //20.0.0+ - {1600, nullptr, "GetSystemSeedForPseudoDeviceId"}, - {1601, nullptr, "ResetSystemSeedForPseudoDeviceId"}, - {1700, nullptr, "ListApplicationDownloadingContentMeta"}, - {1701, D<&IApplicationManagerInterface::GetApplicationViewDeprecated>, "GetApplicationViewDeprecated"}, - {1702, nullptr, "GetApplicationDownloadTaskStatus"}, - {1703, nullptr, "GetApplicationViewDownloadErrorContext"}, - {1704, D<&IApplicationManagerInterface::GetApplicationViewWithPromotionInfo>, "GetApplicationViewWithPromotionInfo"}, - {1705, nullptr, "IsPatchAutoDeletableApplication"}, - {1706, D<&IApplicationManagerInterface::GetApplicationView>, "GetApplicationView"}, - {1800, nullptr, "IsNotificationSetupCompleted"}, - {1801, nullptr, "GetLastNotificationInfoCount"}, - {1802, nullptr, "ListLastNotificationInfo"}, - {1803, nullptr, "ListNotificationTask"}, - {1900, nullptr, "IsActiveAccount"}, - {1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"}, - {1902, nullptr, "GetApplicationTicketInfo"}, - {1903, nullptr, "RequestDownloadApplicationPrepurchasedRightsForAccount"}, - {2000, nullptr, "GetSystemDeliveryInfo"}, - {2001, nullptr, "SelectLatestSystemDeliveryInfo"}, - {2002, nullptr, "VerifyDeliveryProtocolVersion"}, - {2003, nullptr, "GetApplicationDeliveryInfo"}, - {2004, nullptr, "HasAllContentsToDeliver"}, - {2005, nullptr, "CompareApplicationDeliveryInfo"}, - {2006, nullptr, "CanDeliverApplication"}, - {2007, nullptr, "ListContentMetaKeyToDeliverApplication"}, - {2008, nullptr, "NeedsSystemUpdateToDeliverApplication"}, - {2009, nullptr, "EstimateRequiredSize"}, - {2010, nullptr, "RequestReceiveApplication"}, - {2011, nullptr, "CommitReceiveApplication"}, - {2012, nullptr, "GetReceiveApplicationProgress"}, - {2013, nullptr, "RequestSendApplication"}, - {2014, nullptr, "GetSendApplicationProgress"}, - {2015, nullptr, "CompareSystemDeliveryInfo"}, - {2016, nullptr, "ListNotCommittedContentMeta"}, - {2017, nullptr, "CreateDownloadTask"}, - {2018, nullptr, "GetApplicationDeliveryInfoHash"}, - {2019, nullptr, "Unknown2019"}, //20.0.0+ - {2050, D<&IApplicationManagerInterface::GetApplicationRightsOnClient>, "GetApplicationRightsOnClient"}, - {2051, nullptr, "InvalidateRightsIdCache"}, - {2052, nullptr, "Unknown2052"}, //20.0.0+ - {2053, nullptr, "Unknown2053"}, //20.0.0+ - {2100, D<&IApplicationManagerInterface::GetApplicationTerminateResult>, "GetApplicationTerminateResult"}, - {2101, nullptr, "GetRawApplicationTerminateResult"}, - {2150, nullptr, "CreateRightsEnvironment"}, - {2151, nullptr, "DestroyRightsEnvironment"}, - {2152, nullptr, "ActivateRightsEnvironment"}, - {2153, nullptr, "DeactivateRightsEnvironment"}, - {2154, nullptr, "ForceActivateRightsContextForExit"}, - {2155, nullptr, "UpdateRightsEnvironmentStatus"}, - {2156, nullptr, "CreateRightsEnvironmentForMicroApplication"}, - {2160, nullptr, "AddTargetApplicationToRightsEnvironment"}, - {2161, nullptr, "SetUsersToRightsEnvironment"}, - {2170, nullptr, "GetRightsEnvironmentStatus"}, - {2171, nullptr, "GetRightsEnvironmentStatusChangedEvent"}, - {2180, nullptr, "RequestExtendRightsInRightsEnvironment"}, - {2181, nullptr, "GetResultOfExtendRightsInRightsEnvironment"}, - {2182, nullptr, "SetActiveRightsContextUsingStateToRightsEnvironment"}, - {2183, nullptr, "Unknown2183"}, //20.1.0+ - {2190, nullptr, "GetRightsEnvironmentHandleForApplication"}, - {2199, nullptr, "GetRightsEnvironmentCountForDebug"}, - {2200, nullptr, "GetGameCardApplicationCopyIdentifier"}, - {2201, nullptr, "GetInstalledApplicationCopyIdentifier"}, - {2250, nullptr, "RequestReportActiveELicence"}, - {2300, nullptr, "ListEventLog"}, - {2350, nullptr, "PerformAutoUpdateByApplicationId"}, - {2351, nullptr, "RequestNoDownloadRightsErrorResolution"}, - {2352, nullptr, "RequestResolveNoDownloadRightsError"}, - {2353, nullptr, "GetApplicationDownloadTaskInfo"}, - {2354, nullptr, "PrioritizeApplicationBackgroundTask"}, - {2355, nullptr, "PreferStorageEfficientUpdate"}, - {2356, nullptr, "RequestStorageEfficientUpdatePreferable"}, - {2357, nullptr, "EnableMultiCoreDownload"}, - {2358, nullptr, "DisableMultiCoreDownload"}, - {2359, nullptr, "IsMultiCoreDownloadEnabled"}, - {2360, nullptr, "GetApplicationDownloadTaskCount"}, //19.0.0+ - {2361, nullptr, "GetMaxApplicationDownloadTaskCount"}, //19.0.0+ - {2362, nullptr, "Unknown2362"}, //20.0.0+ - {2363, nullptr, "Unknown2363"}, //20.0.0+ - {2364, nullptr, "Unknown2364"}, //20.0.0+ - {2365, nullptr, "Unknown2365"}, //20.0.0+ - {2366, nullptr, "Unknown2366"}, //20.0.0+ - {2367, nullptr, "Unknown2367"}, //20.0.0+ - {2368, nullptr, "Unknown2368"}, //20.0.0+ - {2369, nullptr, "Unknown2369"}, //21.0.0+ - {2400, nullptr, "GetPromotionInfo"}, - {2401, nullptr, "CountPromotionInfo"}, - {2402, nullptr, "ListPromotionInfo"}, - {2403, nullptr, "ImportPromotionJsonForDebug"}, - {2404, nullptr, "ClearPromotionInfoForDebug"}, - {2500, nullptr, "ConfirmAvailableTime"}, - {2510, nullptr, "CreateApplicationResource"}, - {2511, nullptr, "GetApplicationResource"}, - {2513, nullptr, "LaunchMicroApplication"}, - {2514, nullptr, "ClearTaskOfAsyncTaskManager"}, - {2515, nullptr, "CleanupAllPlaceHolderAndFragmentsIfNoTask"}, - {2516, nullptr, "EnsureApplicationCertificate"}, - {2517, nullptr, "CreateApplicationInstance"}, - {2518, nullptr, "UpdateQualificationForDebug"}, - {2519, nullptr, "IsQualificationTransitionSupported"}, - {2520, D<&IApplicationManagerInterface::IsQualificationTransitionSupportedByProcessId>, "IsQualificationTransitionSupportedByProcessId"}, - {2521, nullptr, "GetRightsUserChangedEvent"}, - {2522, nullptr, "IsRomRedirectionAvailable"}, - {2523, nullptr, "GetProgramId"}, //17.0.0+ - {2524, nullptr, "Unknown2524"}, //19.0.0+ - {2525, nullptr, "Unknown2525"}, //20.0.0+ - {2800, nullptr, "GetApplicationIdOfPreomia"}, - {3000, nullptr, "RegisterDeviceLockKey"}, - {3001, nullptr, "UnregisterDeviceLockKey"}, - {3002, nullptr, "VerifyDeviceLockKey"}, - {3003, nullptr, "HideApplicationIcon"}, - {3004, nullptr, "ShowApplicationIcon"}, - {3005, nullptr, "HideApplicationTitle"}, - {3006, nullptr, "ShowApplicationTitle"}, - {3007, nullptr, "EnableGameCard"}, - {3008, nullptr, "DisableGameCard"}, - {3009, nullptr, "EnableLocalContentShare"}, - {3010, nullptr, "DisableLocalContentShare"}, - {3011, nullptr, "IsApplicationIconHidden"}, - {3012, nullptr, "IsApplicationTitleHidden"}, - {3013, nullptr, "IsGameCardEnabled"}, - {3014, nullptr, "IsLocalContentShareEnabled"}, - {3050, nullptr, "ListAssignELicenseTaskResult"}, - {3104, nullptr, "GetApplicationNintendoLogo"}, //18.0.0+ - {3105, nullptr, "GetApplicationStartupMovie"}, //18.0.0+ - {4000, nullptr, "Unknown4000"}, //20.0.0+ - {4004, nullptr, "Unknown4004"}, //20.0.0+ - {4006, nullptr, "Unknown4006"}, //20.0.0+ - {4007, nullptr, "Unknown4007"}, //20.0.0+ - {4008, nullptr, "Unknown4008"}, //20.0.0+ - {4009, nullptr, "Unknown4009"}, //20.0.0+ - {4010, nullptr, "Unknown4010"}, //20.0.0+ - {4011, nullptr, "Unknown4011"}, //20.0.0+ - {4012, nullptr, "Unknown4012"}, //20.0.0+ - {4013, nullptr, "Unknown4013"}, //20.0.0+ - {4015, nullptr, "Unknown4015"}, //20.0.0+ - {4017, nullptr, "Unknown4017"}, //20.0.0+ - {4019, nullptr, "Unknown4019"}, //20.0.0+ - {4020, nullptr, "Unknown4020"}, //20.0.0+ - {4021, nullptr, "Unknown4021"}, //20.0.0+ - {4022, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4022"}, //20.0.0+ - {4023, D<&IApplicationManagerInterface::Unknown4023>, "Unknown4023"}, //20.0.0+ - {4024, nullptr, "Unknown4024"}, //20.0.0+ - {4025, nullptr, "Unknown4025"}, //20.0.0+ - {4026, nullptr, "Unknown4026"}, //20.0.0+ - {4027, nullptr, "Unknown4027"}, //20.0.0+ - {4028, nullptr, "Unknown4028"}, //20.0.0+ - {4029, nullptr, "Unknown4029"}, //20.0.0+ - {4030, nullptr, "Unknown4030"}, //20.0.0+ - {4031, nullptr, "Unknown4031"}, //20.0.0+ - {4032, nullptr, "Unknown4032"}, //20.0.0+ - {4033, nullptr, "Unknown4033"}, //20.0.0+ - {4034, nullptr, "Unknown4034"}, //20.0.0+ - {4035, nullptr, "Unknown4035"}, //20.0.0+ - {4037, nullptr, "Unknown4037"}, //20.0.0+ - {4038, nullptr, "Unknown4038"}, //20.0.0+ - {4039, nullptr, "Unknown4039"}, //20.0.0+ - {4040, nullptr, "Unknown4040"}, //20.0.0+ - {4041, nullptr, "Unknown4041"}, //20.0.0+ - {4042, D<&IApplicationManagerInterface::Unknown4042>, "Unknown4042"}, //20.0.0+ - {4043, nullptr, "Unknown4043"}, //20.0.0+ - {4044, nullptr, "Unknown4044"}, //20.0.0+ - {4045, nullptr, "Unknown4045"}, //20.0.0+ - {4046, nullptr, "Unknown4046"}, //20.0.0+ - {4049, nullptr, "Unknown4049"}, //20.0.0+ - {4050, nullptr, "Unknown4050"}, //20.0.0+ - {4051, nullptr, "Unknown4051"}, //20.0.0+ - {4052, nullptr, "Unknown4052"}, //20.0.0+ - {4053, D<&IApplicationManagerInterface::Unknown4053>, "Unknown4053"}, //20.0.0+ - {4054, nullptr, "Unknown4054"}, //20.0.0+ - {4055, nullptr, "Unknown4055"}, //20.0.0+ - {4056, nullptr, "Unknown4056"}, //20.0.0+ - {4057, nullptr, "Unknown4057"}, //20.0.0+ - {4058, nullptr, "Unknown4058"}, //20.0.0+ - {4059, nullptr, "Unknown4059"}, //20.0.0+ - {4060, nullptr, "Unknown4060"}, //20.0.0+ - {4061, nullptr, "Unknown4061"}, //20.0.0+ - {4062, nullptr, "Unknown4062"}, //20.0.0+ - {4063, nullptr, "Unknown4063"}, //20.0.0+ - {4064, nullptr, "Unknown4064"}, //20.0.0+ - {4065, nullptr, "Unknown4065"}, //20.0.0+ - {4066, nullptr, "Unknown4066"}, //20.0.0+ - {4067, nullptr, "Unknown4067"}, //20.0.0+ - {4068, nullptr, "Unknown4068"}, //20.0.0+ - {4069, nullptr, "Unknown4069"}, //20.0.0+ - {4070, nullptr, "Unknown4070"}, //20.0.0+ - {4071, nullptr, "Unknown4071"}, //20.0.0+ - {4072, nullptr, "Unknown4072"}, //20.0.0+ - {4073, nullptr, "Unknown4073"}, //20.0.0+ - {4074, nullptr, "Unknown4074"}, //20.0.0+ - {4075, nullptr, "Unknown4075"}, //20.0.0+ - {4076, nullptr, "Unknown4076"}, //20.0.0+ - {4077, nullptr, "Unknown4077"}, //20.0.0+ - {4078, nullptr, "Unknown4078"}, //20.0.0+ - {4079, nullptr, "Unknown4079"}, //20.0.0+ - {4080, nullptr, "Unknown4080"}, //20.0.0+ - {4081, nullptr, "Unknown4081"}, //20.0.0+ - {4083, nullptr, "Unknown4083"}, //20.0.0+ - {4084, nullptr, "Unknown4084"}, //20.0.0+ - {4085, nullptr, "Unknown4085"}, //20.0.0+ - {4086, nullptr, "Unknown4086"}, //20.0.0+ - {4087, nullptr, "Unknown4087"}, //20.0.0+ - {4088, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4088"}, //20.0.0+ - {4089, nullptr, "Unknown4089"}, //20.0.0+ - {4090, nullptr, "Unknown4090"}, //20.0.0+ - {4091, nullptr, "Unknown4091"}, //20.0.0+ - {4092, nullptr, "Unknown4092"}, //20.0.0+ - {4093, nullptr, "Unknown4093"}, //20.0.0+ - {4094, nullptr, "Unknown4094"}, //20.0.0+ - {4095, nullptr, "Unknown4095"}, //20.0.0+ - {4096, nullptr, "Unknown4096"}, //20.0.0+ - {4097, nullptr, "Unknown4097"}, //20.0.0+ - {4099, nullptr, "Unknown4099"}, //21.0.0+ - {4105, D<&IApplicationManagerInterface::Unknown4105>, "Unknown4105"}, //23.0.0+ - {5000, nullptr, "Unknown5000"}, //18.0.0+ - {5001, nullptr, "Unknown5001"}, //18.0.0+ - {9999, nullptr, "GetApplicationCertificate"}, //10.0.0-10.2.0 - }; - // clang-format on - - RegisterHandlers(functions); } IApplicationManagerInterface::~IApplicationManagerInterface() = default; diff --git a/src/core/hle/service/ns/application_manager_interface.h b/src/core/hle/service/ns/application_manager_interface.h index c4ca66f319..592068823c 100644 --- a/src/core/hle/service/ns/application_manager_interface.h +++ b/src/core/hle/service/ns/application_manager_interface.h @@ -85,6 +85,7 @@ public: void PushApplicationRecord(HLERequestContext& ctx); void ListApplicationTitle(HLERequestContext& ctx); void ListApplicationIcon(HLERequestContext& ctx); + std::optional FindRequest(u32 key) override; private: KernelHelpers::ServiceContext service_context; diff --git a/src/core/hle/service/ns/application_version_interface.cpp b/src/core/hle/service/ns/application_version_interface.cpp index b89e127dbe..e1e747f6d2 100644 --- a/src/core/hle/service/ns/application_version_interface.cpp +++ b/src/core/hle/service/ns/application_version_interface.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,25 +10,6 @@ namespace Service::NS { IApplicationVersionInterface::IApplicationVersionInterface(Core::System& system_) : ServiceFramework{system_, "IApplicationVersionInterface"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetLaunchRequiredVersion"}, - {1, nullptr, "UpgradeLaunchRequiredVersion"}, - {35, nullptr, "UpdateVersionList"}, - {36, nullptr, "PushLaunchVersion"}, - {37, nullptr, "ListRequiredVersion"}, - {800, nullptr, "RequestVersionList"}, - {801, nullptr, "ListVersionList"}, - {802, nullptr, "RequestVersionListData"}, - {900, nullptr, "ImportAutoUpdatePolicyJsonForDebug"}, - {901, nullptr, "ListDefaultAutoUpdatePolicy"}, - {902, nullptr, "ListAutoUpdatePolicyForSpecificApplication"}, - {1000, nullptr, "PerformAutoUpdate"}, - {1001, nullptr, "ListAutoUpdateSchedule"}, - }; - // clang-format on - - RegisterHandlers(functions); } IApplicationVersionInterface::~IApplicationVersionInterface() = default; diff --git a/src/core/hle/service/ns/application_version_interface.h b/src/core/hle/service/ns/application_version_interface.h index b288cff1be..c1f7710a00 100644 --- a/src/core/hle/service/ns/application_version_interface.h +++ b/src/core/hle/service/ns/application_version_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,6 +14,25 @@ class IApplicationVersionInterface final : public ServiceFramework FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetLaunchRequiredVersion"}, + FunctionInfo{1, nullptr, "UpgradeLaunchRequiredVersion"}, + FunctionInfo{35, nullptr, "UpdateVersionList"}, + FunctionInfo{36, nullptr, "PushLaunchVersion"}, + FunctionInfo{37, nullptr, "ListRequiredVersion"}, + FunctionInfo{800, nullptr, "RequestVersionList"}, + FunctionInfo{801, nullptr, "ListVersionList"}, + FunctionInfo{802, nullptr, "RequestVersionListData"}, + FunctionInfo{900, nullptr, "ImportAutoUpdatePolicyJsonForDebug"}, + FunctionInfo{901, nullptr, "ListDefaultAutoUpdatePolicy"}, + FunctionInfo{902, nullptr, "ListAutoUpdatePolicyForSpecificApplication"}, + FunctionInfo{1000, nullptr, "PerformAutoUpdate"}, + FunctionInfo{1001, nullptr, "ListAutoUpdateSchedule"} + ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/async_result.cpp b/src/core/hle/service/ns/async_result.cpp index 8617280bef..d93c510141 100644 --- a/src/core/hle/service/ns/async_result.cpp +++ b/src/core/hle/service/ns/async_result.cpp @@ -8,17 +8,17 @@ namespace Service::NS { +std::optional IAsyncResult::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Get"}, + FunctionInfo{1, D<&IAsyncResult::Cancel>, "Cancel"}, + FunctionInfo{2, nullptr, "GetErrorContext", MakeVersionGate({4,0,0})} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IAsyncResult::IAsyncResult(Core::System& system_, Service::Event* event_) : ServiceFramework{system_, "nn::ns::detail::IAsyncResult"}, event{event_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Get"}, - {1, D<&IAsyncResult::Cancel>, "Cancel"}, - {2, nullptr, "GetErrorContext"}, // 4.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); } IAsyncResult::~IAsyncResult() = default; diff --git a/src/core/hle/service/ns/async_result.h b/src/core/hle/service/ns/async_result.h index 914ea5a42c..1cad75bf47 100644 --- a/src/core/hle/service/ns/async_result.h +++ b/src/core/hle/service/ns/async_result.h @@ -13,6 +13,7 @@ public: private: Result Cancel(); + std::optional FindRequest(u32 key) override; Service::Event* event{}; }; diff --git a/src/core/hle/service/ns/content_management_interface.cpp b/src/core/hle/service/ns/content_management_interface.cpp index 39b9cb6f70..45922ffab3 100644 --- a/src/core/hle/service/ns/content_management_interface.cpp +++ b/src/core/hle/service/ns/content_management_interface.cpp @@ -15,22 +15,6 @@ namespace Service::NS { IContentManagementInterface::IContentManagementInterface(Core::System& system_) : ServiceFramework{system_, "IContentManagementInterface"} { - // clang-format off - static const FunctionInfo functions[] = { - {11, D<&IContentManagementInterface::CalculateApplicationOccupiedSize>, "CalculateApplicationOccupiedSize"}, - {43, D<&IContentManagementInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"}, - {47, D<&IContentManagementInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"}, - {48, D<&IContentManagementInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"}, - {71, D<&IContentManagementInterface::GetUnknown71>, "Unknown71"}, - {600, nullptr, "CountApplicationContentMeta"}, - {601, nullptr, "ListApplicationContentMetaStatus"}, - {605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"}, - {607, nullptr, "IsAnyApplicationRunning"}, - {608, nullptr, "Unknown608"}, //21.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); } IContentManagementInterface::~IContentManagementInterface() = default; diff --git a/src/core/hle/service/ns/content_management_interface.h b/src/core/hle/service/ns/content_management_interface.h index df0c51a184..bddd044b45 100644 --- a/src/core/hle/service/ns/content_management_interface.h +++ b/src/core/hle/service/ns/content_management_interface.h @@ -24,6 +24,22 @@ public: Result GetTotalSpaceSize(Out out_total_space_size, FileSys::StorageId storage_id); Result GetFreeSpaceSize(Out out_free_space_size, FileSys::StorageId storage_id); Result GetUnknown71(Out out_value_a, Out out_value_b, u8 flag); + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{11, D<&IContentManagementInterface::CalculateApplicationOccupiedSize>, "CalculateApplicationOccupiedSize"}, + FunctionInfo{43, D<&IContentManagementInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"}, + FunctionInfo{47, D<&IContentManagementInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"}, + FunctionInfo{48, D<&IContentManagementInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"}, + FunctionInfo{71, D<&IContentManagementInterface::GetUnknown71>, "Unknown71"}, + FunctionInfo{600, nullptr, "CountApplicationContentMeta"}, + FunctionInfo{601, nullptr, "ListApplicationContentMetaStatus"}, + FunctionInfo{605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"}, + FunctionInfo{607, nullptr, "IsAnyApplicationRunning"}, + FunctionInfo{608, nullptr, "Unknown608", MakeVersionGate({21,0,0})} + ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/develop_interface.cpp b/src/core/hle/service/ns/develop_interface.cpp index 880bdbebbf..2fc41cd7dd 100644 --- a/src/core/hle/service/ns/develop_interface.cpp +++ b/src/core/hle/service/ns/develop_interface.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,31 +9,6 @@ namespace Service::NS { IDevelopInterface::IDevelopInterface(Core::System& system_) : ServiceFramework{system_, "ns:dev"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "LaunchProgram"}, - {1, nullptr, "TerminateProcess"}, - {2, nullptr, "TerminateProgram"}, - {4, nullptr, "GetShellEvent"}, - {5, nullptr, "GetShellEventInfo"}, - {6, nullptr, "TerminateApplication"}, - {7, nullptr, "PrepareLaunchProgramFromHost"}, - {8, nullptr, "LaunchApplicationFromHost"}, - {9, nullptr, "LaunchApplicationWithStorageIdForDevelop"}, - {10, nullptr, "IsSystemMemoryResourceLimitBoosted"}, - {11, nullptr, "GetRunningApplicationProcessIdForDevelop"}, - {12, nullptr, "SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop"}, - {13, nullptr, "CreateApplicationResourceForDevelop"}, - {14, nullptr, "IsPreomiaForDevelop"}, - {15, nullptr, "GetApplicationProgramIdFromHost"}, - {16, nullptr, "RefreshCachedDebugValues"}, - {17, nullptr, "PrepareLaunchApplicationFromHost"}, - {18, nullptr, "GetLaunchEvent"}, - {19, nullptr, "GetLaunchResult"}, - }; - // clang-format on - - RegisterHandlers(functions); } IDevelopInterface::~IDevelopInterface() = default; diff --git a/src/core/hle/service/ns/develop_interface.h b/src/core/hle/service/ns/develop_interface.h index a9f81ccd60..55e54fa38d 100644 --- a/src/core/hle/service/ns/develop_interface.h +++ b/src/core/hle/service/ns/develop_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,6 +14,31 @@ class IDevelopInterface final : public ServiceFramework { public: explicit IDevelopInterface(Core::System& system_); ~IDevelopInterface() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "LaunchProgram"}, + FunctionInfo{1, nullptr, "TerminateProcess"}, + FunctionInfo{2, nullptr, "TerminateProgram"}, + FunctionInfo{4, nullptr, "GetShellEvent"}, + FunctionInfo{5, nullptr, "GetShellEventInfo"}, + FunctionInfo{6, nullptr, "TerminateApplication"}, + FunctionInfo{7, nullptr, "PrepareLaunchProgramFromHost"}, + FunctionInfo{8, nullptr, "LaunchApplicationFromHost"}, + FunctionInfo{9, nullptr, "LaunchApplicationWithStorageIdForDevelop"}, + FunctionInfo{10, nullptr, "IsSystemMemoryResourceLimitBoosted"}, + FunctionInfo{11, nullptr, "GetRunningApplicationProcessIdForDevelop"}, + FunctionInfo{12, nullptr, "SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop"}, + FunctionInfo{13, nullptr, "CreateApplicationResourceForDevelop"}, + FunctionInfo{14, nullptr, "IsPreomiaForDevelop"}, + FunctionInfo{15, nullptr, "GetApplicationProgramIdFromHost"}, + FunctionInfo{16, nullptr, "RefreshCachedDebugValues"}, + FunctionInfo{17, nullptr, "PrepareLaunchApplicationFromHost"}, + FunctionInfo{18, nullptr, "GetLaunchEvent"}, + FunctionInfo{19, nullptr, "GetLaunchResult"} + ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/document_interface.cpp b/src/core/hle/service/ns/document_interface.cpp index 51a1e46c0d..f9a1e2267a 100644 --- a/src/core/hle/service/ns/document_interface.cpp +++ b/src/core/hle/service/ns/document_interface.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,15 +12,6 @@ namespace Service::NS { IDocumentInterface::IDocumentInterface(Core::System& system_) : ServiceFramework{system_, "IDocumentInterface"} { - // clang-format off - static const FunctionInfo functions[] = { - {21, nullptr, "GetApplicationContentPath"}, - {23, D<&IDocumentInterface::ResolveApplicationContentPath>, "ResolveApplicationContentPath"}, - {92, D<&IDocumentInterface::GetRunningApplicationProgramId>, "GetRunningApplicationProgramId"}, - }; - // clang-format on - - RegisterHandlers(functions); } IDocumentInterface::~IDocumentInterface() = default; diff --git a/src/core/hle/service/ns/document_interface.h b/src/core/hle/service/ns/document_interface.h index cd461652cf..43a194c3e6 100644 --- a/src/core/hle/service/ns/document_interface.h +++ b/src/core/hle/service/ns/document_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -17,6 +20,15 @@ public: private: Result ResolveApplicationContentPath(ContentPath content_path); Result GetRunningApplicationProgramId(Out out_program_id, u64 caller_program_id); + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{21, nullptr, "GetApplicationContentPath"}, + FunctionInfo{23, D<&IDocumentInterface::ResolveApplicationContentPath>, "ResolveApplicationContentPath"}, + FunctionInfo{92, D<&IDocumentInterface::GetRunningApplicationProgramId>, "GetRunningApplicationProgramId"} + ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/download_task_interface.cpp b/src/core/hle/service/ns/download_task_interface.cpp index 62dc7f1874..9fe6ca512f 100644 --- a/src/core/hle/service/ns/download_task_interface.cpp +++ b/src/core/hle/service/ns/download_task_interface.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,21 +11,6 @@ namespace Service::NS { IDownloadTaskInterface::IDownloadTaskInterface(Core::System& system_) : ServiceFramework{system_, "IDownloadTaskInterface"} { - // clang-format off - static const FunctionInfo functions[] = { - {701, nullptr, "ClearTaskStatusList"}, - {702, nullptr, "RequestDownloadTaskList"}, - {703, nullptr, "RequestEnsureDownloadTask"}, - {704, nullptr, "ListDownloadTaskStatus"}, - {705, nullptr, "RequestDownloadTaskListData"}, - {706, nullptr, "TryCommitCurrentApplicationDownloadTask"}, - {707, D<&IDownloadTaskInterface::EnableAutoCommit>, "EnableAutoCommit"}, - {708, D<&IDownloadTaskInterface::DisableAutoCommit>, "DisableAutoCommit"}, - {709, nullptr, "TriggerDynamicCommitEvent"}, - }; - // clang-format on - - RegisterHandlers(functions); } IDownloadTaskInterface::~IDownloadTaskInterface() = default; diff --git a/src/core/hle/service/ns/download_task_interface.h b/src/core/hle/service/ns/download_task_interface.h index b1cb69cb86..0fd2bacd42 100644 --- a/src/core/hle/service/ns/download_task_interface.h +++ b/src/core/hle/service/ns/download_task_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,6 +18,21 @@ public: private: Result EnableAutoCommit(); Result DisableAutoCommit(); + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{701, nullptr, "ClearTaskStatusList"}, + FunctionInfo{702, nullptr, "RequestDownloadTaskList"}, + FunctionInfo{703, nullptr, "RequestEnsureDownloadTask"}, + FunctionInfo{704, nullptr, "ListDownloadTaskStatus"}, + FunctionInfo{705, nullptr, "RequestDownloadTaskListData"}, + FunctionInfo{706, nullptr, "TryCommitCurrentApplicationDownloadTask"}, + FunctionInfo{707, D<&IDownloadTaskInterface::EnableAutoCommit>, "EnableAutoCommit"}, + FunctionInfo{708, D<&IDownloadTaskInterface::DisableAutoCommit>, "DisableAutoCommit"}, + FunctionInfo{709, nullptr, "TriggerDynamicCommitEvent"} + ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/dynamic_rights_interface.cpp b/src/core/hle/service/ns/dynamic_rights_interface.cpp index 0301085670..951ef4c4b2 100644 --- a/src/core/hle/service/ns/dynamic_rights_interface.cpp +++ b/src/core/hle/service/ns/dynamic_rights_interface.cpp @@ -9,43 +9,43 @@ namespace Service::NS { +std::optional IDynamicRightsInterface::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestApplicationRightsOnServer"}, + FunctionInfo{1, nullptr, "RequestAssignRights"}, + FunctionInfo{4, nullptr, "DeprecatedRequestAssignRightsToResume"}, + FunctionInfo{5, D<&IDynamicRightsInterface::VerifyActivatedRightsOwners>, "VerifyActivatedRightsOwners"}, + FunctionInfo{6, nullptr, "DeprecatedGetApplicationRightsStatus"}, + FunctionInfo{7, nullptr, "RequestPrefetchForDynamicRights"}, + FunctionInfo{8, nullptr, "GetDynamicRightsState"}, + FunctionInfo{9, nullptr, "RequestApplicationRightsOnServerToResume"}, + FunctionInfo{10, nullptr, "RequestAssignRightsToResume"}, + FunctionInfo{11, nullptr, "GetActivatedRightsUsers"}, + FunctionInfo{12, nullptr, "GetApplicationRightsStatus"}, + FunctionInfo{13, D<&IDynamicRightsInterface::GetRunningApplicationStatus>, "GetRunningApplicationStatus"}, + FunctionInfo{14, nullptr, "SelectApplicationLicense"}, + FunctionInfo{15, nullptr, "RequestContentsAuthorizationToken"}, + FunctionInfo{16, nullptr, "QualifyUser"}, + FunctionInfo{17, nullptr, "QualifyUserWithProcessId"}, + FunctionInfo{18, D<&IDynamicRightsInterface::NotifyApplicationRightsCheckStart>, "NotifyApplicationRightsCheckStart"}, + FunctionInfo{19, nullptr, "UpdateUserList"}, + FunctionInfo{20, nullptr, "IsRightsLostUser"}, + FunctionInfo{21, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"}, + FunctionInfo{22, nullptr, "GetLimitedApplicationLicense"}, + FunctionInfo{23, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"}, + FunctionInfo{24, nullptr, "NotifyLimitedApplicationLicenseUpgradableEventForDebug"}, + FunctionInfo{25, nullptr, "RequestProceedDynamicRightsState"}, + FunctionInfo{26, D<&IDynamicRightsInterface::HasAccountRestrictedRightsInRunningApplications>, "HasAccountRestrictedRightsInRunningApplications"}, + FunctionInfo{27, nullptr, "Unknown27", MakeVersionGate({20,0,0})}, + FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,0,0})}, + FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({21,0,0})}, + FunctionInfo{30, nullptr, "Unknown30", MakeVersionGate({21,0,0})} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IDynamicRightsInterface::IDynamicRightsInterface(Core::System& system_) : ServiceFramework{system_, "DynamicRightsInterface"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestApplicationRightsOnServer"}, - {1, nullptr, "RequestAssignRights"}, - {4, nullptr, "DeprecatedRequestAssignRightsToResume"}, - {5, D<&IDynamicRightsInterface::VerifyActivatedRightsOwners>, "VerifyActivatedRightsOwners"}, - {6, nullptr, "DeprecatedGetApplicationRightsStatus"}, - {7, nullptr, "RequestPrefetchForDynamicRights"}, - {8, nullptr, "GetDynamicRightsState"}, - {9, nullptr, "RequestApplicationRightsOnServerToResume"}, - {10, nullptr, "RequestAssignRightsToResume"}, - {11, nullptr, "GetActivatedRightsUsers"}, - {12, nullptr, "GetApplicationRightsStatus"}, - {13, D<&IDynamicRightsInterface::GetRunningApplicationStatus>, "GetRunningApplicationStatus"}, - {14, nullptr, "SelectApplicationLicense"}, - {15, nullptr, "RequestContentsAuthorizationToken"}, - {16, nullptr, "QualifyUser"}, - {17, nullptr, "QualifyUserWithProcessId"}, - {18, D<&IDynamicRightsInterface::NotifyApplicationRightsCheckStart>, "NotifyApplicationRightsCheckStart"}, - {19, nullptr, "UpdateUserList"}, - {20, nullptr, "IsRightsLostUser"}, - {21, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"}, - {22, nullptr, "GetLimitedApplicationLicense"}, - {23, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"}, - {24, nullptr, "NotifyLimitedApplicationLicenseUpgradableEventForDebug"}, - {25, nullptr, "RequestProceedDynamicRightsState"}, - {26, D<&IDynamicRightsInterface::HasAccountRestrictedRightsInRunningApplications>, "HasAccountRestrictedRightsInRunningApplications"}, - {27, nullptr, "Unknown27"}, //20.0.0+ - {28, nullptr, "Unknown28"}, //20.0.0+ - {29, nullptr, "Unknown29"}, //21.0.0+ - {30, nullptr, "Unknown30"}, //21.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); } IDynamicRightsInterface::~IDynamicRightsInterface() = default; diff --git a/src/core/hle/service/ns/dynamic_rights_interface.h b/src/core/hle/service/ns/dynamic_rights_interface.h index c3270aee05..e8a1d81491 100644 --- a/src/core/hle/service/ns/dynamic_rights_interface.h +++ b/src/core/hle/service/ns/dynamic_rights_interface.h @@ -21,6 +21,8 @@ private: Result GetRunningApplicationStatus(Out out_status, u64 rights_handle); Result VerifyActivatedRightsOwners(u64 rights_handle); Result HasAccountRestrictedRightsInRunningApplications(Out out_is_restricted); + + std::optional FindRequest(u32 key) override; }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/ecommerce_interface.cpp b/src/core/hle/service/ns/ecommerce_interface.cpp index 76fc425f0c..5687d09a02 100644 --- a/src/core/hle/service/ns/ecommerce_interface.cpp +++ b/src/core/hle/service/ns/ecommerce_interface.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,19 +10,6 @@ namespace Service::NS { IECommerceInterface::IECommerceInterface(Core::System& system_) : ServiceFramework{system_, "IECommerceInterface"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RequestLinkDevice"}, - {1, nullptr, "RequestCleanupAllPreInstalledApplications"}, - {2, nullptr, "RequestCleanupPreInstalledApplication"}, - {3, nullptr, "RequestSyncRights"}, - {4, nullptr, "RequestUnlinkDevice"}, - {5, nullptr, "RequestRevokeAllELicense"}, - {6, nullptr, "RequestSyncRightsBasedOnAssignedELicenses"}, - }; - // clang-format on - - RegisterHandlers(functions); } IECommerceInterface::~IECommerceInterface() = default; diff --git a/src/core/hle/service/ns/ecommerce_interface.h b/src/core/hle/service/ns/ecommerce_interface.h index 4352101f4a..d020ff5ef8 100644 --- a/src/core/hle/service/ns/ecommerce_interface.h +++ b/src/core/hle/service/ns/ecommerce_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,6 +14,19 @@ class IECommerceInterface final : public ServiceFramework { public: explicit IECommerceInterface(Core::System& system_); ~IECommerceInterface() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RequestLinkDevice"}, + FunctionInfo{1, nullptr, "RequestCleanupAllPreInstalledApplications"}, + FunctionInfo{2, nullptr, "RequestCleanupPreInstalledApplication"}, + FunctionInfo{3, nullptr, "RequestSyncRights"}, + FunctionInfo{4, nullptr, "RequestUnlinkDevice"}, + FunctionInfo{5, nullptr, "RequestRevokeAllELicense"}, + FunctionInfo{6, nullptr, "RequestSyncRightsBasedOnAssignedELicenses"} + ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/factory_reset_interface.cpp b/src/core/hle/service/ns/factory_reset_interface.cpp index fd5cf7e1fd..1fc6edcc9b 100644 --- a/src/core/hle/service/ns/factory_reset_interface.cpp +++ b/src/core/hle/service/ns/factory_reset_interface.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,21 +8,21 @@ namespace Service::NS { +std::optional IFactoryResetInterface::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{100, nullptr, "ResetToFactorySettings"}, + FunctionInfo{101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"}, + FunctionInfo{102, nullptr, "ResetToFactorySettingsForRefurbishment"}, + FunctionInfo{103, nullptr, "ResetToFactorySettingsWithPlatformRegion"}, + FunctionInfo{104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"}, + FunctionInfo{105, nullptr, "RequestResetToFactorySettingsSecurely"}, + FunctionInfo{106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IFactoryResetInterface::IFactoryResetInterface(Core::System& system_) : ServiceFramework{system_, "IFactoryResetInterface"} { - // clang-format off - static const FunctionInfo functions[] = { - {100, nullptr, "ResetToFactorySettings"}, - {101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"}, - {102, nullptr, "ResetToFactorySettingsForRefurbishment"}, - {103, nullptr, "ResetToFactorySettingsWithPlatformRegion"}, - {104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"}, - {105, nullptr, "RequestResetToFactorySettingsSecurely"}, - {106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"}, - }; - // clang-format on - - RegisterHandlers(functions); } IFactoryResetInterface::~IFactoryResetInterface() = default; diff --git a/src/core/hle/service/ns/factory_reset_interface.h b/src/core/hle/service/ns/factory_reset_interface.h index 50d1251239..3d5700fb71 100644 --- a/src/core/hle/service/ns/factory_reset_interface.h +++ b/src/core/hle/service/ns/factory_reset_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,6 +14,7 @@ class IFactoryResetInterface final : public ServiceFramework FindRequest(u32 key) override; }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp index fe057422ce..ff1654517b 100644 --- a/src/core/hle/service/ns/ns.cpp +++ b/src/core/hle/service/ns/ns.cpp @@ -19,25 +19,25 @@ namespace Service::NS { class INotifyService final : public ServiceFramework { public: - explicit INotifyService(Core::System& system_) : ServiceFramework{system_, "pdm:ntfy"} { - // clang-format off - static const FunctionInfo functions[] = { - { 0, nullptr, "NotifyAppletEvent" }, - { 2, nullptr, "NotifyOperationModeChangeEvent" }, - { 3, nullptr, "NotifyPowerStateChangeEvent" }, - { 4, nullptr, "NotifyClearAllEvent" }, - { 5, nullptr, "NotifyEventForDebug" }, - { 6, nullptr, "SuspendUserAccountEventService" }, - { 7, nullptr, "ResumeUserAccountEventService" }, - { 8, nullptr, "NotifyLibraryAppletEvent" }, - { 9, nullptr, "Cmd9" }, - { 20, nullptr, "Cmd20" }, - { 30, nullptr, "Cmd30" }, - { 100, nullptr, "Cmd100" }, - { 101, nullptr, "Cmd101" }, - }; - // clang-format on - RegisterHandlers(functions); + explicit INotifyService(Core::System& system_) : ServiceFramework{system_, "pdm:ntfy"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "NotifyAppletEvent" }, + FunctionInfo{2, nullptr, "NotifyOperationModeChangeEvent" }, + FunctionInfo{3, nullptr, "NotifyPowerStateChangeEvent" }, + FunctionInfo{4, nullptr, "NotifyClearAllEvent" }, + FunctionInfo{5, nullptr, "NotifyEventForDebug" }, + FunctionInfo{6, nullptr, "SuspendUserAccountEventService" }, + FunctionInfo{7, nullptr, "ResumeUserAccountEventService" }, + FunctionInfo{8, nullptr, "NotifyLibraryAppletEvent" }, + FunctionInfo{9, nullptr, "Cmd9" }, + FunctionInfo{20, nullptr, "Cmd20" }, + FunctionInfo{30, nullptr, "Cmd30" }, + FunctionInfo{100, nullptr, "Cmd100" }, + FunctionInfo{101, nullptr, "Cmd101" } + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; @@ -45,18 +45,10 @@ class IVulnerabilityManagerInterface final : public ServiceFramework { public: explicit IVulnerabilityManagerInterface(Core::System& system_) - : ServiceFramework{system_, "ns:vm"} { - // clang-format off - static const FunctionInfo functions[] = { - {1200, D<&IVulnerabilityManagerInterface::NeedsUpdateVulnerability>, "NeedsUpdateVulnerability"}, - {1201, nullptr, "UpdateSafeSystemVersionForDebug"}, - {1202, nullptr, "GetSafeSystemVersion"}, - {3100, D<&IVulnerabilityManagerInterface::GetSafeSystemVersionCheckInfo>, "GetSafeSystemVersionCheckInfo"}, - {3101, nullptr, "RequestUpdateSafeSystemVersionCheckInfo"}, - {3102, D<&IVulnerabilityManagerInterface::ResetSafeSystemVersionCheckInfo>, "ResetSafeSystemVersionCheckInfo"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "ns:vm"} {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } ~IVulnerabilityManagerInterface() override = default; @@ -76,6 +68,15 @@ public: LOG_WARNING(Service_NS, "(STUBBED)"); R_SUCCEED(); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1200, D<&IVulnerabilityManagerInterface::NeedsUpdateVulnerability>, "NeedsUpdateVulnerability"}, + FunctionInfo{1201, nullptr, "UpdateSafeSystemVersionForDebug"}, + FunctionInfo{1202, nullptr, "GetSafeSystemVersion"}, + FunctionInfo{3100, D<&IVulnerabilityManagerInterface::GetSafeSystemVersionCheckInfo>, "GetSafeSystemVersionCheckInfo"}, + FunctionInfo{3101, nullptr, "RequestUpdateSafeSystemVersionCheckInfo"}, + FunctionInfo{3102, D<&IVulnerabilityManagerInterface::ResetSafeSystemVersionCheckInfo>, "ResetSafeSystemVersionCheckInfo"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/ns/platform_service_manager.cpp b/src/core/hle/service/ns/platform_service_manager.cpp index bf93a2edfa..dea6cb5c16 100644 --- a/src/core/hle/service/ns/platform_service_manager.cpp +++ b/src/core/hle/service/ns/platform_service_manager.cpp @@ -27,6 +27,28 @@ namespace Service::NS { +std::optional IPlatformServiceManager::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IPlatformServiceManager::RequestLoad>, "RequestLoad"}, + FunctionInfo{1, D<&IPlatformServiceManager::GetLoadState>, "GetLoadState"}, + FunctionInfo{2, D<&IPlatformServiceManager::GetSize>, "GetSize"}, + FunctionInfo{3, D<&IPlatformServiceManager::GetSharedMemoryAddressOffset>, "GetSharedMemoryAddressOffset"}, + FunctionInfo{4, D<&IPlatformServiceManager::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"}, + FunctionInfo{5, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriority"}, + FunctionInfo{6, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriorityForSystem"}, + FunctionInfo{100, nullptr, "RequestApplicationFunctionAuthorization"}, + FunctionInfo{101, nullptr, "RequestApplicationFunctionAuthorizationByProcessId"}, + FunctionInfo{102, nullptr, "RequestApplicationFunctionAuthorizationByApplicationId"}, + FunctionInfo{103, nullptr, "RefreshApplicationFunctionBlackListDebugRecord"}, + FunctionInfo{104, nullptr, "RequestApplicationFunctionAuthorizationByProgramId"}, + FunctionInfo{105, nullptr, "GetFunctionBlackListSystemVersionToAuthorize"}, + FunctionInfo{106, nullptr, "GetFunctionBlackListVersion"}, + FunctionInfo{1000, nullptr, "LoadNgWordDataForPlatformRegionChina"}, + FunctionInfo{1001, nullptr, "GetNgWordDataSizeForPlatformRegionChina"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + struct FontRegion { u32 offset; u32 size; @@ -89,28 +111,6 @@ struct IPlatformServiceManager::Impl { IPlatformServiceManager::IPlatformServiceManager(Core::System& system_, const char* service_name_) : ServiceFramework{system_, service_name_}, impl{std::make_unique()} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IPlatformServiceManager::RequestLoad>, "RequestLoad"}, - {1, D<&IPlatformServiceManager::GetLoadState>, "GetLoadState"}, - {2, D<&IPlatformServiceManager::GetSize>, "GetSize"}, - {3, D<&IPlatformServiceManager::GetSharedMemoryAddressOffset>, "GetSharedMemoryAddressOffset"}, - {4, D<&IPlatformServiceManager::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"}, - {5, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriority"}, - {6, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriorityForSystem"}, - {100, nullptr, "RequestApplicationFunctionAuthorization"}, - {101, nullptr, "RequestApplicationFunctionAuthorizationByProcessId"}, - {102, nullptr, "RequestApplicationFunctionAuthorizationByApplicationId"}, - {103, nullptr, "RefreshApplicationFunctionBlackListDebugRecord"}, - {104, nullptr, "RequestApplicationFunctionAuthorizationByProgramId"}, - {105, nullptr, "GetFunctionBlackListSystemVersionToAuthorize"}, - {106, nullptr, "GetFunctionBlackListVersion"}, - {1000, nullptr, "LoadNgWordDataForPlatformRegionChina"}, - {1001, nullptr, "GetNgWordDataSizeForPlatformRegionChina"}, - }; - // clang-format on - RegisterHandlers(functions); - auto& fsc = system.GetFileSystemController(); // Attempt to load shared font data from disk diff --git a/src/core/hle/service/ns/platform_service_manager.h b/src/core/hle/service/ns/platform_service_manager.h index b82c385a6c..fb99a441f5 100644 --- a/src/core/hle/service/ns/platform_service_manager.h +++ b/src/core/hle/service/ns/platform_service_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -65,11 +68,12 @@ private: Result GetSharedMemoryNativeHandle( OutCopyHandle out_shared_memory_native_handle); Result GetSharedFontInOrderOfPriority(OutArray out_font_codes, - OutArray out_font_offsets, - OutArray out_font_sizes, - Out out_fonts_are_loaded, Out out_font_count, - Set::LanguageCode language_code); + OutArray out_font_offsets, + OutArray out_font_sizes, + Out out_fonts_are_loaded, Out out_font_count, + Set::LanguageCode language_code); + std::optional FindRequest(u32 key) override; struct Impl; std::unique_ptr impl; }; diff --git a/src/core/hle/service/ns/query_service.cpp b/src/core/hle/service/ns/query_service.cpp index d22de1d169..13a1f33866 100644 --- a/src/core/hle/service/ns/query_service.cpp +++ b/src/core/hle/service/ns/query_service.cpp @@ -14,40 +14,40 @@ namespace Service::NS { +std::optional IQueryService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "QueryAppletEvent"}, + FunctionInfo{1, nullptr, "QueryPlayStatistics"}, + FunctionInfo{2, nullptr, "QueryPlayStatisticsByUserAccountId"}, + FunctionInfo{3, nullptr, "QueryPlayStatisticsByNetworkServiceAccountId"}, + FunctionInfo{4, nullptr, "QueryPlayStatisticsByApplicationId"}, + FunctionInfo{5, D<&IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId>, "QueryPlayStatisticsByApplicationIdAndUserAccountId"}, + FunctionInfo{6, nullptr, "QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId"}, + FunctionInfo{7, nullptr, "QueryLastPlayTimeV0"}, + FunctionInfo{8, nullptr, "QueryPlayEvent"}, + FunctionInfo{9, nullptr, "GetAvailablePlayEventRange"}, + FunctionInfo{10, nullptr, "QueryAccountEvent"}, + FunctionInfo{11, nullptr, "QueryAccountPlayEvent"}, + FunctionInfo{12, nullptr, "GetAvailableAccountPlayEventRange"}, + FunctionInfo{13, nullptr, "QueryApplicationPlayStatisticsForSystemV0"}, + FunctionInfo{14, nullptr, "QueryRecentlyPlayedApplication"}, + FunctionInfo{15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"}, + FunctionInfo{16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"}, + FunctionInfo{17, D<&IQueryService::QueryLastPlayTime>, "QueryLastPlayTime"}, + FunctionInfo{18, D<&IQueryService::QueryApplicationPlayStatisticsForSystem>, "QueryApplicationPlayStatisticsForSystem"}, + FunctionInfo{19, D<&IQueryService::QueryApplicationPlayStatisticsByUserAccountIdForSystem>, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"}, + FunctionInfo{30, nullptr, "Cmd30" }, + FunctionInfo{31, nullptr, "Cmd31" }, + FunctionInfo{100, nullptr, "Cmd100" }, + FunctionInfo{110, nullptr, "Cmd110" }, + FunctionInfo{118, nullptr, "Cmd118" }, + FunctionInfo{119, nullptr, "Cmd119" } + ); + return HandlerTableGenerateWithFind(key, functions); +} + IQueryService::IQueryService(Core::System& system_) : ServiceFramework{system_, "pdm:qry"}, play_time_manager{std::make_unique()} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "QueryAppletEvent"}, - {1, nullptr, "QueryPlayStatistics"}, - {2, nullptr, "QueryPlayStatisticsByUserAccountId"}, - {3, nullptr, "QueryPlayStatisticsByNetworkServiceAccountId"}, - {4, nullptr, "QueryPlayStatisticsByApplicationId"}, - {5, D<&IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId>, "QueryPlayStatisticsByApplicationIdAndUserAccountId"}, - {6, nullptr, "QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId"}, - {7, nullptr, "QueryLastPlayTimeV0"}, - {8, nullptr, "QueryPlayEvent"}, - {9, nullptr, "GetAvailablePlayEventRange"}, - {10, nullptr, "QueryAccountEvent"}, - {11, nullptr, "QueryAccountPlayEvent"}, - {12, nullptr, "GetAvailableAccountPlayEventRange"}, - {13, nullptr, "QueryApplicationPlayStatisticsForSystemV0"}, - {14, nullptr, "QueryRecentlyPlayedApplication"}, - {15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"}, - {16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"}, - {17, D<&IQueryService::QueryLastPlayTime>, "QueryLastPlayTime"}, - {18, D<&IQueryService::QueryApplicationPlayStatisticsForSystem>, "QueryApplicationPlayStatisticsForSystem"}, - {19, D<&IQueryService::QueryApplicationPlayStatisticsByUserAccountIdForSystem>, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"}, - { 30, nullptr, "Cmd30" }, - { 31, nullptr, "Cmd31" }, - { 100, nullptr, "Cmd100" }, - { 110, nullptr, "Cmd110" }, - { 118, nullptr, "Cmd118" }, - { 119, nullptr, "Cmd119" }, - }; - // clang-format on - - RegisterHandlers(functions); } IQueryService::~IQueryService() = default; diff --git a/src/core/hle/service/ns/query_service.h b/src/core/hle/service/ns/query_service.h index f5c0ae1058..08267d3165 100644 --- a/src/core/hle/service/ns/query_service.h +++ b/src/core/hle/service/ns/query_service.h @@ -62,6 +62,7 @@ private: OutArray out_stats, InArray application_ids); + std::optional FindRequest(u32 key) override; std::unique_ptr play_time_manager; }; diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp index 1359cdbb95..c6cd822d24 100644 --- a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp +++ b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp @@ -73,6 +73,21 @@ void SanitizeJPEGImageSize(std::vector& image) { } // namespace +std::optional IReadOnlyApplicationControlDataInterface::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData>, "GetApplicationControlData"}, + FunctionInfo{1, D<&IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"}, + FunctionInfo{2, D<&IReadOnlyApplicationControlDataInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"}, + FunctionInfo{3, nullptr, "ConvertLanguageCodeToApplicationLanguage"}, + FunctionInfo{4, nullptr, "SelectApplicationDesiredLanguage"}, + FunctionInfo{5, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData2>, "GetApplicationControlData"}, + FunctionInfo{10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"}, + FunctionInfo{13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"}, + FunctionInfo{19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, + FunctionInfo{23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData", MakeVersionGate({23,0,0})} + ); + return HandlerTableGenerateWithFind(key, functions); +} // IAsyncValue implementation for ListApplicationTitle // https://switchbrew.org/wiki/NS_services#ListApplicationTitle @@ -84,13 +99,6 @@ public: , data_offset{offset} , data_size{size} { - static const FunctionInfo functions[] = { - {0, D<&IAsyncValue::GetSize>, "GetSize"}, - {1, D<&IAsyncValue::Get>, "Get"}, - {2, D<&IAsyncValue::Cancel>, "Cancel"}, - {3, D<&IAsyncValue::GetErrorContext>, "GetErrorContext"}, - }; - RegisterHandlers(functions); completion_event = service_context.CreateEvent("IAsyncValue:Completion"); completion_event->GetReadableEvent().Signal(system.Kernel()); } @@ -122,6 +130,16 @@ private: LOG_DEBUG(Service_NS, "called"); R_SUCCEED(); } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IAsyncValue::GetSize>, "GetSize"}, + FunctionInfo{1, D<&IAsyncValue::Get>, "Get"}, + FunctionInfo{2, D<&IAsyncValue::Cancel>, "Cancel"}, + FunctionInfo{3, D<&IAsyncValue::GetErrorContext>, "GetErrorContext"} + ); KernelHelpers::ServiceContext service_context; Kernel::KEvent* completion_event{}; s32 data_offset; @@ -131,22 +149,6 @@ private: IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterface( Core::System& system_) : ServiceFramework{system_, "IReadOnlyApplicationControlDataInterface"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData>, "GetApplicationControlData"}, - {1, D<&IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"}, - {2, D<&IReadOnlyApplicationControlDataInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"}, - {3, nullptr, "ConvertLanguageCodeToApplicationLanguage"}, - {4, nullptr, "SelectApplicationDesiredLanguage"}, - {5, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData2>, "GetApplicationControlData"}, - {10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"}, - {13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"}, - {19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, - {23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, //23.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); } IReadOnlyApplicationControlDataInterface::~IReadOnlyApplicationControlDataInterface() = default; diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.h b/src/core/hle/service/ns/read_only_application_control_data_interface.h index a4a285151a..3f68029583 100644 --- a/src/core/hle/service/ns/read_only_application_control_data_interface.h +++ b/src/core/hle/service/ns/read_only_application_control_data_interface.h @@ -45,6 +45,8 @@ public: u8 flag1, u8 flag2, u64 application_id); + + std::optional FindRequest(u32 key) override; }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/read_only_application_record_interface.cpp b/src/core/hle/service/ns/read_only_application_record_interface.cpp index 8ce7851ae2..7a7cf9ec58 100644 --- a/src/core/hle/service/ns/read_only_application_record_interface.cpp +++ b/src/core/hle/service/ns/read_only_application_record_interface.cpp @@ -11,17 +11,18 @@ namespace Service::NS { +std::optional IReadOnlyApplicationRecordInterface::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IReadOnlyApplicationRecordInterface::HasApplicationRecord>, "HasApplicationRecord"}, + FunctionInfo{1, nullptr, "NotifyApplicationFailure"}, + FunctionInfo{2, D<&IReadOnlyApplicationRecordInterface::IsDataCorruptedResult>, "IsDataCorruptedResult"}, + FunctionInfo{3, D<&IReadOnlyApplicationRecordInterface::ListApplicationRecord>, "ListApplicationRecord"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IReadOnlyApplicationRecordInterface::IReadOnlyApplicationRecordInterface(Core::System& system_) : ServiceFramework{system_, "IReadOnlyApplicationRecordInterface"} { - static const FunctionInfo functions[] = { - {0, D<&IReadOnlyApplicationRecordInterface::HasApplicationRecord>, "HasApplicationRecord"}, - {1, nullptr, "NotifyApplicationFailure"}, - {2, D<&IReadOnlyApplicationRecordInterface::IsDataCorruptedResult>, "IsDataCorruptedResult"}, - {3, D<&IReadOnlyApplicationRecordInterface::ListApplicationRecord>, "ListApplicationRecord"}, - }; - // clang-format on - - RegisterHandlers(functions); } IReadOnlyApplicationRecordInterface::~IReadOnlyApplicationRecordInterface() = default; diff --git a/src/core/hle/service/ns/read_only_application_record_interface.h b/src/core/hle/service/ns/read_only_application_record_interface.h index fc43c768ba..308e753e7d 100644 --- a/src/core/hle/service/ns/read_only_application_record_interface.h +++ b/src/core/hle/service/ns/read_only_application_record_interface.h @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -24,6 +24,8 @@ private: Result ListApplicationRecord( OutArray out_records, Out out_count, s32 entry_offset); + + std::optional FindRequest(u32 key) override; }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/service_getter_interface.cpp b/src/core/hle/service/ns/service_getter_interface.cpp index 1a3dd7166c..bbf30da3da 100644 --- a/src/core/hle/service/ns/service_getter_interface.cpp +++ b/src/core/hle/service/ns/service_getter_interface.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -17,25 +20,25 @@ namespace Service::NS { +std::optional IServiceGetterInterface::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{7988, D<&IServiceGetterInterface::GetDynamicRightsInterface>, "GetDynamicRightsInterface"}, + FunctionInfo{7989, D<&IServiceGetterInterface::GetReadOnlyApplicationControlDataInterface>, "GetReadOnlyApplicationControlDataInterface"}, + FunctionInfo{7991, D<&IServiceGetterInterface::GetReadOnlyApplicationRecordInterface>, "GetReadOnlyApplicationRecordInterface"}, + FunctionInfo{7992, D<&IServiceGetterInterface::GetECommerceInterface>, "GetECommerceInterface"}, + FunctionInfo{7993, D<&IServiceGetterInterface::GetApplicationVersionInterface>, "GetApplicationVersionInterface"}, + FunctionInfo{7994, D<&IServiceGetterInterface::GetFactoryResetInterface>, "GetFactoryResetInterface"}, + FunctionInfo{7995, D<&IServiceGetterInterface::GetAccountProxyInterface>, "GetAccountProxyInterface"}, + FunctionInfo{7996, D<&IServiceGetterInterface::GetApplicationManagerInterface>, "GetApplicationManagerInterface"}, + FunctionInfo{7997, D<&IServiceGetterInterface::GetDownloadTaskInterface>, "GetDownloadTaskInterface"}, + FunctionInfo{7998, D<&IServiceGetterInterface::GetContentManagementInterface>, "GetContentManagementInterface"}, + FunctionInfo{7999, D<&IServiceGetterInterface::GetDocumentInterface>, "GetDocumentInterface"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IServiceGetterInterface::IServiceGetterInterface(Core::System& system_, const char* name) : ServiceFramework{system_, name} { - // clang-format off - static const FunctionInfo functions[] = { - {7988, D<&IServiceGetterInterface::GetDynamicRightsInterface>, "GetDynamicRightsInterface"}, - {7989, D<&IServiceGetterInterface::GetReadOnlyApplicationControlDataInterface>, "GetReadOnlyApplicationControlDataInterface"}, - {7991, D<&IServiceGetterInterface::GetReadOnlyApplicationRecordInterface>, "GetReadOnlyApplicationRecordInterface"}, - {7992, D<&IServiceGetterInterface::GetECommerceInterface>, "GetECommerceInterface"}, - {7993, D<&IServiceGetterInterface::GetApplicationVersionInterface>, "GetApplicationVersionInterface"}, - {7994, D<&IServiceGetterInterface::GetFactoryResetInterface>, "GetFactoryResetInterface"}, - {7995, D<&IServiceGetterInterface::GetAccountProxyInterface>, "GetAccountProxyInterface"}, - {7996, D<&IServiceGetterInterface::GetApplicationManagerInterface>, "GetApplicationManagerInterface"}, - {7997, D<&IServiceGetterInterface::GetDownloadTaskInterface>, "GetDownloadTaskInterface"}, - {7998, D<&IServiceGetterInterface::GetContentManagementInterface>, "GetContentManagementInterface"}, - {7999, D<&IServiceGetterInterface::GetDocumentInterface>, "GetDocumentInterface"}, - }; - // clang-format on - - RegisterHandlers(functions); } IServiceGetterInterface::~IServiceGetterInterface() = default; diff --git a/src/core/hle/service/ns/service_getter_interface.h b/src/core/hle/service/ns/service_getter_interface.h index bbc18d4445..8c33aafc27 100644 --- a/src/core/hle/service/ns/service_getter_interface.h +++ b/src/core/hle/service/ns/service_getter_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -42,6 +45,8 @@ public: Result GetContentManagementInterface( Out> out_interface); Result GetDocumentInterface(Out> out_interface); + + std::optional FindRequest(u32 key) override; }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/system_update_control.cpp b/src/core/hle/service/ns/system_update_control.cpp index f5f5cfd909..3d1911c852 100644 --- a/src/core/hle/service/ns/system_update_control.cpp +++ b/src/core/hle/service/ns/system_update_control.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,35 +11,6 @@ namespace Service::NS { ISystemUpdateControl::ISystemUpdateControl(Core::System& system_) : ServiceFramework{system_, "ISystemUpdateControl"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "HasDownloaded"}, - {1, nullptr, "RequestCheckLatestUpdate"}, - {2, nullptr, "RequestDownloadLatestUpdate"}, - {3, nullptr, "GetDownloadProgress"}, - {4, nullptr, "ApplyDownloadedUpdate"}, - {5, nullptr, "RequestPrepareCardUpdate"}, - {6, nullptr, "GetPrepareCardUpdateProgress"}, - {7, nullptr, "HasPreparedCardUpdate"}, - {8, nullptr, "ApplyCardUpdate"}, - {9, nullptr, "GetDownloadedEulaDataSize"}, - {10, nullptr, "GetDownloadedEulaData"}, - {11, nullptr, "SetupCardUpdate"}, - {12, nullptr, "GetPreparedCardUpdateEulaDataSize"}, - {13, nullptr, "GetPreparedCardUpdateEulaData"}, - {14, nullptr, "SetupCardUpdateViaSystemUpdater"}, - {15, nullptr, "HasReceived"}, - {16, nullptr, "RequestReceiveSystemUpdate"}, - {17, nullptr, "GetReceiveProgress"}, - {18, nullptr, "ApplyReceivedUpdate"}, - {19, nullptr, "GetReceivedEulaDataSize"}, - {20, nullptr, "GetReceivedEulaData"}, - {21, nullptr, "SetupToReceiveSystemUpdate"}, - {22, nullptr, "RequestCheckLatestUpdateIncludesRebootlessUpdate"}, - }; - // clang-format on - - RegisterHandlers(functions); } ISystemUpdateControl::~ISystemUpdateControl() = default; diff --git a/src/core/hle/service/ns/system_update_control.h b/src/core/hle/service/ns/system_update_control.h index a30a090000..acdf048e6c 100644 --- a/src/core/hle/service/ns/system_update_control.h +++ b/src/core/hle/service/ns/system_update_control.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,6 +14,35 @@ class ISystemUpdateControl final : public ServiceFramework public: explicit ISystemUpdateControl(Core::System& system_); ~ISystemUpdateControl() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "HasDownloaded"}, + FunctionInfo{1, nullptr, "RequestCheckLatestUpdate"}, + FunctionInfo{2, nullptr, "RequestDownloadLatestUpdate"}, + FunctionInfo{3, nullptr, "GetDownloadProgress"}, + FunctionInfo{4, nullptr, "ApplyDownloadedUpdate"}, + FunctionInfo{5, nullptr, "RequestPrepareCardUpdate"}, + FunctionInfo{6, nullptr, "GetPrepareCardUpdateProgress"}, + FunctionInfo{7, nullptr, "HasPreparedCardUpdate"}, + FunctionInfo{8, nullptr, "ApplyCardUpdate"}, + FunctionInfo{9, nullptr, "GetDownloadedEulaDataSize"}, + FunctionInfo{10, nullptr, "GetDownloadedEulaData"}, + FunctionInfo{11, nullptr, "SetupCardUpdate"}, + FunctionInfo{12, nullptr, "GetPreparedCardUpdateEulaDataSize"}, + FunctionInfo{13, nullptr, "GetPreparedCardUpdateEulaData"}, + FunctionInfo{14, nullptr, "SetupCardUpdateViaSystemUpdater"}, + FunctionInfo{15, nullptr, "HasReceived"}, + FunctionInfo{16, nullptr, "RequestReceiveSystemUpdate"}, + FunctionInfo{17, nullptr, "GetReceiveProgress"}, + FunctionInfo{18, nullptr, "ApplyReceivedUpdate"}, + FunctionInfo{19, nullptr, "GetReceivedEulaDataSize"}, + FunctionInfo{20, nullptr, "GetReceivedEulaData"}, + FunctionInfo{21, nullptr, "SetupToReceiveSystemUpdate"}, + FunctionInfo{22, nullptr, "RequestCheckLatestUpdateIncludesRebootlessUpdate"} + ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/system_update_interface.cpp b/src/core/hle/service/ns/system_update_interface.cpp index 7e22ca3db0..044d39835f 100644 --- a/src/core/hle/service/ns/system_update_interface.cpp +++ b/src/core/hle/service/ns/system_update_interface.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,32 +10,32 @@ namespace Service::NS { +std::optional ISystemUpdateInterface::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ISystemUpdateInterface::GetBackgroundNetworkUpdateState>, "GetBackgroundNetworkUpdateState"}, + FunctionInfo{1, D<&ISystemUpdateInterface::OpenSystemUpdateControl>, "OpenSystemUpdateControl"}, + FunctionInfo{2, nullptr, "NotifyExFatDriverRequired"}, + FunctionInfo{3, nullptr, "ClearExFatDriverStatusForDebug"}, + FunctionInfo{4, nullptr, "RequestBackgroundNetworkUpdate"}, + FunctionInfo{5, nullptr, "NotifyBackgroundNetworkUpdate"}, + FunctionInfo{6, nullptr, "NotifyExFatDriverDownloadedForDebug"}, + FunctionInfo{9, D<&ISystemUpdateInterface::GetSystemUpdateNotificationEventForContentDelivery>, "GetSystemUpdateNotificationEventForContentDelivery"}, + FunctionInfo{10, nullptr, "NotifySystemUpdateForContentDelivery"}, + FunctionInfo{11, nullptr, "PrepareShutdown"}, + FunctionInfo{12, nullptr, "Unknown12"}, + FunctionInfo{13, nullptr, "Unknown13"}, + FunctionInfo{14, nullptr, "Unknown14"}, + FunctionInfo{15, nullptr, "Unknown15"}, + FunctionInfo{16, nullptr, "DestroySystemUpdateTask"}, + FunctionInfo{17, nullptr, "RequestSendSystemUpdate"}, + FunctionInfo{18, nullptr, "GetSendSystemUpdateProgress"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + ISystemUpdateInterface::ISystemUpdateInterface(Core::System& system_) : ServiceFramework{system_, "ns:su"}, service_context{system_, "ns:su"}, update_notification_event{service_context} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&ISystemUpdateInterface::GetBackgroundNetworkUpdateState>, "GetBackgroundNetworkUpdateState"}, - {1, D<&ISystemUpdateInterface::OpenSystemUpdateControl>, "OpenSystemUpdateControl"}, - {2, nullptr, "NotifyExFatDriverRequired"}, - {3, nullptr, "ClearExFatDriverStatusForDebug"}, - {4, nullptr, "RequestBackgroundNetworkUpdate"}, - {5, nullptr, "NotifyBackgroundNetworkUpdate"}, - {6, nullptr, "NotifyExFatDriverDownloadedForDebug"}, - {9, D<&ISystemUpdateInterface::GetSystemUpdateNotificationEventForContentDelivery>, "GetSystemUpdateNotificationEventForContentDelivery"}, - {10, nullptr, "NotifySystemUpdateForContentDelivery"}, - {11, nullptr, "PrepareShutdown"}, - {12, nullptr, "Unknown12"}, - {13, nullptr, "Unknown13"}, - {14, nullptr, "Unknown14"}, - {15, nullptr, "Unknown15"}, - {16, nullptr, "DestroySystemUpdateTask"}, - {17, nullptr, "RequestSendSystemUpdate"}, - {18, nullptr, "GetSendSystemUpdateProgress"}, - }; - // clang-format on - - RegisterHandlers(functions); } ISystemUpdateInterface::~ISystemUpdateInterface() = default; diff --git a/src/core/hle/service/ns/system_update_interface.h b/src/core/hle/service/ns/system_update_interface.h index 36a2880ec9..2ea14f4f5e 100644 --- a/src/core/hle/service/ns/system_update_interface.h +++ b/src/core/hle/service/ns/system_update_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -30,7 +33,7 @@ private: Result GetSystemUpdateNotificationEventForContentDelivery( OutCopyHandle out_event); -private: + std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext service_context; Event update_notification_event; }; diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp index b252a2efa5..81d8a3a63b 100644 --- a/src/core/hle/service/nvdrv/nvdrv.cpp +++ b/src/core/hle/service/nvdrv/nvdrv.cpp @@ -50,55 +50,61 @@ class NVGEM_C final : public ServiceFramework { public: explicit NVGEM_C(Core::System& system_) : ServiceFramework{system_, "nvgem:c"} - { - static const FunctionInfo functions[] = { - {0, nullptr, "Initialize"}, - {1, nullptr, "GetEventHandle"}, - {2, nullptr, "ControlNotification"}, - {3, nullptr, "SetNotificationPerm"}, - {4, nullptr, "SetCoreDumpPerm"}, - {5, nullptr, "GetAruid"}, - {6, nullptr, "Reset"}, - {7, nullptr, "GetAruid2"}, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Initialize"}, + FunctionInfo{1, nullptr, "GetEventHandle"}, + FunctionInfo{2, nullptr, "ControlNotification"}, + FunctionInfo{3, nullptr, "SetNotificationPerm"}, + FunctionInfo{4, nullptr, "SetCoreDumpPerm"}, + FunctionInfo{5, nullptr, "GetAruid"}, + FunctionInfo{6, nullptr, "Reset"}, + FunctionInfo{7, nullptr, "GetAruid2"} + ); }; class NVGEM_CD final : public ServiceFramework { public: explicit NVGEM_CD(Core::System& system_) : ServiceFramework{system_, "nvgem:cd"} - { - static const FunctionInfo functions[] = { - {0, nullptr, "Initialize"}, - {1, nullptr, "GetAruid"}, - {2, nullptr, "ReadNextBlock"}, - {3, nullptr, "GetNextBlockSize"}, - {4, nullptr, "ReadNextBlock2"}, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Initialize"}, + FunctionInfo{1, nullptr, "GetAruid"}, + FunctionInfo{2, nullptr, "ReadNextBlock"}, + FunctionInfo{3, nullptr, "GetNextBlockSize"}, + FunctionInfo{4, nullptr, "ReadNextBlock2"} + ); }; class NVDBG_D final : public ServiceFramework { public: explicit NVDBG_D(Core::System& system_) : ServiceFramework{system_, "nvdbg:d"} - { - static const FunctionInfo functions[] = { - {0, nullptr, "Open"}, - {1, nullptr, "Ioctl"}, - {2, nullptr, "Close"}, - {4, nullptr, "QueryEvent"}, - {9, nullptr, "DumpStatus"}, - {10, nullptr, "InitializeDevtools"}, - {11, nullptr, "Ioctl2"}, - {12, nullptr, "Ioctl3"}, - {13, nullptr, "SetConfiguration"}, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Open"}, + FunctionInfo{1, nullptr, "Ioctl"}, + FunctionInfo{2, nullptr, "Close"}, + FunctionInfo{4, nullptr, "QueryEvent"}, + FunctionInfo{9, nullptr, "DumpStatus"}, + FunctionInfo{10, nullptr, "InitializeDevtools"}, + FunctionInfo{11, nullptr, "Ioctl2"}, + FunctionInfo{12, nullptr, "Ioctl3"}, + FunctionInfo{13, nullptr, "SetConfiguration"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/nvdrv/nvdrv_interface.cpp b/src/core/hle/service/nvdrv/nvdrv_interface.cpp index 5fae68adbb..db3dbd9f8e 100644 --- a/src/core/hle/service/nvdrv/nvdrv_interface.cpp +++ b/src/core/hle/service/nvdrv/nvdrv_interface.cpp @@ -245,24 +245,6 @@ void NVDRV::DumpGraphicsMemoryInfo(HLERequestContext& ctx) { NVDRV::NVDRV(Core::System& system_, std::shared_ptr nvdrv_, const char* name) : ServiceFramework{system_, name}, nvdrv{std::move(nvdrv_)} { - static const FunctionInfo functions[] = { - {0, &NVDRV::Open, "Open"}, - {1, &NVDRV::Ioctl1, "Ioctl"}, - {2, &NVDRV::Close, "Close"}, - {3, &NVDRV::Initialize, "Initialize"}, - {4, &NVDRV::QueryEvent, "QueryEvent"}, - {5, nullptr, "MapSharedMem"}, - {6, &NVDRV::GetStatus, "GetStatus"}, - {7, nullptr, "SetAruidForTest"}, - {8, &NVDRV::SetAruid, "SetAruid"}, - {9, &NVDRV::DumpGraphicsMemoryInfo, "DumpGraphicsMemoryInfo"}, - {10, nullptr, "InitializeDevtools"}, - {11, &NVDRV::Ioctl2, "Ioctl2"}, - {12, &NVDRV::Ioctl3, "Ioctl3"}, - {13, &NVDRV::SetGraphicsFirmwareMemoryMarginEnabled, - "SetGraphicsFirmwareMemoryMarginEnabled"}, - }; - RegisterHandlers(functions); } NVDRV::~NVDRV() { diff --git a/src/core/hle/service/nvdrv/nvdrv_interface.h b/src/core/hle/service/nvdrv/nvdrv_interface.h index c72f925979..b9b574398a 100644 --- a/src/core/hle/service/nvdrv/nvdrv_interface.h +++ b/src/core/hle/service/nvdrv/nvdrv_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -35,8 +38,27 @@ private: void ServiceError(HLERequestContext& ctx, NvResult result); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &NVDRV::Open, "Open"}, + FunctionInfo{1, &NVDRV::Ioctl1, "Ioctl"}, + FunctionInfo{2, &NVDRV::Close, "Close"}, + FunctionInfo{3, &NVDRV::Initialize, "Initialize"}, + FunctionInfo{4, &NVDRV::QueryEvent, "QueryEvent"}, + FunctionInfo{5, nullptr, "MapSharedMem"}, + FunctionInfo{6, &NVDRV::GetStatus, "GetStatus"}, + FunctionInfo{7, nullptr, "SetAruidForTest"}, + FunctionInfo{8, &NVDRV::SetAruid, "SetAruid"}, + FunctionInfo{9, &NVDRV::DumpGraphicsMemoryInfo, "DumpGraphicsMemoryInfo"}, + FunctionInfo{10, nullptr, "InitializeDevtools"}, + FunctionInfo{11, &NVDRV::Ioctl2, "Ioctl2"}, + FunctionInfo{12, &NVDRV::Ioctl3, "Ioctl3"}, + FunctionInfo{13, &NVDRV::SetGraphicsFirmwareMemoryMarginEnabled, + "SetGraphicsFirmwareMemoryMarginEnabled"} + ); std::shared_ptr nvdrv; - u64 pid{}; bool is_initialized{}; NvCore::SessionId session_id{}; diff --git a/src/core/hle/service/nvdrv/nvmemp.cpp b/src/core/hle/service/nvdrv/nvmemp.cpp index a5477faf1a..8e2e4dfacb 100644 --- a/src/core/hle/service/nvdrv/nvmemp.cpp +++ b/src/core/hle/service/nvdrv/nvmemp.cpp @@ -11,11 +11,6 @@ namespace Service::Nvidia { NVMEMP::NVMEMP(Core::System& system_) : ServiceFramework{system_, "nvmemp"} { - static const FunctionInfo functions[] = { - {0, &NVMEMP::Open, "Open"}, - {1, &NVMEMP::GetAruid, "GetAruid"}, - }; - RegisterHandlers(functions); } NVMEMP::~NVMEMP() = default; diff --git a/src/core/hle/service/nvdrv/nvmemp.h b/src/core/hle/service/nvdrv/nvmemp.h index 85e3053a8d..e98b07c494 100644 --- a/src/core/hle/service/nvdrv/nvmemp.h +++ b/src/core/hle/service/nvdrv/nvmemp.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -19,6 +22,14 @@ public: private: void Open(HLERequestContext& ctx); void GetAruid(HLERequestContext& ctx); + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &NVMEMP::Open, "Open"}, + FunctionInfo{1, &NVMEMP::GetAruid, "GetAruid"} + ); }; } // namespace Service::Nvidia diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp index d30aa3717d..c9023374c4 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp +++ b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,18 +11,21 @@ namespace Service::Nvnflinger { +std::optional IHOSBinderDriver::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&IHOSBinderDriver::TransactParcel>, "TransactParcel"}, + FunctionInfo{1, C<&IHOSBinderDriver::AdjustRefcount>, "AdjustRefcount"}, + FunctionInfo{2, C<&IHOSBinderDriver::GetNativeHandle>, "GetNativeHandle"}, + FunctionInfo{3, C<&IHOSBinderDriver::TransactParcelAuto>, "TransactParcelAuto"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IHOSBinderDriver::IHOSBinderDriver(Core::System& system_, std::shared_ptr server, std::shared_ptr surface_flinger) : ServiceFramework{system_, "IHOSBinderDriver"}, m_server(server), m_surface_flinger(surface_flinger) { - static const FunctionInfo functions[] = { - {0, C<&IHOSBinderDriver::TransactParcel>, "TransactParcel"}, - {1, C<&IHOSBinderDriver::AdjustRefcount>, "AdjustRefcount"}, - {2, C<&IHOSBinderDriver::GetNativeHandle>, "GetNativeHandle"}, - {3, C<&IHOSBinderDriver::TransactParcelAuto>, "TransactParcelAuto"}, - }; - RegisterHandlers(functions); } IHOSBinderDriver::~IHOSBinderDriver() = default; diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver.h b/src/core/hle/service/nvnflinger/hos_binder_driver.h index 6b551c91d2..7d44046115 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver.h +++ b/src/core/hle/service/nvnflinger/hos_binder_driver.h @@ -44,6 +44,7 @@ private: OutBuffer parcel_reply, u32 flags); private: + std::optional FindRequest(u32 key) override; const std::shared_ptr m_server; const std::shared_ptr m_surface_flinger; }; diff --git a/src/core/hle/service/olsc/daemon_controller.cpp b/src/core/hle/service/olsc/daemon_controller.cpp index c449c6ff31..f25888170c 100644 --- a/src/core/hle/service/olsc/daemon_controller.cpp +++ b/src/core/hle/service/olsc/daemon_controller.cpp @@ -9,27 +9,25 @@ namespace Service::OLSC { -IDaemonController::IDaemonController(Core::System& system_) - : ServiceFramework{system_, "IDaemonController"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IDaemonController::GetApplicationAutoTransferSetting>, "GetApplicationAutoTransferSetting"}, - {1, D<&IDaemonController::SetApplicationAutoTransferSetting>, "SetApplicationAutoTransferSetting"}, - {2, D<&IDaemonController::GetGlobalAutoUploadSetting>, "GetGlobalAutoUploadSetting"}, - {3, D<&IDaemonController::SetGlobalAutoUploadSetting>, "SetGlobalAutoUploadSetting"}, - {4, D<&IDaemonController::RunTransferTaskAutonomyRegistration>, "RunTransferTaskAutonomyRegistration"}, - {5, D<&IDaemonController::GetGlobalAutoDownloadSetting>, "GetGlobalAutoDownloadSetting"}, // 11.0.0+ - {6, D<&IDaemonController::SetGlobalAutoDownloadSetting>, "SetGlobalAutoDownloadSetting"}, // 11.0.0+ - {10, nullptr, "CreateForbiddenSaveDataInidication"}, - {11, D<&IDaemonController::StopAutonomyTaskExecution>, "StopAutonomyTaskExecution"}, - {12, D<&IDaemonController::GetAutonomyTaskStatus>, "GetAutonomyTaskStatus"}, - {13, nullptr, "Unknown13_20_0_0_Plus"}, // 20.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); +std::optional IDaemonController::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IDaemonController::GetApplicationAutoTransferSetting>, "GetApplicationAutoTransferSetting"}, + FunctionInfo{1, D<&IDaemonController::SetApplicationAutoTransferSetting>, "SetApplicationAutoTransferSetting"}, + FunctionInfo{2, D<&IDaemonController::GetGlobalAutoUploadSetting>, "GetGlobalAutoUploadSetting"}, + FunctionInfo{3, D<&IDaemonController::SetGlobalAutoUploadSetting>, "SetGlobalAutoUploadSetting"}, + FunctionInfo{4, D<&IDaemonController::RunTransferTaskAutonomyRegistration>, "RunTransferTaskAutonomyRegistration"}, + FunctionInfo{5, D<&IDaemonController::GetGlobalAutoDownloadSetting>, "GetGlobalAutoDownloadSetting", MakeVersionGate({11,0,0})}, + FunctionInfo{6, D<&IDaemonController::SetGlobalAutoDownloadSetting>, "SetGlobalAutoDownloadSetting", MakeVersionGate({11,0,0})}, + FunctionInfo{10, nullptr, "CreateForbiddenSaveDataInidication"}, + FunctionInfo{11, D<&IDaemonController::StopAutonomyTaskExecution>, "StopAutonomyTaskExecution"}, + FunctionInfo{12, D<&IDaemonController::GetAutonomyTaskStatus>, "GetAutonomyTaskStatus"}, + FunctionInfo{13, nullptr, "Unknown13_20_0_0_Plus", MakeVersionGate({20,0,0})} + ); + return HandlerTableGenerateWithFind(key, functions); } +IDaemonController::IDaemonController(Core::System& system_) : ServiceFramework{system_, "IDaemonController"} {} + IDaemonController::~IDaemonController() = default; Result IDaemonController::GetApplicationAutoTransferSetting(Out out_is_enabled, diff --git a/src/core/hle/service/olsc/daemon_controller.h b/src/core/hle/service/olsc/daemon_controller.h index 70f3d9e235..b90d3ee778 100644 --- a/src/core/hle/service/olsc/daemon_controller.h +++ b/src/core/hle/service/olsc/daemon_controller.h @@ -38,6 +38,8 @@ private: Result GetAutonomyTaskStatus(Out out_status, Common::UUID user_id); + std::optional FindRequest(u32 key) override; + // Internal in-memory state to back the above APIs struct AppKey { Common::UUID user_id; diff --git a/src/core/hle/service/olsc/native_handle_holder.cpp b/src/core/hle/service/olsc/native_handle_holder.cpp index 1e50195539..1f6f8419fc 100644 --- a/src/core/hle/service/olsc/native_handle_holder.cpp +++ b/src/core/hle/service/olsc/native_handle_holder.cpp @@ -12,16 +12,16 @@ namespace Service::OLSC { +std::optional INativeHandleHolder::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&INativeHandleHolder::GetNativeHandle>, "GetNativeHandle"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + INativeHandleHolder::INativeHandleHolder(Core::System& system_) : ServiceFramework{system_, "INativeHandleHolder"}, service_context{system_, "OLSC"} { event = service_context.CreateEvent("OLSC::INativeHandleHolder"); - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&INativeHandleHolder::GetNativeHandle>, "GetNativeHandle"}, - }; - // clang-format on - - RegisterHandlers(functions); } INativeHandleHolder::~INativeHandleHolder() { diff --git a/src/core/hle/service/olsc/native_handle_holder.h b/src/core/hle/service/olsc/native_handle_holder.h index e0eac50c28..0ab51c7ca0 100644 --- a/src/core/hle/service/olsc/native_handle_holder.h +++ b/src/core/hle/service/olsc/native_handle_holder.h @@ -25,6 +25,7 @@ public: private: Result GetNativeHandle(OutCopyHandle out_event); + std::optional FindRequest(u32 key) override; Service::KernelHelpers::ServiceContext service_context; Kernel::KEvent* event{}; diff --git a/src/core/hle/service/olsc/olsc.cpp b/src/core/hle/service/olsc/olsc.cpp index a86c525f9a..03b8a696f5 100644 --- a/src/core/hle/service/olsc/olsc.cpp +++ b/src/core/hle/service/olsc/olsc.cpp @@ -6,22 +6,179 @@ #include "core/hle/service/olsc/olsc.h" #include "core/hle/service/olsc/olsc_service_for_application.h" -#include "core/hle/service/olsc/olsc_service_for_system_service.h" +#include "core/hle/service/olsc/native_handle_holder.h" +#include "core/hle/service/olsc/stopper_object.h" +#include "core/hle/service/olsc/daemon_controller.h" +#include "core/hle/service/olsc/transfer_task_list_controller.h" +#include "core/hle/service/olsc/remote_storage_controller.h" #include "core/hle/service/server_manager.h" #include "core/hle/service/service.h" +#include "core/hle/service/cmif_serialization.h" namespace Service::OLSC { class ISProfileBgAgentForSystemProcess final : public ServiceFramework { public: - explicit ISProfileBgAgentForSystemProcess(Core::System& system_) - : ServiceFramework{system_, "spbg:sp"} - { - static const FunctionInfo functions[] = { - { 100, nullptr, "OpenBgAgentController" }, - }; - RegisterHandlers(functions); + explicit ISProfileBgAgentForSystemProcess(Core::System& system_) : ServiceFramework{system_, "spbg:sp"} {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{100, nullptr, "OpenBgAgentController" } + ); +}; + +class IDaemonController; +class IRemoteStorageController; +class ITransferTaskListController; + +struct DataTransferPolicy { + u8 upload_policy; + u8 download_policy; +}; + +struct TransferTaskErrorInfo { + Common::UUID uid; + u64 application_id; + u8 unknown_0x18; + std::array reserved_0x19; + u64 unknown_0x20; + u32 error_code; + u32 reserved_0x2C; +}; +static_assert(sizeof(TransferTaskErrorInfo) == 0x30, "TransferTaskErrorInfo has incorrect size."); + +class IOlscServiceForSystemService final : public ServiceFramework { +public: + explicit IOlscServiceForSystemService(Core::System& system_) + : ServiceFramework{system_, "olsc:s"} { + } + + ~IOlscServiceForSystemService() override = default; + + Result GetTransferTaskListController( + Out> out_interface) { + LOG_INFO(Service_OLSC, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); + } + + Result GetRemoteStorageController( + Out> out_interface) { + LOG_INFO(Service_OLSC, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); + } + + Result GetDaemonController( + Out> out_interface) { + LOG_INFO(Service_OLSC, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); + } + + Result GetDataTransferPolicy( + Out out_policy, u64 application_id) { + LOG_WARNING(Service_OLSC, "(STUBBED) called"); + DataTransferPolicy policy{}; + policy.upload_policy = 0; + policy.download_policy = 0; + *out_policy = policy; + R_SUCCEED(); + } + + Result GetTransferTaskErrorInfo(Out out_info, + Common::UUID uuid, u64 application_id) { + LOG_WARNING(Service_OLSC, "(STUBBED) called, uuid={} application_id={:016X}", + uuid.FormattedString(), application_id); + + TransferTaskErrorInfo info{}; + info.uid = uuid; + info.application_id = application_id; + info.unknown_0x18 = 0; + info.reserved_0x19.fill(0); + info.unknown_0x20 = 0; + info.error_code = 0; + info.reserved_0x2C = 0; + + *out_info = info; + R_SUCCEED(); + } + + Result GetOlscServiceForSystemService( + Out> out_interface) { + LOG_INFO(Service_OLSC, "called"); + *out_interface = std::static_pointer_cast(shared_from_this()); + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IOlscServiceForSystemService::GetTransferTaskListController>, "GetTransferTaskListController"}, + FunctionInfo{1, D<&IOlscServiceForSystemService::GetRemoteStorageController>, "GetRemoteStorageController"}, + FunctionInfo{2, D<&IOlscServiceForSystemService::GetDaemonController>, "GetDaemonController"}, + FunctionInfo{10, nullptr, "PrepareDeleteUserProperty"}, + FunctionInfo{11, nullptr, "DeleteUserSaveDataProperty"}, + FunctionInfo{12, nullptr, "InvalidateMountCache"}, + FunctionInfo{13, nullptr, "DeleteDeviceSaveDataProperty"}, + FunctionInfo{100, nullptr, "ListLastTransferTaskErrorInfo"}, + FunctionInfo{101, nullptr, "GetLastErrorInfoCount"}, + FunctionInfo{102, nullptr, "RemoveLastErrorInfoOld"}, + FunctionInfo{103, nullptr, "GetLastErrorInfo"}, + FunctionInfo{104, nullptr, "GetLastErrorEventHolder"}, + FunctionInfo{105, D<&IOlscServiceForSystemService::GetTransferTaskErrorInfo>, "GetTransferTaskErrorInfo"}, + FunctionInfo{200, D<&IOlscServiceForSystemService::GetDataTransferPolicy>, "GetDataTransferPolicy"}, + FunctionInfo{201, nullptr, "DeleteDataTransferPolicyCache"}, + FunctionInfo{202, nullptr, "Unknown202"}, + FunctionInfo{203, nullptr, "RequestUpdateDataTransferPolicyCacheAsync"}, + FunctionInfo{204, nullptr, "ClearDataTransferPolicyCache"}, + FunctionInfo{205, nullptr, "RequestGetDataTransferPolicyAsync"}, + FunctionInfo{206, nullptr, "Unknown206", MakeVersionGate({21,0,0})}, + FunctionInfo{300, nullptr, "GetUserSaveDataProperty"}, + FunctionInfo{301, nullptr, "SetUserSaveDataProperty"}, + FunctionInfo{302, nullptr, "Unknown302", MakeVersionGate({21,0,0})}, + FunctionInfo{400, nullptr, "CleanupSaveDataBackupContextForSpecificApplications"}, + FunctionInfo{900, nullptr, "DeleteAllTransferTask"}, + FunctionInfo{902, nullptr, "DeleteAllSeriesInfo"}, + FunctionInfo{903, nullptr, "DeleteAllSdaInfoCache"}, + FunctionInfo{904, nullptr, "DeleteAllApplicationSetting"}, + FunctionInfo{905, nullptr, "DeleteAllTransferTaskErrorInfo"}, + FunctionInfo{906, nullptr, "RegisterTransferTaskErrorInfo"}, + FunctionInfo{907, nullptr, "AddSaveDataArchiveInfoCache"}, + FunctionInfo{908, nullptr, "DeleteSeriesInfo"}, + FunctionInfo{909, nullptr, "GetSeriesInfo"}, + FunctionInfo{910, nullptr, "RemoveTransferTaskErrorInfo"}, + FunctionInfo{911, nullptr, "DeleteAllSeriesInfoForSaveDataBackup"}, + FunctionInfo{912, nullptr, "DeleteSeriesInfoForSaveDataBackup"}, + FunctionInfo{913, nullptr, "GetSeriesInfoForSaveDataBackup"}, + FunctionInfo{914, nullptr, "Unknown914", MakeVersionGate({20,2,0})}, + FunctionInfo{1000, nullptr, "UpdateIssueOld"}, + FunctionInfo{1010, nullptr, "Unknown1010"}, + FunctionInfo{1011, nullptr, "Unknown1011"}, + FunctionInfo{1012, nullptr, "Unknown1012"}, + FunctionInfo{1013, nullptr, "Unkown1013"}, + FunctionInfo{1014, nullptr, "Unknown1014"}, + FunctionInfo{1020, nullptr, "Unknown1020"}, + FunctionInfo{1021, nullptr, "Unknown1021"}, + FunctionInfo{1022, nullptr, "Unknown1022"}, + FunctionInfo{1023, nullptr, "Unknown1023"}, + FunctionInfo{1024, nullptr, "Unknown1024"}, + FunctionInfo{1100, nullptr, "RepairUpdateIssueInfoCacheAync"}, + FunctionInfo{1110, nullptr, "RepairGetIssueInfo"}, + FunctionInfo{1111, nullptr, "RepairListIssueInfo"}, + FunctionInfo{1112, nullptr, "RepairListOperationPermissionInfo"}, + FunctionInfo{1113, nullptr, "RepairListDataInfoForRepairedSaveDataDownload"}, + FunctionInfo{1114, nullptr, "RepairListDataInfoForOriginalSaveDataDownload"}, + FunctionInfo{1120, nullptr, "RepairUploadSaveDataAsync"}, + FunctionInfo{1121, nullptr, "RepairUploadSaveDataAsync1"}, + FunctionInfo{1122, nullptr, "RepairDownloadRepairedSaveDataAsync"}, + FunctionInfo{1123, nullptr, "RepairDownloadOriginalSaveDataAsync"}, + FunctionInfo{1124, nullptr, "RepairGetOperationProgressInfo"}, + FunctionInfo{10000, D<&IOlscServiceForSystemService::GetOlscServiceForSystemService>, "GetOlscServiceForSystemService"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/olsc/olsc_service_for_application.cpp b/src/core/hle/service/olsc/olsc_service_for_application.cpp index 01360f5ef2..8d6b20d7ff 100644 --- a/src/core/hle/service/olsc/olsc_service_for_application.cpp +++ b/src/core/hle/service/olsc/olsc_service_for_application.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,36 +9,36 @@ namespace Service::OLSC { +std::optional IOlscServiceForApplication::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IOlscServiceForApplication::Initialize>, "Initialize"}, + FunctionInfo{10, nullptr, "VerifySaveDataBackupLicenseAsync"}, + FunctionInfo{13, D<&IOlscServiceForApplication::GetSaveDataBackupSetting>, "GetSaveDataBackupSetting"}, + FunctionInfo{14, D<&IOlscServiceForApplication::SetSaveDataBackupSettingEnabled>, "SetSaveDataBackupSettingEnabled"}, + FunctionInfo{15, nullptr, "SetCustomData"}, + FunctionInfo{16, nullptr, "DeleteSaveDataBackupSetting"}, + FunctionInfo{18, nullptr, "GetSaveDataBackupInfoCache"}, + FunctionInfo{19, nullptr, "UpdateSaveDataBackupInfoCacheAsync"}, + FunctionInfo{22, nullptr, "DeleteSaveDataBackupAsync"}, + FunctionInfo{25, nullptr, "ListDownloadableSaveDataBackupInfoAsync"}, + FunctionInfo{26, nullptr, "DownloadSaveDataBackupAsync"}, + FunctionInfo{27, nullptr, "UploadSaveDataBackupAsync"}, + FunctionInfo{9010, nullptr, "VerifySaveDataBackupLicenseAsyncForDebug"}, + FunctionInfo{9013, nullptr, "GetSaveDataBackupSettingForDebug"}, + FunctionInfo{9014, nullptr, "SetSaveDataBackupSettingEnabledForDebug"}, + FunctionInfo{9015, nullptr, "SetCustomDataForDebug"}, + FunctionInfo{9016, nullptr, "DeleteSaveDataBackupSettingForDebug"}, + FunctionInfo{9018, nullptr, "GetSaveDataBackupInfoCacheForDebug"}, + FunctionInfo{9019, nullptr, "UpdateSaveDataBackupInfoCacheAsyncForDebug"}, + FunctionInfo{9022, nullptr, "DeleteSaveDataBackupAsyncForDebug"}, + FunctionInfo{9025, nullptr, "ListDownloadableSaveDataBackupInfoAsyncForDebug"}, + FunctionInfo{9026, nullptr, "DownloadSaveDataBackupAsyncForDebug"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IOlscServiceForApplication::IOlscServiceForApplication(Core::System& system_) : ServiceFramework{system_, "olsc:u"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IOlscServiceForApplication::Initialize>, "Initialize"}, - {10, nullptr, "VerifySaveDataBackupLicenseAsync"}, - {13, D<&IOlscServiceForApplication::GetSaveDataBackupSetting>, "GetSaveDataBackupSetting"}, - {14, D<&IOlscServiceForApplication::SetSaveDataBackupSettingEnabled>, "SetSaveDataBackupSettingEnabled"}, - {15, nullptr, "SetCustomData"}, - {16, nullptr, "DeleteSaveDataBackupSetting"}, - {18, nullptr, "GetSaveDataBackupInfoCache"}, - {19, nullptr, "UpdateSaveDataBackupInfoCacheAsync"}, - {22, nullptr, "DeleteSaveDataBackupAsync"}, - {25, nullptr, "ListDownloadableSaveDataBackupInfoAsync"}, - {26, nullptr, "DownloadSaveDataBackupAsync"}, - {27, nullptr, "UploadSaveDataBackupAsync"}, - {9010, nullptr, "VerifySaveDataBackupLicenseAsyncForDebug"}, - {9013, nullptr, "GetSaveDataBackupSettingForDebug"}, - {9014, nullptr, "SetSaveDataBackupSettingEnabledForDebug"}, - {9015, nullptr, "SetCustomDataForDebug"}, - {9016, nullptr, "DeleteSaveDataBackupSettingForDebug"}, - {9018, nullptr, "GetSaveDataBackupInfoCacheForDebug"}, - {9019, nullptr, "UpdateSaveDataBackupInfoCacheAsyncForDebug"}, - {9022, nullptr, "DeleteSaveDataBackupAsyncForDebug"}, - {9025, nullptr, "ListDownloadableSaveDataBackupInfoAsyncForDebug"}, - {9026, nullptr, "DownloadSaveDataBackupAsyncForDebug"}, - }; - // clang-format on - - RegisterHandlers(functions); } IOlscServiceForApplication::~IOlscServiceForApplication() = default; diff --git a/src/core/hle/service/olsc/olsc_service_for_application.h b/src/core/hle/service/olsc/olsc_service_for_application.h index 8941659478..0d92f9ba78 100644 --- a/src/core/hle/service/olsc/olsc_service_for_application.h +++ b/src/core/hle/service/olsc/olsc_service_for_application.h @@ -22,6 +22,8 @@ private: Result GetSaveDataBackupSetting(Out out_save_data_backup_setting); Result SetSaveDataBackupSettingEnabled(bool enabled, NS::Uid account_id); + std::optional FindRequest(u32 key) override; + bool initialized{}; }; diff --git a/src/core/hle/service/olsc/olsc_service_for_system_service.cpp b/src/core/hle/service/olsc/olsc_service_for_system_service.cpp deleted file mode 100644 index 245bbd5c6b..0000000000 --- a/src/core/hle/service/olsc/olsc_service_for_system_service.cpp +++ /dev/null @@ -1,144 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/olsc/daemon_controller.h" -#include "core/hle/service/olsc/olsc_service_for_system_service.h" -#include "core/hle/service/olsc/remote_storage_controller.h" -#include "core/hle/service/olsc/transfer_task_list_controller.h" - -namespace Service::OLSC { - -IOlscServiceForSystemService::IOlscServiceForSystemService(Core::System& system_) - : ServiceFramework{system_, "olsc:s"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IOlscServiceForSystemService::GetTransferTaskListController>, "GetTransferTaskListController"}, - {1, D<&IOlscServiceForSystemService::GetRemoteStorageController>, "GetRemoteStorageController"}, - {2, D<&IOlscServiceForSystemService::GetDaemonController>, "GetDaemonController"}, - {10, nullptr, "PrepareDeleteUserProperty"}, - {11, nullptr, "DeleteUserSaveDataProperty"}, - {12, nullptr, "InvalidateMountCache"}, - {13, nullptr, "DeleteDeviceSaveDataProperty"}, - {100, nullptr, "ListLastTransferTaskErrorInfo"}, - {101, nullptr, "GetLastErrorInfoCount"}, - {102, nullptr, "RemoveLastErrorInfoOld"}, - {103, nullptr, "GetLastErrorInfo"}, - {104, nullptr, "GetLastErrorEventHolder"}, - {105, D<&IOlscServiceForSystemService::GetTransferTaskErrorInfo>, "GetTransferTaskErrorInfo"}, - {200, D<&IOlscServiceForSystemService::GetDataTransferPolicy>, "GetDataTransferPolicy"}, - {201, nullptr, "DeleteDataTransferPolicyCache"}, - {202, nullptr, "Unknown202"}, - {203, nullptr, "RequestUpdateDataTransferPolicyCacheAsync"}, - {204, nullptr, "ClearDataTransferPolicyCache"}, - {205, nullptr, "RequestGetDataTransferPolicyAsync"}, - {206, nullptr, "Unknown206"}, //21.0.0+ - {300, nullptr, "GetUserSaveDataProperty"}, - {301, nullptr, "SetUserSaveDataProperty"}, - {302, nullptr, "Unknown302"}, //21.0.0+ - {400, nullptr, "CleanupSaveDataBackupContextForSpecificApplications"}, - {900, nullptr, "DeleteAllTransferTask"}, - {902, nullptr, "DeleteAllSeriesInfo"}, - {903, nullptr, "DeleteAllSdaInfoCache"}, - {904, nullptr, "DeleteAllApplicationSetting"}, - {905, nullptr, "DeleteAllTransferTaskErrorInfo"}, - {906, nullptr, "RegisterTransferTaskErrorInfo"}, - {907, nullptr, "AddSaveDataArchiveInfoCache"}, - {908, nullptr, "DeleteSeriesInfo"}, - {909, nullptr, "GetSeriesInfo"}, - {910, nullptr, "RemoveTransferTaskErrorInfo"}, - {911, nullptr, "DeleteAllSeriesInfoForSaveDataBackup"}, - {912, nullptr, "DeleteSeriesInfoForSaveDataBackup"}, - {913, nullptr, "GetSeriesInfoForSaveDataBackup"}, - {914, nullptr, "Unknown914"}, //20.2.0+ - {1000, nullptr, "UpdateIssueOld"}, - {1010, nullptr, "Unknown1010"}, - {1011, nullptr, "Unknown1011"}, - {1012, nullptr, "Unknown1012"}, - {1013, nullptr, "Unkown1013"}, - {1014, nullptr, "Unknown1014"}, - {1020, nullptr, "Unknown1020"}, - {1021, nullptr, "Unknown1021"}, - {1022, nullptr, "Unknown1022"}, - {1023, nullptr, "Unknown1023"}, - {1024, nullptr, "Unknown1024"}, - {1100, nullptr, "RepairUpdateIssueInfoCacheAync"}, - {1110, nullptr, "RepairGetIssueInfo"}, - {1111, nullptr, "RepairListIssueInfo"}, - {1112, nullptr, "RepairListOperationPermissionInfo"}, - {1113, nullptr, "RepairListDataInfoForRepairedSaveDataDownload"}, - {1114, nullptr, "RepairListDataInfoForOriginalSaveDataDownload"}, - {1120, nullptr, "RepairUploadSaveDataAsync"}, - {1121, nullptr, "RepairUploadSaveDataAsync1"}, - {1122, nullptr, "RepairDownloadRepairedSaveDataAsync"}, - {1123, nullptr, "RepairDownloadOriginalSaveDataAsync"}, - {1124, nullptr, "RepairGetOperationProgressInfo"}, - {10000, D<&IOlscServiceForSystemService::GetOlscServiceForSystemService>, "GetOlscServiceForSystemService"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -IOlscServiceForSystemService::~IOlscServiceForSystemService() = default; - -Result IOlscServiceForSystemService::GetTransferTaskListController( - Out> out_interface) { - LOG_INFO(Service_OLSC, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); -} - -Result IOlscServiceForSystemService::GetRemoteStorageController( - Out> out_interface) { - LOG_INFO(Service_OLSC, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); -} - -Result IOlscServiceForSystemService::GetDaemonController( - Out> out_interface) { - LOG_INFO(Service_OLSC, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); -} - -Result IOlscServiceForSystemService::GetDataTransferPolicy( - Out out_policy, u64 application_id) { - LOG_WARNING(Service_OLSC, "(STUBBED) called"); - DataTransferPolicy policy{}; - policy.upload_policy = 0; - policy.download_policy = 0; - *out_policy = policy; - R_SUCCEED(); -} - -Result IOlscServiceForSystemService::GetTransferTaskErrorInfo(Out out_info, - Common::UUID uuid, u64 application_id) { - LOG_WARNING(Service_OLSC, "(STUBBED) called, uuid={} application_id={:016X}", - uuid.FormattedString(), application_id); - - TransferTaskErrorInfo info{}; - info.uid = uuid; - info.application_id = application_id; - info.unknown_0x18 = 0; - info.reserved_0x19.fill(0); - info.unknown_0x20 = 0; - info.error_code = 0; - info.reserved_0x2C = 0; - - *out_info = info; - R_SUCCEED(); -} - -Result IOlscServiceForSystemService::GetOlscServiceForSystemService( - Out> out_interface) { - LOG_INFO(Service_OLSC, "called"); - *out_interface = std::static_pointer_cast(shared_from_this()); - R_SUCCEED(); -} - -} // namespace Service::OLSC diff --git a/src/core/hle/service/olsc/olsc_service_for_system_service.h b/src/core/hle/service/olsc/olsc_service_for_system_service.h deleted file mode 100644 index d16c8b979b..0000000000 --- a/src/core/hle/service/olsc/olsc_service_for_system_service.h +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include - -#include "common/uuid.h" -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Service::OLSC { - -class IDaemonController; -class IRemoteStorageController; -class ITransferTaskListController; - -struct DataTransferPolicy { - u8 upload_policy; - u8 download_policy; -}; - -struct TransferTaskErrorInfo { - Common::UUID uid; - u64 application_id; - u8 unknown_0x18; - std::array reserved_0x19; - u64 unknown_0x20; - u32 error_code; - u32 reserved_0x2C; -}; -static_assert(sizeof(TransferTaskErrorInfo) == 0x30, "TransferTaskErrorInfo has incorrect size."); - -class IOlscServiceForSystemService final : public ServiceFramework { -public: - explicit IOlscServiceForSystemService(Core::System& system_); - ~IOlscServiceForSystemService() override; - -private: - Result GetTransferTaskListController( - Out> out_interface); - Result GetRemoteStorageController(Out> out_interface); - Result GetDaemonController(Out> out_interface); - Result GetDataTransferPolicy(Out out_policy, u64 application_id); - Result GetTransferTaskErrorInfo(Out out_info, Common::UUID uid, u64 application_id); - Result GetOlscServiceForSystemService( - Out> out_interface); -}; - -} // namespace Service::OLSC diff --git a/src/core/hle/service/olsc/remote_storage_controller.cpp b/src/core/hle/service/olsc/remote_storage_controller.cpp index 817097b426..1e7825da30 100644 --- a/src/core/hle/service/olsc/remote_storage_controller.cpp +++ b/src/core/hle/service/olsc/remote_storage_controller.cpp @@ -9,44 +9,44 @@ namespace Service::OLSC { + std::optional IRemoteStorageController::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetSaveDataArchiveInfoBySaveDataId"}, + FunctionInfo{1, nullptr, "GetSaveDataArchiveInfoByApplicationId"}, + FunctionInfo{3, nullptr, "GetSaveDataArchiveCount"}, + FunctionInfo{6, nullptr, "CleanupSaveDataArchives"}, + FunctionInfo{7, nullptr, "CreateSaveDataArchiveCacheUpdationTask"}, + FunctionInfo{8, nullptr, "CreateSaveDataArchiveCacheUpdationForSpecifiedApplicationTask"}, + FunctionInfo{9, nullptr, "Delete"}, + FunctionInfo{10, nullptr, "GetSeriesInfo"}, + FunctionInfo{11, nullptr, "CreateDeleteDataTask"}, + FunctionInfo{12, nullptr, "DeleteSeriesInfo"}, + FunctionInfo{13, nullptr, "CreateRegisterNotificationTokenTask"}, + FunctionInfo{14, D<&IRemoteStorageController::GetDataNewnessByApplicationId>, "GetDataNewnessByApplicationId"}, + FunctionInfo{15, nullptr, "RegisterUploadSaveDataTransferTaskForAutonomyRegistration"}, + FunctionInfo{16, nullptr, "CreateCleanupToDeleteSaveDataArchiveInfoTask"}, + FunctionInfo{17, nullptr, "ListDataInfo"}, + FunctionInfo{18, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV1"}, + FunctionInfo{19, nullptr, "GetDataInfoCacheUpdateNativeHandleHolder"}, + FunctionInfo{20, nullptr, "CreateSaveDataArchiveInfoCacheForSaveDataBackupUpdationTask"}, + FunctionInfo{21, nullptr, "ListSecondarySaves"}, + FunctionInfo{22, D<&IRemoteStorageController::GetSecondarySave>, "GetSecondarySave"}, + FunctionInfo{23, nullptr, "TouchSecondarySave"}, + FunctionInfo{24, nullptr, "GetSecondarySaveDataInfo"}, + FunctionInfo{25, nullptr, "RegisterDownloadSaveDataTransferTaskForAutonomyRegistration"}, + FunctionInfo{26, nullptr, "Unknown26", MakeVersionGate({20,0,0})}, + FunctionInfo{27, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV2", MakeVersionGate({20,0,0})}, + FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,0,0})}, + FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({21,0,0})}, + FunctionInfo{800, nullptr, "Unknown800", MakeVersionGate({20,0,0})}, + FunctionInfo{900, nullptr, "SetLoadedDataMissing"}, + FunctionInfo{901, nullptr, "Unknown901", MakeVersionGate({20,2,0})} + ); + return HandlerTableGenerateWithFind(key, functions); + } + IRemoteStorageController::IRemoteStorageController(Core::System& system_) : ServiceFramework{system_, "IRemoteStorageController"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetSaveDataArchiveInfoBySaveDataId"}, - {1, nullptr, "GetSaveDataArchiveInfoByApplicationId"}, - {3, nullptr, "GetSaveDataArchiveCount"}, - {6, nullptr, "CleanupSaveDataArchives"}, - {7, nullptr, "CreateSaveDataArchiveCacheUpdationTask"}, - {8, nullptr, "CreateSaveDataArchiveCacheUpdationForSpecifiedApplicationTask"}, - {9, nullptr, "Delete"}, - {10, nullptr, "GetSeriesInfo"}, - {11, nullptr, "CreateDeleteDataTask"}, - {12, nullptr, "DeleteSeriesInfo"}, - {13, nullptr, "CreateRegisterNotificationTokenTask"}, - {14, D<&IRemoteStorageController::GetDataNewnessByApplicationId>, "GetDataNewnessByApplicationId"}, - {15, nullptr, "RegisterUploadSaveDataTransferTaskForAutonomyRegistration"}, - {16, nullptr, "CreateCleanupToDeleteSaveDataArchiveInfoTask"}, - {17, nullptr, "ListDataInfo"}, - {18, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV1"}, - {19, nullptr, "GetDataInfoCacheUpdateNativeHandleHolder"}, - {20, nullptr, "CreateSaveDataArchiveInfoCacheForSaveDataBackupUpdationTask"}, - {21, nullptr, "ListSecondarySaves"}, - {22, D<&IRemoteStorageController::GetSecondarySave>, "GetSecondarySave"}, - {23, nullptr, "TouchSecondarySave"}, - {24, nullptr, "GetSecondarySaveDataInfo"}, - {25, nullptr, "RegisterDownloadSaveDataTransferTaskForAutonomyRegistration"}, - {26, nullptr, "Unknown26"}, //20.0.0+ - {27, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV2"}, //20.0.0+ - {28, nullptr, "Unknown28"}, //20.0.0+ - {29, nullptr, "Unknown29"}, //21.0.0+ - {800, nullptr, "Unknown800"}, //20.0.0+ - {900, nullptr, "SetLoadedDataMissing"}, - {901, nullptr, "Unknown901"}, //20.2.0+ - }; - // clang-format on - - RegisterHandlers(functions); } IRemoteStorageController::~IRemoteStorageController() = default; diff --git a/src/core/hle/service/olsc/remote_storage_controller.h b/src/core/hle/service/olsc/remote_storage_controller.h index 21b439013a..20503d9800 100644 --- a/src/core/hle/service/olsc/remote_storage_controller.h +++ b/src/core/hle/service/olsc/remote_storage_controller.h @@ -21,6 +21,8 @@ private: u64 application_id); Result GetDataNewnessByApplicationId(Out out_newness, u64 application_id); Result GetDataInfo(Out> out_data, u64 application_id); + + std::optional FindRequest(u32 key) override; }; } // namespace Service::OLSC diff --git a/src/core/hle/service/olsc/transfer_task_list_controller.cpp b/src/core/hle/service/olsc/transfer_task_list_controller.cpp index 95e41cdb51..af090fc292 100644 --- a/src/core/hle/service/olsc/transfer_task_list_controller.cpp +++ b/src/core/hle/service/olsc/transfer_task_list_controller.cpp @@ -11,45 +11,45 @@ namespace Service::OLSC { + std::optional ITransferTaskListController::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetTransferTaskCountForOcean"}, + FunctionInfo{1, nullptr, "GetTransferTaskInfoForOcean"}, + FunctionInfo{2, nullptr, "ListTransferTaskInfoForOcean"}, + FunctionInfo{3, nullptr, "DeleteTransferTaskForOcean"}, + FunctionInfo{4, nullptr, "RaiseTransferTaskPriorityForOcean"}, + FunctionInfo{5, D<&ITransferTaskListController::GetTransferTaskEndEventNativeHandleHolder>, "GetTransferTaskEndEventNativeHandleHolder"}, + FunctionInfo{6, nullptr, "GetTransferTaskProgressForOcean"}, + FunctionInfo{7, nullptr, "GetTransferTaskLastResultForOcean"}, + FunctionInfo{8, D<&ITransferTaskListController::StopNextTransferTaskExecution>, "StopNextTransferTaskExecution"}, + FunctionInfo{9, D<&ITransferTaskListController::GetTransferTaskStartEventNativeHandleHolder>, "GetTransferTaskStartEventNativeHandleHolder"}, + FunctionInfo{10, nullptr, "SuspendTransferTaskForOcean"}, + FunctionInfo{11, nullptr, "GetCurrentTransferTaskInfoForOcean"}, + FunctionInfo{12, nullptr, "FindTransferTaskInfoForOcean"}, + FunctionInfo{13, nullptr, "CancelCurrentRepairTransferTask"}, + FunctionInfo{14, nullptr, "GetRepairTransferTaskProgress"}, + FunctionInfo{15, nullptr, "EnsureExecutableForRepairTransferTask"}, + FunctionInfo{16, D<&ITransferTaskListController::GetTransferTaskCount>, "GetTransferTaskCount"}, + FunctionInfo{17, nullptr, "GetTransferTaskInfo"}, + FunctionInfo{18, nullptr, "ListTransferTaskInfo"}, + FunctionInfo{19, nullptr, "DeleteTransferTask"}, + FunctionInfo{20, nullptr, "RaiseTransferTaskPriority"}, + FunctionInfo{21, D<&ITransferTaskListController::GetTransferTaskProgress>, "GetTransferTaskProgress", MakeVersionGate({10,1,0})}, + FunctionInfo{22, nullptr, "GetTransferTaskLastResult"}, + FunctionInfo{23, nullptr, "SuspendTransferTask"}, + FunctionInfo{24, D<&ITransferTaskListController::GetCurrentTransferTaskInfo>, "GetCurrentTransferTaskInfo"}, + FunctionInfo{25, D<&ITransferTaskListController::FindTransferTaskInfo>, "FindTransferTaskInfo"}, + FunctionInfo{26, nullptr, "Unknown26", MakeVersionGate({20,1,0})}, + FunctionInfo{27, nullptr, "Unknown27", MakeVersionGate({20,1,0})}, + FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,1,0})}, + FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({20,1,0})}, + FunctionInfo{30, nullptr, "Unknown30", MakeVersionGate({20,1,0})} + ); + return HandlerTableGenerateWithFind(key, functions); + } + ITransferTaskListController::ITransferTaskListController(Core::System& system_) : ServiceFramework{system_, "ITransferTaskListController"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetTransferTaskCountForOcean"}, - {1, nullptr, "GetTransferTaskInfoForOcean"}, - {2, nullptr, "ListTransferTaskInfoForOcean"}, - {3, nullptr, "DeleteTransferTaskForOcean"}, - {4, nullptr, "RaiseTransferTaskPriorityForOcean"}, - {5, D<&ITransferTaskListController::GetTransferTaskEndEventNativeHandleHolder>, "GetTransferTaskEndEventNativeHandleHolder"}, - {6, nullptr, "GetTransferTaskProgressForOcean"}, - {7, nullptr, "GetTransferTaskLastResultForOcean"}, - {8, D<&ITransferTaskListController::StopNextTransferTaskExecution>, "StopNextTransferTaskExecution"}, - {9, D<&ITransferTaskListController::GetTransferTaskStartEventNativeHandleHolder>, "GetTransferTaskStartEventNativeHandleHolder"}, - {10, nullptr, "SuspendTransferTaskForOcean"}, - {11, nullptr, "GetCurrentTransferTaskInfoForOcean"}, - {12, nullptr, "FindTransferTaskInfoForOcean"}, - {13, nullptr, "CancelCurrentRepairTransferTask"}, - {14, nullptr, "GetRepairTransferTaskProgress"}, - {15, nullptr, "EnsureExecutableForRepairTransferTask"}, - {16, D<&ITransferTaskListController::GetTransferTaskCount>, "GetTransferTaskCount"}, - {17, nullptr, "GetTransferTaskInfo"}, - {18, nullptr, "ListTransferTaskInfo"}, - {19, nullptr, "DeleteTransferTask"}, - {20, nullptr, "RaiseTransferTaskPriority"}, - {21, D<&ITransferTaskListController::GetTransferTaskProgress>, "GetTransferTaskProgress"}, //10.1.0+ - {22, nullptr, "GetTransferTaskLastResult"}, - {23, nullptr, "SuspendTransferTask"}, - {24, D<&ITransferTaskListController::GetCurrentTransferTaskInfo>, "GetCurrentTransferTaskInfo"}, - {25, D<&ITransferTaskListController::FindTransferTaskInfo>, "FindTransferTaskInfo"}, - {26, nullptr, "Unknown26"}, //20.1.0+ - {27, nullptr, "Unknown27"}, //20.1.0+ - {28, nullptr, "Unknown28"}, //20.1.0+ - {29, nullptr, "Unknown29"}, //20.1.0+ - {30, nullptr, "Unknown30"}, //20.1.0+ - }; - // clang-format on - - RegisterHandlers(functions); } ITransferTaskListController::~ITransferTaskListController() = default; diff --git a/src/core/hle/service/olsc/transfer_task_list_controller.h b/src/core/hle/service/olsc/transfer_task_list_controller.h index 5f3429879a..74c5eddee3 100644 --- a/src/core/hle/service/olsc/transfer_task_list_controller.h +++ b/src/core/hle/service/olsc/transfer_task_list_controller.h @@ -27,6 +27,8 @@ private: Result GetTransferTaskProgress(); Result GetCurrentTransferTaskInfo(Out> out_info, u8 unknown); Result FindTransferTaskInfo(Out> out_info, InBuffer in); + + std::optional FindRequest(u32 key) override; }; } // namespace Service::OLSC diff --git a/src/core/hle/service/omm/operation_mode_manager.cpp b/src/core/hle/service/omm/operation_mode_manager.cpp index fe7ed84a7f..e36f606442 100644 --- a/src/core/hle/service/omm/operation_mode_manager.cpp +++ b/src/core/hle/service/omm/operation_mode_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,41 +10,6 @@ namespace Service::OMM { IOperationModeManager::IOperationModeManager(Core::System& system_) : ServiceFramework{system_, "omm"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetOperationMode"}, - {1, nullptr, "GetOperationModeChangeEvent"}, - {2, nullptr, "EnableAudioVisual"}, - {3, nullptr, "DisableAudioVisual"}, - {4, nullptr, "EnterSleepAndWait"}, - {5, nullptr, "GetCradleStatus"}, - {6, nullptr, "FadeInDisplay"}, - {7, nullptr, "FadeOutDisplay"}, - {8, nullptr, "GetCradleFwVersion"}, - {9, nullptr, "NotifyCecSettingsChanged"}, - {10, nullptr, "SetOperationModePolicy"}, - {11, nullptr, "GetDefaultDisplayResolution"}, - {12, nullptr, "GetDefaultDisplayResolutionChangeEvent"}, - {13, nullptr, "UpdateDefaultDisplayResolution"}, - {14, nullptr, "ShouldSleepOnBoot"}, - {15, nullptr, "NotifyHdcpApplicationExecutionStarted"}, - {16, nullptr, "NotifyHdcpApplicationExecutionFinished"}, - {17, nullptr, "NotifyHdcpApplicationDrawingStarted"}, - {18, nullptr, "NotifyHdcpApplicationDrawingFinished"}, - {19, nullptr, "GetHdcpAuthenticationFailedEvent"}, - {20, nullptr, "GetHdcpAuthenticationFailedEmulationEnabled"}, - {21, nullptr, "SetHdcpAuthenticationFailedEmulation"}, - {22, nullptr, "GetHdcpStateChangeEvent"}, - {23, nullptr, "GetHdcpState"}, - {24, nullptr, "ShowCardUpdateProcessing"}, - {25, nullptr, "SetApplicationCecSettingsAndNotifyChanged"}, - {26, nullptr, "GetOperationModeSystemInfo"}, - {27, nullptr, "GetAppletFullAwakingSystemEvent"}, - {28, nullptr, "CreateCradleFirmwareUpdater"}, - }; - // clang-format on - - RegisterHandlers(functions); } IOperationModeManager::~IOperationModeManager() = default; diff --git a/src/core/hle/service/omm/operation_mode_manager.h b/src/core/hle/service/omm/operation_mode_manager.h index 32bc7b2f93..ea604c8f60 100644 --- a/src/core/hle/service/omm/operation_mode_manager.h +++ b/src/core/hle/service/omm/operation_mode_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,6 +18,41 @@ class IOperationModeManager final : public ServiceFramework FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetOperationMode"}, + FunctionInfo{1, nullptr, "GetOperationModeChangeEvent"}, + FunctionInfo{2, nullptr, "EnableAudioVisual"}, + FunctionInfo{3, nullptr, "DisableAudioVisual"}, + FunctionInfo{4, nullptr, "EnterSleepAndWait"}, + FunctionInfo{5, nullptr, "GetCradleStatus"}, + FunctionInfo{6, nullptr, "FadeInDisplay"}, + FunctionInfo{7, nullptr, "FadeOutDisplay"}, + FunctionInfo{8, nullptr, "GetCradleFwVersion"}, + FunctionInfo{9, nullptr, "NotifyCecSettingsChanged"}, + FunctionInfo{10, nullptr, "SetOperationModePolicy"}, + FunctionInfo{11, nullptr, "GetDefaultDisplayResolution"}, + FunctionInfo{12, nullptr, "GetDefaultDisplayResolutionChangeEvent"}, + FunctionInfo{13, nullptr, "UpdateDefaultDisplayResolution"}, + FunctionInfo{14, nullptr, "ShouldSleepOnBoot"}, + FunctionInfo{15, nullptr, "NotifyHdcpApplicationExecutionStarted"}, + FunctionInfo{16, nullptr, "NotifyHdcpApplicationExecutionFinished"}, + FunctionInfo{17, nullptr, "NotifyHdcpApplicationDrawingStarted"}, + FunctionInfo{18, nullptr, "NotifyHdcpApplicationDrawingFinished"}, + FunctionInfo{19, nullptr, "GetHdcpAuthenticationFailedEvent"}, + FunctionInfo{20, nullptr, "GetHdcpAuthenticationFailedEmulationEnabled"}, + FunctionInfo{21, nullptr, "SetHdcpAuthenticationFailedEmulation"}, + FunctionInfo{22, nullptr, "GetHdcpStateChangeEvent"}, + FunctionInfo{23, nullptr, "GetHdcpState"}, + FunctionInfo{24, nullptr, "ShowCardUpdateProcessing"}, + FunctionInfo{25, nullptr, "SetApplicationCecSettingsAndNotifyChanged"}, + FunctionInfo{26, nullptr, "GetOperationModeSystemInfo"}, + FunctionInfo{27, nullptr, "GetAppletFullAwakingSystemEvent"}, + FunctionInfo{28, nullptr, "CreateCradleFirmwareUpdater"} + ); }; } // namespace Service::OMM diff --git a/src/core/hle/service/omm/policy_manager_system.cpp b/src/core/hle/service/omm/policy_manager_system.cpp index 1cd6fd807b..1d46de7f3e 100644 --- a/src/core/hle/service/omm/policy_manager_system.cpp +++ b/src/core/hle/service/omm/policy_manager_system.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,18 +10,6 @@ namespace Service::OMM { IPolicyManagerSystem::IPolicyManagerSystem(Core::System& system_) : ServiceFramework{system_, "idle:sys"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetAutoPowerDownEvent"}, - {1, nullptr, "IsAutoPowerDownRequested"}, - {2, nullptr, "Unknown2"}, - {3, nullptr, "SetHandlingContext"}, - {4, nullptr, "LoadAndApplySettings"}, - {5, nullptr, "ReportUserIsActive"}, - }; - // clang-format on - - RegisterHandlers(functions); } IPolicyManagerSystem::~IPolicyManagerSystem() = default; diff --git a/src/core/hle/service/omm/policy_manager_system.h b/src/core/hle/service/omm/policy_manager_system.h index 151ca0d2ee..c6ff451e61 100644 --- a/src/core/hle/service/omm/policy_manager_system.h +++ b/src/core/hle/service/omm/policy_manager_system.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,6 +18,18 @@ class IPolicyManagerSystem final : public ServiceFramework public: explicit IPolicyManagerSystem(Core::System& system_); ~IPolicyManagerSystem() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetAutoPowerDownEvent"}, + FunctionInfo{1, nullptr, "IsAutoPowerDownRequested"}, + FunctionInfo{2, nullptr, "Unknown2"}, + FunctionInfo{3, nullptr, "SetHandlingContext"}, + FunctionInfo{4, nullptr, "LoadAndApplySettings"}, + FunctionInfo{5, nullptr, "ReportUserIsActive"} + ); }; } // namespace Service::OMM diff --git a/src/core/hle/service/omm/power_state_interface.cpp b/src/core/hle/service/omm/power_state_interface.cpp index 22cac82595..4150882695 100644 --- a/src/core/hle/service/omm/power_state_interface.cpp +++ b/src/core/hle/service/omm/power_state_interface.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,24 +10,6 @@ namespace Service::OMM { IPowerStateInterface::IPowerStateInterface(Core::System& system_) : ServiceFramework{system_, "spsm"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetState"}, - {1, nullptr, "EnterSleep"}, - {2, nullptr, "GetLastWakeReason"}, - {3, nullptr, "Shutdown"}, - {4, nullptr, "GetNotificationMessageEventHandle"}, - {5, nullptr, "ReceiveNotificationMessage"}, - {6, nullptr, "AnalyzeLogForLastSleepWakeSequence"}, - {7, nullptr, "ResetEventLog"}, - {8, nullptr, "AnalyzePerformanceLogForLastSleepWakeSequence"}, - {9, nullptr, "ChangeHomeButtonLongPressingTime"}, - {10, nullptr, "PutErrorState"}, - {11, nullptr, "InvalidateCurrentHomeButtonPressing"}, - }; - // clang-format on - - RegisterHandlers(functions); } IPowerStateInterface::~IPowerStateInterface() = default; diff --git a/src/core/hle/service/omm/power_state_interface.h b/src/core/hle/service/omm/power_state_interface.h index 825a6512d9..fed55a4361 100644 --- a/src/core/hle/service/omm/power_state_interface.h +++ b/src/core/hle/service/omm/power_state_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,6 +18,24 @@ class IPowerStateInterface final : public ServiceFramework public: explicit IPowerStateInterface(Core::System& system_); ~IPowerStateInterface() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetState"}, + FunctionInfo{1, nullptr, "EnterSleep"}, + FunctionInfo{2, nullptr, "GetLastWakeReason"}, + FunctionInfo{3, nullptr, "Shutdown"}, + FunctionInfo{4, nullptr, "GetNotificationMessageEventHandle"}, + FunctionInfo{5, nullptr, "ReceiveNotificationMessage"}, + FunctionInfo{6, nullptr, "AnalyzeLogForLastSleepWakeSequence"}, + FunctionInfo{7, nullptr, "ResetEventLog"}, + FunctionInfo{8, nullptr, "AnalyzePerformanceLogForLastSleepWakeSequence"}, + FunctionInfo{9, nullptr, "ChangeHomeButtonLongPressingTime"}, + FunctionInfo{10, nullptr, "PutErrorState"}, + FunctionInfo{11, nullptr, "InvalidateCurrentHomeButtonPressing"} + ); }; } // namespace Service::OMM diff --git a/src/core/hle/service/pcie/pcie.cpp b/src/core/hle/service/pcie/pcie.cpp index d162881ecf..f9aaa2d3b8 100644 --- a/src/core/hle/service/pcie/pcie.cpp +++ b/src/core/hle/service/pcie/pcie.cpp @@ -15,64 +15,62 @@ namespace Service::PCIe { class ISession final : public ServiceFramework { public: - explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "QueryFunctions"}, - {1, nullptr, "AcquireFunction"}, - {2, nullptr, "ReleaseFunction"}, - {3, nullptr, "GetFunctionState"}, - {4, nullptr, "GetBarProfile"}, - {5, nullptr, "ReadConfig"}, - {6, nullptr, "WriteConfig"}, - {7, nullptr, "ReadBarRegion"}, - {8, nullptr, "WriteBarRegion"}, - {9, nullptr, "FindCapability"}, - {10, nullptr, "FindExtendedCapability"}, - {11, nullptr, "MapDma"}, - {12, nullptr, "UnmapDma"}, - {13, nullptr, "UnmapDmaBusAddress"}, - {14, nullptr, "GetDmaBusAddress"}, - {15, nullptr, "GetDmaBusAddressRange"}, - {16, nullptr, "SetDmaEnable"}, - {17, nullptr, "AcquireIrq"}, - {18, nullptr, "ReleaseIrq"}, - {19, nullptr, "SetIrqEnable"}, - {20, nullptr, "GetIrqEvent"}, - {21, nullptr, "SetAspmEnable"}, - {22, nullptr, "SetResetUponResumeEnable"}, - {23, nullptr, "ResetFunction"}, - }; - // clang-format on + explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "QueryFunctions"}, + FunctionInfo{1, nullptr, "AcquireFunction"}, + FunctionInfo{2, nullptr, "ReleaseFunction"}, + FunctionInfo{3, nullptr, "GetFunctionState"}, + FunctionInfo{4, nullptr, "GetBarProfile"}, + FunctionInfo{5, nullptr, "ReadConfig"}, + FunctionInfo{6, nullptr, "WriteConfig"}, + FunctionInfo{7, nullptr, "ReadBarRegion"}, + FunctionInfo{8, nullptr, "WriteBarRegion"}, + FunctionInfo{9, nullptr, "FindCapability"}, + FunctionInfo{10, nullptr, "FindExtendedCapability"}, + FunctionInfo{11, nullptr, "MapDma"}, + FunctionInfo{12, nullptr, "UnmapDma"}, + FunctionInfo{13, nullptr, "UnmapDmaBusAddress"}, + FunctionInfo{14, nullptr, "GetDmaBusAddress"}, + FunctionInfo{15, nullptr, "GetDmaBusAddressRange"}, + FunctionInfo{16, nullptr, "SetDmaEnable"}, + FunctionInfo{17, nullptr, "AcquireIrq"}, + FunctionInfo{18, nullptr, "ReleaseIrq"}, + FunctionInfo{19, nullptr, "SetIrqEnable"}, + FunctionInfo{20, nullptr, "GetIrqEvent"}, + FunctionInfo{21, nullptr, "SetAspmEnable"}, + FunctionInfo{22, nullptr, "SetResetUponResumeEnable"}, + FunctionInfo{23, nullptr, "ResetFunction"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class PCIE final : public ServiceFramework { public: - explicit PCIE(Core::System& system_) : ServiceFramework{system_, "pcie"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "RegisterClassDriver"}, - {1, nullptr, "QueryFunctionsUnregistered"}, - }; - // clang-format on + explicit PCIE(Core::System& system_) : ServiceFramework{system_, "pcie"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "RegisterClassDriver"}, + FunctionInfo{1, nullptr, "QueryFunctionsUnregistered"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class PCIE_LOG final : public ServiceFramework { public: - explicit PCIE_LOG(Core::System& system_) : ServiceFramework{system_, "pcie:log"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetLoggedState"}, - {1, nullptr, "GetLoggedStateEvent"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit PCIE_LOG(Core::System& system_) : ServiceFramework{system_, "pcie:log"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetLoggedState"}, + FunctionInfo{1, nullptr, "GetLoggedStateEvent"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/pctl/parental_control_service.cpp b/src/core/hle/service/pctl/parental_control_service.cpp deleted file mode 100644 index 51953c2657..0000000000 --- a/src/core/hle/service/pctl/parental_control_service.cpp +++ /dev/null @@ -1,498 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include - -#include "core/core.h" -#include "core/file_sys/control_metadata.h" -#include "core/file_sys/patch_manager.h" -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/pctl/parental_control_service.h" -#include "core/hle/service/pctl/pctl_results.h" - -namespace Service::PCTL { - -IParentalControlService::IParentalControlService(Core::System& system_, Capability capability_, - u64 program_id_) - : ServiceFramework{system_, "IParentalControlService"}, capability{capability_}, - program_id{program_id_}, - service_context{system_, "IParentalControlService"}, synchronization_event{service_context}, - unlinked_event{service_context}, request_suspension_event{service_context} { - // clang-format off - static const FunctionInfo functions[] = { - {1, D<&IParentalControlService::Initialize>, "Initialize"}, - {1001, D<&IParentalControlService::CheckFreeCommunicationPermission>, "CheckFreeCommunicationPermission"}, - {1002, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"}, - {1003, D<&IParentalControlService::ConfirmResumeApplicationPermission>, "ConfirmResumeApplicationPermission"}, - {1004, D<&IParentalControlService::ConfirmSnsPostPermission>, "ConfirmSnsPostPermission"}, - {1005, D<&IParentalControlService::ConfirmSystemSettingsPermission>, "ConfirmSystemSettingsPermission"}, - {1006, D<&IParentalControlService::IsRestrictionTemporaryUnlocked>, "IsRestrictionTemporaryUnlocked"}, - {1007, nullptr, "RevertRestrictionTemporaryUnlocked"}, - {1008, nullptr, "EnterRestrictedSystemSettings"}, - {1009, nullptr, "LeaveRestrictedSystemSettings"}, - {1010, D<&IParentalControlService::IsRestrictedSystemSettingsEntered>, "IsRestrictedSystemSettingsEntered"}, - {1011, nullptr, "RevertRestrictedSystemSettingsEntered"}, - {1012, nullptr, "GetRestrictedFeatures"}, - {1013, D<&IParentalControlService::ConfirmStereoVisionPermission>, "ConfirmStereoVisionPermission"}, - {1014, nullptr, "ConfirmPlayableApplicationVideoOld"}, - {1015, nullptr, "ConfirmPlayableApplicationVideo"}, - {1016, nullptr, "ConfirmShowNewsPermission"}, - {1017, D<&IParentalControlService::EndFreeCommunication>, "EndFreeCommunication"}, - {1018, D<&IParentalControlService::IsFreeCommunicationAvailable>, "IsFreeCommunicationAvailable"}, - {1019, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"}, - {1020, nullptr, "ConfirmLaunchSharedApplicationPermission"}, //20.0.0+ - {1021, nullptr, "TryBeginFreeCommunicationForStreamPlay"}, //21.0.0+ - {1022, nullptr, "EndFreeCommunicationForStreamPlay"}, //21.0.0+ - {1031, D<&IParentalControlService::IsRestrictionEnabled>, "IsRestrictionEnabled"}, - {1032, D<&IParentalControlService::GetSafetyLevel>, "GetSafetyLevel"}, - {1033, nullptr, "SetSafetyLevel"}, - {1034, nullptr, "GetSafetyLevelSettings"}, - {1035, D<&IParentalControlService::GetCurrentSettings>, "GetCurrentSettings"}, - {1036, nullptr, "SetCustomSafetyLevelSettings"}, - {1037, nullptr, "GetDefaultRatingOrganization"}, - {1038, nullptr, "SetDefaultRatingOrganization"}, - {1039, D<&IParentalControlService::GetFreeCommunicationApplicationListCount>, "GetFreeCommunicationApplicationListCount"}, - {1042, nullptr, "AddToFreeCommunicationApplicationList"}, - {1043, nullptr, "DeleteSettings"}, - {1044, nullptr, "GetFreeCommunicationApplicationList"}, - {1045, nullptr, "UpdateFreeCommunicationApplicationList"}, - {1046, nullptr, "DisableFeaturesForReset"}, - {1047, nullptr, "NotifyApplicationDownloadStarted"}, - {1048, nullptr, "NotifyNetworkProfileCreated"}, - {1049, nullptr, "ResetFreeCommunicationApplicationList"}, - {1050, nullptr, "AddToFreeCommunicationApplicationList"}, //20.0.0+ - {1051, nullptr, "NotifyApplicationDownloadStarted"}, //20.0.0+ - {1061, D<&IParentalControlService::ConfirmStereoVisionRestrictionConfigurable>, "ConfirmStereoVisionRestrictionConfigurable"}, - {1062, D<&IParentalControlService::GetStereoVisionRestriction>, "GetStereoVisionRestriction"}, - {1063, D<&IParentalControlService::SetStereoVisionRestriction>, "SetStereoVisionRestriction"}, - {1064, D<&IParentalControlService::ResetConfirmedStereoVisionPermission>, "ResetConfirmedStereoVisionPermission"}, - {1065, D<&IParentalControlService::IsStereoVisionPermitted>, "IsStereoVisionPermitted"}, - {1201, nullptr, "UnlockRestrictionTemporarily"}, - {1202, nullptr, "UnlockSystemSettingsRestriction"}, - {1203, nullptr, "SetPinCode"}, - {1204, nullptr, "GenerateInquiryCode"}, - {1205, nullptr, "CheckMasterKey"}, - {1206, D<&IParentalControlService::GetPinCodeLength>, "GetPinCodeLength"}, - {1207, nullptr, "GetPinCodeChangedEvent"}, - {1208, nullptr, "GetPinCode"}, - {1403, D<&IParentalControlService::IsPairingActive>, "IsPairingActive"}, - {1406, nullptr, "GetSettingsLastUpdated"}, - {1411, nullptr, "GetPairingAccountInfo"}, - {1421, nullptr, "GetAccountNickname"}, - {1424, nullptr, "GetAccountState"}, - {1425, nullptr, "RequestPostEvents"}, - {1426, nullptr, "GetPostEventInterval"}, - {1427, nullptr, "SetPostEventInterval"}, - {1432, D<&IParentalControlService::GetSynchronizationEvent>, "GetSynchronizationEvent"}, - {1451, D<&IParentalControlService::StartPlayTimer>, "StartPlayTimer"}, - {1452, D<&IParentalControlService::StopPlayTimer>, "StopPlayTimer"}, - {1453, D<&IParentalControlService::IsPlayTimerEnabled>, "IsPlayTimerEnabled"}, - {1454, D<&IParentalControlService::GetPlayTimerRemainingTime>, "GetPlayTimerRemainingTime"}, - {1455, D<&IParentalControlService::IsRestrictedByPlayTimer>, "IsRestrictedByPlayTimer"}, - {1456, D<&IParentalControlService::GetPlayTimerSettingsOld>, "GetPlayTimerSettingsOld"}, - {1457, D<&IParentalControlService::GetPlayTimerEventToRequestSuspension>, "GetPlayTimerEventToRequestSuspension"}, - {1458, D<&IParentalControlService::IsPlayTimerAlarmDisabled>, "IsPlayTimerAlarmDisabled"}, - {1459, D<&IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo>, "GetPlayTimerRemainingTimeDisplayInfo"}, - {1460, D<&IParentalControlService::Unknown1460>, "Unknown1460"}, - {1471, nullptr, "NotifyWrongPinCodeInputManyTimes"}, - {1472, nullptr, "CancelNetworkRequest"}, - {1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"}, - {1474, nullptr, "ClearUnlinkedEvent"}, - {1475, nullptr, "GetExtendedPlayTimerEvent"}, // 18.0.0+ - {1601, nullptr, "DisableAllFeatures"}, - {1602, nullptr, "PostEnableAllFeatures"}, - {1603, nullptr, "IsAllFeaturesDisabled"}, - {1901, nullptr, "DeleteFromFreeCommunicationApplicationListForDebug"}, - {1902, nullptr, "ClearFreeCommunicationApplicationListForDebug"}, - {1903, nullptr, "GetExemptApplicationListCountForDebug"}, - {1904, nullptr, "GetExemptApplicationListForDebug"}, - {1905, nullptr, "UpdateExemptApplicationListForDebug"}, - {1906, nullptr, "AddToExemptApplicationListForDebug"}, - {1907, nullptr, "DeleteFromExemptApplicationListForDebug"}, - {1908, nullptr, "ClearExemptApplicationListForDebug"}, - {1941, nullptr, "DeletePairing"}, - {1951, nullptr, "SetPlayTimerSettingsForDebug"}, - {1952, nullptr, "GetPlayTimerSpentTimeForTest"}, - {1953, nullptr, "SetPlayTimerAlarmDisabledForDebug"}, - {1954, nullptr, "IsBedtimeAlarmEnabled"}, // 18.0.0+ - {1955, nullptr, "GetBedtimeAlarmTime"}, // 18.0.0+ - {1956, nullptr, "GetBedtimeAlarmTimeHour"}, // 18.0.0+ - {1957, nullptr, "GetBedtimeAlarmTimeMinute"}, // 18.0.0+ - {2001, nullptr, "RequestPairingAsync"}, - {2002, nullptr, "FinishRequestPairing"}, - {2003, nullptr, "AuthorizePairingAsync"}, - {2004, nullptr, "FinishAuthorizePairing"}, - {2005, nullptr, "RetrievePairingInfoAsync"}, - {2006, nullptr, "FinishRetrievePairingInfo"}, - {2007, nullptr, "UnlinkPairingAsync"}, - {2008, nullptr, "FinishUnlinkPairing"}, - {2009, nullptr, "GetAccountMiiImageAsync"}, - {2010, nullptr, "FinishGetAccountMiiImage"}, - {2011, nullptr, "GetAccountMiiImageContentTypeAsync"}, - {2012, nullptr, "FinishGetAccountMiiImageContentType"}, - {2013, nullptr, "SynchronizeParentalControlSettingsAsync"}, - {2014, nullptr, "FinishSynchronizeParentalControlSettings"}, - {2015, nullptr, "FinishSynchronizeParentalControlSettingsWithLastUpdated"}, - {2016, nullptr, "RequestUpdateExemptionListAsync"}, //5.0.0+ - {145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings"}, // 18.0.0+ - {2017, nullptr, "AuthorizePairingAsync"}, //19.0.0+ - {2019, nullptr, "RequestUpdateDeviceUsersBackground"}, //19.0.0+ - {2021, nullptr, "RequestCopyPairingAsync"}, //20.0.0+ - {2022, nullptr, "FinishRequestCopyPairing"}, //20.0.0+ - {2023, nullptr, "IsFromPairingActiveDevice"}, //20.0.0+ - {2024, nullptr, "RollbackCopyPairing"}, //21.0.0+ - {3001, nullptr, "GetErrorContextChangedEvent"}, //20.0.0+ - {145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings"}, // 18.0.0+ - {195101, D<&IParentalControlService::SetPlayTimerSettings>, "SetPlayTimerSettingsForDebug"}, //18.0.0+ - }; - // clang-format on - RegisterHandlers(functions); -} - -IParentalControlService::~IParentalControlService() = default; - -bool IParentalControlService::CheckFreeCommunicationPermissionImpl() const { - if (states.temporary_unlocked) { - return true; - } - if ((states.application_info.parental_control_flag & 1) == 0) { - return true; - } - if (pin_code[0] == '\0') { - return true; - } - if (!settings.is_free_communication_default_on) { - return true; - } - // TODO(ogniK): Check for blacklisted/exempted applications. Return false can happen here - // but as we don't have multiproceses support yet, we can just assume our application is - // valid for the time being - return true; -} - -bool IParentalControlService::ConfirmStereoVisionPermissionImpl() const { - if (states.temporary_unlocked) { - return true; - } - if (pin_code[0] == '\0') { - return true; - } - if (!settings.is_stero_vision_restricted) { - return false; - } - return true; -} - -void IParentalControlService::SetStereoVisionRestrictionImpl(bool is_restricted) { - if (settings.disabled) { - return; - } - - if (pin_code[0] == '\0') { - return; - } - settings.is_stero_vision_restricted = is_restricted; -} - -Result IParentalControlService::Initialize() { - LOG_DEBUG(Service_PCTL, "called"); - - if (False(capability & (Capability::Application | Capability::System))) { - LOG_ERROR(Service_PCTL, "Invalid capability! capability={:X}", capability); - R_THROW(PCTL::ResultNoCapability); - } - - // TODO(ogniK): Recovery flag initialization for pctl:r - - if (program_id != 0) { - const FileSys::PatchManager pm{program_id, system.GetFileSystemController(), - system.GetContentProvider()}; - const auto control = pm.GetControlMetadata(); - if (control.first) { - states.tid_from_event = 0; - states.launch_time_valid = false; - states.is_suspended = false; - states.free_communication = false; - states.stereo_vision = false; - states.application_info = ApplicationInfo{ - .application_id = program_id, - .age_rating = control.first->GetRatingAge(), - .parental_control_flag = control.first->GetParentalControlFlag(), - .capability = capability, - }; - - if (False(capability & (Capability::System | Capability::Recovery))) { - // TODO(ogniK): Signal application launch event - } - } - } - - R_SUCCEED(); -} - -Result IParentalControlService::CheckFreeCommunicationPermission() { - LOG_DEBUG(Service_PCTL, "called"); - - if (!CheckFreeCommunicationPermissionImpl()) { - R_THROW(PCTL::ResultNoFreeCommunication); - } else { - states.free_communication = true; - R_SUCCEED(); - } -} - -Result IParentalControlService::ConfirmLaunchApplicationPermission( - InBuffer restriction_bitset, u64 nacp_flag, u64 application_id) { - LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag, - application_id); - R_SUCCEED(); -} - -Result IParentalControlService::ConfirmResumeApplicationPermission( - InBuffer restriction_bitset, u64 nacp_flag, u64 application_id) { - LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag, - application_id); - R_SUCCEED(); -} - -Result IParentalControlService::ConfirmSnsPostPermission() { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - R_THROW(PCTL::ResultNoFreeCommunication); -} - -Result IParentalControlService::ConfirmSystemSettingsPermission() { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - R_SUCCEED(); -} - -Result IParentalControlService::IsRestrictionTemporaryUnlocked( - Out out_is_temporary_unlocked) { - *out_is_temporary_unlocked = false; - LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}", - *out_is_temporary_unlocked); - R_SUCCEED(); -} - -Result IParentalControlService::IsRestrictedSystemSettingsEntered( - Out out_is_restricted_system_settings_entered) { - *out_is_restricted_system_settings_entered = false; - LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}", - *out_is_restricted_system_settings_entered); - R_SUCCEED(); -} - -Result IParentalControlService::ConfirmStereoVisionPermission() { - LOG_DEBUG(Service_PCTL, "called"); - states.stereo_vision = true; - R_SUCCEED(); -} - -Result IParentalControlService::EndFreeCommunication() { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - R_SUCCEED(); -} - -Result IParentalControlService::IsFreeCommunicationAvailable() { - LOG_DEBUG(Service_PCTL, "(STUBBED) called"); - - if (!CheckFreeCommunicationPermissionImpl()) { - R_THROW(PCTL::ResultNoFreeCommunication); - } else { - R_SUCCEED(); - } -} - -Result IParentalControlService::IsRestrictionEnabled(Out out_restriction_enabled) { - LOG_DEBUG(Service_PCTL, "called"); - - if (False(capability & (Capability::Status | Capability::Recovery))) { - LOG_ERROR(Service_PCTL, "Application does not have Status or Recovery capabilities!"); - *out_restriction_enabled = false; - R_THROW(PCTL::ResultNoCapability); - } - - *out_restriction_enabled = pin_code[0] != '\0'; - R_SUCCEED(); -} - -Result IParentalControlService::GetSafetyLevel(Out out_safety_level) { - *out_safety_level = 0; - LOG_WARNING(Service_PCTL, "(STUBBED) called, safety_level={}", *out_safety_level); - R_SUCCEED(); -} - -Result IParentalControlService::GetCurrentSettings(Out out_settings) { - LOG_INFO(Service_PCTL, "called"); - *out_settings = restriction_settings; - R_SUCCEED(); -} - -Result IParentalControlService::GetFreeCommunicationApplicationListCount(Out out_count) { - *out_count = 4; - LOG_WARNING(Service_PCTL, "(STUBBED) called, count={}", *out_count); - R_SUCCEED(); -} - -Result IParentalControlService::ConfirmStereoVisionRestrictionConfigurable() { - LOG_DEBUG(Service_PCTL, "called"); - - if (False(capability & Capability::StereoVision)) { - LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); - R_THROW(PCTL::ResultNoCapability); - } - - if (pin_code[0] == '\0') { - R_THROW(PCTL::ResultNoRestrictionEnabled); - } - - R_SUCCEED(); -} - -Result IParentalControlService::IsStereoVisionPermitted(Out out_is_permitted) { - LOG_DEBUG(Service_PCTL, "called"); - - if (!ConfirmStereoVisionPermissionImpl()) { - *out_is_permitted = false; - R_THROW(PCTL::ResultStereoVisionRestricted); - } else { - *out_is_permitted = true; - R_SUCCEED(); - } -} - -Result IParentalControlService::GetPinCodeLength(Out out_length) { - *out_length = 0; - LOG_WARNING(Service_PCTL, "(STUBBED) called, length={}", *out_length); - R_SUCCEED(); -} - -Result IParentalControlService::IsPairingActive(Out out_is_pairing_active) { - *out_is_pairing_active = false; - LOG_WARNING(Service_PCTL, "(STUBBED) called, is_pairing_active={}", *out_is_pairing_active); - R_SUCCEED(); -} - -Result IParentalControlService::GetSynchronizationEvent( - OutCopyHandle out_event) { - LOG_INFO(Service_PCTL, "called"); - *out_event = synchronization_event.GetHandle(); - R_SUCCEED(); -} - -Result IParentalControlService::StartPlayTimer() { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - R_SUCCEED(); -} - -Result IParentalControlService::StopPlayTimer() { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - R_SUCCEED(); -} - -Result IParentalControlService::IsPlayTimerEnabled(Out out_is_play_timer_enabled) { - *out_is_play_timer_enabled = false; - LOG_WARNING(Service_PCTL, "(STUBBED) called, enabled={}", *out_is_play_timer_enabled); - R_SUCCEED(); -} - -Result IParentalControlService::GetPlayTimerRemainingTime(Out out_remaining_time) { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - *out_remaining_time = std::numeric_limits::max(); - R_SUCCEED(); -} - -Result IParentalControlService::IsRestrictedByPlayTimer(Out out_is_restricted_by_play_timer) { - *out_is_restricted_by_play_timer = false; - LOG_WARNING(Service_PCTL, "(STUBBED) called, restricted={}", *out_is_restricted_by_play_timer); - R_SUCCEED(); -} - -Result IParentalControlService::GetPlayTimerSettingsOld( - Out out_play_timer_settings) { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - *out_play_timer_settings = {}; - R_SUCCEED(); -} - -Result IParentalControlService::GetPlayTimerSettings(Out out_play_timer_settings) { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - *out_play_timer_settings = raw_play_timer_settings; - R_SUCCEED(); -} - -Result IParentalControlService::SetPlayTimerSettings(PlayTimerSettings play_timer_settings) { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - raw_play_timer_settings = play_timer_settings; - R_SUCCEED(); -} - -Result IParentalControlService::GetPlayTimerEventToRequestSuspension( - OutCopyHandle out_event) { - LOG_INFO(Service_PCTL, "called"); - *out_event = request_suspension_event.GetHandle(); - R_SUCCEED(); -} - -Result IParentalControlService::IsPlayTimerAlarmDisabled(Out out_play_timer_alarm_disabled) { - *out_play_timer_alarm_disabled = false; - LOG_INFO(Service_PCTL, "called, is_play_timer_alarm_disabled={}", - *out_play_timer_alarm_disabled); - R_SUCCEED(); -} - -Result IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo(Out out_display_info) { - LOG_DEBUG(Service_PCTL, "called"); - *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; - R_SUCCEED(); -} - -Result IParentalControlService::Unknown1460(u8 in_unk, Out out_display_info) { - LOG_DEBUG(Service_PCTL, "called, in_unk={}", in_unk); - *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; - R_SUCCEED(); -} - -Result IParentalControlService::GetUnlinkedEvent(OutCopyHandle out_event) { - LOG_INFO(Service_PCTL, "called"); - *out_event = unlinked_event.GetHandle(); - R_SUCCEED(); -} - -Result IParentalControlService::GetStereoVisionRestriction( - Out out_stereo_vision_restriction) { - LOG_DEBUG(Service_PCTL, "called"); - - if (False(capability & Capability::StereoVision)) { - LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); - *out_stereo_vision_restriction = false; - R_THROW(PCTL::ResultNoCapability); - } - - *out_stereo_vision_restriction = settings.is_stero_vision_restricted; - R_SUCCEED(); -} - -Result IParentalControlService::SetStereoVisionRestriction(bool stereo_vision_restriction) { - LOG_DEBUG(Service_PCTL, "called, can_use={}", stereo_vision_restriction); - - if (False(capability & Capability::StereoVision)) { - LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); - R_THROW(PCTL::ResultNoCapability); - } - - SetStereoVisionRestrictionImpl(stereo_vision_restriction); - R_SUCCEED(); -} - -Result IParentalControlService::ResetConfirmedStereoVisionPermission() { - LOG_DEBUG(Service_PCTL, "called"); - - states.stereo_vision = false; - - R_SUCCEED(); -} - -} // namespace Service::PCTL diff --git a/src/core/hle/service/pctl/parental_control_service.h b/src/core/hle/service/pctl/parental_control_service.h deleted file mode 100644 index 9dabe3d059..0000000000 --- a/src/core/hle/service/pctl/parental_control_service.h +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator -// Project// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/kernel_helpers.h" -#include "core/hle/service/os/event.h" -#include "core/hle/service/pctl/pctl_types.h" -#include "core/hle/service/service.h" - -namespace Service::PCTL { - -class IParentalControlService final : public ServiceFramework { -public: - explicit IParentalControlService(Core::System& system_, Capability capability_, - u64 program_id_); - ~IParentalControlService() override; - -private: - bool CheckFreeCommunicationPermissionImpl() const; - bool ConfirmStereoVisionPermissionImpl() const; - void SetStereoVisionRestrictionImpl(bool is_restricted); - - Result Initialize(); - Result CheckFreeCommunicationPermission(); - Result ConfirmLaunchApplicationPermission(InBuffer restriction_bitset, - u64 nacp_flag, u64 application_id); - Result ConfirmResumeApplicationPermission(InBuffer restriction_bitset, - u64 nacp_flag, u64 application_id); - Result ConfirmSnsPostPermission(); - Result ConfirmSystemSettingsPermission(); - Result IsRestrictionTemporaryUnlocked(Out out_is_temporary_unlocked); - Result IsRestrictedSystemSettingsEntered(Out out_is_restricted_system_settings_entered); - Result ConfirmStereoVisionPermission(); - Result EndFreeCommunication(); - Result IsFreeCommunicationAvailable(); - Result IsRestrictionEnabled(Out out_restriction_enabled); - Result GetSafetyLevel(Out out_safety_level); - Result GetCurrentSettings(Out out_settings); - Result GetFreeCommunicationApplicationListCount(Out out_count); - Result ConfirmStereoVisionRestrictionConfigurable(); - Result IsStereoVisionPermitted(Out out_is_permitted); - Result GetPinCodeLength(Out out_length); - Result IsPairingActive(Out out_is_pairing_active); - Result GetSynchronizationEvent(OutCopyHandle out_event); - Result StartPlayTimer(); - Result StopPlayTimer(); - Result IsPlayTimerEnabled(Out out_is_play_timer_enabled); - Result GetPlayTimerRemainingTime(Out out_remaining_time); - Result IsRestrictedByPlayTimer(Out out_is_restricted_by_play_timer); - Result GetPlayTimerSettingsOld(Out out_play_timer_settings); - Result GetPlayTimerEventToRequestSuspension(OutCopyHandle out_event); - Result IsPlayTimerAlarmDisabled(Out out_play_timer_alarm_disabled); - Result GetPlayTimerRemainingTimeDisplayInfo(Out out_display_info); - Result Unknown1460(u8 in_unk, Out out_display_info); - Result GetUnlinkedEvent(OutCopyHandle out_event); - Result GetStereoVisionRestriction(Out out_stereo_vision_restriction); - Result SetStereoVisionRestriction(bool stereo_vision_restriction); - Result ResetConfirmedStereoVisionPermission(); - Result GetPlayTimerSettings(Out out_play_timer_settings); - Result SetPlayTimerSettings(PlayTimerSettings out_play_timer_settings); - - struct States { - u64 current_tid{}; - ApplicationInfo application_info{}; - u64 tid_from_event{}; - bool launch_time_valid{}; - bool is_suspended{}; - bool temporary_unlocked{}; - bool free_communication{}; - bool stereo_vision{}; - }; - - struct ParentalControlSettings { - bool is_stero_vision_restricted{}; - bool is_free_communication_default_on{}; - bool disabled{}; - }; - - States states{}; - ParentalControlSettings settings{}; - RestrictionSettings restriction_settings{}; - std::array pin_code{}; - Capability capability{}; - u64 program_id{}; - // TODO: this is raw - PlayTimerSettings raw_play_timer_settings{}; - - KernelHelpers::ServiceContext service_context; - Event synchronization_event; - Event unlinked_event; - Event request_suspension_event; -}; - -} // namespace Service::PCTL diff --git a/src/core/hle/service/pctl/parental_control_service_factory.cpp b/src/core/hle/service/pctl/parental_control_service_factory.cpp deleted file mode 100644 index ae278a9bbc..0000000000 --- a/src/core/hle/service/pctl/parental_control_service_factory.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/core.h" -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/pctl/parental_control_service.h" -#include "core/hle/service/pctl/parental_control_service_factory.h" - -namespace Service::PCTL { - -IParentalControlServiceFactory::IParentalControlServiceFactory(Core::System& system_, - const char* name_, - Capability capability_) - : ServiceFramework{system_, name_}, capability{capability_} { - static const FunctionInfo functions[] = { - {0, D<&IParentalControlServiceFactory::CreateService>, "CreateService"}, - {1, D<&IParentalControlServiceFactory::CreateServiceWithoutInitialize>, - "CreateServiceWithoutInitialize"}, - }; - RegisterHandlers(functions); -} - -IParentalControlServiceFactory::~IParentalControlServiceFactory() = default; - -Result IParentalControlServiceFactory::CreateService( - Out> out_service, ClientProcessId process_id) { - LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid); - *out_service = std::make_shared( - system, capability, system.ResolveCallerProgramId(*process_id)); - R_SUCCEED(); -} - -Result IParentalControlServiceFactory::CreateServiceWithoutInitialize( - Out> out_service, ClientProcessId process_id) { - LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid); - *out_service = std::make_shared( - system, capability, system.ResolveCallerProgramId(*process_id)); - R_SUCCEED(); -} - -} // namespace Service::PCTL diff --git a/src/core/hle/service/pctl/parental_control_service_factory.h b/src/core/hle/service/pctl/parental_control_service_factory.h deleted file mode 100644 index 362988add1..0000000000 --- a/src/core/hle/service/pctl/parental_control_service_factory.h +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/pctl/pctl_types.h" -#include "core/hle/service/service.h" - -namespace Service::PCTL { - -class IParentalControlService; - -class IParentalControlServiceFactory : public ServiceFramework { -public: - explicit IParentalControlServiceFactory(Core::System& system_, const char* name_, - Capability capability_); - ~IParentalControlServiceFactory() override; - - Result CreateService(Out> out_service, - ClientProcessId process_id); - Result CreateServiceWithoutInitialize(Out> out_service, - ClientProcessId process_id); - -private: - Capability capability{}; -}; - -void LoopProcess(Core::System& system); - -} // namespace Service::PCTL diff --git a/src/core/hle/service/pctl/pctl.cpp b/src/core/hle/service/pctl/pctl.cpp index d92dbe2169..4f0fbbe702 100644 --- a/src/core/hle/service/pctl/pctl.cpp +++ b/src/core/hle/service/pctl/pctl.cpp @@ -1,27 +1,639 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "core/hle/service/pctl/parental_control_service_factory.h" +#include "common/common_funcs.h" +#include "core/file_sys/control_metadata.h" +#include "core/file_sys/patch_manager.h" +#include "core/hle/service/cmif_types.h" #include "core/hle/service/pctl/pctl.h" #include "core/hle/service/server_manager.h" +#include "core/hle/service/service.h" +#include "core/hle/service/cmif_serialization.h" namespace Service::PCTL { +constexpr Result ResultNoFreeCommunication{ErrorModule::PCTL, 101}; +constexpr Result ResultStereoVisionRestricted{ErrorModule::PCTL, 104}; +constexpr Result ResultNoCapability{ErrorModule::PCTL, 131}; +constexpr Result ResultNoRestrictionEnabled{ErrorModule::PCTL, 181}; + +enum class Capability : u32 { + None = 0, + Application = 1 << 0, + SnsPost = 1 << 1, + Recovery = 1 << 6, + Status = 1 << 8, + StereoVision = 1 << 9, + System = 1 << 15, +}; +DECLARE_ENUM_FLAG_OPERATORS(Capability); + +struct ApplicationInfo { + u64 application_id{}; + std::array age_rating{}; + u32 parental_control_flag{}; + Capability capability{}; +}; +static_assert(sizeof(ApplicationInfo) == 0x30, "ApplicationInfo has incorrect size."); + +// This is nn::pctl::RestrictionSettings +struct RestrictionSettings { + u8 rating_age; + bool sns_post_restriction; + bool free_communication_restriction; +}; +static_assert(sizeof(RestrictionSettings) == 0x3, "RestrictionSettings has incorrect size."); + +// This is nn::pctl::PlayTimerSettingsOld +struct PlayTimerSettingsOld { + std::array settings; +}; +static_assert(sizeof(PlayTimerSettingsOld) == 0x34, "PlayTimerSettingsOld has incorrect size."); + +// This is nn::pctl::PlayTimerSettings +struct PlayTimerSettings { + std::array settings; //21.0.0+ now takes 0x44 +}; +static_assert(sizeof(PlayTimerSettings) == 0x44, "PlayTimerSettings has incorrect size."); + +enum class PlayTimerDisplayState : u8 { + TimesUp = 0, + BedtimeAlarm = 1, + RemainingTime = 2, + Unknown3 = 3, + Unknown4 = 4, + Unknown5 = 5, + TimerDisabled = 6, + NotConfigured = 7, +}; + +// This is nn::pctl::PlayTimerRemainingTimeDisplayInfo +struct PlayTimerRemainingTimeDisplayInfo { + PlayTimerDisplayState state; + INSERT_PADDING_BYTES(0x7); + u64 unknown_08; + u64 remaining_time; +}; +static_assert(sizeof(PlayTimerRemainingTimeDisplayInfo) == 0x18, "PlayTimerRemainingTimeDisplayInfo has incorrect size."); + +class IParentalControlService final : public ServiceFramework { +public: + explicit IParentalControlService(Core::System& system_, Capability capability_, + u64 program_id_) + : ServiceFramework{system_, "IParentalControlService"}, capability{capability_}, + program_id{program_id_}, + service_context{system_, "IParentalControlService"}, synchronization_event{service_context}, + unlinked_event{service_context}, request_suspension_event{service_context} { + } + + ~IParentalControlService() override = default; + + bool CheckFreeCommunicationPermissionImpl() const { + if (states.temporary_unlocked) { + return true; + } + if ((states.application_info.parental_control_flag & 1) == 0) { + return true; + } + if (pin_code[0] == '\0') { + return true; + } + if (!settings.is_free_communication_default_on) { + return true; + } + // TODO(ogniK): Check for blacklisted/exempted applications. Return false can happen here + // but as we don't have multiproceses support yet, we can just assume our application is + // valid for the time being + return true; + } + + bool ConfirmStereoVisionPermissionImpl() const { + if (states.temporary_unlocked) { + return true; + } + if (pin_code[0] == '\0') { + return true; + } + if (!settings.is_stero_vision_restricted) { + return false; + } + return true; + } + + void SetStereoVisionRestrictionImpl(bool is_restricted) { + if (settings.disabled) { + return; + } + + if (pin_code[0] == '\0') { + return; + } + settings.is_stero_vision_restricted = is_restricted; + } + + Result Initialize() { + LOG_DEBUG(Service_PCTL, "called"); + + if (False(capability & (Capability::Application | Capability::System))) { + LOG_ERROR(Service_PCTL, "Invalid capability! capability={:X}", capability); + R_THROW(PCTL::ResultNoCapability); + } + + // TODO(ogniK): Recovery flag initialization for pctl:r + + if (program_id != 0) { + const FileSys::PatchManager pm{program_id, system.GetFileSystemController(), + system.GetContentProvider()}; + const auto control = pm.GetControlMetadata(); + if (control.first) { + states.tid_from_event = 0; + states.launch_time_valid = false; + states.is_suspended = false; + states.free_communication = false; + states.stereo_vision = false; + states.application_info = ApplicationInfo{ + .application_id = program_id, + .age_rating = control.first->GetRatingAge(), + .parental_control_flag = control.first->GetParentalControlFlag(), + .capability = capability, + }; + + if (False(capability & (Capability::System | Capability::Recovery))) { + // TODO(ogniK): Signal application launch event + } + } + } + + R_SUCCEED(); + } + + Result CheckFreeCommunicationPermission() { + LOG_DEBUG(Service_PCTL, "called"); + + if (!CheckFreeCommunicationPermissionImpl()) { + R_THROW(PCTL::ResultNoFreeCommunication); + } else { + states.free_communication = true; + R_SUCCEED(); + } + } + + Result ConfirmLaunchApplicationPermission( + InBuffer restriction_bitset, u64 nacp_flag, u64 application_id) { + LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag, + application_id); + R_SUCCEED(); + } + + Result ConfirmResumeApplicationPermission( + InBuffer restriction_bitset, u64 nacp_flag, u64 application_id) { + LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag, + application_id); + R_SUCCEED(); + } + + Result ConfirmSnsPostPermission() { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + R_THROW(PCTL::ResultNoFreeCommunication); + } + + Result ConfirmSystemSettingsPermission() { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + R_SUCCEED(); + } + + Result IsRestrictionTemporaryUnlocked( + Out out_is_temporary_unlocked) { + *out_is_temporary_unlocked = false; + LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}", + *out_is_temporary_unlocked); + R_SUCCEED(); + } + + Result IsRestrictedSystemSettingsEntered( + Out out_is_restricted_system_settings_entered) { + *out_is_restricted_system_settings_entered = false; + LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}", + *out_is_restricted_system_settings_entered); + R_SUCCEED(); + } + + Result ConfirmStereoVisionPermission() { + LOG_DEBUG(Service_PCTL, "called"); + states.stereo_vision = true; + R_SUCCEED(); + } + + Result EndFreeCommunication() { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + R_SUCCEED(); + } + + Result IsFreeCommunicationAvailable() { + LOG_DEBUG(Service_PCTL, "(STUBBED) called"); + + if (!CheckFreeCommunicationPermissionImpl()) { + R_THROW(PCTL::ResultNoFreeCommunication); + } else { + R_SUCCEED(); + } + } + + Result IsRestrictionEnabled(Out out_restriction_enabled) { + LOG_DEBUG(Service_PCTL, "called"); + + if (False(capability & (Capability::Status | Capability::Recovery))) { + LOG_ERROR(Service_PCTL, "Application does not have Status or Recovery capabilities!"); + *out_restriction_enabled = false; + R_THROW(PCTL::ResultNoCapability); + } + + *out_restriction_enabled = pin_code[0] != '\0'; + R_SUCCEED(); + } + + Result GetSafetyLevel(Out out_safety_level) { + *out_safety_level = 0; + LOG_WARNING(Service_PCTL, "(STUBBED) called, safety_level={}", *out_safety_level); + R_SUCCEED(); + } + + Result GetCurrentSettings(Out out_settings) { + LOG_INFO(Service_PCTL, "called"); + *out_settings = restriction_settings; + R_SUCCEED(); + } + + Result GetFreeCommunicationApplicationListCount(Out out_count) { + *out_count = 4; + LOG_WARNING(Service_PCTL, "(STUBBED) called, count={}", *out_count); + R_SUCCEED(); + } + + Result ConfirmStereoVisionRestrictionConfigurable() { + LOG_DEBUG(Service_PCTL, "called"); + + if (False(capability & Capability::StereoVision)) { + LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); + R_THROW(PCTL::ResultNoCapability); + } + + if (pin_code[0] == '\0') { + R_THROW(PCTL::ResultNoRestrictionEnabled); + } + + R_SUCCEED(); + } + + Result IsStereoVisionPermitted(Out out_is_permitted) { + LOG_DEBUG(Service_PCTL, "called"); + + if (!ConfirmStereoVisionPermissionImpl()) { + *out_is_permitted = false; + R_THROW(PCTL::ResultStereoVisionRestricted); + } else { + *out_is_permitted = true; + R_SUCCEED(); + } + } + + Result GetPinCodeLength(Out out_length) { + *out_length = 0; + LOG_WARNING(Service_PCTL, "(STUBBED) called, length={}", *out_length); + R_SUCCEED(); + } + + Result IsPairingActive(Out out_is_pairing_active) { + *out_is_pairing_active = false; + LOG_WARNING(Service_PCTL, "(STUBBED) called, is_pairing_active={}", *out_is_pairing_active); + R_SUCCEED(); + } + + Result GetSynchronizationEvent( + OutCopyHandle out_event) { + LOG_INFO(Service_PCTL, "called"); + *out_event = synchronization_event.GetHandle(); + R_SUCCEED(); + } + + Result StartPlayTimer() { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + R_SUCCEED(); + } + + Result StopPlayTimer() { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + R_SUCCEED(); + } + + Result IsPlayTimerEnabled(Out out_is_play_timer_enabled) { + *out_is_play_timer_enabled = false; + LOG_WARNING(Service_PCTL, "(STUBBED) called, enabled={}", *out_is_play_timer_enabled); + R_SUCCEED(); + } + + Result GetPlayTimerRemainingTime(Out out_remaining_time) { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + *out_remaining_time = std::numeric_limits::max(); + R_SUCCEED(); + } + + Result IsRestrictedByPlayTimer(Out out_is_restricted_by_play_timer) { + *out_is_restricted_by_play_timer = false; + LOG_WARNING(Service_PCTL, "(STUBBED) called, restricted={}", *out_is_restricted_by_play_timer); + R_SUCCEED(); + } + + Result GetPlayTimerSettingsOld( + Out out_play_timer_settings) { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + *out_play_timer_settings = {}; + R_SUCCEED(); + } + + Result GetPlayTimerSettings(Out out_play_timer_settings) { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + *out_play_timer_settings = raw_play_timer_settings; + R_SUCCEED(); + } + + Result SetPlayTimerSettings(PlayTimerSettings play_timer_settings) { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + raw_play_timer_settings = play_timer_settings; + R_SUCCEED(); + } + + Result GetPlayTimerEventToRequestSuspension( + OutCopyHandle out_event) { + LOG_INFO(Service_PCTL, "called"); + *out_event = request_suspension_event.GetHandle(); + R_SUCCEED(); + } + + Result IsPlayTimerAlarmDisabled(Out out_play_timer_alarm_disabled) { + *out_play_timer_alarm_disabled = false; + LOG_INFO(Service_PCTL, "called, is_play_timer_alarm_disabled={}", + *out_play_timer_alarm_disabled); + R_SUCCEED(); + } + + Result GetPlayTimerRemainingTimeDisplayInfo(Out out_display_info) { + LOG_DEBUG(Service_PCTL, "called"); + *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; + R_SUCCEED(); + } + + Result Unknown1460(u8 in_unk, Out out_display_info) { + LOG_DEBUG(Service_PCTL, "called, in_unk={}", in_unk); + *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; + R_SUCCEED(); + } + + Result GetUnlinkedEvent(OutCopyHandle out_event) { + LOG_INFO(Service_PCTL, "called"); + *out_event = unlinked_event.GetHandle(); + R_SUCCEED(); + } + + Result GetStereoVisionRestriction( + Out out_stereo_vision_restriction) { + LOG_DEBUG(Service_PCTL, "called"); + + if (False(capability & Capability::StereoVision)) { + LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); + *out_stereo_vision_restriction = false; + R_THROW(PCTL::ResultNoCapability); + } + + *out_stereo_vision_restriction = settings.is_stero_vision_restricted; + R_SUCCEED(); + } + + Result SetStereoVisionRestriction(bool stereo_vision_restriction) { + LOG_DEBUG(Service_PCTL, "called, can_use={}", stereo_vision_restriction); + + if (False(capability & Capability::StereoVision)) { + LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); + R_THROW(PCTL::ResultNoCapability); + } + + SetStereoVisionRestrictionImpl(stereo_vision_restriction); + R_SUCCEED(); + } + + Result ResetConfirmedStereoVisionPermission() { + LOG_DEBUG(Service_PCTL, "called"); + + states.stereo_vision = false; + + R_SUCCEED(); + } + + struct States { + u64 current_tid{}; + ApplicationInfo application_info{}; + u64 tid_from_event{}; + bool launch_time_valid{}; + bool is_suspended{}; + bool temporary_unlocked{}; + bool free_communication{}; + bool stereo_vision{}; + }; + + struct ParentalControlSettings { + bool is_stero_vision_restricted{}; + bool is_free_communication_default_on{}; + bool disabled{}; + }; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, D<&IParentalControlService::Initialize>, "Initialize"}, + FunctionInfo{1001, D<&IParentalControlService::CheckFreeCommunicationPermission>, "CheckFreeCommunicationPermission"}, + FunctionInfo{1002, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"}, + FunctionInfo{1003, D<&IParentalControlService::ConfirmResumeApplicationPermission>, "ConfirmResumeApplicationPermission"}, + FunctionInfo{1004, D<&IParentalControlService::ConfirmSnsPostPermission>, "ConfirmSnsPostPermission"}, + FunctionInfo{1005, D<&IParentalControlService::ConfirmSystemSettingsPermission>, "ConfirmSystemSettingsPermission"}, + FunctionInfo{1006, D<&IParentalControlService::IsRestrictionTemporaryUnlocked>, "IsRestrictionTemporaryUnlocked"}, + FunctionInfo{1007, nullptr, "RevertRestrictionTemporaryUnlocked"}, + FunctionInfo{1008, nullptr, "EnterRestrictedSystemSettings"}, + FunctionInfo{1009, nullptr, "LeaveRestrictedSystemSettings"}, + FunctionInfo{1010, D<&IParentalControlService::IsRestrictedSystemSettingsEntered>, "IsRestrictedSystemSettingsEntered"}, + FunctionInfo{1011, nullptr, "RevertRestrictedSystemSettingsEntered"}, + FunctionInfo{1012, nullptr, "GetRestrictedFeatures"}, + FunctionInfo{1013, D<&IParentalControlService::ConfirmStereoVisionPermission>, "ConfirmStereoVisionPermission"}, + FunctionInfo{1014, nullptr, "ConfirmPlayableApplicationVideoOld"}, + FunctionInfo{1015, nullptr, "ConfirmPlayableApplicationVideo"}, + FunctionInfo{1016, nullptr, "ConfirmShowNewsPermission"}, + FunctionInfo{1017, D<&IParentalControlService::EndFreeCommunication>, "EndFreeCommunication"}, + FunctionInfo{1018, D<&IParentalControlService::IsFreeCommunicationAvailable>, "IsFreeCommunicationAvailable"}, + FunctionInfo{1019, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"}, + FunctionInfo{1020, nullptr, "ConfirmLaunchSharedApplicationPermission", MakeVersionGate({20,0,0})}, + FunctionInfo{1021, nullptr, "TryBeginFreeCommunicationForStreamPlay", MakeVersionGate({21,0,0})}, + FunctionInfo{1022, nullptr, "EndFreeCommunicationForStreamPlay", MakeVersionGate({21,0,0})}, + FunctionInfo{1031, D<&IParentalControlService::IsRestrictionEnabled>, "IsRestrictionEnabled"}, + FunctionInfo{1032, D<&IParentalControlService::GetSafetyLevel>, "GetSafetyLevel"}, + FunctionInfo{1033, nullptr, "SetSafetyLevel"}, + FunctionInfo{1034, nullptr, "GetSafetyLevelSettings"}, + FunctionInfo{1035, D<&IParentalControlService::GetCurrentSettings>, "GetCurrentSettings"}, + FunctionInfo{1036, nullptr, "SetCustomSafetyLevelSettings"}, + FunctionInfo{1037, nullptr, "GetDefaultRatingOrganization"}, + FunctionInfo{1038, nullptr, "SetDefaultRatingOrganization"}, + FunctionInfo{1039, D<&IParentalControlService::GetFreeCommunicationApplicationListCount>, "GetFreeCommunicationApplicationListCount"}, + FunctionInfo{1042, nullptr, "AddToFreeCommunicationApplicationList"}, + FunctionInfo{1043, nullptr, "DeleteSettings"}, + FunctionInfo{1044, nullptr, "GetFreeCommunicationApplicationList"}, + FunctionInfo{1045, nullptr, "UpdateFreeCommunicationApplicationList"}, + FunctionInfo{1046, nullptr, "DisableFeaturesForReset"}, + FunctionInfo{1047, nullptr, "NotifyApplicationDownloadStarted"}, + FunctionInfo{1048, nullptr, "NotifyNetworkProfileCreated"}, + FunctionInfo{1049, nullptr, "ResetFreeCommunicationApplicationList"}, + FunctionInfo{1050, nullptr, "AddToFreeCommunicationApplicationList", MakeVersionGate({20,0,0})}, + FunctionInfo{1051, nullptr, "NotifyApplicationDownloadStarted", MakeVersionGate({20,0,0})}, + FunctionInfo{1061, D<&IParentalControlService::ConfirmStereoVisionRestrictionConfigurable>, "ConfirmStereoVisionRestrictionConfigurable"}, + FunctionInfo{1062, D<&IParentalControlService::GetStereoVisionRestriction>, "GetStereoVisionRestriction"}, + FunctionInfo{1063, D<&IParentalControlService::SetStereoVisionRestriction>, "SetStereoVisionRestriction"}, + FunctionInfo{1064, D<&IParentalControlService::ResetConfirmedStereoVisionPermission>, "ResetConfirmedStereoVisionPermission"}, + FunctionInfo{1065, D<&IParentalControlService::IsStereoVisionPermitted>, "IsStereoVisionPermitted"}, + FunctionInfo{1201, nullptr, "UnlockRestrictionTemporarily"}, + FunctionInfo{1202, nullptr, "UnlockSystemSettingsRestriction"}, + FunctionInfo{1203, nullptr, "SetPinCode"}, + FunctionInfo{1204, nullptr, "GenerateInquiryCode"}, + FunctionInfo{1205, nullptr, "CheckMasterKey"}, + FunctionInfo{1206, D<&IParentalControlService::GetPinCodeLength>, "GetPinCodeLength"}, + FunctionInfo{1207, nullptr, "GetPinCodeChangedEvent"}, + FunctionInfo{1208, nullptr, "GetPinCode"}, + FunctionInfo{1403, D<&IParentalControlService::IsPairingActive>, "IsPairingActive"}, + FunctionInfo{1406, nullptr, "GetSettingsLastUpdated"}, + FunctionInfo{1411, nullptr, "GetPairingAccountInfo"}, + FunctionInfo{1421, nullptr, "GetAccountNickname"}, + FunctionInfo{1424, nullptr, "GetAccountState"}, + FunctionInfo{1425, nullptr, "RequestPostEvents"}, + FunctionInfo{1426, nullptr, "GetPostEventInterval"}, + FunctionInfo{1427, nullptr, "SetPostEventInterval"}, + FunctionInfo{1432, D<&IParentalControlService::GetSynchronizationEvent>, "GetSynchronizationEvent"}, + FunctionInfo{1451, D<&IParentalControlService::StartPlayTimer>, "StartPlayTimer"}, + FunctionInfo{1452, D<&IParentalControlService::StopPlayTimer>, "StopPlayTimer"}, + FunctionInfo{1453, D<&IParentalControlService::IsPlayTimerEnabled>, "IsPlayTimerEnabled"}, + FunctionInfo{1454, D<&IParentalControlService::GetPlayTimerRemainingTime>, "GetPlayTimerRemainingTime"}, + FunctionInfo{1455, D<&IParentalControlService::IsRestrictedByPlayTimer>, "IsRestrictedByPlayTimer"}, + FunctionInfo{1456, D<&IParentalControlService::GetPlayTimerSettingsOld>, "GetPlayTimerSettingsOld"}, + FunctionInfo{1457, D<&IParentalControlService::GetPlayTimerEventToRequestSuspension>, "GetPlayTimerEventToRequestSuspension"}, + FunctionInfo{1458, D<&IParentalControlService::IsPlayTimerAlarmDisabled>, "IsPlayTimerAlarmDisabled"}, + FunctionInfo{1459, D<&IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo>, "GetPlayTimerRemainingTimeDisplayInfo"}, + FunctionInfo{1460, D<&IParentalControlService::Unknown1460>, "Unknown1460"}, + FunctionInfo{1471, nullptr, "NotifyWrongPinCodeInputManyTimes"}, + FunctionInfo{1472, nullptr, "CancelNetworkRequest"}, + FunctionInfo{1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"}, + FunctionInfo{1474, nullptr, "ClearUnlinkedEvent"}, + FunctionInfo{1475, nullptr, "GetExtendedPlayTimerEvent", MakeVersionGate({18,0,0})}, + FunctionInfo{1601, nullptr, "DisableAllFeatures"}, + FunctionInfo{1602, nullptr, "PostEnableAllFeatures"}, + FunctionInfo{1603, nullptr, "IsAllFeaturesDisabled"}, + FunctionInfo{1901, nullptr, "DeleteFromFreeCommunicationApplicationListForDebug"}, + FunctionInfo{1902, nullptr, "ClearFreeCommunicationApplicationListForDebug"}, + FunctionInfo{1903, nullptr, "GetExemptApplicationListCountForDebug"}, + FunctionInfo{1904, nullptr, "GetExemptApplicationListForDebug"}, + FunctionInfo{1905, nullptr, "UpdateExemptApplicationListForDebug"}, + FunctionInfo{1906, nullptr, "AddToExemptApplicationListForDebug"}, + FunctionInfo{1907, nullptr, "DeleteFromExemptApplicationListForDebug"}, + FunctionInfo{1908, nullptr, "ClearExemptApplicationListForDebug"}, + FunctionInfo{1941, nullptr, "DeletePairing"}, + FunctionInfo{1951, nullptr, "SetPlayTimerSettingsForDebug"}, + FunctionInfo{1952, nullptr, "GetPlayTimerSpentTimeForTest"}, + FunctionInfo{1953, nullptr, "SetPlayTimerAlarmDisabledForDebug"}, + FunctionInfo{1954, nullptr, "IsBedtimeAlarmEnabled", MakeVersionGate({18,0,0})}, + FunctionInfo{1955, nullptr, "GetBedtimeAlarmTime", MakeVersionGate({18,0,0})}, + FunctionInfo{1956, nullptr, "GetBedtimeAlarmTimeHour", MakeVersionGate({18,0,0})}, + FunctionInfo{1957, nullptr, "GetBedtimeAlarmTimeMinute", MakeVersionGate({18,0,0})}, + FunctionInfo{2001, nullptr, "RequestPairingAsync"}, + FunctionInfo{2002, nullptr, "FinishRequestPairing"}, + FunctionInfo{2003, nullptr, "AuthorizePairingAsync"}, + FunctionInfo{2004, nullptr, "FinishAuthorizePairing"}, + FunctionInfo{2005, nullptr, "RetrievePairingInfoAsync"}, + FunctionInfo{2006, nullptr, "FinishRetrievePairingInfo"}, + FunctionInfo{2007, nullptr, "UnlinkPairingAsync"}, + FunctionInfo{2008, nullptr, "FinishUnlinkPairing"}, + FunctionInfo{2009, nullptr, "GetAccountMiiImageAsync"}, + FunctionInfo{2010, nullptr, "FinishGetAccountMiiImage"}, + FunctionInfo{2011, nullptr, "GetAccountMiiImageContentTypeAsync"}, + FunctionInfo{2012, nullptr, "FinishGetAccountMiiImageContentType"}, + FunctionInfo{2013, nullptr, "SynchronizeParentalControlSettingsAsync"}, + FunctionInfo{2014, nullptr, "FinishSynchronizeParentalControlSettings"}, + FunctionInfo{2015, nullptr, "FinishSynchronizeParentalControlSettingsWithLastUpdated"}, + FunctionInfo{2016, nullptr, "RequestUpdateExemptionListAsync", MakeVersionGate({5,0,0})}, + FunctionInfo{145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings", MakeVersionGate({18,0,0})}, + FunctionInfo{2017, nullptr, "AuthorizePairingAsync", MakeVersionGate({19,0,0})}, + FunctionInfo{2019, nullptr, "RequestUpdateDeviceUsersBackground", MakeVersionGate({19,0,0})}, + FunctionInfo{2021, nullptr, "RequestCopyPairingAsync", MakeVersionGate({20,0,0})}, + FunctionInfo{2022, nullptr, "FinishRequestCopyPairing", MakeVersionGate({20,0,0})}, + FunctionInfo{2023, nullptr, "IsFromPairingActiveDevice", MakeVersionGate({20,0,0})}, + FunctionInfo{2024, nullptr, "RollbackCopyPairing", MakeVersionGate({21,0,0})}, + FunctionInfo{3001, nullptr, "GetErrorContextChangedEvent", MakeVersionGate({20,0,0})}, + FunctionInfo{145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings", MakeVersionGate({18,0,0})}, + FunctionInfo{195101, D<&IParentalControlService::SetPlayTimerSettings>, "SetPlayTimerSettingsForDebug", MakeVersionGate({18,0,0})} + ); + States states{}; + ParentalControlSettings settings{}; + RestrictionSettings restriction_settings{}; + std::array pin_code{}; + Capability capability{}; + u64 program_id{}; + // TODO: this is raw + PlayTimerSettings raw_play_timer_settings{}; + + KernelHelpers::ServiceContext service_context; + Event synchronization_event; + Event unlinked_event; + Event request_suspension_event; +}; + +class IParentalControlServiceFactory : public ServiceFramework { +public: + explicit IParentalControlServiceFactory(Core::System& system_, const char* name_, Capability capability_) + : ServiceFramework{system_, name_}, capability{capability_} + {} + + ~IParentalControlServiceFactory() override = default; + + Result CreateService(Out> out_service, ClientProcessId process_id) { + LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid); + *out_service = std::make_shared( + system, capability, system.ResolveCallerProgramId(*process_id)); + R_SUCCEED(); + } + + Result CreateServiceWithoutInitialize(Out> out_service, ClientProcessId process_id) { + LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid); + *out_service = std::make_shared( + system, capability, system.ResolveCallerProgramId(*process_id)); + R_SUCCEED(); + } + +private: + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IParentalControlServiceFactory::CreateService>, "CreateService"}, + FunctionInfo{1, D<&IParentalControlServiceFactory::CreateServiceWithoutInitialize>, "CreateServiceWithoutInitialize"} + ); + Capability capability{}; +}; + void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("pctl", - std::make_shared( - system, "pctl", - Capability::Application | Capability::SnsPost | - Capability::Status | Capability::StereoVision)); + server_manager->RegisterNamedService("pctl", std::make_shared(system, "pctl", Capability::Application | Capability::SnsPost | Capability::Status | Capability::StereoVision)); // TODO(ogniK): Implement remaining capabilities - server_manager->RegisterNamedService("pctl:a", std::make_shared( - system, "pctl:a", Capability::None)); - server_manager->RegisterNamedService("pctl:r", std::make_shared( - system, "pctl:r", Capability::None)); - server_manager->RegisterNamedService("pctl:s", std::make_shared( - system, "pctl:s", Capability::None)); + server_manager->RegisterNamedService("pctl:a", std::make_shared(system, "pctl:a", Capability::None)); + server_manager->RegisterNamedService("pctl:r", std::make_shared(system, "pctl:r", Capability::None)); + server_manager->RegisterNamedService("pctl:s", std::make_shared(system, "pctl:s", Capability::None)); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/pctl/pctl_results.h b/src/core/hle/service/pctl/pctl_results.h deleted file mode 100644 index 1fc54727b7..0000000000 --- a/src/core/hle/service/pctl/pctl_results.h +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/result.h" - -namespace Service::PCTL { - -constexpr Result ResultNoFreeCommunication{ErrorModule::PCTL, 101}; -constexpr Result ResultStereoVisionRestricted{ErrorModule::PCTL, 104}; -constexpr Result ResultNoCapability{ErrorModule::PCTL, 131}; -constexpr Result ResultNoRestrictionEnabled{ErrorModule::PCTL, 181}; - -} // namespace Service::PCTL diff --git a/src/core/hle/service/pctl/pctl_types.h b/src/core/hle/service/pctl/pctl_types.h deleted file mode 100644 index 3a5a19099d..0000000000 --- a/src/core/hle/service/pctl/pctl_types.h +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "common/common_funcs.h" - -namespace Service::PCTL { - -enum class Capability : u32 { - None = 0, - Application = 1 << 0, - SnsPost = 1 << 1, - Recovery = 1 << 6, - Status = 1 << 8, - StereoVision = 1 << 9, - System = 1 << 15, -}; -DECLARE_ENUM_FLAG_OPERATORS(Capability); - -struct ApplicationInfo { - u64 application_id{}; - std::array age_rating{}; - u32 parental_control_flag{}; - Capability capability{}; -}; -static_assert(sizeof(ApplicationInfo) == 0x30, "ApplicationInfo has incorrect size."); - -// This is nn::pctl::RestrictionSettings -struct RestrictionSettings { - u8 rating_age; - bool sns_post_restriction; - bool free_communication_restriction; -}; -static_assert(sizeof(RestrictionSettings) == 0x3, "RestrictionSettings has incorrect size."); - -// This is nn::pctl::PlayTimerSettingsOld -struct PlayTimerSettingsOld { - std::array settings; -}; -static_assert(sizeof(PlayTimerSettingsOld) == 0x34, "PlayTimerSettingsOld has incorrect size."); - -// This is nn::pctl::PlayTimerSettings -struct PlayTimerSettings { - std::array settings; //21.0.0+ now takes 0x44 -}; -static_assert(sizeof(PlayTimerSettings) == 0x44, "PlayTimerSettings has incorrect size."); - -enum class PlayTimerDisplayState : u8 { - TimesUp = 0, - BedtimeAlarm = 1, - RemainingTime = 2, - Unknown3 = 3, - Unknown4 = 4, - Unknown5 = 5, - TimerDisabled = 6, - NotConfigured = 7, -}; - -// This is nn::pctl::PlayTimerRemainingTimeDisplayInfo -struct PlayTimerRemainingTimeDisplayInfo { - PlayTimerDisplayState state; - INSERT_PADDING_BYTES(0x7); - u64 unknown_08; - u64 remaining_time; -}; -static_assert(sizeof(PlayTimerRemainingTimeDisplayInfo) == 0x18, - "PlayTimerRemainingTimeDisplayInfo has incorrect size."); - -} // namespace Service::PCTL diff --git a/src/core/hle/service/pcv/pcv.cpp b/src/core/hle/service/pcv/pcv.cpp index 1b314f3518..bb3d748527 100644 --- a/src/core/hle/service/pcv/pcv.cpp +++ b/src/core/hle/service/pcv/pcv.cpp @@ -15,91 +15,76 @@ namespace Service::PCV { class PCV final : public ServiceFramework { public: - explicit PCV(Core::System& system_) : ServiceFramework{system_, "pcv"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "SetPowerEnabled"}, - {1, nullptr, "SetClockEnabled"}, - {2, nullptr, "SetClockRate"}, - {3, nullptr, "GetClockRate"}, - {4, nullptr, "GetState"}, - {5, nullptr, "GetPossibleClockRates"}, - {6, nullptr, "SetMinVClockRate"}, - {7, nullptr, "SetReset"}, - {8, nullptr, "SetVoltageEnabled"}, - {9, nullptr, "GetVoltageEnabled"}, - {10, nullptr, "GetVoltageRange"}, - {11, nullptr, "SetVoltageValue"}, - {12, nullptr, "GetVoltageValue"}, - {13, nullptr, "GetTemperatureThresholds"}, - {14, nullptr, "SetTemperature"}, - {15, nullptr, "Initialize"}, - {16, nullptr, "IsInitialized"}, - {17, nullptr, "Finalize"}, - {18, nullptr, "PowerOn"}, - {19, nullptr, "PowerOff"}, - {20, nullptr, "ChangeVoltage"}, - {21, nullptr, "GetPowerClockInfoEvent"}, - {22, nullptr, "GetOscillatorClock"}, - {23, nullptr, "GetDvfsTable"}, - {24, nullptr, "GetModuleStateTable"}, - {25, nullptr, "GetPowerDomainStateTable"}, - {26, nullptr, "GetFuseInfo"}, - {27, nullptr, "GetDramId"}, - {28, nullptr, "IsPoweredOn"}, - {29, nullptr, "GetVoltage"}, - }; - // clang-format on + explicit PCV(Core::System& system_) : ServiceFramework{system_, "pcv"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "SetPowerEnabled"}, + FunctionInfo{1, nullptr, "SetClockEnabled"}, + FunctionInfo{2, nullptr, "SetClockRate"}, + FunctionInfo{3, nullptr, "GetClockRate"}, + FunctionInfo{4, nullptr, "GetState"}, + FunctionInfo{5, nullptr, "GetPossibleClockRates"}, + FunctionInfo{6, nullptr, "SetMinVClockRate"}, + FunctionInfo{7, nullptr, "SetReset"}, + FunctionInfo{8, nullptr, "SetVoltageEnabled"}, + FunctionInfo{9, nullptr, "GetVoltageEnabled"}, + FunctionInfo{10, nullptr, "GetVoltageRange"}, + FunctionInfo{11, nullptr, "SetVoltageValue"}, + FunctionInfo{12, nullptr, "GetVoltageValue"}, + FunctionInfo{13, nullptr, "GetTemperatureThresholds"}, + FunctionInfo{14, nullptr, "SetTemperature"}, + FunctionInfo{15, nullptr, "Initialize"}, + FunctionInfo{16, nullptr, "IsInitialized"}, + FunctionInfo{17, nullptr, "Finalize"}, + FunctionInfo{18, nullptr, "PowerOn"}, + FunctionInfo{19, nullptr, "PowerOff"}, + FunctionInfo{20, nullptr, "ChangeVoltage"}, + FunctionInfo{21, nullptr, "GetPowerClockInfoEvent"}, + FunctionInfo{22, nullptr, "GetOscillatorClock"}, + FunctionInfo{23, nullptr, "GetDvfsTable"}, + FunctionInfo{24, nullptr, "GetModuleStateTable"}, + FunctionInfo{25, nullptr, "GetPowerDomainStateTable"}, + FunctionInfo{26, nullptr, "GetFuseInfo"}, + FunctionInfo{27, nullptr, "GetDramId"}, + FunctionInfo{28, nullptr, "IsPoweredOn"}, + FunctionInfo{29, nullptr, "GetVoltage"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class PCV_ARB final : public ServiceFramework { public: - explicit PCV_ARB(Core::System& system_) : ServiceFramework{system_, "pcv:arb"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "ReleaseControl"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit PCV_ARB(Core::System& system_) : ServiceFramework{system_, "pcv:arb"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "ReleaseControl"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class PCV_IMM final : public ServiceFramework { public: - explicit PCV_IMM(Core::System& system_) : ServiceFramework{system_, "pcv:imm"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "SetClockRate"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit PCV_IMM(Core::System& system_) : ServiceFramework{system_, "pcv:imm"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "SetClockRate"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IClkrstSession final : public ServiceFramework { public: explicit IClkrstSession(Core::System& system_, DeviceCode device_code_) - : ServiceFramework{system_, "IClkrstSession"}, device_code(device_code_) { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "SetClockEnabled"}, - {1, nullptr, "SetClockDisabled"}, - {2, nullptr, "SetResetAsserted"}, - {3, nullptr, "SetResetDeasserted"}, - {4, nullptr, "SetPowerEnabled"}, - {5, nullptr, "SetPowerDisabled"}, - {6, nullptr, "GetState"}, - {7, &IClkrstSession::SetClockRate, "SetClockRate"}, - {8, &IClkrstSession::GetClockRate, "GetClockRate"}, - {9, nullptr, "SetMinVClockRate"}, - {10, nullptr, "GetPossibleClockRates"}, - {11, nullptr, "GetDvfsTable"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "IClkrstSession"}, device_code(device_code_) {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -120,25 +105,30 @@ private: rb.Push(clock_rate); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "SetClockEnabled"}, + FunctionInfo{1, nullptr, "SetClockDisabled"}, + FunctionInfo{2, nullptr, "SetResetAsserted"}, + FunctionInfo{3, nullptr, "SetResetDeasserted"}, + FunctionInfo{4, nullptr, "SetPowerEnabled"}, + FunctionInfo{5, nullptr, "SetPowerDisabled"}, + FunctionInfo{6, nullptr, "GetState"}, + FunctionInfo{7, &IClkrstSession::SetClockRate, "SetClockRate"}, + FunctionInfo{8, &IClkrstSession::GetClockRate, "GetClockRate"}, + FunctionInfo{9, nullptr, "SetMinVClockRate"}, + FunctionInfo{10, nullptr, "GetPossibleClockRates"}, + FunctionInfo{11, nullptr, "GetDvfsTable"} + ); DeviceCode device_code; u32 clock_rate{}; }; class CLKRST final : public ServiceFramework { public: - explicit CLKRST(Core::System& system_, const char* name) : ServiceFramework{system_, name} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &CLKRST::OpenSession, "OpenSession"}, - {1, nullptr, "GetTemperatureThresholds"}, - {2, nullptr, "SetTemperature"}, - {3, nullptr, "GetModuleStateTable"}, - {4, nullptr, "GetModuleStateTableEvent"}, - {5, nullptr, "GetModuleStateTableMaxCount"}, - }; - // clang-format on + explicit CLKRST(Core::System& system_, const char* name) : ServiceFramework{system_, name} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -153,18 +143,26 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system, device_code); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &CLKRST::OpenSession, "OpenSession"}, + FunctionInfo{1, nullptr, "GetTemperatureThresholds"}, + FunctionInfo{2, nullptr, "SetTemperature"}, + FunctionInfo{3, nullptr, "GetModuleStateTable"}, + FunctionInfo{4, nullptr, "GetModuleStateTableEvent"}, + FunctionInfo{5, nullptr, "GetModuleStateTableMaxCount"} + ); }; class CLKRST_A final : public ServiceFramework { public: - explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "ReleaseControl"}, - }; - // clang-format on + explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "ReleaseControl"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/pm/pm.cpp b/src/core/hle/service/pm/pm.cpp index ff7053b690..3d431c305f 100644 --- a/src/core/hle/service/pm/pm.cpp +++ b/src/core/hle/service/pm/pm.cpp @@ -47,13 +47,7 @@ void GetApplicationPidGeneric(Kernel::KernelCore& kernel, HLERequestContext& ctx class BootMode final : public ServiceFramework { public: - explicit BootMode(Core::System& system_) : ServiceFramework{system_, "pm:bm"} { - static const FunctionInfo functions[] = { - {0, &BootMode::GetBootMode, "GetBootMode"}, - {1, &BootMode::SetMaintenanceBoot, "SetMaintenanceBoot"}, - }; - RegisterHandlers(functions); - } + explicit BootMode(Core::System& system_) : ServiceFramework{system_, "pm:bm"} {} private: void GetBootMode(HLERequestContext& ctx) { @@ -73,28 +67,19 @@ private: rb.Push(ResultSuccess); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &BootMode::GetBootMode, "GetBootMode"}, + FunctionInfo{1, &BootMode::SetMaintenanceBoot, "SetMaintenanceBoot"} + ); SystemBootMode boot_mode = SystemBootMode::Normal; }; class DebugMonitor final : public ServiceFramework { public: - explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "pm:dmnt"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetJitDebugProcessIdList"}, - {1, nullptr, "StartProcess"}, - {2, &DebugMonitor::GetProcessId, "GetProcessId"}, - {3, nullptr, "HookToCreateProcess"}, - {4, &DebugMonitor::GetApplicationProcessId, "GetApplicationProcessId"}, - {5, nullptr, "HookToCreateApplicationProgress"}, - {6, nullptr, "ClearHook"}, - {65000, &DebugMonitor::AtmosphereGetProcessInfo, "AtmosphereGetProcessInfo"}, - {65001, nullptr, "AtmosphereGetCurrentLimitInfo"}, - }; - // clang-format on - - RegisterHandlers(functions); - } + explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "pm:dmnt"} {} private: void GetProcessId(HLERequestContext& ctx) { @@ -164,19 +149,26 @@ private: rb.PushRaw(program_location); rb.PushRaw(override_status); } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetJitDebugProcessIdList"}, + FunctionInfo{1, nullptr, "StartProcess"}, + FunctionInfo{2, &DebugMonitor::GetProcessId, "GetProcessId"}, + FunctionInfo{3, nullptr, "HookToCreateProcess"}, + FunctionInfo{4, &DebugMonitor::GetApplicationProcessId, "GetApplicationProcessId"}, + FunctionInfo{5, nullptr, "HookToCreateApplicationProgress"}, + FunctionInfo{6, nullptr, "ClearHook"}, + FunctionInfo{65000, &DebugMonitor::AtmosphereGetProcessInfo, "AtmosphereGetProcessInfo"}, + FunctionInfo{65001, nullptr, "AtmosphereGetCurrentLimitInfo"} + ); }; class Info final : public ServiceFramework { public: - explicit Info(Core::System& system_) : ServiceFramework{system_, "pm:info"} { - static const FunctionInfo functions[] = { - {0, &Info::GetProgramId, "GetProgramId"}, - {65000, &Info::AtmosphereGetProcessId, "AtmosphereGetProcessId"}, - {65001, nullptr, "AtmosphereHasLaunchedProgram"}, - {65002, nullptr, "AtmosphereGetProcessInfo"}, - }; - RegisterHandlers(functions); - } + explicit Info(Core::System& system_) : ServiceFramework{system_, "pm:info"} {} private: void GetProgramId(HLERequestContext& ctx) { @@ -218,27 +210,24 @@ private: rb.Push(ResultSuccess); rb.Push(process->GetProcessId()); } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &Info::GetProgramId, "GetProgramId"}, + FunctionInfo{65000, &Info::AtmosphereGetProcessId, "AtmosphereGetProcessId"}, + FunctionInfo{65001, nullptr, "AtmosphereHasLaunchedProgram"}, + FunctionInfo{65002, nullptr, "AtmosphereGetProcessInfo"} + ); }; class Shell final : public ServiceFramework { public: - explicit Shell(Core::System& system_) : ServiceFramework{system_, "pm:shell"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "LaunchProgram"}, - {1, nullptr, "TerminateProcess"}, - {2, nullptr, "TerminateProgram"}, - {3, nullptr, "GetProcessEventHandle"}, - {4, nullptr, "GetProcessEventInfo"}, - {5, nullptr, "NotifyBootFinished"}, - {6, &Shell::GetApplicationProcessIdForShell, "GetApplicationProcessIdForShell"}, - {7, nullptr, "BoostSystemMemoryResourceLimit"}, - {8, nullptr, "BoostApplicationThreadResourceLimit"}, - {9, nullptr, "GetBootFinishedEventHandle"}, - }; - // clang-format on + explicit Shell(Core::System& system_) : ServiceFramework{system_, "pm:shell"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -247,6 +236,19 @@ private: auto list = kernel.GetProcessList(); GetApplicationPidGeneric(system.Kernel(), ctx, list); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "LaunchProgram"}, + FunctionInfo{1, nullptr, "TerminateProcess"}, + FunctionInfo{2, nullptr, "TerminateProgram"}, + FunctionInfo{3, nullptr, "GetProcessEventHandle"}, + FunctionInfo{4, nullptr, "GetProcessEventInfo"}, + FunctionInfo{5, nullptr, "NotifyBootFinished"}, + FunctionInfo{6, &Shell::GetApplicationProcessIdForShell, "GetApplicationProcessIdForShell"}, + FunctionInfo{7, nullptr, "BoostSystemMemoryResourceLimit"}, + FunctionInfo{8, nullptr, "BoostApplicationThreadResourceLimit"}, + FunctionInfo{9, nullptr, "GetBootFinishedEventHandle"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp index e76c3ea93c..a199c41d2c 100644 --- a/src/core/hle/service/prepo/prepo.cpp +++ b/src/core/hle/service/prepo/prepo.cpp @@ -21,45 +21,10 @@ namespace Service::PlayReport { class PlayReport final : public ServiceFramework { public: - explicit PlayReport(const char* name, Core::System& system_) : ServiceFramework{system_, name} { - // clang-format off - static const FunctionInfo functions[] = { - {10100, &PlayReport::SaveReport, "SaveReportOld"}, - {10101, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld"}, - {10102, &PlayReport::SaveReport, "SaveReportOld2"}, - {10103, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld2"}, - {10104, &PlayReport::SaveReport, "SaveReportOld3"}, - {10105, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld3"}, - {10106, &PlayReport::SaveReport, "SaveReport"}, - {10107, &PlayReport::SaveReportWithUser, "SaveReportWithUser"}, - {10200, &PlayReport::RequestImmediateTransmission, "RequestImmediateTransmission"}, - {10300, &PlayReport::GetTransmissionStatus, "GetTransmissionStatus"}, - {10400, &PlayReport::GetSystemSessionId, "GetSystemSessionId"}, - {20100, &PlayReport::SaveSystemReportOld, "SaveSystemReport"}, - {20101, &PlayReport::SaveSystemReportWithUserOld, "SaveSystemReportWithUser"}, - {20102, &PlayReport::SaveSystemReport, "SaveSystemReport"}, - {20103, &PlayReport::SaveSystemReportWithUser, "SaveSystemReportWithUser"}, - {20200, nullptr, "SetOperationMode"}, - {30100, nullptr, "ClearStorage"}, - {30200, nullptr, "ClearStatistics"}, - {30300, nullptr, "GetStorageUsage"}, - {30400, nullptr, "GetStatistics"}, - {30401, nullptr, "GetThroughputHistory"}, - {30500, nullptr, "GetLastUploadError"}, - {30600, nullptr, "GetApplicationUploadSummary"}, - {40100, nullptr, "IsUserAgreementCheckEnabled"}, - {40101, nullptr, "SetUserAgreementCheckEnabled"}, - {50100, nullptr, "ReadAllApplicationReportFiles"}, - {90100, nullptr, "ReadAllReportFiles"}, - {90101, nullptr, "Unknown90101"}, - {90102, nullptr, "Unknown90102"}, - {90200, nullptr, "GetStatistics"}, - {90201, nullptr, "GetThroughputHistory"}, - {90300, nullptr, "GetLastUploadError"}, - }; - // clang-format on + explicit PlayReport(const char* name, Core::System& system_) : ServiceFramework{system_, name} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -214,21 +179,51 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{10100, &PlayReport::SaveReport, "SaveReportOld"}, + FunctionInfo{10101, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld"}, + FunctionInfo{10102, &PlayReport::SaveReport, "SaveReportOld2"}, + FunctionInfo{10103, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld2"}, + FunctionInfo{10104, &PlayReport::SaveReport, "SaveReportOld3"}, + FunctionInfo{10105, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld3"}, + FunctionInfo{10106, &PlayReport::SaveReport, "SaveReport"}, + FunctionInfo{10107, &PlayReport::SaveReportWithUser, "SaveReportWithUser"}, + FunctionInfo{10200, &PlayReport::RequestImmediateTransmission, "RequestImmediateTransmission"}, + FunctionInfo{10300, &PlayReport::GetTransmissionStatus, "GetTransmissionStatus"}, + FunctionInfo{10400, &PlayReport::GetSystemSessionId, "GetSystemSessionId"}, + FunctionInfo{20100, &PlayReport::SaveSystemReportOld, "SaveSystemReport"}, + FunctionInfo{20101, &PlayReport::SaveSystemReportWithUserOld, "SaveSystemReportWithUser"}, + FunctionInfo{20102, &PlayReport::SaveSystemReport, "SaveSystemReport"}, + FunctionInfo{20103, &PlayReport::SaveSystemReportWithUser, "SaveSystemReportWithUser"}, + FunctionInfo{20200, nullptr, "SetOperationMode"}, + FunctionInfo{30100, nullptr, "ClearStorage"}, + FunctionInfo{30200, nullptr, "ClearStatistics"}, + FunctionInfo{30300, nullptr, "GetStorageUsage"}, + FunctionInfo{30400, nullptr, "GetStatistics"}, + FunctionInfo{30401, nullptr, "GetThroughputHistory"}, + FunctionInfo{30500, nullptr, "GetLastUploadError"}, + FunctionInfo{30600, nullptr, "GetApplicationUploadSummary"}, + FunctionInfo{40100, nullptr, "IsUserAgreementCheckEnabled"}, + FunctionInfo{40101, nullptr, "SetUserAgreementCheckEnabled"}, + FunctionInfo{50100, nullptr, "ReadAllApplicationReportFiles"}, + FunctionInfo{90100, nullptr, "ReadAllReportFiles"}, + FunctionInfo{90101, nullptr, "Unknown90101"}, + FunctionInfo{90102, nullptr, "Unknown90102"}, + FunctionInfo{90200, nullptr, "GetStatistics"}, + FunctionInfo{90201, nullptr, "GetThroughputHistory"}, + FunctionInfo{90300, nullptr, "GetLastUploadError"} + ); }; void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("prepo:a", - std::make_shared("prepo:a", system)); - server_manager->RegisterNamedService("prepo:a2", - std::make_shared("prepo:a2", system)); - server_manager->RegisterNamedService("prepo:m", - std::make_shared("prepo:m", system)); - server_manager->RegisterNamedService("prepo:s", - std::make_shared("prepo:s", system)); - server_manager->RegisterNamedService("prepo:u", - std::make_shared("prepo:u", system)); + server_manager->RegisterNamedService("prepo:a", std::make_shared("prepo:a", system)); + server_manager->RegisterNamedService("prepo:a2", std::make_shared("prepo:a2", system)); + server_manager->RegisterNamedService("prepo:m", std::make_shared("prepo:m", system)); + server_manager->RegisterNamedService("prepo:s", std::make_shared("prepo:s", system)); + server_manager->RegisterNamedService("prepo:u", std::make_shared("prepo:u", system)); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/psc/ovln/receiver.cpp b/src/core/hle/service/psc/ovln/receiver.cpp deleted file mode 100644 index f43d705126..0000000000 --- a/src/core/hle/service/psc/ovln/receiver.cpp +++ /dev/null @@ -1,118 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/psc/ovln/receiver.h" -#include "core/hle/service/cmif_serialization.h" - -namespace Service::PSC { - -IReceiver::IReceiver(Core::System& system_) - : ServiceFramework{system_, "IReceiver"}, service_context{system_, "IReceiver"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IReceiver::AddSource>, "AddSource"}, - {1, D<&IReceiver::RemoveSource>, "RemoveSource"}, - {2, D<&IReceiver::GetReceiveEventHandle>, "GetReceiveEventHandle"}, - {3, D<&IReceiver::Receive>, "Receive"}, - {4, D<&IReceiver::ReceiveWithTick>, "ReceiveWithTick"}, - }; - // clang-format on - - RegisterHandlers(functions); - - receive_event = service_context.CreateEvent("IReceiver::ReceiveEvent"); -} - -IReceiver::~IReceiver() { - service_context.CloseEvent(receive_event); -} - -Result IReceiver::AddSource(SourceName source_name) { - const std::string name = source_name.GetString(); - LOG_INFO(Service_PSC, "called: source_name={}", name); - - // Add source if it doesn't already exist - if (message_sources.find(name) == message_sources.end()) { - message_sources[name] = {}; - } - - R_SUCCEED(); -} - -Result IReceiver::RemoveSource(SourceName source_name) { - const std::string name = source_name.GetString(); - LOG_INFO(Service_PSC, "called: source_name={}", name); - - // Remove source if it exists - message_sources.erase(name); - - R_SUCCEED(); -} - -Result IReceiver::GetReceiveEventHandle(OutCopyHandle out_event) { - LOG_INFO(Service_PSC, "called"); - *out_event = &receive_event->GetReadableEvent(); - R_SUCCEED(); -} - -Result IReceiver::Receive(Out out_notification, Out out_flags) { - u64 tick; - return ReceiveWithTick(out_notification, out_flags, Out(&tick)); -} - -Result IReceiver::ReceiveWithTick(Out out_notification, - Out out_flags, Out out_tick) { - LOG_DEBUG(Service_PSC, "called"); - - // Find the message with the lowest ID across all sources - const std::string* target_source = nullptr; - size_t target_index = 0; - - for (const auto& [source_name, messages] : message_sources) { - if (!messages.empty()) { - if (target_source == nullptr) { - target_source = &source_name; - target_index = 0; - } - // Note: In the real implementation, we would track message IDs - // For now, just use FIFO order - } - } - - if (target_source != nullptr) { - auto& messages = message_sources[*target_source]; - *out_notification = messages[target_index].first; - *out_flags = messages[target_index].second; - *out_tick = 0; // TODO: Implement tick tracking - - // Remove the message - messages.erase(messages.begin() + target_index); - - // Clear event if no more messages - bool has_messages = false; - for (const auto& [_, msgs] : message_sources) { - if (!msgs.empty()) { - has_messages = true; - break; - } - } - if (!has_messages) { - receive_event->Clear(system.Kernel()); - } - - R_SUCCEED(); - } - - // No messages available - *out_notification = {}; - *out_flags = {}; - *out_tick = 0; - - LOG_WARNING(Service_PSC, "No messages available"); - R_THROW(ResultUnknown); // TODO: Use proper OvlnResult::NoMessages when available -} - -} // namespace Service::PSC diff --git a/src/core/hle/service/psc/ovln/receiver.h b/src/core/hle/service/psc/ovln/receiver.h deleted file mode 100644 index 2b96216a1a..0000000000 --- a/src/core/hle/service/psc/ovln/receiver.h +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include -#include "core/hle/result.h" -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/kernel_helpers.h" -#include "core/hle/service/service.h" -#include "core/hle/service/psc/ovln/ovln_types.h" - -namespace Kernel { -class KReadableEvent; -} - -namespace Service::PSC { - -class IReceiver final : public ServiceFramework { -public: - explicit IReceiver(Core::System& system_); - ~IReceiver() override; - - IReceiver(const IReceiver&) = delete; - IReceiver& operator=(const IReceiver&) = delete; - -private: - Result AddSource(SourceName source_name); - Result RemoveSource(SourceName source_name); - Result GetReceiveEventHandle(OutCopyHandle out_event); - Result Receive(Out out_notification, Out out_flags); - Result ReceiveWithTick(Out out_notification, Out out_flags, - Out out_tick); - - KernelHelpers::ServiceContext service_context; - Kernel::KEvent* receive_event; - - std::map>> message_sources; -}; - -} // namespace Service::PSC diff --git a/src/core/hle/service/psc/ovln/receiver_service.cpp b/src/core/hle/service/psc/ovln/receiver_service.cpp index 3b0b180725..0df9d802b9 100644 --- a/src/core/hle/service/psc/ovln/receiver_service.cpp +++ b/src/core/hle/service/psc/ovln/receiver_service.cpp @@ -5,19 +5,126 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/psc/ovln/receiver.h" +#include "core/hle/service/psc/ovln/ovln_types.h" #include "core/hle/service/psc/ovln/receiver_service.h" namespace Service::PSC { -IReceiverService::IReceiverService(Core::System& system_) : ServiceFramework{system_, "ovln:rcv"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IReceiverService::OpenReceiver>, "OpenReceiver"}, - }; - // clang-format on +class IReceiver final : public ServiceFramework { +public: + explicit IReceiver(Core::System& system_) : ServiceFramework{system_, "IReceiver"}, service_context{system_, "IReceiver"} { + receive_event = service_context.CreateEvent("IReceiver::ReceiveEvent"); + } - RegisterHandlers(functions); + ~IReceiver() override { + service_context.CloseEvent(receive_event); + } + + Result AddSource(SourceName source_name) { + const std::string name = source_name.GetString(); + LOG_INFO(Service_PSC, "called: source_name={}", name); + // Add source if it doesn't already exist + if (message_sources.find(name) == message_sources.end()) { + message_sources[name] = {}; + } + R_SUCCEED(); + } + + Result RemoveSource(SourceName source_name) { + const std::string name = source_name.GetString(); + LOG_INFO(Service_PSC, "called: source_name={}", name); + // Remove source if it exists + message_sources.erase(name); + R_SUCCEED(); + } + + Result GetReceiveEventHandle(OutCopyHandle out_event) { + LOG_INFO(Service_PSC, "called"); + *out_event = &receive_event->GetReadableEvent(); + R_SUCCEED(); + } + + Result Receive(Out out_notification, Out out_flags) { + u64 tick; + return ReceiveWithTick(out_notification, out_flags, Out(&tick)); + } + + Result ReceiveWithTick(Out out_notification, Out out_flags, Out out_tick) { + LOG_DEBUG(Service_PSC, "called"); + + // Find the message with the lowest ID across all sources + const std::string* target_source = nullptr; + size_t target_index = 0; + + for (const auto& [source_name, messages] : message_sources) { + if (!messages.empty()) { + if (target_source == nullptr) { + target_source = &source_name; + target_index = 0; + } + // Note: In the real implementation, we would track message IDs + // For now, just use FIFO order + } + } + + if (target_source != nullptr) { + auto& messages = message_sources[*target_source]; + *out_notification = messages[target_index].first; + *out_flags = messages[target_index].second; + *out_tick = 0; // TODO: Implement tick tracking + + // Remove the message + messages.erase(messages.begin() + target_index); + + // Clear event if no more messages + bool has_messages = false; + for (const auto& [_, msgs] : message_sources) { + if (!msgs.empty()) { + has_messages = true; + break; + } + } + if (!has_messages) { + receive_event->Clear(system.Kernel()); + } + + R_SUCCEED(); + } + + // No messages available + *out_notification = {}; + *out_flags = {}; + *out_tick = 0; + + LOG_WARNING(Service_PSC, "No messages available"); + R_THROW(ResultUnknown); // TODO: Use proper OvlnResult::NoMessages when available + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IReceiver::AddSource>, "AddSource"}, + FunctionInfo{1, D<&IReceiver::RemoveSource>, "RemoveSource"}, + FunctionInfo{2, D<&IReceiver::GetReceiveEventHandle>, "GetReceiveEventHandle"}, + FunctionInfo{3, D<&IReceiver::Receive>, "Receive"}, + FunctionInfo{4, D<&IReceiver::ReceiveWithTick>, "ReceiveWithTick"} + ); + + KernelHelpers::ServiceContext service_context; + Kernel::KEvent* receive_event; + + std::map>> message_sources; +}; + +std::optional IReceiverService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IReceiverService::OpenReceiver>, "OpenReceiver"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + +IReceiverService::IReceiverService(Core::System& system_) : ServiceFramework{system_, "ovln:rcv"} { } IReceiverService::~IReceiverService() = default; diff --git a/src/core/hle/service/psc/ovln/receiver_service.h b/src/core/hle/service/psc/ovln/receiver_service.h index b3b31ba4aa..bd053cd50c 100644 --- a/src/core/hle/service/psc/ovln/receiver_service.h +++ b/src/core/hle/service/psc/ovln/receiver_service.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -17,6 +20,8 @@ public: private: Result OpenReceiver(Out> out_receiver); + + std::optional FindRequest(u32 key) override; }; } // namespace Service::PSC diff --git a/src/core/hle/service/psc/ovln/sender.cpp b/src/core/hle/service/psc/ovln/sender.cpp deleted file mode 100644 index 3227a56f25..0000000000 --- a/src/core/hle/service/psc/ovln/sender.cpp +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/psc/ovln/sender.h" - -namespace Service::PSC { - -ISender::ISender(Core::System& system_) : ServiceFramework{system_, "ISender"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&ISender::Send>, "Send"}, - {1, nullptr, "GetUnreceivedMessageCount"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -ISender::~ISender() = default; - -Result ISender::Send(const OverlayNotification& notification, MessageFlags flags) { - std::string data; - for (const auto m : notification) { - data += fmt::format("{:016X} ", m); - } - - LOG_WARNING(Service_PSC, "(STUBBED) called, flags={} notification={}", flags.raw, data); - R_SUCCEED(); -} - -} // namespace Service::PSC diff --git a/src/core/hle/service/psc/ovln/sender.h b/src/core/hle/service/psc/ovln/sender.h deleted file mode 100644 index c1575428e3..0000000000 --- a/src/core/hle/service/psc/ovln/sender.h +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/psc/ovln/ovln_types.h" -#include "core/hle/service/service.h" - -namespace Service::PSC { - -class ISender final : public ServiceFramework { -public: - explicit ISender(Core::System& system_); - ~ISender() override; - -private: - Result Send(const OverlayNotification& notification, MessageFlags flags); -}; - -} // namespace Service::PSC diff --git a/src/core/hle/service/psc/ovln/sender_service.cpp b/src/core/hle/service/psc/ovln/sender_service.cpp index 18d2c83a3d..5a36f1e1ec 100644 --- a/src/core/hle/service/psc/ovln/sender_service.cpp +++ b/src/core/hle/service/psc/ovln/sender_service.cpp @@ -1,20 +1,47 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/psc/ovln/sender.h" +#include "core/hle/service/psc/ovln/ovln_types.h" #include "core/hle/service/psc/ovln/sender_service.h" namespace Service::PSC { -ISenderService::ISenderService(Core::System& system_) : ServiceFramework{system_, "ovln:snd"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&ISenderService::OpenSender>, "OpenSender"}, - }; - // clang-format on +class ISender final : public ServiceFramework { +public: + explicit ISender(Core::System& system_) : ServiceFramework{system_, "ISender"} {} + ~ISender() override = default; - RegisterHandlers(functions); + Result Send(const OverlayNotification& notification, MessageFlags flags) { + std::string data; + for (const auto m : notification) { + data += fmt::format("{:016X} ", m); + } + + LOG_WARNING(Service_PSC, "(STUBBED) called, flags={} notification={}", flags.raw, data); + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ISender::Send>, "Send"}, + FunctionInfo{1, nullptr, "GetUnreceivedMessageCount"} + ); +}; + +std::optional ISenderService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ISenderService::OpenSender>, "OpenSender"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + +ISenderService::ISenderService(Core::System& system_) : ServiceFramework{system_, "ovln:snd"} { } ISenderService::~ISenderService() = default; diff --git a/src/core/hle/service/psc/ovln/sender_service.h b/src/core/hle/service/psc/ovln/sender_service.h index 10027701f4..90a9a33872 100644 --- a/src/core/hle/service/psc/ovln/sender_service.h +++ b/src/core/hle/service/psc/ovln/sender_service.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -16,8 +19,9 @@ public: ~ISenderService() override; private: - Result OpenSender(Out> out_sender, u32 sender_id, - std::array data); + Result OpenSender(Out> out_sender, u32 sender_id, std::array data); + + std::optional FindRequest(u32 key) override; }; } // namespace Service::PSC diff --git a/src/core/hle/service/psc/pm_control.cpp b/src/core/hle/service/psc/pm_control.cpp deleted file mode 100644 index 7dedb76629..0000000000 --- a/src/core/hle/service/psc/pm_control.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/psc/pm_control.h" - -namespace Service::PSC { - -IPmControl::IPmControl(Core::System& system_) : ServiceFramework{system_, "psc:c"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Initialize"}, - {1, nullptr, "DispatchRequest"}, - {2, nullptr, "GetResult"}, - {3, nullptr, "GetState"}, - {4, nullptr, "Cancel"}, - {5, nullptr, "PrintModuleInformation"}, - {6, nullptr, "GetModuleInformation"}, - {10, nullptr, "AcquireStateLock"}, - {11, nullptr, "HasStateLock"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -IPmControl::~IPmControl() = default; - -} // namespace Service::PSC diff --git a/src/core/hle/service/psc/pm_control.h b/src/core/hle/service/psc/pm_control.h deleted file mode 100644 index e0ae2f39ca..0000000000 --- a/src/core/hle/service/psc/pm_control.h +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/service.h" - -namespace Service::PSC { - -class IPmControl final : public ServiceFramework { -public: - explicit IPmControl(Core::System& system_); - ~IPmControl() override; -}; - -} // namespace Service::PSC diff --git a/src/core/hle/service/psc/pm_module.cpp b/src/core/hle/service/psc/pm_module.cpp deleted file mode 100644 index 74dc7ed4e8..0000000000 --- a/src/core/hle/service/psc/pm_module.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/psc/pm_module.h" - -namespace Service::PSC { - -IPmModule::IPmModule(Core::System& system_) : ServiceFramework{system_, "IPmModule"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Initialize"}, - {1, nullptr, "GetRequest"}, - {2, nullptr, "Acknowledge"}, - {3, nullptr, "Finalize"}, - {4, nullptr, "AcknowledgeEx"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -IPmModule::~IPmModule() = default; - -} // namespace Service::PSC diff --git a/src/core/hle/service/psc/pm_module.h b/src/core/hle/service/psc/pm_module.h deleted file mode 100644 index b3a2d25842..0000000000 --- a/src/core/hle/service/psc/pm_module.h +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/service.h" - -namespace Service::PSC { - -class IPmModule final : public ServiceFramework { -public: - explicit IPmModule(Core::System& system_); - ~IPmModule() override; -}; - -} // namespace Service::PSC diff --git a/src/core/hle/service/psc/pm_service.cpp b/src/core/hle/service/psc/pm_service.cpp deleted file mode 100644 index c4e0ad2286..0000000000 --- a/src/core/hle/service/psc/pm_service.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/psc/pm_module.h" -#include "core/hle/service/psc/pm_service.h" - -namespace Service::PSC { - -IPmService::IPmService(Core::System& system_) : ServiceFramework{system_, "psc:m"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IPmService::GetPmModule>, "GetPmModule"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - -IPmService::~IPmService() = default; - -Result IPmService::GetPmModule(Out> out_module) { - LOG_DEBUG(Service_PSC, "called"); - *out_module = std::make_shared(system); - R_SUCCEED(); -} - -} // namespace Service::PSC diff --git a/src/core/hle/service/psc/pm_service.h b/src/core/hle/service/psc/pm_service.h deleted file mode 100644 index 08e14c6f8f..0000000000 --- a/src/core/hle/service/psc/pm_service.h +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/cmif_types.h" -#include "core/hle/service/service.h" - -namespace Service::PSC { - -class IPmModule; - -class IPmService final : public ServiceFramework { -public: - explicit IPmService(Core::System& system_); - ~IPmService() override; - -private: - Result GetPmModule(Out> out_module); -}; - -} // namespace Service::PSC diff --git a/src/core/hle/service/psc/psc.cpp b/src/core/hle/service/psc/psc.cpp index 31fb9f0117..553c4f63a4 100644 --- a/src/core/hle/service/psc/psc.cpp +++ b/src/core/hle/service/psc/psc.cpp @@ -6,102 +6,159 @@ #include "core/hle/service/psc/ovln/receiver_service.h" #include "core/hle/service/psc/ovln/sender_service.h" -#include "core/hle/service/psc/pm_control.h" -#include "core/hle/service/psc/pm_service.h" #include "core/hle/service/psc/psc.h" #include "core/hle/service/psc/time/manager.h" #include "core/hle/service/psc/time/power_state_service.h" #include "core/hle/service/psc/time/service_manager.h" #include "core/hle/service/psc/time/static.h" #include "core/hle/service/service.h" +#include "core/hle/service/cmif_serialization.h" namespace Service::PSC { class PSC_L final : public ServiceFramework { public: - explicit PSC_L(Core::System& system_) : ServiceFramework{system_, "psc:l"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Initialize_3"}, - {1, nullptr, "Lock"}, - {2, nullptr, "Unlock"}, - {3, nullptr, "IsLocked"}, - {4, nullptr, "GetRelatedState"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit PSC_L(Core::System& system_) : ServiceFramework{system_, "psc:l"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Initialize_3"}, + FunctionInfo{1, nullptr, "Lock"}, + FunctionInfo{2, nullptr, "Unlock"}, + FunctionInfo{3, nullptr, "IsLocked"}, + FunctionInfo{4, nullptr, "GetRelatedState"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class INS_R final : public ServiceFramework { public: - explicit INS_R(Core::System& system_) : ServiceFramework{system_, "ins:r"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetInputSourceState"}, - {1, nullptr, "GetTriggerTargetEvent"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit INS_R(Core::System& system_) : ServiceFramework{system_, "ins:r"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetInputSourceState"}, + FunctionInfo{1, nullptr, "GetTriggerTargetEvent"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class INS_S final : public ServiceFramework { public: - explicit INS_S(Core::System& system_) : ServiceFramework{system_, "ins:s"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetNotifyEvent"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit INS_S(Core::System& system_) : ServiceFramework{system_, "ins:s"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetNotifyEvent"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class HSHL_SYS final : public ServiceFramework { public: - explicit HSHL_SYS(Core::System& system_) : ServiceFramework{system_, "hshl:sys"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetBatteryPercentage"}, - {1, nullptr, "GetChargerType"}, - {2, nullptr, "OpenChargeSession"}, - {3, nullptr, "GetRawBatteryPercentage"}, - {4, nullptr, "GetBatteryVoltageLevel"}, - {5, nullptr, "OpenThermalSession"}, - {6, nullptr, "GetAbnormalTemperatureSet"}, - {7, nullptr, "OpenClockSession"}, - {8, nullptr, "GetClockRate"}, - {9, nullptr, "OpenBridgeSession"}, - {10, nullptr, "GetBridgePowerSupply"}, - {11, nullptr, "OpenVsysVoltageSession"}, - {12, nullptr, "GetIsBatteryEnoughForFullAwake"}, - {13, nullptr, "GetIsCharging"}, - {14, nullptr, "Cmd14"}, - {15, nullptr, "Cmd15"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit HSHL_SYS(Core::System& system_) : ServiceFramework{system_, "hshl:sys"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetBatteryPercentage"}, + FunctionInfo{1, nullptr, "GetChargerType"}, + FunctionInfo{2, nullptr, "OpenChargeSession"}, + FunctionInfo{3, nullptr, "GetRawBatteryPercentage"}, + FunctionInfo{4, nullptr, "GetBatteryVoltageLevel"}, + FunctionInfo{5, nullptr, "OpenThermalSession"}, + FunctionInfo{6, nullptr, "GetAbnormalTemperatureSet"}, + FunctionInfo{7, nullptr, "OpenClockSession"}, + FunctionInfo{8, nullptr, "GetClockRate"}, + FunctionInfo{9, nullptr, "OpenBridgeSession"}, + FunctionInfo{10, nullptr, "GetBridgePowerSupply"}, + FunctionInfo{11, nullptr, "OpenVsysVoltageSession"}, + FunctionInfo{12, nullptr, "GetIsBatteryEnoughForFullAwake"}, + FunctionInfo{13, nullptr, "GetIsCharging"}, + FunctionInfo{14, nullptr, "Cmd14"}, + FunctionInfo{15, nullptr, "Cmd15"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class HSHL_SET final : public ServiceFramework { public: - explicit HSHL_SET(Core::System& system_) : ServiceFramework{system_, "hshl:set"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "OpenChargeSession_2"}, - {1, nullptr, "OpenThermalSession_2"}, - {2, nullptr, "SetClockRate"}, - {3, nullptr, "SetBridgePowerSupply"}, - {4, nullptr, "Cmd4"}, - {5, nullptr, "Cmd5"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit HSHL_SET(Core::System& system_) : ServiceFramework{system_, "hshl:set"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "OpenChargeSession_2"}, + FunctionInfo{1, nullptr, "OpenThermalSession_2"}, + FunctionInfo{2, nullptr, "SetClockRate"}, + FunctionInfo{3, nullptr, "SetBridgePowerSupply"}, + FunctionInfo{4, nullptr, "Cmd4"}, + FunctionInfo{5, nullptr, "Cmd5"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; +class IPmModule final : public ServiceFramework { +public: + explicit IPmModule(Core::System& system_) : ServiceFramework{system_, "IPmModule"} {} + ~IPmModule() override = default; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Initialize"}, + FunctionInfo{1, nullptr, "GetRequest"}, + FunctionInfo{2, nullptr, "Acknowledge"}, + FunctionInfo{3, nullptr, "Finalize"}, + FunctionInfo{4, nullptr, "AcknowledgeEx"} + ); +}; + +class IPmService final : public ServiceFramework { +public: + explicit IPmService(Core::System& system_) : ServiceFramework{system_, "psc:m"} {} + ~IPmService() override = default; + +private: + Result GetPmModule(Out> out_module) { + LOG_DEBUG(Service_PSC, "called"); + *out_module = std::make_shared(system); + R_SUCCEED(); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IPmService::GetPmModule>, "GetPmModule"} + ); +}; + +class IPmControl final : public ServiceFramework { +public: + explicit IPmControl(Core::System& system_) : ServiceFramework{system_, "psc:c"} {} + ~IPmControl() override = default; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Initialize"}, + FunctionInfo{1, nullptr, "DispatchRequest"}, + FunctionInfo{2, nullptr, "GetResult"}, + FunctionInfo{3, nullptr, "GetState"}, + FunctionInfo{4, nullptr, "Cancel"}, + FunctionInfo{5, nullptr, "PrintModuleInformation"}, + FunctionInfo{6, nullptr, "GetModuleInformation"}, + FunctionInfo{10, nullptr, "AcquireStateLock"}, + FunctionInfo{11, nullptr, "HasStateLock"} + ); +}; + void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); diff --git a/src/core/hle/service/psc/time/alarms.cpp b/src/core/hle/service/psc/time/alarms.cpp index 17a795c4c5..c9070896b3 100644 --- a/src/core/hle/service/psc/time/alarms.cpp +++ b/src/core/hle/service/psc/time/alarms.cpp @@ -33,8 +33,7 @@ Alarm::~Alarm() { } Alarms::Alarms(Core::System& system, StandardSteadyClockCore& steady_clock, PowerStateRequestManager& power_state_request_manager) - : m_system{system} - , m_ctx{system, "Psc:Alarms"} + : m_ctx{system, "Psc:Alarms"} , m_steady_clock{steady_clock} , m_power_state_request_manager{power_state_request_manager} , m_event{m_ctx.CreateEvent("Psc:Alarms:Event")} @@ -136,15 +135,7 @@ Result Alarms::UpdateClosestAndSignal(Kernel::KernelCore& kernel) { IAlarmService::IAlarmService(Core::System& system_, std::shared_ptr manager) : ServiceFramework{system_, "time:al"} , m_alarms{manager->m_alarms} -{ - // clang-format off - static const FunctionInfo functions[] = { - {0, &IAlarmService::CreateWakeupAlarm, "CreateWakeupAlarm"}, - {1, &IAlarmService::CreateBackgroundTaskAlarm, "CreateBackgroundTaskAlarm"}, - }; - // clang-format on - RegisterHandlers(functions); -} +{} void IAlarmService::CreateWakeupAlarm(HLERequestContext& ctx) { LOG_DEBUG(Service_Time, "called."); @@ -165,17 +156,6 @@ void IAlarmService::CreateBackgroundTaskAlarm(HLERequestContext& ctx) { ISteadyClockAlarm::ISteadyClockAlarm(Core::System& system_, Alarms& alarms, AlarmType type) : ServiceFramework{system_, "ISteadyClockAlarm"}, m_ctx{system, "Psc:ISteadyClockAlarm"}, m_alarms{alarms}, m_alarm{system, m_ctx, type} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &ISteadyClockAlarm::GetAlarmEvent, "GetAlarmEvent"}, - {1, &ISteadyClockAlarm::Enable, "Enable"}, - {2, &ISteadyClockAlarm::Disable, "Disable"}, - {3, &ISteadyClockAlarm::IsEnabled, "IsEnabled"}, - {10, nullptr, "CreateWakeLock"}, - {11, nullptr, "DestroyWakeLock"}, - }; - // clang-format on - RegisterHandlers(functions); } void ISteadyClockAlarm::GetAlarmEvent(HLERequestContext& ctx) { diff --git a/src/core/hle/service/psc/time/alarms.h b/src/core/hle/service/psc/time/alarms.h index 0a2fa7fac5..6d916ca198 100644 --- a/src/core/hle/service/psc/time/alarms.h +++ b/src/core/hle/service/psc/time/alarms.h @@ -95,7 +95,6 @@ private: void Erase(Kernel::KernelCore& kernel, Alarm& alarm); Result UpdateClosestAndSignal(Kernel::KernelCore& kernel); - Core::System& m_system; KernelHelpers::ServiceContext m_ctx; StandardSteadyClockCore& m_steady_clock; @@ -114,6 +113,14 @@ public: private: void CreateWakeupAlarm(HLERequestContext& ctx); void CreateBackgroundTaskAlarm(HLERequestContext& ctx); + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IAlarmService::CreateWakeupAlarm, "CreateWakeupAlarm"}, + FunctionInfo{1, &IAlarmService::CreateBackgroundTaskAlarm, "CreateBackgroundTaskAlarm"} + ); Alarms& m_alarms; }; @@ -128,8 +135,18 @@ private: void Disable(HLERequestContext& ctx); void IsEnabled(HLERequestContext& ctx); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &ISteadyClockAlarm::GetAlarmEvent, "GetAlarmEvent"}, + FunctionInfo{1, &ISteadyClockAlarm::Enable, "Enable"}, + FunctionInfo{2, &ISteadyClockAlarm::Disable, "Disable"}, + FunctionInfo{3, &ISteadyClockAlarm::IsEnabled, "IsEnabled"}, + FunctionInfo{10, nullptr, "CreateWakeLock"}, + FunctionInfo{11, nullptr, "DestroyWakeLock"} + ); KernelHelpers::ServiceContext m_ctx; - Alarms& m_alarms; Alarm m_alarm; }; diff --git a/src/core/hle/service/psc/time/manager.h b/src/core/hle/service/psc/time/manager.h index 62ded12475..2cb8b58a2b 100644 --- a/src/core/hle/service/psc/time/manager.h +++ b/src/core/hle/service/psc/time/manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 @@ -23,20 +26,20 @@ namespace Service::PSC::Time { class TimeManager { public: explicit TimeManager(Core::System& system) - : m_system{system}, m_standard_steady_clock{system}, m_tick_based_steady_clock{m_system}, - m_standard_local_system_clock{m_standard_steady_clock}, - m_standard_network_system_clock{m_standard_steady_clock}, - m_standard_user_system_clock{m_system, m_standard_local_system_clock, - m_standard_network_system_clock}, - m_ephemeral_network_clock{m_tick_based_steady_clock}, m_shared_memory{m_system}, - m_power_state_request_manager{m_system}, m_alarms{m_system, m_standard_steady_clock, - m_power_state_request_manager}, - m_local_system_clock_context_writer{m_system, m_shared_memory}, - m_network_system_clock_context_writer{m_system, m_shared_memory, - m_standard_user_system_clock}, - m_ephemeral_network_clock_context_writer{m_system} {} - - Core::System& m_system; + : m_standard_steady_clock{system} + , m_tick_based_steady_clock{system} + , m_standard_local_system_clock{m_standard_steady_clock} + , m_standard_network_system_clock{m_standard_steady_clock} + , m_standard_user_system_clock{system, m_standard_local_system_clock + , m_standard_network_system_clock} + , m_ephemeral_network_clock{m_tick_based_steady_clock} + , m_shared_memory{system} + , m_power_state_request_manager{system} + , m_alarms{system, m_standard_steady_clock, m_power_state_request_manager} + , m_local_system_clock_context_writer{system, m_shared_memory} + , m_network_system_clock_context_writer{system, m_shared_memory, m_standard_user_system_clock} + , m_ephemeral_network_clock_context_writer{system} + {} StandardSteadyClockCore m_standard_steady_clock; TickBasedSteadyClockCore m_tick_based_steady_clock; diff --git a/src/core/hle/service/psc/time/power_state_service.cpp b/src/core/hle/service/psc/time/power_state_service.cpp index 39af16b6f1..795aeb94a8 100644 --- a/src/core/hle/service/psc/time/power_state_service.cpp +++ b/src/core/hle/service/psc/time/power_state_service.cpp @@ -9,20 +9,19 @@ namespace Service::PSC::Time { +std::optional IPowerStateRequestHandler::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&IPowerStateRequestHandler::GetPowerStateRequestEventReadableHandle>, "GetPowerStateRequestEventReadableHandle"}, + FunctionInfo{1, D<&IPowerStateRequestHandler::GetAndClearPowerStateRequest>, "GetAndClearPowerStateRequest"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IPowerStateRequestHandler::IPowerStateRequestHandler( Core::System& system_, PowerStateRequestManager& power_state_request_manager) : ServiceFramework{system_, "time:p"} , m_power_state_request_manager{power_state_request_manager} -{ - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&IPowerStateRequestHandler::GetPowerStateRequestEventReadableHandle>, "GetPowerStateRequestEventReadableHandle"}, - {1, D<&IPowerStateRequestHandler::GetAndClearPowerStateRequest>, "GetAndClearPowerStateRequest"}, - }; - // clang-format on - - RegisterHandlers(functions); -} +{} Result IPowerStateRequestHandler::GetPowerStateRequestEventReadableHandle( OutCopyHandle out_event) { diff --git a/src/core/hle/service/psc/time/power_state_service.h b/src/core/hle/service/psc/time/power_state_service.h index 81b3adf234..14d9c1a77a 100644 --- a/src/core/hle/service/psc/time/power_state_service.h +++ b/src/core/hle/service/psc/time/power_state_service.h @@ -27,6 +27,7 @@ public: Result GetAndClearPowerStateRequest(Out out_cleared, Out out_priority); private: + std::optional FindRequest(u32 key) override; PowerStateRequestManager& m_power_state_request_manager; }; diff --git a/src/core/hle/service/psc/time/service_manager.cpp b/src/core/hle/service/psc/time/service_manager.cpp index e9f1407e4d..be25ee9a70 100644 --- a/src/core/hle/service/psc/time/service_manager.cpp +++ b/src/core/hle/service/psc/time/service_manager.cpp @@ -13,6 +13,30 @@ namespace Service::PSC::Time { + std::optional ServiceManager::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ServiceManager::GetStaticServiceAsUser>, "GetStaticServiceAsUser"}, + FunctionInfo{5, D<&ServiceManager::GetStaticServiceAsAdmin>, "GetStaticServiceAsAdmin"}, + FunctionInfo{6, D<&ServiceManager::GetStaticServiceAsRepair>, "GetStaticServiceAsRepair"}, + FunctionInfo{9, D<&ServiceManager::GetStaticServiceAsServiceManager>, "GetStaticServiceAsServiceManager"}, + FunctionInfo{10, D<&ServiceManager::SetupStandardSteadyClockCore>, "SetupStandardSteadyClockCore"}, + FunctionInfo{11, D<&ServiceManager::SetupStandardLocalSystemClockCore>, "SetupStandardLocalSystemClockCore"}, + FunctionInfo{12, D<&ServiceManager::SetupStandardNetworkSystemClockCore>, "SetupStandardNetworkSystemClockCore"}, + FunctionInfo{13, D<&ServiceManager::SetupStandardUserSystemClockCore>, "SetupStandardUserSystemClockCore"}, + FunctionInfo{14, D<&ServiceManager::SetupTimeZoneServiceCore>, "SetupTimeZoneServiceCore"}, + FunctionInfo{15, D<&ServiceManager::SetupEphemeralNetworkSystemClockCore>, "SetupEphemeralNetworkSystemClockCore"}, + FunctionInfo{50, D<&ServiceManager::GetStandardLocalClockOperationEvent>, "GetStandardLocalClockOperationEvent"}, + FunctionInfo{51, D<&ServiceManager::GetStandardNetworkClockOperationEventForServiceManager>, "GetStandardNetworkClockOperationEventForServiceManager"}, + FunctionInfo{52, D<&ServiceManager::GetEphemeralNetworkClockOperationEventForServiceManager>, "GetEphemeralNetworkClockOperationEventForServiceManager"}, + FunctionInfo{60, D<&ServiceManager::GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent"}, + FunctionInfo{100, D<&ServiceManager::SetStandardSteadyClockBaseTime>, "SetStandardSteadyClockBaseTime"}, + FunctionInfo{200, D<&ServiceManager::GetClosestAlarmUpdatedEvent>, "GetClosestAlarmUpdatedEvent"}, + FunctionInfo{201, D<&ServiceManager::CheckAndSignalAlarms>, "CheckAndSignalAlarms"}, + FunctionInfo{202, D<&ServiceManager::GetClosestAlarmInfo>, "GetClosestAlarmInfo "} + ); + return HandlerTableGenerateWithFind(key, functions); + } + ServiceManager::ServiceManager(Core::System& system_, std::shared_ptr time, ServerManager* server_manager) : ServiceFramework{system_, "time:m"}, m_time{std::move(time)}, @@ -27,30 +51,6 @@ ServiceManager::ServiceManager(Core::System& system_, std::shared_ptrm_network_system_clock_context_writer}, m_ephemeral_system_context_writer{m_time->m_ephemeral_network_clock_context_writer}, m_local_operation{system_}, m_network_operation{system_}, m_ephemeral_operation{system_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&ServiceManager::GetStaticServiceAsUser>, "GetStaticServiceAsUser"}, - {5, D<&ServiceManager::GetStaticServiceAsAdmin>, "GetStaticServiceAsAdmin"}, - {6, D<&ServiceManager::GetStaticServiceAsRepair>, "GetStaticServiceAsRepair"}, - {9, D<&ServiceManager::GetStaticServiceAsServiceManager>, "GetStaticServiceAsServiceManager"}, - {10, D<&ServiceManager::SetupStandardSteadyClockCore>, "SetupStandardSteadyClockCore"}, - {11, D<&ServiceManager::SetupStandardLocalSystemClockCore>, "SetupStandardLocalSystemClockCore"}, - {12, D<&ServiceManager::SetupStandardNetworkSystemClockCore>, "SetupStandardNetworkSystemClockCore"}, - {13, D<&ServiceManager::SetupStandardUserSystemClockCore>, "SetupStandardUserSystemClockCore"}, - {14, D<&ServiceManager::SetupTimeZoneServiceCore>, "SetupTimeZoneServiceCore"}, - {15, D<&ServiceManager::SetupEphemeralNetworkSystemClockCore>, "SetupEphemeralNetworkSystemClockCore"}, - {50, D<&ServiceManager::GetStandardLocalClockOperationEvent>, "GetStandardLocalClockOperationEvent"}, - {51, D<&ServiceManager::GetStandardNetworkClockOperationEventForServiceManager>, "GetStandardNetworkClockOperationEventForServiceManager"}, - {52, D<&ServiceManager::GetEphemeralNetworkClockOperationEventForServiceManager>, "GetEphemeralNetworkClockOperationEventForServiceManager"}, - {60, D<&ServiceManager::GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent"}, - {100, D<&ServiceManager::SetStandardSteadyClockBaseTime>, "SetStandardSteadyClockBaseTime"}, - {200, D<&ServiceManager::GetClosestAlarmUpdatedEvent>, "GetClosestAlarmUpdatedEvent"}, - {201, D<&ServiceManager::CheckAndSignalAlarms>, "CheckAndSignalAlarms"}, - {202, D<&ServiceManager::GetClosestAlarmInfo>, "GetClosestAlarmInfo "}, - }; - // clang-format on - RegisterHandlers(functions); - m_local_system_context_writer.Link(m_local_operation); m_network_system_context_writer.Link(m_network_operation); m_ephemeral_system_context_writer.Link(m_ephemeral_operation); diff --git a/src/core/hle/service/psc/time/service_manager.h b/src/core/hle/service/psc/time/service_manager.h index 09cff25038..a8b94d8939 100644 --- a/src/core/hle/service/psc/time/service_manager.h +++ b/src/core/hle/service/psc/time/service_manager.h @@ -65,6 +65,8 @@ private: void SetupSAndP(); Result GetStaticService(OutInterface out_service, StaticServiceSetupInfo setup_info, const char* name); + std::optional FindRequest(u32 key) override; + std::shared_ptr m_time; ServerManager& m_server_manager; bool m_is_s_and_p_setup{}; diff --git a/src/core/hle/service/psc/time/static.cpp b/src/core/hle/service/psc/time/static.cpp index 28cff3b764..2b2b6f1f04 100644 --- a/src/core/hle/service/psc/time/static.cpp +++ b/src/core/hle/service/psc/time/static.cpp @@ -33,6 +33,31 @@ constexpr Result GetTimeFromTimePointAndContext(s64* out_time, SteadyClockTimePo } } // namespace +std::optional StaticService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"}, + FunctionInfo{1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"}, + FunctionInfo{2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"}, + FunctionInfo{3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"}, + FunctionInfo{4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"}, + FunctionInfo{5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"}, + FunctionInfo{20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"}, + FunctionInfo{50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"}, + FunctionInfo{51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"}, + FunctionInfo{100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"}, + FunctionInfo{101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"}, + FunctionInfo{102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"}, + FunctionInfo{200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"}, + FunctionInfo{201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"}, + FunctionInfo{300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"}, + FunctionInfo{400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"}, + FunctionInfo{401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"}, + FunctionInfo{500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"}, + FunctionInfo{501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + StaticService::StaticService(Core::System& system_, StaticServiceSetupInfo setup_info, std::shared_ptr time, const char* name) : ServiceFramework{system_, name}, m_setup_info{setup_info}, m_time{time}, @@ -42,31 +67,6 @@ StaticService::StaticService(Core::System& system_, StaticServiceSetupInfo setup m_time_zone{m_time->m_time_zone}, m_ephemeral_network_clock{m_time->m_ephemeral_network_clock}, m_shared_memory{ m_time->m_shared_memory} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"}, - {1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"}, - {2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"}, - {3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"}, - {4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"}, - {5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"}, - {20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"}, - {50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"}, - {51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"}, - {100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"}, - {101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"}, - {102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"}, - {200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"}, - {201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"}, - {300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"}, - {400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"}, - {401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"}, - {500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"}, - {501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"}, - }; - // clang-format on - - RegisterHandlers(functions); } Result StaticService::GetStandardUserSystemClock(OutInterface out_service) { diff --git a/src/core/hle/service/psc/time/static.h b/src/core/hle/service/psc/time/static.h index 52659166f1..a86fec178f 100644 --- a/src/core/hle/service/psc/time/static.h +++ b/src/core/hle/service/psc/time/static.h @@ -71,6 +71,8 @@ private: Result GetClockSnapshotImpl(OutClockSnapshot out_snapshot, const SystemClockContext& user_context, const SystemClockContext& network_context, TimeType type); + std::optional FindRequest(u32 key) override; + StaticServiceSetupInfo m_setup_info; std::shared_ptr m_time; StandardLocalSystemClockCore& m_local_system_clock; diff --git a/src/core/hle/service/psc/time/steady_clock.cpp b/src/core/hle/service/psc/time/steady_clock.cpp index 1d1551acf9..3d138837d3 100644 --- a/src/core/hle/service/psc/time/steady_clock.cpp +++ b/src/core/hle/service/psc/time/steady_clock.cpp @@ -11,26 +11,26 @@ namespace Service::PSC::Time { +std::optional SteadyClock::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&SteadyClock::GetCurrentTimePoint>, "GetCurrentTimePoint"}, + FunctionInfo{2, D<&SteadyClock::GetTestOffset>, "GetTestOffset"}, + FunctionInfo{3, D<&SteadyClock::SetTestOffset>, "SetTestOffset"}, + FunctionInfo{100, D<&SteadyClock::GetRtcValue>, "GetRtcValue"}, + FunctionInfo{101, D<&SteadyClock::IsRtcResetDetected>, "IsRtcResetDetected"}, + FunctionInfo{102, D<&SteadyClock::GetSetupResultValue>, "GetSetupResultValue"}, + FunctionInfo{200, D<&SteadyClock::GetInternalOffset>, "GetInternalOffset"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + SteadyClock::SteadyClock(Core::System& system_, std::shared_ptr manager, bool can_write_steady_clock, bool can_write_uninitialized_clock) : ServiceFramework{system_, "ISteadyClock"} , m_clock_core{manager->m_standard_steady_clock} , m_can_write_steady_clock{can_write_steady_clock} , m_can_write_uninitialized_clock{can_write_uninitialized_clock} -{ - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&SteadyClock::GetCurrentTimePoint>, "GetCurrentTimePoint"}, - {2, D<&SteadyClock::GetTestOffset>, "GetTestOffset"}, - {3, D<&SteadyClock::SetTestOffset>, "SetTestOffset"}, - {100, D<&SteadyClock::GetRtcValue>, "GetRtcValue"}, - {101, D<&SteadyClock::IsRtcResetDetected>, "IsRtcResetDetected"}, - {102, D<&SteadyClock::GetSetupResultValue>, "GetSetupResultValue"}, - {200, D<&SteadyClock::GetInternalOffset>, "GetInternalOffset"}, - }; - // clang-format on - RegisterHandlers(functions); -} +{} Result SteadyClock::GetCurrentTimePoint(Out out_time_point) { SCOPE_EXIT { diff --git a/src/core/hle/service/psc/time/steady_clock.h b/src/core/hle/service/psc/time/steady_clock.h index 8d3d9a6280..e4de3e3717 100644 --- a/src/core/hle/service/psc/time/steady_clock.h +++ b/src/core/hle/service/psc/time/steady_clock.h @@ -34,6 +34,8 @@ public: Result GetSetupResultValue(Out out_result); Result GetInternalOffset(Out out_internal_offset); + std::optional FindRequest(u32 key) override; + private: StandardSteadyClockCore& m_clock_core; bool m_can_write_steady_clock; diff --git a/src/core/hle/service/psc/time/system_clock.cpp b/src/core/hle/service/psc/time/system_clock.cpp index e978ffb5e5..c08eca0b02 100644 --- a/src/core/hle/service/psc/time/system_clock.cpp +++ b/src/core/hle/service/psc/time/system_clock.cpp @@ -11,23 +11,23 @@ namespace Service::PSC::Time { +std::optional SystemClock::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&SystemClock::GetCurrentTime>, "GetCurrentTime"}, + FunctionInfo{1, D<&SystemClock::SetCurrentTime>, "SetCurrentTime"}, + FunctionInfo{2, D<&SystemClock::GetSystemClockContext>, "GetSystemClockContext"}, + FunctionInfo{3, D<&SystemClock::SetSystemClockContext>, "SetSystemClockContext"}, + FunctionInfo{4, D<&SystemClock::GetOperationEventReadableHandle>, "GetOperationEventReadableHandle"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + SystemClock::SystemClock(Core::System& system_, SystemClockCore& clock_core, bool can_write_clock, bool can_write_uninitialized_clock) : ServiceFramework{system_, "ISystemClock"} , m_clock_core{clock_core} , m_can_write_clock{can_write_clock} , m_can_write_uninitialized_clock{can_write_uninitialized_clock} -{ - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&SystemClock::GetCurrentTime>, "GetCurrentTime"}, - {1, D<&SystemClock::SetCurrentTime>, "SetCurrentTime"}, - {2, D<&SystemClock::GetSystemClockContext>, "GetSystemClockContext"}, - {3, D<&SystemClock::SetSystemClockContext>, "SetSystemClockContext"}, - {4, D<&SystemClock::GetOperationEventReadableHandle>, "GetOperationEventReadableHandle"}, - }; - // clang-format on - RegisterHandlers(functions); -} +{} Result SystemClock::GetCurrentTime(Out out_time) { SCOPE_EXIT { diff --git a/src/core/hle/service/psc/time/system_clock.h b/src/core/hle/service/psc/time/system_clock.h index 0d91aaa735..4f7d285d39 100644 --- a/src/core/hle/service/psc/time/system_clock.h +++ b/src/core/hle/service/psc/time/system_clock.h @@ -31,6 +31,7 @@ public: Result GetOperationEventReadableHandle(OutCopyHandle out_event); private: + std::optional FindRequest(u32 key) override; SystemClockCore& m_clock_core; bool m_can_write_clock; bool m_can_write_uninitialized_clock; diff --git a/src/core/hle/service/psc/time/time_zone_service.cpp b/src/core/hle/service/psc/time/time_zone_service.cpp index bd6bb3ba93..6a717846d3 100644 --- a/src/core/hle/service/psc/time/time_zone_service.cpp +++ b/src/core/hle/service/psc/time/time_zone_service.cpp @@ -13,33 +13,33 @@ namespace Service::PSC::Time { + std::optional TimeZoneService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"}, + FunctionInfo{1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"}, + FunctionInfo{2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"}, + FunctionInfo{3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"}, + FunctionInfo{4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"}, + FunctionInfo{5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"}, + FunctionInfo{6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"}, + FunctionInfo{7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"}, + FunctionInfo{8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"}, + FunctionInfo{20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"}, + FunctionInfo{100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"}, + FunctionInfo{101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"}, + FunctionInfo{201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"}, + FunctionInfo{202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"} + ); + return HandlerTableGenerateWithFind(key, functions); + } + TimeZoneService::TimeZoneService(Core::System& system_, StandardSteadyClockCore& clock_core, TimeZone& time_zone, bool can_write_timezone_device_location) : ServiceFramework{system_, "ITimeZoneService"} , m_clock_core{clock_core} , m_time_zone{time_zone} , m_can_write_timezone_device_location{can_write_timezone_device_location} -{ - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"}, - {1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"}, - {2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"}, - {3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"}, - {4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"}, - {5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"}, - {6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"}, - {7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"}, - {8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"}, - {20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"}, - {100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"}, - {101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"}, - {201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"}, - {202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"}, - }; - // clang-format on - RegisterHandlers(functions); -} +{} Result TimeZoneService::GetDeviceLocationName(Out out_location_name) { SCOPE_EXIT { diff --git a/src/core/hle/service/psc/time/time_zone_service.h b/src/core/hle/service/psc/time/time_zone_service.h index 0067b08258..fbb107f87c 100644 --- a/src/core/hle/service/psc/time/time_zone_service.h +++ b/src/core/hle/service/psc/time/time_zone_service.h @@ -59,6 +59,7 @@ public: const CalendarTime& calendar_time); private: + std::optional FindRequest(u32 key) override; StandardSteadyClockCore& m_clock_core; TimeZone& m_time_zone; bool m_can_write_timezone_device_location; diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp index 41d172b71b..5cad46f997 100644 --- a/src/core/hle/service/ptm/psm.cpp +++ b/src/core/hle/service/ptm/psm.cpp @@ -21,22 +21,15 @@ namespace Service::PTM { class IPsmSession final : public ServiceFramework { public: explicit IPsmSession(Core::System& system_) - : ServiceFramework{system_, "IPsmSession"}, service_context{system_, "IPsmSession"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IPsmSession::BindStateChangeEvent, "BindStateChangeEvent"}, - {1, &IPsmSession::UnbindStateChangeEvent, "UnbindStateChangeEvent"}, - {2, &IPsmSession::SetChargerTypeChangeEventEnabled, "SetChargerTypeChangeEventEnabled"}, - {3, &IPsmSession::SetPowerSupplyChangeEventEnabled, "SetPowerSupplyChangeEventEnabled"}, - {4, &IPsmSession::SetBatteryVoltageStateChangeEventEnabled, "SetBatteryVoltageStateChangeEventEnabled"}, - }; - // clang-format on - - RegisterHandlers(functions); - + : ServiceFramework{system_, "IPsmSession"} + , service_context{system_, "IPsmSession"} { state_change_event = service_context.CreateEvent("IPsmSession::state_change_event"); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + ~IPsmSession() override { service_context.CloseEvent(state_change_event); } @@ -112,8 +105,15 @@ private: rb.Push(ResultSuccess); } - KernelHelpers::ServiceContext service_context; + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IPsmSession::BindStateChangeEvent, "BindStateChangeEvent"}, + FunctionInfo{1, &IPsmSession::UnbindStateChangeEvent, "UnbindStateChangeEvent"}, + FunctionInfo{2, &IPsmSession::SetChargerTypeChangeEventEnabled, "SetChargerTypeChangeEventEnabled"}, + FunctionInfo{3, &IPsmSession::SetPowerSupplyChangeEventEnabled, "SetPowerSupplyChangeEventEnabled"}, + FunctionInfo{4, &IPsmSession::SetBatteryVoltageStateChangeEventEnabled, "SetBatteryVoltageStateChangeEventEnabled"} + ); + KernelHelpers::ServiceContext service_context; bool should_signal_charger_type{}; bool should_signal_power_supply{}; bool should_signal_battery_voltage{}; @@ -122,31 +122,6 @@ private: }; PSM::PSM(Core::System& system_) : ServiceFramework{system_, "psm"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &PSM::GetBatteryChargePercentage, "GetBatteryChargePercentage"}, - {1, &PSM::GetChargerType, "GetChargerType"}, - {2, nullptr, "EnableBatteryCharging"}, - {3, nullptr, "DisableBatteryCharging"}, - {4, nullptr, "IsBatteryChargingEnabled"}, - {5, nullptr, "AcquireControllerPowerSupply"}, - {6, nullptr, "ReleaseControllerPowerSupply"}, - {7, &PSM::OpenSession, "OpenSession"}, - {8, nullptr, "EnableEnoughPowerChargeEmulation"}, - {9, nullptr, "DisableEnoughPowerChargeEmulation"}, - {10, nullptr, "EnableFastBatteryCharging"}, - {11, nullptr, "DisableFastBatteryCharging"}, - {12, &PSM::GetBatteryVoltageState, "GetBatteryVoltageState"}, - {13, nullptr, "GetRawBatteryChargePercentage"}, - {14, nullptr, "IsEnoughPowerSupplied"}, - {15, &PSM::GetBatteryAgePercentage, "GetBatteryAgePercentage"}, - {16, nullptr, "GetBatteryChargeInfoEvent"}, - {17, &PSM::GetBatteryChargeInfoFields, "GetBatteryChargeInfoFields"}, - {18, nullptr, "GetBatteryChargeCalibratedEvent"}, - }; - // clang-format on - - RegisterHandlers(functions); } PSM::~PSM() = default; diff --git a/src/core/hle/service/ptm/psm.h b/src/core/hle/service/ptm/psm.h index 77c38d1f9b..fe77b23d79 100644 --- a/src/core/hle/service/ptm/psm.h +++ b/src/core/hle/service/ptm/psm.h @@ -28,6 +28,31 @@ private: void GetBatteryVoltageState(HLERequestContext& ctx); void GetBatteryAgePercentage(HLERequestContext& ctx); void GetBatteryChargeInfoFields(HLERequestContext& ctx); + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &PSM::GetBatteryChargePercentage, "GetBatteryChargePercentage"}, + FunctionInfo{1, &PSM::GetChargerType, "GetChargerType"}, + FunctionInfo{2, nullptr, "EnableBatteryCharging"}, + FunctionInfo{3, nullptr, "DisableBatteryCharging"}, + FunctionInfo{4, nullptr, "IsBatteryChargingEnabled"}, + FunctionInfo{5, nullptr, "AcquireControllerPowerSupply"}, + FunctionInfo{6, nullptr, "ReleaseControllerPowerSupply"}, + FunctionInfo{7, &PSM::OpenSession, "OpenSession"}, + FunctionInfo{8, nullptr, "EnableEnoughPowerChargeEmulation"}, + FunctionInfo{9, nullptr, "DisableEnoughPowerChargeEmulation"}, + FunctionInfo{10, nullptr, "EnableFastBatteryCharging"}, + FunctionInfo{11, nullptr, "DisableFastBatteryCharging"}, + FunctionInfo{12, &PSM::GetBatteryVoltageState, "GetBatteryVoltageState"}, + FunctionInfo{13, nullptr, "GetRawBatteryChargePercentage"}, + FunctionInfo{14, nullptr, "IsEnoughPowerSupplied"}, + FunctionInfo{15, &PSM::GetBatteryAgePercentage, "GetBatteryAgePercentage"}, + FunctionInfo{16, nullptr, "GetBatteryChargeInfoEvent"}, + FunctionInfo{17, &PSM::GetBatteryChargeInfoFields, "GetBatteryChargeInfoFields"}, + FunctionInfo{18, nullptr, "GetBatteryChargeCalibratedEvent"} + ); }; } // namespace Service::PTM diff --git a/src/core/hle/service/ptm/ptm.cpp b/src/core/hle/service/ptm/ptm.cpp index de1d34a688..ad474ec411 100644 --- a/src/core/hle/service/ptm/ptm.cpp +++ b/src/core/hle/service/ptm/ptm.cpp @@ -17,28 +17,28 @@ namespace Service::PTM { class PSM_MANU final : public ServiceFramework { public: explicit PSM_MANU(Core::System& system_) - : ServiceFramework{system_, "psm:manu"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "EnableVdd50StateControl"}, - {1, nullptr, "DisableVdd50StateControl"}, - {2, nullptr, "SetVdd50State"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "psm:manu"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "EnableVdd50StateControl"}, + FunctionInfo{1, nullptr, "DisableVdd50StateControl"}, + FunctionInfo{2, nullptr, "SetVdd50State"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class POWCTL final : public ServiceFramework { public: explicit POWCTL(Core::System& system_) - : ServiceFramework{system_, "powctl"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "OpenSession"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "powctl"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "OpenSession"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/ptm/ts.cpp b/src/core/hle/service/ptm/ts.cpp index b1ac0c8f11..f22ff2ec69 100644 --- a/src/core/hle/service/ptm/ts.cpp +++ b/src/core/hle/service/ptm/ts.cpp @@ -19,16 +19,10 @@ enum class Location : u8 { class ISession : public ServiceFramework { public: - explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetTemperatureRange"}, - {2, nullptr, "SetMeasurementMode"}, - {4, &ISession::GetTemperature, "GetTemperature"}, - }; - // clang-format on + explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -39,20 +33,15 @@ private: rb.Push(ResultSuccess); rb.Push(temperature); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetTemperatureRange"}, + FunctionInfo{2, nullptr, "SetMeasurementMode"}, + FunctionInfo{4, &ISession::GetTemperature, "GetTemperature"} + ); }; TS::TS(Core::System& system_) : ServiceFramework{system_, "ts"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetTemperatureRange"}, - {1, &TS::GetTemperature, "GetTemperature"}, - {2, nullptr, "SetMeasurementMode"}, - {3, &TS::GetTemperatureMilliC, "GetTemperatureMilliC"}, - {4, &TS::OpenSession, "OpenSession"}, - }; - // clang-format on - - RegisterHandlers(functions); } TS::~TS() = default; diff --git a/src/core/hle/service/ptm/ts.h b/src/core/hle/service/ptm/ts.h index a10a91a64b..21f3ac2b70 100644 --- a/src/core/hle/service/ptm/ts.h +++ b/src/core/hle/service/ptm/ts.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -17,6 +20,17 @@ private: void GetTemperature(HLERequestContext& ctx); void GetTemperatureMilliC(HLERequestContext& ctx); void OpenSession(HLERequestContext& ctx); + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetTemperatureRange"}, + FunctionInfo{1, &TS::GetTemperature, "GetTemperature"}, + FunctionInfo{2, nullptr, "SetMeasurementMode"}, + FunctionInfo{3, &TS::GetTemperatureMilliC, "GetTemperatureMilliC"}, + FunctionInfo{4, &TS::OpenSession, "OpenSession"} + ); }; } // namespace Service::PTM diff --git a/src/core/hle/service/ro/ro.cpp b/src/core/hle/service/ro/ro.cpp index 167bf04c9a..838ff136f6 100644 --- a/src/core/hle/service/ro/ro.cpp +++ b/src/core/hle/service/ro/ro.cpp @@ -8,21 +8,334 @@ #include #include "core/hle/kernel/k_process.h" - -#include "core/hle/service/cmif_serialization.h" #include "core/hle/service/ro/ro.h" -#include "core/hle/service/ro/ro_nro_utils.h" -#include "core/hle/service/ro/ro_results.h" -#include "core/hle/service/ro/ro_types.h" #include "core/hle/service/server_manager.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 +#include "core/hle/service/cmif_serialization.h" namespace Service::RO { +constexpr Result ResultOutOfAddressSpace{ErrorModule::RO, 2}; +constexpr Result ResultAlreadyLoaded{ErrorModule::RO, 3}; +constexpr Result ResultInvalidNro{ErrorModule::RO, 4}; +constexpr Result ResultInvalidNrr{ErrorModule::RO, 6}; +constexpr Result ResultTooManyNro{ErrorModule::RO, 7}; +constexpr Result ResultTooManyNrr{ErrorModule::RO, 8}; +constexpr Result ResultNotAuthorized{ErrorModule::RO, 9}; +constexpr Result ResultInvalidNrrKind{ErrorModule::RO, 10}; +constexpr Result ResultInternalError{ErrorModule::RO, 1023}; +constexpr Result ResultInvalidAddress{ErrorModule::RO, 1025}; +constexpr Result ResultInvalidSize{ErrorModule::RO, 1026}; +constexpr Result ResultNotLoaded{ErrorModule::RO, 1028}; +constexpr Result ResultNotRegistered{ErrorModule::RO, 1029}; +constexpr Result ResultInvalidSession{ErrorModule::RO, 1030}; +constexpr Result ResultInvalidProcess{ErrorModule::RO, 1031}; + +namespace { + +struct ProcessMemoryRegion { + u64 address; + u64 size; +}; + +size_t GetTotalProcessMemoryRegionSize(const ProcessMemoryRegion* regions, size_t num_regions) { + size_t total = 0; + + for (size_t i = 0; i < num_regions; ++i) { + total += regions[i].size; + } + + return total; +} + +size_t SetupNroProcessMemoryRegions(ProcessMemoryRegion* regions, u64 nro_heap_address, + u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) { + // Reset region count. + size_t num_regions = 0; + + // We always want a region for the nro. + regions[num_regions++] = {nro_heap_address, nro_heap_size}; + + // If we have bss, create a region for bss. + if (bss_heap_size > 0) { + regions[num_regions++] = {bss_heap_address, bss_heap_size}; + } + + return num_regions; +} + +Result SetProcessMemoryPermission(Kernel::KProcess* process, u64 address, u64 size, + Kernel::Svc::MemoryPermission permission) { + auto& page_table = process->GetPageTable(); + + // Set permission. + R_RETURN(page_table.SetProcessMemoryPermission(address, size, permission)); +} + +Result UnmapProcessCodeMemory(Kernel::KProcess* process, u64 process_code_address, + const ProcessMemoryRegion* regions, size_t num_regions) { + // Get the total process memory region size. + const size_t total_size = GetTotalProcessMemoryRegionSize(regions, num_regions); + + auto& page_table = process->GetPageTable(); + + // Unmap each region in order. + size_t cur_offset = total_size; + for (size_t i = 0; i < num_regions; ++i) { + // We want to unmap in reverse order. + const auto& cur_region = regions[num_regions - 1 - i]; + + // Subtract to update the current offset. + cur_offset -= cur_region.size; + + // Unmap. + R_TRY(page_table.UnmapCodeMemory(process_code_address + cur_offset, cur_region.address, + cur_region.size)); + } + + R_SUCCEED(); +} + +Result EnsureGuardPages(Kernel::KProcessPageTable& page_table, u64 map_address, u64 map_size) { + Kernel::KMemoryInfo memory_info; + Kernel::Svc::PageInfo page_info; + + // Ensure page before mapping is unmapped. + R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info), + map_address - 1)); + R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free, + Kernel::ResultInvalidState); + + // Ensure page after mapping is unmapped. + R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info), + map_address + map_size)); + R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free, + Kernel::ResultInvalidState); + + // Successfully verified guard pages. + R_SUCCEED(); +} + +Result MapProcessCodeMemory(u64* out, Kernel::KProcess* process, const ProcessMemoryRegion* regions, + size_t num_regions, std::mt19937_64& generate_random) { + auto& page_table = process->GetPageTable(); + const u64 alias_code_start = + GetInteger(page_table.GetAliasCodeRegionStart()) / Kernel::PageSize; + const u64 alias_code_size = page_table.GetAliasCodeRegionSize() / Kernel::PageSize; + + for (size_t trial = 0; trial < 64; trial++) { + // Generate a new trial address. + const u64 mapped_address = + (alias_code_start + (generate_random() % alias_code_size)) * Kernel::PageSize; + + const auto MapRegions = [&] { + // Map the regions in order. + u64 mapped_size = 0; + for (size_t i = 0; i < num_regions; ++i) { + // If we fail, unmap up to where we've mapped. + ON_RESULT_FAILURE { + R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, i)); + }; + + // Map the current region. + R_TRY(page_table.MapCodeMemory(mapped_address + mapped_size, regions[i].address, + regions[i].size)); + + mapped_size += regions[i].size; + } + + // If we fail, unmap all mapped regions. + ON_RESULT_FAILURE { + R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, num_regions)); + }; + + // Ensure guard pages. + R_RETURN(EnsureGuardPages(page_table, mapped_address, mapped_size)); + }; + + if (R_SUCCEEDED(MapRegions())) { + // Set the output address. + *out = mapped_address; + R_SUCCEED(); + } + } + + // We failed to map anything. + R_THROW(RO::ResultOutOfAddressSpace); +} + +Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address, + u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size, + std::mt19937_64& generate_random) { + // Set up the process memory regions. + std::array regions{}; + const size_t num_regions = SetupNroProcessMemoryRegions( + regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size); + + // Re-map the nro/bss as code memory in the destination process. + R_RETURN(MapProcessCodeMemory(out_base_address, process, regions.data(), num_regions, + generate_random)); +} + +Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size, + u64 rw_size) { + const u64 rx_offset = 0; + const u64 ro_offset = rx_offset + rx_size; + const u64 rw_offset = ro_offset + ro_size; + + R_TRY(SetProcessMemoryPermission(process, base_address + rx_offset, rx_size, + Kernel::Svc::MemoryPermission::ReadExecute)); + R_TRY(SetProcessMemoryPermission(process, base_address + ro_offset, ro_size, + Kernel::Svc::MemoryPermission::Read)); + R_TRY(SetProcessMemoryPermission(process, base_address + rw_offset, rw_size, + Kernel::Svc::MemoryPermission::ReadWrite)); + + R_SUCCEED(); +} + +Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address, + u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) { + // Set up the process memory regions. + std::array regions{}; + const size_t num_regions = SetupNroProcessMemoryRegions( + regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size); + + // Unmap the nro/bss. + R_RETURN(UnmapProcessCodeMemory(process, base_address, regions.data(), num_regions)); +} + +} // namespace + +enum class NrrKind : u8 { + User = 0, + JitPlugin = 1, + Count, +}; + +static constexpr size_t ModuleIdSize = 0x20; +struct ModuleId { + std::array data; +}; +static_assert(sizeof(ModuleId) == ModuleIdSize); + +struct NrrCertification { + static constexpr size_t RsaKeySize = 0x100; + static constexpr size_t SignedSize = 0x120; + + u64 program_id_mask; + u64 program_id_pattern; + std::array reserved_10; + std::array modulus; + std::array signature; +}; +static_assert(sizeof(NrrCertification) == NrrCertification::RsaKeySize + NrrCertification::SignedSize); + +class NrrHeader { +public: + static constexpr u32 Magic = Common::MakeMagic('N', 'R', 'R', '0'); + +public: + bool IsMagicValid() const { + return m_magic == Magic; + } + + bool IsProgramIdValid() const { + return (m_program_id & m_certification.program_id_mask) == + m_certification.program_id_pattern; + } + + NrrKind GetNrrKind() const { + const NrrKind kind = static_cast(m_nrr_kind); + ASSERT(kind < NrrKind::Count); + return kind; + } + + u64 GetProgramId() const { + return m_program_id; + } + + u32 GetSize() const { + return m_size; + } + + u32 GetNumHashes() const { + return m_num_hashes; + } + + size_t GetHashesOffset() const { + return m_hashes_offset; + } + + u32 GetKeyGeneration() const { + return m_key_generation; + } + + const u8* GetCertificationSignature() const { + return m_certification.signature.data(); + } + + const u8* GetCertificationSignedArea() const { + return reinterpret_cast(std::addressof(m_certification)); + } + + const u8* GetCertificationModulus() const { + return m_certification.modulus.data(); + } + + const u8* GetSignature() const { + return m_signature.data(); + } + + size_t GetSignedAreaSize() const { + return m_size - GetSignedAreaOffset(); + } + + static constexpr size_t GetSignedAreaOffset() { + return offsetof(NrrHeader, m_program_id); + } + +private: + u32 m_magic; + u32 m_key_generation; + INSERT_PADDING_BYTES_NOINIT(8); + NrrCertification m_certification; + std::array m_signature; + u64 m_program_id; + u32 m_size; + u8 m_nrr_kind; // 7.0.0+ + INSERT_PADDING_BYTES_NOINIT(3); + u32 m_hashes_offset; + u32 m_num_hashes; + INSERT_PADDING_BYTES_NOINIT(8); +}; +static_assert(sizeof(NrrHeader) == 0x350, "NrrHeader has wrong size"); + +static constexpr u32 NRO_HEADER_MAGIC = Common::MakeMagic('N', 'R', 'O', '0'); +struct NroHeader { + u32 m_entrypoint_insn; + u32 m_mod_offset; + INSERT_PADDING_BYTES_NOINIT(0x8); + u32 m_magic; + INSERT_PADDING_BYTES_NOINIT(0x4); + u32 m_size; + INSERT_PADDING_BYTES_NOINIT(0x4); + u32 m_text_offset; + u32 m_text_size; + u32 m_ro_offset; + u32 m_ro_size; + u32 m_rw_offset; + u32 m_rw_size; + u32 m_bss_size; + INSERT_PADDING_BYTES_NOINIT(0x4); + ModuleId m_module_id; + INSERT_PADDING_BYTES_NOINIT(0x20); +}; +static_assert(sizeof(NroHeader) == 0x80, "NroHeader has wrong size"); + namespace { // Atmosphere defines as follows: @@ -535,29 +848,21 @@ private: class RoInterface : public ServiceFramework { public: - explicit RoInterface(Core::System& system_, const char* name_, std::shared_ptr ro, - NrrKind nrr_kind) - : ServiceFramework{system_, name_}, m_ro(ro), m_context_id(InvalidContextId), - m_nrr_kind(nrr_kind) { - - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&RoInterface::MapManualLoadModuleMemory>, "MapManualLoadModuleMemory"}, - {1, C<&RoInterface::UnmapManualLoadModuleMemory>, "UnmapManualLoadModuleMemory"}, - {2, C<&RoInterface::RegisterModuleInfo>, "RegisterModuleInfo"}, - {3, C<&RoInterface::UnregisterModuleInfo>, "UnregisterModuleInfo"}, - {4, C<&RoInterface::RegisterProcessHandle>, "RegisterProcessHandle"}, - {10, C<&RoInterface::RegisterProcessModuleInfo>, "RegisterProcessModuleInfo"}, - }; - // clang-format on - - RegisterHandlers(functions); - } + explicit RoInterface(Core::System& system_, const char* name_, std::shared_ptr ro, NrrKind nrr_kind) + : ServiceFramework{system_, name_} + , m_ro(ro) + , m_context_id(InvalidContextId) + , m_nrr_kind(nrr_kind) + {} ~RoInterface() { m_ro->UnregisterProcess(system.Kernel(), m_context_id); } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + Result MapManualLoadModuleMemory(Out out_load_address, ClientProcessId client_pid, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) { R_TRY(m_ro->ValidateProcess(m_context_id, *client_pid)); @@ -594,6 +899,14 @@ public: } private: + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&RoInterface::MapManualLoadModuleMemory>, "MapManualLoadModuleMemory"}, + FunctionInfo{1, C<&RoInterface::UnmapManualLoadModuleMemory>, "UnmapManualLoadModuleMemory"}, + FunctionInfo{2, C<&RoInterface::RegisterModuleInfo>, "RegisterModuleInfo"}, + FunctionInfo{3, C<&RoInterface::UnregisterModuleInfo>, "UnregisterModuleInfo"}, + FunctionInfo{4, C<&RoInterface::RegisterProcessHandle>, "RegisterProcessHandle"}, + FunctionInfo{10, C<&RoInterface::RegisterProcessModuleInfo>, "RegisterProcessModuleInfo"} + ); std::shared_ptr m_ro{}; size_t m_context_id{}; NrrKind m_nrr_kind{}; @@ -606,12 +919,14 @@ class IDebugMonitorInterface final : public ServiceFramework FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetProcessModuleInfo" } + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/ro/ro_nro_utils.cpp b/src/core/hle/service/ro/ro_nro_utils.cpp deleted file mode 100644 index 268c7f93e7..0000000000 --- a/src/core/hle/service/ro/ro_nro_utils.cpp +++ /dev/null @@ -1,185 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "core/hle/kernel/k_process.h" -#include "core/hle/service/ro/ro_nro_utils.h" -#include "core/hle/service/ro/ro_results.h" - -namespace Service::RO { - -namespace { - -struct ProcessMemoryRegion { - u64 address; - u64 size; -}; - -size_t GetTotalProcessMemoryRegionSize(const ProcessMemoryRegion* regions, size_t num_regions) { - size_t total = 0; - - for (size_t i = 0; i < num_regions; ++i) { - total += regions[i].size; - } - - return total; -} - -size_t SetupNroProcessMemoryRegions(ProcessMemoryRegion* regions, u64 nro_heap_address, - u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) { - // Reset region count. - size_t num_regions = 0; - - // We always want a region for the nro. - regions[num_regions++] = {nro_heap_address, nro_heap_size}; - - // If we have bss, create a region for bss. - if (bss_heap_size > 0) { - regions[num_regions++] = {bss_heap_address, bss_heap_size}; - } - - return num_regions; -} - -Result SetProcessMemoryPermission(Kernel::KProcess* process, u64 address, u64 size, - Kernel::Svc::MemoryPermission permission) { - auto& page_table = process->GetPageTable(); - - // Set permission. - R_RETURN(page_table.SetProcessMemoryPermission(address, size, permission)); -} - -Result UnmapProcessCodeMemory(Kernel::KProcess* process, u64 process_code_address, - const ProcessMemoryRegion* regions, size_t num_regions) { - // Get the total process memory region size. - const size_t total_size = GetTotalProcessMemoryRegionSize(regions, num_regions); - - auto& page_table = process->GetPageTable(); - - // Unmap each region in order. - size_t cur_offset = total_size; - for (size_t i = 0; i < num_regions; ++i) { - // We want to unmap in reverse order. - const auto& cur_region = regions[num_regions - 1 - i]; - - // Subtract to update the current offset. - cur_offset -= cur_region.size; - - // Unmap. - R_TRY(page_table.UnmapCodeMemory(process_code_address + cur_offset, cur_region.address, - cur_region.size)); - } - - R_SUCCEED(); -} - -Result EnsureGuardPages(Kernel::KProcessPageTable& page_table, u64 map_address, u64 map_size) { - Kernel::KMemoryInfo memory_info; - Kernel::Svc::PageInfo page_info; - - // Ensure page before mapping is unmapped. - R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info), - map_address - 1)); - R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free, - Kernel::ResultInvalidState); - - // Ensure page after mapping is unmapped. - R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info), - map_address + map_size)); - R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free, - Kernel::ResultInvalidState); - - // Successfully verified guard pages. - R_SUCCEED(); -} - -Result MapProcessCodeMemory(u64* out, Kernel::KProcess* process, const ProcessMemoryRegion* regions, - size_t num_regions, std::mt19937_64& generate_random) { - auto& page_table = process->GetPageTable(); - const u64 alias_code_start = - GetInteger(page_table.GetAliasCodeRegionStart()) / Kernel::PageSize; - const u64 alias_code_size = page_table.GetAliasCodeRegionSize() / Kernel::PageSize; - - for (size_t trial = 0; trial < 64; trial++) { - // Generate a new trial address. - const u64 mapped_address = - (alias_code_start + (generate_random() % alias_code_size)) * Kernel::PageSize; - - const auto MapRegions = [&] { - // Map the regions in order. - u64 mapped_size = 0; - for (size_t i = 0; i < num_regions; ++i) { - // If we fail, unmap up to where we've mapped. - ON_RESULT_FAILURE { - R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, i)); - }; - - // Map the current region. - R_TRY(page_table.MapCodeMemory(mapped_address + mapped_size, regions[i].address, - regions[i].size)); - - mapped_size += regions[i].size; - } - - // If we fail, unmap all mapped regions. - ON_RESULT_FAILURE { - R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, num_regions)); - }; - - // Ensure guard pages. - R_RETURN(EnsureGuardPages(page_table, mapped_address, mapped_size)); - }; - - if (R_SUCCEEDED(MapRegions())) { - // Set the output address. - *out = mapped_address; - R_SUCCEED(); - } - } - - // We failed to map anything. - R_THROW(RO::ResultOutOfAddressSpace); -} - -} // namespace - -Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address, - u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size, - std::mt19937_64& generate_random) { - // Set up the process memory regions. - std::array regions{}; - const size_t num_regions = SetupNroProcessMemoryRegions( - regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size); - - // Re-map the nro/bss as code memory in the destination process. - R_RETURN(MapProcessCodeMemory(out_base_address, process, regions.data(), num_regions, - generate_random)); -} - -Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size, - u64 rw_size) { - const u64 rx_offset = 0; - const u64 ro_offset = rx_offset + rx_size; - const u64 rw_offset = ro_offset + ro_size; - - R_TRY(SetProcessMemoryPermission(process, base_address + rx_offset, rx_size, - Kernel::Svc::MemoryPermission::ReadExecute)); - R_TRY(SetProcessMemoryPermission(process, base_address + ro_offset, ro_size, - Kernel::Svc::MemoryPermission::Read)); - R_TRY(SetProcessMemoryPermission(process, base_address + rw_offset, rw_size, - Kernel::Svc::MemoryPermission::ReadWrite)); - - R_SUCCEED(); -} - -Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address, - u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) { - // Set up the process memory regions. - std::array regions{}; - const size_t num_regions = SetupNroProcessMemoryRegions( - regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size); - - // Unmap the nro/bss. - R_RETURN(UnmapProcessCodeMemory(process, base_address, regions.data(), num_regions)); -} - -} // namespace Service::RO diff --git a/src/core/hle/service/ro/ro_nro_utils.h b/src/core/hle/service/ro/ro_nro_utils.h deleted file mode 100644 index f7083a1ba3..0000000000 --- a/src/core/hle/service/ro/ro_nro_utils.h +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include - -#include "common/common_types.h" - -namespace Kernel { -class KProcess; -} - -union Result; - -namespace Service::RO { - -Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address, - u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size, - std::mt19937_64& generate_random); -Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size, - u64 rw_size); -Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address, - u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size); - -} // namespace Service::RO diff --git a/src/core/hle/service/ro/ro_results.h b/src/core/hle/service/ro/ro_results.h deleted file mode 100644 index 906378bc7f..0000000000 --- a/src/core/hle/service/ro/ro_results.h +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 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 - -#pragma once - -#include "core/hle/result.h" - -namespace Service::RO { - -constexpr Result ResultOutOfAddressSpace{ErrorModule::RO, 2}; -constexpr Result ResultAlreadyLoaded{ErrorModule::RO, 3}; -constexpr Result ResultInvalidNro{ErrorModule::RO, 4}; -constexpr Result ResultInvalidNrr{ErrorModule::RO, 6}; -constexpr Result ResultTooManyNro{ErrorModule::RO, 7}; -constexpr Result ResultTooManyNrr{ErrorModule::RO, 8}; -constexpr Result ResultNotAuthorized{ErrorModule::RO, 9}; -constexpr Result ResultInvalidNrrKind{ErrorModule::RO, 10}; -constexpr Result ResultInternalError{ErrorModule::RO, 1023}; -constexpr Result ResultInvalidAddress{ErrorModule::RO, 1025}; -constexpr Result ResultInvalidSize{ErrorModule::RO, 1026}; -constexpr Result ResultNotLoaded{ErrorModule::RO, 1028}; -constexpr Result ResultNotRegistered{ErrorModule::RO, 1029}; -constexpr Result ResultInvalidSession{ErrorModule::RO, 1030}; -constexpr Result ResultInvalidProcess{ErrorModule::RO, 1031}; - -} // namespace Service::RO diff --git a/src/core/hle/service/ro/ro_types.h b/src/core/hle/service/ro/ro_types.h deleted file mode 100644 index 8e88f43246..0000000000 --- a/src/core/hle/service/ro/ro_types.h +++ /dev/null @@ -1,142 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 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 - -#pragma once - -#include "common/assert.h" -#include "common/common_funcs.h" -#include "common/common_types.h" - -namespace Service::RO { - -enum class NrrKind : u8 { - User = 0, - JitPlugin = 1, - Count, -}; - -static constexpr size_t ModuleIdSize = 0x20; -struct ModuleId { - std::array data; -}; -static_assert(sizeof(ModuleId) == ModuleIdSize); - -struct NrrCertification { - static constexpr size_t RsaKeySize = 0x100; - static constexpr size_t SignedSize = 0x120; - - u64 program_id_mask; - u64 program_id_pattern; - std::array reserved_10; - std::array modulus; - std::array signature; -}; -static_assert(sizeof(NrrCertification) == - NrrCertification::RsaKeySize + NrrCertification::SignedSize); - -class NrrHeader { -public: - static constexpr u32 Magic = Common::MakeMagic('N', 'R', 'R', '0'); - -public: - bool IsMagicValid() const { - return m_magic == Magic; - } - - bool IsProgramIdValid() const { - return (m_program_id & m_certification.program_id_mask) == - m_certification.program_id_pattern; - } - - NrrKind GetNrrKind() const { - const NrrKind kind = static_cast(m_nrr_kind); - ASSERT(kind < NrrKind::Count); - return kind; - } - - u64 GetProgramId() const { - return m_program_id; - } - - u32 GetSize() const { - return m_size; - } - - u32 GetNumHashes() const { - return m_num_hashes; - } - - size_t GetHashesOffset() const { - return m_hashes_offset; - } - - u32 GetKeyGeneration() const { - return m_key_generation; - } - - const u8* GetCertificationSignature() const { - return m_certification.signature.data(); - } - - const u8* GetCertificationSignedArea() const { - return reinterpret_cast(std::addressof(m_certification)); - } - - const u8* GetCertificationModulus() const { - return m_certification.modulus.data(); - } - - const u8* GetSignature() const { - return m_signature.data(); - } - - size_t GetSignedAreaSize() const { - return m_size - GetSignedAreaOffset(); - } - - static constexpr size_t GetSignedAreaOffset() { - return offsetof(NrrHeader, m_program_id); - } - -private: - u32 m_magic; - u32 m_key_generation; - INSERT_PADDING_BYTES_NOINIT(8); - NrrCertification m_certification; - std::array m_signature; - u64 m_program_id; - u32 m_size; - u8 m_nrr_kind; // 7.0.0+ - INSERT_PADDING_BYTES_NOINIT(3); - u32 m_hashes_offset; - u32 m_num_hashes; - INSERT_PADDING_BYTES_NOINIT(8); -}; -static_assert(sizeof(NrrHeader) == 0x350, "NrrHeader has wrong size"); - -static constexpr u32 NRO_HEADER_MAGIC = Common::MakeMagic('N', 'R', 'O', '0'); -struct NroHeader { - u32 m_entrypoint_insn; - u32 m_mod_offset; - INSERT_PADDING_BYTES_NOINIT(0x8); - u32 m_magic; - INSERT_PADDING_BYTES_NOINIT(0x4); - u32 m_size; - INSERT_PADDING_BYTES_NOINIT(0x4); - u32 m_text_offset; - u32 m_text_size; - u32 m_ro_offset; - u32 m_ro_size; - u32 m_rw_offset; - u32 m_rw_size; - u32 m_bss_size; - INSERT_PADDING_BYTES_NOINIT(0x4); - ModuleId m_module_id; - INSERT_PADDING_BYTES_NOINIT(0x20); -}; -static_assert(sizeof(NroHeader) == 0x80, "NroHeader has wrong size"); - -} // namespace Service::RO diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 225b92a783..2c6e8d1c07 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -19,6 +19,7 @@ #include "core/hle/service/service.h" #include "core/hle/service/sm/sm.h" #include "core/reporter.h" +#include "frontend_common/firmware_manager.h" namespace Service { @@ -47,24 +48,9 @@ ServiceFrameworkBase::~ServiceFrameworkBase() { const auto guard = ServiceFrameworkBase::LockService(); } -void ServiceFrameworkBase::RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n) { - // Usually this array is sorted by id already, so hint to insert at the end - handlers.reserve(handlers.size() + n); - for (std::size_t i = 0; i < n; ++i) - handlers.emplace_hint(handlers.cend(), functions[i].expected_header, functions[i]); -} - -void ServiceFrameworkBase::RegisterHandlersBaseTipc(const FunctionInfoBase* functions, std::size_t n) { - // Usually this array is sorted by id already, so hint to insert at the end - handlers_tipc.reserve(handlers_tipc.size() + n); - for (std::size_t i = 0; i < n; ++i) - handlers_tipc.emplace_hint(handlers_tipc.cend(), functions[i].expected_header, functions[i]); -} - -void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, - const FunctionInfoBase* info) { +void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info, bool gated) { auto cmd_buf = ctx.CommandBuffer(); - std::string function_name = info == nullptr ? "" : info->name; + std::string function_name = bool(info) ? info->name : ""; fmt::memory_buffer buf; fmt::format_to(std::back_inserter(buf), "function '{}({})': port='{}' cmd_buf={{[0]={:#x}", ctx.GetCommand(), function_name, service_name, cmd_buf[0]); @@ -73,7 +59,11 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, buf.push_back('}'); system.GetReporter().SaveUnimplementedFunctionReport(ctx, ctx.GetCommand(), function_name, service_name); - UNIMPLEMENTED_MSG("Unknown / unimplemented {}", fmt::to_string(buf)); + if (gated) { + LOG_ERROR(Service, "Version gated {}", fmt::to_string(buf)); + } else { + UNIMPLEMENTED_MSG("Unknown / unimplemented {}", fmt::to_string(buf)); + } if (Settings::values.use_auto_stub) { LOG_WARNING(Service, "Using auto stub fallback!"); IPC::ResponseBuilder rb{ctx, 2}; @@ -81,17 +71,33 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, } } +[[nodiscard]] static bool VersionGateCheck(Core::System& system, u32 vg) { + u32 const c_maj = FirmwareManager::GetFirmwareVersion(system).first.major; + u32 const c_min = FirmwareManager::GetFirmwareVersion(system).first.minor; + u32 const c_pat = FirmwareManager::GetFirmwareVersion(system).first.micro; + u32 const cg = (c_pat << 0) | (c_min << 4) | (c_maj << 8); + u32 const sg = (vg >> 16) & 0xffff; + u32 const ug = vg & 0xffff; + // feature available after current + if (sg && cg < sg) + return false; + // feature until xxx (0 = up to current) + return ug ? ug >= cg : true; +} + void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) { - const auto command = ctx.GetCommand(); - auto it = handlers.find(command); - const bool is_cmd_read = command == 0; - FunctionInfoBase const* info = it == handlers.end() ? nullptr : &it->second; - if (info == nullptr || info->handler_callback == nullptr) - return ReportUnimplementedFunction(ctx, info); + const bool is_cmd_read = ctx.GetCommand() == 0; + auto const info = FindRequest(ctx.GetCommand()); + if (!info.has_value() || info->handler_callback == nullptr) + return ReportUnimplementedFunction(ctx, &*info, false); + + if (!VersionGateCheck(system, info->version_gating)) + { + return ReportUnimplementedFunction(ctx, &*info, true); + } LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer())); handler_invoker(this, info->handler_callback, ctx); - if (is_i_storage && is_cmd_read) { const auto* const process = ctx.GetThread().GetOwnerProcess(); if (process != nullptr && system.IsNVDECActiveForProcess(process->GetId())) { @@ -101,10 +107,15 @@ void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) { } void ServiceFrameworkBase::InvokeRequestTipc(HLERequestContext& ctx) { - auto it = handlers_tipc.find(ctx.GetCommand()); - FunctionInfoBase const* info = it == handlers_tipc.end() ? nullptr : &it->second; - if (info == nullptr || info->handler_callback == nullptr) - return ReportUnimplementedFunction(ctx, info); + auto const info = FindRequestTipc(ctx.GetCommand()); + if (!info.has_value() || info->handler_callback == nullptr) + return ReportUnimplementedFunction(ctx, &*info, false); + + LOG_ERROR(Service, "check for {} version_gating: {}", info->name, info->version_gating); + if (!VersionGateCheck(system, info->version_gating)) + { + return ReportUnimplementedFunction(ctx, &*info, true); + } LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer())); handler_invoker(this, info->handler_callback, ctx); diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h index ea98897e79..e8bd8683ea 100644 --- a/src/core/hle/service/service.h +++ b/src/core/hle/service/service.h @@ -7,7 +7,11 @@ #pragma once #include +#include #include +#include +#include +#include "frozen/map.h" #include "common/container/unordered_map.h" #include "common/common_types.h" #include "core/hle/service/hle_ipc.h" @@ -77,30 +81,35 @@ protected: [[nodiscard]] virtual std::unique_lock LockService() noexcept { return std::unique_lock{lock_service}; } + + static constexpr u32 MakeVersionGate(std::tuple since, std::tuple until = {0, 0, 0}) { + auto const [s_maj, s_min, s_pat] = since; + auto const [u_maj, u_min, u_pat] = until; + return (u_pat << 0) | (u_min << 4) | (u_maj << 8) + | (s_pat << 16) | (s_min << 20) | (s_maj << 24); + } + + struct FunctionInfoBase { + HandlerFnP handler_callback; + const char* name; + u32 version_gating; + }; + static_assert(std::is_trivially_constructible_v); private: template friend class ServiceFramework; - struct FunctionInfoBase { - u32 expected_header; - HandlerFnP handler_callback; - const char* name; - }; + using InvokerFn = void(ServiceFrameworkBase* object, HandlerFnP member, HLERequestContext& ctx); - using InvokerFn = void(ServiceFrameworkBase* object, HandlerFnP member, - HLERequestContext& ctx); - - explicit ServiceFrameworkBase(Core::System& system_, const char* service_name_, - u32 max_sessions_, InvokerFn* handler_invoker_); + explicit ServiceFrameworkBase(Core::System& system_, const char* service_name_, u32 max_sessions_, InvokerFn* handler_invoker_); ~ServiceFrameworkBase() override; - void RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n); - void RegisterHandlersBaseTipc(const FunctionInfoBase* functions, std::size_t n); - void ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info); + virtual std::optional FindRequest(u32 key) = 0; + virtual std::optional FindRequestTipc(u32 key) = 0; + + void ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info, bool gated); protected: - ::Common::unordered_map handlers; - ::Common::unordered_map handlers_tipc; /// Used to gain exclusive access to the service members, e.g. from CoreTiming thread. std::mutex lock_service; /// System context that the service operates under. @@ -121,8 +130,7 @@ protected: /** * Framework for implementing HLE services. Dispatches on the header id of incoming SyncRequests * based on a table mapping header ids to handler functions. Service implementations should inherit - * from ServiceFramework using the CRTP (`class Foo : public ServiceFramework { ... };`) and - * populate it with handlers by calling #RegisterHandlers. + * from ServiceFramework using the CRTP (`class Foo : public ServiceFramework { ... };`) * * In order to avoid duplicating code in the binary and exposing too many implementation details in * the header, this class is split into a non-templated base (ServiceFrameworkBase) and a template @@ -143,50 +151,77 @@ protected: /// @param expected_header_ request header in the command buffer which will trigger dispatch to this handler /// @param handler_callback_ member function in this service which will be called to handle the request /// @param name_ human-friendly name for the request. Used mostly for logging purposes. - FunctionInfoTyped(u32 expected_header_, HandlerFnP handler_callback_, const char* name_) - : FunctionInfoBase{expected_header_, HandlerFnP(handler_callback_), name_} {} + explicit constexpr FunctionInfoTyped(u32 expected_header_, HandlerFnP handler_callback_, const char* name_, u32 version_gating_ = 0) + : handler_callback{handler_callback_} + , name{name_} + , version_gating{version_gating_} + , expected_header{expected_header_} + {} + HandlerFnP handler_callback; + const char* name; + u32 version_gating; + u32 expected_header; }; using FunctionInfo = FunctionInfoTyped; - /** - * Initializes the handler with no functions installed. - * - * @param system_ The system context to construct this service under. - * @param service_name_ Name of the service. - * @param max_sessions_ Maximum number of sessions that can be connected to this service at the - * same time. - */ + // expected_header serves as a key to 'address' function handlers, thus only include the minimal + template + struct FunctionValueInfo { + explicit constexpr FunctionValueInfo(HandlerFnP handler_callback_, const char* name_, u32 version_gating_) + : handler_callback{handler_callback_} + , name{name_} + , version_gating{version_gating_} + {} + HandlerFnP handler_callback; + const char* name; + u32 version_gating; + }; + + template + //requires (std::same_as && ...) + [[nodiscard]] static consteval frozen::map, sizeof...(Ts)> CreateStaticMap(Ts... args) { + return frozen::map, sizeof...(args)>{ + {args.expected_header, FunctionValueInfo{args.handler_callback, args.name, args.version_gating}}... + }; + } + + // Used exclusively by NFC + template + //requires (std::same_as> && ...) + [[nodiscard]] static consteval frozen::map, sizeof...(Ts)> CreateStaticMapWithClass(Ts... args) { + return frozen::map, sizeof...(args)>{ + {args.expected_header, FunctionValueInfo{args.handler_callback, args.name, args.version_gating}}... + }; + } + + template + [[nodiscard]] static std::optional HandlerTableGenerateWithFind(u32 key, T const& map) { + auto const it = map.find(key); + if (it != map.end()) { + auto const r = it->second; + return std::optional{{ + HandlerFnP(r.handler_callback), + r.name, + r.version_gating + }}; + } + return std::nullopt; + } + + /// @brief Initializes the handler with no functions installed. + /// @param system_ The system context to construct this service under. + /// @param service_name_ Name of the service. + /// @param max_sessions_ Maximum number of sessions that can be connected to this service at the + /// same time. explicit ServiceFramework(Core::System& system_, const char* service_name_, u32 max_sessions_ = ServerSessionCountMax) - : ServiceFrameworkBase(system_, service_name_, max_sessions_, Invoker) {} + : ServiceFrameworkBase(system_, service_name_, max_sessions_, Invoker) + {} - /// Registers handlers in the service. - template - void RegisterHandlers(const FunctionInfoTyped (&functions)[N]) { - RegisterHandlers(functions, N); + std::optional FindRequest(u32 key) override { + UNREACHABLE(); } - - /** - * Registers handlers in the service. Usually prefer using the other RegisterHandlers - * overload in order to avoid needing to specify the array size. - */ - template - void RegisterHandlers(const FunctionInfoTyped* functions, std::size_t n) { - RegisterHandlersBase(functions, n); - } - - /// Registers handlers in the service. - template - void RegisterHandlersTipc(const FunctionInfoTyped (&functions)[N]) { - RegisterHandlersTipc(functions, N); - } - - /** - * Registers handlers in the service. Usually prefer using the other RegisterHandlers - * overload in order to avoid needing to specify the array size. - */ - template - void RegisterHandlersTipc(const FunctionInfoTyped* functions, std::size_t n) { - RegisterHandlersBaseTipc(functions, n); + std::optional FindRequestTipc(u32 key) override { + UNREACHABLE(); } protected: diff --git a/src/core/hle/service/set/factory_settings_server.cpp b/src/core/hle/service/set/factory_settings_server.cpp index a8e307ae26..70d02fab3b 100644 --- a/src/core/hle/service/set/factory_settings_server.cpp +++ b/src/core/hle/service/set/factory_settings_server.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,55 +10,6 @@ namespace Service::Set { IFactorySettingsServer::IFactorySettingsServer(Core::System& system_) : ServiceFramework{system_, "set:cal"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetBluetoothBdAddress"}, - {1, nullptr, "GetConfigurationId1"}, - {2, nullptr, "GetAccelerometerOffset"}, - {3, nullptr, "GetAccelerometerScale"}, - {4, nullptr, "GetGyroscopeOffset"}, - {5, nullptr, "GetGyroscopeScale"}, - {6, nullptr, "GetWirelessLanMacAddress"}, - {7, nullptr, "GetWirelessLanCountryCodeCount"}, - {8, nullptr, "GetWirelessLanCountryCodes"}, - {9, nullptr, "GetSerialNumber"}, - {10, nullptr, "SetInitialSystemAppletProgramId"}, - {11, nullptr, "SetOverlayDispProgramId"}, - {12, nullptr, "GetBatteryLot"}, - {14, nullptr, "GetEciDeviceCertificate"}, - {15, nullptr, "GetEticketDeviceCertificate"}, - {16, nullptr, "GetSslKey"}, - {17, nullptr, "GetSslCertificate"}, - {18, nullptr, "GetGameCardKey"}, - {19, nullptr, "GetGameCardCertificate"}, - {20, nullptr, "GetEciDeviceKey"}, - {21, nullptr, "GetEticketDeviceKey"}, - {22, nullptr, "GetSpeakerParameter"}, - {23, nullptr, "GetLcdVendorId"}, - {24, nullptr, "GetEciDeviceCertificate2"}, - {25, nullptr, "GetEciDeviceKey2"}, - {26, nullptr, "GetAmiiboKey"}, - {27, nullptr, "GetAmiiboEcqvCertificate"}, - {28, nullptr, "GetAmiiboEcdsaCertificate"}, - {29, nullptr, "GetAmiiboEcqvBlsKey"}, - {30, nullptr, "GetAmiiboEcqvBlsCertificate"}, - {31, nullptr, "GetAmiiboEcqvBlsRootCertificate"}, - {32, nullptr, "GetUsbTypeCPowerSourceCircuitVersion"}, - {33, nullptr, "GetAnalogStickModuleTypeL"}, - {34, nullptr, "GetAnalogStickModelParameterL"}, - {35, nullptr, "GetAnalogStickFactoryCalibrationL"}, - {36, nullptr, "GetAnalogStickModuleTypeR"}, - {37, nullptr, "GetAnalogStickModelParameterR"}, - {38, nullptr, "GetAnalogStickFactoryCalibrationR"}, - {39, nullptr, "GetConsoleSixAxisSensorModuleType"}, - {40, nullptr, "GetConsoleSixAxisSensorHorizontalOffset"}, - {41, nullptr, "GetBatteryVersion"}, - {42, nullptr, "GetDeviceId"}, - {43, nullptr, "GetConsoleSixAxisSensorMountType"}, - }; - // clang-format on - - RegisterHandlers(functions); } IFactorySettingsServer::~IFactorySettingsServer() = default; diff --git a/src/core/hle/service/set/factory_settings_server.h b/src/core/hle/service/set/factory_settings_server.h index e64cd13809..dcc329f9c2 100644 --- a/src/core/hle/service/set/factory_settings_server.h +++ b/src/core/hle/service/set/factory_settings_server.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,6 +18,55 @@ class IFactorySettingsServer final : public ServiceFramework FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetBluetoothBdAddress"}, + FunctionInfo{1, nullptr, "GetConfigurationId1"}, + FunctionInfo{2, nullptr, "GetAccelerometerOffset"}, + FunctionInfo{3, nullptr, "GetAccelerometerScale"}, + FunctionInfo{4, nullptr, "GetGyroscopeOffset"}, + FunctionInfo{5, nullptr, "GetGyroscopeScale"}, + FunctionInfo{6, nullptr, "GetWirelessLanMacAddress"}, + FunctionInfo{7, nullptr, "GetWirelessLanCountryCodeCount"}, + FunctionInfo{8, nullptr, "GetWirelessLanCountryCodes"}, + FunctionInfo{9, nullptr, "GetSerialNumber"}, + FunctionInfo{10, nullptr, "SetInitialSystemAppletProgramId"}, + FunctionInfo{11, nullptr, "SetOverlayDispProgramId"}, + FunctionInfo{12, nullptr, "GetBatteryLot"}, + FunctionInfo{14, nullptr, "GetEciDeviceCertificate"}, + FunctionInfo{15, nullptr, "GetEticketDeviceCertificate"}, + FunctionInfo{16, nullptr, "GetSslKey"}, + FunctionInfo{17, nullptr, "GetSslCertificate"}, + FunctionInfo{18, nullptr, "GetGameCardKey"}, + FunctionInfo{19, nullptr, "GetGameCardCertificate"}, + FunctionInfo{20, nullptr, "GetEciDeviceKey"}, + FunctionInfo{21, nullptr, "GetEticketDeviceKey"}, + FunctionInfo{22, nullptr, "GetSpeakerParameter"}, + FunctionInfo{23, nullptr, "GetLcdVendorId"}, + FunctionInfo{24, nullptr, "GetEciDeviceCertificate2"}, + FunctionInfo{25, nullptr, "GetEciDeviceKey2"}, + FunctionInfo{26, nullptr, "GetAmiiboKey"}, + FunctionInfo{27, nullptr, "GetAmiiboEcqvCertificate"}, + FunctionInfo{28, nullptr, "GetAmiiboEcdsaCertificate"}, + FunctionInfo{29, nullptr, "GetAmiiboEcqvBlsKey"}, + FunctionInfo{30, nullptr, "GetAmiiboEcqvBlsCertificate"}, + FunctionInfo{31, nullptr, "GetAmiiboEcqvBlsRootCertificate"}, + FunctionInfo{32, nullptr, "GetUsbTypeCPowerSourceCircuitVersion"}, + FunctionInfo{33, nullptr, "GetAnalogStickModuleTypeL"}, + FunctionInfo{34, nullptr, "GetAnalogStickModelParameterL"}, + FunctionInfo{35, nullptr, "GetAnalogStickFactoryCalibrationL"}, + FunctionInfo{36, nullptr, "GetAnalogStickModuleTypeR"}, + FunctionInfo{37, nullptr, "GetAnalogStickModelParameterR"}, + FunctionInfo{38, nullptr, "GetAnalogStickFactoryCalibrationR"}, + FunctionInfo{39, nullptr, "GetConsoleSixAxisSensorModuleType"}, + FunctionInfo{40, nullptr, "GetConsoleSixAxisSensorHorizontalOffset"}, + FunctionInfo{41, nullptr, "GetBatteryVersion"}, + FunctionInfo{42, nullptr, "GetDeviceId"}, + FunctionInfo{43, nullptr, "GetConsoleSixAxisSensorMountType"} + ); }; } // namespace Service::Set diff --git a/src/core/hle/service/set/firmware_debug_settings_server.cpp b/src/core/hle/service/set/firmware_debug_settings_server.cpp index b7c66047e6..35fb43f7e7 100644 --- a/src/core/hle/service/set/firmware_debug_settings_server.cpp +++ b/src/core/hle/service/set/firmware_debug_settings_server.cpp @@ -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-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -10,23 +10,6 @@ namespace Service::Set { IFirmwareDebugSettingsServer::IFirmwareDebugSettingsServer(Core::System& system_) : ServiceFramework{system_, "set:fd"} { - // clang-format off - static const FunctionInfo functions[] = { - {2, nullptr, "SetSettingsItemValue"}, - {3, nullptr, "ResetSettingsItemValue"}, - {4, nullptr, "CreateSettingsItemKeyIterator"}, - {10, nullptr, "ReadSettings"}, - {11, nullptr, "ResetSettings"}, - {20, nullptr, "SetWebInspectorFlag"}, - {21, nullptr, "SetAllowedSslHosts"}, - {22, nullptr, "SetHostFsMountPoint"}, - {23, nullptr, "SetMemoryUsageRateFlag"}, - {24, nullptr, "CommitSettings"}, //20.0.0+ - {27, nullptr, "SetHttpAuthConfigs"}, //21.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); } IFirmwareDebugSettingsServer::~IFirmwareDebugSettingsServer() = default; diff --git a/src/core/hle/service/set/firmware_debug_settings_server.h b/src/core/hle/service/set/firmware_debug_settings_server.h index 5dae2263e9..3727a1a94c 100644 --- a/src/core/hle/service/set/firmware_debug_settings_server.h +++ b/src/core/hle/service/set/firmware_debug_settings_server.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,6 +18,23 @@ class IFirmwareDebugSettingsServer final : public ServiceFramework FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{2, nullptr, "SetSettingsItemValue"}, + FunctionInfo{3, nullptr, "ResetSettingsItemValue"}, + FunctionInfo{4, nullptr, "CreateSettingsItemKeyIterator"}, + FunctionInfo{10, nullptr, "ReadSettings"}, + FunctionInfo{11, nullptr, "ResetSettings"}, + FunctionInfo{20, nullptr, "SetWebInspectorFlag"}, + FunctionInfo{21, nullptr, "SetAllowedSslHosts"}, + FunctionInfo{22, nullptr, "SetHostFsMountPoint"}, + FunctionInfo{23, nullptr, "SetMemoryUsageRateFlag"}, + FunctionInfo{24, nullptr, "CommitSettings", MakeVersionGate({20,0,0})}, + FunctionInfo{27, nullptr, "SetHttpAuthConfigs", MakeVersionGate({21,0,0})} + ); }; } // namespace Service::Set diff --git a/src/core/hle/service/set/settings_server.cpp b/src/core/hle/service/set/settings_server.cpp index 942dddc9bc..4580cb723b 100644 --- a/src/core/hle/service/set/settings_server.cpp +++ b/src/core/hle/service/set/settings_server.cpp @@ -89,26 +89,26 @@ LanguageCode GetLanguageCodeFromIndex(std::size_t index) { return available_language_codes.at(index); } -ISettingsServer::ISettingsServer(Core::System& system_) : ServiceFramework{system_, "set"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&ISettingsServer::GetLanguageCode>, "GetLanguageCode"}, - {1, C<&ISettingsServer::GetAvailableLanguageCodes>, "GetAvailableLanguageCodes"}, - {2, C<&ISettingsServer::MakeLanguageCode>, "MakeLanguageCode"}, - {3, C<&ISettingsServer::GetAvailableLanguageCodeCount>, "GetAvailableLanguageCodeCount"}, - {4, C<&ISettingsServer::GetRegionCode>, "GetRegionCode"}, - {5, C<&ISettingsServer::GetAvailableLanguageCodes2>, "GetAvailableLanguageCodes2"}, - {6, C<&ISettingsServer::GetAvailableLanguageCodeCount2>, "GetAvailableLanguageCodeCount2"}, - {7, C<&ISettingsServer::GetKeyCodeMap>, "GetKeyCodeMap"}, - {8, C<&ISettingsServer::GetQuestFlag>, "GetQuestFlag"}, - {9, C<&ISettingsServer::GetKeyCodeMap2>, "GetKeyCodeMap2"}, - {10, nullptr, "GetFirmwareVersionForDebug"}, - {11, C<&ISettingsServer::GetDeviceNickName>, "GetDeviceNickName"}, - {12, C<&ISettingsServer::GetKeyCodeMapByPort>, "GetKeyCodeMapByPort"}, - }; - // clang-format on +std::optional ISettingsServer::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&ISettingsServer::GetLanguageCode>, "GetLanguageCode"}, + FunctionInfo{1, C<&ISettingsServer::GetAvailableLanguageCodes>, "GetAvailableLanguageCodes"}, + FunctionInfo{2, C<&ISettingsServer::MakeLanguageCode>, "MakeLanguageCode"}, + FunctionInfo{3, C<&ISettingsServer::GetAvailableLanguageCodeCount>, "GetAvailableLanguageCodeCount"}, + FunctionInfo{4, C<&ISettingsServer::GetRegionCode>, "GetRegionCode"}, + FunctionInfo{5, C<&ISettingsServer::GetAvailableLanguageCodes2>, "GetAvailableLanguageCodes2"}, + FunctionInfo{6, C<&ISettingsServer::GetAvailableLanguageCodeCount2>, "GetAvailableLanguageCodeCount2"}, + FunctionInfo{7, C<&ISettingsServer::GetKeyCodeMap>, "GetKeyCodeMap"}, + FunctionInfo{8, C<&ISettingsServer::GetQuestFlag>, "GetQuestFlag"}, + FunctionInfo{9, C<&ISettingsServer::GetKeyCodeMap2>, "GetKeyCodeMap2"}, + FunctionInfo{10, nullptr, "GetFirmwareVersionForDebug"}, + FunctionInfo{11, C<&ISettingsServer::GetDeviceNickName>, "GetDeviceNickName"}, + FunctionInfo{12, C<&ISettingsServer::GetKeyCodeMapByPort>, "GetKeyCodeMapByPort"} + ); + return HandlerTableGenerateWithFind(key, functions); +} - RegisterHandlers(functions); +ISettingsServer::ISettingsServer(Core::System& system_) : ServiceFramework{system_, "set"} { } ISettingsServer::~ISettingsServer() = default; diff --git a/src/core/hle/service/set/settings_server.h b/src/core/hle/service/set/settings_server.h index a9cee5f626..2aa487b8b1 100644 --- a/src/core/hle/service/set/settings_server.h +++ b/src/core/hle/service/set/settings_server.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -23,31 +26,19 @@ public: private: Result GetLanguageCode(Out out_language_code); - - Result GetAvailableLanguageCodes(Out out_count, - OutArray language_codes); - + Result GetAvailableLanguageCodes(Out out_count, OutArray language_codes); Result MakeLanguageCode(Out out_language_code, Language language); - Result GetAvailableLanguageCodeCount(Out out_count); - Result GetRegionCode(Out out_region_code); - - Result GetAvailableLanguageCodes2( - Out out_count, OutArray language_codes); - + Result GetAvailableLanguageCodes2(Out out_count, OutArray language_codes); Result GetAvailableLanguageCodeCount2(Out out_count); - Result GetKeyCodeMap(OutLargeData out_key_code_map); - Result GetQuestFlag(Out out_quest_flag); - Result GetKeyCodeMap2(OutLargeData out_key_code_map); - - Result GetDeviceNickName( - OutLargeData, BufferAttr_HipcMapAlias> out_device_name); - + Result GetDeviceNickName(OutLargeData, BufferAttr_HipcMapAlias> out_device_name); Result GetKeyCodeMapByPort(OutLargeData out_key_code_map, u32 port); + + std::optional FindRequest(u32 key) override; }; } // namespace Service::Set diff --git a/src/core/hle/service/set/system_settings_server.cpp b/src/core/hle/service/set/system_settings_server.cpp index 52642e37f7..925207d927 100644 --- a/src/core/hle/service/set/system_settings_server.cpp +++ b/src/core/hle/service/set/system_settings_server.cpp @@ -114,240 +114,239 @@ Result GetFirmwareVersionImpl(FirmwareVersionFormat& out_firmware, Core::System& return ResultSuccess; } +std::optional ISystemSettingsServer::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&ISystemSettingsServer::SetLanguageCode>, "SetLanguageCode"}, + FunctionInfo{1, nullptr, "SetNetworkSettings"}, + FunctionInfo{2, nullptr, "GetNetworkSettings"}, + FunctionInfo{3, C<&ISystemSettingsServer::GetFirmwareVersion>, "GetFirmwareVersion"}, + FunctionInfo{4, C<&ISystemSettingsServer::GetFirmwareVersion2>, "GetFirmwareVersion2"}, + FunctionInfo{5, nullptr, "GetFirmwareVersionDigest"}, + FunctionInfo{7, C<&ISystemSettingsServer::GetLockScreenFlag>, "GetLockScreenFlag"}, + FunctionInfo{8, C<&ISystemSettingsServer::SetLockScreenFlag>, "SetLockScreenFlag"}, + FunctionInfo{9, nullptr, "GetBacklightSettings"}, + FunctionInfo{10, nullptr, "SetBacklightSettings"}, + FunctionInfo{11, nullptr, "SetBluetoothDevicesSettings"}, + FunctionInfo{12, nullptr, "GetBluetoothDevicesSettings"}, + FunctionInfo{13, C<&ISystemSettingsServer::GetExternalSteadyClockSourceId>, "GetExternalSteadyClockSourceId"}, + FunctionInfo{14, C<&ISystemSettingsServer::SetExternalSteadyClockSourceId>, "SetExternalSteadyClockSourceId"}, + FunctionInfo{15, C<&ISystemSettingsServer::GetUserSystemClockContext>, "GetUserSystemClockContext"}, + FunctionInfo{16, C<&ISystemSettingsServer::SetUserSystemClockContext>, "SetUserSystemClockContext"}, + FunctionInfo{17, C<&ISystemSettingsServer::GetAccountSettings>, "GetAccountSettings"}, + FunctionInfo{18, C<&ISystemSettingsServer::SetAccountSettings>, "SetAccountSettings"}, + FunctionInfo{19, nullptr, "GetAudioVolume"}, + FunctionInfo{20, nullptr, "SetAudioVolume"}, + FunctionInfo{21, C<&ISystemSettingsServer::GetEulaVersions>, "GetEulaVersions"}, + FunctionInfo{22, C<&ISystemSettingsServer::SetEulaVersions>, "SetEulaVersions"}, + FunctionInfo{23, C<&ISystemSettingsServer::GetColorSetId>, "GetColorSetId"}, + FunctionInfo{24, C<&ISystemSettingsServer::SetColorSetId>, "SetColorSetId"}, + FunctionInfo{25, C<&ISystemSettingsServer::GetConsoleInformationUploadFlag>, "GetConsoleInformationUploadFlag"}, + FunctionInfo{26, C<&ISystemSettingsServer::SetConsoleInformationUploadFlag>, "SetConsoleInformationUploadFlag"}, + FunctionInfo{27, C<&ISystemSettingsServer::GetAutomaticApplicationDownloadFlag>, "GetAutomaticApplicationDownloadFlag"}, + FunctionInfo{28, C<&ISystemSettingsServer::SetAutomaticApplicationDownloadFlag>, "SetAutomaticApplicationDownloadFlag"}, + FunctionInfo{29, C<&ISystemSettingsServer::GetNotificationSettings>, "GetNotificationSettings"}, + FunctionInfo{30, C<&ISystemSettingsServer::SetNotificationSettings>, "SetNotificationSettings"}, + FunctionInfo{31, C<&ISystemSettingsServer::GetAccountNotificationSettings>, "GetAccountNotificationSettings"}, + FunctionInfo{32, C<&ISystemSettingsServer::SetAccountNotificationSettings>, "SetAccountNotificationSettings"}, + FunctionInfo{35, C<&ISystemSettingsServer::GetVibrationMasterVolume>, "GetVibrationMasterVolume"}, + FunctionInfo{36, C<&ISystemSettingsServer::SetVibrationMasterVolume>, "SetVibrationMasterVolume"}, + FunctionInfo{37, C<&ISystemSettingsServer::GetSettingsItemValueSize>, "GetSettingsItemValueSize"}, + FunctionInfo{38, C<&ISystemSettingsServer::GetSettingsItemValue>, "GetSettingsItemValue"}, + FunctionInfo{39, C<&ISystemSettingsServer::GetTvSettings>, "GetTvSettings"}, + FunctionInfo{40, C<&ISystemSettingsServer::SetTvSettings>, "SetTvSettings"}, + FunctionInfo{41, nullptr, "GetEdid"}, + FunctionInfo{42, nullptr, "SetEdid"}, + FunctionInfo{43, C<&ISystemSettingsServer::GetAudioOutputMode>, "GetAudioOutputMode"}, + FunctionInfo{44, C<&ISystemSettingsServer::SetAudioOutputMode>, "SetAudioOutputMode"}, + FunctionInfo{45, C<&ISystemSettingsServer::GetSpeakerAutoMuteFlag>, "GetSpeakerAutoMuteFlag"}, + FunctionInfo{46, C<&ISystemSettingsServer::SetSpeakerAutoMuteFlag>, "SetSpeakerAutoMuteFlag"}, + FunctionInfo{47, C<&ISystemSettingsServer::GetQuestFlag>, "GetQuestFlag"}, + FunctionInfo{48, C<&ISystemSettingsServer::SetQuestFlag>, "SetQuestFlag"}, + FunctionInfo{49, nullptr, "GetDataDeletionSettings"}, + FunctionInfo{50, nullptr, "SetDataDeletionSettings"}, + FunctionInfo{51, nullptr, "GetInitialSystemAppletProgramId"}, + FunctionInfo{52, nullptr, "GetOverlayDispProgramId"}, + FunctionInfo{53, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationName>, "GetDeviceTimeZoneLocationName"}, + FunctionInfo{54, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationName>, "SetDeviceTimeZoneLocationName"}, + FunctionInfo{55, nullptr, "GetWirelessCertificationFileSize"}, + FunctionInfo{56, nullptr, "GetWirelessCertificationFile"}, + FunctionInfo{57, C<&ISystemSettingsServer::SetRegionCode>, "SetRegionCode"}, + FunctionInfo{58, C<&ISystemSettingsServer::GetNetworkSystemClockContext>, "GetNetworkSystemClockContext"}, + FunctionInfo{59, C<&ISystemSettingsServer::SetNetworkSystemClockContext>, "SetNetworkSystemClockContext"}, + FunctionInfo{60, C<&ISystemSettingsServer::IsUserSystemClockAutomaticCorrectionEnabled>, "IsUserSystemClockAutomaticCorrectionEnabled"}, + FunctionInfo{61, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionEnabled>, "SetUserSystemClockAutomaticCorrectionEnabled"}, + FunctionInfo{62, C<&ISystemSettingsServer::GetDebugModeFlag>, "GetDebugModeFlag"}, + FunctionInfo{63, C<&ISystemSettingsServer::GetPrimaryAlbumStorage>, "GetPrimaryAlbumStorage"}, + FunctionInfo{64, C<&ISystemSettingsServer::SetPrimaryAlbumStorage>, "SetPrimaryAlbumStorage"}, + FunctionInfo{65, C<&ISystemSettingsServer::GetUsb30EnableFlag>, "GetUsb30EnableFlag"}, + FunctionInfo{66, C<&ISystemSettingsServer::SetUsb30EnableFlag>, "SetUsb30EnableFlag"}, + FunctionInfo{67, C<&ISystemSettingsServer::GetBatteryLot>, "GetBatteryLot"}, + FunctionInfo{68, C<&ISystemSettingsServer::GetSerialNumber>, "GetSerialNumber"}, + FunctionInfo{69, C<&ISystemSettingsServer::GetNfcEnableFlag>, "GetNfcEnableFlag"}, + FunctionInfo{70, C<&ISystemSettingsServer::SetNfcEnableFlag>, "SetNfcEnableFlag"}, + FunctionInfo{71, C<&ISystemSettingsServer::GetSleepSettings>, "GetSleepSettings"}, + FunctionInfo{72, C<&ISystemSettingsServer::SetSleepSettings>, "SetSleepSettings"}, + FunctionInfo{73, C<&ISystemSettingsServer::GetWirelessLanEnableFlag>, "GetWirelessLanEnableFlag"}, + FunctionInfo{74, C<&ISystemSettingsServer::SetWirelessLanEnableFlag>, "SetWirelessLanEnableFlag"}, + FunctionInfo{75, C<&ISystemSettingsServer::GetInitialLaunchSettings>, "GetInitialLaunchSettings"}, + FunctionInfo{76, C<&ISystemSettingsServer::SetInitialLaunchSettings>, "SetInitialLaunchSettings"}, + FunctionInfo{77, C<&ISystemSettingsServer::GetDeviceNickName>, "GetDeviceNickName"}, + FunctionInfo{78, C<&ISystemSettingsServer::SetDeviceNickName>, "SetDeviceNickName"}, + FunctionInfo{79, C<&ISystemSettingsServer::GetProductModel>, "GetProductModel"}, + FunctionInfo{80, nullptr, "GetLdnChannel"}, + FunctionInfo{81, nullptr, "SetLdnChannel"}, + FunctionInfo{82, nullptr, "AcquireTelemetryDirtyFlagEventHandle"}, + FunctionInfo{83, nullptr, "GetTelemetryDirtyFlags"}, + FunctionInfo{84, nullptr, "GetPtmBatteryLot"}, + FunctionInfo{85, nullptr, "SetPtmBatteryLot"}, + FunctionInfo{86, nullptr, "GetPtmFuelGaugeParameter"}, + FunctionInfo{87, nullptr, "SetPtmFuelGaugeParameter"}, + FunctionInfo{88, C<&ISystemSettingsServer::GetBluetoothEnableFlag>, "GetBluetoothEnableFlag"}, + FunctionInfo{89, C<&ISystemSettingsServer::SetBluetoothEnableFlag>, "SetBluetoothEnableFlag"}, + FunctionInfo{90, C<&ISystemSettingsServer::GetMiiAuthorId>, "GetMiiAuthorId"}, + FunctionInfo{91, nullptr, "SetShutdownRtcValue"}, + FunctionInfo{92, nullptr, "GetShutdownRtcValue"}, + FunctionInfo{93, nullptr, "AcquireFatalDirtyFlagEventHandle"}, + FunctionInfo{94, nullptr, "GetFatalDirtyFlags"}, + FunctionInfo{95, C<&ISystemSettingsServer::GetAutoUpdateEnableFlag>, "GetAutoUpdateEnableFlag"}, + FunctionInfo{96, C<&ISystemSettingsServer::SetAutoUpdateEnableFlag>, "SetAutoUpdateEnableFlag"}, + FunctionInfo{97, nullptr, "GetNxControllerSettings"}, + FunctionInfo{98, nullptr, "SetNxControllerSettings"}, + FunctionInfo{99, C<&ISystemSettingsServer::GetBatteryPercentageFlag>, "GetBatteryPercentageFlag"}, + FunctionInfo{100, C<&ISystemSettingsServer::SetBatteryPercentageFlag>, "SetBatteryPercentageFlag"}, + FunctionInfo{101, nullptr, "GetExternalRtcResetFlag"}, + FunctionInfo{102, nullptr, "SetExternalRtcResetFlag"}, + FunctionInfo{103, nullptr, "GetUsbFullKeyEnableFlag"}, + FunctionInfo{104, nullptr, "SetUsbFullKeyEnableFlag"}, + FunctionInfo{105, C<&ISystemSettingsServer::SetExternalSteadyClockInternalOffset>, "SetExternalSteadyClockInternalOffset"}, + FunctionInfo{106, C<&ISystemSettingsServer::GetExternalSteadyClockInternalOffset>, "GetExternalSteadyClockInternalOffset"}, + FunctionInfo{107, nullptr, "GetBacklightSettingsEx"}, + FunctionInfo{108, nullptr, "SetBacklightSettingsEx"}, + FunctionInfo{109, nullptr, "GetHeadphoneVolumeWarningCount"}, + FunctionInfo{110, nullptr, "SetHeadphoneVolumeWarningCount"}, + FunctionInfo{111, nullptr, "GetBluetoothAfhEnableFlag"}, + FunctionInfo{112, nullptr, "SetBluetoothAfhEnableFlag"}, + FunctionInfo{113, nullptr, "GetBluetoothBoostEnableFlag"}, + FunctionInfo{114, nullptr, "SetBluetoothBoostEnableFlag"}, + FunctionInfo{115, nullptr, "GetInRepairProcessEnableFlag"}, + FunctionInfo{116, nullptr, "SetInRepairProcessEnableFlag"}, + FunctionInfo{117, nullptr, "GetHeadphoneVolumeUpdateFlag"}, + FunctionInfo{118, nullptr, "SetHeadphoneVolumeUpdateFlag"}, + FunctionInfo{119, nullptr, "NeedsToUpdateHeadphoneVolume"}, + FunctionInfo{120, C<&ISystemSettingsServer::GetPushNotificationActivityModeOnSleep>, "GetPushNotificationActivityModeOnSleep"}, + FunctionInfo{121, C<&ISystemSettingsServer::SetPushNotificationActivityModeOnSleep>, "SetPushNotificationActivityModeOnSleep"}, + FunctionInfo{122, nullptr, "GetServiceDiscoveryControlSettings"}, + FunctionInfo{123, nullptr, "SetServiceDiscoveryControlSettings"}, + FunctionInfo{124, C<&ISystemSettingsServer::GetErrorReportSharePermission>, "GetErrorReportSharePermission"}, + FunctionInfo{125, C<&ISystemSettingsServer::SetErrorReportSharePermission>, "SetErrorReportSharePermission"}, + FunctionInfo{126, C<&ISystemSettingsServer::GetAppletLaunchFlags>, "GetAppletLaunchFlags"}, + FunctionInfo{127, C<&ISystemSettingsServer::SetAppletLaunchFlags>, "SetAppletLaunchFlags"}, + FunctionInfo{128, nullptr, "GetConsoleSixAxisSensorAccelerationBias"}, + FunctionInfo{129, nullptr, "SetConsoleSixAxisSensorAccelerationBias"}, + FunctionInfo{130, nullptr, "GetConsoleSixAxisSensorAngularVelocityBias"}, + FunctionInfo{131, nullptr, "SetConsoleSixAxisSensorAngularVelocityBias"}, + FunctionInfo{132, nullptr, "GetConsoleSixAxisSensorAccelerationGain"}, + FunctionInfo{133, nullptr, "SetConsoleSixAxisSensorAccelerationGain"}, + FunctionInfo{134, nullptr, "GetConsoleSixAxisSensorAngularVelocityGain"}, + FunctionInfo{135, nullptr, "SetConsoleSixAxisSensorAngularVelocityGain"}, + FunctionInfo{136, C<&ISystemSettingsServer::GetKeyboardLayout>, "GetKeyboardLayout"}, + FunctionInfo{137, C<&ISystemSettingsServer::SetKeyboardLayout>, "SetKeyboardLayout"}, + FunctionInfo{138, nullptr, "GetWebInspectorFlag"}, + FunctionInfo{139, nullptr, "GetAllowedSslHosts"}, + FunctionInfo{140, nullptr, "GetHostFsMountPoint"}, + FunctionInfo{141, nullptr, "GetRequiresRunRepairTimeReviser"}, + FunctionInfo{142, nullptr, "SetRequiresRunRepairTimeReviser"}, + FunctionInfo{143, nullptr, "SetBlePairingSettings"}, + FunctionInfo{144, nullptr, "GetBlePairingSettings"}, + FunctionInfo{145, nullptr, "GetConsoleSixAxisSensorAngularVelocityTimeBias"}, + FunctionInfo{146, nullptr, "SetConsoleSixAxisSensorAngularVelocityTimeBias"}, + FunctionInfo{147, nullptr, "GetConsoleSixAxisSensorAngularAcceleration"}, + FunctionInfo{148, nullptr, "SetConsoleSixAxisSensorAngularAcceleration"}, + FunctionInfo{149, C<&ISystemSettingsServer::GetRebootlessSystemUpdateVersion>, "GetRebootlessSystemUpdateVersion"}, + FunctionInfo{150, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime>, "GetDeviceTimeZoneLocationUpdatedTime"}, + FunctionInfo{151, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime>, "SetDeviceTimeZoneLocationUpdatedTime"}, + FunctionInfo{152, C<&ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime>, "GetUserSystemClockAutomaticCorrectionUpdatedTime"}, + FunctionInfo{153, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionUpdatedTime>, "SetUserSystemClockAutomaticCorrectionUpdatedTime"}, + FunctionInfo{154, nullptr, "GetAccountOnlineStorageSettings"}, + FunctionInfo{155, nullptr, "SetAccountOnlineStorageSettings"}, + FunctionInfo{156, nullptr, "GetPctlReadyFlag"}, + FunctionInfo{157, nullptr, "SetPctlReadyFlag"}, + FunctionInfo{158, nullptr, "GetAnalogStickUserCalibrationL"}, + FunctionInfo{159, nullptr, "SetAnalogStickUserCalibrationL"}, + FunctionInfo{160, nullptr, "GetAnalogStickUserCalibrationR"}, + FunctionInfo{161, nullptr, "SetAnalogStickUserCalibrationR"}, + FunctionInfo{162, nullptr, "GetPtmBatteryVersion"}, + FunctionInfo{163, nullptr, "SetPtmBatteryVersion"}, + FunctionInfo{164, nullptr, "GetUsb30HostEnableFlag"}, + FunctionInfo{165, nullptr, "SetUsb30HostEnableFlag"}, + FunctionInfo{166, nullptr, "GetUsb30DeviceEnableFlag"}, + FunctionInfo{167, nullptr, "SetUsb30DeviceEnableFlag"}, + FunctionInfo{168, nullptr, "GetThemeId"}, + FunctionInfo{169, nullptr, "SetThemeId"}, + FunctionInfo{170, C<&ISystemSettingsServer::GetChineseTraditionalInputMethod>, "GetChineseTraditionalInputMethod"}, + FunctionInfo{171, nullptr, "SetChineseTraditionalInputMethod"}, + FunctionInfo{172, nullptr, "GetPtmCycleCountReliability"}, + FunctionInfo{173, nullptr, "SetPtmCycleCountReliability"}, + FunctionInfo{174, C<&ISystemSettingsServer::GetHomeMenuScheme>, "GetHomeMenuScheme"}, + FunctionInfo{175, nullptr, "GetThemeSettings"}, + FunctionInfo{176, nullptr, "SetThemeSettings"}, + FunctionInfo{177, nullptr, "GetThemeKey"}, + FunctionInfo{178, nullptr, "SetThemeKey"}, + FunctionInfo{179, nullptr, "GetZoomFlag"}, + FunctionInfo{180, nullptr, "SetZoomFlag"}, + FunctionInfo{181, nullptr, "GetT"}, + FunctionInfo{182, nullptr, "SetT"}, + FunctionInfo{183, C<&ISystemSettingsServer::GetPlatformRegion>, "GetPlatformRegion"}, + FunctionInfo{184, C<&ISystemSettingsServer::SetPlatformRegion>, "SetPlatformRegion"}, + FunctionInfo{185, C<&ISystemSettingsServer::GetHomeMenuSchemeModel>, "GetHomeMenuSchemeModel"}, + FunctionInfo{186, nullptr, "GetMemoryUsageRateFlag"}, + FunctionInfo{187, C<&ISystemSettingsServer::GetTouchScreenMode>, "GetTouchScreenMode"}, + FunctionInfo{188, C<&ISystemSettingsServer::SetTouchScreenMode>, "SetTouchScreenMode"}, + FunctionInfo{189, nullptr, "GetButtonConfigSettingsFull"}, + FunctionInfo{190, nullptr, "SetButtonConfigSettingsFull"}, + FunctionInfo{191, nullptr, "GetButtonConfigSettingsEmbedded"}, + FunctionInfo{192, nullptr, "SetButtonConfigSettingsEmbedded"}, + FunctionInfo{193, nullptr, "GetButtonConfigSettingsLeft"}, + FunctionInfo{194, nullptr, "SetButtonConfigSettingsLeft"}, + FunctionInfo{195, nullptr, "GetButtonConfigSettingsRight"}, + FunctionInfo{196, nullptr, "SetButtonConfigSettingsRight"}, + FunctionInfo{197, nullptr, "GetButtonConfigRegisteredSettingsEmbedded"}, + FunctionInfo{198, nullptr, "SetButtonConfigRegisteredSettingsEmbedded"}, + FunctionInfo{199, nullptr, "GetButtonConfigRegisteredSettings"}, + FunctionInfo{200, nullptr, "SetButtonConfigRegisteredSettings"}, + FunctionInfo{201, C<&ISystemSettingsServer::GetFieldTestingFlag>, "GetFieldTestingFlag"}, + FunctionInfo{202, nullptr, "SetFieldTestingFlag"}, + FunctionInfo{203, C<&ISystemSettingsServer::GetPanelCrcMode>, "GetPanelCrcMode"}, + FunctionInfo{204, C<&ISystemSettingsServer::SetPanelCrcMode>, "SetPanelCrcMode"}, + FunctionInfo{205, nullptr, "GetNxControllerSettingsEx"}, + FunctionInfo{206, nullptr, "SetNxControllerSettingsEx"}, + FunctionInfo{207, nullptr, "GetHearingProtectionSafeguardFlag"}, + FunctionInfo{208, nullptr, "SetHearingProtectionSafeguardFlag"}, + FunctionInfo{209, nullptr, "GetHearingProtectionSafeguardRemainingTime"}, + FunctionInfo{210, nullptr, "SetHearingProtectionSafeguardRemainingTime"}, + FunctionInfo{221, nullptr, "GetForceMonauralOutputFlag", MakeVersionGate({17,0,0})}, + FunctionInfo{222, nullptr, "SetForceMonauralOutputFlag", MakeVersionGate({17,0,0})}, + FunctionInfo{251, nullptr, "GetAccountIdentificationSettings", MakeVersionGate({18,0,0})}, + FunctionInfo{252, nullptr, "SetAccountIdentificationSettings", MakeVersionGate({18,0,0})}, + FunctionInfo{263, nullptr, "AcquireVphymDirtyFlagEventHandle", MakeVersionGate({20,0,0})}, + FunctionInfo{264, nullptr, "GetVphymDirtyFlags", MakeVersionGate({20,0,0})}, + FunctionInfo{282, nullptr, "ConvertToProductModel", MakeVersionGate({20,0,0})}, + FunctionInfo{283, nullptr, "ConvertToProductModelName", MakeVersionGate({20,0,0})}, + FunctionInfo{289, nullptr, "GetDefaultAccountIdentificationFlagSet", MakeVersionGate({20,0,0})}, + FunctionInfo{300, nullptr, "AcquirePushNotificationDirtyFlagEventHandle", MakeVersionGate({20,0,0})}, + FunctionInfo{301, nullptr, "GetPushNotificationDirtyFlags", MakeVersionGate({20,0,0})}, + FunctionInfo{306, nullptr, "GetPinCodeReregistrationGuideAccounts", MakeVersionGate({20,0,0})}, + FunctionInfo{307, nullptr, "SetPinCodeReregistrationGuideAccounts", MakeVersionGate({20,0,0})}, + FunctionInfo{315, C<&ISystemSettingsServer::GetHttpAuthConfigs>, "GetHttpAuthConfigs", MakeVersionGate({21,0,0})}, + FunctionInfo{319, C<&ISystemSettingsServer::GetAccountUserSettings>, "GetAccountUserSettings", MakeVersionGate({21,0,0})}, + FunctionInfo{320, nullptr, "SetAccountUserSettings", MakeVersionGate({21,0,0})}, + FunctionInfo{321, C<&ISystemSettingsServer::GetDefaultAccountUserSettings>, "GetDefaultAccountUserSettings", MakeVersionGate({21,0,0})} + ); + return HandlerTableGenerateWithFind(key, functions); +} + ISystemSettingsServer::ISystemSettingsServer(Core::System& system_) - : ServiceFramework{system_, "set:sys"}, m_system{system} { - // clang-format off - static const FunctionInfo functions[] = { - {0, C<&ISystemSettingsServer::SetLanguageCode>, "SetLanguageCode"}, - {1, nullptr, "SetNetworkSettings"}, - {2, nullptr, "GetNetworkSettings"}, - {3, C<&ISystemSettingsServer::GetFirmwareVersion>, "GetFirmwareVersion"}, - {4, C<&ISystemSettingsServer::GetFirmwareVersion2>, "GetFirmwareVersion2"}, - {5, nullptr, "GetFirmwareVersionDigest"}, - {7, C<&ISystemSettingsServer::GetLockScreenFlag>, "GetLockScreenFlag"}, - {8, C<&ISystemSettingsServer::SetLockScreenFlag>, "SetLockScreenFlag"}, - {9, nullptr, "GetBacklightSettings"}, - {10, nullptr, "SetBacklightSettings"}, - {11, nullptr, "SetBluetoothDevicesSettings"}, - {12, nullptr, "GetBluetoothDevicesSettings"}, - {13, C<&ISystemSettingsServer::GetExternalSteadyClockSourceId>, "GetExternalSteadyClockSourceId"}, - {14, C<&ISystemSettingsServer::SetExternalSteadyClockSourceId>, "SetExternalSteadyClockSourceId"}, - {15, C<&ISystemSettingsServer::GetUserSystemClockContext>, "GetUserSystemClockContext"}, - {16, C<&ISystemSettingsServer::SetUserSystemClockContext>, "SetUserSystemClockContext"}, - {17, C<&ISystemSettingsServer::GetAccountSettings>, "GetAccountSettings"}, - {18, C<&ISystemSettingsServer::SetAccountSettings>, "SetAccountSettings"}, - {19, nullptr, "GetAudioVolume"}, - {20, nullptr, "SetAudioVolume"}, - {21, C<&ISystemSettingsServer::GetEulaVersions>, "GetEulaVersions"}, - {22, C<&ISystemSettingsServer::SetEulaVersions>, "SetEulaVersions"}, - {23, C<&ISystemSettingsServer::GetColorSetId>, "GetColorSetId"}, - {24, C<&ISystemSettingsServer::SetColorSetId>, "SetColorSetId"}, - {25, C<&ISystemSettingsServer::GetConsoleInformationUploadFlag>, "GetConsoleInformationUploadFlag"}, - {26, C<&ISystemSettingsServer::SetConsoleInformationUploadFlag>, "SetConsoleInformationUploadFlag"}, - {27, C<&ISystemSettingsServer::GetAutomaticApplicationDownloadFlag>, "GetAutomaticApplicationDownloadFlag"}, - {28, C<&ISystemSettingsServer::SetAutomaticApplicationDownloadFlag>, "SetAutomaticApplicationDownloadFlag"}, - {29, C<&ISystemSettingsServer::GetNotificationSettings>, "GetNotificationSettings"}, - {30, C<&ISystemSettingsServer::SetNotificationSettings>, "SetNotificationSettings"}, - {31, C<&ISystemSettingsServer::GetAccountNotificationSettings>, "GetAccountNotificationSettings"}, - {32, C<&ISystemSettingsServer::SetAccountNotificationSettings>, "SetAccountNotificationSettings"}, - {35, C<&ISystemSettingsServer::GetVibrationMasterVolume>, "GetVibrationMasterVolume"}, - {36, C<&ISystemSettingsServer::SetVibrationMasterVolume>, "SetVibrationMasterVolume"}, - {37, C<&ISystemSettingsServer::GetSettingsItemValueSize>, "GetSettingsItemValueSize"}, - {38, C<&ISystemSettingsServer::GetSettingsItemValue>, "GetSettingsItemValue"}, - {39, C<&ISystemSettingsServer::GetTvSettings>, "GetTvSettings"}, - {40, C<&ISystemSettingsServer::SetTvSettings>, "SetTvSettings"}, - {41, nullptr, "GetEdid"}, - {42, nullptr, "SetEdid"}, - {43, C<&ISystemSettingsServer::GetAudioOutputMode>, "GetAudioOutputMode"}, - {44, C<&ISystemSettingsServer::SetAudioOutputMode>, "SetAudioOutputMode"}, - {45, C<&ISystemSettingsServer::GetSpeakerAutoMuteFlag>, "GetSpeakerAutoMuteFlag"}, - {46, C<&ISystemSettingsServer::SetSpeakerAutoMuteFlag>, "SetSpeakerAutoMuteFlag"}, - {47, C<&ISystemSettingsServer::GetQuestFlag>, "GetQuestFlag"}, - {48, C<&ISystemSettingsServer::SetQuestFlag>, "SetQuestFlag"}, - {49, nullptr, "GetDataDeletionSettings"}, - {50, nullptr, "SetDataDeletionSettings"}, - {51, nullptr, "GetInitialSystemAppletProgramId"}, - {52, nullptr, "GetOverlayDispProgramId"}, - {53, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationName>, "GetDeviceTimeZoneLocationName"}, - {54, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationName>, "SetDeviceTimeZoneLocationName"}, - {55, nullptr, "GetWirelessCertificationFileSize"}, - {56, nullptr, "GetWirelessCertificationFile"}, - {57, C<&ISystemSettingsServer::SetRegionCode>, "SetRegionCode"}, - {58, C<&ISystemSettingsServer::GetNetworkSystemClockContext>, "GetNetworkSystemClockContext"}, - {59, C<&ISystemSettingsServer::SetNetworkSystemClockContext>, "SetNetworkSystemClockContext"}, - {60, C<&ISystemSettingsServer::IsUserSystemClockAutomaticCorrectionEnabled>, "IsUserSystemClockAutomaticCorrectionEnabled"}, - {61, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionEnabled>, "SetUserSystemClockAutomaticCorrectionEnabled"}, - {62, C<&ISystemSettingsServer::GetDebugModeFlag>, "GetDebugModeFlag"}, - {63, C<&ISystemSettingsServer::GetPrimaryAlbumStorage>, "GetPrimaryAlbumStorage"}, - {64, C<&ISystemSettingsServer::SetPrimaryAlbumStorage>, "SetPrimaryAlbumStorage"}, - {65, C<&ISystemSettingsServer::GetUsb30EnableFlag>, "GetUsb30EnableFlag"}, - {66, C<&ISystemSettingsServer::SetUsb30EnableFlag>, "SetUsb30EnableFlag"}, - {67, C<&ISystemSettingsServer::GetBatteryLot>, "GetBatteryLot"}, - {68, C<&ISystemSettingsServer::GetSerialNumber>, "GetSerialNumber"}, - {69, C<&ISystemSettingsServer::GetNfcEnableFlag>, "GetNfcEnableFlag"}, - {70, C<&ISystemSettingsServer::SetNfcEnableFlag>, "SetNfcEnableFlag"}, - {71, C<&ISystemSettingsServer::GetSleepSettings>, "GetSleepSettings"}, - {72, C<&ISystemSettingsServer::SetSleepSettings>, "SetSleepSettings"}, - {73, C<&ISystemSettingsServer::GetWirelessLanEnableFlag>, "GetWirelessLanEnableFlag"}, - {74, C<&ISystemSettingsServer::SetWirelessLanEnableFlag>, "SetWirelessLanEnableFlag"}, - {75, C<&ISystemSettingsServer::GetInitialLaunchSettings>, "GetInitialLaunchSettings"}, - {76, C<&ISystemSettingsServer::SetInitialLaunchSettings>, "SetInitialLaunchSettings"}, - {77, C<&ISystemSettingsServer::GetDeviceNickName>, "GetDeviceNickName"}, - {78, C<&ISystemSettingsServer::SetDeviceNickName>, "SetDeviceNickName"}, - {79, C<&ISystemSettingsServer::GetProductModel>, "GetProductModel"}, - {80, nullptr, "GetLdnChannel"}, - {81, nullptr, "SetLdnChannel"}, - {82, nullptr, "AcquireTelemetryDirtyFlagEventHandle"}, - {83, nullptr, "GetTelemetryDirtyFlags"}, - {84, nullptr, "GetPtmBatteryLot"}, - {85, nullptr, "SetPtmBatteryLot"}, - {86, nullptr, "GetPtmFuelGaugeParameter"}, - {87, nullptr, "SetPtmFuelGaugeParameter"}, - {88, C<&ISystemSettingsServer::GetBluetoothEnableFlag>, "GetBluetoothEnableFlag"}, - {89, C<&ISystemSettingsServer::SetBluetoothEnableFlag>, "SetBluetoothEnableFlag"}, - {90, C<&ISystemSettingsServer::GetMiiAuthorId>, "GetMiiAuthorId"}, - {91, nullptr, "SetShutdownRtcValue"}, - {92, nullptr, "GetShutdownRtcValue"}, - {93, nullptr, "AcquireFatalDirtyFlagEventHandle"}, - {94, nullptr, "GetFatalDirtyFlags"}, - {95, C<&ISystemSettingsServer::GetAutoUpdateEnableFlag>, "GetAutoUpdateEnableFlag"}, - {96, C<&ISystemSettingsServer::SetAutoUpdateEnableFlag>, "SetAutoUpdateEnableFlag"}, - {97, nullptr, "GetNxControllerSettings"}, - {98, nullptr, "SetNxControllerSettings"}, - {99, C<&ISystemSettingsServer::GetBatteryPercentageFlag>, "GetBatteryPercentageFlag"}, - {100, C<&ISystemSettingsServer::SetBatteryPercentageFlag>, "SetBatteryPercentageFlag"}, - {101, nullptr, "GetExternalRtcResetFlag"}, - {102, nullptr, "SetExternalRtcResetFlag"}, - {103, nullptr, "GetUsbFullKeyEnableFlag"}, - {104, nullptr, "SetUsbFullKeyEnableFlag"}, - {105, C<&ISystemSettingsServer::SetExternalSteadyClockInternalOffset>, "SetExternalSteadyClockInternalOffset"}, - {106, C<&ISystemSettingsServer::GetExternalSteadyClockInternalOffset>, "GetExternalSteadyClockInternalOffset"}, - {107, nullptr, "GetBacklightSettingsEx"}, - {108, nullptr, "SetBacklightSettingsEx"}, - {109, nullptr, "GetHeadphoneVolumeWarningCount"}, - {110, nullptr, "SetHeadphoneVolumeWarningCount"}, - {111, nullptr, "GetBluetoothAfhEnableFlag"}, - {112, nullptr, "SetBluetoothAfhEnableFlag"}, - {113, nullptr, "GetBluetoothBoostEnableFlag"}, - {114, nullptr, "SetBluetoothBoostEnableFlag"}, - {115, nullptr, "GetInRepairProcessEnableFlag"}, - {116, nullptr, "SetInRepairProcessEnableFlag"}, - {117, nullptr, "GetHeadphoneVolumeUpdateFlag"}, - {118, nullptr, "SetHeadphoneVolumeUpdateFlag"}, - {119, nullptr, "NeedsToUpdateHeadphoneVolume"}, - {120, C<&ISystemSettingsServer::GetPushNotificationActivityModeOnSleep>, "GetPushNotificationActivityModeOnSleep"}, - {121, C<&ISystemSettingsServer::SetPushNotificationActivityModeOnSleep>, "SetPushNotificationActivityModeOnSleep"}, - {122, nullptr, "GetServiceDiscoveryControlSettings"}, - {123, nullptr, "SetServiceDiscoveryControlSettings"}, - {124, C<&ISystemSettingsServer::GetErrorReportSharePermission>, "GetErrorReportSharePermission"}, - {125, C<&ISystemSettingsServer::SetErrorReportSharePermission>, "SetErrorReportSharePermission"}, - {126, C<&ISystemSettingsServer::GetAppletLaunchFlags>, "GetAppletLaunchFlags"}, - {127, C<&ISystemSettingsServer::SetAppletLaunchFlags>, "SetAppletLaunchFlags"}, - {128, nullptr, "GetConsoleSixAxisSensorAccelerationBias"}, - {129, nullptr, "SetConsoleSixAxisSensorAccelerationBias"}, - {130, nullptr, "GetConsoleSixAxisSensorAngularVelocityBias"}, - {131, nullptr, "SetConsoleSixAxisSensorAngularVelocityBias"}, - {132, nullptr, "GetConsoleSixAxisSensorAccelerationGain"}, - {133, nullptr, "SetConsoleSixAxisSensorAccelerationGain"}, - {134, nullptr, "GetConsoleSixAxisSensorAngularVelocityGain"}, - {135, nullptr, "SetConsoleSixAxisSensorAngularVelocityGain"}, - {136, C<&ISystemSettingsServer::GetKeyboardLayout>, "GetKeyboardLayout"}, - {137, C<&ISystemSettingsServer::SetKeyboardLayout>, "SetKeyboardLayout"}, - {138, nullptr, "GetWebInspectorFlag"}, - {139, nullptr, "GetAllowedSslHosts"}, - {140, nullptr, "GetHostFsMountPoint"}, - {141, nullptr, "GetRequiresRunRepairTimeReviser"}, - {142, nullptr, "SetRequiresRunRepairTimeReviser"}, - {143, nullptr, "SetBlePairingSettings"}, - {144, nullptr, "GetBlePairingSettings"}, - {145, nullptr, "GetConsoleSixAxisSensorAngularVelocityTimeBias"}, - {146, nullptr, "SetConsoleSixAxisSensorAngularVelocityTimeBias"}, - {147, nullptr, "GetConsoleSixAxisSensorAngularAcceleration"}, - {148, nullptr, "SetConsoleSixAxisSensorAngularAcceleration"}, - {149, C<&ISystemSettingsServer::GetRebootlessSystemUpdateVersion>, "GetRebootlessSystemUpdateVersion"}, - {150, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime>, "GetDeviceTimeZoneLocationUpdatedTime"}, - {151, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime>, "SetDeviceTimeZoneLocationUpdatedTime"}, - {152, C<&ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime>, "GetUserSystemClockAutomaticCorrectionUpdatedTime"}, - {153, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionUpdatedTime>, "SetUserSystemClockAutomaticCorrectionUpdatedTime"}, - {154, nullptr, "GetAccountOnlineStorageSettings"}, - {155, nullptr, "SetAccountOnlineStorageSettings"}, - {156, nullptr, "GetPctlReadyFlag"}, - {157, nullptr, "SetPctlReadyFlag"}, - {158, nullptr, "GetAnalogStickUserCalibrationL"}, - {159, nullptr, "SetAnalogStickUserCalibrationL"}, - {160, nullptr, "GetAnalogStickUserCalibrationR"}, - {161, nullptr, "SetAnalogStickUserCalibrationR"}, - {162, nullptr, "GetPtmBatteryVersion"}, - {163, nullptr, "SetPtmBatteryVersion"}, - {164, nullptr, "GetUsb30HostEnableFlag"}, - {165, nullptr, "SetUsb30HostEnableFlag"}, - {166, nullptr, "GetUsb30DeviceEnableFlag"}, - {167, nullptr, "SetUsb30DeviceEnableFlag"}, - {168, nullptr, "GetThemeId"}, - {169, nullptr, "SetThemeId"}, - {170, C<&ISystemSettingsServer::GetChineseTraditionalInputMethod>, "GetChineseTraditionalInputMethod"}, - {171, nullptr, "SetChineseTraditionalInputMethod"}, - {172, nullptr, "GetPtmCycleCountReliability"}, - {173, nullptr, "SetPtmCycleCountReliability"}, - {174, C<&ISystemSettingsServer::GetHomeMenuScheme>, "GetHomeMenuScheme"}, - {175, nullptr, "GetThemeSettings"}, - {176, nullptr, "SetThemeSettings"}, - {177, nullptr, "GetThemeKey"}, - {178, nullptr, "SetThemeKey"}, - {179, nullptr, "GetZoomFlag"}, - {180, nullptr, "SetZoomFlag"}, - {181, nullptr, "GetT"}, - {182, nullptr, "SetT"}, - {183, C<&ISystemSettingsServer::GetPlatformRegion>, "GetPlatformRegion"}, - {184, C<&ISystemSettingsServer::SetPlatformRegion>, "SetPlatformRegion"}, - {185, C<&ISystemSettingsServer::GetHomeMenuSchemeModel>, "GetHomeMenuSchemeModel"}, - {186, nullptr, "GetMemoryUsageRateFlag"}, - {187, C<&ISystemSettingsServer::GetTouchScreenMode>, "GetTouchScreenMode"}, - {188, C<&ISystemSettingsServer::SetTouchScreenMode>, "SetTouchScreenMode"}, - {189, nullptr, "GetButtonConfigSettingsFull"}, - {190, nullptr, "SetButtonConfigSettingsFull"}, - {191, nullptr, "GetButtonConfigSettingsEmbedded"}, - {192, nullptr, "SetButtonConfigSettingsEmbedded"}, - {193, nullptr, "GetButtonConfigSettingsLeft"}, - {194, nullptr, "SetButtonConfigSettingsLeft"}, - {195, nullptr, "GetButtonConfigSettingsRight"}, - {196, nullptr, "SetButtonConfigSettingsRight"}, - {197, nullptr, "GetButtonConfigRegisteredSettingsEmbedded"}, - {198, nullptr, "SetButtonConfigRegisteredSettingsEmbedded"}, - {199, nullptr, "GetButtonConfigRegisteredSettings"}, - {200, nullptr, "SetButtonConfigRegisteredSettings"}, - {201, C<&ISystemSettingsServer::GetFieldTestingFlag>, "GetFieldTestingFlag"}, - {202, nullptr, "SetFieldTestingFlag"}, - {203, C<&ISystemSettingsServer::GetPanelCrcMode>, "GetPanelCrcMode"}, - {204, C<&ISystemSettingsServer::SetPanelCrcMode>, "SetPanelCrcMode"}, - {205, nullptr, "GetNxControllerSettingsEx"}, - {206, nullptr, "SetNxControllerSettingsEx"}, - {207, nullptr, "GetHearingProtectionSafeguardFlag"}, - {208, nullptr, "SetHearingProtectionSafeguardFlag"}, - {209, nullptr, "GetHearingProtectionSafeguardRemainingTime"}, - {210, nullptr, "SetHearingProtectionSafeguardRemainingTime"}, - {221, nullptr, "GetForceMonauralOutputFlag"}, //17.0.0+ - {222, nullptr, "SetForceMonauralOutputFlag"}, //17.0.0+ - {251, nullptr, "GetAccountIdentificationSettings"}, //18.0.0+ - {252, nullptr, "SetAccountIdentificationSettings"}, //18.0.0+ - {263, nullptr, "AcquireVphymDirtyFlagEventHandle"}, //20.0.0+ - {264, nullptr, "GetVphymDirtyFlags"}, //20.0.0+ - {282, nullptr, "ConvertToProductModel"}, //20.0.0+ - {283, nullptr, "ConvertToProductModelName"}, //20.0.0+ - {289, nullptr, "GetDefaultAccountIdentificationFlagSet"}, //20.0.0+ - {300, nullptr, "AcquirePushNotificationDirtyFlagEventHandle"}, //20.0.0+ - {301, nullptr, "GetPushNotificationDirtyFlags"}, //20.0.0+ - {306, nullptr, "GetPinCodeReregistrationGuideAccounts"}, //20.0.0+ - {307, nullptr, "SetPinCodeReregistrationGuideAccounts"}, //20.0.0+ - {315, C<&ISystemSettingsServer::GetHttpAuthConfigs>, "GetHttpAuthConfigs"}, //21.0.0+ - {319, C<&ISystemSettingsServer::GetAccountUserSettings>, "GetAccountUserSettings"}, //21.0.0+ - {320, nullptr, "SetAccountUserSettings"}, //21.0.0+ - {321, C<&ISystemSettingsServer::GetDefaultAccountUserSettings>, "GetDefaultAccountUserSettings"}, //21.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); - + : ServiceFramework{system_, "set:sys"} { SetupSettings(); m_system_settings.region_code = diff --git a/src/core/hle/service/set/system_settings_server.h b/src/core/hle/service/set/system_settings_server.h index 1d56e61f88..471ed61176 100644 --- a/src/core/hle/service/set/system_settings_server.h +++ b/src/core/hle/service/set/system_settings_server.h @@ -179,7 +179,7 @@ private: void StoreSettings(); void SetSaveNeeded(); - Core::System& m_system; + std::optional FindRequest(u32 key) override; SystemSettings m_system_settings{}; PrivateSettings m_private_settings{}; DeviceSettings m_device_settings{}; diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp index c75c5437df..5c196b3218 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp @@ -18,7 +18,16 @@ #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/server_manager.h" #include "core/hle/service/sm/sm.h" -#include "core/hle/service/sm/sm_controller.h" +#include "common/assert.h" +#include "common/logging.h" +#include "core/core.h" +#include "core/hle/kernel/k_client_port.h" +#include "core/hle/kernel/k_port.h" +#include "core/hle/kernel/k_scoped_resource_reservation.h" +#include "core/hle/kernel/k_server_session.h" +#include "core/hle/kernel/k_session.h" +#include "core/hle/service/ipc_helpers.h" +#include "core/hle/service/server_manager.h" namespace Service::SM { @@ -27,6 +36,116 @@ constexpr Result ResultAlreadyRegistered(ErrorModule::SM, 4); constexpr Result ResultInvalidServiceName(ErrorModule::SM, 6); constexpr Result ResultNotRegistered(ErrorModule::SM, 7); +class Controller final : public ServiceFramework { +public: + // https://switchbrew.org/wiki/IPC_Marshalling + explicit Controller(Core::System& system_) : ServiceFramework{system_, "IpcController"} {} + ~Controller() override = default; + + void ConvertCurrentObjectToDomain(HLERequestContext& ctx) { + ASSERT_MSG(!ctx.GetManager()->IsDomain(), "Session is already a domain"); + LOG_DEBUG(Service, "called, server_session={}", ctx.Session()->GetId()); + ctx.GetManager()->ConvertToDomainOnRequestEnd(); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(1); // Converted sessions start with 1 request handler + } + + void CloneCurrentObject(HLERequestContext& ctx) { + LOG_DEBUG(Service, "called"); + + auto session_manager = ctx.GetManager(); + + // FIXME: this is duplicated from the SVC, it should just call it instead + // once this is a proper process + + // Reserve a new session from the process resource limit. + Kernel::KScopedResourceReservation session_reservation(system.Kernel(), Kernel::GetCurrentProcessPointer(kernel), Kernel::LimitableResource::SessionCountMax); + ASSERT(session_reservation.Succeeded()); + + // Create the session. + Kernel::KSession* session = Kernel::KSession::Create(kernel); + ASSERT(session != nullptr); + + // Initialize the session. + session->Initialize(kernel, nullptr, 0); + + // Commit the session reservation. + session_reservation.Commit(); + + // Register the session. + Kernel::KSession::Register(kernel, session); + + // Register with server manager. + session_manager->GetServerManager().RegisterSession(&session->GetServerSession(), + session_manager); + + // We succeeded. + IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; + rb.Push(ResultSuccess); + rb.PushMoveObjects(ctx, session->GetClientSession()); + } + + void CloneCurrentObjectEx(HLERequestContext& ctx) { + LOG_DEBUG(Service, "called"); + + CloneCurrentObject(ctx); + } + + void QueryPointerBufferSize(HLERequestContext& ctx) { + LOG_DEBUG(Service, "called"); + + auto* process = Kernel::GetCurrentProcessPointer(kernel); + ASSERT(process != nullptr); + + u32 buffer_size = process->GetPointerBufferSize(); + if (buffer_size > (std::numeric_limits::max)()) { + LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping"); + buffer_size = (std::numeric_limits::max)(); + } + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(static_cast(buffer_size)); + } + + void SetPointerBufferSize(HLERequestContext& ctx) { + LOG_DEBUG(Service, "called"); + + auto* process = Kernel::GetCurrentProcessPointer(kernel); + ASSERT(process != nullptr); + + IPC::RequestParser rp{ctx}; + + u32 requested_size = rp.PopRaw(); + + if (requested_size > (std::numeric_limits::max)()) { + LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF"); + requested_size = (std::numeric_limits::max)(); + } + + process->SetPointerBufferSize(requested_size); + + LOG_INFO(Service, "Pointer buffer size dynamically updated to {:#x} bytes by process", requested_size); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); + } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &Controller::ConvertCurrentObjectToDomain, "ConvertCurrentObjectToDomain"}, + FunctionInfo{1, nullptr, "CopyFromCurrentDomain"}, + FunctionInfo{2, &Controller::CloneCurrentObject, "CloneCurrentObject"}, + FunctionInfo{3, &Controller::QueryPointerBufferSize, "QueryPointerBufferSize"}, + FunctionInfo{4, &Controller::CloneCurrentObjectEx, "CloneCurrentObjectEx"}, + FunctionInfo{5, &Controller::SetPointerBufferSize, "SetPointerBufferSize"} //TODO: where does this come from + ); +}; + ServiceManager::ServiceManager(Kernel::KernelCore& kernel_) : kernel{kernel_} { controller_interface = std::make_unique(kernel.System()); } @@ -112,6 +231,51 @@ Result ServiceManager::GetServicePort(Kernel::KClientPort** out_client_port, return ResultSuccess; } +/// Interface to "sm:" service +class SM final : public ServiceFramework { +public: + explicit SM(ServiceManager& service_manager_, Core::System& system_); + ~SM() override; + +private: + void Initialize(HLERequestContext& ctx); + void GetServiceCmif(HLERequestContext& ctx); + void GetServiceTipc(HLERequestContext& ctx); + void RegisterServiceCmif(HLERequestContext& ctx); + void RegisterServiceTipc(HLERequestContext& ctx); + void UnregisterService(HLERequestContext& ctx); + void AtmosphereHasService(HLERequestContext& ctx); + + Result GetServiceImpl(Kernel::KClientSession** out_client_session, HLERequestContext& ctx); + void RegisterServiceImpl(HLERequestContext& ctx, std::string name, u32 max_session_count, bool is_light); + + // TODO: We reuse function list for both TIPC and non-TIPC + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + std::optional FindRequestTipc(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &SM::Initialize, "Initialize"}, + FunctionInfo{1, &SM::GetServiceTipc, "GetService"}, + FunctionInfo{2, &SM::RegisterServiceTipc, "RegisterService"}, + FunctionInfo{3, &SM::UnregisterService, "UnregisterService"}, + FunctionInfo{4, nullptr, "DetachClient"}, + FunctionInfo{65000, nullptr, "AtmosphereInstallMitm"}, + FunctionInfo{65001, nullptr, "AtmosphereUninstallMitm"}, + FunctionInfo{65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"}, + FunctionInfo{65003, nullptr, "AtmosphereAcknowledgeMitmSession"}, + FunctionInfo{65004, nullptr, "AtmosphereHasMitm"}, + FunctionInfo{65005, nullptr, "AtmosphereWaitMitm"}, + FunctionInfo{65006, nullptr, "AtmosphereDeclareFutureMitm"}, + FunctionInfo{65100, &SM::AtmosphereHasService, "AtmosphereHasService"}, + FunctionInfo{65101, nullptr, "AtmosphereWaitService"} + ); + + ServiceManager& service_manager; +}; + /** * SM::Initialize service function * Inputs: @@ -194,7 +358,7 @@ Result SM::GetServiceImpl(Kernel::KClientSession** out_client_session, HLEReques // Create a new session. Kernel::KClientSession* session{}; - if (const auto result = client_port->CreateSession(kernel, &session); result.IsError()) { + if (const auto result = client_port->CreateSession(system.Kernel(), &session); result.IsError()) { LOG_ERROR(Service_SM, "called service={} -> error {:#08x}", name, result.raw); return result; } @@ -265,42 +429,7 @@ void SM::AtmosphereHasService(HLERequestContext& ctx) { SM::SM(ServiceManager& service_manager_, Core::System& system_) : ServiceFramework{system_, "sm:", 64} , service_manager{service_manager_} - , kernel{system_.Kernel()} -{ - RegisterHandlers({ - {0, &SM::Initialize, "Initialize"}, - {1, &SM::GetServiceCmif, "GetService"}, - {2, &SM::RegisterServiceCmif, "RegisterService"}, - {3, &SM::UnregisterService, "UnregisterService"}, - {4, nullptr, "DetachClient"}, - // TODO: are these non-TIPC as well? - {65000, nullptr, "AtmosphereInstallMitm"}, - {65001, nullptr, "AtmosphereUninstallMitm"}, - {65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"}, - {65003, nullptr, "AtmosphereAcknowledgeMitmSession"}, - {65004, nullptr, "AtmosphereHasMitm"}, - {65005, nullptr, "AtmosphereWaitMitm"}, - {65006, nullptr, "AtmosphereDeclareFutureMitm"}, - {65100, &SM::AtmosphereHasService, "AtmosphereHasService"}, - {65101, nullptr, "AtmosphereWaitService"}, - }); - RegisterHandlersTipc({ - {0, &SM::Initialize, "Initialize"}, - {1, &SM::GetServiceTipc, "GetService"}, - {2, &SM::RegisterServiceTipc, "RegisterService"}, - {3, &SM::UnregisterService, "UnregisterService"}, - {4, nullptr, "DetachClient"}, - {65000, nullptr, "AtmosphereInstallMitm"}, - {65001, nullptr, "AtmosphereUninstallMitm"}, - {65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"}, - {65003, nullptr, "AtmosphereAcknowledgeMitmSession"}, - {65004, nullptr, "AtmosphereHasMitm"}, - {65005, nullptr, "AtmosphereWaitMitm"}, - {65006, nullptr, "AtmosphereDeclareFutureMitm"}, - {65100, &SM::AtmosphereHasService, "AtmosphereHasService"}, - {65101, nullptr, "AtmosphereWaitService"}, - }); -} +{} SM::~SM() = default; diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h index c520a46fb2..f17fc60080 100644 --- a/src/core/hle/service/sm/sm.h +++ b/src/core/hle/service/sm/sm.h @@ -33,29 +33,7 @@ class SessionRequestHandler; namespace Service::SM { class Controller; - -/// Interface to "sm:" service -class SM final : public ServiceFramework { -public: - explicit SM(ServiceManager& service_manager_, Core::System& system_); - ~SM() override; - -private: - void Initialize(HLERequestContext& ctx); - void GetServiceCmif(HLERequestContext& ctx); - void GetServiceTipc(HLERequestContext& ctx); - void RegisterServiceCmif(HLERequestContext& ctx); - void RegisterServiceTipc(HLERequestContext& ctx); - void UnregisterService(HLERequestContext& ctx); - void AtmosphereHasService(HLERequestContext& ctx); - - Result GetServiceImpl(Kernel::KClientSession** out_client_session, HLERequestContext& ctx); - void RegisterServiceImpl(HLERequestContext& ctx, std::string name, u32 max_session_count, - bool is_light); - - ServiceManager& service_manager; - Kernel::KernelCore& kernel; -}; +class SM; class ServiceManager { public: diff --git a/src/core/hle/service/sm/sm_controller.cpp b/src/core/hle/service/sm/sm_controller.cpp deleted file mode 100644 index 125eb4a247..0000000000 --- a/src/core/hle/service/sm/sm_controller.cpp +++ /dev/null @@ -1,128 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "common/assert.h" -#include "common/logging.h" -#include "core/core.h" -#include "core/hle/kernel/k_client_port.h" -#include "core/hle/kernel/k_port.h" -#include "core/hle/kernel/k_scoped_resource_reservation.h" -#include "core/hle/kernel/k_server_session.h" -#include "core/hle/kernel/k_session.h" -#include "core/hle/service/ipc_helpers.h" -#include "core/hle/service/server_manager.h" -#include "core/hle/service/sm/sm_controller.h" - -namespace Service::SM { - -void Controller::ConvertCurrentObjectToDomain(HLERequestContext& ctx) { - ASSERT_MSG(!ctx.GetManager()->IsDomain(), "Session is already a domain"); - LOG_DEBUG(Service, "called, server_session={}", ctx.Session()->GetId()); - ctx.GetManager()->ConvertToDomainOnRequestEnd(); - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(1); // Converted sessions start with 1 request handler -} - -void Controller::CloneCurrentObject(HLERequestContext& ctx) { - LOG_DEBUG(Service, "called"); - - auto session_manager = ctx.GetManager(); - - // FIXME: this is duplicated from the SVC, it should just call it instead - // once this is a proper process - - // Reserve a new session from the process resource limit. - Kernel::KScopedResourceReservation session_reservation(system.Kernel(), Kernel::GetCurrentProcessPointer(kernel), Kernel::LimitableResource::SessionCountMax); - ASSERT(session_reservation.Succeeded()); - - // Create the session. - Kernel::KSession* session = Kernel::KSession::Create(kernel); - ASSERT(session != nullptr); - - // Initialize the session. - session->Initialize(kernel, nullptr, 0); - - // Commit the session reservation. - session_reservation.Commit(); - - // Register the session. - Kernel::KSession::Register(kernel, session); - - // Register with server manager. - session_manager->GetServerManager().RegisterSession(&session->GetServerSession(), - session_manager); - - // We succeeded. - IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; - rb.Push(ResultSuccess); - rb.PushMoveObjects(ctx, session->GetClientSession()); -} - -void Controller::CloneCurrentObjectEx(HLERequestContext& ctx) { - LOG_DEBUG(Service, "called"); - - CloneCurrentObject(ctx); -} - -void Controller::QueryPointerBufferSize(HLERequestContext& ctx) { - LOG_DEBUG(Service, "called"); - - auto* process = Kernel::GetCurrentProcessPointer(kernel); - ASSERT(process != nullptr); - - u32 buffer_size = process->GetPointerBufferSize(); - if (buffer_size > (std::numeric_limits::max)()) { - LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping"); - buffer_size = (std::numeric_limits::max)(); - } - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(static_cast(buffer_size)); -} - -void Controller::SetPointerBufferSize(HLERequestContext& ctx) { - LOG_DEBUG(Service, "called"); - - auto* process = Kernel::GetCurrentProcessPointer(kernel); - ASSERT(process != nullptr); - - IPC::RequestParser rp{ctx}; - - u32 requested_size = rp.PopRaw(); - - if (requested_size > (std::numeric_limits::max)()) { - LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF"); - requested_size = (std::numeric_limits::max)(); - } - - process->SetPointerBufferSize(requested_size); - - LOG_INFO(Service, "Pointer buffer size dynamically updated to {:#x} bytes by process", requested_size); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); -} - - -// https://switchbrew.org/wiki/IPC_Marshalling -Controller::Controller(Core::System& system_) : ServiceFramework{system_, "IpcController"} { - static const FunctionInfo functions[] = { - {0, &Controller::ConvertCurrentObjectToDomain, "ConvertCurrentObjectToDomain"}, - {1, nullptr, "CopyFromCurrentDomain"}, - {2, &Controller::CloneCurrentObject, "CloneCurrentObject"}, - {3, &Controller::QueryPointerBufferSize, "QueryPointerBufferSize"}, - {4, &Controller::CloneCurrentObjectEx, "CloneCurrentObjectEx"}, - {5, &Controller::SetPointerBufferSize, "SetPointerBufferSize"}, //TODO: where does this come from - }; - RegisterHandlers(functions); -} - -Controller::~Controller() = default; - -} // namespace Service::SM diff --git a/src/core/hle/service/sm/sm_controller.h b/src/core/hle/service/sm/sm_controller.h deleted file mode 100644 index f7e529a269..0000000000 --- a/src/core/hle/service/sm/sm_controller.h +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include "core/hle/service/service.h" - -namespace Core { -class System; -} - -namespace Service::SM { - -class Controller final : public ServiceFramework { -public: - explicit Controller(Core::System& system_); - ~Controller() override; - -private: - void ConvertCurrentObjectToDomain(HLERequestContext& ctx); - void CloneCurrentObject(HLERequestContext& ctx); - void CloneCurrentObjectEx(HLERequestContext& ctx); - void QueryPointerBufferSize(HLERequestContext& ctx); - void SetPointerBufferSize(HLERequestContext& ctx); -}; - -} // namespace Service::SM diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index 0137a3be66..63bd7051ca 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -1083,59 +1083,6 @@ void BSD_USA::OnProxyPacketReceived(const Network::ProxyPacket& packet) { BSD_USA::BSD_USA(Core::System& system_, const char* name, bool is_user_) : ServiceFramework{system_, name} , is_user{is_user_} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &BSD_USA::RegisterClient, "RegisterClient"}, - {1, &BSD_USA::StartMonitoring, "StartMonitoring"}, - {2, &BSD_USA::Socket, "Socket"}, - {3, &BSD_USA::SocketExempt, "SocketExempt"}, - {4, nullptr, "Open"}, - {5, &BSD_USA::Select, "Select"}, - {6, &BSD_USA::Poll, "Poll"}, - {7, nullptr, "Sysctl"}, - {8, &BSD_USA::Recv, "Recv"}, - {9, &BSD_USA::RecvFrom, "RecvFrom"}, - {10, &BSD_USA::Send, "Send"}, - {11, &BSD_USA::SendTo, "SendTo"}, - {12, &BSD_USA::Accept, "Accept"}, - {13, &BSD_USA::Bind, "Bind"}, - {14, &BSD_USA::Connect, "Connect"}, - {15, &BSD_USA::GetPeerName, "GetPeerName"}, - {16, &BSD_USA::GetSockName, "GetSockName"}, - {17, &BSD_USA::GetSockOpt, "GetSockOpt"}, - {18, &BSD_USA::Listen, "Listen"}, - {19, nullptr, "Ioctl"}, - {20, &BSD_USA::Fcntl, "Fcntl"}, - {21, &BSD_USA::SetSockOpt, "SetSockOpt"}, - {22, &BSD_USA::Shutdown, "Shutdown"}, - {23, nullptr, "ShutdownAllSockets"}, - {24, &BSD_USA::Write, "Write"}, - {25, &BSD_USA::Read, "Read"}, - {26, &BSD_USA::Close, "Close"}, - {27, &BSD_USA::DuplicateSocket, "DuplicateSocket"}, - {28, nullptr, "GetResourceStatistics"}, - {29, nullptr, "RecvMMsg"}, //3.0.0+ - {30, nullptr, "SendMMsg"}, //3.0.0+ - {31, &BSD_USA::EventFd, "EventFd"}, //7.0.0+ - {32, nullptr, "RegisterResourceStatisticsName"}, //7.0.0+ - {33, nullptr, "RegisterClientShared"}, //10.0.0+ - {34, nullptr, "GetSocketStatistics"}, //15.0.0+ - {35, nullptr, "NifIoctl"}, //17.0.0+ - {36, nullptr, "Unknown36"}, //18.0.0+ - {37, nullptr, "Unknown37"}, //18.0.0+ - {38, nullptr, "Unknown38"}, //18.0.0+ - {39, nullptr, "Unknown39"}, //20.0.0+ - {40, nullptr, "Unknown40"}, //20.0.0+ - {41, nullptr, "Unknown41"}, //21.0.0+ - {42, nullptr, "Unknown42"}, //21.0.0+ - {43, nullptr, "Unknown43"}, //21.0.0+ - {200, nullptr, "SetThreadCoreMask"}, //15.0.0+ - {201, nullptr, "GetThreadCoreMask"}, //15.0.0+ - }; - // clang-format on - - RegisterHandlers(functions); - if (auto room_member = Network::GetRoomMember().lock()) { proxy_packet_received = room_member->BindOnProxyPacketReceived( [this](const Network::ProxyPacket& packet) { OnProxyPacketReceived(packet); }); @@ -1156,40 +1103,12 @@ std::unique_lock BSD_USA::LockService() noexcept { BSDCFG::BSDCFG(Core::System& system_, const char *name) : ServiceFramework{system_, name} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "SetIfUp"}, - {1, nullptr, "SetIfUpWithEvent"}, - {2, nullptr, "CancelIf"}, - {3, nullptr, "SetIfDown"}, - {4, nullptr, "GetIfState"}, - {5, nullptr, "DhcpRenew"}, - {6, nullptr, "AddStaticArpEntry"}, - {7, nullptr, "RemoveArpEntry"}, - {8, nullptr, "LookupArpEntry"}, - {9, nullptr, "LookupArpEntry2"}, - {10, nullptr, "ClearArpEntries"}, - {11, nullptr, "ClearArpEntries2"}, - {12, nullptr, "PrintArpEntries"}, - {13, nullptr, "Unknown13"}, - {14, nullptr, "Unknown14"}, - {15, nullptr, "Unknown15"}, - }; - // clang-format on - - RegisterHandlers(functions); } BSDCFG::~BSDCFG() = default; BSD_NU::BSD_NU(Core::System& system_) : ServiceFramework{system_, "bsd:nu"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "CreateUserService"}, - }; - // clang-format on - RegisterHandlers(functions); } BSD_NU::~BSD_NU() = default; diff --git a/src/core/hle/service/sockets/bsd.h b/src/core/hle/service/sockets/bsd.h index b542e196f0..c2aa343d51 100644 --- a/src/core/hle/service/sockets/bsd.h +++ b/src/core/hle/service/sockets/bsd.h @@ -189,6 +189,58 @@ private: protected: std::unique_lock LockService() noexcept override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &BSD_USA::RegisterClient, "RegisterClient"}, + FunctionInfo{1, &BSD_USA::StartMonitoring, "StartMonitoring"}, + FunctionInfo{2, &BSD_USA::Socket, "Socket"}, + FunctionInfo{3, &BSD_USA::SocketExempt, "SocketExempt"}, + FunctionInfo{4, nullptr, "Open"}, + FunctionInfo{5, &BSD_USA::Select, "Select"}, + FunctionInfo{6, &BSD_USA::Poll, "Poll"}, + FunctionInfo{7, nullptr, "Sysctl"}, + FunctionInfo{8, &BSD_USA::Recv, "Recv"}, + FunctionInfo{9, &BSD_USA::RecvFrom, "RecvFrom"}, + FunctionInfo{10, &BSD_USA::Send, "Send"}, + FunctionInfo{11, &BSD_USA::SendTo, "SendTo"}, + FunctionInfo{12, &BSD_USA::Accept, "Accept"}, + FunctionInfo{13, &BSD_USA::Bind, "Bind"}, + FunctionInfo{14, &BSD_USA::Connect, "Connect"}, + FunctionInfo{15, &BSD_USA::GetPeerName, "GetPeerName"}, + FunctionInfo{16, &BSD_USA::GetSockName, "GetSockName"}, + FunctionInfo{17, &BSD_USA::GetSockOpt, "GetSockOpt"}, + FunctionInfo{18, &BSD_USA::Listen, "Listen"}, + FunctionInfo{19, nullptr, "Ioctl"}, + FunctionInfo{20, &BSD_USA::Fcntl, "Fcntl"}, + FunctionInfo{21, &BSD_USA::SetSockOpt, "SetSockOpt"}, + FunctionInfo{22, &BSD_USA::Shutdown, "Shutdown"}, + FunctionInfo{23, nullptr, "ShutdownAllSockets"}, + FunctionInfo{24, &BSD_USA::Write, "Write"}, + FunctionInfo{25, &BSD_USA::Read, "Read"}, + FunctionInfo{26, &BSD_USA::Close, "Close"}, + FunctionInfo{27, &BSD_USA::DuplicateSocket, "DuplicateSocket"}, + FunctionInfo{28, nullptr, "GetResourceStatistics"}, + FunctionInfo{29, nullptr, "RecvMMsg", MakeVersionGate({3,0,0})}, + FunctionInfo{30, nullptr, "SendMMsg", MakeVersionGate({3,0,0})}, + FunctionInfo{31, &BSD_USA::EventFd, "EventFd", MakeVersionGate({7,0,0})}, + FunctionInfo{32, nullptr, "RegisterResourceStatisticsName", MakeVersionGate({7,0,0})}, + FunctionInfo{33, nullptr, "RegisterClientShared", MakeVersionGate({10,0,0})}, + FunctionInfo{34, nullptr, "GetSocketStatistics", MakeVersionGate({15,0,0})}, + FunctionInfo{35, nullptr, "NifIoctl", MakeVersionGate({17,0,0})}, + FunctionInfo{36, nullptr, "Unknown36", MakeVersionGate({18,0,0})}, + FunctionInfo{37, nullptr, "Unknown37", MakeVersionGate({18,0,0})}, + FunctionInfo{38, nullptr, "Unknown38", MakeVersionGate({18,0,0})}, + FunctionInfo{39, nullptr, "Unknown39", MakeVersionGate({20,0,0})}, + FunctionInfo{40, nullptr, "Unknown40", MakeVersionGate({20,0,0})}, + FunctionInfo{41, nullptr, "Unknown41", MakeVersionGate({21,0,0})}, + FunctionInfo{42, nullptr, "Unknown42", MakeVersionGate({21,0,0})}, + FunctionInfo{43, nullptr, "Unknown43", MakeVersionGate({21,0,0})}, + FunctionInfo{200, nullptr, "SetThreadCoreMask", MakeVersionGate({15,0,0})}, + FunctionInfo{201, nullptr, "GetThreadCoreMask", MakeVersionGate({15,0,0})} + ); bool is_user = false; }; @@ -196,12 +248,41 @@ class BSDCFG final : public ServiceFramework { public: explicit BSDCFG(Core::System& system_, const char *name); ~BSDCFG() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "SetIfUp"}, + FunctionInfo{1, nullptr, "SetIfUpWithEvent"}, + FunctionInfo{2, nullptr, "CancelIf"}, + FunctionInfo{3, nullptr, "SetIfDown"}, + FunctionInfo{4, nullptr, "GetIfState"}, + FunctionInfo{5, nullptr, "DhcpRenew"}, + FunctionInfo{6, nullptr, "AddStaticArpEntry"}, + FunctionInfo{7, nullptr, "RemoveArpEntry"}, + FunctionInfo{8, nullptr, "LookupArpEntry"}, + FunctionInfo{9, nullptr, "LookupArpEntry2"}, + FunctionInfo{10, nullptr, "ClearArpEntries"}, + FunctionInfo{11, nullptr, "ClearArpEntries2"}, + FunctionInfo{12, nullptr, "PrintArpEntries"}, + FunctionInfo{13, nullptr, "Unknown13"}, + FunctionInfo{14, nullptr, "Unknown14"}, + FunctionInfo{15, nullptr, "Unknown15"} + ); }; class BSD_NU final : public ServiceFramework { public: explicit BSD_NU(Core::System& system_); ~BSD_NU() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "CreateUserService"} + ); }; } // namespace Service::Sockets diff --git a/src/core/hle/service/sockets/nsd.cpp b/src/core/hle/service/sockets/nsd.cpp index 241f2971ca..8f042aee75 100644 --- a/src/core/hle/service/sockets/nsd.cpp +++ b/src/core/hle/service/sockets/nsd.cpp @@ -29,38 +29,6 @@ struct EnvironmentIdentifier { static_assert(sizeof(EnvironmentIdentifier) == 0x8); NSD::NSD(Core::System& system_, const char* name) : ServiceFramework{system_, name} { - // clang-format off - static const FunctionInfo functions[] = { - {5, nullptr, "GetSettingUrl"}, - {10, nullptr, "GetSettingName"}, - {11, &NSD::GetEnvironmentIdentifier, "GetEnvironmentIdentifier"}, - {12, nullptr, "GetDeviceId"}, - {13, nullptr, "DeleteSettings"}, - {14, nullptr, "ImportSettings"}, - {15, &NSD::SetChangeEnvironmentIdentifierDisabled, "SetChangeEnvironmentIdentifierDisabled"}, - {20, &NSD::Resolve, "Resolve"}, - {21, &NSD::ResolveEx, "ResolveEx"}, - {30, nullptr, "GetNasServiceSetting"}, - {31, nullptr, "GetNasServiceSettingEx"}, - {40, nullptr, "GetNasRequestFqdn"}, - {41, nullptr, "GetNasRequestFqdnEx"}, - {42, nullptr, "GetNasApiFqdn"}, - {43, nullptr, "GetNasApiFqdnEx"}, - {50, nullptr, "GetCurrentSetting"}, - {51, nullptr, "WriteTestParameter"}, - {52, nullptr, "ReadTestParameter"}, - {60, nullptr, "ReadSaveDataFromFsForTest"}, - {61, nullptr, "WriteSaveDataToFsForTest"}, - {62, nullptr, "DeleteSaveDataOfFsForTest"}, - {63, nullptr, "IsChangeEnvironmentIdentifierDisabled"}, - {64, nullptr, "SetWithoutDomainExchangeFqdns"}, - {100, &NSD::GetApplicationServerEnvironmentType, "GetApplicationServerEnvironmentType"}, - {101, nullptr, "SetApplicationServerEnvironmentType"}, - {102, nullptr, "DeleteApplicationServerEnvironmentType"}, - }; - // clang-format on - - RegisterHandlers(functions); } static std::string ResolveImpl(const std::string& fqdn_in) { diff --git a/src/core/hle/service/sockets/nsd.h b/src/core/hle/service/sockets/nsd.h index e4a4588467..f3e4d48aff 100644 --- a/src/core/hle/service/sockets/nsd.h +++ b/src/core/hle/service/sockets/nsd.h @@ -25,6 +25,38 @@ private: void ResolveEx(HLERequestContext& ctx); void GetEnvironmentIdentifier(HLERequestContext& ctx); void GetApplicationServerEnvironmentType(HLERequestContext& ctx); + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{5, nullptr, "GetSettingUrl"}, + FunctionInfo{10, nullptr, "GetSettingName"}, + FunctionInfo{11, &NSD::GetEnvironmentIdentifier, "GetEnvironmentIdentifier"}, + FunctionInfo{12, nullptr, "GetDeviceId"}, + FunctionInfo{13, nullptr, "DeleteSettings"}, + FunctionInfo{14, nullptr, "ImportSettings"}, + FunctionInfo{15, &NSD::SetChangeEnvironmentIdentifierDisabled, "SetChangeEnvironmentIdentifierDisabled"}, + FunctionInfo{20, &NSD::Resolve, "Resolve"}, + FunctionInfo{21, &NSD::ResolveEx, "ResolveEx"}, + FunctionInfo{30, nullptr, "GetNasServiceSetting"}, + FunctionInfo{31, nullptr, "GetNasServiceSettingEx"}, + FunctionInfo{40, nullptr, "GetNasRequestFqdn"}, + FunctionInfo{41, nullptr, "GetNasRequestFqdnEx"}, + FunctionInfo{42, nullptr, "GetNasApiFqdn"}, + FunctionInfo{43, nullptr, "GetNasApiFqdnEx"}, + FunctionInfo{50, nullptr, "GetCurrentSetting"}, + FunctionInfo{51, nullptr, "WriteTestParameter"}, + FunctionInfo{52, nullptr, "ReadTestParameter"}, + FunctionInfo{60, nullptr, "ReadSaveDataFromFsForTest"}, + FunctionInfo{61, nullptr, "WriteSaveDataToFsForTest"}, + FunctionInfo{62, nullptr, "DeleteSaveDataOfFsForTest"}, + FunctionInfo{63, nullptr, "IsChangeEnvironmentIdentifierDisabled"}, + FunctionInfo{64, nullptr, "SetWithoutDomainExchangeFqdns"}, + FunctionInfo{100, &NSD::GetApplicationServerEnvironmentType, "GetApplicationServerEnvironmentType"}, + FunctionInfo{101, nullptr, "SetApplicationServerEnvironmentType"}, + FunctionInfo{102, nullptr, "DeleteApplicationServerEnvironmentType"} + ); }; } // namespace Service::Sockets diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp index 93c01bf786..c89705356e 100644 --- a/src/core/hle/service/sockets/sfdnsres.cpp +++ b/src/core/hle/service/sockets/sfdnsres.cpp @@ -21,25 +21,6 @@ namespace Service::Sockets { SFDNSRES::SFDNSRES(Core::System& system_) : ServiceFramework{system_, "sfdnsres"} { - static const FunctionInfo functions[] = { - {0, nullptr, "SetDnsAddressesPrivateRequest"}, - {1, nullptr, "GetDnsAddressPrivateRequest"}, - {2, &SFDNSRES::GetHostByNameRequest, "GetHostByNameRequest"}, - {3, nullptr, "GetHostByAddrRequest"}, - {4, nullptr, "GetHostStringErrorRequest"}, - {5, &SFDNSRES::GetGaiStringErrorRequest, "GetGaiStringErrorRequest"}, - {6, &SFDNSRES::GetAddrInfoRequest, "GetAddrInfoRequest"}, - {7, nullptr, "GetNameInfoRequest"}, - {8, nullptr, "RequestCancelHandleRequest"}, - {9, nullptr, "CancelRequest"}, - {10, &SFDNSRES::GetHostByNameRequestWithOptions, "GetHostByNameRequestWithOptions"}, - {11, nullptr, "GetHostByAddrRequestWithOptions"}, - {12, &SFDNSRES::GetAddrInfoRequestWithOptions, "GetAddrInfoRequestWithOptions"}, - {13, nullptr, "GetNameInfoRequestWithOptions"}, - {14, &SFDNSRES::ResolverSetOptionRequest, "ResolverSetOptionRequest"}, - {15, nullptr, "ResolverGetOptionRequest"}, - }; - RegisterHandlers(functions); } SFDNSRES::~SFDNSRES() = default; @@ -410,14 +391,6 @@ void SFDNSRES::ResolverSetOptionRequest(HLERequestContext& ctx) { DNS_PRIV::DNS_PRIV(Core::System& system_) : ServiceFramework{system_, "dns:priv"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Cmd0"}, - {1, nullptr, "Cmd1"}, - {2, nullptr, "Cmd2"}, - }; - // clang-format on - RegisterHandlers(functions); } DNS_PRIV::~DNS_PRIV() = default; diff --git a/src/core/hle/service/sockets/sfdnsres.h b/src/core/hle/service/sockets/sfdnsres.h index 4302edc43e..b365d03b2d 100644 --- a/src/core/hle/service/sockets/sfdnsres.h +++ b/src/core/hle/service/sockets/sfdnsres.h @@ -26,12 +26,43 @@ private: void GetAddrInfoRequest(HLERequestContext& ctx); void GetAddrInfoRequestWithOptions(HLERequestContext& ctx); void ResolverSetOptionRequest(HLERequestContext& ctx); + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "SetDnsAddressesPrivateRequest"}, + FunctionInfo{1, nullptr, "GetDnsAddressPrivateRequest"}, + FunctionInfo{2, &SFDNSRES::GetHostByNameRequest, "GetHostByNameRequest"}, + FunctionInfo{3, nullptr, "GetHostByAddrRequest"}, + FunctionInfo{4, nullptr, "GetHostStringErrorRequest"}, + FunctionInfo{5, &SFDNSRES::GetGaiStringErrorRequest, "GetGaiStringErrorRequest"}, + FunctionInfo{6, &SFDNSRES::GetAddrInfoRequest, "GetAddrInfoRequest"}, + FunctionInfo{7, nullptr, "GetNameInfoRequest"}, + FunctionInfo{8, nullptr, "RequestCancelHandleRequest"}, + FunctionInfo{9, nullptr, "CancelRequest"}, + FunctionInfo{10, &SFDNSRES::GetHostByNameRequestWithOptions, "GetHostByNameRequestWithOptions"}, + FunctionInfo{11, nullptr, "GetHostByAddrRequestWithOptions"}, + FunctionInfo{12, &SFDNSRES::GetAddrInfoRequestWithOptions, "GetAddrInfoRequestWithOptions"}, + FunctionInfo{13, nullptr, "GetNameInfoRequestWithOptions"}, + FunctionInfo{14, &SFDNSRES::ResolverSetOptionRequest, "ResolverSetOptionRequest"}, + FunctionInfo{15, nullptr, "ResolverGetOptionRequest"} + ); }; class DNS_PRIV final : public ServiceFramework { public: explicit DNS_PRIV(Core::System& system_); ~DNS_PRIV() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Cmd0"}, + FunctionInfo{1, nullptr, "Cmd1"}, + FunctionInfo{2, nullptr, "Cmd2"} + ); }; } // namespace Service::Sockets diff --git a/src/core/hle/service/sockets/sockets.cpp b/src/core/hle/service/sockets/sockets.cpp index e96d7c5638..1c723e96a6 100644 --- a/src/core/hle/service/sockets/sockets.cpp +++ b/src/core/hle/service/sockets/sockets.cpp @@ -15,49 +15,49 @@ namespace Service::Sockets { class ETHC_C final : public ServiceFramework { public: explicit ETHC_C(Core::System& system_) - : ServiceFramework{system_, "ethc:c"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "Initialize"}, - {1, nullptr, "Cancel"}, - {2, nullptr, "GetResult"}, - {3, nullptr, "GetMediaList"}, - {4, nullptr, "SetMediaType"}, - {5, nullptr, "GetMediaType"}, - {6, nullptr, "GetMacAddress"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "ethc:c"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Initialize"}, + FunctionInfo{1, nullptr, "Cancel"}, + FunctionInfo{2, nullptr, "GetResult"}, + FunctionInfo{3, nullptr, "GetMediaList"}, + FunctionInfo{4, nullptr, "SetMediaType"}, + FunctionInfo{5, nullptr, "GetMediaType"}, + FunctionInfo{6, nullptr, "GetMacAddress"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class ETHC_I final : public ServiceFramework { public: explicit ETHC_I(Core::System& system_) - : ServiceFramework{system_, "ethc:i"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetReadableHandle"}, - {1, nullptr, "Cancel"}, - {2, nullptr, "GetResult"}, - {3, nullptr, "GetInterfaceList"}, - {4, nullptr, "GetInterfaceCount"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "ethc:i"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetReadableHandle"}, + FunctionInfo{1, nullptr, "Cancel"}, + FunctionInfo{2, nullptr, "GetResult"}, + FunctionInfo{3, nullptr, "GetInterfaceList"}, + FunctionInfo{4, nullptr, "GetInterfaceCount"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class ISfDriverServiceCreator final : public ServiceFramework { public: explicit ISfDriverServiceCreator(Core::System& system_) - : ServiceFramework{system_, "eth:nd"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "CreateDriverService"}, - }; - // clang-format on - RegisterHandlers(functions); + : ServiceFramework{system_, "eth:nd"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "CreateDriverService"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/spl/spl.cpp b/src/core/hle/service/spl/spl.cpp index 81be99c360..ad0251fac5 100644 --- a/src/core/hle/service/spl/spl.cpp +++ b/src/core/hle/service/spl/spl.cpp @@ -8,181 +8,22 @@ namespace Service::SPL { -SPL::SPL(Core::System& system_, std::shared_ptr module_) - : Interface(system_, std::move(module_), "spl:") { - // clang-format off - static const FunctionInfo functions[] = { - {0, &SPL::GetConfig, "GetConfig"}, - {1, &SPL::ModularExponentiate, "ModularExponentiate"}, - {5, &SPL::SetConfig, "SetConfig"}, - {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, - {11, &SPL::IsDevelopment, "IsDevelopment"}, - {24, &SPL::SetBootReason, "SetBootReason"}, - {25, &SPL::GetBootReason, "GetBootReason"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - +SPL::SPL(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:") {} SPL::~SPL() = default; -SPL_MIG::SPL_MIG(Core::System& system_, std::shared_ptr module_) - : Interface(system_, std::move(module_), "spl:mig") { - // clang-format off - static const FunctionInfo functions[] = { - {0, &SPL::GetConfig, "GetConfig"}, - {1, &SPL::ModularExponentiate, "ModularExponentiate"}, - {2, &SPL::GenerateAesKek, "GenerateAesKek"}, - {3, nullptr, "LoadAesKey"}, - {4, &SPL::GenerateAesKey, "GenerateAesKey"}, - {5, &SPL::SetConfig, "SetConfig"}, - {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, - {11, &SPL::IsDevelopment, "IsDevelopment"}, - {14, nullptr, "DecryptAesKey"}, - {15, nullptr, "CryptAesCtr"}, - {16, nullptr, "ComputeCmac"}, - {21, nullptr, "AllocateAesKeyslot"}, - {22, nullptr, "DeallocateAesKeySlot"}, - {23, nullptr, "GetAesKeyslotAvailableEvent"}, - {24, &SPL::SetBootReason, "SetBootReason"}, - {25, &SPL::GetBootReason, "GetBootReason"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - +SPL_MIG::SPL_MIG(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:mig") {} SPL_MIG::~SPL_MIG() = default; -SPL_FS::SPL_FS(Core::System& system_, std::shared_ptr module_) - : Interface(system_, std::move(module_), "spl:fs") { - // clang-format off - static const FunctionInfo functions[] = { - {0, &SPL::GetConfig, "GetConfig"}, - {1, &SPL::ModularExponentiate, "ModularExponentiate"}, - {2, nullptr, "GenerateAesKek"}, - {3, nullptr, "LoadAesKey"}, - {4, nullptr, "GenerateAesKey"}, - {5, &SPL::SetConfig, "SetConfig"}, - {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, - {9, nullptr, "ImportLotusKey"}, - {10, nullptr, "DecryptLotusMessage"}, - {11, &SPL::IsDevelopment, "IsDevelopment"}, - {12, nullptr, "GenerateSpecificAesKey"}, - {14, nullptr, "DecryptAesKey"}, - {15, nullptr, "CryptAesCtr"}, - {16, nullptr, "ComputeCmac"}, - {19, nullptr, "LoadTitleKey"}, - {21, nullptr, "AllocateAesKeyslot"}, - {22, nullptr, "DeallocateAesKeySlot"}, - {23, nullptr, "GetAesKeyslotAvailableEvent"}, - {24, &SPL::SetBootReason, "SetBootReason"}, - {25, &SPL::GetBootReason, "GetBootReason"}, - {31, nullptr, "GetPackage2Hash"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - +SPL_FS::SPL_FS(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:fs") {} SPL_FS::~SPL_FS() = default; -SPL_SSL::SPL_SSL(Core::System& system_, std::shared_ptr module_) - : Interface(system_, std::move(module_), "spl:ssl") { - // clang-format off - static const FunctionInfo functions[] = { - {0, &SPL::GetConfig, "GetConfig"}, - {1, &SPL::ModularExponentiate, "ModularExponentiate"}, - {2, nullptr, "GenerateAesKek"}, - {3, nullptr, "LoadAesKey"}, - {4, nullptr, "GenerateAesKey"}, - {5, &SPL::SetConfig, "SetConfig"}, - {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, - {11, &SPL::IsDevelopment, "IsDevelopment"}, - {13, nullptr, "DecryptDeviceUniqueData"}, - {14, nullptr, "DecryptAesKey"}, - {15, nullptr, "CryptAesCtr"}, - {16, nullptr, "ComputeCmac"}, - {21, nullptr, "AllocateAesKeyslot"}, - {22, nullptr, "DeallocateAesKeySlot"}, - {23, nullptr, "GetAesKeyslotAvailableEvent"}, - {24, &SPL::SetBootReason, "SetBootReason"}, - {25, &SPL::GetBootReason, "GetBootReason"}, - {26, nullptr, "DecryptAndStoreSslClientCertKey"}, - {27, nullptr, "ModularExponentiateWithSslClientCertKey"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - +SPL_SSL::SPL_SSL(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:ssl") {} SPL_SSL::~SPL_SSL() = default; -SPL_ES::SPL_ES(Core::System& system_, std::shared_ptr module_) - : Interface(system_, std::move(module_), "spl:es") { - // clang-format off - static const FunctionInfo functions[] = { - {0, &SPL::GetConfig, "GetConfig"}, - {1, &SPL::ModularExponentiate, "ModularExponentiate"}, - {2, nullptr, "GenerateAesKek"}, - {3, nullptr, "LoadAesKey"}, - {4, nullptr, "GenerateAesKey"}, - {5, &SPL::SetConfig, "SetConfig"}, - {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, - {11, &SPL::IsDevelopment, "IsDevelopment"}, - {13, nullptr, "DecryptDeviceUniqueData"}, - {14, nullptr, "DecryptAesKey"}, - {15, nullptr, "CryptAesCtr"}, - {16, nullptr, "ComputeCmac"}, - {17, nullptr, "ImportEsKey"}, - {18, nullptr, "UnwrapTitleKey"}, - {20, nullptr, "PrepareEsCommonKey"}, - {21, nullptr, "AllocateAesKeyslot"}, - {22, nullptr, "DeallocateAesKeySlot"}, - {23, nullptr, "GetAesKeyslotAvailableEvent"}, - {24, &SPL::SetBootReason, "SetBootReason"}, - {25, &SPL::GetBootReason, "GetBootReason"}, - {28, nullptr, "DecryptAndStoreDrmDeviceCertKey"}, - {29, nullptr, "ModularExponentiateWithDrmDeviceCertKey"}, - {31, nullptr, "PrepareEsArchiveKey"}, - {32, nullptr, "LoadPreparedAesKey"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - +SPL_ES::SPL_ES(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:es") {} SPL_ES::~SPL_ES() = default; -SPL_MANU::SPL_MANU(Core::System& system_, std::shared_ptr module_) - : Interface(system_, std::move(module_), "spl:manu") { - // clang-format off - static const FunctionInfo functions[] = { - {0, &SPL::GetConfig, "GetConfig"}, - {1, &SPL::ModularExponentiate, "ModularExponentiate"}, - {2, nullptr, "GenerateAesKek"}, - {3, nullptr, "LoadAesKey"}, - {4, nullptr, "GenerateAesKey"}, - {5, &SPL::SetConfig, "SetConfig"}, - {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, - {11, &SPL::IsDevelopment, "IsDevelopment"}, - {13, nullptr, "DecryptDeviceUniqueData"}, - {14, nullptr, "DecryptAesKey"}, - {15, nullptr, "CryptAesCtr"}, - {16, nullptr, "ComputeCmac"}, - {21, nullptr, "AllocateAesKeyslot"}, - {22, nullptr, "DeallocateAesKeySlot"}, - {23, nullptr, "GetAesKeyslotAvailableEvent"}, - {24, &SPL::SetBootReason, "SetBootReason"}, - {25, &SPL::GetBootReason, "GetBootReason"}, - {30, nullptr, "ReencryptDeviceUniqueData"}, - }; - // clang-format on - - RegisterHandlers(functions); -} - +SPL_MANU::SPL_MANU(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:manu") {} SPL_MANU::~SPL_MANU() = default; } // namespace Service::SPL diff --git a/src/core/hle/service/spl/spl.h b/src/core/hle/service/spl/spl.h index 83a3cda539..8f84d2a3d3 100644 --- a/src/core/hle/service/spl/spl.h +++ b/src/core/hle/service/spl/spl.h @@ -18,36 +18,177 @@ class SPL final : public Module::Interface { public: explicit SPL(Core::System& system_, std::shared_ptr module_); ~SPL() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &SPL::GetConfig, "GetConfig"}, + FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"}, + FunctionInfo{5, &SPL::SetConfig, "SetConfig"}, + FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, + FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"}, + FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"}, + FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"} + ); }; class SPL_MIG final : public Module::Interface { public: explicit SPL_MIG(Core::System& system_, std::shared_ptr module_); ~SPL_MIG() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &SPL::GetConfig, "GetConfig"}, + FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"}, + FunctionInfo{2, &SPL::GenerateAesKek, "GenerateAesKek"}, + FunctionInfo{3, nullptr, "LoadAesKey"}, + FunctionInfo{4, &SPL::GenerateAesKey, "GenerateAesKey"}, + FunctionInfo{5, &SPL::SetConfig, "SetConfig"}, + FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, + FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"}, + FunctionInfo{14, nullptr, "DecryptAesKey"}, + FunctionInfo{15, nullptr, "CryptAesCtr"}, + FunctionInfo{16, nullptr, "ComputeCmac"}, + FunctionInfo{21, nullptr, "AllocateAesKeyslot"}, + FunctionInfo{22, nullptr, "DeallocateAesKeySlot"}, + FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"}, + FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"}, + FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"} + ); }; class SPL_FS final : public Module::Interface { public: explicit SPL_FS(Core::System& system_, std::shared_ptr module_); ~SPL_FS() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &SPL::GetConfig, "GetConfig"}, + FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"}, + FunctionInfo{2, nullptr, "GenerateAesKek"}, + FunctionInfo{3, nullptr, "LoadAesKey"}, + FunctionInfo{4, nullptr, "GenerateAesKey"}, + FunctionInfo{5, &SPL::SetConfig, "SetConfig"}, + FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, + FunctionInfo{9, nullptr, "ImportLotusKey"}, + FunctionInfo{10, nullptr, "DecryptLotusMessage"}, + FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"}, + FunctionInfo{12, nullptr, "GenerateSpecificAesKey"}, + FunctionInfo{14, nullptr, "DecryptAesKey"}, + FunctionInfo{15, nullptr, "CryptAesCtr"}, + FunctionInfo{16, nullptr, "ComputeCmac"}, + FunctionInfo{19, nullptr, "LoadTitleKey"}, + FunctionInfo{21, nullptr, "AllocateAesKeyslot"}, + FunctionInfo{22, nullptr, "DeallocateAesKeySlot"}, + FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"}, + FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"}, + FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"}, + FunctionInfo{31, nullptr, "GetPackage2Hash"} + ); }; class SPL_SSL final : public Module::Interface { public: explicit SPL_SSL(Core::System& system_, std::shared_ptr module_); ~SPL_SSL() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &SPL::GetConfig, "GetConfig"}, + FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"}, + FunctionInfo{2, nullptr, "GenerateAesKek"}, + FunctionInfo{3, nullptr, "LoadAesKey"}, + FunctionInfo{4, nullptr, "GenerateAesKey"}, + FunctionInfo{5, &SPL::SetConfig, "SetConfig"}, + FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, + FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"}, + FunctionInfo{13, nullptr, "DecryptDeviceUniqueData"}, + FunctionInfo{14, nullptr, "DecryptAesKey"}, + FunctionInfo{15, nullptr, "CryptAesCtr"}, + FunctionInfo{16, nullptr, "ComputeCmac"}, + FunctionInfo{21, nullptr, "AllocateAesKeyslot"}, + FunctionInfo{22, nullptr, "DeallocateAesKeySlot"}, + FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"}, + FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"}, + FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"}, + FunctionInfo{26, nullptr, "DecryptAndStoreSslClientCertKey"}, + FunctionInfo{27, nullptr, "ModularExponentiateWithSslClientCertKey"} + ); }; class SPL_ES final : public Module::Interface { public: explicit SPL_ES(Core::System& system_, std::shared_ptr module_); ~SPL_ES() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &SPL::GetConfig, "GetConfig"}, + FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"}, + FunctionInfo{2, nullptr, "GenerateAesKek"}, + FunctionInfo{3, nullptr, "LoadAesKey"}, + FunctionInfo{4, nullptr, "GenerateAesKey"}, + FunctionInfo{5, &SPL::SetConfig, "SetConfig"}, + FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, + FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"}, + FunctionInfo{13, nullptr, "DecryptDeviceUniqueData"}, + FunctionInfo{14, nullptr, "DecryptAesKey"}, + FunctionInfo{15, nullptr, "CryptAesCtr"}, + FunctionInfo{16, nullptr, "ComputeCmac"}, + FunctionInfo{17, nullptr, "ImportEsKey"}, + FunctionInfo{18, nullptr, "UnwrapTitleKey"}, + FunctionInfo{20, nullptr, "PrepareEsCommonKey"}, + FunctionInfo{21, nullptr, "AllocateAesKeyslot"}, + FunctionInfo{22, nullptr, "DeallocateAesKeySlot"}, + FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"}, + FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"}, + FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"}, + FunctionInfo{28, nullptr, "DecryptAndStoreDrmDeviceCertKey"}, + FunctionInfo{29, nullptr, "ModularExponentiateWithDrmDeviceCertKey"}, + FunctionInfo{31, nullptr, "PrepareEsArchiveKey"}, + FunctionInfo{32, nullptr, "LoadPreparedAesKey"} + ); }; class SPL_MANU final : public Module::Interface { public: explicit SPL_MANU(Core::System& system_, std::shared_ptr module_); ~SPL_MANU() override; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &SPL::GetConfig, "GetConfig"}, + FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"}, + FunctionInfo{2, nullptr, "GenerateAesKek"}, + FunctionInfo{3, nullptr, "LoadAesKey"}, + FunctionInfo{4, nullptr, "GenerateAesKey"}, + FunctionInfo{5, &SPL::SetConfig, "SetConfig"}, + FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, + FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"}, + FunctionInfo{13, nullptr, "DecryptDeviceUniqueData"}, + FunctionInfo{14, nullptr, "DecryptAesKey"}, + FunctionInfo{15, nullptr, "CryptAesCtr"}, + FunctionInfo{16, nullptr, "ComputeCmac"}, + FunctionInfo{21, nullptr, "AllocateAesKeyslot"}, + FunctionInfo{22, nullptr, "DeallocateAesKeySlot"}, + FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"}, + FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"}, + FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"}, + FunctionInfo{30, nullptr, "ReencryptDeviceUniqueData"} + ); }; } // namespace Service::SPL diff --git a/src/core/hle/service/spl/spl_module.cpp b/src/core/hle/service/spl/spl_module.cpp index 520cb1860b..594575d9a0 100644 --- a/src/core/hle/service/spl/spl_module.cpp +++ b/src/core/hle/service/spl/spl_module.cpp @@ -204,14 +204,15 @@ Result Module::Interface::GetConfigImpl(u64* out_config, ConfigItem config_item) class CSRNG final : public Module::Interface { public: - explicit CSRNG(Core::System& system_, std::shared_ptr module_) - : Interface(system_, std::move(module_), "csrng") { - static const FunctionInfo functions[] = { - {0, &CSRNG::GenerateRandomBytes, "GenerateRandomBytes"}, - }; - RegisterHandlers(functions); - } + explicit CSRNG(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "csrng") {} ~CSRNG() override = default; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &CSRNG::GenerateRandomBytes, "GenerateRandomBytes"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index 999efd4295..c5902079ee 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp @@ -74,59 +74,19 @@ struct SslContextSharedData { class ISslConnection final : public ServiceFramework { public: - explicit ISslConnection(Core::System& system_in, SslVersion ssl_version_in, - std::shared_ptr& shared_data_in, - std::unique_ptr&& backend_in) - : ServiceFramework{system_in, "ISslConnection"}, ssl_version{ssl_version_in}, - shared_data{shared_data_in}, backend{std::move(backend_in)} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&ISslConnection::SetSocketDescriptor>, "SetSocketDescriptor"}, - {1, D<&ISslConnection::SetHostName>, "SetHostName"}, - {2, D<&ISslConnection::SetVerifyOption>, "SetVerifyOption"}, - {3, D<&ISslConnection::SetIoMode>, "SetIoMode"}, - {4, D<&ISslConnection::GetSocketDescriptor>, "GetSocketDescriptor"}, - {5, D<&ISslConnection::GetHostName>, "GetHostName"}, - {6, nullptr, "GetVerifyOption"}, - {7, D<&ISslConnection::GetIoMode>, "GetIoMode"}, - {8, D<&ISslConnection::DoHandshake>, "DoHandshake"}, - {9, &ISslConnection::DoHandshakeGetServerCert, "DoHandshakeGetServerCert"}, - {10, D<&ISslConnection::Read>, "Read"}, - {11, D<&ISslConnection::Write>, "Write"}, - {12, D<&ISslConnection::Pending>, "Pending"}, - {13, D<&ISslConnection::Peek>, "Peek"}, - {14, D<&ISslConnection::Poll>, "Poll"}, - {15, D<&ISslConnection::GetVerifyCertError>, "GetVerifyCertError"}, - {16, D<&ISslConnection::GetNeededServerCertBufferSize>, "GetNeededServerCertBufferSize"}, - {17, D<&ISslConnection::SetSessionCacheMode>, "SetSessionCacheMode"}, - {18, D<&ISslConnection::GetSessionCacheMode>, "GetSessionCacheMode"}, - {19, D<&ISslConnection::FlushSessionCache>, "FlushSessionCache"}, - {20, D<&ISslConnection::SetRenegotiationMode>, "SetRenegotiationMode"}, - {21, D<&ISslConnection::GetRenegotiationMode>, "GetRenegotiationMode"}, - {22, D<&ISslConnection::SetOption>, "SetOption"}, - {23, D<&ISslConnection::GetOption>, "GetOption"}, - {24, nullptr, "GetVerifyCertErrors"}, - {25, nullptr, "GetCipherInfo"}, - {26, D<&ISslConnection::SetNextAlpnProto>, "SetNextAlpnProto"}, - {27, D<&ISslConnection::GetNextAlpnProto>, "GetNextAlpnProto"}, - {28, nullptr, "SetDtlsSocketDescriptor"}, - {29, nullptr, "GetDtlsHandshakeTimeout"}, - {30, nullptr, "SetPrivateOption"}, - {31, nullptr, "SetSrtpCiphers"}, - {32, nullptr, "GetSrtpCipher"}, - {33, nullptr, "ExportKeyingMaterial"}, - {34, nullptr, "SetIoTimeout"}, - {35, nullptr, "GetIoTimeout"}, - }; - // clang-format on - - RegisterHandlers(functions); - + explicit ISslConnection(Core::System& system_in, SslVersion ssl_version_in, std::shared_ptr& shared_data_in, std::unique_ptr&& backend_in) + : ServiceFramework{system_in, "ISslConnection"} + , ssl_version{ssl_version_in} + , shared_data{shared_data_in} + , backend{std::move(backend_in)} { backend->SetVerifyOption(verify_option); - shared_data->connection_count++; } + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + ~ISslConnection() { shared_data->connection_count--; if (fd_to_close.has_value()) { @@ -432,6 +392,44 @@ private: R_SUCCEED(); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ISslConnection::SetSocketDescriptor>, "SetSocketDescriptor"}, + FunctionInfo{1, D<&ISslConnection::SetHostName>, "SetHostName"}, + FunctionInfo{2, D<&ISslConnection::SetVerifyOption>, "SetVerifyOption"}, + FunctionInfo{3, D<&ISslConnection::SetIoMode>, "SetIoMode"}, + FunctionInfo{4, D<&ISslConnection::GetSocketDescriptor>, "GetSocketDescriptor"}, + FunctionInfo{5, D<&ISslConnection::GetHostName>, "GetHostName"}, + FunctionInfo{6, nullptr, "GetVerifyOption"}, + FunctionInfo{7, D<&ISslConnection::GetIoMode>, "GetIoMode"}, + FunctionInfo{8, D<&ISslConnection::DoHandshake>, "DoHandshake"}, + FunctionInfo{9, &ISslConnection::DoHandshakeGetServerCert, "DoHandshakeGetServerCert"}, + FunctionInfo{10, D<&ISslConnection::Read>, "Read"}, + FunctionInfo{11, D<&ISslConnection::Write>, "Write"}, + FunctionInfo{12, D<&ISslConnection::Pending>, "Pending"}, + FunctionInfo{13, D<&ISslConnection::Peek>, "Peek"}, + FunctionInfo{14, D<&ISslConnection::Poll>, "Poll"}, + FunctionInfo{15, D<&ISslConnection::GetVerifyCertError>, "GetVerifyCertError"}, + FunctionInfo{16, D<&ISslConnection::GetNeededServerCertBufferSize>, "GetNeededServerCertBufferSize"}, + FunctionInfo{17, D<&ISslConnection::SetSessionCacheMode>, "SetSessionCacheMode"}, + FunctionInfo{18, D<&ISslConnection::GetSessionCacheMode>, "GetSessionCacheMode"}, + FunctionInfo{19, D<&ISslConnection::FlushSessionCache>, "FlushSessionCache"}, + FunctionInfo{20, D<&ISslConnection::SetRenegotiationMode>, "SetRenegotiationMode"}, + FunctionInfo{21, D<&ISslConnection::GetRenegotiationMode>, "GetRenegotiationMode"}, + FunctionInfo{22, D<&ISslConnection::SetOption>, "SetOption"}, + FunctionInfo{23, D<&ISslConnection::GetOption>, "GetOption"}, + FunctionInfo{24, nullptr, "GetVerifyCertErrors"}, + FunctionInfo{25, nullptr, "GetCipherInfo"}, + FunctionInfo{26, D<&ISslConnection::SetNextAlpnProto>, "SetNextAlpnProto"}, + FunctionInfo{27, D<&ISslConnection::GetNextAlpnProto>, "GetNextAlpnProto"}, + FunctionInfo{28, nullptr, "SetDtlsSocketDescriptor"}, + FunctionInfo{29, nullptr, "GetDtlsHandshakeTimeout"}, + FunctionInfo{30, nullptr, "SetPrivateOption"}, + FunctionInfo{31, nullptr, "SetSrtpCiphers"}, + FunctionInfo{32, nullptr, "GetSrtpCipher"}, + FunctionInfo{33, nullptr, "ExportKeyingMaterial"}, + FunctionInfo{34, nullptr, "SetIoTimeout"}, + FunctionInfo{35, nullptr, "GetIoTimeout"} + ); SslVersion ssl_version; std::shared_ptr shared_data; std::unique_ptr backend; @@ -452,29 +450,9 @@ public: explicit ISslContext(Core::System& system_, SslVersion version) : ServiceFramework{system_, "ISslContext"}, ssl_version{version}, shared_data{std::make_shared()} { - static const FunctionInfo functions[] = { - {0, &ISslContext::SetOption, "SetOption"}, - {1, &ISslContext::GetOption, "GetOption"}, - {2, &ISslContext::CreateConnection, "CreateConnection"}, - {3, &ISslContext::GetConnectionCount, "GetConnectionCount"}, - {4, &ISslContext::ImportServerPki, "ImportServerPki"}, - {5, &ISslContext::ImportClientPki, "ImportClientPki"}, - {6, nullptr, "RemoveServerPki"}, - {7, nullptr, "RemoveClientPki"}, - {8, D<&ISslContext::RegisterInternalPki>, "RegisterInternalPki"}, - {9, nullptr, "AddPolicyOid"}, - {10, nullptr, "ImportCrl"}, - {11, nullptr, "RemoveCrl"}, - {12, nullptr, "ImportClientCertKeyPki"}, - {13, nullptr, "GeneratePrivateKeyAndCert"}, - }; - RegisterHandlers(functions); } private: - SslVersion ssl_version; - std::shared_ptr shared_data; - void SetOption(HLERequestContext& ctx) { struct Parameters { ContextOption option; @@ -561,28 +539,36 @@ private: LOG_WARNING(Service_SSL, "(STUBBED) called"); R_SUCCEED(); } + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &ISslContext::SetOption, "SetOption"}, + FunctionInfo{1, &ISslContext::GetOption, "GetOption"}, + FunctionInfo{2, &ISslContext::CreateConnection, "CreateConnection"}, + FunctionInfo{3, &ISslContext::GetConnectionCount, "GetConnectionCount"}, + FunctionInfo{4, &ISslContext::ImportServerPki, "ImportServerPki"}, + FunctionInfo{5, &ISslContext::ImportClientPki, "ImportClientPki"}, + FunctionInfo{6, nullptr, "RemoveServerPki"}, + FunctionInfo{7, nullptr, "RemoveClientPki"}, + FunctionInfo{8, D<&ISslContext::RegisterInternalPki>, "RegisterInternalPki"}, + FunctionInfo{9, nullptr, "AddPolicyOid"}, + FunctionInfo{10, nullptr, "ImportCrl"}, + FunctionInfo{11, nullptr, "RemoveCrl"}, + FunctionInfo{12, nullptr, "ImportClientCertKeyPki"}, + FunctionInfo{13, nullptr, "GeneratePrivateKeyAndCert"} + ); + SslVersion ssl_version; + std::shared_ptr shared_data; }; class ISslService final : public ServiceFramework { public: - explicit ISslService(Core::System& system_) - : ServiceFramework{system_, "ssl"}, cert_store{system} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &ISslService::CreateContext, "CreateContext"}, - {1, nullptr, "GetContextCount"}, - {2, D<&ISslService::GetCertificates>, "GetCertificates"}, - {3, D<&ISslService::GetCertificateBufSize>, "GetCertificateBufSize"}, - {4, nullptr, "DebugIoctl"}, - {5, &ISslService::SetInterfaceVersion, "SetInterfaceVersion"}, - {6, nullptr, "FlushSessionCache"}, - {7, nullptr, "SetDebugOption"}, - {8, nullptr, "GetDebugOption"}, - {8, nullptr, "ClearTls12FallbackFlag"}, - }; - // clang-format on + explicit ISslService(Core::System& system_) : ServiceFramework{system_, "ssl"}, cert_store{system} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -628,147 +614,116 @@ private: } private: + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &ISslService::CreateContext, "CreateContext"}, + FunctionInfo{1, nullptr, "GetContextCount"}, + FunctionInfo{2, D<&ISslService::GetCertificates>, "GetCertificates"}, + FunctionInfo{3, D<&ISslService::GetCertificateBufSize>, "GetCertificateBufSize"}, + FunctionInfo{4, nullptr, "DebugIoctl"}, + FunctionInfo{5, &ISslService::SetInterfaceVersion, "SetInterfaceVersion"}, + FunctionInfo{6, nullptr, "FlushSessionCache"}, + FunctionInfo{7, nullptr, "SetDebugOption"}, + FunctionInfo{8, nullptr, "GetDebugOption"}, + FunctionInfo{8, nullptr, "ClearTls12FallbackFlag"} + ); CertStore cert_store; }; class ISslServiceForSystem final : public ServiceFramework { - public: - explicit ISslServiceForSystem(Core::System& system_) : ServiceFramework{system_, "ssl:s"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, D<&ISslServiceForSystem::CreateContext>, "CreateContext"}, - {1, D<&ISslServiceForSystem::GetContextCount>, "GetContextCount"}, - {2, D<&ISslServiceForSystem::GetCertificates>, "GetCertificates"}, - {3, D<&ISslServiceForSystem::GetCertificateBufSize>, "GetCertificateBufSize"}, - {4, D<&ISslServiceForSystem::DebugIoctl>, "DebugIoctl"}, - {5, D<&ISslServiceForSystem::SetInterfaceVersion>, "SetInterfaceVersion"}, - {6, D<&ISslServiceForSystem::FlushSessionCache>, "FlushSessionCache"}, - {7, D<&ISslServiceForSystem::SetDebugOption>, "SetDebugOption"}, - {8, D<&ISslServiceForSystem::GetDebugOption>, "GetDebugOption"}, - {9, D<&ISslServiceForSystem::ClearTls12FallbackFlag>, "ClearTls12FallbackFlag"}, - {100, D<&ISslServiceForSystem::CreateContextForSystem>, "CreateContextForSystem"}, - {101, D<&ISslServiceForSystem::SetThreadCoreMask>, "SetThreadCoreMask"}, - {102, D<&ISslServiceForSystem::GetThreadCoreMask>, "GetThreadCoreMask"}, - {103, D<&ISslServiceForSystem::VerifySignature>, "VerifySignature"} - }; - // clang-format on +public: + explicit ISslServiceForSystem(Core::System& system_) : ServiceFramework{system_, "ssl:s"} {} - RegisterHandlers(functions); - }; - - Result CreateContext() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; - - Result GetContextCount() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; - - Result GetCertificates() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; - - Result GetCertificateBufSize() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; - - Result DebugIoctl() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; - - Result SetInterfaceVersion() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; - - Result FlushSessionCache() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; - - Result SetDebugOption() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; - - Result GetDebugOption() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; - - Result ClearTls12FallbackFlag() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; - - Result CreateContextForSystem() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; - - Result SetThreadCoreMask() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; - - Result GetThreadCoreMask() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; - - Result VerifySignature() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - - // TODO (jarrodnorwell) - - return ResultSuccess; - }; + Result CreateContext() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); }; + Result GetContextCount() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); + }; + + Result GetCertificates() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); + }; + + Result GetCertificateBufSize() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); + }; + + Result DebugIoctl() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); + }; + + Result SetInterfaceVersion() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); + }; + + Result FlushSessionCache() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); + }; + + Result SetDebugOption() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); + }; + + Result GetDebugOption() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); + }; + + Result ClearTls12FallbackFlag() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); + }; + + Result CreateContextForSystem() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); + }; + + Result SetThreadCoreMask() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); + }; + + Result GetThreadCoreMask() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); + }; + + Result VerifySignature() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + R_SUCCEED(); + }; + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); + } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, D<&ISslServiceForSystem::CreateContext>, "CreateContext"}, + FunctionInfo{1, D<&ISslServiceForSystem::GetContextCount>, "GetContextCount"}, + FunctionInfo{2, D<&ISslServiceForSystem::GetCertificates>, "GetCertificates"}, + FunctionInfo{3, D<&ISslServiceForSystem::GetCertificateBufSize>, "GetCertificateBufSize"}, + FunctionInfo{4, D<&ISslServiceForSystem::DebugIoctl>, "DebugIoctl"}, + FunctionInfo{5, D<&ISslServiceForSystem::SetInterfaceVersion>, "SetInterfaceVersion"}, + FunctionInfo{6, D<&ISslServiceForSystem::FlushSessionCache>, "FlushSessionCache"}, + FunctionInfo{7, D<&ISslServiceForSystem::SetDebugOption>, "SetDebugOption"}, + FunctionInfo{8, D<&ISslServiceForSystem::GetDebugOption>, "GetDebugOption"}, + FunctionInfo{9, D<&ISslServiceForSystem::ClearTls12FallbackFlag>, "ClearTls12FallbackFlag"}, + FunctionInfo{100, D<&ISslServiceForSystem::CreateContextForSystem>, "CreateContextForSystem"}, + FunctionInfo{101, D<&ISslServiceForSystem::SetThreadCoreMask>, "SetThreadCoreMask"}, + FunctionInfo{102, D<&ISslServiceForSystem::GetThreadCoreMask>, "GetThreadCoreMask"}, + FunctionInfo{103, D<&ISslServiceForSystem::VerifySignature>, "VerifySignature"} + ); +}; + void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); diff --git a/src/core/hle/service/tma/tma.cpp b/src/core/hle/service/tma/tma.cpp index c2fb33cd16..e9198eea64 100644 --- a/src/core/hle/service/tma/tma.cpp +++ b/src/core/hle/service/tma/tma.cpp @@ -19,12 +19,14 @@ class HTC_TENV final : public ServiceFramework { public: explicit HTC_TENV(Core::System& system_) : ServiceFramework{system_, "htc:tenv"} - { - static const FunctionInfo functions[] = { - {0, nullptr, "GetServiceInterface"}, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetServiceInterface"} + ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/usb/usb.cpp b/src/core/hle/service/usb/usb.cpp index ff2a377172..f7dc15e3db 100644 --- a/src/core/hle/service/usb/usb.cpp +++ b/src/core/hle/service/usb/usb.cpp @@ -17,137 +17,127 @@ namespace Service::USB { class IDsInterface final : public ServiceFramework { public: - explicit IDsInterface(Core::System& system_) : ServiceFramework{system_, "IDsInterface"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "AddEndpoint"}, - {1, nullptr, "GetSetupEvent"}, - {2, nullptr, "GetSetupPacket"}, - {3, nullptr, "Enable"}, - {4, nullptr, "Disable"}, - {5, nullptr, "CtrlIn"}, - {6, nullptr, "CtrlOut"}, - {7, nullptr, "GetCtrlInCompletionEvent"}, - {8, nullptr, "GetCtrlInUrbReport"}, - {9, nullptr, "GetCtrlOutCompletionEvent"}, - {10, nullptr, "GetCtrlOutUrbReport"}, - {11, nullptr, "CtrlStall"}, - {12, nullptr, "AppendConfigurationData"}, - }; - // clang-format on + explicit IDsInterface(Core::System& system_) : ServiceFramework{system_, "IDsInterface"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "AddEndpoint"}, + FunctionInfo{1, nullptr, "GetSetupEvent"}, + FunctionInfo{2, nullptr, "GetSetupPacket"}, + FunctionInfo{3, nullptr, "Enable"}, + FunctionInfo{4, nullptr, "Disable"}, + FunctionInfo{5, nullptr, "CtrlIn"}, + FunctionInfo{6, nullptr, "CtrlOut"}, + FunctionInfo{7, nullptr, "GetCtrlInCompletionEvent"}, + FunctionInfo{8, nullptr, "GetCtrlInUrbReport"}, + FunctionInfo{9, nullptr, "GetCtrlOutCompletionEvent"}, + FunctionInfo{10, nullptr, "GetCtrlOutUrbReport"}, + FunctionInfo{11, nullptr, "CtrlStall"}, + FunctionInfo{12, nullptr, "AppendConfigurationData"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IDsRootSession final : public ServiceFramework { public: - explicit IDsRootSession(Core::System& system_) : ServiceFramework{system_, "usb:ds"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "OpenDsService"}, - }; - // clang-format on + explicit IDsRootSession(Core::System& system_) : ServiceFramework{system_, "usb:ds"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "OpenDsService"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IClientEpSession final : public ServiceFramework { public: explicit IClientEpSession(Core::System& system_) - : ServiceFramework{system_, "IClientEpSession"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "ReOpen"}, - {1, nullptr, "Close"}, - {2, nullptr, "GetCompletionEvent"}, - {3, nullptr, "PopulateRing"}, - {4, nullptr, "PostBufferAsync"}, - {5, nullptr, "GetXferReport"}, - {6, nullptr, "PostBufferMultiAsync"}, - {7, nullptr, "CreateSmmuSpace"}, - {8, nullptr, "ShareReportRing"}, - }; - // clang-format on + : ServiceFramework{system_, "IClientEpSession"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "ReOpen"}, + FunctionInfo{1, nullptr, "Close"}, + FunctionInfo{2, nullptr, "GetCompletionEvent"}, + FunctionInfo{3, nullptr, "PopulateRing"}, + FunctionInfo{4, nullptr, "PostBufferAsync"}, + FunctionInfo{5, nullptr, "GetXferReport"}, + FunctionInfo{6, nullptr, "PostBufferMultiAsync"}, + FunctionInfo{7, nullptr, "CreateSmmuSpace"}, + FunctionInfo{8, nullptr, "ShareReportRing"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IClientIfSession final : public ServiceFramework { public: explicit IClientIfSession(Core::System& system_) - : ServiceFramework{system_, "IClientIfSession"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetStateChangeEvent"}, - {1, nullptr, "SetInterface"}, - {2, nullptr, "GetInterface"}, - {3, nullptr, "GetAlternateInterface"}, - {4, nullptr, "GetCurrentFrame"}, - {5, nullptr, "CtrlXferAsync"}, - {6, nullptr, "GetCtrlXferCompletionEvent"}, - {7, nullptr, "GetCtrlXferReport"}, - {8, nullptr, "ResetDevice"}, - {9, nullptr, "OpenUsbEp"}, - }; - // clang-format on + : ServiceFramework{system_, "IClientIfSession"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetStateChangeEvent"}, + FunctionInfo{1, nullptr, "SetInterface"}, + FunctionInfo{2, nullptr, "GetInterface"}, + FunctionInfo{3, nullptr, "GetAlternateInterface"}, + FunctionInfo{4, nullptr, "GetCurrentFrame"}, + FunctionInfo{5, nullptr, "CtrlXferAsync"}, + FunctionInfo{6, nullptr, "GetCtrlXferCompletionEvent"}, + FunctionInfo{7, nullptr, "GetCtrlXferReport"}, + FunctionInfo{8, nullptr, "ResetDevice"}, + FunctionInfo{9, nullptr, "OpenUsbEp"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IClientRootSession final : public ServiceFramework { public: - explicit IClientRootSession(Core::System& system_) : ServiceFramework{system_, "usb:hs"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "BindClientProcess"}, - {1, nullptr, "QueryAllInterfaces"}, - {2, nullptr, "QueryAvailableInterfaces"}, - {3, nullptr, "QueryAcquiredInterfaces"}, - {4, nullptr, "CreateInterfaceAvailableEvent"}, - {5, nullptr, "DestroyInterfaceAvailableEvent"}, - {6, nullptr, "GetInterfaceStateChangeEvent"}, - {7, nullptr, "AcquireUsbIf"}, - {8, nullptr, "SetTestMode"}, - }; - // clang-format on + explicit IClientRootSession(Core::System& system_) : ServiceFramework{system_, "usb:hs"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "BindClientProcess"}, + FunctionInfo{1, nullptr, "QueryAllInterfaces"}, + FunctionInfo{2, nullptr, "QueryAvailableInterfaces"}, + FunctionInfo{3, nullptr, "QueryAcquiredInterfaces"}, + FunctionInfo{4, nullptr, "CreateInterfaceAvailableEvent"}, + FunctionInfo{5, nullptr, "DestroyInterfaceAvailableEvent"}, + FunctionInfo{6, nullptr, "GetInterfaceStateChangeEvent"}, + FunctionInfo{7, nullptr, "AcquireUsbIf"}, + FunctionInfo{8, nullptr, "SetTestMode"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IPdSession final : public ServiceFramework { public: - explicit IPdSession(Core::System& system_) : ServiceFramework{system_, "IPdSession"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "BindNoticeEvent"}, - {1, nullptr, "UnbindNoticeEvent"}, - {2, nullptr, "GetStatus"}, - {3, nullptr, "GetNotice"}, - {4, nullptr, "EnablePowerRequestNotice"}, - {5, nullptr, "DisablePowerRequestNotice"}, - {6, nullptr, "ReplyPowerRequest"}, - }; - // clang-format on + explicit IPdSession(Core::System& system_) : ServiceFramework{system_, "IPdSession"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "BindNoticeEvent"}, + FunctionInfo{1, nullptr, "UnbindNoticeEvent"}, + FunctionInfo{2, nullptr, "GetStatus"}, + FunctionInfo{3, nullptr, "GetNotice"}, + FunctionInfo{4, nullptr, "EnablePowerRequestNotice"}, + FunctionInfo{5, nullptr, "DisablePowerRequestNotice"}, + FunctionInfo{6, nullptr, "ReplyPowerRequest"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IPdManager final : public ServiceFramework { public: - explicit IPdManager(Core::System& system_) : ServiceFramework{system_, "usb:pd"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IPdManager::OpenSession, "OpenSession"}, - }; - // clang-format on + explicit IPdManager(Core::System& system_) : ServiceFramework{system_, "usb:pd"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -158,40 +148,39 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IPdManager::OpenSession, "OpenSession"} + ); }; class IPdCradleSession final : public ServiceFramework { public: explicit IPdCradleSession(Core::System& system_) - : ServiceFramework{system_, "IPdCradleSession"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "SetCradleVdo"}, - {1, nullptr, "GetCradleVdo"}, - {2, nullptr, "ResetCradleUsbHub"}, - {3, nullptr, "GetHostPdcFirmwareType"}, - {4, nullptr, "GetHostPdcFirmwareRevision"}, - {5, nullptr, "GetHostPdcManufactureId"}, - {6, nullptr, "GetHostPdcDeviceId"}, - {7, nullptr, "EnableCradleRecovery"}, - {8, nullptr, "DisableCradleRecovery"}, - }; - // clang-format on + : ServiceFramework{system_, "IPdCradleSession"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "SetCradleVdo"}, + FunctionInfo{1, nullptr, "GetCradleVdo"}, + FunctionInfo{2, nullptr, "ResetCradleUsbHub"}, + FunctionInfo{3, nullptr, "GetHostPdcFirmwareType"}, + FunctionInfo{4, nullptr, "GetHostPdcFirmwareRevision"}, + FunctionInfo{5, nullptr, "GetHostPdcManufactureId"}, + FunctionInfo{6, nullptr, "GetHostPdcDeviceId"}, + FunctionInfo{7, nullptr, "EnableCradleRecovery"}, + FunctionInfo{8, nullptr, "DisableCradleRecovery"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IPdCradleManager final : public ServiceFramework { public: - explicit IPdCradleManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:c"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, &IPdCradleManager::OpenCradleSession, "OpenCradleSession"}, - }; - // clang-format on + explicit IPdCradleManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:c"} {} - RegisterHandlers(functions); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } private: @@ -202,61 +191,64 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, &IPdCradleManager::OpenCradleSession, "OpenCradleSession"} + ); }; class IPmMainService final : public ServiceFramework { public: - explicit IPmMainService(Core::System& system_) : ServiceFramework{system_, "usb:pm"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetPowerEvent"}, - {1, nullptr, "GetPowerState"}, - {2, nullptr, "GetDataEvent"}, - {3, nullptr, "GetDataRole"}, - {4, nullptr, "SetDiagData"}, - {5, nullptr, "GetDiagData"}, - }; - // clang-format on + explicit IPmMainService(Core::System& system_) : ServiceFramework{system_, "usb:pm"} {} - RegisterHandlers(functions); + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetPowerEvent"}, + FunctionInfo{1, nullptr, "GetPowerState"}, + FunctionInfo{2, nullptr, "GetDataEvent"}, + FunctionInfo{3, nullptr, "GetDataRole"}, + FunctionInfo{4, nullptr, "SetDiagData"}, + FunctionInfo{5, nullptr, "GetDiagData"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IPdManufactureManager final : public ServiceFramework { public: - explicit IPdManufactureManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:m"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "OpenManufactureSession"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit IPdManufactureManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:m"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "OpenManufactureSession"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IQdbManager final : public ServiceFramework { public: - explicit IQdbManager(Core::System& system_) : ServiceFramework{system_, "usb:qdb"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "ImportQuirkDevices"}, - {1, nullptr, "HasQuirk"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit IQdbManager(Core::System& system_) : ServiceFramework{system_, "usb:qdb"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "ImportQuirkDevices"}, + FunctionInfo{1, nullptr, "HasQuirk"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; class IPmObserverService final : public ServiceFramework { public: - explicit IPmObserverService(Core::System& system_) : ServiceFramework{system_, "usb:obsv"} { - // clang-format off - static const FunctionInfo functions[] = { - {0, nullptr, "GetTopologyChangeEvent"}, - {1, nullptr, "GetFlattenedTopology"}, - }; - // clang-format on - RegisterHandlers(functions); + explicit IPmObserverService(Core::System& system_) : ServiceFramework{system_, "usb:obsv"} {} + + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetTopologyChangeEvent"}, + FunctionInfo{1, nullptr, "GetFlattenedTopology"} + ); + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } }; diff --git a/src/core/hle/service/vi/application_display_service.cpp b/src/core/hle/service/vi/application_display_service.cpp index f179ba676a..dcebb2eba9 100644 --- a/src/core/hle/service/vi/application_display_service.cpp +++ b/src/core/hle/service/vi/application_display_service.cpp @@ -17,38 +17,38 @@ namespace Service::VI { +std::optional IApplicationDisplayService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{100, C<&IApplicationDisplayService::GetRelayService>, "GetRelayService"}, + FunctionInfo{101, C<&IApplicationDisplayService::GetSystemDisplayService>, "GetSystemDisplayService"}, + FunctionInfo{102, C<&IApplicationDisplayService::GetManagerDisplayService>, "GetManagerDisplayService"}, + FunctionInfo{103, C<&IApplicationDisplayService::GetIndirectDisplayTransactionService>, "GetIndirectDisplayTransactionService"}, + FunctionInfo{1000, C<&IApplicationDisplayService::ListDisplays>, "ListDisplays"}, + FunctionInfo{1010, C<&IApplicationDisplayService::OpenDisplay>, "OpenDisplay"}, + FunctionInfo{1011, C<&IApplicationDisplayService::OpenDefaultDisplay>, "OpenDefaultDisplay"}, + FunctionInfo{1020, C<&IApplicationDisplayService::CloseDisplay>, "CloseDisplay"}, + FunctionInfo{1101, C<&IApplicationDisplayService::SetDisplayEnabled>, "SetDisplayEnabled"}, + FunctionInfo{1102, C<&IApplicationDisplayService::GetDisplayResolution>, "GetDisplayResolution"}, + FunctionInfo{2020, C<&IApplicationDisplayService::OpenLayer>, "OpenLayer"}, + FunctionInfo{2021, C<&IApplicationDisplayService::CloseLayer>, "CloseLayer"}, + FunctionInfo{2030, C<&IApplicationDisplayService::CreateStrayLayer>, "CreateStrayLayer"}, + FunctionInfo{2031, C<&IApplicationDisplayService::DestroyStrayLayer>, "DestroyStrayLayer"}, + FunctionInfo{2101, C<&IApplicationDisplayService::SetLayerScalingMode>, "SetLayerScalingMode"}, + FunctionInfo{2102, C<&IApplicationDisplayService::ConvertScalingMode>, "ConvertScalingMode"}, + FunctionInfo{2103, C<&IApplicationDisplayService::Cmd2103>, "Cmd2103"}, + FunctionInfo{2450, C<&IApplicationDisplayService::GetIndirectLayerImageMap>, "GetIndirectLayerImageMap"}, + FunctionInfo{2451, nullptr, "GetIndirectLayerImageCropMap"}, + FunctionInfo{2460, C<&IApplicationDisplayService::GetIndirectLayerImageRequiredMemoryInfo>, "GetIndirectLayerImageRequiredMemoryInfo"}, + FunctionInfo{5202, C<&IApplicationDisplayService::GetDisplayVsyncEvent>, "GetDisplayVsyncEvent"}, + FunctionInfo{5203, nullptr, "GetDisplayVsyncEventForDebug"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IApplicationDisplayService::IApplicationDisplayService(Core::System& system_, std::shared_ptr container) : ServiceFramework{system_, "IApplicationDisplayService"}, m_container{std::move(container)}, m_context{system, "IApplicationDisplayService"} { - // clang-format off - static const FunctionInfo functions[] = { - {100, C<&IApplicationDisplayService::GetRelayService>, "GetRelayService"}, - {101, C<&IApplicationDisplayService::GetSystemDisplayService>, "GetSystemDisplayService"}, - {102, C<&IApplicationDisplayService::GetManagerDisplayService>, "GetManagerDisplayService"}, - {103, C<&IApplicationDisplayService::GetIndirectDisplayTransactionService>, "GetIndirectDisplayTransactionService"}, - {1000, C<&IApplicationDisplayService::ListDisplays>, "ListDisplays"}, - {1010, C<&IApplicationDisplayService::OpenDisplay>, "OpenDisplay"}, - {1011, C<&IApplicationDisplayService::OpenDefaultDisplay>, "OpenDefaultDisplay"}, - {1020, C<&IApplicationDisplayService::CloseDisplay>, "CloseDisplay"}, - {1101, C<&IApplicationDisplayService::SetDisplayEnabled>, "SetDisplayEnabled"}, - {1102, C<&IApplicationDisplayService::GetDisplayResolution>, "GetDisplayResolution"}, - {2020, C<&IApplicationDisplayService::OpenLayer>, "OpenLayer"}, - {2021, C<&IApplicationDisplayService::CloseLayer>, "CloseLayer"}, - {2030, C<&IApplicationDisplayService::CreateStrayLayer>, "CreateStrayLayer"}, - {2031, C<&IApplicationDisplayService::DestroyStrayLayer>, "DestroyStrayLayer"}, - {2101, C<&IApplicationDisplayService::SetLayerScalingMode>, "SetLayerScalingMode"}, - {2102, C<&IApplicationDisplayService::ConvertScalingMode>, "ConvertScalingMode"}, - {2103, C<&IApplicationDisplayService::Cmd2103>, "Cmd2103"}, - {2450, C<&IApplicationDisplayService::GetIndirectLayerImageMap>, "GetIndirectLayerImageMap"}, - {2451, nullptr, "GetIndirectLayerImageCropMap"}, - {2460, C<&IApplicationDisplayService::GetIndirectLayerImageRequiredMemoryInfo>, "GetIndirectLayerImageRequiredMemoryInfo"}, - {5202, C<&IApplicationDisplayService::GetDisplayVsyncEvent>, "GetDisplayVsyncEvent"}, - {5203, nullptr, "GetDisplayVsyncEventForDebug"}, - }; - // clang-format on - - RegisterHandlers(functions); } IApplicationDisplayService::~IApplicationDisplayService() { diff --git a/src/core/hle/service/vi/application_display_service.h b/src/core/hle/service/vi/application_display_service.h index d2db391efd..0b5898ee56 100644 --- a/src/core/hle/service/vi/application_display_service.h +++ b/src/core/hle/service/vi/application_display_service.h @@ -74,8 +74,8 @@ public: s64 width, s64 height); private: + std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; - KernelHelpers::ServiceContext m_context; std::mutex m_lock{}; std::set m_open_layer_ids{}; diff --git a/src/core/hle/service/vi/application_root_service.cpp b/src/core/hle/service/vi/application_root_service.cpp index 7f35a048da..f12c564277 100644 --- a/src/core/hle/service/vi/application_root_service.cpp +++ b/src/core/hle/service/vi/application_root_service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,14 +14,17 @@ namespace Service::VI { +std::optional IApplicationRootService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, C<&IApplicationRootService::GetDisplayService>, "GetDisplayService"}, + FunctionInfo{1, nullptr, "GetDisplayServiceWithProxyNameExchange"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IApplicationRootService::IApplicationRootService(Core::System& system_, std::shared_ptr container) : ServiceFramework{system_, "vi:u"}, m_container{std::move(container)} { - static const FunctionInfo functions[] = { - {0, C<&IApplicationRootService::GetDisplayService>, "GetDisplayService"}, - {1, nullptr, "GetDisplayServiceWithProxyNameExchange"}, - }; - RegisterHandlers(functions); } IApplicationRootService::~IApplicationRootService() = default; diff --git a/src/core/hle/service/vi/application_root_service.h b/src/core/hle/service/vi/application_root_service.h index 15aa4483d6..4deaa04f4c 100644 --- a/src/core/hle/service/vi/application_root_service.h +++ b/src/core/hle/service/vi/application_root_service.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -27,6 +30,7 @@ private: Policy policy); private: + std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; }; diff --git a/src/core/hle/service/vi/manager_display_service.cpp b/src/core/hle/service/vi/manager_display_service.cpp index e4d22ca11c..1b3b0f3379 100644 --- a/src/core/hle/service/vi/manager_display_service.cpp +++ b/src/core/hle/service/vi/manager_display_service.cpp @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -10,96 +10,96 @@ namespace Service::VI { +std::optional IManagerDisplayService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{200, nullptr, "AllocateProcessHeapBlock"}, + FunctionInfo{201, nullptr, "FreeProcessHeapBlock"}, + FunctionInfo{1102, nullptr, "GetDisplayResolution"}, + FunctionInfo{2010, C<&IManagerDisplayService::CreateManagedLayer>, "CreateManagedLayer"}, + FunctionInfo{2011, C<&IManagerDisplayService::DestroyManagedLayer>, "DestroyManagedLayer"}, + FunctionInfo{2012, nullptr, "CreateStrayLayer"}, + FunctionInfo{2050, nullptr, "CreateIndirectLayer"}, + FunctionInfo{2051, nullptr, "DestroyIndirectLayer"}, + FunctionInfo{2052, nullptr, "CreateIndirectProducerEndPoint"}, + FunctionInfo{2053, nullptr, "DestroyIndirectProducerEndPoint"}, + FunctionInfo{2054, nullptr, "CreateIndirectConsumerEndPoint"}, + FunctionInfo{2055, nullptr, "DestroyIndirectConsumerEndPoint"}, + FunctionInfo{2060, nullptr, "CreateWatermarkCompositor"}, + FunctionInfo{2062, nullptr, "SetWatermarkText"}, + FunctionInfo{2063, nullptr, "SetWatermarkLayerStacks"}, + FunctionInfo{2300, nullptr, "AcquireLayerTexturePresentingEvent"}, + FunctionInfo{2301, nullptr, "ReleaseLayerTexturePresentingEvent"}, + FunctionInfo{2302, nullptr, "GetDisplayHotplugEvent"}, + FunctionInfo{2303, nullptr, "GetDisplayModeChangedEvent"}, + FunctionInfo{2402, nullptr, "GetDisplayHotplugState"}, + FunctionInfo{2501, nullptr, "GetCompositorErrorInfo"}, + FunctionInfo{2601, nullptr, "GetDisplayErrorEvent"}, + FunctionInfo{2701, nullptr, "GetDisplayFatalErrorEvent"}, + FunctionInfo{4201, nullptr, "SetDisplayAlpha"}, + FunctionInfo{4203, nullptr, "SetDisplayLayerStack"}, + FunctionInfo{4205, nullptr, "SetDisplayPowerState"}, + FunctionInfo{4206, nullptr, "SetDefaultDisplay"}, + FunctionInfo{4207, nullptr, "ResetDisplayPanel"}, + FunctionInfo{4208, nullptr, "SetDisplayFatalErrorEnabled"}, + FunctionInfo{4209, nullptr, "IsDisplayPanelOn"}, + FunctionInfo{4300, nullptr, "GetInternalPanelId"}, + FunctionInfo{6000, C<&IManagerDisplayService::AddToLayerStack>, "AddToLayerStack"}, + FunctionInfo{6001, nullptr, "RemoveFromLayerStack"}, + FunctionInfo{6002, C<&IManagerDisplayService::SetLayerVisibility>, "SetLayerVisibility"}, + FunctionInfo{6003, nullptr, "SetLayerConfig"}, + FunctionInfo{6004, nullptr, "AttachLayerPresentationTracer"}, + FunctionInfo{6005, nullptr, "DetachLayerPresentationTracer"}, + FunctionInfo{6006, nullptr, "StartLayerPresentationRecording"}, + FunctionInfo{6007, nullptr, "StopLayerPresentationRecording"}, + FunctionInfo{6008, nullptr, "StartLayerPresentationFenceWait"}, + FunctionInfo{6009, nullptr, "StopLayerPresentationFenceWait"}, + FunctionInfo{6010, nullptr, "GetLayerPresentationAllFencesExpiredEvent"}, + FunctionInfo{6011, nullptr, "EnableLayerAutoClearTransitionBuffer"}, + FunctionInfo{6012, nullptr, "DisableLayerAutoClearTransitionBuffer"}, + FunctionInfo{6013, nullptr, "SetLayerOpacity"}, + FunctionInfo{6014, nullptr, "AttachLayerWatermarkCompositor"}, + FunctionInfo{6015, nullptr, "DetachLayerWatermarkCompositor"}, + FunctionInfo{7000, nullptr, "SetContentVisibility"}, + FunctionInfo{8000, nullptr, "SetConductorLayer"}, + FunctionInfo{8001, nullptr, "SetTimestampTracking"}, + FunctionInfo{8100, nullptr, "SetIndirectProducerFlipOffset"}, + FunctionInfo{8200, nullptr, "CreateSharedBufferStaticStorage"}, + FunctionInfo{8201, nullptr, "CreateSharedBufferTransferMemory"}, + FunctionInfo{8202, nullptr, "DestroySharedBuffer"}, + FunctionInfo{8203, nullptr, "BindSharedLowLevelLayerToManagedLayer"}, + FunctionInfo{8204, nullptr, "BindSharedLowLevelLayerToIndirectLayer"}, + FunctionInfo{8207, nullptr, "UnbindSharedLowLevelLayer"}, + FunctionInfo{8208, nullptr, "ConnectSharedLowLevelLayerToSharedBuffer"}, + FunctionInfo{8209, nullptr, "DisconnectSharedLowLevelLayerFromSharedBuffer"}, + FunctionInfo{8210, nullptr, "CreateSharedLayer"}, + FunctionInfo{8211, nullptr, "DestroySharedLayer"}, + FunctionInfo{8216, nullptr, "AttachSharedLayerToLowLevelLayer"}, + FunctionInfo{8217, nullptr, "ForceDetachSharedLayerFromLowLevelLayer"}, + FunctionInfo{8218, nullptr, "StartDetachSharedLayerFromLowLevelLayer"}, + FunctionInfo{8219, nullptr, "FinishDetachSharedLayerFromLowLevelLayer"}, + FunctionInfo{8220, nullptr, "GetSharedLayerDetachReadyEvent"}, + FunctionInfo{8221, nullptr, "GetSharedLowLevelLayerSynchronizedEvent"}, + FunctionInfo{8222, nullptr, "CheckSharedLowLevelLayerSynchronized"}, + FunctionInfo{8223, nullptr, "RegisterSharedBufferImporterAruid"}, + FunctionInfo{8224, nullptr, "UnregisterSharedBufferImporterAruid"}, + FunctionInfo{8227, nullptr, "CreateSharedBufferProcessHeap"}, + FunctionInfo{8228, nullptr, "GetSharedLayerLayerStacks"}, + FunctionInfo{8229, nullptr, "SetSharedLayerLayerStacks"}, + FunctionInfo{8291, nullptr, "PresentDetachedSharedFrameBufferToLowLevelLayer"}, + FunctionInfo{8292, nullptr, "FillDetachedSharedFrameBufferColor"}, + FunctionInfo{8293, nullptr, "GetDetachedSharedFrameBufferImage"}, + FunctionInfo{8294, nullptr, "SetDetachedSharedFrameBufferImage"}, + FunctionInfo{8295, nullptr, "CopyDetachedSharedFrameBufferImage"}, + FunctionInfo{8296, nullptr, "SetDetachedSharedFrameBufferSubImage"}, + FunctionInfo{8297, nullptr, "GetSharedFrameBufferContentParameter"}, + FunctionInfo{8298, nullptr, "ExpandStartupLogoOnSharedFrameBuffer"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IManagerDisplayService::IManagerDisplayService(Core::System& system_, std::shared_ptr container) : ServiceFramework{system_, "IManagerDisplayService"}, m_container{std::move(container)} { - // clang-format off - static const FunctionInfo functions[] = { - {200, nullptr, "AllocateProcessHeapBlock"}, - {201, nullptr, "FreeProcessHeapBlock"}, - {1102, nullptr, "GetDisplayResolution"}, - {2010, C<&IManagerDisplayService::CreateManagedLayer>, "CreateManagedLayer"}, - {2011, C<&IManagerDisplayService::DestroyManagedLayer>, "DestroyManagedLayer"}, - {2012, nullptr, "CreateStrayLayer"}, - {2050, nullptr, "CreateIndirectLayer"}, - {2051, nullptr, "DestroyIndirectLayer"}, - {2052, nullptr, "CreateIndirectProducerEndPoint"}, - {2053, nullptr, "DestroyIndirectProducerEndPoint"}, - {2054, nullptr, "CreateIndirectConsumerEndPoint"}, - {2055, nullptr, "DestroyIndirectConsumerEndPoint"}, - {2060, nullptr, "CreateWatermarkCompositor"}, - {2062, nullptr, "SetWatermarkText"}, - {2063, nullptr, "SetWatermarkLayerStacks"}, - {2300, nullptr, "AcquireLayerTexturePresentingEvent"}, - {2301, nullptr, "ReleaseLayerTexturePresentingEvent"}, - {2302, nullptr, "GetDisplayHotplugEvent"}, - {2303, nullptr, "GetDisplayModeChangedEvent"}, - {2402, nullptr, "GetDisplayHotplugState"}, - {2501, nullptr, "GetCompositorErrorInfo"}, - {2601, nullptr, "GetDisplayErrorEvent"}, - {2701, nullptr, "GetDisplayFatalErrorEvent"}, - {4201, nullptr, "SetDisplayAlpha"}, - {4203, nullptr, "SetDisplayLayerStack"}, - {4205, nullptr, "SetDisplayPowerState"}, - {4206, nullptr, "SetDefaultDisplay"}, - {4207, nullptr, "ResetDisplayPanel"}, - {4208, nullptr, "SetDisplayFatalErrorEnabled"}, - {4209, nullptr, "IsDisplayPanelOn"}, - {4300, nullptr, "GetInternalPanelId"}, - {6000, C<&IManagerDisplayService::AddToLayerStack>, "AddToLayerStack"}, - {6001, nullptr, "RemoveFromLayerStack"}, - {6002, C<&IManagerDisplayService::SetLayerVisibility>, "SetLayerVisibility"}, - {6003, nullptr, "SetLayerConfig"}, - {6004, nullptr, "AttachLayerPresentationTracer"}, - {6005, nullptr, "DetachLayerPresentationTracer"}, - {6006, nullptr, "StartLayerPresentationRecording"}, - {6007, nullptr, "StopLayerPresentationRecording"}, - {6008, nullptr, "StartLayerPresentationFenceWait"}, - {6009, nullptr, "StopLayerPresentationFenceWait"}, - {6010, nullptr, "GetLayerPresentationAllFencesExpiredEvent"}, - {6011, nullptr, "EnableLayerAutoClearTransitionBuffer"}, - {6012, nullptr, "DisableLayerAutoClearTransitionBuffer"}, - {6013, nullptr, "SetLayerOpacity"}, - {6014, nullptr, "AttachLayerWatermarkCompositor"}, - {6015, nullptr, "DetachLayerWatermarkCompositor"}, - {7000, nullptr, "SetContentVisibility"}, - {8000, nullptr, "SetConductorLayer"}, - {8001, nullptr, "SetTimestampTracking"}, - {8100, nullptr, "SetIndirectProducerFlipOffset"}, - {8200, nullptr, "CreateSharedBufferStaticStorage"}, - {8201, nullptr, "CreateSharedBufferTransferMemory"}, - {8202, nullptr, "DestroySharedBuffer"}, - {8203, nullptr, "BindSharedLowLevelLayerToManagedLayer"}, - {8204, nullptr, "BindSharedLowLevelLayerToIndirectLayer"}, - {8207, nullptr, "UnbindSharedLowLevelLayer"}, - {8208, nullptr, "ConnectSharedLowLevelLayerToSharedBuffer"}, - {8209, nullptr, "DisconnectSharedLowLevelLayerFromSharedBuffer"}, - {8210, nullptr, "CreateSharedLayer"}, - {8211, nullptr, "DestroySharedLayer"}, - {8216, nullptr, "AttachSharedLayerToLowLevelLayer"}, - {8217, nullptr, "ForceDetachSharedLayerFromLowLevelLayer"}, - {8218, nullptr, "StartDetachSharedLayerFromLowLevelLayer"}, - {8219, nullptr, "FinishDetachSharedLayerFromLowLevelLayer"}, - {8220, nullptr, "GetSharedLayerDetachReadyEvent"}, - {8221, nullptr, "GetSharedLowLevelLayerSynchronizedEvent"}, - {8222, nullptr, "CheckSharedLowLevelLayerSynchronized"}, - {8223, nullptr, "RegisterSharedBufferImporterAruid"}, - {8224, nullptr, "UnregisterSharedBufferImporterAruid"}, - {8227, nullptr, "CreateSharedBufferProcessHeap"}, - {8228, nullptr, "GetSharedLayerLayerStacks"}, - {8229, nullptr, "SetSharedLayerLayerStacks"}, - {8291, nullptr, "PresentDetachedSharedFrameBufferToLowLevelLayer"}, - {8292, nullptr, "FillDetachedSharedFrameBufferColor"}, - {8293, nullptr, "GetDetachedSharedFrameBufferImage"}, - {8294, nullptr, "SetDetachedSharedFrameBufferImage"}, - {8295, nullptr, "CopyDetachedSharedFrameBufferImage"}, - {8296, nullptr, "SetDetachedSharedFrameBufferSubImage"}, - {8297, nullptr, "GetSharedFrameBufferContentParameter"}, - {8298, nullptr, "ExpandStartupLogoOnSharedFrameBuffer"}, - }; - // clang-format on - - RegisterHandlers(functions); } IManagerDisplayService::~IManagerDisplayService() = default; diff --git a/src/core/hle/service/vi/manager_display_service.h b/src/core/hle/service/vi/manager_display_service.h index 14a107cb43..1c7a79f337 100644 --- a/src/core/hle/service/vi/manager_display_service.h +++ b/src/core/hle/service/vi/manager_display_service.h @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -37,6 +37,7 @@ public: Result SetLayerVisibility(bool visible, u64 layer_id); private: + std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; }; diff --git a/src/core/hle/service/vi/manager_root_service.cpp b/src/core/hle/service/vi/manager_root_service.cpp index 0f16a15b4a..0cc98bc2c0 100644 --- a/src/core/hle/service/vi/manager_root_service.cpp +++ b/src/core/hle/service/vi/manager_root_service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,18 +15,21 @@ namespace Service::VI { +std::optional IManagerRootService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{2, C<&IManagerRootService::GetDisplayService>, "GetDisplayService"}, + FunctionInfo{3, nullptr, "GetDisplayServiceWithProxyNameExchange"}, + FunctionInfo{100, nullptr, "PrepareFatal"}, + FunctionInfo{101, nullptr, "ShowFatal"}, + FunctionInfo{102, nullptr, "DrawFatalRectangle"}, + FunctionInfo{103, nullptr, "DrawFatalText32"} + ); + return HandlerTableGenerateWithFind(key, functions); +} + IManagerRootService::IManagerRootService(Core::System& system_, std::shared_ptr container) : ServiceFramework{system_, "vi:m"}, m_container{std::move(container)} { - static const FunctionInfo functions[] = { - {2, C<&IManagerRootService::GetDisplayService>, "GetDisplayService"}, - {3, nullptr, "GetDisplayServiceWithProxyNameExchange"}, - {100, nullptr, "PrepareFatal"}, - {101, nullptr, "ShowFatal"}, - {102, nullptr, "DrawFatalRectangle"}, - {103, nullptr, "DrawFatalText32"}, - }; - RegisterHandlers(functions); } IManagerRootService::~IManagerRootService() = default; diff --git a/src/core/hle/service/vi/manager_root_service.h b/src/core/hle/service/vi/manager_root_service.h index 77cd328699..78c0d1f80d 100644 --- a/src/core/hle/service/vi/manager_root_service.h +++ b/src/core/hle/service/vi/manager_root_service.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -26,6 +29,7 @@ public: Policy policy); private: + std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; }; diff --git a/src/core/hle/service/vi/shared_buffer_manager.h b/src/core/hle/service/vi/shared_buffer_manager.h index 807db10f31..d1ce57ee27 100644 --- a/src/core/hle/service/vi/shared_buffer_manager.h +++ b/src/core/hle/service/vi/shared_buffer_manager.h @@ -18,6 +18,10 @@ class KPageGroup; class KReadableEvent; } // namespace Kernel +namespace Core { +class System; +} + namespace Service::android { class BufferQueueProducer; } diff --git a/src/core/hle/service/vi/system_display_service.cpp b/src/core/hle/service/vi/system_display_service.cpp index 0956053dcf..997f0a51fc 100644 --- a/src/core/hle/service/vi/system_display_service.cpp +++ b/src/core/hle/service/vi/system_display_service.cpp @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -12,63 +12,63 @@ namespace Service::VI { -ISystemDisplayService::ISystemDisplayService(Core::System& system_, - std::shared_ptr container) - : ServiceFramework{system_, "ISystemDisplayService"}, m_container{std::move(container)} { - // clang-format off - static const FunctionInfo functions[] = { - {1200, nullptr, "GetZOrderCountMin"}, - {1202, nullptr, "GetZOrderCountMax"}, - {1203, nullptr, "GetDisplayLogicalResolution"}, - {1204, nullptr, "SetDisplayMagnification"}, - {2201, nullptr, "SetLayerPosition"}, - {2203, nullptr, "SetLayerSize"}, - {2204, C<&ISystemDisplayService::GetLayerZ>, "GetLayerZ"}, - {2205, C<&ISystemDisplayService::SetLayerZ>, "SetLayerZ"}, - {2207, C<&ISystemDisplayService::SetLayerVisibility>, "SetLayerVisibility"}, - {2209, nullptr, "SetLayerAlpha"}, - {2210, nullptr, "SetLayerPositionAndSize"}, - {2312, nullptr, "CreateStrayLayer"}, - {2400, nullptr, "OpenIndirectLayer"}, - {2401, nullptr, "CloseIndirectLayer"}, - {2402, nullptr, "FlipIndirectLayer"}, - {3000, C<&ISystemDisplayService::ListDisplayModes>, "ListDisplayModes"}, - {3001, nullptr, "ListDisplayRgbRanges"}, - {3002, nullptr, "ListDisplayContentTypes"}, - {3200, C<&ISystemDisplayService::GetDisplayMode>, "GetDisplayMode"}, - {3201, nullptr, "SetDisplayMode"}, - {3202, nullptr, "GetDisplayUnderscan"}, - {3203, nullptr, "SetDisplayUnderscan"}, - {3204, nullptr, "GetDisplayContentType"}, - {3205, nullptr, "SetDisplayContentType"}, - {3206, nullptr, "GetDisplayRgbRange"}, - {3207, nullptr, "SetDisplayRgbRange"}, - {3208, nullptr, "GetDisplayCmuMode"}, - {3209, nullptr, "SetDisplayCmuMode"}, - {3210, nullptr, "GetDisplayContrastRatio"}, - {3211, nullptr, "SetDisplayContrastRatio"}, - {3214, nullptr, "GetDisplayGamma"}, - {3215, nullptr, "SetDisplayGamma"}, - {3216, nullptr, "GetDisplayCmuLuma"}, - {3217, nullptr, "SetDisplayCmuLuma"}, - {3218, nullptr, "SetDisplayCrcMode"}, - {6013, nullptr, "GetLayerPresentationSubmissionTimestamps"}, - {8225, C<&ISystemDisplayService::GetSharedBufferMemoryHandleId>, "GetSharedBufferMemoryHandleId"}, - {8250, C<&ISystemDisplayService::OpenSharedLayer>, "OpenSharedLayer"}, - {8251, nullptr, "CloseSharedLayer"}, - {8252, C<&ISystemDisplayService::ConnectSharedLayer>, "ConnectSharedLayer"}, - {8253, nullptr, "DisconnectSharedLayer"}, - {8254, C<&ISystemDisplayService::AcquireSharedFrameBuffer>, "AcquireSharedFrameBuffer"}, - {8255, C<&ISystemDisplayService::PresentSharedFrameBuffer>, "PresentSharedFrameBuffer"}, - {8256, C<&ISystemDisplayService::GetSharedFrameBufferAcquirableEvent>, "GetSharedFrameBufferAcquirableEvent"}, - {8257, nullptr, "FillSharedFrameBufferColor"}, - {8258, C<&ISystemDisplayService::CancelSharedFrameBuffer>, "CancelSharedFrameBuffer"}, - {9000, nullptr, "GetDp2hdmiController"}, - }; - // clang-format on - RegisterHandlers(functions); +std::optional ISystemDisplayService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1200, nullptr, "GetZOrderCountMin"}, + FunctionInfo{1202, nullptr, "GetZOrderCountMax"}, + FunctionInfo{1203, nullptr, "GetDisplayLogicalResolution"}, + FunctionInfo{1204, nullptr, "SetDisplayMagnification"}, + FunctionInfo{2201, nullptr, "SetLayerPosition"}, + FunctionInfo{2203, nullptr, "SetLayerSize"}, + FunctionInfo{2204, C<&ISystemDisplayService::GetLayerZ>, "GetLayerZ"}, + FunctionInfo{2205, C<&ISystemDisplayService::SetLayerZ>, "SetLayerZ"}, + FunctionInfo{2207, C<&ISystemDisplayService::SetLayerVisibility>, "SetLayerVisibility"}, + FunctionInfo{2209, nullptr, "SetLayerAlpha"}, + FunctionInfo{2210, nullptr, "SetLayerPositionAndSize"}, + FunctionInfo{2312, nullptr, "CreateStrayLayer"}, + FunctionInfo{2400, nullptr, "OpenIndirectLayer"}, + FunctionInfo{2401, nullptr, "CloseIndirectLayer"}, + FunctionInfo{2402, nullptr, "FlipIndirectLayer"}, + FunctionInfo{3000, C<&ISystemDisplayService::ListDisplayModes>, "ListDisplayModes"}, + FunctionInfo{3001, nullptr, "ListDisplayRgbRanges"}, + FunctionInfo{3002, nullptr, "ListDisplayContentTypes"}, + FunctionInfo{3200, C<&ISystemDisplayService::GetDisplayMode>, "GetDisplayMode"}, + FunctionInfo{3201, nullptr, "SetDisplayMode"}, + FunctionInfo{3202, nullptr, "GetDisplayUnderscan"}, + FunctionInfo{3203, nullptr, "SetDisplayUnderscan"}, + FunctionInfo{3204, nullptr, "GetDisplayContentType"}, + FunctionInfo{3205, nullptr, "SetDisplayContentType"}, + FunctionInfo{3206, nullptr, "GetDisplayRgbRange"}, + FunctionInfo{3207, nullptr, "SetDisplayRgbRange"}, + FunctionInfo{3208, nullptr, "GetDisplayCmuMode"}, + FunctionInfo{3209, nullptr, "SetDisplayCmuMode"}, + FunctionInfo{3210, nullptr, "GetDisplayContrastRatio"}, + FunctionInfo{3211, nullptr, "SetDisplayContrastRatio"}, + FunctionInfo{3214, nullptr, "GetDisplayGamma"}, + FunctionInfo{3215, nullptr, "SetDisplayGamma"}, + FunctionInfo{3216, nullptr, "GetDisplayCmuLuma"}, + FunctionInfo{3217, nullptr, "SetDisplayCmuLuma"}, + FunctionInfo{3218, nullptr, "SetDisplayCrcMode"}, + FunctionInfo{6013, nullptr, "GetLayerPresentationSubmissionTimestamps"}, + FunctionInfo{8225, C<&ISystemDisplayService::GetSharedBufferMemoryHandleId>, "GetSharedBufferMemoryHandleId"}, + FunctionInfo{8250, C<&ISystemDisplayService::OpenSharedLayer>, "OpenSharedLayer"}, + FunctionInfo{8251, nullptr, "CloseSharedLayer"}, + FunctionInfo{8252, C<&ISystemDisplayService::ConnectSharedLayer>, "ConnectSharedLayer"}, + FunctionInfo{8253, nullptr, "DisconnectSharedLayer"}, + FunctionInfo{8254, C<&ISystemDisplayService::AcquireSharedFrameBuffer>, "AcquireSharedFrameBuffer"}, + FunctionInfo{8255, C<&ISystemDisplayService::PresentSharedFrameBuffer>, "PresentSharedFrameBuffer"}, + FunctionInfo{8256, C<&ISystemDisplayService::GetSharedFrameBufferAcquirableEvent>, "GetSharedFrameBufferAcquirableEvent"}, + FunctionInfo{8257, nullptr, "FillSharedFrameBufferColor"}, + FunctionInfo{8258, C<&ISystemDisplayService::CancelSharedFrameBuffer>, "CancelSharedFrameBuffer"}, + FunctionInfo{9000, nullptr, "GetDp2hdmiController"} + ); + return HandlerTableGenerateWithFind(key, functions); } +ISystemDisplayService::ISystemDisplayService(Core::System& system_, std::shared_ptr container) + : ServiceFramework{system_, "ISystemDisplayService"}, m_container{std::move(container)} +{} + ISystemDisplayService::~ISystemDisplayService() = default; Result ISystemDisplayService::GetLayerZ(Out out_z_value, u64 layer_id) { diff --git a/src/core/hle/service/vi/system_display_service.h b/src/core/hle/service/vi/system_display_service.h index a3b88c519d..04c9f0977e 100644 --- a/src/core/hle/service/vi/system_display_service.h +++ b/src/core/hle/service/vi/system_display_service.h @@ -47,6 +47,7 @@ private: Result CancelSharedFrameBuffer(u64 layer_id, s64 slot); private: + std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; }; diff --git a/src/core/hle/service/vi/system_root_service.cpp b/src/core/hle/service/vi/system_root_service.cpp index 3489727d81..c078be37a3 100644 --- a/src/core/hle/service/vi/system_root_service.cpp +++ b/src/core/hle/service/vi/system_root_service.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,15 +14,18 @@ namespace Service::VI { -ISystemRootService::ISystemRootService(Core::System& system_, std::shared_ptr container) - : ServiceFramework{system_, "vi:s"}, m_container{std::move(container)} { - static const FunctionInfo functions[] = { - {1, C<&ISystemRootService::GetDisplayService>, "GetDisplayService"}, - {3, nullptr, "GetDisplayServiceWithProxyNameExchange"}, - }; - RegisterHandlers(functions); +std::optional ISystemRootService::FindRequest(u32 key) { + static constexpr auto functions = CreateStaticMap( + FunctionInfo{1, C<&ISystemRootService::GetDisplayService>, "GetDisplayService"}, + FunctionInfo{3, nullptr, "GetDisplayServiceWithProxyNameExchange"} + ); + return HandlerTableGenerateWithFind(key, functions); } +ISystemRootService::ISystemRootService(Core::System& system_, std::shared_ptr container) + : ServiceFramework{system_, "vi:s"}, m_container{std::move(container)} +{} + ISystemRootService::~ISystemRootService() = default; Result ISystemRootService::GetDisplayService( diff --git a/src/core/hle/service/vi/system_root_service.h b/src/core/hle/service/vi/system_root_service.h index 9d5aa53d38..baf516fec5 100644 --- a/src/core/hle/service/vi/system_root_service.h +++ b/src/core/hle/service/vi/system_root_service.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -26,6 +29,7 @@ private: Out> out_application_display_service, Policy policy); + std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; }; diff --git a/src/core/hle/service/wlan/wlan.cpp b/src/core/hle/service/wlan/wlan.cpp index bcd357d57a..fa68ff51ba 100644 --- a/src/core/hle/service/wlan/wlan.cpp +++ b/src/core/hle/service/wlan/wlan.cpp @@ -16,232 +16,248 @@ class ILocalManager final : public ServiceFramework { public: explicit ILocalManager(Core::System& system_) : ServiceFramework{system_, "wlan:lcl"} - { - static const FunctionInfo functions[] = { - { 0, nullptr, "OpenMasterMode" }, - { 0, nullptr, "OpenMode_2" }, - { 1, nullptr, "CloseMasterMode" }, - { 1, nullptr, "CloseMode_2" }, - { 2, nullptr, "OpenClientMode" }, - { 2, nullptr, "GetMacAddress_2" }, - { 3, nullptr, "CloseClientMode" }, - { 3, nullptr, "CreateBss" }, - { 4, nullptr, "OpenSpectatorMode" }, - { 4, nullptr, "DestroyBss" }, - { 5, nullptr, "CloseSpectatorMode" }, - { 5, nullptr, "StartScan_2" }, - { 6, nullptr, "GetMacAddress_2" }, - { 6, nullptr, "StopScan_2" }, - { 7, nullptr, "CreateBss" }, - { 7, nullptr, "Connect_2" }, - { 8, nullptr, "DestroyBss" }, - { 8, nullptr, "CancelConnect_2" }, - { 9, nullptr, "StartScan_2" }, - { 9, nullptr, "Join" }, - { 10, nullptr, "StopScan_2" }, - { 10, nullptr, "CancelJoin" }, - { 11, nullptr, "Connect_2" }, - { 11, nullptr, "Disconnect_2" }, - { 12, nullptr, "CancelConnect_2" }, - { 12, nullptr, "SetBeaconLostCount" }, - { 13, nullptr, "Join" }, - { 13, nullptr, "GetSystemEvent_2" }, - { 14, nullptr, "CancelJoin" }, - { 14, nullptr, "GetConnectionStatus_2" }, - { 15, nullptr, "Disconnect_2" }, - { 15, nullptr, "GetClientStatus" }, - { 16, nullptr, "SetBeaconLostCount" }, - { 16, nullptr, "GetBssIndicationEvent" }, - { 17, nullptr, "GetSystemEvent_2" }, - { 17, nullptr, "GetBssIndicationInfo" }, - { 18, nullptr, "GetConnectionStatus_2" }, - { 18, nullptr, "GetState_2" }, - { 19, nullptr, "GetClientStatus" }, - { 19, nullptr, "GetAllowedChannels" }, - { 20, nullptr, "GetBssIndicationEvent" }, - { 20, nullptr, "AddIe" }, - { 21, nullptr, "GetBssIndicationInfo" }, - { 21, nullptr, "DeleteIe" }, - { 22, nullptr, "GetState_2" }, - { 22, nullptr, "PutFrameRaw" }, - { 23, nullptr, "GetAllowedChannels" }, - { 23, nullptr, "CancelGetFrame" }, - { 24, nullptr, "AddIe" }, - { 24, nullptr, "CreateRxEntry" }, - { 25, nullptr, "DeleteIe" }, - { 25, nullptr, "DeleteRxEntry" }, - { 26, nullptr, "PutFrameRaw" }, - { 26, nullptr, "AddEthertypeToRxEntry" }, - { 27, nullptr, "CancelGetFrame" }, - { 27, nullptr, "DeleteEthertypeFromRxEntry" }, - { 28, nullptr, "CreateRxEntry" }, - { 28, nullptr, "AddMatchingDataToRxEntry" }, - { 29, nullptr, "DeleteRxEntry" }, - { 29, nullptr, "RemoveMatchingDataFromRxEntry" }, - { 30, nullptr, "AddEthertypeToRxEntry" }, - { 30, nullptr, "GetScanResult_2" }, - { 31, nullptr, "DeleteEthertypeFromRxEntry" }, - { 31, nullptr, "PutActionFrameOneShot" }, - { 32, nullptr, "AddMatchingDataToRxEntry" }, - { 32, nullptr, "SetActionFrameWithBeacon" }, - { 33, nullptr, "RemoveMatchingDataFromRxEntry" }, - { 33, nullptr, "CancelActionFrameWithBeacon" }, - { 34, nullptr, "GetScanResult_2" }, - { 34, nullptr, "CreateRxEntryForActionFrame" }, - { 35, nullptr, "PutActionFrameOneShot" }, - { 35, nullptr, "DeleteRxEntryForActionFrame" }, - { 36, nullptr, "SetActionFrameWithBeacon" }, - { 36, nullptr, "AddSubtypeToRxEntryForActionFrame" }, - { 37, nullptr, "CancelActionFrameWithBeacon" }, - { 37, nullptr, "DeleteSubtypeFromRxEntryForActionFrame" }, - { 38, nullptr, "CreateRxEntryForActionFrame" }, - { 38, nullptr, "CancelGetActionFrame" }, - { 39, nullptr, "DeleteRxEntryForActionFrame" }, - { 39, nullptr, "GetRssi_2" }, - { 40, nullptr, "AddSubtypeToRxEntryForActionFrame" }, - { 40, nullptr, "SetMaxAssociationNumber" }, - { 41, nullptr, "DeleteSubtypeFromRxEntryForActionFrame" }, - { 41, nullptr, "Cmd41" }, - { 42, nullptr, "CancelGetActionFrame" }, - { 42, nullptr, "Cmd42" }, - { 43, nullptr, "GetRssi_2" }, - { 43, nullptr, "Cmd43" }, - { 44, nullptr, "SetMaxAssociationNumber" }, - { 45, nullptr, "OpenLcsMasterMode" }, - { 46, nullptr, "CloseLcsMasterMode" }, - { 47, nullptr, "OpenLcsClientMode" }, - { 48, nullptr, "CloseLcsClientMode" }, - { 49, nullptr, "GetChannelStats" }, - { 50, nullptr, "Cmd50" }, - { 51, nullptr, "Cmd51" }, - { 52, nullptr, "Cmd52" }, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "OpenMasterMode"}, + FunctionInfo{0, nullptr, "OpenMode_2"}, + FunctionInfo{1, nullptr, "CloseMasterMode"}, + FunctionInfo{1, nullptr, "CloseMode_2"}, + FunctionInfo{2, nullptr, "OpenClientMode"}, + FunctionInfo{2, nullptr, "GetMacAddress_2"}, + FunctionInfo{3, nullptr, "CloseClientMode"}, + FunctionInfo{3, nullptr, "CreateBss"}, + FunctionInfo{4, nullptr, "OpenSpectatorMode"}, + FunctionInfo{4, nullptr, "DestroyBss"}, + FunctionInfo{5, nullptr, "CloseSpectatorMode"}, + FunctionInfo{5, nullptr, "StartScan_2"}, + FunctionInfo{6, nullptr, "GetMacAddress_2"}, + FunctionInfo{6, nullptr, "StopScan_2"}, + FunctionInfo{7, nullptr, "CreateBss"}, + FunctionInfo{7, nullptr, "Connect_2"}, + FunctionInfo{8, nullptr, "DestroyBss"}, + FunctionInfo{8, nullptr, "CancelConnect_2"}, + FunctionInfo{9, nullptr, "StartScan_2"}, + FunctionInfo{9, nullptr, "Join"}, + FunctionInfo{10, nullptr, "StopScan_2"}, + FunctionInfo{10, nullptr, "CancelJoin"}, + FunctionInfo{11, nullptr, "Connect_2"}, + FunctionInfo{11, nullptr, "Disconnect_2"}, + FunctionInfo{12, nullptr, "CancelConnect_2"}, + FunctionInfo{12, nullptr, "SetBeaconLostCount"}, + FunctionInfo{13, nullptr, "Join"}, + FunctionInfo{13, nullptr, "GetSystemEvent_2"}, + FunctionInfo{14, nullptr, "CancelJoin"}, + FunctionInfo{14, nullptr, "GetConnectionStatus_2"}, + FunctionInfo{15, nullptr, "Disconnect_2"}, + FunctionInfo{15, nullptr, "GetClientStatus"}, + FunctionInfo{16, nullptr, "SetBeaconLostCount"}, + FunctionInfo{16, nullptr, "GetBssIndicationEvent"}, + FunctionInfo{17, nullptr, "GetSystemEvent_2"}, + FunctionInfo{17, nullptr, "GetBssIndicationInfo"}, + FunctionInfo{18, nullptr, "GetConnectionStatus_2"}, + FunctionInfo{18, nullptr, "GetState_2"}, + FunctionInfo{19, nullptr, "GetClientStatus"}, + FunctionInfo{19, nullptr, "GetAllowedChannels"}, + FunctionInfo{20, nullptr, "GetBssIndicationEvent"}, + FunctionInfo{20, nullptr, "AddIe"}, + FunctionInfo{21, nullptr, "GetBssIndicationInfo"}, + FunctionInfo{21, nullptr, "DeleteIe"}, + FunctionInfo{22, nullptr, "GetState_2"}, + FunctionInfo{22, nullptr, "PutFrameRaw"}, + FunctionInfo{23, nullptr, "GetAllowedChannels"}, + FunctionInfo{23, nullptr, "CancelGetFrame"}, + FunctionInfo{24, nullptr, "AddIe"}, + FunctionInfo{24, nullptr, "CreateRxEntry"}, + FunctionInfo{25, nullptr, "DeleteIe"}, + FunctionInfo{25, nullptr, "DeleteRxEntry"}, + FunctionInfo{26, nullptr, "PutFrameRaw"}, + FunctionInfo{26, nullptr, "AddEthertypeToRxEntry"}, + FunctionInfo{27, nullptr, "CancelGetFrame"}, + FunctionInfo{27, nullptr, "DeleteEthertypeFromRxEntry"}, + FunctionInfo{28, nullptr, "CreateRxEntry"}, + FunctionInfo{28, nullptr, "AddMatchingDataToRxEntry"}, + FunctionInfo{29, nullptr, "DeleteRxEntry"}, + FunctionInfo{29, nullptr, "RemoveMatchingDataFromRxEntry"}, + FunctionInfo{30, nullptr, "AddEthertypeToRxEntry"}, + FunctionInfo{30, nullptr, "GetScanResult_2"}, + FunctionInfo{31, nullptr, "DeleteEthertypeFromRxEntry"}, + FunctionInfo{31, nullptr, "PutActionFrameOneShot"}, + FunctionInfo{32, nullptr, "AddMatchingDataToRxEntry"}, + FunctionInfo{32, nullptr, "SetActionFrameWithBeacon"}, + FunctionInfo{33, nullptr, "RemoveMatchingDataFromRxEntry"}, + FunctionInfo{33, nullptr, "CancelActionFrameWithBeacon"}, + FunctionInfo{34, nullptr, "GetScanResult_2"}, + FunctionInfo{34, nullptr, "CreateRxEntryForActionFrame"}, + FunctionInfo{35, nullptr, "PutActionFrameOneShot"}, + FunctionInfo{35, nullptr, "DeleteRxEntryForActionFrame"}, + FunctionInfo{36, nullptr, "SetActionFrameWithBeacon"}, + FunctionInfo{36, nullptr, "AddSubtypeToRxEntryForActionFrame"}, + FunctionInfo{37, nullptr, "CancelActionFrameWithBeacon"}, + FunctionInfo{37, nullptr, "DeleteSubtypeFromRxEntryForActionFrame"}, + FunctionInfo{38, nullptr, "CreateRxEntryForActionFrame"}, + FunctionInfo{38, nullptr, "CancelGetActionFrame"}, + FunctionInfo{39, nullptr, "DeleteRxEntryForActionFrame"}, + FunctionInfo{39, nullptr, "GetRssi_2"}, + FunctionInfo{40, nullptr, "AddSubtypeToRxEntryForActionFrame"}, + FunctionInfo{40, nullptr, "SetMaxAssociationNumber"}, + FunctionInfo{41, nullptr, "DeleteSubtypeFromRxEntryForActionFrame"}, + FunctionInfo{41, nullptr, "Cmd41"}, + FunctionInfo{42, nullptr, "CancelGetActionFrame"}, + FunctionInfo{42, nullptr, "Cmd42"}, + FunctionInfo{43, nullptr, "GetRssi_2"}, + FunctionInfo{43, nullptr, "Cmd43"}, + FunctionInfo{44, nullptr, "SetMaxAssociationNumber"}, + FunctionInfo{45, nullptr, "OpenLcsMasterMode"}, + FunctionInfo{46, nullptr, "CloseLcsMasterMode"}, + FunctionInfo{47, nullptr, "OpenLcsClientMode"}, + FunctionInfo{48, nullptr, "CloseLcsClientMode"}, + FunctionInfo{49, nullptr, "GetChannelStats"}, + FunctionInfo{50, nullptr, "Cmd50"}, + FunctionInfo{51, nullptr, "Cmd51"}, + FunctionInfo{52, nullptr, "Cmd52"} + ); }; class ILocalGetFrame final : public ServiceFramework { public: explicit ILocalGetFrame(Core::System& system_) : ServiceFramework{system_, "wlan:lg"} - { - static const FunctionInfo functions[] = { - { 0, nullptr, "GetFrameRaw" }, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetFrameRaw" } + ); }; class ILocalGetActionFrame final : public ServiceFramework { public: explicit ILocalGetActionFrame(Core::System& system_) : ServiceFramework{system_, "wlan:lga"} - { - static const FunctionInfo functions[] = { - { 0, nullptr, "GetActionFrame" }, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetActionFrame" } + ); }; class ISocketGetFrame final : public ServiceFramework { public: explicit ISocketGetFrame(Core::System& system_) : ServiceFramework{system_, "wlan:sg"} - { - static const FunctionInfo functions[] = { - { 0, nullptr, "GetFrameRaw" }, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "GetFrameRaw" } + ); }; class ISocketManager final : public ServiceFramework { public: explicit ISocketManager(Core::System& system_) : ServiceFramework{system_, "wlan:soc"} - { - static const FunctionInfo functions[] = { - { 0, nullptr, "PutFrameRaw_2" }, - { 1, nullptr, "CancelGetFrame_2" }, - { 2, nullptr, "CreateRxEntry_2" }, - { 3, nullptr, "DeleteRxEntry_2" }, - { 4, nullptr, "AddEthertypeToRxEntry_2" }, - { 5, nullptr, "DeleteEthertypeFromRxEntry_2" }, - { 6, nullptr, "GetMacAddress_3" }, - { 7, nullptr, "SwitchTsfTimerFunction" }, - { 8, nullptr, "GetDeltaTimeBetweenSystemAndTsf" }, - { 9, nullptr, "RegisterSharedMemory" }, - { 10, nullptr, "UnregisterSharedMemory" }, - { 11, nullptr, "EnableSharedMemory" }, - { 12, nullptr, "SetMulticastFilter" }, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "PutFrameRaw_2"}, + FunctionInfo{1, nullptr, "CancelGetFrame_2"}, + FunctionInfo{2, nullptr, "CreateRxEntry_2"}, + FunctionInfo{3, nullptr, "DeleteRxEntry_2"}, + FunctionInfo{4, nullptr, "AddEthertypeToRxEntry_2"}, + FunctionInfo{5, nullptr, "DeleteEthertypeFromRxEntry_2"}, + FunctionInfo{6, nullptr, "GetMacAddress_3"}, + FunctionInfo{7, nullptr, "SwitchTsfTimerFunction"}, + FunctionInfo{8, nullptr, "GetDeltaTimeBetweenSystemAndTsf"}, + FunctionInfo{9, nullptr, "RegisterSharedMemory"}, + FunctionInfo{10, nullptr, "UnregisterSharedMemory"}, + FunctionInfo{11, nullptr, "EnableSharedMemory"}, + FunctionInfo{12, nullptr, "SetMulticastFilter"} + ); }; class IDetectManager final : public ServiceFramework { public: explicit IDetectManager(Core::System& system_) : ServiceFramework{system_, "wlan:dtc"} - { - static const FunctionInfo functions[] = { - { 0, nullptr, "Cmd0" }, - { 1, nullptr, "Cmd1" }, - { 2, nullptr, "Cmd2" }, - { 3, nullptr, "Cmd3" }, - { 4, nullptr, "Cmd4" }, - { 5, nullptr, "Cmd5" }, - { 6, nullptr, "Cmd6" }, - { 7, nullptr, "Cmd7" }, - { 8, nullptr, "Cmd8" }, - { 9, nullptr, "Cmd9" }, - { 10, nullptr, "Cmd10" }, - { 11, nullptr, "Cmd11" }, - { 12, nullptr, "Cmd12" }, - { 13, nullptr, "Cmd13" }, - { 14, nullptr, "Cmd14" }, - { 15, nullptr, "Cmd15" }, - { 16, nullptr, "Cmd16" }, - { 17, nullptr, "Cmd17" }, - { 18, nullptr, "Cmd18" }, - { 19, nullptr, "Cmd19" }, - { 20, nullptr, "Cmd20" }, - { 21, nullptr, "Cmd21" }, - { 22, nullptr, "Cmd22" }, - { 23, nullptr, "Cmd23" }, - { 24, nullptr, "Cmd24" }, - { 25, nullptr, "Cmd25" }, - { 26, nullptr, "Cmd26" }, - { 27, nullptr, "Cmd27" }, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "Cmd0"}, + FunctionInfo{1, nullptr, "Cmd1"}, + FunctionInfo{2, nullptr, "Cmd2"}, + FunctionInfo{3, nullptr, "Cmd3"}, + FunctionInfo{4, nullptr, "Cmd4"}, + FunctionInfo{5, nullptr, "Cmd5"}, + FunctionInfo{6, nullptr, "Cmd6"}, + FunctionInfo{7, nullptr, "Cmd7"}, + FunctionInfo{8, nullptr, "Cmd8"}, + FunctionInfo{9, nullptr, "Cmd9"}, + FunctionInfo{10, nullptr, "Cmd10"}, + FunctionInfo{11, nullptr, "Cmd11"}, + FunctionInfo{12, nullptr, "Cmd12"}, + FunctionInfo{13, nullptr, "Cmd13"}, + FunctionInfo{14, nullptr, "Cmd14"}, + FunctionInfo{15, nullptr, "Cmd15"}, + FunctionInfo{16, nullptr, "Cmd16"}, + FunctionInfo{17, nullptr, "Cmd17"}, + FunctionInfo{18, nullptr, "Cmd18"}, + FunctionInfo{19, nullptr, "Cmd19"}, + FunctionInfo{20, nullptr, "Cmd20"}, + FunctionInfo{21, nullptr, "Cmd21"}, + FunctionInfo{22, nullptr, "Cmd22"}, + FunctionInfo{23, nullptr, "Cmd23"}, + FunctionInfo{24, nullptr, "Cmd24"}, + FunctionInfo{25, nullptr, "Cmd25"}, + FunctionInfo{26, nullptr, "Cmd26"}, + FunctionInfo{27, nullptr, "Cmd27"} + ); }; class IPrivateServiceCreator final : public ServiceFramework { public: explicit IPrivateServiceCreator(Core::System& system_) : ServiceFramework{system_, "wlan:p"} - { - static const FunctionInfo functions[] = { - { 0, nullptr, "CreateWirelessCommunicationService" }, - { 1, nullptr, "CreatePrivateWirelessCommunicationService" }, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "CreateWirelessCommunicationService"}, + FunctionInfo{1, nullptr, "CreatePrivateWirelessCommunicationService"} + ); }; class ISfDriverServiceCreator final : public ServiceFramework { public: explicit ISfDriverServiceCreator(Core::System& system_) : ServiceFramework{system_, "wlan:nd"} - { - static const FunctionInfo functions[] = { - { 0, nullptr, "CreateDriverService" }, - }; - RegisterHandlers(functions); + {} + + std::optional FindRequest(u32 key) override { + return HandlerTableGenerateWithFind(key, functions); } + static constexpr auto functions = CreateStaticMap( + FunctionInfo{0, nullptr, "CreateDriverService" } + ); }; void LoopProcess(Core::System& system) { diff --git a/tools/README.md b/tools/README.md index cde6a21464..f6a520a69c 100644 --- a/tools/README.md +++ b/tools/README.md @@ -8,7 +8,7 @@ Tools for Eden and other subprojects. When adding new scripts please use `#!/bin ## Binaries -- `maxwell-spirv`: Converts Maxwell shaders (dumped from `.ash` files) into SPIR-V code (emitted into STDOUT). +- `maxwell-spirv`: Converts Maxwell shaders (dumped from `.ash` files) into SPIR-V code sent to stdout. - `maxwell-disas`: Dumb raw Maxwell disassembler. - `maxwell-ir`: Dump generated IR of Maxwell shaders. From 6b3cb5772b6e4875f088e5b48e089a3b3fda7f0d Mon Sep 17 00:00:00 2001 From: crueter Date: Tue, 13 Oct 2026 23:54:51 +0200 Subject: [PATCH 106/128] [docs] revise AI policy (#4522) spent 2 hours on a document award This is a revised version of our original AI policy that is cautiously permissive to skilled developers using AI responsibly, while hopefully keeping out the script kiddies spamming their mom's credit card on Claude tokens. This will be trialed for at least a week once merged, any revisions/changes should be made within the next few months Signed-off-by: crueter - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4522 Reviewed-by: lizzie Reviewed-by: MaranBr --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- AGENTS.md | 8 +- CLAUDE.md | 1 - CONTRIBUTING.md | 7 +- docs/policies/AI.md | 199 ++++++++++++++++++++++--------- 5 files changed, 152 insertions(+), 65 deletions(-) delete mode 100644 CLAUDE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8d42a0ab27..422efb5fdc 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,5 +1,5 @@ - [ ] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). -- [ ] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) +- [ ] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [ ] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- diff --git a/AGENTS.md b/AGENTS.md index aabea77170..05ab7f1160 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1 +1,7 @@ -AI and LLM use is *strictly* prohibited within our codebase and surrounding community, including issues and comments. This includes using AI or LLMs to write docs/commit messages, debug issues, brainstorm ideas, research concepts, or search the codebase. +# AGENTS + +Read and follow the AI policy found in `docs/policies/AI.md`, and the coding policies found in `docs/policies/Coding.md`. + +Do not, under any circumstances, ever submit PRs or push commits on behalf of the user. + +Keep comments to a reasonable level. Do not overexplain or add/remove comments from unrelated parts of the codebase. diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index aabea77170..0000000000 --- a/CLAUDE.md +++ /dev/null @@ -1 +0,0 @@ -AI and LLM use is *strictly* prohibited within our codebase and surrounding community, including issues and comments. This includes using AI or LLMs to write docs/commit messages, debug issues, brainstorm ideas, research concepts, or search the codebase. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c09b1c3679..8c16de9ddb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,9 +1,5 @@ # Contributing - - Eden has lots of different ways that you can contribute to its efforts, even without knowing how to write code: - Donate! This will help us live our lives, pay for infrastructure/testing hardware, and more @@ -20,8 +16,7 @@ Eden is free, open-source, copyleft software, licensed under the terms of the [G ### Policies -- No LLM or AI usage, *period*, for patches, pull requests, issues, comments, debugging, brainstorming, etc. - - For details on why, see the [detailed AI policy](docs/policies/AI.md). +- We are trialing a slightly relaxed AI policy to allow high-quality contributors to use AI *responsibly*. Please read our [detailed AI policy](docs/policies/AI.md) for more info. - Usage of any form of profanity or otherwise unsavory language is generally discouraged. - This is primarily because it rarely helps to actually understand what's going on. - Remember that your comments should be focused and actually address what's happening. With very few exceptions, expletives are actively detrimental at best. diff --git a/docs/policies/AI.md b/docs/policies/AI.md index 554a805331..dd4b4a7fb2 100644 --- a/docs/policies/AI.md +++ b/docs/policies/AI.md @@ -1,65 +1,159 @@ # AI Policy -AI and LLM use is *strictly* prohibited within our codebase and surrounding community, including issues and comments. This includes using AI or LLMs to write docs/commit messages, debug issues, brainstorm ideas, research concepts, or search the codebase. +> [!WARNING] +> We are trialing a slightly relaxed AI policy to allow high-quality contributors to use AI *responsibly*. +> This policy is subject to change at any point in time, so check back frequently. +> +> This banner will be removed once we have finalized our revised policy. - [AI Policy](#ai-policy) - - [Low-quality code](#low-quality-code) - - [Licensing concerns](#licensing-concerns) - - [Vibe-coding](#vibe-coding) - - [Commit messages](#commit-messages) - - [Miscellaneous concerns](#miscellaneous-concerns) - - [Unacceptable Use Examples](#unacceptable-use-examples) - - [Addendum: Commit Messages](#addendum-commit-messages) + - [TL;DR](#tldr) + - [Definitions](#definitions) + - [Scope](#scope) + - [Introduction](#introduction) + - [Requirements](#requirements) + - [Sign-off, Authorship, and Copyright](#sign-off-authorship-and-copyright) + - [Permitted Usage](#permitted-usage) + - [Recommended Prior Discussion](#recommended-prior-discussion) + - [Forbidden Usage](#forbidden-usage) + - [Human Effort Denial of Service](#human-effort-denial-of-service) + - [Disclosure](#disclosure) + - [Codebase Ingestion](#codebase-ingestion) + - [Enforcement](#enforcement) + - [Addendum: AI Commit Messages](#addendum-ai-commit-messages) + - [References](#references) -## Low-quality code +## TL;DR -AI is notorious for producing low-quality code; be it: +AI-assisted contributions are welcome, provided you take responsibility for them. -- nonfunctional, -- verbose/inefficient, -- breaking other parts of the codebase, -- or writing/architecting in a completely different style +- You **must** disclose any AI or LLM usage in your pull request description *and* commit message. +- You **must** be able to explain, defend, and revise every line of code you submit. +- Commit messages, PR descriptions, issues, and comments **must** be written by you. Verbatim AI output is not acceptable. +- Undisclosed AI usage will result in your contribution being rejected. +- Low-quality contributions, disclosed or not, will be reworked or rejected. +- Spamming automated PRs, comments, or issues is treated as a Denial of Service (DoS) attack on our reviewers; see [Human Effort Denial of Service](#human-effort-denial-of-service). -All code, AI or not, is held under a **strict standard of excellence**. AI/LLM-generated code will fail this test 10 times out of 10. +## Definitions -## Licensing concerns +An *AI or LLM-based tool* is any piece of software that generates code, text, or other content through machine learning models. This includes, but is not limited to: chat assistants, agentic coding tools/harnesses, inline code completion suggestions you have accepted into the code, and AI-driven explanation/refactoring features. -This is an area of ongoing litigation, and as such, is still very iffy. For the time being, know that allowing AI to ingest the codebase may end up with its copyleft code regurgitated into incompatibly-licensed proprietary or permissive software. For you, this means to **not** feed code into LLMs. +For the purposes of this policy, basic deterministic/static development tools (such as clang-tidy, git, compilers, etc.) are not considered AI tools. -AI models may have also ingested AGPLv3 code, which is license-incompatible with our codebase. +Terms such as "substantially", "large-scale", "majority", and "low-quality" are intentionally left vague, and will be interpreted at the maintainers' discretion. When in doubt, ask first. -## Vibe-coding +## Scope -Just don't. If you're not going to put the effort in to understand every line of code you wrote, neither will we, and your patch or pull request will be ignored. +This policy applies to all code contributions, alongside issues and pull requests surrounding this codebase. This includes: -## Commit messages +- Commit messages +- PR descriptions +- Code review comments +- Issue/PR comments +- Patches submitted via e-mail -AI-generated commit messages are absolutely terrible, and your pull request or patch will immediately be rejected if you choose to do this. They are, quite simply, actively detrimental to our understanding of your changes, and if you're not willing to summarize the intent behind your changes, then we're not going to bother reading the code you wrote. +Areas that are not directly related to code--such as our surrounding communities--are not covered by the terms of this policy. Additionally, spelling/grammar checking via AI or LLM-based tools is not covered under this document. -Write concise, simple, and descriptive commit messages that actually convey the proper intent behind what your change is trying to do. +## Introduction -See the [Addendum](#addendum-commit-messages) for an instance of how bad AI models are at commit messages. +In the right hands, AI and LLM-based tools are incredibly useful for getting features and bugfixes out the door as fast as possible. At the same time, reviewer bandwidth is a scarce resource. We are therefore open to AI-assisted contributions, provided they are produced and disclosed properly. -## Miscellaneous concerns +The goal of this document is *not* to set arbitrary restrictions, but rather to keep our development healthy and stable, while still allowing contributors to use the tools they find helpful. A contribution must be worth more to the project than the time it takes to review it. -- While many environmental concerns about AI are typically blown out of proportion, it *is* a legitimate issue, and should be taken into account. -- Many people have significant concerns over the ethics of AI usage due to inhumane and predatory behavior by large AI companies, particularly Anthropic and OpenAI. This can technically be avoided through the usage of local LLMs. -- LLMs have a tendency to add unicode characters (such as the arrow → and the em-dash — symbols) to their output, which can make viewing code or documents harder on command-line editors and viewers. -- Dedicated coding models--namely Claude--also like to add a lot of comments to overexplain every individual line of code it produces. This actually makes it *harder* to understand the code! +Throughout this document, **must** and **must not** are inflexible, binding requirements. Refusal to follow these is treated as a violation of the terms outlined in this document. -## Unacceptable Use Examples +## Requirements -Here are a few examples of unacceptable use: +These apply to all contributions, whether AI-assisted or not. AI-assisted contributions also carry additional disclosure requirements as outlined in [Disclosure](#disclosure). -- Solving problems - - Slapping a few files and a "please fix bug XYZ" into an LLM is a recipe for disaster that will pretty much never work. -- Fully AI-generated code, aka "vibecoding" -- Writing code based on pseudo-instructions - - If you don't know how to write code, don't. If you've figured out the root cause (preferably without feeding random files into an LLM) and actively know what's going on, provide information to other developers or friends of yours who have knowledge of the language and/or the codebase. +1. *Disclosure*. Any and all usage of AI or LLM-based tools within any contribution **must** be explicitly marked and disclosed as appropriate. +2. *Responsibility*. The human submitter of any contribution is held wholly responsible for the accuracy, completeness, and intent of what is submitted. You **must** be able to explain, defend, and revise your code during review. +3. *Review*. All code **must** be thoroughly reviewed by the author before opening a PR or marking it ready for review. +4. *Testing*. All code changes **must** be tested directly by the human author. +5. *Quality*. All submitted code is held to a strict standard of excellence. Low-quality AI-generated content does not uphold this standard. +6. *Licensing*. All code **must** be compatible with the GPLv3 or later. You **must** warrant that you have the right to submit it under those terms, and that it was not copied from work published under an incompatible license. -## Addendum: Commit Messages +## Sign-off, Authorship, and Copyright -The patchset for pull request [#3422](https://git.eden-emu.dev/eden-emu/eden/pulls/3422) was fed into several LLMs to generate a commit message. One LLM produced the following: +AI agents **must not** add `Signed-off-by:` tags. The human submitter **must** sign off on all changes. + +Similarly, AI agents cannot hold authorship or copyright over code, and **must not** add `Co-authored-by:` or `Co-developed-by:` tags. The human submitter **must** author all changes. + +## Permitted Usage + +This is a non-exhaustive list of permitted uses of AI and LLM-based tools, provided they are disclosed properly. + +- Drafting issues and pull requests, provided the final text and submitted code are substantially your own. +- Debugging issues, bugs, glitches, and crashes, whether pre-existing or introduced by your own changes. +- Reviewing your own changes before submitting a PR. +- Research, brainstorming, and codebase searching/understanding. +- Applying tedious but not particularly large changes, such as mass-migrating specific classes to polyfills or abstractions. + +## Recommended Prior Discussion + +Some usage cases are not necessarily forbidden nor permitted. These should be discussed with maintainers in an issue or e-mail *before* submission. Maintainers and reviewers may also comment on this during the review/submission phase. + +- Generating boilerplate/scaffolding for new code. +- Writing unit tests. +- Large-scale refactors primarily driven by an AI agent. +- Any contribution where an AI agent or model was responsible for the majority of the implementation. + +## Forbidden Usage + +This is a non-exhaustive list of strictly forbidden uses of AI and LLM-based tools. + +- Vibecoding, or changes entirely authored by AI agents without human intervention or understanding. + - If you don't choose to put in the necessary effort to understand every line of code you submitted, neither will we. +- Fully AI-generated commit messages, PR descriptions, issues, or comments. See [Addendum: AI Commit Messages](#addendum-ai-commit-messages). +- Submission of AI-assisted work that is not disclosed per the [Disclosure](#disclosure) requirements. +- Low-quality submissions that fail to satisfy our standard of code excellence. +- Submitting secrets, credentials, private user data, or unpublished security reports to third-party AI services. + - This includes console keys, encryption material, and private vulnerability disclosures. +- Verbatim AI code reviews (e.g. Codex/Copilot reviews). + +## Human Effort Denial of Service + +Using automated tools and AI to submit PRs, issues, and comments that we have to carefully review and handle is considered a [Denial-of-service attack](https://en.wikipedia.org/wiki/Denial-of-service_attack) on our human effort. + +It takes very little effort on your side (an LLM prompt) to generate a large amount of effort on ours (careful and thorough code review). Please respect our time and don't do that. + +## Disclosure + +How you disclose AI usage is up to you. However, it **must** be explicit, easy to identify, and placed both within the commit message *and* the surrounding PR description. For patches submitted by e-mail, the cover letter counts as the PR description. We recommend an `Assisted-by:` footer: + +```txt +Assisted-by: () +``` + +For instance: + +```txt +Assisted-by: Claude Opus 5.5 (initial draft and code review) +``` + +Contributions without a commit message (e.g. issues/comments) should instead use a plain sentence in the text body such as `I used to help with `. PRs and commit messages may opt to use this format as well. + +Multi-commit series/squashes **must** maintain the trailer. Maintainers will handle this for merges to master, but you are responsible for ensuring the disclosure survives into the final commit/PR body of squashes within your branches. + +Regardless, what matters is that reviewers can tell *at a glance* where and how AI was involved in your contribution. + +## Codebase Ingestion + +Ingestion of this codebase by LLMs for any purpose--such as training or prompt context--is permitted *for now*. This may change at any point as litigation and court rulings around AI and code copyright proceed. + +AI models may have ingested AGPLv3 or otherwise copyleft-incompatible code and may regurgitate it. You remain responsible for ensuring that all code you submit is compatible with the GPLv3 or later. + +## Enforcement + +- If we suspect undisclosed AI usage in a contribution, we will ask for disclosure. +- Refusal to provide disclosure will result in rejection of the contribution, and your PR or issue will be closed. Maintainers may choose to rework it themselves if the change is worth having. +- Accounts that spam us with repeated automated PRs or comments will be blocked or permanently suspended from our Git instance. +- Maintainers reserve the right to close your issues and pull requests if you don't follow the guidelines and procedures outlined in this document, and refuse or fail to make changes as necessary to comply. +- Repeated failures to comply may result in loss of contribution privileges. + +## Addendum: AI Commit Messages + +The patchset for pull request [#3422](https://git.eden-emu.dev/eden-emu/eden/pulls/3422) was fed into a dedicated code AI model, and it produced the following: ```txt profile_manager: Refactor user deletion to use index instead of UUID @@ -89,28 +183,21 @@ These changes eliminate redundant code, reduce the risk of UUID → index mismat Fixes: potential inconsistency when user order changes between UI and backend ``` -This is: +This: -- Needlessly verbose (nobody cares about most of these details) +- Is needlessly verbose (nobody cares about most of these details) - Doesn't address the actual purpose of the PR (fixing a double-deletion bug in the profile manager) - Has unicode arrows (this is bad for command-line editors) -- Uses corporate and word-salad language +- Uses corporate and word-salad language that pads out the message to make it look like a lot changed -Another (code-oriented) LLM output the following: +A good commit message should be concise, descriptive, and convey the *intent* behind the change, such as the bug being fixed or the feature being added. It should *not* be a detailed changelog of every individual byte that's changed. -```txt -profile(manager/ui): switch to index-based deletion and unify removal logic +## References -- Make ConfigureProfileManagerDeleteDialog emit a deleteUser(int) signal instead of taking a callback. Store the target index in the dialog (m_index) and emit it on acceptance. -- Change ConfigureProfileManager to pass an index to SetInfo and to accept an index in DeleteUser. Wire the dialog signal to the new DeleteUser slot. -- Update headers: add the signal and m_index, add TODO to move dialog to a .ui file, and update slot/signature declarations. -- Add ProfileManager::RemoveProfileAtIndex(std::size_t) and refactor RemoveUser(UUID) to call RemoveProfileAtIndex to avoid duplicated removal logic. Ensure the removal path marks saves as needed and writes the user save file. -- Ensure the profile list updates immediately after deletes by calling profile_manager.ResetUserSaveFile() when populating the user list (qlaunch fix). -- Misc: update SPDX copyright year and fix build breakages caused by the API changes. +This policy document has been adapted from the AI policies of numerous other free and open-source projects, whether restrictive or permissive. -This consolidates profile removal behavior, fixes potential race conditions in the profile dialog, and removes duplicated removal code. -``` - -This has all of the same problems as the other one. Needlessly verbose, doesn't address *what* it actually fixes ("consolidates profile removal behavior"... okay, why? What does it fix?), etc. It even has the bonus of totally hallucinating the addition of a method! - -On a more "philosophical" note, LLMs tend to be geared towards *corporate language*, as that's what they're trained on. This is why AI-generated commit messages feel like "word salad", and typically pad out the commit message to make it *look* like a lot of things were changed (trust me, it's like that in the corporate world). They typically also drift towards unneeded buzzwords and useless implementation details. +- [Gitea](https://github.com/go-gitea/gitea/blob/main/CONTRIBUTING.md#ai-contribution-policy) +- The [Linux kernel](https://kernel.org/doc/html/next/process/coding-assistants.html) +- [Gentoo Linux](https://wiki.gentoo.org/wiki/Project:Council/AI_policy) +- [cURL](https://curl.se/dev/contribute.html#on-ai-use-in-curl) +- [FastAPI](https://tiangolo.com/open-source/contributing/#automated-code-and-ai) From a594c8d60ef79280adc046760561912207e16e17 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Wed, 14 Oct 2026 00:04:16 +0200 Subject: [PATCH 107/128] [shader_recompiler, vulkan, qcom, tu] Provide handling to missing shader subgroups on QCOM (#4508) This works provides better emulation on certain GS missing for shader invocation data + geometry pass fallback in qcom/turnip drivers, some of those were provided as community patch by @a.kamaltdinov; which was refined to address the requirements on forced gpu reads; which used to kill some performance on low end devices; now, the stability with some of the graphical problems have been addressed and balanced. Shuffle shaders (SHFFL) are not actually provided on QCOM and turnip drivers, so any game that previously required this stage draw, will now avoid being ignored and tax some performance based on the complexity of the stage draw from now on. This will also address partially some tessellation problems as well. _Special Thanks:_ 1.- @a.kamaltdinov (for the initial patch "early fix for nier" provided for #4325) 2.- @PavelBARABANOV (because the making the cherry-pick easier for a new PR) Co-authored-by: PavelBARABANOV Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4508 Reviewed-by: lizzie Reviewed-by: crueter --- src/shader_recompiler/CMakeLists.txt | 1 + .../backend/spirv/emit_spirv.cpp | 33 ++++- .../backend/spirv/emit_spirv_warp.cpp | 127 ++++++++++++----- .../backend/spirv/spirv_emit_context.h | 1 + .../frontend/maxwell/translate_program.cpp | 110 ++++++++++++++- src/shader_recompiler/host_translate_info.h | 2 + .../ir_opt/constant_propagation_pass.cpp | 48 +++++-- .../ir_opt/geometry_compaction_pass.cpp | 129 ++++++++++++++++++ src/shader_recompiler/ir_opt/passes.h | 1 + src/shader_recompiler/profile.h | 3 + .../renderer_vulkan/vk_pipeline_cache.cpp | 17 ++- src/video_core/vulkan_common/vulkan_device.h | 5 + 12 files changed, 417 insertions(+), 60 deletions(-) create mode 100644 src/shader_recompiler/ir_opt/geometry_compaction_pass.cpp diff --git a/src/shader_recompiler/CMakeLists.txt b/src/shader_recompiler/CMakeLists.txt index 957ed5fb55..cc9ce95d92 100644 --- a/src/shader_recompiler/CMakeLists.txt +++ b/src/shader_recompiler/CMakeLists.txt @@ -172,6 +172,7 @@ add_library(shader_recompiler STATIC ir_opt/constant_propagation_pass.cpp ir_opt/dead_code_elimination_pass.cpp ir_opt/dual_vertex_pass.cpp + ir_opt/geometry_compaction_pass.cpp ir_opt/global_memory_to_storage_buffer_pass.cpp ir_opt/identity_removal_pass.cpp ir_opt/layer_pass.cpp diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp index c221888c09..a903480c78 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp @@ -4,6 +4,7 @@ // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include #include #include @@ -439,10 +440,13 @@ void SetupCapabilities(const Profile& profile, const Info& info, EmitContext& ct ctx.AddCapability(spv::Capability::DrawParameters); } if ((info.uses_subgroup_vote || info.uses_subgroup_invocation_id || - info.uses_subgroup_shuffles) && + info.uses_subgroup_shuffles || info.uses_subgroup_mask) && profile.support_vote && profile.SupportsSubgroupStage(ctx.stage)) { ctx.AddCapability(spv::Capability::GroupNonUniformBallot); ctx.AddCapability(spv::Capability::GroupNonUniformShuffle); + if (info.uses_subgroup_shuffles && profile.support_shuffle_relative) { + ctx.AddCapability(spv::Capability::GroupNonUniformShuffleRelative); + } if (!profile.warp_size_potentially_larger_than_guest) { // vote ops are only used when not taking the long path ctx.AddCapability(spv::Capability::GroupNonUniformVote); @@ -521,6 +525,29 @@ void PatchPhiNodes(IR::Program& program, EmitContext& ctx) { return { ctx.Def(phi->Arg(phi_arg)), parent }; }); } + +void RewriteOpcodes(std::vector& code, std::span> rewrites) { + if (rewrites.empty()) { + return; + } + size_t offset = 5; + while (offset + 2 < code.size()) { + const u32 word_count{code[offset] >> 16}; + const auto opcode{static_cast(code[offset] & 0xFFFFu)}; + if (word_count == 0) { + return; + } + if (opcode == spv::Op::OpGroupNonUniformShuffleXor || + opcode == spv::Op::OpGroupNonUniformQuadBroadcast) { + const auto it{std::ranges::find(rewrites, code[offset + 2], + &std::pair::first)}; + if (it != rewrites.end()) { + code[offset] = (code[offset] & 0xFFFF0000u) | static_cast(it->second); + } + } + offset += word_count; + } +} } // Anonymous namespace std::vector EmitSPIRV(const Profile& profile, const RuntimeInfo& runtime_info, IR::Program& program, Bindings& bindings) { @@ -535,7 +562,9 @@ std::vector EmitSPIRV(const Profile& profile, const RuntimeInfo& runtime_in SetupCapabilities(profile, program.info, ctx); SetupTransformFeedbackCapabilities(ctx, main); PatchPhiNodes(program, ctx); - return ctx.Assemble(); + std::vector code{ctx.Assemble()}; + RewriteOpcodes(code, ctx.opcode_rewrites); + return code; } Id EmitPhi(EmitContext& ctx, IR::Inst* inst) { diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp index ffd5d9c29f..8d83509961 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp @@ -77,20 +77,57 @@ Id GetMaxThreadId(EmitContext& ctx, Id thread_id, Id clamp, Id segmentation_mask return ComputeMaxThreadId(ctx, min_thread_id, clamp, not_seg_mask); } -Id SelectValue(EmitContext& ctx, Id in_range, Id value, Id src_thread_id) { - if (!StageSupportsSubgroups(ctx)) { - return value; +Id HostThreadId(EmitContext& ctx, Id thread_id) { + if (!ctx.profile.warp_size_potentially_larger_than_guest) { + return thread_id; } - return ctx.OpSelect( - ctx.U32[1], in_range, - ctx.OpGroupNonUniformShuffle(ctx.U32[1], SubgroupScope(ctx), value, src_thread_id), value); -} - -Id AddPartitionBase(EmitContext& ctx, Id thread_id) { const Id partition_idx{ctx.OpShiftRightLogical(ctx.U32[1], GetThreadId(ctx), ctx.Const(5u))}; const Id partition_base{ctx.OpShiftLeftLogical(ctx.U32[1], partition_idx, ctx.Const(5u))}; return ctx.OpIAdd(ctx.U32[1], thread_id, partition_base); } + +Id GuestLane(EmitContext& ctx, Id index) { + return ctx.OpBitwiseAnd(ctx.U32[1], index, ctx.Const(31U)); +} + +Id ShuffleAbsolute(EmitContext& ctx, Id value, Id src_thread_id) { + if (!ctx.profile.has_broken_spirv_subgroup_shuffle) { + return ctx.OpGroupNonUniformShuffle(ctx.U32[1], SubgroupScope(ctx), value, src_thread_id); + } + Id result{ctx.u32_zero_value}; + for (u32 lane = 0; lane < ctx.profile.max_subgroup_size; ++lane) { + const Id read{ + ctx.OpGroupNonUniformBroadcast(ctx.U32[1], SubgroupScope(ctx), value, ctx.Const(lane))}; + const Id matches{ctx.OpIEqual(ctx.U1, src_thread_id, ctx.Const(lane))}; + result = ctx.OpSelect(ctx.U32[1], matches, read, result); + } + return result; +} + +Id ShuffleRelative(EmitContext& ctx, Id value, Id delta, Id src_thread_id, spv::Op op) { + if (!ctx.profile.support_shuffle_relative) { + return ShuffleAbsolute(ctx, value, HostThreadId(ctx, src_thread_id)); + } + const Id result{ctx.OpGroupNonUniformShuffleXor(ctx.U32[1], SubgroupScope(ctx), value, delta)}; + ctx.opcode_rewrites.emplace_back(result.value, op); + return result; +} + +Id BroadcastLane(EmitContext& ctx, Id value, u32 lane) { + Id result{ + ctx.OpGroupNonUniformBroadcast(ctx.U32[1], SubgroupScope(ctx), value, ctx.Const(lane))}; + if (!ctx.profile.warp_size_potentially_larger_than_guest) { + return result; + } + const Id partition_idx{ctx.OpShiftRightLogical(ctx.U32[1], GetThreadId(ctx), ctx.Const(5u))}; + for (u32 base = 32; base < ctx.profile.max_subgroup_size; base += 32) { + const Id read{ctx.OpGroupNonUniformBroadcast(ctx.U32[1], SubgroupScope(ctx), value, + ctx.Const(base + lane))}; + const Id matches{ctx.OpIEqual(ctx.U1, partition_idx, ctx.Const(base >> 5))}; + result = ctx.OpSelect(ctx.U32[1], matches, read, result); + } + return result; +} } // Anonymous namespace Id EmitLaneId(EmitContext& ctx) { @@ -203,61 +240,75 @@ Id EmitShuffleIndex(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id cla const Id min_thread_id{ComputeMinThreadId(ctx, thread_id, segmentation_mask)}; const Id max_thread_id{ComputeMaxThreadId(ctx, min_thread_id, clamp, not_seg_mask)}; - const Id lhs{ctx.OpBitwiseAnd(ctx.U32[1], index, not_seg_mask)}; - Id src_thread_id{ctx.OpBitwiseOr(ctx.U32[1], lhs, min_thread_id)}; + const Id lhs{ctx.OpBitwiseAnd(ctx.U32[1], GuestLane(ctx, index), not_seg_mask)}; + const Id src_thread_id{ctx.OpBitwiseOr(ctx.U32[1], lhs, min_thread_id)}; const Id in_range{ctx.OpSLessThanEqual(ctx.U1, src_thread_id, max_thread_id)}; - if (ctx.profile.warp_size_potentially_larger_than_guest) { - src_thread_id = AddPartitionBase(ctx, src_thread_id); - } - SetInBoundsFlag(inst, in_range); - return SelectValue(ctx, in_range, value, src_thread_id); + if (!StageSupportsSubgroups(ctx)) { + return value; + } + const IR::Value lane{inst->Arg(1).Resolve()}; + const IR::Value segment{inst->Arg(3).Resolve()}; + if (lane.IsImmediate() && segment.IsImmediate() && segment.U32() == 0) { + return ctx.OpSelect(ctx.U32[1], in_range, BroadcastLane(ctx, value, lane.U32() & 31), + value); + } + const Id shuffled{ShuffleAbsolute(ctx, value, HostThreadId(ctx, src_thread_id))}; + return ctx.OpSelect(ctx.U32[1], in_range, shuffled, value); } Id EmitShuffleUp(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp, Id segmentation_mask) { + if (!StageSupportsSubgroups(ctx)) { + SetInBoundsFlag(inst, ctx.false_value); + return value; + } + const Id delta{GuestLane(ctx, index)}; const Id thread_id{EmitLaneId(ctx)}; const Id max_thread_id{GetMaxThreadId(ctx, thread_id, clamp, segmentation_mask)}; - Id src_thread_id{ctx.OpISub(ctx.U32[1], thread_id, index)}; + const Id src_thread_id{ctx.OpISub(ctx.U32[1], thread_id, delta)}; const Id in_range{ctx.OpSGreaterThanEqual(ctx.U1, src_thread_id, max_thread_id)}; - if (ctx.profile.warp_size_potentially_larger_than_guest) { - src_thread_id = AddPartitionBase(ctx, src_thread_id); - } - SetInBoundsFlag(inst, in_range); - return SelectValue(ctx, in_range, value, src_thread_id); + const Id shuffled{ShuffleRelative(ctx, value, delta, src_thread_id, + spv::Op::OpGroupNonUniformShuffleUp)}; + return ctx.OpSelect(ctx.U32[1], in_range, shuffled, value); } Id EmitShuffleDown(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp, Id segmentation_mask) { + if (!StageSupportsSubgroups(ctx)) { + SetInBoundsFlag(inst, ctx.false_value); + return value; + } + const Id delta{GuestLane(ctx, index)}; const Id thread_id{EmitLaneId(ctx)}; const Id max_thread_id{GetMaxThreadId(ctx, thread_id, clamp, segmentation_mask)}; - Id src_thread_id{ctx.OpIAdd(ctx.U32[1], thread_id, index)}; + const Id src_thread_id{ctx.OpIAdd(ctx.U32[1], thread_id, delta)}; const Id in_range{ctx.OpSLessThanEqual(ctx.U1, src_thread_id, max_thread_id)}; - if (ctx.profile.warp_size_potentially_larger_than_guest) { - src_thread_id = AddPartitionBase(ctx, src_thread_id); - } - SetInBoundsFlag(inst, in_range); - return SelectValue(ctx, in_range, value, src_thread_id); + const Id shuffled{ShuffleRelative(ctx, value, delta, src_thread_id, + spv::Op::OpGroupNonUniformShuffleDown)}; + return ctx.OpSelect(ctx.U32[1], in_range, shuffled, value); } Id EmitShuffleButterfly(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp, Id segmentation_mask) { + if (!StageSupportsSubgroups(ctx)) { + SetInBoundsFlag(inst, ctx.false_value); + return value; + } + const Id mask{GuestLane(ctx, index)}; const Id thread_id{EmitLaneId(ctx)}; const Id max_thread_id{GetMaxThreadId(ctx, thread_id, clamp, segmentation_mask)}; - Id src_thread_id{ctx.OpBitwiseXor(ctx.U32[1], thread_id, index)}; + const Id src_thread_id{ctx.OpBitwiseXor(ctx.U32[1], thread_id, mask)}; const Id in_range{ctx.OpSLessThanEqual(ctx.U1, src_thread_id, max_thread_id)}; - if (ctx.profile.warp_size_potentially_larger_than_guest) { - src_thread_id = AddPartitionBase(ctx, src_thread_id); - } - SetInBoundsFlag(inst, in_range); - return SelectValue(ctx, in_range, value, src_thread_id); + const Id shuffled{ctx.OpGroupNonUniformShuffleXor(ctx.U32[1], SubgroupScope(ctx), value, mask)}; + return ctx.OpSelect(ctx.U32[1], in_range, shuffled, value); } Id EmitQuadBroadcast(EmitContext& ctx, Id value, Id lane) { @@ -267,10 +318,16 @@ Id EmitQuadBroadcast(EmitContext& ctx, Id value, Id lane) { const Id base{ctx.OpBitwiseAnd(ctx.U32[1], GetThreadId(ctx), ctx.Const(~3u))}; const Id local_lane{ctx.OpBitwiseAnd(ctx.U32[1], lane, ctx.Const(3u))}; const Id src_thread_id{ctx.OpBitwiseOr(ctx.U32[1], base, local_lane)}; - return ctx.OpGroupNonUniformShuffle(ctx.U32[1], SubgroupScope(ctx), value, src_thread_id); + return ShuffleAbsolute(ctx, value, src_thread_id); } Id EmitQuadSwap(EmitContext& ctx, Id value, Id direction) { + if (ctx.profile.support_quad_shuffles) { + const Id result{ + ctx.OpGroupNonUniformQuadBroadcast(ctx.U32[1], SubgroupScope(ctx), value, direction)}; + ctx.opcode_rewrites.emplace_back(result.value, spv::Op::OpGroupNonUniformQuadSwap); + return result; + } const Id xor_mask{ctx.OpIAdd(ctx.U32[1], direction, ctx.Const(1u))}; return ctx.OpGroupNonUniformShuffleXor(ctx.U32[1], SubgroupScope(ctx), value, xor_mask); } diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index 7edc104708..a5821e9e93 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -361,6 +361,7 @@ public: Id frag_depth{}; std::vector interfaces; + std::vector> opcode_rewrites; Id load_const_func_u8{}; Id load_const_func_u16{}; diff --git a/src/shader_recompiler/frontend/maxwell/translate_program.cpp b/src/shader_recompiler/frontend/maxwell/translate_program.cpp index 1b2ec5502d..0cc4b3b844 100644 --- a/src/shader_recompiler/frontend/maxwell/translate_program.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate_program.cpp @@ -5,7 +5,10 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include +#include #include +#include #include #include @@ -172,7 +175,17 @@ std::map GenerateLegacyToGenericMappings( void EmitGeometryPassthrough(IR::IREmitter& ir, const IR::Program& program, const Shader::VaryingState& passthrough_mask, bool passthrough_position, - std::optional passthrough_layer_attr) { + std::optional passthrough_layer_attr, + std::optional viewport_mask_reg) { + constexpr std::array CULLED_POSITION{2.0f, 2.0f, 2.0f, 1.0f}; + IR::U1 culled{ir.Imm1(false)}; + IR::U32 viewport{ir.Imm32(0)}; + if (viewport_mask_reg) { + const IR::U32 mask{ir.GetReg(*viewport_mask_reg)}; + const IR::U32 lowest_bit{ir.BitwiseAnd(mask, IR::U32{ir.INeg(mask)})}; + culled = ir.IEqual(mask, ir.Imm32(0)); + viewport = IR::U32{ir.Select(culled, ir.Imm32(0), ir.FindUMsb(lowest_bit))}; + } for (u32 i = 0; i < program.output_vertices; i++) { // Assign generics from input for (u32 j = 0; j < 32; j++) { @@ -190,10 +203,19 @@ void EmitGeometryPassthrough(IR::IREmitter& ir, const IR::Program& program, if (passthrough_position) { // Assign position from input const IR::Attribute attr = IR::Attribute::PositionX; - ir.SetAttribute(attr + 0, ir.GetAttribute(attr + 0, ir.Imm32(i)), ir.Imm32(0)); - ir.SetAttribute(attr + 1, ir.GetAttribute(attr + 1, ir.Imm32(i)), ir.Imm32(0)); - ir.SetAttribute(attr + 2, ir.GetAttribute(attr + 2, ir.Imm32(i)), ir.Imm32(0)); - ir.SetAttribute(attr + 3, ir.GetAttribute(attr + 3, ir.Imm32(i)), ir.Imm32(0)); + for (u32 component = 0; component < 4; ++component) { + IR::F32 value{ir.GetAttribute(attr + component, ir.Imm32(i))}; + if (viewport_mask_reg) { + value = IR::F32{ + ir.Select(culled, ir.Imm32(CULLED_POSITION[component]), value)}; + } + ir.SetAttribute(attr + component, value, ir.Imm32(0)); + } + } + + if (viewport_mask_reg) { + ir.SetAttribute(IR::Attribute::ViewportIndex, ir.BitCast(viewport), + ir.Imm32(0)); } if (passthrough_layer_attr) { @@ -219,19 +241,91 @@ u32 GetOutputTopologyVertices(OutputTopology output_topology) { } } +std::optional FindFreeRegister(const IR::Program& program) { + std::bitset used; + for (IR::Block* const block : program.blocks) { + for (const IR::Inst& inst : block->Instructions()) { + const IR::Opcode opcode{inst.GetOpcode()}; + if (opcode == IR::Opcode::GetRegister || opcode == IR::Opcode::SetRegister) { + used.set(IR::RegIndex(inst.Arg(0).Reg())); + } + } + } + for (size_t index = IR::NUM_USER_REGS; index-- > 0;) { + if (!used.test(index)) { + return static_cast(index); + } + } + return std::nullopt; +} + +std::optional LowerViewportMask(const IR::Program& program) { + const std::optional reg{FindFreeRegister(program)}; + if (!reg || program.blocks.empty()) { + return std::nullopt; + } + bool stores_mask{}; + for (IR::Block* const block : program.blocks) { + for (IR::Inst& inst : block->Instructions()) { + if (inst.GetOpcode() != IR::Opcode::SetAttribute || + inst.Arg(0).Attribute() != IR::Attribute::ViewportMask) { + continue; + } + IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; + ir.SetReg(*reg, ir.BitCast(IR::F32{inst.Arg(1)})); + inst.Invalidate(); + stores_mask = true; + } + } + if (!stores_mask) { + return std::nullopt; + } + IR::Block& entry{*program.blocks.front()}; + IR::IREmitter ir{entry, entry.begin()}; + ir.SetReg(*reg, ir.Imm32(1)); + return reg; +} + void LowerGeometryPassthrough(const IR::Program& program, const HostTranslateInfo& host_info) { + std::optional viewport_mask_reg; + if (!host_info.support_viewport_mask) { + viewport_mask_reg = LowerViewportMask(program); + } for (IR::Block* const block : program.blocks) { for (IR::Inst& inst : block->Instructions()) { if (inst.GetOpcode() == IR::Opcode::Epilogue) { IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; EmitGeometryPassthrough( ir, program, program.info.passthrough, - program.info.passthrough.AnyComponent(IR::Attribute::PositionX), {}); + program.info.passthrough.AnyComponent(IR::Attribute::PositionX), {}, + viewport_mask_reg); } } } } +void TightenOutputVertices(IR::Program& program) { + if (program.stage != Stage::Geometry || program.is_geometry_passthrough) { + return; + } + const bool has_loops = std::ranges::any_of(program.syntax_list, [](const auto& node) { + return node.type == IR::AbstractSyntaxNode::Type::Loop; + }); + if (has_loops) { + return; + } + u32 num_emits = 0; + for (IR::Block* const block : program.blocks) { + for (const IR::Inst& inst : block->Instructions()) { + if (inst.GetOpcode() == IR::Opcode::EmitVertex) { + ++num_emits; + } + } + } + if (num_emits != 0) { + program.output_vertices = (std::min)(program.output_vertices, num_emits); + } +} } // Anonymous namespace IR::Program TranslateProgram(ObjectPool& inst_pool, ObjectPool& block_pool, @@ -299,12 +393,14 @@ IR::Program TranslateProgram(ObjectPool& inst_pool, ObjectPool& inst_pool, IR::IREmitter ir{*current_block}; EmitGeometryPassthrough(ir, program, program.info.stores, true, - source_program.info.emulated_layer); + source_program.info.emulated_layer, std::nullopt); IR::Block* return_block{block_pool.Create(inst_pool)}; IR::IREmitter{*return_block}.Epilogue(); diff --git a/src/shader_recompiler/host_translate_info.h b/src/shader_recompiler/host_translate_info.h index 93ce881c2d..44df85ccb2 100644 --- a/src/shader_recompiler/host_translate_info.h +++ b/src/shader_recompiler/host_translate_info.h @@ -34,10 +34,12 @@ struct HostTranslateInfo { bool needs_demote_reorder{}; ///< True when the device needs DemoteToHelperInvocation reordered bool support_snorm_render_buffer{}; ///< True when the device supports SNORM render buffers bool support_viewport_index_layer{}; ///< True when the device supports gl_Layer in VS + bool support_viewport_mask{}; bool support_geometry_shader_passthrough{}; ///< True when the device supports geometry ///< passthrough shaders bool support_conditional_barrier{}; ///< True when the device supports barriers in conditional ///< control flow + bool single_lane_geometry_subgroups{}; void ApplyDescriptorLimitPolicy() noexcept { if (min_ssbo_alignment == 0) { diff --git a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp index 57c08588fb..6285fef16f 100644 --- a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp +++ b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp @@ -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-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -651,6 +651,29 @@ IR::Value GetThroughCast(IR::Value value, IR::Opcode expected_cast) { return value; } +u32 QuadButterflyMask(const IR::Inst& inst) { + if (inst.GetOpcode() == IR::Opcode::QuadSwap) { + const IR::Value direction{inst.Arg(1)}; + if (!direction.IsImmediate()) { + return 0; + } + return direction.U32() + 1; + } + if (inst.GetOpcode() != IR::Opcode::ShuffleButterfly) { + return 0; + } + const IR::Value index{inst.Arg(1)}; + const IR::Value clamp{inst.Arg(2)}; + const IR::Value segmentation_mask{inst.Arg(3)}; + if (!index.IsImmediate() || !clamp.IsImmediate() || !segmentation_mask.IsImmediate()) { + return 0; + } + if (clamp.U32() != 3 || segmentation_mask.U32() != 28) { + return 0; + } + return index.U32(); +} + void FoldFSwizzleAdd(IR::Block& block, IR::Inst& inst) { const IR::Value swizzle{inst.Arg(2)}; if (!swizzle.IsImmediate()) { @@ -666,7 +689,8 @@ void FoldFSwizzleAdd(IR::Block& block, IR::Inst& inst) { return; } IR::Inst* const inst2{value_1.InstRecursive()}; - if (inst2->GetOpcode() != IR::Opcode::ShuffleButterfly) { + const u32 lane_mask{QuadButterflyMask(*inst2)}; + if (lane_mask == 0) { return; } const IR::Value value_3{GetThroughCast(inst2->Arg(0).Resolve(), IR::Opcode::BitCastU32F32)}; @@ -678,24 +702,15 @@ void FoldFSwizzleAdd(IR::Block& block, IR::Inst& inst) { return; } } - const IR::Value index{inst2->Arg(1)}; - const IR::Value clamp{inst2->Arg(2)}; - const IR::Value segmentation_mask{inst2->Arg(3)}; - if (!index.IsImmediate() || !clamp.IsImmediate() || !segmentation_mask.IsImmediate()) { - return; - } - if (clamp.U32() != 3 || segmentation_mask.U32() != 28) { - return; - } if (swizzle_value == 0x99) { // DPdxFine - if (index.U32() == 1) { + if (lane_mask == 1) { IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; inst.ReplaceUsesWith(ir.DPdxFine(IR::F32{inst.Arg(1)})); } } else if (swizzle_value == 0xA5) { // DPdyFine - if (index.U32() == 2) { + if (lane_mask == 2) { IR::IREmitter ir{block, IR::Block::InstructionList::s_iterator_to(inst)}; inst.ReplaceUsesWith(ir.DPdyFine(IR::F32{inst.Arg(1)})); } @@ -709,6 +724,13 @@ bool FindGradient3DDerivatives(std::array& results, IR::Value coor const auto check_through_shuffle = [](IR::Value input, IR::Value& result) { const IR::Value value_1{GetThroughCast(input.Resolve(), IR::Opcode::BitCastF32U32)}; IR::Inst* const inst2{value_1.InstRecursive()}; + if (inst2->GetOpcode() == IR::Opcode::QuadBroadcast) { + if (!inst2->Arg(1).Resolve().IsImmediate()) { + return false; + } + result = GetThroughCast(inst2->Arg(0).Resolve(), IR::Opcode::BitCastU32F32); + return true; + } if (inst2->GetOpcode() != IR::Opcode::ShuffleIndex) { return false; } diff --git a/src/shader_recompiler/ir_opt/geometry_compaction_pass.cpp b/src/shader_recompiler/ir_opt/geometry_compaction_pass.cpp new file mode 100644 index 0000000000..98cfa47401 --- /dev/null +++ b/src/shader_recompiler/ir_opt/geometry_compaction_pass.cpp @@ -0,0 +1,129 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include + +#include "shader_recompiler/frontend/ir/ir_emitter.h" +#include "shader_recompiler/host_translate_info.h" +#include "shader_recompiler/ir_opt/passes.h" + +namespace Shader::Optimization { +namespace { +constexpr int MAX_BALLOT_DEPTH = 8; + +struct SlotAtomic { + IR::Block* block; + IR::Inst* atomic; + IR::Inst* ballot; +}; + +IR::Inst* FindBallot(const IR::Value& value, int depth) { + if (depth > MAX_BALLOT_DEPTH || value.IsImmediate()) { + return nullptr; + } + IR::Inst* const inst{value.InstRecursive()}; + if (inst->GetOpcode() == IR::Opcode::SubgroupBallot) { + return inst; + } + if (inst->GetOpcode() == IR::Opcode::Phi) { + return nullptr; + } + for (size_t index = 0; index < inst->NumArgs(); ++index) { + if (IR::Inst* const ballot{FindBallot(inst->Arg(index), depth + 1)}) { + return ballot; + } + } + return nullptr; +} + +bool IsShuffle(IR::Opcode opcode) { + switch (opcode) { + case IR::Opcode::ShuffleIndex: + case IR::Opcode::ShuffleUp: + case IR::Opcode::ShuffleDown: + case IR::Opcode::ShuffleButterfly: + return true; + default: + return false; + } +} + +IR::U32 PrimitiveSlot(IR::IREmitter& ir, u32 invocations, const IR::U32& amount) { + IR::U32 key{ir.GetAttributeU32(IR::Attribute::PrimitiveId)}; + if (invocations > 1) { + key = ir.IAdd(ir.IMul(key, ir.Imm32(invocations)), ir.InvocationId()); + } + return ir.IMul(key, amount); +} + +bool MergesAtomic(const IR::Inst& phi, const IR::Block& block, const IR::Inst& atomic) { + for (size_t index = 0; index < phi.NumArgs(); ++index) { + const IR::Value arg{phi.Arg(index)}; + if (phi.PhiBlock(index) == &block && !arg.IsImmediate() && + arg.InstRecursive() == &atomic) { + return true; + } + } + return false; +} + +void RewriteMergedSlots(IR::Block& block, IR::Inst& atomic, u32 invocations) { + for (IR::Block* const successor : block.ImmSuccessors()) { + for (IR::Inst& phi : successor->Instructions()) { + if (phi.GetOpcode() != IR::Opcode::Phi || !MergesAtomic(phi, block, atomic)) { + continue; + } + for (size_t index = 0; index < phi.NumArgs(); ++index) { + const IR::Value arg{phi.Arg(index)}; + if (arg.IsImmediate() || !IsShuffle(arg.InstRecursive()->GetOpcode())) { + continue; + } + IR::IREmitter ir{*phi.PhiBlock(index)}; + const IR::U32 amount{arg.InstRecursive()->Arg(0)}; + phi.SetArg(index, PrimitiveSlot(ir, invocations, amount)); + } + } + } +} + +void RewriteAtomic(IR::Block& block, IR::Inst& atomic, u32 invocations) { + const auto insert_point{IR::Block::InstructionList::s_iterator_to(atomic)}; + IR::IREmitter ir{block, insert_point}; + const IR::U32 amount{atomic.Arg(2)}; + const IR::U32 slot{PrimitiveSlot(ir, invocations, amount)}; + block.PrependNewInst(insert_point, IR::Opcode::StorageAtomicUMax32, + {atomic.Arg(0), atomic.Arg(1), ir.IAdd(slot, amount)}); + atomic.ReplaceUsesWith(slot); +} + +void NeutralizePredicate(IR::Inst& ballot) { + const IR::Value pred{ballot.Arg(0)}; + if (!pred.IsImmediate()) { + pred.InstRecursive()->ReplaceUsesWith(IR::Value{true}); + } +} +} + +void GeometryCompactionPass(IR::Program& program, const HostTranslateInfo& host_info) { + if (program.stage != Stage::Geometry || !host_info.single_lane_geometry_subgroups) { + return; + } + boost::container::small_vector slot_atomics; + for (IR::Block* const block : program.post_order_blocks) { + for (IR::Inst& inst : block->Instructions()) { + if (inst.GetOpcode() != IR::Opcode::StorageAtomicIAdd32) { + continue; + } + if (IR::Inst* const ballot{FindBallot(inst.Arg(2), 0)}) { + slot_atomics.push_back({block, &inst, ballot}); + } + } + } + for (const SlotAtomic& slot_atomic : slot_atomics) { + RewriteMergedSlots(*slot_atomic.block, *slot_atomic.atomic, program.invocations); + RewriteAtomic(*slot_atomic.block, *slot_atomic.atomic, program.invocations); + NeutralizePredicate(*slot_atomic.ballot); + } +} + +} diff --git a/src/shader_recompiler/ir_opt/passes.h b/src/shader_recompiler/ir_opt/passes.h index 068d7fdfe8..bf325a4cd9 100644 --- a/src/shader_recompiler/ir_opt/passes.h +++ b/src/shader_recompiler/ir_opt/passes.h @@ -19,6 +19,7 @@ void CollectShaderInfoPass(Environment& env, IR::Program& program); void ConditionalBarrierPass(IR::Program& program); void ConstantPropagationPass(Environment& env, IR::Program& program); void DeadCodeEliminationPass(IR::Program& program); +void GeometryCompactionPass(IR::Program& program, const HostTranslateInfo& host_info); void GlobalMemoryToStorageBufferPass(IR::Program& program, const HostTranslateInfo& host_info); void IdentityRemovalPass(IR::Program& program); void LowerFp64ToFp32(IR::Program& program); diff --git a/src/shader_recompiler/profile.h b/src/shader_recompiler/profile.h index d2ac480ab8..8e9c83f888 100644 --- a/src/shader_recompiler/profile.h +++ b/src/shader_recompiler/profile.h @@ -40,6 +40,7 @@ struct Profile { bool support_shader_quad_control{}; bool support_quad_shuffles{}; bool support_vote{}; + bool support_shuffle_relative{}; u32 supported_subgroup_stages{0x7F}; bool support_viewport_index_layer_non_geometry{}; bool support_viewport_mask{}; @@ -102,6 +103,8 @@ struct Profile { bool ignore_nan_fp_comparisons{}; /// Some drivers have broken support for OpVectorExtractDynamic on subgroup mask inputs bool has_broken_spirv_subgroup_mask_vector_extract_dynamic{}; + bool has_broken_spirv_subgroup_shuffle{}; + u32 max_subgroup_size{}; u32 gl_max_compute_smem_size{}; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 5e057dd4cf..a85e2811a3 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -363,7 +363,7 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, const auto subgroup_stage_bit{[subgroup_stages](VkShaderStageFlags flag, Shader::Stage stage) { return (subgroup_stages & flag) != 0 ? (1u << static_cast(stage)) : 0u; }}; - const u32 supported_subgroup_stages{ + u32 supported_subgroup_stages{ subgroup_stage_bit(VK_SHADER_STAGE_VERTEX_BIT, Shader::Stage::VertexA) | subgroup_stage_bit(VK_SHADER_STAGE_VERTEX_BIT, Shader::Stage::VertexB) | subgroup_stage_bit(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, @@ -373,6 +373,9 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, subgroup_stage_bit(VK_SHADER_STAGE_GEOMETRY_BIT, Shader::Stage::Geometry) | subgroup_stage_bit(VK_SHADER_STAGE_FRAGMENT_BIT, Shader::Stage::Fragment) | subgroup_stage_bit(VK_SHADER_STAGE_COMPUTE_BIT, Shader::Stage::Compute)}; + if (driver_id == VK_DRIVER_ID_MESA_TURNIP) { + supported_subgroup_stages &= ~(1u << static_cast(Shader::Stage::Geometry)); + } profile = Shader::Profile{ .supported_spirv = device.SupportedSpirvVersion(), .unified_descriptor_binding = true, @@ -410,6 +413,8 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, .support_shader_quad_control = device.IsKhrShaderQuadControlSupported(), .support_quad_shuffles = device.IsSubgroupFeatureSupported(VK_SUBGROUP_FEATURE_QUAD_BIT), .support_vote = device.IsSubgroupFeatureSupported(VK_SUBGROUP_FEATURE_VOTE_BIT), + .support_shuffle_relative = + device.IsSubgroupFeatureSupported(VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT), .supported_subgroup_stages = supported_subgroup_stages, .support_viewport_index_layer_non_geometry = device.IsExtShaderViewportIndexLayerSupported(), @@ -445,13 +450,17 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, driver_id == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA, .has_broken_spirv_clamp = driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS, - .has_broken_spirv_position_input = driver_id == false, + .has_broken_spirv_position_input = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY, .has_broken_unsigned_image_offsets = false, .has_broken_signed_operations = false, .has_broken_fp16_float_controls = driver_id == VK_DRIVER_ID_NVIDIA_PROPRIETARY, .has_broken_fp32_denorm_flush = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY, .ignore_nan_fp_comparisons = false, - .has_broken_spirv_subgroup_mask_vector_extract_dynamic = false, + .has_broken_spirv_subgroup_mask_vector_extract_dynamic = + driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY && + device.GetDriverVersion() < VK_MAKE_VERSION(512, 672, 0), + .has_broken_spirv_subgroup_shuffle = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY, + .max_subgroup_size = device.GetMaxSubgroupSize(), .has_broken_robust = device.IsNvidia() && device.GetNvidiaArch() <= NvidiaArchitecture::Arch_Pascal, .min_ssbo_alignment = device.GetStorageBufferAlignment(), @@ -478,8 +487,10 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, driver_id == VK_DRIVER_ID_SAMSUNG_PROPRIETARY, .support_snorm_render_buffer = true, .support_viewport_index_layer = device.IsExtShaderViewportIndexLayerSupported(), + .support_viewport_mask = device.IsNvViewportArray2Supported(), .support_geometry_shader_passthrough = device.IsNvGeometryShaderPassthroughSupported(), .support_conditional_barrier = device.SupportsConditionalBarriers(), + .single_lane_geometry_subgroups = !profile.SupportsSubgroupStage(Shader::Stage::Geometry), }; host_info.ApplyDescriptorLimitPolicy(); diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 077b1c3e23..bbf3754e39 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -483,6 +483,11 @@ FN_MAX_LIMIT_LIST return properties.subgroup_properties.supportedStages; } + u32 GetMaxSubgroupSize() const { + return (std::max)(properties.subgroup_properties.subgroupSize, + properties.subgroup_size_control.maxSubgroupSize); + } + /// Returns the maximum number of push descriptors. u32 MaxPushDescriptors() const { return properties.push_descriptor.maxPushDescriptors; From fb51a1253447a2655382d3cf952c4c470a1d96c6 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Oct 2026 21:24:35 +0200 Subject: [PATCH 108/128] [input/sdl] nuke SDL_Vibration thread (#4299) Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- isn't it net faster to just...send things, serially? especially since vibration occurs so non-often... i dont think it would cause any issues TEST: if this causes ANY sort of perf regression on games when the thing vibrates WITH AN SDL CONFIGURED GAMEPAD OR WHATEVER Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4299 Reviewed-by: Maufeat Reviewed-by: CamilleLaVey --- src/input_common/drivers/sdl_driver.cpp | 41 +------------------------ src/input_common/drivers/sdl_driver.h | 7 +---- 2 files changed, 2 insertions(+), 46 deletions(-) diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index 91589063b5..c3e9a066b3 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -697,16 +697,6 @@ SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_en SDL_AddEventWatch(&SDLEventWatcher, this); initialized = true; - if (start_thread) { - vibration_thread = std::thread([this] { - Common::SetCurrentThreadName("SDL_Vibration"); - using namespace std::chrono_literals; - while (initialized) { - SendVibrations(); - std::this_thread::sleep_for(250ms); // 4 TPS - } - }); - } // Because the events for joystick connection happens before we have our event watcher added, we // can just open all the joysticks right here int joystick_count = 0; @@ -725,7 +715,6 @@ SDLDriver::~SDLDriver() { initialized = false; if (start_thread) { - vibration_thread.join(); SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMEPAD); } } @@ -805,10 +794,7 @@ Common::Input::DriverResult SDLDriver::SetVibration( .type = Common::Input::VibrationAmplificationType::Exponential, }; - vibration_queue.Push(VibrationRequest{ - .identifier = identifier, - .vibration = new_vibration, - }); + joystick->RumblePlay(new_vibration); return Common::Input::DriverResult::Success; } @@ -852,31 +838,6 @@ bool SDLDriver::IsVibrationEnabled(const PadIdentifier& identifier) { return true; } -void SDLDriver::SendVibrations() { - std::vector filtered_vibrations{}; - while (!vibration_queue.Empty()) { - VibrationRequest request; - vibration_queue.Pop(request); - const auto joystick = GetSDLJoystickByGUID(request.identifier.guid.RawString(), - static_cast(request.identifier.port)); - const auto it = std::find_if(filtered_vibrations.begin(), filtered_vibrations.end(), - [request](VibrationRequest vibration) { - return vibration.identifier == request.identifier; - }); - if (it == filtered_vibrations.end()) { - filtered_vibrations.push_back(std::move(request)); - continue; - } - *it = request; - } - - for (const auto& vibration : filtered_vibrations) { - const auto joystick = GetSDLJoystickByGUID(vibration.identifier.guid.RawString(), - static_cast(vibration.identifier.port)); - joystick->RumblePlay(vibration.vibration); - } -} - Common::ParamPackage SDLDriver::BuildAnalogParamPackageForButton(int port, const Common::UUID& guid, s32 axis, float value) const { Common::ParamPackage params{}; diff --git a/src/input_common/drivers/sdl_driver.h b/src/input_common/drivers/sdl_driver.h index 9a279e926f..e6751b6688 100644 --- a/src/input_common/drivers/sdl_driver.h +++ b/src/input_common/drivers/sdl_driver.h @@ -113,16 +113,11 @@ private: /// Returns true if the button is on the left joycon bool IsButtonOnLeftSide(Settings::NativeButton::Values button) const; - /// Queue of vibration request to controllers - Common::SPSCQueue vibration_queue; - /// Map of GUID of a list of corresponding virtual Joysticks ::Common::unordered_map>> joystick_map; std::mutex joystick_map_mutex; - bool start_thread = false; std::atomic initialized = false; - - std::thread vibration_thread; + bool start_thread; }; } // namespace InputCommon From 14da4482a4668928bad43bb67ef12f96b9c9d972 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 14 Oct 2026 21:24:58 +0200 Subject: [PATCH 109/128] [input_common/joycon] Enumerate SDL devices iff SDL signals change (#4486) As per SDL documentation this is the "desired" loop. > Enumerating the HID devices is an expensive operation, so you can call this to see if there have been any system device changes since the last call to this function. A change in the counter returned doesn't necessarily mean that anything has changed, but you can call SDL_hid_enumerate() to get an updated device list. https://wiki.libsdl.org/SDL3/SDL_hid_device_change_count Signed-off-by: lizzie - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4486 Reviewed-by: Maufeat Reviewed-by: CamilleLaVey --- src/input_common/drivers/joycon.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/input_common/drivers/joycon.cpp b/src/input_common/drivers/joycon.cpp index fb2d75e384..047e7eb6d8 100644 --- a/src/input_common/drivers/joycon.cpp +++ b/src/input_common/drivers/joycon.cpp @@ -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-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -83,20 +83,21 @@ void Joycons::ScanThread(std::stop_token stop_token) { constexpr u16 nintendo_vendor_id = 0x057e; Common::SetCurrentThreadName("JoyconScanThread"); + auto last_ret = 0u; do { - SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0); - SDL_hid_device_info* cur_dev = devs; - - while (cur_dev) { - if (IsDeviceNew(cur_dev)) { - LOG_DEBUG(Input, "Device Found,type : {:04X} {:04X}", cur_dev->vendor_id, - cur_dev->product_id); - RegisterNewDevice(cur_dev); + auto ret = SDL_hid_device_change_count(); + if (last_ret == 0u || last_ret != ret) { + last_ret = ret; + SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0); + for (auto* cur_dev = devs; cur_dev; cur_dev = cur_dev->next) { + if (IsDeviceNew(cur_dev)) { + LOG_DEBUG(Input, "Device Found,type : {:04X} {:04X}", cur_dev->vendor_id, cur_dev->product_id); + RegisterNewDevice(cur_dev); + } + cur_dev = cur_dev->next; } - cur_dev = cur_dev->next; + SDL_hid_free_enumeration(devs); } - - SDL_hid_free_enumeration(devs); } while (Common::StoppableTimedWait(stop_token, std::chrono::seconds{5})); } From e255c20db4111485d228c10478bda63aabcfdde5 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Thu, 15 Oct 2026 08:45:15 +0200 Subject: [PATCH 110/128] Revert "[hle] constexpr handler dispatch maps, introduce version gating (#4480)" (#4532) This reverts commit 218c6705d950635bc18f8458d738a1996fb592b6. - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4532 Reviewed-by: lizzie Reviewed-by: CamilleLaVey Reviewed-by: Maufeat --- docs/DesignOverview.md | 2 +- docs/{SubsystemHLE.md => HosKernel.md} | 53 +- docs/README.md | 2 +- src/core/CMakeLists.txt | 70 +- src/core/hle/service/acc/acc.cpp | 2027 ++++++++--------- src/core/hle/service/acc/acc.h | 64 + src/core/hle/service/acc/async_context.cpp | 11 + src/core/hle/service/acc/async_context.h | 10 - src/core/hle/service/acc/errors.h | 3 + src/core/hle/service/am/am.cpp | 1338 +---------- src/core/hle/service/am/am.h | 3 + src/core/hle/service/am/applet_manager.h | 2 +- .../hle/service/am/frontend/applet_cabinet.h | 3 + .../service/am/frontend/applet_controller.h | 2 +- .../hle/service/am/frontend/applet_error.h | 3 + .../hle/service/am/frontend/applet_general.h | 3 + .../hle/service/am/frontend/applet_mii_edit.h | 3 + .../am/frontend/applet_mii_edit_types.h | 3 + .../service/am/frontend/applet_net_connect.h | 2 +- .../am/frontend/applet_profile_select.cpp | 3 + .../am/frontend/applet_profile_select.h | 3 + .../frontend/applet_software_keyboard_types.h | 3 + .../service/am/frontend/applet_web_browser.h | 2 +- src/core/hle/service/am/frontend/applets.h | 2 +- src/core/hle/service/am/process_holder.cpp | 3 + src/core/hle/service/am/process_holder.h | 3 + .../all_system_applet_proxies_service.cpp | 135 ++ .../all_system_applet_proxies_service.h | 56 + .../am/service/applet_common_functions.cpp | 98 + .../am/service/applet_common_functions.h | 33 + .../am/service/application_accessor.cpp | 64 +- .../service/am/service/application_accessor.h | 1 - .../am/service/application_creator.cpp | 20 +- .../service/am/service/application_creator.h | 1 - .../am/service/application_functions.cpp | 153 +- .../am/service/application_functions.h | 1 - .../service/am/service/application_proxy.cpp | 109 + .../service/am/service/application_proxy.h | 52 + .../am/service/application_proxy_service.cpp | 47 + .../am/service/application_proxy_service.h | 36 + .../service/am/service/audio_controller.cpp | 24 +- .../hle/service/am/service/audio_controller.h | 1 - .../am/service/common_state_getter.cpp | 209 +- .../service/am/service/common_state_getter.h | 1 - .../am/service/cradle_firmware_updater.cpp | 25 +- .../am/service/cradle_firmware_updater.h | 1 - .../service/am/service/debug_functions.cpp | 46 + .../hle/service/am/service/debug_functions.h | 19 + .../service/am/service/display_controller.cpp | 68 +- .../service/am/service/display_controller.h | 1 - .../am/service/global_state_controller.cpp | 38 +- .../am/service/global_state_controller.h | 4 +- .../am/service/home_menu_functions.cpp | 42 +- .../service/am/service/home_menu_functions.h | 1 - .../am/service/library_applet_accessor.cpp | 64 +- .../am/service/library_applet_accessor.h | 22 +- .../am/service/library_applet_creator.cpp | 287 +++ .../am/service/library_applet_creator.h | 44 + .../am/service/library_applet_proxy.cpp | 137 ++ .../service/am/service/library_applet_proxy.h | 59 + .../service/library_applet_self_accessor.cpp | 332 +++ .../am/service/library_applet_self_accessor.h | 87 + .../hle/service/am/service/lock_accessor.cpp | 78 + .../hle/service/am/service/lock_accessor.h | 35 + .../am/service/overlay_applet_proxy.cpp | 120 + .../service/am/service/overlay_applet_proxy.h | 55 + .../service/am/service/overlay_functions.cpp | 52 +- .../service/am/service/overlay_functions.h | 35 +- .../am/service/process_winding_controller.cpp | 28 +- .../am/service/process_winding_controller.h | 1 - .../service/am/service/self_controller.cpp | 113 +- .../hle/service/am/service/self_controller.h | 1 - src/core/hle/service/am/service/storage.cpp | 78 +- src/core/hle/service/am/service/storage.h | 1 - .../service/am/service/storage_accessor.cpp | 71 + .../hle/service/am/service/storage_accessor.h | 41 + .../am/service/system_applet_proxy.cpp | 136 ++ .../service/am/service/system_applet_proxy.h | 58 + .../service/am/service/window_controller.cpp | 28 +- .../service/am/service/window_controller.h | 1 - .../hle/service/aoc/addon_content_manager.cpp | 57 +- .../hle/service/aoc/addon_content_manager.h | 2 +- .../service/aoc/purchase_event_manager.cpp | 27 +- .../hle/service/aoc/purchase_event_manager.h | 2 - src/core/hle/service/apm/apm.h | 3 + src/core/hle/service/apm/apm_controller.h | 3 + src/core/hle/service/apm/apm_interface.cpp | 38 +- src/core/hle/service/apm/apm_interface.h | 21 - src/core/hle/service/audio/audio.cpp | 208 +- src/core/hle/service/audio/audio.h | 3 + .../hle/service/audio/audio_controller.cpp | 139 +- src/core/hle/service/audio/audio_controller.h | 2 +- src/core/hle/service/audio/audio_device.cpp | 52 +- src/core/hle/service/audio/audio_device.h | 1 - src/core/hle/service/audio/audio_in.cpp | 50 +- src/core/hle/service/audio/audio_in.h | 1 - .../hle/service/audio/audio_in_manager.cpp | 30 +- src/core/hle/service/audio/audio_in_manager.h | 1 - src/core/hle/service/audio/audio_out.cpp | 40 +- src/core/hle/service/audio/audio_out.h | 2 - .../hle/service/audio/audio_out_manager.cpp | 20 +- .../hle/service/audio/audio_out_manager.h | 1 - src/core/hle/service/audio/audio_renderer.cpp | 51 +- src/core/hle/service/audio/audio_renderer.h | 1 - .../service/audio/audio_renderer_manager.cpp | 22 +- .../service/audio/audio_renderer_manager.h | 1 - .../audio/final_output_recorder_manager.cpp | 39 +- .../audio/final_output_recorder_manager.h | 7 - ...nal_output_recorder_manager_for_applet.cpp | 8 + ...final_output_recorder_manager_for_applet.h | 8 - .../service/audio/hardware_opus_decoder.cpp | 32 +- .../hle/service/audio/hardware_opus_decoder.h | 1 - .../audio/hardware_opus_decoder_manager.cpp | 31 +- .../audio/hardware_opus_decoder_manager.h | 1 - src/core/hle/service/bcat/bcat.h | 3 + src/core/hle/service/bcat/bcat_result.h | 3 + src/core/hle/service/bcat/bcat_service.cpp | 75 +- src/core/hle/service/bcat/bcat_service.h | 1 - .../bcat/delivery_cache_directory_service.cpp | 18 +- .../bcat/delivery_cache_directory_service.h | 1 - .../bcat/delivery_cache_file_service.cpp | 20 +- .../bcat/delivery_cache_file_service.h | 1 - .../bcat/delivery_cache_progress_service.cpp | 16 +- .../bcat/delivery_cache_progress_service.h | 1 - .../bcat/delivery_cache_storage_service.cpp | 18 +- .../bcat/delivery_cache_storage_service.h | 1 - src/core/hle/service/bcat/news/builtin_news.h | 2 +- src/core/hle/service/bcat/news/msgpack.cpp | 2 +- src/core/hle/service/bcat/news/msgpack.h | 2 +- .../bcat/news/newly_arrived_event_holder.cpp | 19 +- .../bcat/news/newly_arrived_event_holder.h | 1 - .../service/bcat/news/news_data_service.cpp | 19 +- .../hle/service/bcat/news/news_data_service.h | 1 - .../bcat/news/news_database_service.cpp | 23 +- .../service/bcat/news/news_database_service.h | 2 - .../hle/service/bcat/news/news_service.cpp | 50 +- src/core/hle/service/bcat/news/news_service.h | 9 +- .../hle/service/bcat/news/news_storage.cpp | 2 +- .../bcat/news/overwrite_event_holder.cpp | 18 +- .../bcat/news/overwrite_event_holder.h | 1 - .../hle/service/bcat/news/service_creator.cpp | 22 +- .../hle/service/bcat/news/service_creator.h | 1 - src/core/hle/service/bcat/service_creator.cpp | 26 +- src/core/hle/service/bcat/service_creator.h | 1 - src/core/hle/service/bpc/bpc.cpp | 138 +- src/core/hle/service/bpc/bpc.h | 3 + src/core/hle/service/btdrv/btdrv.cpp | 310 +-- src/core/hle/service/btdrv/btdrv.h | 3 + src/core/hle/service/btm/btm.cpp | 495 +--- src/core/hle/service/btm/btm.h | 3 + src/core/hle/service/btm/btm_debug.cpp | 40 + src/core/hle/service/btm/btm_debug.h | 24 + src/core/hle/service/btm/btm_system.cpp | 34 + src/core/hle/service/btm/btm_system.h | 28 + src/core/hle/service/btm/btm_system_core.cpp | 135 ++ src/core/hle/service/btm/btm_system_core.h | 62 + src/core/hle/service/btm/btm_user.cpp | 33 + src/core/hle/service/btm/btm_user.h | 28 + src/core/hle/service/btm/btm_user_core.cpp | 106 + src/core/hle/service/btm/btm_user_core.h | 50 + src/core/hle/service/caps/caps.cpp | 218 +- src/core/hle/service/caps/caps.h | 3 + src/core/hle/service/caps/caps_a.cpp | 211 ++ src/core/hle/service/caps/caps_a.h | 63 + src/core/hle/service/caps/caps_c.cpp | 50 +- src/core/hle/service/caps/caps_c.h | 9 +- src/core/hle/service/caps/caps_result.h | 3 + src/core/hle/service/caps/caps_sc.cpp | 26 + src/core/hle/service/caps/caps_sc.h | 26 - src/core/hle/service/caps/caps_ss.cpp | 26 +- src/core/hle/service/caps/caps_ss.h | 1 - src/core/hle/service/caps/caps_su.cpp | 22 +- src/core/hle/service/caps/caps_su.h | 2 +- src/core/hle/service/caps/caps_u.cpp | 40 +- src/core/hle/service/caps/caps_u.h | 1 - src/core/hle/service/cmif_types.h | 3 + src/core/hle/service/erpt/erpt.cpp | 64 +- src/core/hle/service/erpt/erpt.h | 3 + src/core/hle/service/es/es.cpp | 342 +-- src/core/hle/service/es/es.h | 3 + src/core/hle/service/eupld/eupld.cpp | 44 +- src/core/hle/service/eupld/eupld.h | 3 + src/core/hle/service/fatal/fatal.cpp | 31 +- src/core/hle/service/fatal/fatal.h | 3 + src/core/hle/service/fatal/fatal_p.cpp | 22 + src/core/hle/service/fatal/fatal_p.h | 19 + src/core/hle/service/fatal/fatal_u.cpp | 23 + src/core/hle/service/fatal/fatal_u.h | 19 + src/core/hle/service/fgm/fgm.cpp | 52 +- src/core/hle/service/fgm/fgm.h | 3 + .../service/filesystem/fsp/fs_i_directory.cpp | 13 +- .../service/filesystem/fsp/fs_i_directory.h | 2 - .../hle/service/filesystem/fsp/fs_i_file.cpp | 12 + .../hle/service/filesystem/fsp/fs_i_file.h | 13 - .../filesystem/fsp/fs_i_filesystem.cpp | 43 +- .../service/filesystem/fsp/fs_i_filesystem.h | 1 - .../fsp/fs_i_multi_commit_manager.cpp | 5 + .../fsp/fs_i_multi_commit_manager.h | 7 - .../fsp/fs_i_save_data_info_reader.cpp | 5 + .../fsp/fs_i_save_data_info_reader.h | 6 - .../service/filesystem/fsp/fs_i_storage.cpp | 9 + .../hle/service/filesystem/fsp/fs_i_storage.h | 15 +- .../hle/service/filesystem/fsp/fsp_ldr.cpp | 9 + src/core/hle/service/filesystem/fsp/fsp_ldr.h | 9 - .../hle/service/filesystem/fsp/fsp_pr.cpp | 10 + src/core/hle/service/filesystem/fsp/fsp_pr.h | 10 - .../hle/service/filesystem/fsp/fsp_srv.cpp | 271 +-- src/core/hle/service/filesystem/fsp/fsp_srv.h | 1 - .../hle/service/filesystem/fsp/fsp_types.h | 3 + .../fsp/save_data_transfer_prohibiter.cpp | 3 + .../fsp/save_data_transfer_prohibiter.h | 3 + .../service/filesystem/romfs_controller.cpp | 3 + .../hle/service/filesystem/romfs_controller.h | 3 + .../filesystem/save_data_controller.cpp | 2 +- .../service/filesystem/save_data_controller.h | 3 + src/core/hle/service/friend/friend.cpp | 378 ++- src/core/hle/service/friend/friend.h | 3 + .../hle/service/friend/friend_interface.cpp | 23 + .../hle/service/friend/friend_interface.h | 19 + src/core/hle/service/glue/arp.cpp | 42 +- src/core/hle/service/glue/arp.h | 23 - src/core/hle/service/glue/bgtc.cpp | 43 +- src/core/hle/service/glue/bgtc.h | 39 - src/core/hle/service/glue/ectx.cpp | 38 +- src/core/hle/service/glue/ectx.h | 26 - src/core/hle/service/glue/errors.h | 3 + src/core/hle/service/glue/glue.h | 3 + src/core/hle/service/glue/glue_manager.cpp | 3 + src/core/hle/service/glue/glue_manager.h | 3 + src/core/hle/service/glue/notif.cpp | 96 +- src/core/hle/service/glue/notif.h | 2 - src/core/hle/service/glue/time/alarm_worker.h | 3 + .../glue/time/file_timestamp_worker.cpp | 3 + .../service/glue/time/file_timestamp_worker.h | 3 + src/core/hle/service/glue/time/manager.cpp | 2 +- src/core/hle/service/glue/time/manager.h | 3 + .../glue/time/pm_state_change_handler.cpp | 3 + .../glue/time/pm_state_change_handler.h | 3 + .../time/standard_steady_clock_resource.cpp | 3 + .../time/standard_steady_clock_resource.h | 3 + src/core/hle/service/glue/time/static.cpp | 56 +- src/core/hle/service/glue/time/static.h | 3 +- src/core/hle/service/glue/time/time_zone.cpp | 40 +- src/core/hle/service/glue/time/time_zone.h | 1 - .../service/glue/time/time_zone_binary.cpp | 3 + .../hle/service/glue/time/time_zone_binary.h | 3 + src/core/hle/service/glue/time/worker.h | 3 + src/core/hle/service/gpio/gpio.cpp | 16 +- src/core/hle/service/grc/grc.cpp | 39 +- src/core/hle/service/grc/grc.h | 3 + .../hid/active_vibration_device_list.cpp | 14 +- .../hid/active_vibration_device_list.h | 2 +- src/core/hle/service/hid/applet_resource.cpp | 11 +- src/core/hle/service/hid/applet_resource.h | 1 - src/core/hle/service/hid/hid.cpp | 365 +-- src/core/hle/service/hid/hid.h | 3 + src/core/hle/service/hid/hid_debug_server.cpp | 294 +++ src/core/hle/service/hid/hid_debug_server.h | 26 + src/core/hle/service/hid/hid_server.cpp | 396 ++-- src/core/hle/service/hid/hid_server.h | 2 - .../hle/service/hid/hid_system_server.cpp | 246 ++ src/core/hle/service/hid/hid_system_server.h | 246 -- src/core/hle/service/hid/hidbus.cpp | 42 +- src/core/hle/service/hid/hidbus.h | 2 - src/core/hle/service/hid/irs.cpp | 58 +- src/core/hle/service/hid/irs.h | 12 - src/core/hle/service/hid/xcd.cpp | 27 + src/core/hle/service/hid/xcd.h | 27 - src/core/hle/service/i2c/i2c.cpp | 54 +- src/core/hle/service/jit/jit.cpp | 37 +- src/core/hle/service/jit/jit.h | 3 + src/core/hle/service/jit/jit_context.h | 3 + src/core/hle/service/lbl/lbl.cpp | 71 +- src/core/hle/service/lbl/lbl.h | 3 + src/core/hle/service/ldn/lan_discovery.cpp | 3 +- src/core/hle/service/ldn/lan_discovery.h | 3 + src/core/hle/service/ldn/ldn.cpp | 138 +- src/core/hle/service/ldn/ldn.h | 3 + src/core/hle/service/ldn/ldn_results.h | 3 + src/core/hle/service/ldn/monitor_service.cpp | 28 +- src/core/hle/service/ldn/monitor_service.h | 1 - .../hle/service/ldn/sf_monitor_service.cpp | 18 +- src/core/hle/service/ldn/sf_monitor_service.h | 1 - src/core/hle/service/ldn/sf_service.cpp | 40 + src/core/hle/service/ldn/sf_service.h | 24 + .../hle/service/ldn/sf_service_monitor.cpp | 38 +- src/core/hle/service/ldn/sf_service_monitor.h | 4 +- .../system_local_communication_service.cpp | 72 +- .../ldn/system_local_communication_service.h | 1 - .../ldn/user_local_communication_service.cpp | 73 +- .../ldn/user_local_communication_service.h | 5 +- src/core/hle/service/ldr/ldr.cpp | 53 +- src/core/hle/service/ldr/ldr.h | 3 + src/core/hle/service/lm/lm.cpp | 55 +- src/core/hle/service/lm/lm.h | 3 + src/core/hle/service/mig/mig.cpp | 84 +- src/core/hle/service/mig/mig.h | 3 + src/core/hle/service/mii/mii.cpp | 134 +- src/core/hle/service/mii/mii.h | 1 - src/core/hle/service/mii/mii_database.cpp | 2 +- src/core/hle/service/mii/mii_database.h | 3 + .../hle/service/mii/mii_database_manager.h | 3 + src/core/hle/service/mii/mii_manager.h | 3 + src/core/hle/service/mii/mii_result.h | 3 + src/core/hle/service/mii/mii_types.h | 3 + src/core/hle/service/mii/types/char_info.cpp | 3 + src/core/hle/service/mii/types/char_info.h | 3 + src/core/hle/service/mii/types/core_data.cpp | 3 + src/core/hle/service/mii/types/core_data.h | 3 + src/core/hle/service/mii/types/raw_data.h | 3 + src/core/hle/service/mii/types/store_data.cpp | 3 + src/core/hle/service/mii/types/store_data.h | 3 + .../hle/service/mii/types/ver3_store_data.cpp | 3 + .../hle/service/mii/types/ver3_store_data.h | 3 + src/core/hle/service/mm/mm_u.cpp | 27 +- src/core/hle/service/mm/mm_u.h | 3 + src/core/hle/service/mnpp/mnpp.cpp | 62 +- src/core/hle/service/ncm/ncm.cpp | 220 +- src/core/hle/service/ncm/ncm.h | 3 + src/core/hle/service/nfc/common/device.h | 3 + .../hle/service/nfc/common/device_manager.h | 3 + src/core/hle/service/nfc/mifare_result.h | 3 + src/core/hle/service/nfc/mifare_types.h | 3 + src/core/hle/service/nfc/nfc.cpp | 230 +- src/core/hle/service/nfc/nfc.h | 3 + src/core/hle/service/nfc/nfc_interface.h | 3 + src/core/hle/service/nfc/nfc_result.h | 3 + src/core/hle/service/nfc/nfc_types.h | 2 +- src/core/hle/service/nfp/nfp.cpp | 266 +-- src/core/hle/service/nfp/nfp.h | 3 + src/core/hle/service/nfp/nfp_interface.h | 3 + src/core/hle/service/nfp/nfp_result.h | 3 + src/core/hle/service/nfp/nfp_types.h | 2 +- src/core/hle/service/ngc/ngc.cpp | 160 +- src/core/hle/service/ngc/ngc.h | 3 + src/core/hle/service/nifm/nifm.cpp | 227 +- src/core/hle/service/nifm/nifm.h | 1 - src/core/hle/service/nim/nim.cpp | 681 +++--- src/core/hle/service/nim/nim.h | 3 + src/core/hle/service/npns/npns.cpp | 196 +- src/core/hle/service/npns/npns.h | 3 + .../service/ns/account_proxy_interface.cpp | 7 + .../hle/service/ns/account_proxy_interface.h | 7 - .../ns/application_manager_interface.cpp | 904 ++++---- .../ns/application_manager_interface.h | 1 - .../ns/application_version_interface.cpp | 19 + .../ns/application_version_interface.h | 19 - src/core/hle/service/ns/async_result.cpp | 18 +- src/core/hle/service/ns/async_result.h | 1 - .../ns/content_management_interface.cpp | 16 + .../service/ns/content_management_interface.h | 16 - src/core/hle/service/ns/develop_interface.cpp | 25 + src/core/hle/service/ns/develop_interface.h | 25 - .../hle/service/ns/document_interface.cpp | 9 + src/core/hle/service/ns/document_interface.h | 9 - .../service/ns/download_task_interface.cpp | 15 + .../hle/service/ns/download_task_interface.h | 15 - .../service/ns/dynamic_rights_interface.cpp | 70 +- .../hle/service/ns/dynamic_rights_interface.h | 2 - .../hle/service/ns/ecommerce_interface.cpp | 13 + src/core/hle/service/ns/ecommerce_interface.h | 13 - .../service/ns/factory_reset_interface.cpp | 26 +- .../hle/service/ns/factory_reset_interface.h | 1 - src/core/hle/service/ns/ns.cpp | 63 +- src/core/hle/service/ns/ns.h | 3 + src/core/hle/service/ns/ns_results.h | 3 + .../service/ns/platform_service_manager.cpp | 44 +- .../hle/service/ns/platform_service_manager.h | 9 +- src/core/hle/service/ns/query_service.cpp | 64 +- src/core/hle/service/ns/query_service.h | 1 - ...nly_application_control_data_interface.cpp | 48 +- ..._only_application_control_data_interface.h | 2 - ...read_only_application_record_interface.cpp | 19 +- .../read_only_application_record_interface.h | 2 - .../service/ns/service_getter_interface.cpp | 34 +- .../hle/service/ns/service_getter_interface.h | 2 - .../hle/service/ns/system_update_control.cpp | 29 + .../hle/service/ns/system_update_control.h | 29 - .../service/ns/system_update_interface.cpp | 46 +- .../hle/service/ns/system_update_interface.h | 2 +- .../nvdrv/devices/ioctl_serialization.h | 2 +- src/core/hle/service/nvdrv/devices/nvdevice.h | 3 + .../hle/service/nvdrv/devices/nvhost_gpu.cpp | 2 +- .../hle/service/nvdrv/devices/nvhost_nvdec.h | 3 + .../hle/service/nvdrv/devices/nvhost_nvjpg.h | 3 + .../hle/service/nvdrv/devices/nvhost_vic.h | 3 + src/core/hle/service/nvdrv/nvdrv.cpp | 74 +- .../hle/service/nvdrv/nvdrv_interface.cpp | 18 + src/core/hle/service/nvdrv/nvdrv_interface.h | 21 +- src/core/hle/service/nvdrv/nvmemp.cpp | 5 + src/core/hle/service/nvdrv/nvmemp.h | 8 - src/core/hle/service/nvnflinger/binder.h | 3 + src/core/hle/service/nvnflinger/buffer_item.h | 3 + .../service/nvnflinger/buffer_item_consumer.h | 3 + .../nvnflinger/buffer_queue_consumer.h | 3 + .../service/nvnflinger/buffer_queue_defs.h | 3 + .../nvnflinger/buffer_transform_flags.h | 3 + .../hle/service/nvnflinger/consumer_base.h | 3 + .../service/nvnflinger/consumer_listener.h | 3 + .../nvnflinger/graphic_buffer_producer.cpp | 3 + .../nvnflinger/graphic_buffer_producer.h | 3 + .../service/nvnflinger/hos_binder_driver.cpp | 17 +- .../service/nvnflinger/hos_binder_driver.h | 1 - .../hle/service/nvnflinger/nvnflinger.cpp | 3 + src/core/hle/service/nvnflinger/nvnflinger.h | 3 + src/core/hle/service/nvnflinger/parcel.h | 2 +- .../hle/service/nvnflinger/pixel_format.h | 3 + .../service/nvnflinger/producer_listener.h | 3 + src/core/hle/service/nvnflinger/status.h | 3 + .../service/nvnflinger/ui/graphic_buffer.cpp | 3 + .../service/nvnflinger/ui/graphic_buffer.h | 3 + src/core/hle/service/nvnflinger/window.h | 3 + .../hle/service/olsc/daemon_controller.cpp | 36 +- src/core/hle/service/olsc/daemon_controller.h | 2 - .../hle/service/olsc/native_handle_holder.cpp | 14 +- .../hle/service/olsc/native_handle_holder.h | 1 - src/core/hle/service/olsc/olsc.cpp | 173 +- src/core/hle/service/olsc/olsc.h | 3 + .../olsc/olsc_service_for_application.cpp | 56 +- .../olsc/olsc_service_for_application.h | 2 - .../olsc/olsc_service_for_system_service.cpp | 144 ++ .../olsc/olsc_service_for_system_service.h | 53 + .../olsc/remote_storage_controller.cpp | 72 +- .../service/olsc/remote_storage_controller.h | 2 - .../olsc/transfer_task_list_controller.cpp | 74 +- .../olsc/transfer_task_list_controller.h | 2 - src/core/hle/service/omm/omm.cpp | 3 + src/core/hle/service/omm/omm.h | 3 + .../service/omm/operation_mode_manager.cpp | 35 + .../hle/service/omm/operation_mode_manager.h | 35 - .../hle/service/omm/policy_manager_system.cpp | 12 + .../hle/service/omm/policy_manager_system.h | 12 - .../hle/service/omm/power_state_interface.cpp | 18 + .../hle/service/omm/power_state_interface.h | 18 - src/core/hle/service/os/multi_wait.cpp | 3 + src/core/hle/service/os/multi_wait.h | 3 + src/core/hle/service/os/multi_wait_holder.cpp | 3 + src/core/hle/service/os/multi_wait_holder.h | 3 + src/core/hle/service/os/multi_wait_utils.h | 3 + src/core/hle/service/os/mutex.h | 3 + src/core/hle/service/pcie/pcie.cpp | 90 +- src/core/hle/service/pcie/pcie.h | 3 + .../service/pctl/parental_control_service.cpp | 498 ++++ .../service/pctl/parental_control_service.h | 99 + .../pctl/parental_control_service_factory.cpp | 44 + .../pctl/parental_control_service_factory.h | 34 + src/core/hle/service/pctl/pctl.cpp | 633 +---- src/core/hle/service/pctl/pctl.h | 3 + src/core/hle/service/pctl/pctl_results.h | 18 + src/core/hle/service/pctl/pctl_types.h | 73 + src/core/hle/service/pcv/pcv.cpp | 172 +- src/core/hle/service/pcv/pcv.h | 3 + src/core/hle/service/pm/pm.cpp | 100 +- src/core/hle/service/pm/pm.h | 3 + src/core/hle/service/prepo/prepo.cpp | 91 +- src/core/hle/service/prepo/prepo.h | 3 + src/core/hle/service/psc/ovln/ovln_types.h | 2 +- src/core/hle/service/psc/ovln/receiver.cpp | 118 + src/core/hle/service/psc/ovln/receiver.h | 46 + .../hle/service/psc/ovln/receiver_service.cpp | 123 +- .../hle/service/psc/ovln/receiver_service.h | 2 - src/core/hle/service/psc/ovln/sender.cpp | 35 + src/core/hle/service/psc/ovln/sender.h | 24 + .../hle/service/psc/ovln/sender_service.cpp | 40 +- .../hle/service/psc/ovln/sender_service.h | 5 +- src/core/hle/service/psc/pm_control.cpp | 31 + src/core/hle/service/psc/pm_control.h | 19 + src/core/hle/service/psc/pm_module.cpp | 27 + src/core/hle/service/psc/pm_module.h | 19 + src/core/hle/service/psc/pm_service.cpp | 31 + src/core/hle/service/psc/pm_service.h | 25 + src/core/hle/service/psc/psc.cpp | 181 +- src/core/hle/service/psc/psc.h | 3 + src/core/hle/service/psc/time/alarms.cpp | 24 +- src/core/hle/service/psc/time/alarms.h | 21 +- .../ephemeral_network_system_clock_core.h | 3 + .../standard_local_system_clock_core.cpp | 3 + .../clocks/standard_local_system_clock_core.h | 3 + .../standard_network_system_clock_core.cpp | 3 + .../standard_network_system_clock_core.h | 3 + .../clocks/standard_steady_clock_core.cpp | 3 + .../time/clocks/standard_steady_clock_core.h | 3 + .../clocks/standard_user_system_clock_core.h | 3 + .../psc/time/clocks/steady_clock_core.h | 3 + .../psc/time/clocks/system_clock_core.cpp | 3 + .../psc/time/clocks/system_clock_core.h | 3 + .../clocks/tick_based_steady_clock_core.cpp | 3 + .../clocks/tick_based_steady_clock_core.h | 3 + src/core/hle/service/psc/time/common.cpp | 3 + src/core/hle/service/psc/time/manager.h | 28 +- .../psc/time/power_state_request_manager.h | 3 + .../service/psc/time/power_state_service.cpp | 19 +- .../service/psc/time/power_state_service.h | 1 - .../hle/service/psc/time/service_manager.cpp | 48 +- .../hle/service/psc/time/service_manager.h | 2 - .../hle/service/psc/time/shared_memory.cpp | 3 + src/core/hle/service/psc/time/static.cpp | 50 +- src/core/hle/service/psc/time/static.h | 2 - .../hle/service/psc/time/steady_clock.cpp | 28 +- src/core/hle/service/psc/time/steady_clock.h | 2 - .../hle/service/psc/time/system_clock.cpp | 24 +- src/core/hle/service/psc/time/system_clock.h | 1 - src/core/hle/service/psc/time/time_zone.cpp | 3 + src/core/hle/service/psc/time/time_zone.h | 3 + .../service/psc/time/time_zone_service.cpp | 42 +- .../hle/service/psc/time/time_zone_service.h | 1 - src/core/hle/service/ptm/psm.cpp | 53 +- src/core/hle/service/ptm/psm.h | 25 - src/core/hle/service/ptm/ptm.cpp | 32 +- src/core/hle/service/ptm/ptm.h | 3 + src/core/hle/service/ptm/ts.cpp | 29 +- src/core/hle/service/ptm/ts.h | 11 - src/core/hle/service/ro/ro.cpp | 371 +-- src/core/hle/service/ro/ro.h | 3 + src/core/hle/service/ro/ro_nro_utils.cpp | 188 ++ src/core/hle/service/ro/ro_nro_utils.h | 29 + src/core/hle/service/ro/ro_results.h | 29 + src/core/hle/service/ro/ro_types.h | 142 ++ src/core/hle/service/server_manager.h | 3 + src/core/hle/service/service.cpp | 69 +- src/core/hle/service/service.h | 145 +- src/core/hle/service/services.h | 2 +- .../service/set/factory_settings_server.cpp | 49 + .../hle/service/set/factory_settings_server.h | 49 - .../set/firmware_debug_settings_server.cpp | 17 + .../set/firmware_debug_settings_server.h | 17 - src/core/hle/service/set/key_code_map.h | 3 + .../set/setting_formats/appln_settings.cpp | 3 + .../set/setting_formats/appln_settings.h | 3 + .../set/setting_formats/device_settings.cpp | 3 + .../set/setting_formats/private_settings.cpp | 3 + .../set/setting_formats/private_settings.h | 3 + .../set/setting_formats/system_settings.cpp | 2 +- src/core/hle/service/set/settings.h | 3 + src/core/hle/service/set/settings_server.cpp | 38 +- src/core/hle/service/set/settings_server.h | 36 +- .../service/set/system_settings_server.cpp | 465 ++-- .../hle/service/set/system_settings_server.h | 2 +- src/core/hle/service/sm/sm.cpp | 205 +- src/core/hle/service/sm/sm.h | 24 +- src/core/hle/service/sm/sm_controller.cpp | 128 ++ src/core/hle/service/sm/sm_controller.h | 30 + src/core/hle/service/sockets/bsd.cpp | 81 + src/core/hle/service/sockets/bsd.h | 82 +- src/core/hle/service/sockets/nsd.cpp | 32 + src/core/hle/service/sockets/nsd.h | 32 - src/core/hle/service/sockets/sfdnsres.cpp | 27 + src/core/hle/service/sockets/sfdnsres.h | 31 - src/core/hle/service/sockets/sockets.cpp | 62 +- .../hle/service/sockets/sockets_translate.h | 3 + src/core/hle/service/spl/spl.cpp | 171 +- src/core/hle/service/spl/spl.h | 141 -- src/core/hle/service/spl/spl_module.cpp | 15 +- src/core/hle/service/spl/spl_results.h | 3 + src/core/hle/service/spl/spl_types.h | 3 + src/core/hle/service/ssl/cert_store.cpp | 3 + src/core/hle/service/ssl/cert_store.h | 3 + src/core/hle/service/ssl/ssl.cpp | 397 ++-- src/core/hle/service/ssl/ssl.h | 3 + src/core/hle/service/ssl/ssl_types.h | 3 + src/core/hle/service/tma/tma.cpp | 12 +- src/core/hle/service/usb/usb.cpp | 290 +-- src/core/hle/service/usb/usb.h | 3 + .../vi/application_display_service.cpp | 56 +- .../service/vi/application_display_service.h | 2 +- .../service/vi/application_root_service.cpp | 13 +- .../hle/service/vi/application_root_service.h | 1 - src/core/hle/service/vi/display.h | 3 + src/core/hle/service/vi/display_list.h | 3 + src/core/hle/service/vi/layer.h | 3 + src/core/hle/service/vi/layer_list.h | 3 + .../service/vi/manager_display_service.cpp | 174 +- .../hle/service/vi/manager_display_service.h | 1 - .../hle/service/vi/manager_root_service.cpp | 21 +- .../hle/service/vi/manager_root_service.h | 1 - src/core/hle/service/vi/service_creator.cpp | 3 + src/core/hle/service/vi/service_creator.h | 3 + .../hle/service/vi/shared_buffer_manager.h | 4 - .../hle/service/vi/system_display_service.cpp | 110 +- .../hle/service/vi/system_display_service.h | 1 - .../hle/service/vi/system_root_service.cpp | 17 +- src/core/hle/service/vi/system_root_service.h | 1 - src/core/hle/service/vi/vi.cpp | 3 + src/core/hle/service/vi/vi.h | 3 + src/core/hle/service/vi/vi_results.h | 3 + src/core/hle/service/vi/vi_types.h | 3 + src/core/hle/service/wlan/wlan.cpp | 368 ++- tools/README.md | 2 +- 588 files changed, 14723 insertions(+), 12534 deletions(-) rename docs/{SubsystemHLE.md => HosKernel.md} (55%) create mode 100644 src/core/hle/service/am/service/all_system_applet_proxies_service.cpp create mode 100644 src/core/hle/service/am/service/all_system_applet_proxies_service.h create mode 100644 src/core/hle/service/am/service/applet_common_functions.cpp create mode 100644 src/core/hle/service/am/service/applet_common_functions.h create mode 100644 src/core/hle/service/am/service/application_proxy.cpp create mode 100644 src/core/hle/service/am/service/application_proxy.h create mode 100644 src/core/hle/service/am/service/application_proxy_service.cpp create mode 100644 src/core/hle/service/am/service/application_proxy_service.h create mode 100644 src/core/hle/service/am/service/debug_functions.cpp create mode 100644 src/core/hle/service/am/service/debug_functions.h create mode 100644 src/core/hle/service/am/service/library_applet_creator.cpp create mode 100644 src/core/hle/service/am/service/library_applet_creator.h create mode 100644 src/core/hle/service/am/service/library_applet_proxy.cpp create mode 100644 src/core/hle/service/am/service/library_applet_proxy.h create mode 100644 src/core/hle/service/am/service/library_applet_self_accessor.cpp create mode 100644 src/core/hle/service/am/service/library_applet_self_accessor.h create mode 100644 src/core/hle/service/am/service/lock_accessor.cpp create mode 100644 src/core/hle/service/am/service/lock_accessor.h create mode 100644 src/core/hle/service/am/service/overlay_applet_proxy.cpp create mode 100644 src/core/hle/service/am/service/overlay_applet_proxy.h create mode 100644 src/core/hle/service/am/service/storage_accessor.cpp create mode 100644 src/core/hle/service/am/service/storage_accessor.h create mode 100644 src/core/hle/service/am/service/system_applet_proxy.cpp create mode 100644 src/core/hle/service/am/service/system_applet_proxy.h create mode 100644 src/core/hle/service/btm/btm_debug.cpp create mode 100644 src/core/hle/service/btm/btm_debug.h create mode 100644 src/core/hle/service/btm/btm_system.cpp create mode 100644 src/core/hle/service/btm/btm_system.h create mode 100644 src/core/hle/service/btm/btm_system_core.cpp create mode 100644 src/core/hle/service/btm/btm_system_core.h create mode 100644 src/core/hle/service/btm/btm_user.cpp create mode 100644 src/core/hle/service/btm/btm_user.h create mode 100644 src/core/hle/service/btm/btm_user_core.cpp create mode 100644 src/core/hle/service/btm/btm_user_core.h create mode 100644 src/core/hle/service/caps/caps_a.cpp create mode 100644 src/core/hle/service/caps/caps_a.h create mode 100644 src/core/hle/service/fatal/fatal_p.cpp create mode 100644 src/core/hle/service/fatal/fatal_p.h create mode 100644 src/core/hle/service/fatal/fatal_u.cpp create mode 100644 src/core/hle/service/fatal/fatal_u.h create mode 100644 src/core/hle/service/friend/friend_interface.cpp create mode 100644 src/core/hle/service/friend/friend_interface.h create mode 100644 src/core/hle/service/ldn/sf_service.cpp create mode 100644 src/core/hle/service/ldn/sf_service.h create mode 100644 src/core/hle/service/olsc/olsc_service_for_system_service.cpp create mode 100644 src/core/hle/service/olsc/olsc_service_for_system_service.h create mode 100644 src/core/hle/service/pctl/parental_control_service.cpp create mode 100644 src/core/hle/service/pctl/parental_control_service.h create mode 100644 src/core/hle/service/pctl/parental_control_service_factory.cpp create mode 100644 src/core/hle/service/pctl/parental_control_service_factory.h create mode 100644 src/core/hle/service/pctl/pctl_results.h create mode 100644 src/core/hle/service/pctl/pctl_types.h create mode 100644 src/core/hle/service/psc/ovln/receiver.cpp create mode 100644 src/core/hle/service/psc/ovln/receiver.h create mode 100644 src/core/hle/service/psc/ovln/sender.cpp create mode 100644 src/core/hle/service/psc/ovln/sender.h create mode 100644 src/core/hle/service/psc/pm_control.cpp create mode 100644 src/core/hle/service/psc/pm_control.h create mode 100644 src/core/hle/service/psc/pm_module.cpp create mode 100644 src/core/hle/service/psc/pm_module.h create mode 100644 src/core/hle/service/psc/pm_service.cpp create mode 100644 src/core/hle/service/psc/pm_service.h create mode 100644 src/core/hle/service/ro/ro_nro_utils.cpp create mode 100644 src/core/hle/service/ro/ro_nro_utils.h create mode 100644 src/core/hle/service/ro/ro_results.h create mode 100644 src/core/hle/service/ro/ro_types.h create mode 100644 src/core/hle/service/sm/sm_controller.cpp create mode 100644 src/core/hle/service/sm/sm_controller.h diff --git a/docs/DesignOverview.md b/docs/DesignOverview.md index 959fbfdbb2..c6a328cb9c 100644 --- a/docs/DesignOverview.md +++ b/docs/DesignOverview.md @@ -1,6 +1,6 @@ # Design Overview -Modern game consoles require heavy power to emulate. This is why the emulator uses an approach known as HLE (High-Level-Emulation), in a nutshell: Instead of accurately emulating every subsystem that forms part of a component, emulate the resulting visible output of said interface instead. +Modern game consoles require heavy power to be emulated appropriately. This is why the emulator uses an approach known as HLE (High-Level-Emulation), in a nutshell: Instead of accurately emulating every subsystem that forms part of a component, emulate the resulting visible I/O interface instead. For example, take a disk write, instead of emulating a proper SD card we instead use the C++ standard library for I/O. Additionally we use the abstractions provided by the `fs` service to "lie" to programs about certain SD card properties. Notably this includes making up sizes for the fake SD card, giving "realistic" values or expected outputs for a given card, and so on. And instead of writing to an actual SD card, the emulator simply writes to a file. diff --git a/docs/SubsystemHLE.md b/docs/HosKernel.md similarity index 55% rename from docs/SubsystemHLE.md rename to docs/HosKernel.md index 7a59fef9fa..87df2072a5 100644 --- a/docs/SubsystemHLE.md +++ b/docs/HosKernel.md @@ -1,6 +1,4 @@ -# Subsystem: HLE - -## HOS Kernel +# HOS Kernel In brief, the HOS kernel is a microkernel, all services and programs run in userspace, the primary way to do communication between these is via `HIPC` (not covered here); otherwise most of the primitives reside in the forms of syscalls invoked via `svc #imm`. The kernel supports both 32-bit and 64-bit programs, and has the capacity to use 32, 36 and 39 bits of address space for spawned processes. Most of the networking stack is based off FreeBSD's network stack. @@ -31,52 +29,3 @@ Every process keeps it's own tracking of the following structures: The emulator willingly restricts itself to only use 4 threads (to emulate 4 cores), this is because most existing applications do not benefit greatly from the added core count, and in fact can be detrimental due to extra contention. This translates equitatively to about 4 `ArmInterface` slots for each process, these are then redirected to whatever is the last `pc` of the last thread running on the core is meant to be; proceed to run it, then when returning (due to halt or interruption), proceed to reschedule the thread. The scheduler as-is isn't 100% faithful to the original (for example the original is cooperative and not preemptive), and has great timing variance (especially due to the fact the emulator can run in systems with wildly different timings). - -## Services - -Consult [SwitchBrew](https://switchbrew.org/) for per-service methods, and implementation details. - -All services are instatiated implicitly using `ServiceFramework`. To register a new interface or service, you can inherit from said class, providing additionally a template parameter that references `Self`, for example: - -```c++ -// Follows as: -// class MyInterface [final] : public ServiceFramework { ... }; -// [final] is optional, but should be used whenever there is no intention of this class itself being inherited. -class IFloatingRegistrationRequest final : public ServiceFramework { -public: - // ctor, you can pass extra parameters here (if so required) - explicit IFloatingRegistrationRequest(Core::System& system_) - : ServiceFramework{system_, "IFloatingRegistrationRequest"} - {} - - // Must be placed after all methods are defined (or declared). - // Define here your functions and methods, please order them. - // Use FindRequestTipc for TIPC handlers. - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetSessionId"}, - FunctionInfo{12, nullptr, "GetAccountId"}, - FunctionInfo{13, nullptr, "GetLinkedNintendoAccountId"}, - FunctionInfo{14, nullptr, "GetNickname"}, - FunctionInfo{15, nullptr, "GetProfileImage"}, - FunctionInfo{16, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})}, - FunctionInfo{21, nullptr, "LoadIdTokenCache"}, - FunctionInfo{100, nullptr, "RegisterUser"}, - FunctionInfo{101, nullptr, "RegisterUserWithUid"}, - FunctionInfo{102, nullptr, "RegisterNetworkServiceAccountAsync", MakeVersionGate({4,0,0})}, - FunctionInfo{103, nullptr, "RegisterNetworkServiceAccountWithUidAsync", MakeVersionGate({4,0,0})}, - FunctionInfo{110, nullptr, "SetSystemProgramIdentification"}, - FunctionInfo{111, nullptr, "EnsureIdTokenCacheAsync"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } -}; -``` - -Try to keep service structures local, that is, don't place them on header files if they're only going to be used by a specific service. - -In each `.cpp` file that uses `D<...>/C<...>` CMIF wrapper helpers, remember to include the corresponding instancer, so you don't face linker errors: -```c++ -#include "core/hle/service/cmif_serialization.h" -``` -This will properly instatiate the corresponding wrappers and decompose the provided arguments in the wiring order. diff --git a/docs/README.md b/docs/README.md index f7568e16f3..5bcaf30239 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,7 +21,7 @@ This contains documentation created by developers, build instructions, guideline - Subsystems: - **[Design Overview](./DesignOverview.md)** - **[Dynarmic](./dynarmic/README.md)** - - **[Subsystem: HLE](./SubsystemHLE.md)** + - **[HOS Kernel](./HosKernel.md)** - **[Settings](./Settings.md)** ## Policies diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index f1d4bdae42..31f9931d3a 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -444,18 +444,28 @@ add_library(core STATIC hle/service/am/process_creation.h hle/service/am/process_holder.cpp hle/service/am/process_holder.h + hle/service/am/service/all_system_applet_proxies_service.cpp + hle/service/am/service/all_system_applet_proxies_service.h + hle/service/am/service/applet_common_functions.cpp + hle/service/am/service/applet_common_functions.h hle/service/am/service/application_accessor.cpp hle/service/am/service/application_accessor.h hle/service/am/service/application_creator.cpp hle/service/am/service/application_creator.h hle/service/am/service/application_functions.cpp hle/service/am/service/application_functions.h + hle/service/am/service/application_proxy.cpp + hle/service/am/service/application_proxy.h + hle/service/am/service/application_proxy_service.cpp + hle/service/am/service/application_proxy_service.h hle/service/am/service/audio_controller.cpp hle/service/am/service/audio_controller.h hle/service/am/service/common_state_getter.cpp hle/service/am/service/common_state_getter.h hle/service/am/service/cradle_firmware_updater.cpp hle/service/am/service/cradle_firmware_updater.h + hle/service/am/service/debug_functions.cpp + hle/service/am/service/debug_functions.h hle/service/am/service/display_controller.cpp hle/service/am/service/display_controller.h hle/service/am/service/global_state_controller.cpp @@ -464,14 +474,28 @@ add_library(core STATIC hle/service/am/service/home_menu_functions.h hle/service/am/service/library_applet_accessor.cpp hle/service/am/service/library_applet_accessor.h + hle/service/am/service/library_applet_creator.cpp + hle/service/am/service/library_applet_creator.h + hle/service/am/service/library_applet_proxy.cpp + hle/service/am/service/library_applet_proxy.h + hle/service/am/service/library_applet_self_accessor.cpp + hle/service/am/service/library_applet_self_accessor.h + hle/service/am/service/lock_accessor.cpp + hle/service/am/service/lock_accessor.h hle/service/am/service/overlay_functions.cpp hle/service/am/service/overlay_functions.h + hle/service/am/service/overlay_applet_proxy.cpp + hle/service/am/service/overlay_applet_proxy.h hle/service/am/service/process_winding_controller.cpp hle/service/am/service/process_winding_controller.h hle/service/am/service/self_controller.cpp hle/service/am/service/self_controller.h hle/service/am/service/storage.cpp hle/service/am/service/storage.h + hle/service/am/service/storage_accessor.cpp + hle/service/am/service/storage_accessor.h + hle/service/am/service/system_applet_proxy.cpp + hle/service/am/service/system_applet_proxy.h hle/service/am/service/window_controller.cpp hle/service/am/service/window_controller.h hle/service/am/window_system.cpp @@ -556,8 +580,20 @@ add_library(core STATIC hle/service/btdrv/btdrv.h hle/service/btm/btm.cpp hle/service/btm/btm.h + hle/service/btm/btm_debug.cpp + hle/service/btm/btm_debug.h + hle/service/btm/btm_system.cpp + hle/service/btm/btm_system.h + hle/service/btm/btm_system_core.cpp + hle/service/btm/btm_system_core.h + hle/service/btm/btm_user.cpp + hle/service/btm/btm_user.h + hle/service/btm/btm_user_core.cpp + hle/service/btm/btm_user_core.h hle/service/caps/caps.cpp hle/service/caps/caps.h + hle/service/caps/caps_a.cpp + hle/service/caps/caps_a.h hle/service/caps/caps_c.cpp hle/service/caps/caps_c.h hle/service/caps/caps_manager.cpp @@ -582,6 +618,10 @@ add_library(core STATIC hle/service/eupld/eupld.h hle/service/fatal/fatal.cpp hle/service/fatal/fatal.h + hle/service/fatal/fatal_p.cpp + hle/service/fatal/fatal_p.h + hle/service/fatal/fatal_u.cpp + hle/service/fatal/fatal_u.h hle/service/fgm/fgm.cpp hle/service/fgm/fgm.h hle/service/filesystem/filesystem.cpp @@ -613,6 +653,8 @@ add_library(core STATIC hle/service/filesystem/save_data_controller.h hle/service/friend/friend.cpp hle/service/friend/friend.h + hle/service/friend/friend_interface.cpp + hle/service/friend/friend_interface.h hle/service/glue/arp.cpp hle/service/glue/arp.h hle/service/glue/bgtc.cpp @@ -681,6 +723,8 @@ add_library(core STATIC hle/service/ldn/monitor_service.h hle/service/ldn/sf_monitor_service.cpp hle/service/ldn/sf_monitor_service.h + hle/service/ldn/sf_service.cpp + hle/service/ldn/sf_service.h hle/service/ldn/sf_service_monitor.cpp hle/service/ldn/sf_service_monitor.h hle/service/ldn/system_local_communication_service.cpp @@ -869,6 +913,8 @@ add_library(core STATIC hle/service/olsc/native_handle_holder.h hle/service/olsc/olsc_service_for_application.cpp hle/service/olsc/olsc_service_for_application.h + hle/service/olsc/olsc_service_for_system_service.cpp + hle/service/olsc/olsc_service_for_system_service.h hle/service/olsc/olsc.cpp hle/service/olsc/olsc.h hle/service/olsc/remote_storage_controller.cpp @@ -898,8 +944,14 @@ add_library(core STATIC hle/service/os/process.h hle/service/pcie/pcie.cpp hle/service/pcie/pcie.h + hle/service/pctl/parental_control_service_factory.cpp + hle/service/pctl/parental_control_service_factory.h + hle/service/pctl/parental_control_service.cpp + hle/service/pctl/parental_control_service.h hle/service/pctl/pctl.cpp hle/service/pctl/pctl.h + hle/service/pctl/pctl_results.h + hle/service/pctl/pctl_types.h hle/service/pcv/pcv.cpp hle/service/pcv/pcv.h hle/service/pm/pm.cpp @@ -909,8 +961,18 @@ add_library(core STATIC hle/service/psc/ovln/ovln_types.h hle/service/psc/ovln/receiver_service.cpp hle/service/psc/ovln/receiver_service.h + hle/service/psc/ovln/receiver.cpp + hle/service/psc/ovln/receiver.h hle/service/psc/ovln/sender_service.cpp hle/service/psc/ovln/sender_service.h + hle/service/psc/ovln/sender.cpp + hle/service/psc/ovln/sender.h + hle/service/psc/pm_control.cpp + hle/service/psc/pm_control.h + hle/service/psc/pm_module.cpp + hle/service/psc/pm_module.h + hle/service/psc/pm_service.cpp + hle/service/psc/pm_service.h hle/service/psc/psc.cpp hle/service/psc/psc.h hle/service/psc/time/alarms.cpp @@ -961,6 +1023,10 @@ add_library(core STATIC hle/service/ptm/ts.h hle/service/ro/ro.cpp hle/service/ro/ro.h + hle/service/ro/ro_nro_utils.cpp + hle/service/ro/ro_nro_utils.h + hle/service/ro/ro_results.h + hle/service/ro/ro_types.h hle/service/server_manager.cpp hle/service/server_manager.h hle/service/service.cpp @@ -989,6 +1055,8 @@ add_library(core STATIC hle/service/set/system_settings_server.h hle/service/sm/sm.cpp hle/service/sm/sm.h + hle/service/sm/sm_controller.cpp + hle/service/sm/sm_controller.h hle/service/sockets/bsd.cpp hle/service/sockets/bsd.h hle/service/sockets/nsd.cpp @@ -1154,7 +1222,7 @@ target_link_libraries(core PRIVATE RenderDoc::API ZLIB::ZLIB) -target_link_libraries(core PUBLIC httplib::httplib zstd::zstd frozen::frozen-headers) +target_link_libraries(core PUBLIC httplib::httplib zstd::zstd) if (ENABLE_WEB_SERVICE) target_compile_definitions(core PUBLIC ENABLE_WEB_SERVICE) diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index 9b29a7773c..d68b6bde0d 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -75,6 +75,41 @@ class IManagerForSystemService final : public ServiceFramework, "CheckAvailability"}, + {1, D<&IManagerForSystemService::GetAccountId>, "GetAccountId"}, + {2, nullptr, "EnsureIdTokenCacheAsync"}, + {3, D<&IManagerForSystemService::LoadIdTokenCacheDeprecated>, "LoadIdTokenCacheDeprecated"}, // 19.0.0+ + {4, D<&IManagerForSystemService::LoadIdTokenCache>, "LoadIdTokenCache"}, // 19.0.0+ + {100, nullptr, "SetSystemProgramIdentification"}, + {101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+ + {110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+ + {111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+ + {112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0 + {113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+ + {120, nullptr, "GetNintendoAccountId"}, + {121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+ + {130, nullptr, "GetNintendoAccountUserResourceCache"}, + {131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"}, + {132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"}, + {133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+ + {134, nullptr, "RefreshNintendoAccountVerificationUrlCache"}, // 9.0.0+ + {135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+ + {136, nullptr, "GetNintendoAccountUserResourceCache"}, // 19.0.0+ + {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+ + {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+ + {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+ + {143, D<&IManagerForSystemService::GetNetworkServiceLicenseCacheEx>, "GetNetworkServiceLicenseCacheEx"}, // 15.0.0+ + {150, nullptr, "CreateAuthorizationRequest"}, + {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, + {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, + {170, nullptr, "CreateDeviceHistoryRequest"}, // 17.0.0+ + {180, nullptr, "GetRequestForNintendoAccountReauthentication"} // 18.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); } private: @@ -108,40 +143,6 @@ private: R_SUCCEED(); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IManagerForSystemService::CheckAvailability>, "CheckAvailability"}, - FunctionInfo{1, D<&IManagerForSystemService::GetAccountId>, "GetAccountId"}, - FunctionInfo{2, nullptr, "EnsureIdTokenCacheAsync"}, - FunctionInfo{3, D<&IManagerForSystemService::LoadIdTokenCacheDeprecated>, "LoadIdTokenCacheDeprecated", MakeVersionGate({19,0,0})}, - FunctionInfo{4, D<&IManagerForSystemService::LoadIdTokenCache>, "LoadIdTokenCache", MakeVersionGate({19,0,0})}, - FunctionInfo{100, nullptr, "SetSystemProgramIdentification"}, - FunctionInfo{101, nullptr, "RefreshNotificationTokenAsync", MakeVersionGate({7,0,0})}, - FunctionInfo{110, nullptr, "GetServiceEntryRequirementCache", MakeVersionGate({4,0,0})}, - FunctionInfo{111, nullptr, "InvalidateServiceEntryRequirementCache", MakeVersionGate({4,0,0})}, - FunctionInfo{112, nullptr, "InvalidateTokenCache", MakeVersionGate({4,0,0}, {6,2,0})}, - FunctionInfo{113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay", MakeVersionGate({6,1,0})}, - FunctionInfo{120, nullptr, "GetNintendoAccountId"}, - FunctionInfo{121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint", MakeVersionGate({9,0,0})}, - FunctionInfo{130, nullptr, "GetNintendoAccountUserResourceCache"}, - FunctionInfo{131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"}, - FunctionInfo{132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"}, - FunctionInfo{133, nullptr, "GetNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})}, - FunctionInfo{134, nullptr, "RefreshNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})}, - FunctionInfo{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed", MakeVersionGate({9,0,0})}, - FunctionInfo{136, nullptr, "GetNintendoAccountUserResourceCache", MakeVersionGate({19,0,0})}, - FunctionInfo{140, nullptr, "GetNetworkServiceLicenseCache", MakeVersionGate({5,0,0})}, - FunctionInfo{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync", MakeVersionGate({5,0,0})}, - FunctionInfo{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed", MakeVersionGate({5,0,0})}, - FunctionInfo{143, D<&IManagerForSystemService::GetNetworkServiceLicenseCacheEx>, "GetNetworkServiceLicenseCacheEx", MakeVersionGate({15,0,0})}, - FunctionInfo{150, nullptr, "CreateAuthorizationRequest"}, - FunctionInfo{160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, - FunctionInfo{161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, - FunctionInfo{170, nullptr, "CreateDeviceHistoryRequest", MakeVersionGate({17,0,0})}, - FunctionInfo{180, nullptr, "GetRequestForNintendoAccountReauthentication", MakeVersionGate({18,0,0})} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } Common::UUID account_id; }; @@ -150,25 +151,25 @@ class IFloatingRegistrationRequest final : public ServiceFramework FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; @@ -176,6 +177,62 @@ class IAdministrator final : public ServiceFramework { public: explicit IAdministrator(Core::System& system_, Common::UUID) : ServiceFramework{system_, "IAdministrator"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "CheckAvailability"}, + {1, nullptr, "GetAccountId"}, + {2, nullptr, "EnsureIdTokenCacheAsync"}, + {3, nullptr, "LoadIdTokenCache"}, + {100, nullptr, "SetSystemProgramIdentification"}, + {101, nullptr, "RefreshNotificationTokenAsync"}, // 7.0.0+ + {110, nullptr, "GetServiceEntryRequirementCache"}, // 4.0.0+ + {111, nullptr, "InvalidateServiceEntryRequirementCache"}, // 4.0.0+ + {112, nullptr, "InvalidateTokenCache"}, // 4.0.0 - 6.2.0 + {113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay"}, // 6.1.0+ + {120, nullptr, "GetNintendoAccountId"}, + {121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint"}, // 9.0.0+ + {130, nullptr, "GetNintendoAccountUserResourceCache"}, + {131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"}, + {132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"}, + {133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+ + {134, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsync"}, // 9.0.0+ + {135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+ + {140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+ + {141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+ + {142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+ + {143, nullptr, "GetNetworkServiceLicenseCacheEx"}, + {150, nullptr, "CreateAuthorizationRequest"}, + {160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, + {161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, + {170, nullptr, "CreateDeviceHistoryRequest"}, // 17.0.0+ + {180, nullptr, "GetRequestForNintendoAccountReauthentication"}, // 18.0.0+ + {200, nullptr, "IsRegistered"}, + {201, nullptr, "RegisterAsync"}, + {202, nullptr, "UnregisterAsync"}, + {203, nullptr, "DeleteRegistrationInfoLocally"}, + {220, nullptr, "SynchronizeProfileAsync"}, + {221, nullptr, "UploadProfileAsync"}, + {222, nullptr, "SynchronizaProfileAsyncIfSecondsElapsed"}, + {250, &IAdministrator::IsLinkedWithNintendoAccount, "IsLinkedWithNintendoAccount"}, + {251, nullptr, "CreateProcedureToLinkWithNintendoAccount"}, + {252, nullptr, "ResumeProcedureToLinkWithNintendoAccount"}, + {255, nullptr, "CreateProcedureToUpdateLinkageStateOfNintendoAccount"}, + {256, nullptr, "ResumeProcedureToUpdateLinkageStateOfNintendoAccount"}, + {260, nullptr, "CreateProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+ + {261, nullptr, "ResumeProcedureToLinkNnidWithNintendoAccount"}, // 3.0.0+ + {280, nullptr, "ProxyProcedureToAcquireApplicationAuthorizationForNintendoAccount"}, + {290, nullptr, "GetRequestForNintendoAccountUserResourceView"}, // 8.0.0+ + {300, nullptr, "TryRecoverNintendoAccountUserStateAsync"}, // 6.0.0+ + {400, nullptr, "IsServiceEntryRequirementCacheRefreshRequiredForOnlinePlay"}, // 6.1.0+ + {401, nullptr, "RefreshServiceEntryRequirementCacheForOnlinePlayAsync"}, // 6.1.0+ + {900, nullptr, "GetAuthenticationInfoForWin"}, // 9.0.0+ + {901, nullptr, "ImportAsyncForWin"}, // 9.0.0+ + {997, nullptr, "DebugUnlinkNintendoAccountAsync"}, + {998, nullptr, "DebugSetAvailabilityErrorDetail"}, + }; + // clang-format on + + RegisterHandlers(functions); } private: @@ -184,97 +241,42 @@ private: rb.Push(ResultSuccess); rb.Push(false); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CheckAvailability"}, - FunctionInfo{1, nullptr, "GetAccountId"}, - FunctionInfo{2, nullptr, "EnsureIdTokenCacheAsync"}, - FunctionInfo{3, nullptr, "LoadIdTokenCache"}, - FunctionInfo{100, nullptr, "SetSystemProgramIdentification"}, - FunctionInfo{101, nullptr, "RefreshNotificationTokenAsync", MakeVersionGate({7,0,0})}, - FunctionInfo{110, nullptr, "GetServiceEntryRequirementCache", MakeVersionGate({4,0,0})}, - FunctionInfo{111, nullptr, "InvalidateServiceEntryRequirementCache", MakeVersionGate({4,0,0})}, - FunctionInfo{112, nullptr, "InvalidateTokenCache", MakeVersionGate({4,0,0}, {6,2,0})}, - FunctionInfo{113, nullptr, "GetServiceEntryRequirementCacheForOnlinePlay", MakeVersionGate({6,1,0})}, - FunctionInfo{120, nullptr, "GetNintendoAccountId"}, - FunctionInfo{121, nullptr, "CalculateNintendoAccountAuthenticationFingerprint", MakeVersionGate({9,0,0})}, - FunctionInfo{130, nullptr, "GetNintendoAccountUserResourceCache"}, - FunctionInfo{131, nullptr, "RefreshNintendoAccountUserResourceCacheAsync"}, - FunctionInfo{132, nullptr, "RefreshNintendoAccountUserResourceCacheAsyncIfSecondsElapsed"}, - FunctionInfo{133, nullptr, "GetNintendoAccountVerificationUrlCache", MakeVersionGate({9,0,0})}, - FunctionInfo{134, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsync", MakeVersionGate({9,0,0})}, - FunctionInfo{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed", MakeVersionGate({9,0,0})}, - FunctionInfo{140, nullptr, "GetNetworkServiceLicenseCache", MakeVersionGate({5,0,0})}, - FunctionInfo{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync", MakeVersionGate({5,0,0})}, - FunctionInfo{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed", MakeVersionGate({5,0,0})}, - FunctionInfo{143, nullptr, "GetNetworkServiceLicenseCacheEx"}, - FunctionInfo{150, nullptr, "CreateAuthorizationRequest"}, - FunctionInfo{160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"}, - FunctionInfo{161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"}, - FunctionInfo{170, nullptr, "CreateDeviceHistoryRequest", MakeVersionGate({17,0,0})}, - FunctionInfo{180, nullptr, "GetRequestForNintendoAccountReauthentication", MakeVersionGate({18,0,0})}, - FunctionInfo{200, nullptr, "IsRegistered"}, - FunctionInfo{201, nullptr, "RegisterAsync"}, - FunctionInfo{202, nullptr, "UnregisterAsync"}, - FunctionInfo{203, nullptr, "DeleteRegistrationInfoLocally"}, - FunctionInfo{220, nullptr, "SynchronizeProfileAsync"}, - FunctionInfo{221, nullptr, "UploadProfileAsync"}, - FunctionInfo{222, nullptr, "SynchronizaProfileAsyncIfSecondsElapsed"}, - FunctionInfo{250, &IAdministrator::IsLinkedWithNintendoAccount, "IsLinkedWithNintendoAccount"}, - FunctionInfo{251, nullptr, "CreateProcedureToLinkWithNintendoAccount"}, - FunctionInfo{252, nullptr, "ResumeProcedureToLinkWithNintendoAccount"}, - FunctionInfo{255, nullptr, "CreateProcedureToUpdateLinkageStateOfNintendoAccount"}, - FunctionInfo{256, nullptr, "ResumeProcedureToUpdateLinkageStateOfNintendoAccount"}, - FunctionInfo{260, nullptr, "CreateProcedureToLinkNnidWithNintendoAccount", MakeVersionGate({3,0,0})}, - FunctionInfo{261, nullptr, "ResumeProcedureToLinkNnidWithNintendoAccount", MakeVersionGate({3,0,0})}, - FunctionInfo{280, nullptr, "ProxyProcedureToAcquireApplicationAuthorizationForNintendoAccount"}, - FunctionInfo{290, nullptr, "GetRequestForNintendoAccountUserResourceView", MakeVersionGate({8,0,0})}, - FunctionInfo{300, nullptr, "TryRecoverNintendoAccountUserStateAsync", MakeVersionGate({6,0,0})}, - FunctionInfo{400, nullptr, "IsServiceEntryRequirementCacheRefreshRequiredForOnlinePlay", MakeVersionGate({6,1,0})}, - FunctionInfo{401, nullptr, "RefreshServiceEntryRequirementCacheForOnlinePlayAsync", MakeVersionGate({6,1,0})}, - FunctionInfo{900, nullptr, "GetAuthenticationInfoForWin", MakeVersionGate({9,0,0})}, - FunctionInfo{901, nullptr, "ImportAsyncForWin", MakeVersionGate({9,0,0})}, - FunctionInfo{997, nullptr, "DebugUnlinkNintendoAccountAsync"}, - FunctionInfo{998, nullptr, "DebugSetAvailabilityErrorDetail"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } }; class IAuthorizationRequest final : public ServiceFramework { public: explicit IAuthorizationRequest(Core::System& system_, Common::UUID) : ServiceFramework{system_, "IAuthorizationRequest"} { - } + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetSessionId"}, + {10, nullptr, "InvokeWithoutInteractionAsync"}, + {19, nullptr, "IsAuthorized"}, + {20, nullptr, "GetAuthorizationCode"}, + {21, nullptr, "GetIdToken"}, + {22, nullptr, "GetState"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetSessionId"}, - FunctionInfo{10, nullptr, "InvokeWithoutInteractionAsync"}, - FunctionInfo{19, nullptr, "IsAuthorized"}, - FunctionInfo{20, nullptr, "GetAuthorizationCode"}, - FunctionInfo{21, nullptr, "GetIdToken"}, - FunctionInfo{22, nullptr, "GetState"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IOAuthProcedure final : public ServiceFramework { public: explicit IOAuthProcedure(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IOAuthProcedure"} {} + : ServiceFramework{system_, "IOAuthProcedure"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "PrepareAsync"}, + {1, nullptr, "GetRequest"}, + {2, nullptr, "ApplyResponse"}, + {3, nullptr, "ApplyResponseAsync"}, + {10, nullptr, "Suspend"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "PrepareAsync"}, - FunctionInfo{1, nullptr, "GetRequest"}, - FunctionInfo{2, nullptr, "ApplyResponse"}, - FunctionInfo{3, nullptr, "ApplyResponseAsync"}, - FunctionInfo{10, nullptr, "Suspend"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; @@ -282,69 +284,96 @@ public: class IOAuthProcedureForExternalNsa final : public ServiceFramework { public: explicit IOAuthProcedureForExternalNsa(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IOAuthProcedureForExternalNsa"} - {} + : ServiceFramework{system_, "IOAuthProcedureForExternalNsa"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "PrepareAsync"}, + {1, nullptr, "GetRequest"}, + {2, nullptr, "ApplyResponse"}, + {3, nullptr, "ApplyResponseAsync"}, + {10, nullptr, "Suspend"}, + {100, nullptr, "GetAccountId"}, + {101, nullptr, "GetLinkedNintendoAccountId"}, + {102, nullptr, "GetNickname"}, + {103, nullptr, "GetProfileImage"}, + {104, nullptr, "GetProfileLargeImage"} // 18.0.0+ + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "PrepareAsync"}, - FunctionInfo{1, nullptr, "GetRequest"}, - FunctionInfo{2, nullptr, "ApplyResponse"}, - FunctionInfo{3, nullptr, "ApplyResponseAsync"}, - FunctionInfo{10, nullptr, "Suspend"}, - FunctionInfo{100, nullptr, "GetAccountId"}, - FunctionInfo{101, nullptr, "GetLinkedNintendoAccountId"}, - FunctionInfo{102, nullptr, "GetNickname"}, - FunctionInfo{103, nullptr, "GetProfileImage"}, - FunctionInfo{104, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; -class IOAuthProcedureForNintendoAccountLinkage final : public ServiceFramework { +class IOAuthProcedureForNintendoAccountLinkage final + : public ServiceFramework { public: explicit IOAuthProcedureForNintendoAccountLinkage(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IOAuthProcedureForNintendoAccountLinkage"} - {} + : ServiceFramework{system_, "IOAuthProcedureForNintendoAccountLinkage"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "PrepareAsync"}, + {1, nullptr, "GetRequest"}, + {2, nullptr, "ApplyResponse"}, + {3, nullptr, "ApplyResponseAsync"}, + {10, nullptr, "Suspend"}, + {100, nullptr, "GetRequestWithTheme"}, + {101, nullptr, "IsNetworkServiceAccountReplaced"}, + {199, nullptr, "GetUrlForIntroductionOfExtraMembership"}, // 2.0.0 - 5.1.0 + {200, nullptr, "ApplyAsyncWithAuthorizedToken"}, + {210, nullptr, "IsProfileAvailable"}, // 17.0.0+ + {220, nullptr, "RegisterUserAsyncWithoutProfile"}, // 17.0.0+ + {221, nullptr, "RegisterUserWithProfileAsync"}, // 17.0.0+ + {230, nullptr, "RegisterUserWithLargeImageProfileAsync"}, // 18.0.0+ + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "PrepareAsync"}, - FunctionInfo{1, nullptr, "GetRequest"}, - FunctionInfo{2, nullptr, "ApplyResponse"}, - FunctionInfo{3, nullptr, "ApplyResponseAsync"}, - FunctionInfo{10, nullptr, "Suspend"}, - FunctionInfo{100, nullptr, "GetRequestWithTheme"}, - FunctionInfo{101, nullptr, "IsNetworkServiceAccountReplaced"}, - FunctionInfo{199, nullptr, "GetUrlForIntroductionOfExtraMembership", MakeVersionGate({2,0,0}, {5,1,0})}, - FunctionInfo{200, nullptr, "ApplyAsyncWithAuthorizedToken"}, - FunctionInfo{210, nullptr, "IsProfileAvailable", MakeVersionGate({17,0,0})}, - FunctionInfo{220, nullptr, "RegisterUserAsyncWithoutProfile", MakeVersionGate({17,0,0})}, - FunctionInfo{221, nullptr, "RegisterUserWithProfileAsync", MakeVersionGate({17,0,0})}, - FunctionInfo{230, nullptr, "RegisterUserWithLargeImageProfileAsync", MakeVersionGate({18,0,0})} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class INotifier final : public ServiceFramework { public: explicit INotifier(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "INotifier"} {} + : ServiceFramework{system_, "INotifier"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetSystemEvent"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetSystemEvent"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IProfileCommon : public ServiceFramework { public: - explicit IProfileCommon(Core::System& system_, const char* name, bool editor_commands, Common::UUID user_id_, ProfileManager& profile_manager_) + explicit IProfileCommon(Core::System& system_, const char* name, bool editor_commands, + Common::UUID user_id_, ProfileManager& profile_manager_) : ServiceFramework{system_, name}, profile_manager{profile_manager_}, user_id{user_id_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IProfileCommon::Get, "Get"}, + {1, &IProfileCommon::GetBase, "GetBase"}, + {10, &IProfileCommon::GetImageSize, "GetImageSize"}, + {11, &IProfileCommon::LoadImage, "LoadImage"}, + {20, &IProfileCommon::Unknown20, "Unknown20"}, + {21, &IProfileCommon::Unknown21, "Unknown21"}, + {30, &IProfileCommon::Unknown30, "Unknown30"} + }; + // clang-format on + RegisterHandlers(functions); + + if (editor_commands) { + // clang-format off + static const FunctionInfo editor_functions[] = { + {100, &IProfileCommon::Store, "Store"}, + {101, &IProfileCommon::StoreWithImage, "StoreWithImage"}, + {110, &IProfileCommon::Unknown110, "Unknown110"} + }; + // clang-format on + + RegisterHandlers(editor_functions); + } } protected: @@ -571,22 +600,6 @@ protected: rb.Push(ResultSuccess); } - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IProfileCommon::Get, "Get"}, - FunctionInfo{1, &IProfileCommon::GetBase, "GetBase"}, - FunctionInfo{10, &IProfileCommon::GetImageSize, "GetImageSize"}, - FunctionInfo{11, &IProfileCommon::LoadImage, "LoadImage"}, - FunctionInfo{20, &IProfileCommon::Unknown20, "Unknown20"}, - FunctionInfo{21, &IProfileCommon::Unknown21, "Unknown21"}, - FunctionInfo{30, &IProfileCommon::Unknown30, "Unknown30"}, - // Editor commands - FunctionInfo{100, &IProfileCommon::Store, "Store"}, - FunctionInfo{101, &IProfileCommon::StoreWithImage, "StoreWithImage"}, - FunctionInfo{110, &IProfileCommon::Unknown110, "Unknown110"} - ); ProfileManager& profile_manager; Common::UUID user_id{}; ///< The user id this profile refers to. }; @@ -608,33 +621,35 @@ public: class ISessionObject final : public ServiceFramework { public: explicit ISessionObject(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "ISessionObject"} {} + : ServiceFramework{system_, "ISessionObject"} { + // clang-format off + static const FunctionInfo functions[] = { + {999, nullptr, "Dummy"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{999, nullptr, "Dummy"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IGuestLoginRequest final : public ServiceFramework { public: explicit IGuestLoginRequest(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IGuestLoginRequest"} {} + : ServiceFramework{system_, "IGuestLoginRequest"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetSessionId"}, + {11, nullptr, "Unknown"}, // 1.0.0 - 2.3.0 (the name is blank on Switchbrew) + {12, nullptr, "GetAccountId"}, + {13, nullptr, "GetLinkedNintendoAccountId"}, + {14, nullptr, "GetNickname"}, + {15, nullptr, "GetProfileImage"}, + {16, nullptr, "GetProfileLargeImage"}, // 18.0.0+ + {21, nullptr, "LoadIdTokenCache"}, // 3.0.0+ + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetSessionId"}, - FunctionInfo{11, nullptr, "Unknown", MakeVersionGate({1,0,0}, {2,3,0})}, // the name is blank on Switchbrew - FunctionInfo{12, nullptr, "GetAccountId"}, - FunctionInfo{13, nullptr, "GetLinkedNintendoAccountId"}, - FunctionInfo{14, nullptr, "GetNickname"}, - FunctionInfo{15, nullptr, "GetProfileImage"}, - FunctionInfo{16, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})}, - FunctionInfo{21, nullptr, "LoadIdTokenCache", MakeVersionGate({3,0,0})} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; @@ -671,10 +686,23 @@ public: const std::shared_ptr& profile_manager_) : ServiceFramework{system_, "IManagerForApplication"}, ensure_token_id{std::make_shared(system)}, - profile_manager{profile_manager_} {} + profile_manager{profile_manager_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IManagerForApplication::CheckAvailability, "CheckAvailability"}, + {1, &IManagerForApplication::GetAccountId, "GetAccountId"}, + {2, &IManagerForApplication::EnsureIdTokenCacheAsync, "EnsureIdTokenCacheAsync"}, + {3, &IManagerForApplication::LoadIdTokenCacheDeprecated, "LoadIdTokenCacheDeprecated"}, + {4, &IManagerForApplication::LoadIdTokenCache, "LoadIdTokenCache"}, + {130, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCacheForApplication"}, + {136, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCache"}, // 19.0.0+ + {150, nullptr, "CreateAuthorizationRequest"}, + {160, &IManagerForApplication::StoreOpenContext, "StoreOpenContext"}, + {170, nullptr, "LoadNetworkServiceLicenseKindAsync"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -744,18 +772,6 @@ private: rb.Push(ResultSuccess); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IManagerForApplication::CheckAvailability, "CheckAvailability"}, - FunctionInfo{1, &IManagerForApplication::GetAccountId, "GetAccountId"}, - FunctionInfo{2, &IManagerForApplication::EnsureIdTokenCacheAsync, "EnsureIdTokenCacheAsync"}, - FunctionInfo{3, &IManagerForApplication::LoadIdTokenCacheDeprecated, "LoadIdTokenCacheDeprecated"}, - FunctionInfo{4, &IManagerForApplication::LoadIdTokenCache, "LoadIdTokenCache"}, - FunctionInfo{130, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCacheForApplication"}, - FunctionInfo{136, &IManagerForApplication::GetNintendoAccountUserResourceCacheForApplication, "GetNintendoAccountUserResourceCache", MakeVersionGate({19,0,0})}, - FunctionInfo{150, nullptr, "CreateAuthorizationRequest"}, - FunctionInfo{160, &IManagerForApplication::StoreOpenContext, "StoreOpenContext"}, - FunctionInfo{170, nullptr, "LoadNetworkServiceLicenseKindAsync"} - ); std::shared_ptr ensure_token_id{}; std::shared_ptr profile_manager; }; @@ -765,17 +781,18 @@ class IAsyncNetworkServiceLicenseKindContext final : public ServiceFramework { public: explicit IAsyncNetworkServiceLicenseKindContext(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IAsyncNetworkServiceLicenseKindContext"} {} + : ServiceFramework{system_, "IAsyncNetworkServiceLicenseKindContext"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetSystemEvent"}, + {1, nullptr, "Cancel"}, + {2, nullptr, "HasDone"}, + {3, nullptr, "GetResult"}, + {4, nullptr, "GetNetworkServiceLicenseKind"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetSystemEvent"}, - FunctionInfo{1, nullptr, "Cancel"}, - FunctionInfo{2, nullptr, "HasDone"}, - FunctionInfo{3, nullptr, "GetResult"}, - FunctionInfo{4, nullptr, "GetNetworkServiceLicenseKind"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; @@ -784,54 +801,56 @@ class IOAuthProcedureForUserRegistration final : public ServiceFramework { public: explicit IOAuthProcedureForUserRegistration(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IOAuthProcedureForUserRegistration"} {} + : ServiceFramework{system_, "IOAuthProcedureForUserRegistration"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "PrepareAsync"}, + {1, nullptr, "GetRequest"}, + {2, nullptr, "ApplyResponse"}, + {3, nullptr, "ApplyResponseAsync"}, + {10, nullptr, "Suspend"}, + {100, nullptr, "GetAccountId"}, + {101, nullptr, "GetLinkedNintendoAccountId"}, + {102, nullptr, "GetNickname"}, + {103, nullptr, "GetProfileImage"}, + {104, nullptr, "GetProfileLargeImage"}, // 18.0.0+ + {110, nullptr, "RegisterUserAsync"}, + {111, nullptr, "GetUid"}, + {200, nullptr, "ApplyResponseForUserCreationAsync"}, // 17.0.0+ + {205, nullptr, "SuspendAfterApplyResponse"}, // 17.0.0+ + {210, nullptr, "IsProfileAvailable"}, // 17.0.0+ + {220, nullptr, "RegisterUserAsyncWithoutProfile"}, // 17.0.0+ + {221, nullptr, "RegisterUserWithProfileAsync"}, // 17.0.0+ + {230, nullptr, "RegisterUserWithLargeImageProfileAsync"} // 18.0.0+ + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "PrepareAsync"}, - FunctionInfo{1, nullptr, "GetRequest"}, - FunctionInfo{2, nullptr, "ApplyResponse"}, - FunctionInfo{3, nullptr, "ApplyResponseAsync"}, - FunctionInfo{10, nullptr, "Suspend"}, - FunctionInfo{100, nullptr, "GetAccountId"}, - FunctionInfo{101, nullptr, "GetLinkedNintendoAccountId"}, - FunctionInfo{102, nullptr, "GetNickname"}, - FunctionInfo{103, nullptr, "GetProfileImage"}, - FunctionInfo{104, nullptr, "GetProfileLargeImage", MakeVersionGate({18,0,0})}, - FunctionInfo{110, nullptr, "RegisterUserAsync"}, - FunctionInfo{111, nullptr, "GetUid"}, - FunctionInfo{200, nullptr, "ApplyResponseForUserCreationAsync", MakeVersionGate({17,0,0})}, - FunctionInfo{205, nullptr, "SuspendAfterApplyResponse", MakeVersionGate({17,0,0})}, - FunctionInfo{210, nullptr, "IsProfileAvailable", MakeVersionGate({17,0,0})}, - FunctionInfo{220, nullptr, "RegisterUserAsyncWithoutProfile", MakeVersionGate({17,0,0})}, - FunctionInfo{221, nullptr, "RegisterUserWithProfileAsync", MakeVersionGate({17,0,0})}, - FunctionInfo{230, nullptr, "RegisterUserWithLargeImageProfileAsync", MakeVersionGate({18,0,0})} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class DAUTH_O final : public ServiceFramework { public: - explicit DAUTH_O(Core::System& system_, Common::UUID) : ServiceFramework{system_, "dauth:o"} {} + explicit DAUTH_O(Core::System& system_, Common::UUID) : ServiceFramework{system_, "dauth:o"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "EnsureAuthenticationTokenCacheAsync"}, + {1, nullptr, "LoadAuthenticationTokenCache"}, + {2, nullptr, "InvalidateAuthenticationTokenCache"}, + {3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"}, + {10, nullptr, "EnsureEdgeTokenCacheAsync"}, + {11, nullptr, "LoadEdgeTokenCache"}, + {12, nullptr, "InvalidateEdgeTokenCache"}, + {13, nullptr, "IsEdgeTokenCacheAvailable"}, + {20, nullptr, "EnsureApplicationAuthenticationCacheAsync"}, + {21, nullptr, "LoadApplicationAuthenticationTokenCache"}, + {22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"}, + {23, nullptr, "IsApplicationAuthenticationCacheAvailable"}, + {24, nullptr, "InvalidateApplicationAuthenticationCache"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "EnsureAuthenticationTokenCacheAsync"}, - FunctionInfo{1, nullptr, "LoadAuthenticationTokenCache"}, - FunctionInfo{2, nullptr, "InvalidateAuthenticationTokenCache"}, - FunctionInfo{3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"}, - FunctionInfo{10, nullptr, "EnsureEdgeTokenCacheAsync"}, - FunctionInfo{11, nullptr, "LoadEdgeTokenCache"}, - FunctionInfo{12, nullptr, "InvalidateEdgeTokenCache"}, - FunctionInfo{13, nullptr, "IsEdgeTokenCacheAvailable"}, - FunctionInfo{20, nullptr, "EnsureApplicationAuthenticationCacheAsync"}, - FunctionInfo{21, nullptr, "LoadApplicationAuthenticationTokenCache"}, - FunctionInfo{22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"}, - FunctionInfo{23, nullptr, "IsApplicationAuthenticationCacheAvailable"}, - FunctionInfo{24, nullptr, "InvalidateApplicationAuthenticationCache"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; @@ -839,809 +858,781 @@ public: class IAsyncResult final : public ServiceFramework { public: explicit IAsyncResult(Core::System& system_, Common::UUID) - : ServiceFramework{system_, "IAsyncResult"} {} + : ServiceFramework{system_, "IAsyncResult"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetResult"}, + {1, nullptr, "Cancel"}, + {2, nullptr, "IsAvailable"}, + {3, nullptr, "GetSystemEvent"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetResult"}, - FunctionInfo{1, nullptr, "Cancel"}, - FunctionInfo{2, nullptr, "IsAvailable"}, - FunctionInfo{3, nullptr, "GetSystemEvent"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; -class Module final { -public: - class Interface : public ServiceFramework { - public: - explicit Interface(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_, const char* name) - : ServiceFramework{system_, name} - , module{std::move(module_)} - , profile_manager{std::move(profile_manager_)} - {} - ~Interface() override = default; +void Module::Interface::GetUserCount(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(static_cast(profile_manager->GetUserCount())); +} - void GetUserCount(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(static_cast(profile_manager->GetUserCount())); +void Module::Interface::GetUserExistence(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); + LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString()); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(profile_manager->UserExists(user_id)); +} + +void Module::Interface::ListAllUsers(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + ctx.WriteBuffer(profile_manager->GetAllUsers()); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + +void Module::Interface::ListOpenUsers(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + ctx.WriteBuffer(profile_manager->GetOpenUsers()); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + +void Module::Interface::GetLastOpenedUser(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + IPC::ResponseBuilder rb{ctx, 6}; + rb.Push(ResultSuccess); + rb.PushRaw(profile_manager->GetLastOpenedUser()); +} + +void Module::Interface::GetProfile(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); + LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString()); + + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, user_id, *profile_manager); +} + +void Module::Interface::IsUserRegistrationRequestPermitted(HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(profile_manager->CanSystemRegisterUser()); +} + +void Module::Interface::InitializeApplicationInfo(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(InitializeApplicationInfoBase()); +} + +void Module::Interface::InitializeApplicationInfoRestricted(HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(Partial implementation) called"); + + // TODO(ogniK): We require checking if the user actually owns the title and what not. As of + // currently, we assume the user owns the title. InitializeApplicationInfoBase SHOULD be called + // first then we do extra checks if the game is a digital copy. + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(InitializeApplicationInfoBase()); +} + +Result Module::Interface::InitializeApplicationInfoBase() { + if (application_info) { + LOG_ERROR(Service_ACC, "Application already initialized"); + return Account::ResultApplicationInfoAlreadyInitialized; + } + + // TODO(ogniK): This should be changed to reflect the target process for when we have multiple + // processes emulated. As we don't actually have pid support we should assume we're just using + // our own process + Glue::ApplicationLaunchProperty launch_property{}; + const auto result = system.GetARPManager().GetLaunchProperty( + &launch_property, system.GetApplicationProcessProgramID()); + + if (result != ResultSuccess) { + LOG_ERROR(Service_ACC, "Failed to get launch property"); + return Account::ResultInvalidApplication; + } + + switch (launch_property.base_game_storage_id) { + case FileSys::StorageId::GameCard: + application_info.application_type = ApplicationType::GameCard; + break; + case FileSys::StorageId::Host: + case FileSys::StorageId::NandSystem: + case FileSys::StorageId::NandUser: + case FileSys::StorageId::SdCard: + case FileSys::StorageId::None: // Yuzu specific, differs from hardware + application_info.application_type = ApplicationType::Digital; + break; + default: + LOG_ERROR(Service_ACC, "Invalid game storage ID! storage_id={}", + launch_property.base_game_storage_id); + return Account::ResultInvalidApplication; + } + + LOG_WARNING(Service_ACC, "ApplicationInfo init required"); + // TODO(ogniK): Actual initialization here + + return ResultSuccess; +} + +void Module::Interface::GetBaasAccountManagerForApplication(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, profile_manager); +} + +void Module::Interface::IsUserAccountSwitchLocked(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + FileSys::NACP nacp; + const auto res = system.GetAppLoader().ReadControlData(nacp); + + bool is_locked = false; + + if (res != Loader::ResultStatus::Success) { + const FileSys::PatchManager pm{system.GetApplicationProcessProgramID(), + system.GetFileSystemController(), + system.GetContentProvider()}; + const auto nacp_unique = pm.GetControlMetadata().first; + + if (nacp_unique != nullptr) { + is_locked = nacp_unique->GetUserAccountSwitchLock(); + } else { + LOG_ERROR(Service_ACC, "nacp_unique is null!"); } + } else { + is_locked = nacp.GetUserAccountSwitchLock(); + } - void GetUserExistence(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); - LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString()); - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(profile_manager->UserExists(user_id)); - } - - void ListAllUsers(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - ctx.WriteBuffer(profile_manager->GetAllUsers()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void ListOpenUsers(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - ctx.WriteBuffer(profile_manager->GetOpenUsers()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void GetLastOpenedUser(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - IPC::ResponseBuilder rb{ctx, 6}; - rb.Push(ResultSuccess); - rb.PushRaw(profile_manager->GetLastOpenedUser()); - } - - void GetProfile(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); - LOG_DEBUG(Service_ACC, "called user_id=0x{}", user_id.RawString()); - - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, user_id, *profile_manager); - } - - void IsUserRegistrationRequestPermitted(HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(profile_manager->CanSystemRegisterUser()); - } - - void InitializeApplicationInfo(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(InitializeApplicationInfoBase()); - } - - void InitializeApplicationInfoRestricted(HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(Partial implementation) called"); - - // TODO(ogniK): We require checking if the user actually owns the title and what not. As of - // currently, we assume the user owns the title. InitializeApplicationInfoBase SHOULD be called - // first then we do extra checks if the game is a digital copy. - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(InitializeApplicationInfoBase()); - } - - void GetBaasAccountManagerForApplication(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, profile_manager); - } - - void IsUserAccountSwitchLocked(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - FileSys::NACP nacp; - const auto res = system.GetAppLoader().ReadControlData(nacp); - - bool is_locked = false; - - if (res != Loader::ResultStatus::Success) { - const FileSys::PatchManager pm{system.GetApplicationProcessProgramID(), - system.GetFileSystemController(), - system.GetContentProvider()}; - const auto nacp_unique = pm.GetControlMetadata().first; - - if (nacp_unique != nullptr) { - is_locked = nacp_unique->GetUserAccountSwitchLock(); - } else { - LOG_ERROR(Service_ACC, "nacp_unique is null!"); - } - } else { - is_locked = nacp.GetUserAccountSwitchLock(); - } - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(is_locked); - } - - void InitializeApplicationInfoV2(HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void BeginUserRegistration(HLERequestContext& ctx) { - const auto user_id = Common::UUID::MakeRandom(); - profile_manager->CreateNewUser(user_id, "Eden"); - - LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); - - IPC::ResponseBuilder rb{ctx, 6}; - rb.Push(ResultSuccess); - rb.PushRaw(user_id); - } - - void CompleteUserRegistration(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); - - LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); - - profile_manager->WriteUserSaveFile(); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void DeleteUser(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); - LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); - if (!profile_manager->RemoveUser(user_id)) { - LOG_ERROR(Service_ACC, "Failed to delete user with uuid={}", user_id.RawString()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(1U); - return; - } - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void SetUserPosition(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - - u64 position = rp.Pop(); - Common::UUID user_id = rp.PopRaw(); - - LOG_DEBUG(Service_ACC, "called, position={} user_id={}", position, user_id.FormattedString()); - - profile_manager->SetUserPosition(position, user_id); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void GetProfileEditor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - Common::UUID user_id = rp.PopRaw(); - - LOG_DEBUG(Service_ACC, "called, user_id=0x{}", user_id.RawString()); - - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, user_id, *profile_manager); - } - - void GetBaasAccountAdministrator(HLERequestContext &ctx) { - IPC::RequestParser rp{ctx}; - const auto uuid = rp.PopRaw(); - - LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString()); - - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, uuid); - } - - void ListQualifiedUsers(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - - // All users should be qualified. We don't actually have parental control or anything to do with - // nintendo online currently. We're just going to assume the user running the game has access to - // the game regardless of parental control settings. - ctx.WriteBuffer(profile_manager->GetAllUsers()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void ListOpenContextStoredUsers(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - - ctx.WriteBuffer(profile_manager->GetStoredOpenedUsers()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - void StoreSaveDataThumbnailApplication(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto uuid = rp.PopRaw(); - - LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}", uuid.RawString()); - - // TODO(ogniK): Check if application ID is zero on acc initialize. As we don't have a reliable - // way of confirming things like the TID, we're going to assume a non zero value for the time - // being. - constexpr u64 tid{1}; - StoreSaveDataThumbnail(ctx, uuid, tid); - } - - void GetBaasAccountManagerForSystemService(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto uuid = rp.PopRaw(); - - LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString()); - - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(ResultSuccess); - rb.PushIpcInterface(ctx, system, uuid); - } - - void StoreSaveDataThumbnailSystem(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto uuid = rp.PopRaw(); - const auto tid = rp.Pop(); - - LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}, tid={:016X}", uuid.RawString(), tid); - StoreSaveDataThumbnail(ctx, uuid, tid); - } - - void GetPinCodeLength(HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(0); - } - - void TrySelectUserWithoutInteractionDeprecated(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - // A u8 is passed into this function which we can safely ignore. It's to determine if we have - // access to use the network or not by the looks of it - IPC::ResponseBuilder rb{ctx, 6}; - if (profile_manager->GetUserCount() != 1) { - rb.Push(ResultSuccess); - rb.PushRaw(Common::InvalidUUID); - return; - } - - const auto user_list = profile_manager->GetAllUsers(); - if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) { - rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code - rb.PushRaw(Common::InvalidUUID); - return; - } - - // Select the first user we have - rb.Push(ResultSuccess); - rb.PushRaw(profile_manager->GetUser(0)->uuid); - } - - void TrySelectUserWithoutInteraction(HLERequestContext& ctx) { - LOG_DEBUG(Service_ACC, "called"); - // A u8 is passed into this function which we can safely ignore. It's to determine if we have - // access to use the network or not by the looks of it - IPC::ResponseBuilder rb{ctx, 6}; - if (profile_manager->GetUserCount() != 1) { - rb.Push(ResultSuccess); - rb.PushRaw(Common::InvalidUUID); - return; - } - - const auto user_list = profile_manager->GetAllUsers(); - if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) { - rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code - rb.PushRaw(Common::InvalidUUID); - return; - } - - // Select the first user we have - rb.Push(ResultSuccess); - rb.PushRaw(profile_manager->GetUser(0)->uuid); - } - - private: - Result InitializeApplicationInfoBase() { - if (application_info) { - LOG_ERROR(Service_ACC, "Application already initialized"); - return Account::ResultApplicationInfoAlreadyInitialized; - } - - // TODO(ogniK): This should be changed to reflect the target process for when we have multiple - // processes emulated. As we don't actually have pid support we should assume we're just using - // our own process - Glue::ApplicationLaunchProperty launch_property{}; - const auto result = system.GetARPManager().GetLaunchProperty( - &launch_property, system.GetApplicationProcessProgramID()); - - if (result != ResultSuccess) { - LOG_ERROR(Service_ACC, "Failed to get launch property"); - return Account::ResultInvalidApplication; - } - - switch (launch_property.base_game_storage_id) { - case FileSys::StorageId::GameCard: - application_info.application_type = ApplicationType::GameCard; - break; - case FileSys::StorageId::Host: - case FileSys::StorageId::NandSystem: - case FileSys::StorageId::NandUser: - case FileSys::StorageId::SdCard: - case FileSys::StorageId::None: // Yuzu specific, differs from hardware - application_info.application_type = ApplicationType::Digital; - break; - default: - LOG_ERROR(Service_ACC, "Invalid game storage ID! storage_id={}", - launch_property.base_game_storage_id); - return Account::ResultInvalidApplication; - } - - LOG_WARNING(Service_ACC, "ApplicationInfo init required"); - // TODO(ogniK): Actual initialization here - - return ResultSuccess; - } - - void StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid, - const u64 tid) { - IPC::ResponseBuilder rb{ctx, 2}; - - if (tid == 0) { - LOG_ERROR(Service_ACC, "TitleID is not valid!"); - rb.Push(Account::ResultInvalidApplication); - return; - } - - if (uuid.IsInvalid()) { - LOG_ERROR(Service_ACC, "User ID is not valid!"); - rb.Push(Account::ResultInvalidUserId); - return; - } - const auto thumbnail_size = ctx.GetReadBufferSize(); - if (thumbnail_size != THUMBNAIL_SIZE) { - LOG_ERROR(Service_ACC, "Buffer size is empty! size={:X} expecting {:X}", thumbnail_size, - THUMBNAIL_SIZE); - rb.Push(Account::ResultInvalidArrayLength); - return; - } - - // TODO(ogniK): Construct save data thumbnail - rb.Push(ResultSuccess); - } - - enum class ApplicationType : u32_le { - GameCard = 0, - Digital = 1, - Unknown = 3, - }; - - struct ApplicationInfo { - Service::Glue::ApplicationLaunchProperty launch_property; - ApplicationType application_type; - - constexpr explicit operator bool() const { - return launch_property.title_id != 0x0; - } - }; - - ApplicationInfo application_info{}; - protected: - std::shared_ptr module; - std::shared_ptr profile_manager; - }; -}; + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(is_locked); +} + +void Module::Interface::InitializeApplicationInfoV2(HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + +void Module::Interface::BeginUserRegistration(HLERequestContext& ctx) { + const auto user_id = Common::UUID::MakeRandom(); + profile_manager->CreateNewUser(user_id, "Eden"); + + LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); + + IPC::ResponseBuilder rb{ctx, 6}; + rb.Push(ResultSuccess); + rb.PushRaw(user_id); +} + +void Module::Interface::CompleteUserRegistration(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); + + LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); + + profile_manager->WriteUserSaveFile(); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + +void Module::Interface::DeleteUser(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); + LOG_INFO(Service_ACC, "called, uuid={}", user_id.FormattedString()); + if (!profile_manager->RemoveUser(user_id)) { + LOG_ERROR(Service_ACC, "Failed to delete user with uuid={}", user_id.RawString()); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(1U); + return; + } + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + +void Module::Interface::SetUserPosition(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + + u64 position = rp.Pop(); + Common::UUID user_id = rp.PopRaw(); + + LOG_DEBUG(Service_ACC, "called, position={} user_id={}", position, user_id.FormattedString()); + + profile_manager->SetUserPosition(position, user_id); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + +void Module::Interface::GetProfileEditor(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + Common::UUID user_id = rp.PopRaw(); + + LOG_DEBUG(Service_ACC, "called, user_id=0x{}", user_id.RawString()); + + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, user_id, *profile_manager); +} + +void Module::Interface::GetBaasAccountAdministrator(HLERequestContext &ctx) { + IPC::RequestParser rp{ctx}; + const auto uuid = rp.PopRaw(); + + LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString()); + + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, uuid); +} + +void Module::Interface::ListQualifiedUsers(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + + // All users should be qualified. We don't actually have parental control or anything to do with + // nintendo online currently. We're just going to assume the user running the game has access to + // the game regardless of parental control settings. + ctx.WriteBuffer(profile_manager->GetAllUsers()); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + +void Module::Interface::ListOpenContextStoredUsers(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + + ctx.WriteBuffer(profile_manager->GetStoredOpenedUsers()); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + +void Module::Interface::StoreSaveDataThumbnailApplication(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + const auto uuid = rp.PopRaw(); + + LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}", uuid.RawString()); + + // TODO(ogniK): Check if application ID is zero on acc initialize. As we don't have a reliable + // way of confirming things like the TID, we're going to assume a non zero value for the time + // being. + constexpr u64 tid{1}; + StoreSaveDataThumbnail(ctx, uuid, tid); +} + +void Module::Interface::GetBaasAccountManagerForSystemService(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + const auto uuid = rp.PopRaw(); + + LOG_INFO(Service_ACC, "called, uuid=0x{}", uuid.RawString()); + + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(ResultSuccess); + rb.PushIpcInterface(ctx, system, uuid); +} + +void Module::Interface::StoreSaveDataThumbnailSystem(HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + const auto uuid = rp.PopRaw(); + const auto tid = rp.Pop(); + + LOG_WARNING(Service_ACC, "(STUBBED) called, uuid=0x{}, tid={:016X}", uuid.RawString(), tid); + StoreSaveDataThumbnail(ctx, uuid, tid); +} + +void Module::Interface::GetPinCodeLength(HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(0); +} + +void Module::Interface::StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid, + const u64 tid) { + IPC::ResponseBuilder rb{ctx, 2}; + + if (tid == 0) { + LOG_ERROR(Service_ACC, "TitleID is not valid!"); + rb.Push(Account::ResultInvalidApplication); + return; + } + + if (uuid.IsInvalid()) { + LOG_ERROR(Service_ACC, "User ID is not valid!"); + rb.Push(Account::ResultInvalidUserId); + return; + } + const auto thumbnail_size = ctx.GetReadBufferSize(); + if (thumbnail_size != THUMBNAIL_SIZE) { + LOG_ERROR(Service_ACC, "Buffer size is empty! size={:X} expecting {:X}", thumbnail_size, + THUMBNAIL_SIZE); + rb.Push(Account::ResultInvalidArrayLength); + return; + } + + // TODO(ogniK): Construct save data thumbnail + rb.Push(ResultSuccess); +} + +void Module::Interface::TrySelectUserWithoutInteractionDeprecated(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + // A u8 is passed into this function which we can safely ignore. It's to determine if we have + // access to use the network or not by the looks of it + IPC::ResponseBuilder rb{ctx, 6}; + if (profile_manager->GetUserCount() != 1) { + rb.Push(ResultSuccess); + rb.PushRaw(Common::InvalidUUID); + return; + } + + const auto user_list = profile_manager->GetAllUsers(); + if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) { + rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code + rb.PushRaw(Common::InvalidUUID); + return; + } + + // Select the first user we have + rb.Push(ResultSuccess); + rb.PushRaw(profile_manager->GetUser(0)->uuid); +} + +void Module::Interface::TrySelectUserWithoutInteraction(HLERequestContext& ctx) { + LOG_DEBUG(Service_ACC, "called"); + // A u8 is passed into this function which we can safely ignore. It's to determine if we have + // access to use the network or not by the looks of it + IPC::ResponseBuilder rb{ctx, 6}; + if (profile_manager->GetUserCount() != 1) { + rb.Push(ResultSuccess); + rb.PushRaw(Common::InvalidUUID); + return; + } + + const auto user_list = profile_manager->GetAllUsers(); + if (std::ranges::all_of(user_list, [](const auto& user) { return user.IsInvalid(); })) { + rb.Push(ResultUnknown); // TODO(ogniK): Find the correct error code + rb.PushRaw(Common::InvalidUUID); + return; + } + + // Select the first user we have + rb.Push(ResultSuccess); + rb.PushRaw(profile_manager->GetUser(0)->uuid); +} + +Module::Interface::Interface(std::shared_ptr module_, + std::shared_ptr profile_manager_, + Core::System& system_, const char* name) + : ServiceFramework{system_, name}, module{std::move(module_)}, + profile_manager{std::move(profile_manager_)} {} + +Module::Interface::~Interface() = default; class ACC_AA final : public Module::Interface { public: explicit ACC_AA(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:aa") {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:aa") { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "EnsureCacheAsync"}, + {1, nullptr, "LoadCache"}, + {2, nullptr, "GetDeviceAccountId"}, + {50, nullptr, "RegisterNotificationTokenAsync"}, // 1.0.0 - 6.2.0 + {51, nullptr, "UnregisterNotificationTokenAsync"}, // 1.0.0 - 6.2.0 + }; + // clang-format on + RegisterHandlers(functions); } ~ACC_AA() override = default; - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "EnsureCacheAsync"}, - FunctionInfo{1, nullptr, "LoadCache"}, - FunctionInfo{2, nullptr, "GetDeviceAccountId"}, - FunctionInfo{50, nullptr, "RegisterNotificationTokenAsync", MakeVersionGate({1,0,0}, {6,2,0})}, - FunctionInfo{51, nullptr, "UnregisterNotificationTokenAsync", MakeVersionGate({1,0,0}, {6,2,0})} - ); }; class ACC_SU final : public Module::Interface { public: explicit ACC_SU(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:su") {} + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:su") { + // clang-format off + static const FunctionInfo functions[] = { + {0, &ACC_SU::GetUserCount, "GetUserCount"}, + {1, &ACC_SU::GetUserExistence, "GetUserExistence"}, + {2, &ACC_SU::ListAllUsers, "ListAllUsers"}, + {3, &ACC_SU::ListOpenUsers, "ListOpenUsers"}, + {4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"}, + {5, &ACC_SU::GetProfile, "GetProfile"}, + {6, nullptr, "GetProfileDigest"}, + {50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, + {51, &ACC_SU::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, + {52, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, // 19.0.0+ + {60, &ACC_SU::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, + {99, nullptr, "DebugActivateOpenContextRetention"}, + {100, nullptr, "GetUserRegistrationNotifier"}, + {101, nullptr, "GetUserStateChangeNotifier"}, + {102, &ACC_SU::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"}, + {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, + {104, nullptr, "GetProfileUpdateNotifier"}, + {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, + {106, nullptr, "GetProfileSyncNotifier"}, + {110, &ACC_SU::StoreSaveDataThumbnailSystem, "StoreSaveDataThumbnail"}, + {111, nullptr, "ClearSaveDataThumbnail"}, + {112, nullptr, "LoadSaveDataThumbnail"}, + {113, nullptr, "GetSaveDataThumbnailExistence"}, + {120, nullptr, "ListOpenUsersInApplication"}, + {130, nullptr, "ActivateOpenContextRetention"}, + {140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"}, + {150, nullptr, "AuthenticateApplicationAsync"}, + {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, + {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, + {190, nullptr, "GetUserLastOpenedApplication"}, + {191, nullptr, "ActivateOpenContextHolder"}, + {200, &ACC_SU::BeginUserRegistration, "BeginUserRegistration"}, + {201, &ACC_SU::CompleteUserRegistration, "CompleteUserRegistration"}, + {202, nullptr, "CancelUserRegistration"}, + {203, &ACC_SU::DeleteUser, "DeleteUser"}, + {204, &ACC_SU::SetUserPosition, "SetUserPosition"}, + {205, &ACC_SU::GetProfileEditor, "GetProfileEditor"}, + {206, nullptr, "CompleteUserRegistrationForcibly"}, + {210, nullptr, "CreateFloatingRegistrationRequest"}, + {211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, + {212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"}, + {230, nullptr, "AuthenticateServiceAsync"}, + {250, &ACC_SU::GetBaasAccountAdministrator, "GetBaasAccountAdministrator"}, + {290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, + {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, + {299, nullptr, "SuspendBackgroundDaemon"}, + {400, nullptr, "SetPinCode"}, // 18.0.0+ + {401, &ACC_SU::GetPinCodeLength, "GetPinCodeLength"}, // 18.0.0+ + {402, nullptr, "GetPinCode"}, // 18.0.0+ + {403, nullptr, "GetPinCodeParity"}, + {404, nullptr, "VerifyPinCode"}, + {405, nullptr, "IsPinCodeVerificationForbidden"}, + {410, nullptr, "GetPinCodeErrorCount"}, // 18.0.0+ + {411, nullptr, "ResetPinCodeErrorCount"}, // 18.0.0+ + {412, nullptr, "IncrementPinCodeErrorCount"}, // 18.0.0+ + {900, nullptr, "SetUserUnqualifiedForDebug"}, + {901, nullptr, "UnsetUserUnqualifiedForDebug"}, + {902, nullptr, "ListUsersUnqualifiedForDebug"}, + {910, nullptr, "RefreshFirmwareSettingsForDebug"}, + {997, nullptr, "DebugInvalidateTokenCacheForUser"}, + {998, nullptr, "DebugSetUserStateClose"}, + {999, nullptr, "DebugSetUserStateOpen"}, + }; + // clang-format on - ~ACC_SU() override = default; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &ACC_SU::GetUserCount, "GetUserCount"}, - FunctionInfo{1, &ACC_SU::GetUserExistence, "GetUserExistence"}, - FunctionInfo{2, &ACC_SU::ListAllUsers, "ListAllUsers"}, - FunctionInfo{3, &ACC_SU::ListOpenUsers, "ListOpenUsers"}, - FunctionInfo{4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"}, - FunctionInfo{5, &ACC_SU::GetProfile, "GetProfile"}, - FunctionInfo{6, nullptr, "GetProfileDigest"}, - FunctionInfo{50, &ACC_SU::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, - FunctionInfo{51, &ACC_SU::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, - FunctionInfo{52, &ACC_SU::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction", MakeVersionGate({19,0,0})}, - FunctionInfo{60, &ACC_SU::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, - FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"}, - FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"}, - FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"}, - FunctionInfo{102, &ACC_SU::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"}, - FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, - FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"}, - FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, - FunctionInfo{106, nullptr, "GetProfileSyncNotifier"}, - FunctionInfo{110, &ACC_SU::StoreSaveDataThumbnailSystem, "StoreSaveDataThumbnail"}, - FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"}, - FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"}, - FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"}, - FunctionInfo{120, nullptr, "ListOpenUsersInApplication"}, - FunctionInfo{130, nullptr, "ActivateOpenContextRetention"}, - FunctionInfo{140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"}, - FunctionInfo{150, nullptr, "AuthenticateApplicationAsync"}, - FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, - FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, - FunctionInfo{190, nullptr, "GetUserLastOpenedApplication"}, - FunctionInfo{191, nullptr, "ActivateOpenContextHolder"}, - FunctionInfo{200, &ACC_SU::BeginUserRegistration, "BeginUserRegistration"}, - FunctionInfo{201, &ACC_SU::CompleteUserRegistration, "CompleteUserRegistration"}, - FunctionInfo{202, nullptr, "CancelUserRegistration"}, - FunctionInfo{203, &ACC_SU::DeleteUser, "DeleteUser"}, - FunctionInfo{204, &ACC_SU::SetUserPosition, "SetUserPosition"}, - FunctionInfo{205, &ACC_SU::GetProfileEditor, "GetProfileEditor"}, - FunctionInfo{206, nullptr, "CompleteUserRegistrationForcibly"}, - FunctionInfo{210, nullptr, "CreateFloatingRegistrationRequest"}, - FunctionInfo{211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, - FunctionInfo{212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"}, - FunctionInfo{230, nullptr, "AuthenticateServiceAsync"}, - FunctionInfo{250, &ACC_SU::GetBaasAccountAdministrator, "GetBaasAccountAdministrator"}, - FunctionInfo{290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, - FunctionInfo{291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, - FunctionInfo{299, nullptr, "SuspendBackgroundDaemon"}, - FunctionInfo{400, nullptr, "SetPinCode", MakeVersionGate({18,0,0})}, - FunctionInfo{401, &ACC_SU::GetPinCodeLength, "GetPinCodeLength", MakeVersionGate({18,0,0})}, - FunctionInfo{402, nullptr, "GetPinCode", MakeVersionGate({18,0,0})}, - FunctionInfo{403, nullptr, "GetPinCodeParity"}, - FunctionInfo{404, nullptr, "VerifyPinCode"}, - FunctionInfo{405, nullptr, "IsPinCodeVerificationForbidden"}, - FunctionInfo{410, nullptr, "GetPinCodeErrorCount", MakeVersionGate({18,0,0})}, - FunctionInfo{411, nullptr, "ResetPinCodeErrorCount", MakeVersionGate({18,0,0})}, - FunctionInfo{412, nullptr, "IncrementPinCodeErrorCount", MakeVersionGate({18,0,0})}, - FunctionInfo{900, nullptr, "SetUserUnqualifiedForDebug"}, - FunctionInfo{901, nullptr, "UnsetUserUnqualifiedForDebug"}, - FunctionInfo{902, nullptr, "ListUsersUnqualifiedForDebug"}, - FunctionInfo{910, nullptr, "RefreshFirmwareSettingsForDebug"}, - FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"}, - FunctionInfo{998, nullptr, "DebugSetUserStateClose"}, - FunctionInfo{999, nullptr, "DebugSetUserStateOpen"} - ); + ~ACC_SU() override = default; }; class ACC_U0 final : public Module::Interface { public: ACC_U0(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u0") {} + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u0") { + // clang-format off + static const FunctionInfo functions[] = { + {0, &ACC_U0::GetUserCount, "GetUserCount"}, + {1, &ACC_U0::GetUserExistence, "GetUserExistence"}, + {2, &ACC_U0::ListAllUsers, "ListAllUsers"}, + {3, &ACC_U0::ListOpenUsers, "ListOpenUsers"}, + {4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"}, + {5, &ACC_U0::GetProfile, "GetProfile"}, + {6, nullptr, "GetProfileDigest"}, // 3.0.0+ + {50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, + {51, &ACC_U0::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, + {52, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, + {60, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 5.0.0 - 5.1.0 + {99, nullptr, "DebugActivateOpenContextRetention"}, // 6.0.0+ + {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"}, + {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"}, + {102, nullptr, "AuthenticateApplicationAsync"}, + {103, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+ + {110, &ACC_U0::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"}, + {111, nullptr, "ClearSaveDataThumbnail"}, + {120, nullptr, "CreateGuestLoginRequest"}, + {130, nullptr, "LoadOpenContext"}, // 5.0.0+ + {131, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 6.0.0+ + {140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted"}, // 6.0.0+ + {141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers"}, // 6.0.0+ + {150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked"}, // 6.0.0+ + {160, &ACC_U0::InitializeApplicationInfoV2, "InitializeApplicationInfoV2"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } ~ACC_U0() override = default; - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &ACC_U0::GetUserCount, "GetUserCount"}, - FunctionInfo{1, &ACC_U0::GetUserExistence, "GetUserExistence"}, - FunctionInfo{2, &ACC_U0::ListAllUsers, "ListAllUsers"}, - FunctionInfo{3, &ACC_U0::ListOpenUsers, "ListOpenUsers"}, - FunctionInfo{4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"}, - FunctionInfo{5, &ACC_U0::GetProfile, "GetProfile"}, - FunctionInfo{6, nullptr, "GetProfileDigest", MakeVersionGate({3,0,0})}, - FunctionInfo{50, &ACC_U0::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, - FunctionInfo{51, &ACC_U0::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, - FunctionInfo{52, &ACC_U0::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, - FunctionInfo{60, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers", MakeVersionGate({5,0,0}, {5,1,0})}, - FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention", MakeVersionGate({6,0,0})}, - FunctionInfo{100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"}, - FunctionInfo{101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"}, - FunctionInfo{102, nullptr, "AuthenticateApplicationAsync"}, - FunctionInfo{103, nullptr, "CheckNetworkServiceAvailabilityAsync", MakeVersionGate({4,0,0})}, - FunctionInfo{110, &ACC_U0::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"}, - FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"}, - FunctionInfo{120, nullptr, "CreateGuestLoginRequest"}, - FunctionInfo{130, nullptr, "LoadOpenContext", MakeVersionGate({5,0,0})}, - FunctionInfo{131, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers", MakeVersionGate({6,0,0})}, - FunctionInfo{140, &ACC_U0::InitializeApplicationInfoRestricted, "InitializeApplicationInfoRestricted", MakeVersionGate({6,0,0})}, - FunctionInfo{141, &ACC_U0::ListQualifiedUsers, "ListQualifiedUsers", MakeVersionGate({6,0,0})}, - FunctionInfo{150, &ACC_U0::IsUserAccountSwitchLocked, "IsUserAccountSwitchLocked", MakeVersionGate({6,0,0})}, - FunctionInfo{160, &ACC_U0::InitializeApplicationInfoV2, "InitializeApplicationInfoV2"} - ); }; class ACC_U1 final : public Module::Interface { public: ACC_U1(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u1") {} + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:u1") { + // clang-format off + static const FunctionInfo functions[] = { + {0, &ACC_U1::GetUserCount, "GetUserCount"}, + {1, &ACC_U1::GetUserExistence, "GetUserExistence"}, + {2, &ACC_U1::ListAllUsers, "ListAllUsers"}, + {3, &ACC_U1::ListOpenUsers, "ListOpenUsers"}, + {4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"}, + {5, &ACC_U1::GetProfile, "GetProfile"}, + {6, nullptr, "GetProfileDigest"}, + {50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, + {51, &ACC_U1::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, + {52, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, + {60, &ACC_U1::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, + {99, nullptr, "DebugActivateOpenContextRetention"}, + {100, nullptr, "GetUserRegistrationNotifier"}, + {101, nullptr, "GetUserStateChangeNotifier"}, + {102, &ACC_U1::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"}, + {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, + {104, nullptr, "GetProfileUpdateNotifier"}, + {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, + {106, nullptr, "GetProfileSyncNotifier"}, + {110, &ACC_U1::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"}, + {111, nullptr, "ClearSaveDataThumbnail"}, + {112, nullptr, "LoadSaveDataThumbnail"}, + {113, nullptr, "GetSaveDataThumbnailExistence"}, + {120, nullptr, "ListOpenUsersInApplication"}, + {130, nullptr, "ActivateOpenContextRetention"}, + {140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"}, + {150, nullptr, "AuthenticateApplicationAsync"}, + {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, + {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, + {190, nullptr, "GetUserLastOpenedApplication"}, + {191, nullptr, "ActivateOpenContextHolder"}, + {401, &ACC_U1::GetPinCodeLength, "GetPinCodeLength"}, // 18.0.0+ + {402, nullptr, "GetPinCode"}, // 18.0.0+ + {997, nullptr, "DebugInvalidateTokenCacheForUser"}, + {998, nullptr, "DebugSetUserStateClose"}, + {999, nullptr, "DebugSetUserStateOpen"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } ~ACC_U1() override = default; - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &ACC_U1::GetUserCount, "GetUserCount"}, - FunctionInfo{1, &ACC_U1::GetUserExistence, "GetUserExistence"}, - FunctionInfo{2, &ACC_U1::ListAllUsers, "ListAllUsers"}, - FunctionInfo{3, &ACC_U1::ListOpenUsers, "ListOpenUsers"}, - FunctionInfo{4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"}, - FunctionInfo{5, &ACC_U1::GetProfile, "GetProfile"}, - FunctionInfo{6, nullptr, "GetProfileDigest"}, - FunctionInfo{50, &ACC_U1::IsUserRegistrationRequestPermitted, "IsUserRegistrationRequestPermitted"}, - FunctionInfo{51, &ACC_U1::TrySelectUserWithoutInteractionDeprecated, "TrySelectUserWithoutInteractionDeprecated"}, - FunctionInfo{52, &ACC_U1::TrySelectUserWithoutInteraction, "TrySelectUserWithoutInteraction"}, - FunctionInfo{60, &ACC_U1::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, - FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"}, - FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"}, - FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"}, - FunctionInfo{102, &ACC_U1::GetBaasAccountManagerForSystemService, "GetBaasAccountManagerForSystemService"}, - FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, - FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"}, - FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, - FunctionInfo{106, nullptr, "GetProfileSyncNotifier"}, - FunctionInfo{110, &ACC_U1::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"}, - FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"}, - FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"}, - FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"}, - FunctionInfo{120, nullptr, "ListOpenUsersInApplication"}, - FunctionInfo{130, nullptr, "ActivateOpenContextRetention"}, - FunctionInfo{140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"}, - FunctionInfo{150, nullptr, "AuthenticateApplicationAsync"}, - FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, - FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, - FunctionInfo{190, nullptr, "GetUserLastOpenedApplication"}, - FunctionInfo{191, nullptr, "ActivateOpenContextHolder"}, - FunctionInfo{401, &ACC_U1::GetPinCodeLength, "GetPinCodeLength", MakeVersionGate({18,0,0})}, - FunctionInfo{402, nullptr, "GetPinCode", MakeVersionGate({18,0,0})}, - FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"}, - FunctionInfo{998, nullptr, "DebugSetUserStateClose"}, - FunctionInfo{999, nullptr, "DebugSetUserStateOpen"} - ); }; class DAUTH_0 final : public ServiceFramework { public: - explicit DAUTH_0(Core::System& system_) : ServiceFramework{system_, "dauth:0"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit DAUTH_0(Core::System& system_) : ServiceFramework{system_, "dauth:0"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "EnsureAuthenticationTokenCacheAsync"}, + {1, nullptr, "LoadAuthenticationTokenCache"}, + {2, nullptr, "InvalidateAuthenticationTokenCache"}, + {3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"}, + {10, nullptr, "EnsureEdgeTokenCacheAsync"}, + {11, nullptr, "LoadEdgeTokenCache"}, + {12, nullptr, "InvalidateEdgeTokenCache"}, + {13, nullptr, "IsEdgeTokenCacheAvailable"}, + {20, nullptr, "EnsureApplicationAuthenticationCacheAsync"}, + {21, nullptr, "LoadApplicationAuthenticationTokenCache"}, + {22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"}, + {23, nullptr, "IsApplicationAuthenticationCacheAvailable"}, + {24, nullptr, "InvalidateApplicationAuthenticationCache"}, + {30, nullptr, "EnsureGameCardAuthenticationCacheAsync"}, + {31, nullptr, "LoadGameCardAuthenticationTokenCache"}, + {32, nullptr, "IsGameCardAuthenticationCacheAvailable"}, + {33, nullptr, "InvalidateGameCardAuthenticationCache"}, + {1000, nullptr, "GetInactiveElicenseUsedEvent"}, + {9000, nullptr, "ImportVirtualClientCertificate"}, + {9010, nullptr, "DeleteVirtualClientCertificate"}, + }; + // clang-format on + RegisterHandlers(functions); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "EnsureAuthenticationTokenCacheAsync"}, - FunctionInfo{1, nullptr, "LoadAuthenticationTokenCache"}, - FunctionInfo{2, nullptr, "InvalidateAuthenticationTokenCache"}, - FunctionInfo{3, nullptr, "IsDeviceAuthenticationTokenCacheAvailable"}, - FunctionInfo{10, nullptr, "EnsureEdgeTokenCacheAsync"}, - FunctionInfo{11, nullptr, "LoadEdgeTokenCache"}, - FunctionInfo{12, nullptr, "InvalidateEdgeTokenCache"}, - FunctionInfo{13, nullptr, "IsEdgeTokenCacheAvailable"}, - FunctionInfo{20, nullptr, "EnsureApplicationAuthenticationCacheAsync"}, - FunctionInfo{21, nullptr, "LoadApplicationAuthenticationTokenCache"}, - FunctionInfo{22, nullptr, "LoadApplicationNetworkServiceClientConfigCache"}, - FunctionInfo{23, nullptr, "IsApplicationAuthenticationCacheAvailable"}, - FunctionInfo{24, nullptr, "InvalidateApplicationAuthenticationCache"}, - FunctionInfo{30, nullptr, "EnsureGameCardAuthenticationCacheAsync"}, - FunctionInfo{31, nullptr, "LoadGameCardAuthenticationTokenCache"}, - FunctionInfo{32, nullptr, "IsGameCardAuthenticationCacheAvailable"}, - FunctionInfo{33, nullptr, "InvalidateGameCardAuthenticationCache"}, - FunctionInfo{1000, nullptr, "GetInactiveElicenseUsedEvent"}, - FunctionInfo{9000, nullptr, "ImportVirtualClientCertificate"}, - FunctionInfo{9010, nullptr, "DeleteVirtualClientCertificate"} - ); }; class ACC_E final : public Module::Interface { public: explicit ACC_E(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e") {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetUserCount"}, - FunctionInfo{1, nullptr, "GetUserExistence"}, - FunctionInfo{2, nullptr, "ListAllUsers"}, - FunctionInfo{3, nullptr, "ListOpenUsers"}, - FunctionInfo{4, nullptr, "GetLastOpenedUser"}, - FunctionInfo{5, nullptr, "GetProfile"}, - FunctionInfo{6, nullptr, "GetProfileDigest"}, - FunctionInfo{50, nullptr, "IsUserRegistrationRequestPermitted"}, - FunctionInfo{51, nullptr, "TrySelectUserWithoutInteractionDeprecated"}, - FunctionInfo{52, nullptr, "TrySelectUserWithoutInteraction"}, - FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"}, - FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"}, - FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"}, - FunctionInfo{102, nullptr, "GetBaasAccountManagerForSystemService"}, - FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, - FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"}, - FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, - FunctionInfo{106, nullptr, "GetProfileSyncNotifier"}, - FunctionInfo{110, nullptr, "StoreSaveDataThumbnail"}, - FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"}, - FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"}, - FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"}, - FunctionInfo{120, nullptr, "ListOpenUsersInApplication"}, - FunctionInfo{130, nullptr, "ActivateOpenContextRetention"}, - FunctionInfo{140, nullptr, "ListQualifiedUsers"}, - FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, - FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, - FunctionInfo{170, nullptr, "GetNasOp2MembershipStateChangeNotifier"}, - FunctionInfo{191, nullptr, "UpdateNotificationReceiverInfo"}, - FunctionInfo{200, nullptr, "BeginUserRegistration"}, - FunctionInfo{201, nullptr, "CompleteUserRegistration"}, - FunctionInfo{202, nullptr, "CancelUserRegistration"}, - FunctionInfo{203, nullptr, "DeleteUser"}, - FunctionInfo{204, nullptr, "SetUserPosition"}, - FunctionInfo{205, nullptr, "GetProfileEditor"}, - FunctionInfo{206, nullptr, "CompleteUserRegistrationForcibly"}, - FunctionInfo{210, nullptr, "CreateFloatingRegistrationRequest"}, - FunctionInfo{211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, - FunctionInfo{212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"}, - FunctionInfo{213, nullptr, "CreateProcedureToCreateUserWithNintendoAccount"}, - FunctionInfo{214, nullptr, "ResumeProcedureToCreateUserWithNintendoAccount"}, - FunctionInfo{215, nullptr, "ResumeProcedureToCreateUserWithNintendoAccountAfterApplyResponse"}, - FunctionInfo{230, nullptr, "AuthenticateServiceAsync"}, - FunctionInfo{250, nullptr, "GetBaasAccountAdministrator"}, - FunctionInfo{251, nullptr, "SynchronizeNetworkServiceAccountsSnapshotAsync"}, - FunctionInfo{290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, - FunctionInfo{291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, - FunctionInfo{292, nullptr, "ProxyProcedureForDeviceMigrationAuthenticatingOperatingUser"}, - FunctionInfo{293, nullptr, "ProxyProcedureForDeviceMigrationDownload"}, - FunctionInfo{299, nullptr, "SuspendBackgroundDaemon"}, - FunctionInfo{350, nullptr, "CreateDeviceMigrationUserExportRequest"}, - FunctionInfo{351, nullptr, "UploadNasCredential"}, - FunctionInfo{352, nullptr, "CreateDeviceMigrationUserImportRequest"}, - FunctionInfo{353, nullptr, "DeleteUserMigrationSaveData"}, - FunctionInfo{400, nullptr, "SetPinCode"}, - FunctionInfo{401, nullptr, "GetPinCodeLength"}, - FunctionInfo{402, nullptr, "GetPinCode"}, - FunctionInfo{403, nullptr, "GetPinCodeParity"}, - FunctionInfo{404, nullptr, "VerifyPinCode"}, - FunctionInfo{405, nullptr, "IsPinCodeVerificationForbidden"}, - FunctionInfo{410, nullptr, "GetPinCodeErrorCount"}, - FunctionInfo{411, nullptr, "ResetPinCodeErrorCount"}, - FunctionInfo{412, nullptr, "IncrementPinCodeErrorCount"}, - FunctionInfo{413, nullptr, "SetPinCodeErrorCount"}, - FunctionInfo{420, nullptr, "SetStartPenaltyTime"}, - FunctionInfo{421, nullptr, "GetStartPenaltyTime"}, - FunctionInfo{900, nullptr, "SetUserUnqualifiedForDebug"}, - FunctionInfo{901, nullptr, "UnsetUserUnqualifiedForDebug"}, - FunctionInfo{902, nullptr, "ListUsersUnqualifiedForDebug"}, - FunctionInfo{910, nullptr, "RefreshFirmwareSettingsForDebug"}, - FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"}, - FunctionInfo{998, nullptr, "DebugSetUserStateClose"}, - FunctionInfo{999, nullptr, "DebugSetUserStateOpen"}, - FunctionInfo{1000, nullptr, "CreateIAccountEntityServiceForApplication"}, - FunctionInfo{1100, nullptr, "CreateIUserStateManager"}, - FunctionInfo{10050, nullptr, "IsUserRegistrationRequestPermittedForAccountPolicy"}, - FunctionInfo{10105, nullptr, "CheckNetworkServiceAvailabilityAsyncForAccountPolicy"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e") { + // clang-format off + static const FunctionInfo functions[] = { + { 0, nullptr, "GetUserCount"}, + { 1, nullptr, "GetUserExistence"}, + { 2, nullptr, "ListAllUsers"}, + { 3, nullptr, "ListOpenUsers"}, + { 4, nullptr, "GetLastOpenedUser"}, + { 5, nullptr, "GetProfile"}, + { 6, nullptr, "GetProfileDigest"}, + { 50, nullptr, "IsUserRegistrationRequestPermitted"}, + { 51, nullptr, "TrySelectUserWithoutInteractionDeprecated"}, + { 52, nullptr, "TrySelectUserWithoutInteraction"}, + { 99, nullptr, "DebugActivateOpenContextRetention"}, + { 100, nullptr, "GetUserRegistrationNotifier"}, + { 101, nullptr, "GetUserStateChangeNotifier"}, + { 102, nullptr, "GetBaasAccountManagerForSystemService"}, + { 103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, + { 104, nullptr, "GetProfileUpdateNotifier"}, + { 105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, + { 106, nullptr, "GetProfileSyncNotifier"}, + { 110, nullptr, "StoreSaveDataThumbnail"}, + { 111, nullptr, "ClearSaveDataThumbnail"}, + { 112, nullptr, "LoadSaveDataThumbnail"}, + { 113, nullptr, "GetSaveDataThumbnailExistence"}, + { 120, nullptr, "ListOpenUsersInApplication"}, + { 130, nullptr, "ActivateOpenContextRetention"}, + { 140, nullptr, "ListQualifiedUsers"}, + { 151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, + { 152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, + { 170, nullptr, "GetNasOp2MembershipStateChangeNotifier"}, + { 191, nullptr, "UpdateNotificationReceiverInfo"}, + { 200, nullptr, "BeginUserRegistration"}, + { 201, nullptr, "CompleteUserRegistration"}, + { 202, nullptr, "CancelUserRegistration"}, + { 203, nullptr, "DeleteUser"}, + { 204, nullptr, "SetUserPosition"}, + { 205, nullptr, "GetProfileEditor"}, + { 206, nullptr, "CompleteUserRegistrationForcibly"}, + { 210, nullptr, "CreateFloatingRegistrationRequest"}, + { 211, nullptr, "CreateProcedureToRegisterUserWithNintendoAccount"}, + { 212, nullptr, "ResumeProcedureToRegisterUserWithNintendoAccount"}, + { 213, nullptr, "CreateProcedureToCreateUserWithNintendoAccount"}, + { 214, nullptr, "ResumeProcedureToCreateUserWithNintendoAccount"}, + { 215, nullptr, "ResumeProcedureToCreateUserWithNintendoAccountAfterApplyResponse"}, + { 230, nullptr, "AuthenticateServiceAsync"}, + { 250, nullptr, "GetBaasAccountAdministrator"}, + { 251, nullptr, "SynchronizeNetworkServiceAccountsSnapshotAsync"}, + { 290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, + { 291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, + { 292, nullptr, "ProxyProcedureForDeviceMigrationAuthenticatingOperatingUser"}, + { 293, nullptr, "ProxyProcedureForDeviceMigrationDownload"}, + { 299, nullptr, "SuspendBackgroundDaemon"}, + { 350, nullptr, "CreateDeviceMigrationUserExportRequest"}, + { 351, nullptr, "UploadNasCredential"}, + { 352, nullptr, "CreateDeviceMigrationUserImportRequest"}, + { 353, nullptr, "DeleteUserMigrationSaveData"}, + { 400, nullptr, "SetPinCode"}, + { 401, nullptr, "GetPinCodeLength"}, + { 402, nullptr, "GetPinCode"}, + { 403, nullptr, "GetPinCodeParity"}, + { 404, nullptr, "VerifyPinCode"}, + { 405, nullptr, "IsPinCodeVerificationForbidden"}, + { 410, nullptr, "GetPinCodeErrorCount"}, + { 411, nullptr, "ResetPinCodeErrorCount"}, + { 412, nullptr, "IncrementPinCodeErrorCount"}, + { 413, nullptr, "SetPinCodeErrorCount"}, + { 420, nullptr, "SetStartPenaltyTime"}, + { 421, nullptr, "GetStartPenaltyTime"}, + { 900, nullptr, "SetUserUnqualifiedForDebug"}, + { 901, nullptr, "UnsetUserUnqualifiedForDebug"}, + { 902, nullptr, "ListUsersUnqualifiedForDebug"}, + { 910, nullptr, "RefreshFirmwareSettingsForDebug"}, + { 997, nullptr, "DebugInvalidateTokenCacheForUser"}, + { 998, nullptr, "DebugSetUserStateClose"}, + { 999, nullptr, "DebugSetUserStateOpen"}, + { 1000, nullptr, "CreateIAccountEntityServiceForApplication"}, + { 1100, nullptr, "CreateIUserStateManager"}, + { 10050, nullptr, "IsUserRegistrationRequestPermittedForAccountPolicy"}, + { 10105, nullptr, "CheckNetworkServiceAvailabilityAsyncForAccountPolicy"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class ACC_E_U1 final : public Module::Interface { public: explicit ACC_E_U1(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u1") {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetUserCount"}, - FunctionInfo{1, nullptr, "GetUserExistence"}, - FunctionInfo{2, nullptr, "ListAllUsers"}, - FunctionInfo{3, nullptr, "ListOpenUsers"}, - FunctionInfo{4, nullptr, "GetLastOpenedUser"}, - FunctionInfo{5, nullptr, "GetProfile"}, - FunctionInfo{6, nullptr, "GetProfileDigest"}, - FunctionInfo{50, nullptr, "IsUserRegistrationRequestPermitted"}, - FunctionInfo{51, nullptr, "TrySelectUserWithoutInteractionDeprecated"}, - FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"}, - FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"}, - FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"}, - FunctionInfo{102, nullptr, "GetBaasAccountManagerForSystemService"}, - FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, - FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"}, - FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, - FunctionInfo{106, nullptr, "GetProfileSyncNotifier"}, - FunctionInfo{110, nullptr, "StoreSaveDataThumbnail"}, - FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"}, - FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"}, - FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"}, - FunctionInfo{120, nullptr, "ListOpenUsersInApplication"}, - FunctionInfo{130, nullptr, "ActivateOpenContextRetention"}, - FunctionInfo{140, nullptr, "ListQualifiedUsers"}, - FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, - FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, - FunctionInfo{170, nullptr, "GetNasOp2MembershipStateChangeNotifier"}, - FunctionInfo{191, nullptr, "UpdateNotificationReceiverInfo"}, - FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"}, - FunctionInfo{998, nullptr, "DebugSetUserStateClose"}, - FunctionInfo{999, nullptr, "DebugSetUserStateOpen"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u1") { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetUserCount"}, + {1, nullptr, "GetUserExistence"}, + {2, nullptr, "ListAllUsers"}, + {3, nullptr, "ListOpenUsers"}, + {4, nullptr, "GetLastOpenedUser"}, + {5, nullptr, "GetProfile"}, + {6, nullptr, "GetProfileDigest"}, + {50, nullptr, "IsUserRegistrationRequestPermitted"}, + {51, nullptr, "TrySelectUserWithoutInteractionDeprecated"}, + {99, nullptr, "DebugActivateOpenContextRetention"}, + {100, nullptr, "GetUserRegistrationNotifier"}, + {101, nullptr, "GetUserStateChangeNotifier"}, + {102, nullptr, "GetBaasAccountManagerForSystemService"}, + {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, + {104, nullptr, "GetProfileUpdateNotifier"}, + {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, + {106, nullptr, "GetProfileSyncNotifier"}, + {110, nullptr, "StoreSaveDataThumbnail"}, + {111, nullptr, "ClearSaveDataThumbnail"}, + {112, nullptr, "LoadSaveDataThumbnail"}, + {113, nullptr, "GetSaveDataThumbnailExistence"}, + {120, nullptr, "ListOpenUsersInApplication"}, + {130, nullptr, "ActivateOpenContextRetention"}, + {140, nullptr, "ListQualifiedUsers"}, + {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, + {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, + {170, nullptr, "GetNasOp2MembershipStateChangeNotifier"}, + {191, nullptr, "UpdateNotificationReceiverInfo"}, + {997, nullptr, "DebugInvalidateTokenCacheForUser"}, + {998, nullptr, "DebugSetUserStateClose"}, + {999, nullptr, "DebugSetUserStateOpen"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class ACC_E_U2 final : public Module::Interface { public: explicit ACC_E_U2(std::shared_ptr module_, std::shared_ptr profile_manager_, Core::System& system_) - : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u2") {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetUserCount"}, - FunctionInfo{1, nullptr, "GetUserExistence"}, - FunctionInfo{2, nullptr, "ListAllUsers"}, - FunctionInfo{3, nullptr, "ListOpenUsers"}, - FunctionInfo{4, nullptr, "GetLastOpenedUser"}, - FunctionInfo{5, nullptr, "GetProfile"}, - FunctionInfo{6, nullptr, "GetProfileDigest"}, - FunctionInfo{50, nullptr, "IsUserRegistrationRequestPermitted"}, - FunctionInfo{51, nullptr, "TrySelectUserWithoutInteractionDeprecated"}, - FunctionInfo{52, nullptr, "TrySelectUserWithoutInteraction"}, - FunctionInfo{99, nullptr, "DebugActivateOpenContextRetention"}, - FunctionInfo{100, nullptr, "GetUserRegistrationNotifier"}, - FunctionInfo{101, nullptr, "GetUserStateChangeNotifier"}, - FunctionInfo{102, nullptr, "GetBaasAccountManagerForSystemService"}, - FunctionInfo{103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, - FunctionInfo{104, nullptr, "GetProfileUpdateNotifier"}, - FunctionInfo{105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, - FunctionInfo{106, nullptr, "GetProfileSyncNotifier"}, - FunctionInfo{110, nullptr, "StoreSaveDataThumbnail"}, - FunctionInfo{111, nullptr, "ClearSaveDataThumbnail"}, - FunctionInfo{112, nullptr, "LoadSaveDataThumbnail"}, - FunctionInfo{113, nullptr, "GetSaveDataThumbnailExistence"}, - FunctionInfo{120, nullptr, "ListOpenUsersInApplication"}, - FunctionInfo{130, nullptr, "ActivateOpenContextRetention"}, - FunctionInfo{140, nullptr, "ListQualifiedUsers"}, - FunctionInfo{151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, - FunctionInfo{152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, - FunctionInfo{170, nullptr, "GetNasOp2MembershipStateChangeNotifier"}, - FunctionInfo{191, nullptr, "UpdateNotificationReceiverInfo"}, - FunctionInfo{205, nullptr, "GetProfileEditor"}, - FunctionInfo{401, nullptr, "GetPinCodeLength"}, - FunctionInfo{402, nullptr, "GetPinCode"}, - FunctionInfo{403, nullptr, "GetPinCodeParity"}, - FunctionInfo{404, nullptr, "VerifyPinCode"}, - FunctionInfo{405, nullptr, "IsPinCodeVerificationForbidden"}, - FunctionInfo{997, nullptr, "DebugInvalidateTokenCacheForUser"}, - FunctionInfo{998, nullptr, "DebugSetUserStateClose"}, - FunctionInfo{999, nullptr, "DebugSetUserStateOpen"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : Interface(std::move(module_), std::move(profile_manager_), system_, "acc:e:u2") { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetUserCount"}, + {1, nullptr, "GetUserExistence"}, + {2, nullptr, "ListAllUsers"}, + {3, nullptr, "ListOpenUsers"}, + {4, nullptr, "GetLastOpenedUser"}, + {5, nullptr, "GetProfile"}, + {6, nullptr, "GetProfileDigest"}, + {50, nullptr, "#IsUserRegistrationRequestPermitted"}, + {51, nullptr, "TrySelectUserWithoutInteractionDeprecated"}, + {52, nullptr, "TrySelectUserWithoutInteraction"}, + {99, nullptr, "DebugActivateOpenContextRetention"}, + {100, nullptr, "GetUserRegistrationNotifier"}, + {101, nullptr, "GetUserStateChangeNotifier"}, + {102, nullptr, "GetBaasAccountManagerForSystemService"}, + {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, + {104, nullptr, "GetProfileUpdateNotifier"}, + {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, + {106, nullptr, "GetProfileSyncNotifier"}, + {110, nullptr, "StoreSaveDataThumbnail"}, + {111, nullptr, "ClearSaveDataThumbnail"}, + {112, nullptr, "LoadSaveDataThumbnail"}, + {113, nullptr, "GetSaveDataThumbnailExistence"}, + {120, nullptr, "ListOpenUsersInApplication"}, + {130, nullptr, "ActivateOpenContextRetention"}, + {140, nullptr, "ListQualifiedUsers"}, + {151, nullptr, "EnsureSignedDeviceIdentifierCacheForNintendoAccountAsync"}, + {152, nullptr, "LoadSignedDeviceIdentifierCacheForNintendoAccount"}, + {170, nullptr, "GetNasOp2MembershipStateChangeNotifier"}, + {191, nullptr, "UpdateNotificationReceiverInfo"}, + {205, nullptr, "GetProfileEditor"}, + {401, nullptr, "GetPinCodeLength"}, + {402, nullptr, "GetPinCode"}, + {403, nullptr, "GetPinCodeParity"}, + {404, nullptr, "VerifyPinCode"}, + {405, nullptr, "IsPinCodeVerificationForbidden"}, + {997, nullptr, "DebugInvalidateTokenCacheForUser"}, + {998, nullptr, "DebugSetUserStateClose"}, + {999, nullptr, "DebugSetUserStateOpen"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/acc/acc.h b/src/core/hle/service/acc/acc.h index 9c2c96acdb..19af7c74c9 100644 --- a/src/core/hle/service/acc/acc.h +++ b/src/core/hle/service/acc/acc.h @@ -14,6 +14,70 @@ namespace Service::Account { class ProfileManager; +class Module final { +public: + class Interface : public ServiceFramework { + public: + explicit Interface(std::shared_ptr module_, + std::shared_ptr profile_manager_, Core::System& system_, + const char* name); + ~Interface() override; + + void GetUserCount(HLERequestContext& ctx); + void GetUserExistence(HLERequestContext& ctx); + void ListAllUsers(HLERequestContext& ctx); + void ListOpenUsers(HLERequestContext& ctx); + void GetLastOpenedUser(HLERequestContext& ctx); + void GetProfile(HLERequestContext& ctx); + void InitializeApplicationInfo(HLERequestContext& ctx); + void InitializeApplicationInfoRestricted(HLERequestContext& ctx); + void GetBaasAccountManagerForApplication(HLERequestContext& ctx); + void IsUserRegistrationRequestPermitted(HLERequestContext& ctx); + void TrySelectUserWithoutInteractionDeprecated(HLERequestContext& ctx); + void TrySelectUserWithoutInteraction(HLERequestContext& ctx); + void IsUserAccountSwitchLocked(HLERequestContext& ctx); + void InitializeApplicationInfoV2(HLERequestContext& ctx); + void BeginUserRegistration(HLERequestContext& ctx); + void CompleteUserRegistration(HLERequestContext& ctx); + void DeleteUser(HLERequestContext& ctx); + void SetUserPosition(HLERequestContext& ctx); + void GetProfileEditor(HLERequestContext& ctx); + void GetBaasAccountAdministrator(HLERequestContext &ctx); + void ListQualifiedUsers(HLERequestContext& ctx); + void ListOpenContextStoredUsers(HLERequestContext& ctx); + void StoreSaveDataThumbnailApplication(HLERequestContext& ctx); + void GetBaasAccountManagerForSystemService(HLERequestContext& ctx); + void StoreSaveDataThumbnailSystem(HLERequestContext& ctx); + void GetPinCodeLength(HLERequestContext& ctx); + + private: + Result InitializeApplicationInfoBase(); + void StoreSaveDataThumbnail(HLERequestContext& ctx, const Common::UUID& uuid, + const u64 tid); + + enum class ApplicationType : u32_le { + GameCard = 0, + Digital = 1, + Unknown = 3, + }; + + struct ApplicationInfo { + Service::Glue::ApplicationLaunchProperty launch_property; + ApplicationType application_type; + + constexpr explicit operator bool() const { + return launch_property.title_id != 0x0; + } + }; + + ApplicationInfo application_info{}; + + protected: + std::shared_ptr module; + std::shared_ptr profile_manager; + }; +}; + void LoopProcess(Core::System& system); } // namespace Service::Account diff --git a/src/core/hle/service/acc/async_context.cpp b/src/core/hle/service/acc/async_context.cpp index a7f751d756..8dec886ad7 100644 --- a/src/core/hle/service/acc/async_context.cpp +++ b/src/core/hle/service/acc/async_context.cpp @@ -12,6 +12,17 @@ namespace Service::Account { IAsyncContext::IAsyncContext(Core::System& system_) : ServiceFramework{system_, "IAsyncContext"}, service_context{system_, "IAsyncContext"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IAsyncContext::GetSystemEvent, "GetSystemEvent"}, + {1, &IAsyncContext::Cancel, "Cancel"}, + {2, &IAsyncContext::HasDone, "HasDone"}, + {3, &IAsyncContext::GetResult, "GetResult"}, + }; + // clang-format on + + RegisterHandlers(functions); + completion_event = service_context.CreateEvent("IAsyncContext:CompletionEvent"); } diff --git a/src/core/hle/service/acc/async_context.h b/src/core/hle/service/acc/async_context.h index 0137567d11..c50537d4ae 100644 --- a/src/core/hle/service/acc/async_context.h +++ b/src/core/hle/service/acc/async_context.h @@ -33,16 +33,6 @@ protected: void MarkComplete(); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IAsyncContext::GetSystemEvent, "GetSystemEvent"}, - FunctionInfo{1, &IAsyncContext::Cancel, "Cancel"}, - FunctionInfo{2, &IAsyncContext::HasDone, "HasDone"}, - FunctionInfo{3, &IAsyncContext::GetResult, "GetResult"} - ); - KernelHelpers::ServiceContext service_context; std::atomic is_complete{false}; diff --git a/src/core/hle/service/acc/errors.h b/src/core/hle/service/acc/errors.h index 433ebfe9d6..b7cf8b5f93 100644 --- a/src/core/hle/service/acc/errors.h +++ b/src/core/hle/service/acc/errors.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 472be8f0f0..86d9d52e34 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -4,1340 +4,16 @@ // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/settings.h" -#include "core/core.h" -#include "core/file_sys/common_funcs.h" -#include "core/file_sys/patch_manager.h" -#include "core/file_sys/romfs_factory.h" -#include "core/file_sys/control_metadata.h" -#include "core/hle/api_version.h" -#include "core/hle/kernel/k_transfer_memory.h" -#include "core/hle/service/server_manager.h" -#include "core/hle/service/am/applet_manager.h" -#include "core/hle/service/am/window_system.h" #include "core/hle/service/am/am.h" #include "core/hle/service/am/button_poller.h" #include "core/hle/service/am/event_observer.h" -#include "core/hle/service/am/service/application_creator.h" -#include "core/hle/service/am/service/audio_controller.h" -#include "core/hle/service/am/service/common_state_getter.h" -#include "core/hle/service/am/service/display_controller.h" -#include "core/hle/service/am/service/global_state_controller.h" -#include "core/hle/service/am/service/home_menu_functions.h" -#include "core/hle/service/am/service/process_winding_controller.h" -#include "core/hle/service/am/service/self_controller.h" -#include "core/hle/service/am/service/window_controller.h" -#include "core/hle/service/am/service/application_functions.h" -#include "core/hle/service/am/applet_data_broker.h" -#include "core/hle/service/am/frontend/applets.h" -#include "core/hle/service/am/library_applet_storage.h" -#include "core/hle/service/am/process_creation.h" -#include "core/hle/service/am/service/library_applet_accessor.h" -#include "core/hle/service/am/service/overlay_functions.h" -#include "core/hle/service/am/service/storage.h" -#include "core/hle/service/ns/language.h" -#include "core/hle/service/ns/application_manager_interface.h" -#include "core/hle/service/ns/service_getter_interface.h" -#include "core/hle/service/glue/glue_manager.h" -#include "core/hle/service/sm/sm.h" -#include "core/hle/service/acc/profile_manager.h" -#include "core/hle/service/am/frontend/applet_profile_select.h" -#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/am/service/all_system_applet_proxies_service.h" +#include "core/hle/service/am/service/application_proxy_service.h" +#include "core/hle/service/am/window_system.h" +#include "core/hle/service/server_manager.h" namespace Service::AM { -struct Applet; -class IAppletCommonFunctions; -class IApplicationCreator; -class IAudioController; -class ICommonStateGetter; -class IDebugFunctions; -class IDisplayController; -class IHomeMenuFunctions; -class IGlobalStateController; -class ILibraryAppletCreator; -class IProcessWindingController; -class ISelfController; -class IWindowController; -class WindowSystem; - -class IDebugFunctions final : public ServiceFramework { -public: - explicit IDebugFunctions(Core::System& system_) : ServiceFramework{system_, "IDebugFunctions"} {} - ~IDebugFunctions() override = default; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "NotifyMessageToHomeMenuForDebug"}, - FunctionInfo{1, nullptr, "OpenMainApplication"}, - FunctionInfo{10, nullptr, "PerformSystemButtonPressing"}, - FunctionInfo{20, nullptr, "InvalidateTransitionLayer"}, - FunctionInfo{30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"}, - FunctionInfo{31, nullptr, "RequestLaunchApplicationByApplicationLaunchInfoForDebug"}, - FunctionInfo{40, nullptr, "GetAppletResourceUsageInfo"}, - FunctionInfo{50, nullptr, "AddSystemProgramIdAndAppletIdForDebug"}, - FunctionInfo{51, nullptr, "AddOperationConfirmedLibraryAppletIdForDebug"}, - FunctionInfo{100, nullptr, "SetCpuBoostModeForApplet"}, - FunctionInfo{101, nullptr, "CancelCpuBoostModeForApplet"}, - FunctionInfo{110, nullptr, "PushToAppletBoundChannelForDebug"}, - FunctionInfo{111, nullptr, "TryPopFromAppletBoundChannelForDebug"}, - FunctionInfo{120, nullptr, "AlarmSettingNotificationEnableAppEventReserve"}, - FunctionInfo{121, nullptr, "AlarmSettingNotificationDisableAppEventReserve"}, - FunctionInfo{122, nullptr, "AlarmSettingNotificationPushAppEventNotify"}, - FunctionInfo{130, nullptr, "FriendInvitationSetApplicationParameter"}, - FunctionInfo{131, nullptr, "FriendInvitationClearApplicationParameter"}, - FunctionInfo{132, nullptr, "FriendInvitationPushApplicationParameter"}, - FunctionInfo{140, nullptr, "RestrictPowerOperationForSecureLaunchModeForDebug"}, - FunctionInfo{200, nullptr, "CreateFloatingLibraryAppletAccepterForDebug"}, - FunctionInfo{300, nullptr, "TerminateAllRunningApplicationsForDebug"}, - FunctionInfo{900, nullptr, "GetGrcProcessLaunchedSystemEvent"} - ); -}; - -class IApplicationProxy final : public ServiceFramework { -public: - explicit IApplicationProxy(Core::System& system_, std::shared_ptr applet, - Kernel::KProcess* process, WindowSystem& window_system) - : ServiceFramework{system_, "IApplicationProxy"}, - m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { - } - - ~IApplicationProxy() override = default; - - Result GetAudioController( - Out> out_audio_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_audio_controller = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDisplayController( - Out> out_display_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_display_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetProcessWindingController( - Out> out_process_winding_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_process_winding_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetDebugFunctions( - Out> out_debug_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_debug_functions = std::make_shared(system); - R_SUCCEED(); - } - - Result GetWindowController( - Out> out_window_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_window_controller = std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetSelfController( - Out> out_self_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_self_controller = std::make_shared(system, m_applet, m_process); - R_SUCCEED(); - } - - Result GetCommonStateGetter( - Out> out_common_state_getter) { - LOG_DEBUG(Service_AM, "called"); - *out_common_state_getter = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetLibraryAppletCreator( - Out> out_library_applet_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_creator = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetApplicationFunctions( - Out> out_application_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_application_functions = std::make_shared(system, m_applet); - R_SUCCEED(); - } - -private: - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IApplicationProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, - FunctionInfo{1, D<&IApplicationProxy::GetSelfController>, "GetSelfController"}, - FunctionInfo{2, D<&IApplicationProxy::GetWindowController>, "GetWindowController"}, - FunctionInfo{3, D<&IApplicationProxy::GetAudioController>, "GetAudioController"}, - FunctionInfo{4, D<&IApplicationProxy::GetDisplayController>, "GetDisplayController"}, - FunctionInfo{10, D<&IApplicationProxy::GetProcessWindingController>, "GetProcessWindingController"}, - FunctionInfo{11, D<&IApplicationProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, - FunctionInfo{20, D<&IApplicationProxy::GetApplicationFunctions>, "GetApplicationFunctions"}, - FunctionInfo{1000, D<&IApplicationProxy::GetDebugFunctions>, "GetDebugFunctions"} - ); - WindowSystem& m_window_system; - Kernel::KProcess* const m_process; - const std::shared_ptr m_applet; -}; - -class IApplicationProxyService final : public ServiceFramework { -public: - explicit IApplicationProxyService(Core::System& system_, - WindowSystem& window_system) - : ServiceFramework{system_, "appletOE"}, m_window_system{window_system} { - } - - ~IApplicationProxyService() override = default; - - Result OpenApplicationProxy( - Out> out_application_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_DEBUG(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid)) { - *out_application_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } - } - - std::shared_ptr GetAppletFromProcessId(ProcessId process_id) { - return m_window_system.GetByAppletResourceUserId(process_id.pid); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IApplicationProxyService::OpenApplicationProxy>, "OpenApplicationProxy"} - ); - WindowSystem& m_window_system; -}; - -class IAppletCommonFunctions final : public ServiceFramework { -public: - explicit IAppletCommonFunctions(Core::System& system_, std::shared_ptr applet_) : ServiceFramework{system_, "IAppletCommonFunctions"}, applet{std::move(applet_)} {} - ~IAppletCommonFunctions() override = default; - - Result SetHomeButtonDoubleClickEnabled( - bool home_button_double_click_enabled) { - LOG_WARNING(Service_AM, "(STUBBED) called, home_button_double_click_enabled={}", home_button_double_click_enabled); - R_SUCCEED(); - } - - Result GetHomeButtonDoubleClickEnabled( - Out out_home_button_double_click_enabled) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_home_button_double_click_enabled = false; - R_SUCCEED(); - } - - Result SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height) { - LOG_DEBUG(Service_AM, "(STUBBED) called, x={}, y={}, width={}, height={}", x, y, width, height); - std::scoped_lock lk{applet->lock}; - applet->display_magnification = Common::Rectangle{x, y, x + width, y + height}; - R_SUCCEED(); - } - - Result SetCpuBoostRequestPriority(s32 priority) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - std::scoped_lock lk{applet->lock}; - applet->cpu_boost_request_priority = priority; - R_SUCCEED(); - } - - Result GetCurrentApplicationId(Out out_application_id) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_application_id = FileSys::GetBaseTitleID(system.GetApplicationProcessProgramID()); - R_SUCCEED(); - } - - Result SetGpuTimeSliceBoost(s64 time_span) { - LOG_WARNING(Service_AM, "(STUBBED) called, time_span={}", time_span); - R_SUCCEED(); - } - - Result Unknown350(Out out_unknown) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_unknown = 0; - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SetTerminateResult"}, - FunctionInfo{10, nullptr, "ReadThemeStorage"}, - FunctionInfo{11, nullptr, "WriteThemeStorage"}, - FunctionInfo{20, nullptr, "PushToAppletBoundChannel"}, - FunctionInfo{21, nullptr, "TryPopFromAppletBoundChannel"}, - FunctionInfo{40, nullptr, "GetDisplayLogicalResolution"}, - FunctionInfo{42, D<&IAppletCommonFunctions::SetDisplayMagnification>, "SetDisplayMagnification"}, - FunctionInfo{50, D<&IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled>, "SetHomeButtonDoubleClickEnabled"}, - FunctionInfo{51, D<&IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled>, "GetHomeButtonDoubleClickEnabled"}, - FunctionInfo{52, nullptr, "IsHomeButtonShortPressedBlocked"}, - FunctionInfo{60, nullptr, "IsVrModeCurtainRequired"}, - FunctionInfo{61, nullptr, "IsSleepRequiredByHighTemperature"}, - FunctionInfo{62, nullptr, "IsSleepRequiredByLowBattery"}, - FunctionInfo{70, D<&IAppletCommonFunctions::SetCpuBoostRequestPriority>, "SetCpuBoostRequestPriority"}, - FunctionInfo{80, nullptr, "SetHandlingCaptureButtonShortPressedMessageEnabledForApplet"}, - FunctionInfo{81, nullptr, "SetHandlingCaptureButtonLongPressedMessageEnabledForApplet"}, - FunctionInfo{90, nullptr, "OpenNamedChannelAsParent"}, - FunctionInfo{91, nullptr, "OpenNamedChannelAsChild"}, - FunctionInfo{100, nullptr, "SetApplicationCoreUsageMode"}, - FunctionInfo{300, D<&IAppletCommonFunctions::GetCurrentApplicationId>, "GetCurrentApplicationId"}, - FunctionInfo{310, nullptr, "IsSystemAppletHomeMenu", MakeVersionGate({19,0,0})}, - FunctionInfo{320, D<&IAppletCommonFunctions::SetGpuTimeSliceBoost>, "SetGpuTimeSliceBoost", MakeVersionGate({19,0,0})}, - FunctionInfo{321, nullptr, "SetGpuTimeSliceBoostDueToApplication", MakeVersionGate({19,0,0})}, - FunctionInfo{350, D<&IAppletCommonFunctions::Unknown350>, "Unknown350", MakeVersionGate({20,0,0})} - ); - const std::shared_ptr applet; -}; - -class ISystemAppletProxy final : public ServiceFramework { -public: - explicit ISystemAppletProxy(Core::System& system_, std::shared_ptr applet, Kernel::KProcess* process, WindowSystem& window_system) - : ServiceFramework{system_, "ISystemAppletProxy"}, - m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { - } - - ~ISystemAppletProxy() override = default; - - Result GetAudioController( - Out> out_audio_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_audio_controller = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDisplayController( - Out> out_display_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_display_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetProcessWindingController( - Out> out_process_winding_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_process_winding_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetDebugFunctions( - Out> out_debug_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_debug_functions = std::make_shared(system); - R_SUCCEED(); - } - - Result GetWindowController( - Out> out_window_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_window_controller = std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetSelfController( - Out> out_self_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_self_controller = std::make_shared(system, m_applet, m_process); - R_SUCCEED(); - } - - Result GetCommonStateGetter( - Out> out_common_state_getter) { - LOG_DEBUG(Service_AM, "called"); - *out_common_state_getter = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetLibraryAppletCreator( - Out> out_library_applet_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_creator = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetApplicationCreator( - Out> out_application_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_application_creator = std::make_shared(system, m_window_system); - R_SUCCEED(); - } - - Result GetAppletCommonFunctions( - Out> out_applet_common_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_applet_common_functions = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetHomeMenuFunctions( - Out> out_home_menu_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_home_menu_functions = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetGlobalStateController( - Out> out_global_state_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_global_state_controller = std::make_shared(system); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ISystemAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, - FunctionInfo{1, D<&ISystemAppletProxy::GetSelfController>, "GetSelfController"}, - FunctionInfo{2, D<&ISystemAppletProxy::GetWindowController>, "GetWindowController"}, - FunctionInfo{3, D<&ISystemAppletProxy::GetAudioController>, "GetAudioController"}, - FunctionInfo{4, D<&ISystemAppletProxy::GetDisplayController>, "GetDisplayController"}, - FunctionInfo{10, D<&ISystemAppletProxy::GetProcessWindingController>, "GetProcessWindingController"}, - FunctionInfo{11, D<&ISystemAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, - FunctionInfo{20, D<&ISystemAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"}, - FunctionInfo{21, D<&ISystemAppletProxy::GetGlobalStateController>, "GetGlobalStateController"}, - FunctionInfo{22, D<&ISystemAppletProxy::GetApplicationCreator>, "GetApplicationCreator"}, - FunctionInfo{23, D<&ISystemAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"}, - FunctionInfo{1000, D<&ISystemAppletProxy::GetDebugFunctions>, "GetDebugFunctions"} - ); - WindowSystem& m_window_system; - Kernel::KProcess* const m_process; - const std::shared_ptr m_applet; -}; - -static AppletIdentityInfo GetCallerIdentity(Applet& applet) { - if (const auto caller_applet = applet.caller_applet.lock(); caller_applet) { - // TODO: is this actually the application ID? - return { - .applet_id = caller_applet->applet_id, - .application_id = caller_applet->program_id, - }; - } else { - return { - .applet_id = AppletId::QLaunch, - .application_id = 0x0100000000001000ull, - }; - } -} - -class ILibraryAppletSelfAccessor final : public ServiceFramework { -public: - ILibraryAppletSelfAccessor(Core::System& system_, - std::shared_ptr applet) - : ServiceFramework{system_, "ILibraryAppletSelfAccessor"}, m_applet{std::move(applet)}, - m_broker{m_applet->caller_applet_broker} { - } - - ~ILibraryAppletSelfAccessor() = default; - - Result PopInData(Out> out_storage) { - LOG_INFO(Service_AM, "called"); - R_RETURN(m_broker->GetInData().Pop(system.Kernel(), out_storage)); - } - - Result PushOutData(SharedPointer storage) { - LOG_INFO(Service_AM, "called"); - m_broker->GetOutData().Push(system.Kernel(), storage); - R_SUCCEED(); - } - - Result PopInteractiveInData(Out> out_storage) { - LOG_INFO(Service_AM, "called"); - R_RETURN(m_broker->GetInteractiveInData().Pop(system.Kernel(), out_storage)); - } - - Result PushInteractiveOutData(SharedPointer storage) { - LOG_INFO(Service_AM, "called"); - m_broker->GetInteractiveOutData().Push(system.Kernel(), storage); - R_SUCCEED(); - } - - Result GetPopInDataEvent( - OutCopyHandle out_event) { - LOG_INFO(Service_AM, "called"); - *out_event = m_broker->GetInData().GetEvent(); - R_SUCCEED(); - } - - Result GetPopInteractiveInDataEvent( - OutCopyHandle out_event) { - LOG_INFO(Service_AM, "called"); - *out_event = m_broker->GetInteractiveInData().GetEvent(); - R_SUCCEED(); - } - - Result GetLibraryAppletInfo( - Out out_library_applet_info) { - LOG_INFO(Service_AM, "called"); - *out_library_applet_info = { - .applet_id = m_applet->applet_id, - .library_applet_mode = m_applet->library_applet_mode, - }; - R_SUCCEED(); - } - - Result GetMainAppletIdentityInfo( - Out out_identity_info) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_identity_info = { - .applet_id = AppletId::QLaunch, - .application_id = 0x0100000000001000ull, - }; - R_SUCCEED(); - } - - Result CanUseApplicationCore(Out out_can_use_application_core) { - // TODO: This appears to read the NPDM from state and check the core mask of the applet. - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_can_use_application_core = false; - R_SUCCEED(); - } - - Result GetMainAppletApplicationControlProperty( - OutLargeData, BufferAttr_HipcMapAlias> out_nacp) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - - // TODO: this should be the main applet, not the caller applet - const auto application = GetCallerIdentity(*m_applet); - std::vector nacp; - const auto result = - system.GetARPManager().GetControlProperty(&nacp, application.application_id); - - if (R_SUCCEEDED(result)) { - std::memcpy(out_nacp->data(), nacp.data(), (std::min)(nacp.size(), out_nacp->size())); - } - - R_RETURN(result); - } - - Result GetMainAppletStorageId(Out out_storage_id) { - LOG_INFO(Service_AM, "(STUBBED) called"); - *out_storage_id = FileSys::StorageId::NandUser; - R_SUCCEED(); - } - - Result ExitProcessAndReturn() { - LOG_INFO(Service_AM, "called"); - - if (const auto caller_applet = m_applet->caller_applet.lock(); caller_applet) { - m_applet->process->Terminate(); - } else { - system.GetUserChannel() = m_applet->user_channel_launch_parameter; - system.ExecuteProgram(0); - } - - R_SUCCEED(); - } - - Result GetCallerAppletIdentityInfo( - Out out_identity_info) { - LOG_INFO(Service_AM, "called"); - *out_identity_info = GetCallerIdentity(*m_applet); - R_SUCCEED(); - } - - Result GetCallerAppletIdentityInfoStack( - Out out_count, OutArray out_identity_info) { - LOG_INFO(Service_AM, "called"); - - std::shared_ptr applet = m_applet; - *out_count = 0; - - do { - if (*out_count >= static_cast(out_identity_info.size())) { - break; - } - out_identity_info[(*out_count)++] = GetCallerIdentity(*applet); - } while ((applet = applet->caller_applet.lock())); - - R_SUCCEED(); - } - - Result GetDesirableKeyboardLayout(Out out_desirable_layout) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - *out_desirable_layout = 0; - R_SUCCEED(); - } - - Result ReportVisibleError(ErrorCode error_code) { - LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category, - error_code.number); - R_SUCCEED(); - } - - Result ReportVisibleErrorWithErrorContext( - ErrorCode error_code, InLargeData error_context) { - LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category, - error_code.number); - R_SUCCEED(); - } - - Result UnpopInData(SharedPointer storage) { - LOG_INFO(Service_AM, "called"); - m_broker->GetInData().Unpop(system.Kernel(), storage); - R_SUCCEED(); - } - - Result GetMainAppletApplicationDesiredLanguage( - Out out_desired_language) { - // FIXME: this is copied from IApplicationFunctions::GetDesiredLanguage - // FIXME: all of this stuff belongs to ns - auto identity = GetCallerIdentity(*m_applet); - - // TODO(bunnei): This should be configurable - LOG_DEBUG(Service_AM, "called"); - - // Get supported languages from NACP, if possible - // Default to 0 (all languages supported) - u32 supported_languages = 0; - - const auto res = FileSys::PatchManager::GetMetadataFromBaseOrUpdate(system, identity.application_id); - - if (res.first != nullptr) { - supported_languages = res.first->GetSupportedLanguages(); - } - - // Call IApplicationManagerInterface implementation. - auto& service_manager = system.ServiceManager(); - auto ns_am2 = service_manager.GetService("ns:am2"); - - std::shared_ptr app_man; - R_TRY(ns_am2->GetApplicationManagerInterface(&app_man)); - - // Get desired application language - NS::ApplicationLanguage desired_language{}; - R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages)); - - // Convert to settings language code. - u64 language_code{}; - R_TRY(app_man->ConvertApplicationLanguageToLanguageCode(&language_code, desired_language)); - - LOG_DEBUG(Service_AM, "got desired_language={:016X}", language_code); - - *out_desired_language = language_code; - R_SUCCEED(); - } - - Result GetCurrentApplicationId(Out out_application_id) { - LOG_WARNING(Service_AM, "(STUBBED) called"); - - // TODO: this should be the main applet, not the caller applet - const auto main_applet = GetCallerIdentity(*m_applet); - *out_application_id = main_applet.application_id; - - R_SUCCEED(); - } - - Result GetMainAppletAvailableUsers( - Out out_can_select_any_user, Out out_users_count, - OutArray out_users) { - const Service::Account::ProfileManager manager{}; - - *out_can_select_any_user = false; - *out_users_count = -1; - - LOG_INFO(Service_AM, "called"); - - if (manager.GetUserCount() > 0) { - *out_can_select_any_user = true; - *out_users_count = static_cast(manager.GetUserCount()); - - const auto users = manager.GetAllUsers(); - for (size_t i = 0; i < users.size() && i < out_users.size(); i++) { - out_users[i] = users[i]; - } - } - - R_SUCCEED(); - } - - Result ShouldSetGpuTimeSliceManually( - Out out_should_set_gpu_time_slice_manually) { - LOG_INFO(Service_AM, "(STUBBED) called"); - *out_should_set_gpu_time_slice_manually = false; - R_SUCCEED(); - } - - Result GetLibraryAppletInfoEx( - Out out_library_applet_info) { - LOG_INFO(Service_AM, "called"); - *out_library_applet_info = { - .applet_id = m_applet->applet_id, - .library_applet_mode = m_applet->library_applet_mode, - }; - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ILibraryAppletSelfAccessor::PopInData>, "PopInData"}, - FunctionInfo{1, D<&ILibraryAppletSelfAccessor::PushOutData>, "PushOutData"}, - FunctionInfo{2, D<&ILibraryAppletSelfAccessor::PopInteractiveInData>, "PopInteractiveInData"}, - FunctionInfo{3, D<&ILibraryAppletSelfAccessor::PushInteractiveOutData>, "PushInteractiveOutData"}, - FunctionInfo{5, D<&ILibraryAppletSelfAccessor::GetPopInDataEvent>, "GetPopInDataEvent"}, - FunctionInfo{6, D<&ILibraryAppletSelfAccessor::GetPopInteractiveInDataEvent>, "GetPopInteractiveInDataEvent"}, - FunctionInfo{10, D<&ILibraryAppletSelfAccessor::ExitProcessAndReturn>, "ExitProcessAndReturn"}, - FunctionInfo{11, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"}, - FunctionInfo{12, D<&ILibraryAppletSelfAccessor::GetMainAppletIdentityInfo>, "GetMainAppletIdentityInfo"}, - FunctionInfo{13, D<&ILibraryAppletSelfAccessor::CanUseApplicationCore>, "CanUseApplicationCore"}, - FunctionInfo{14, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo>, "GetCallerAppletIdentityInfo"}, - FunctionInfo{15, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationControlProperty>, "GetMainAppletApplicationControlProperty"}, - FunctionInfo{16, D<&ILibraryAppletSelfAccessor::GetMainAppletStorageId>, "GetMainAppletStorageId"}, - FunctionInfo{17, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfoStack>, "GetCallerAppletIdentityInfoStack"}, - FunctionInfo{18, nullptr, "GetNextReturnDestinationAppletIdentityInfo"}, - FunctionInfo{19, D<&ILibraryAppletSelfAccessor::GetDesirableKeyboardLayout>, "GetDesirableKeyboardLayout"}, - FunctionInfo{20, nullptr, "PopExtraStorage"}, - FunctionInfo{25, nullptr, "GetPopExtraStorageEvent"}, - FunctionInfo{30, D<&ILibraryAppletSelfAccessor::UnpopInData>, "UnpopInData"}, - FunctionInfo{31, nullptr, "UnpopExtraStorage"}, - FunctionInfo{40, nullptr, "GetIndirectLayerProducerHandle"}, - FunctionInfo{50, D<&ILibraryAppletSelfAccessor::ReportVisibleError>, "ReportVisibleError"}, - FunctionInfo{51, D<&ILibraryAppletSelfAccessor::ReportVisibleErrorWithErrorContext>, "ReportVisibleErrorWithErrorContext"}, - FunctionInfo{60, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage>, "GetMainAppletApplicationDesiredLanguage"}, - FunctionInfo{70, D<&ILibraryAppletSelfAccessor::GetCurrentApplicationId>, "GetCurrentApplicationId"}, - FunctionInfo{80, nullptr, "RequestExitToSelf"}, - FunctionInfo{90, nullptr, "CreateApplicationAndPushAndRequestToLaunch"}, - FunctionInfo{100, nullptr, "CreateGameMovieTrimmer"}, - FunctionInfo{101, nullptr, "ReserveResourceForMovieOperation"}, - FunctionInfo{102, nullptr, "UnreserveResourceForMovieOperation"}, - FunctionInfo{110, D<&ILibraryAppletSelfAccessor::GetMainAppletAvailableUsers>, "GetMainAppletAvailableUsers"}, - FunctionInfo{120, nullptr, "GetLaunchStorageInfoForDebug"}, - FunctionInfo{130, nullptr, "GetGpuErrorDetectedSystemEvent"}, - FunctionInfo{140, nullptr, "SetApplicationMemoryReservation"}, - FunctionInfo{150, D<&ILibraryAppletSelfAccessor::ShouldSetGpuTimeSliceManually>, "ShouldSetGpuTimeSliceManually"}, - FunctionInfo{160, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfoEx>, "GetLibraryAppletInfoEx"} - ); - const std::shared_ptr m_applet; - const std::shared_ptr m_broker; -}; - -class ILibraryAppletProxy final : public ServiceFramework { -public: - explicit ILibraryAppletProxy(Core::System& system_, std::shared_ptr applet, - Kernel::KProcess* process, WindowSystem& window_system) - : ServiceFramework{system_, "ILibraryAppletProxy"}, - m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { - } - ~ILibraryAppletProxy() override = default; - - Result GetAudioController( - Out> out_audio_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_audio_controller = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDisplayController( - Out> out_display_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_display_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetProcessWindingController( - Out> out_process_winding_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_process_winding_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetDebugFunctions( - Out> out_debug_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_debug_functions = std::make_shared(system); - R_SUCCEED(); - } - - Result GetWindowController( - Out> out_window_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_window_controller = std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetSelfController( - Out> out_self_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_self_controller = std::make_shared(system, m_applet, m_process); - R_SUCCEED(); - } - - Result GetCommonStateGetter( - Out> out_common_state_getter) { - LOG_DEBUG(Service_AM, "called"); - *out_common_state_getter = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetLibraryAppletCreator( - Out> out_library_applet_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_creator = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result OpenLibraryAppletSelfAccessor( - Out> out_library_applet_self_accessor) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_self_accessor = - std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetAppletCommonFunctions( - Out> out_applet_common_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_applet_common_functions = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetHomeMenuFunctions( - Out> out_home_menu_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_home_menu_functions = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetGlobalStateController( - Out> out_global_state_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_global_state_controller = std::make_shared(system); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ILibraryAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, - FunctionInfo{1, D<&ILibraryAppletProxy::GetSelfController>, "GetSelfController"}, - FunctionInfo{2, D<&ILibraryAppletProxy::GetWindowController>, "GetWindowController"}, - FunctionInfo{3, D<&ILibraryAppletProxy::GetAudioController>, "GetAudioController"}, - FunctionInfo{4, D<&ILibraryAppletProxy::GetDisplayController>, "GetDisplayController"}, - FunctionInfo{10, D<&ILibraryAppletProxy::GetProcessWindingController>, "GetProcessWindingController"}, - FunctionInfo{11, D<&ILibraryAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, - FunctionInfo{20, D<&ILibraryAppletProxy::OpenLibraryAppletSelfAccessor>, "OpenLibraryAppletSelfAccessor"}, - FunctionInfo{21, D<&ILibraryAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"}, - FunctionInfo{22, D<&ILibraryAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"}, - FunctionInfo{23, D<&ILibraryAppletProxy::GetGlobalStateController>, "GetGlobalStateController"}, - FunctionInfo{1000, D<&ILibraryAppletProxy::GetDebugFunctions>, "GetDebugFunctions"} - ); - WindowSystem& m_window_system; - Kernel::KProcess* const m_process; - const std::shared_ptr m_applet; -}; - -class IOverlayAppletProxy final : public ServiceFramework { -public: - explicit IOverlayAppletProxy(Core::System &system_, std::shared_ptr applet, - Kernel::KProcess *process, WindowSystem &window_system) - : ServiceFramework{system_, "IOverlayAppletProxy"}, - m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { - } - - ~IOverlayAppletProxy() override = default; - - Result GetCommonStateGetter( - Out > out_common_state_getter) { - LOG_DEBUG(Service_AM, "called"); - *out_common_state_getter = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetSelfController( - Out > out_self_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_self_controller = std::make_shared(system, m_applet, m_process); - R_SUCCEED(); - } - - Result GetWindowController( - Out > out_window_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_window_controller = std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetAudioController( - Out > out_audio_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_audio_controller = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDisplayController( - Out > out_display_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_display_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetProcessWindingController( - Out > out_process_winding_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_process_winding_controller = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetLibraryAppletCreator( - Out > out_library_applet_creator) { - LOG_DEBUG(Service_AM, "called"); - *out_library_applet_creator = - std::make_shared(system, m_applet, m_window_system); - R_SUCCEED(); - } - - Result GetOverlayFunctions( - Out > out_overlay_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_overlay_functions = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetAppletCommonFunctions( - Out > out_applet_common_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_applet_common_functions = std::make_shared(system, m_applet); - R_SUCCEED(); - } - - Result GetGlobalStateController( - Out > out_global_state_controller) { - LOG_DEBUG(Service_AM, "called"); - *out_global_state_controller = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDebugFunctions( - Out > out_debug_functions) { - LOG_DEBUG(Service_AM, "called"); - *out_debug_functions = std::make_shared(system); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IOverlayAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, - FunctionInfo{1, D<&IOverlayAppletProxy::GetSelfController>, "GetSelfController"}, - FunctionInfo{2, D<&IOverlayAppletProxy::GetWindowController>, "GetWindowController"}, - FunctionInfo{3, D<&IOverlayAppletProxy::GetAudioController>, "GetAudioController"}, - FunctionInfo{4, D<&IOverlayAppletProxy::GetDisplayController>, "GetDisplayController"}, - FunctionInfo{10, D<&IOverlayAppletProxy::GetProcessWindingController>, "GetProcessWindingController"}, - FunctionInfo{11, D<&IOverlayAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, - FunctionInfo{20, D<&IOverlayAppletProxy::GetOverlayFunctions>, "GetOverlayFunctions"}, - FunctionInfo{21, D<&IOverlayAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"}, - FunctionInfo{23, D<&IOverlayAppletProxy::GetGlobalStateController>, "GetGlobalStateController"}, - FunctionInfo{1000, D<&IOverlayAppletProxy::GetDebugFunctions>, "GetDebugFunctions"} - ); - WindowSystem& m_window_system; - Kernel::KProcess* const m_process; - const std::shared_ptr m_applet; -}; - -static bool ShouldCreateGuestApplet(AppletId applet_id) { -#define X(Name, name) \ - if (applet_id == AppletId::Name && \ - Settings::values.name##_applet_mode.GetValue() != Settings::AppletMode::LLE) { \ - return false; \ - } - - X(Cabinet, cabinet) - X(Controller, controller) - X(DataErase, data_erase) - X(Error, error) - X(NetConnect, net_connect) - X(ProfileSelect, player_select) - X(SoftwareKeyboard, swkbd) - X(MiiEdit, mii_edit) - X(Web, web) - X(Shop, shop) - X(PhotoViewer, photo_viewer) - X(OfflineWeb, offline_web) - X(LoginShare, login_share) - X(WebAuth, wifi_web_auth) - X(MyPage, my_page) - -#undef X - - return true; -} - -static AppletProgramId AppletIdToProgramId(AppletId applet_id) { - switch (applet_id) { - case AppletId::OverlayDisplay: - return AppletProgramId::OverlayDisplay; - case AppletId::QLaunch: - return AppletProgramId::QLaunch; - case AppletId::Starter: - return AppletProgramId::Starter; - case AppletId::Auth: - return AppletProgramId::Auth; - case AppletId::Cabinet: - return AppletProgramId::Cabinet; - case AppletId::Controller: - return AppletProgramId::Controller; - case AppletId::DataErase: - return AppletProgramId::DataErase; - case AppletId::Error: - return AppletProgramId::Error; - case AppletId::NetConnect: - return AppletProgramId::NetConnect; - case AppletId::ProfileSelect: - return AppletProgramId::ProfileSelect; - case AppletId::SoftwareKeyboard: - return AppletProgramId::SoftwareKeyboard; - case AppletId::MiiEdit: - return AppletProgramId::MiiEdit; - case AppletId::Web: - return AppletProgramId::Web; - case AppletId::Shop: - return AppletProgramId::Shop; - case AppletId::PhotoViewer: - return AppletProgramId::PhotoViewer; - case AppletId::Settings: - return AppletProgramId::Settings; - case AppletId::OfflineWeb: - return AppletProgramId::OfflineWeb; - case AppletId::LoginShare: - return AppletProgramId::LoginShare; - case AppletId::WebAuth: - return AppletProgramId::WebAuth; - case AppletId::MyPage: - return AppletProgramId::MyPage; - default: - return static_cast(0); - } -} - -static std::shared_ptr CreateGuestApplet(Core::System& system, - WindowSystem& window_system, - std::shared_ptr caller_applet, - AppletId applet_id, - LibraryAppletMode mode) { - const auto program_id = static_cast(AppletIdToProgramId(applet_id)); - if (program_id == 0) { - // Unknown applet - return {}; - } - - auto process = CreateProcess(system, program_id, 1, HLE::ApiVersion::HOS_VERSION_MAJOR); - if (process) { - const auto applet = std::make_shared(system, std::move(process), false); - applet->program_id = program_id; - applet->applet_id = applet_id; - applet->type = AppletType::LibraryApplet; - applet->library_applet_mode = mode; - applet->window_visible = mode != LibraryAppletMode::AllForegroundInitiallyHidden; - - auto broker = std::make_shared(system); - applet->caller_applet = caller_applet; - applet->caller_applet_broker = broker; - { - std::scoped_lock lk{caller_applet->lock}; - caller_applet->child_applets.push_back(applet); - } - window_system.TrackApplet(applet, false); - return std::make_shared(system, broker, applet); - } - // Couldn't initialize the guest process - return {}; -} - -static std::shared_ptr CreateFrontendApplet(Core::System& system, - WindowSystem& window_system, - std::shared_ptr caller_applet, - AppletId applet_id, - LibraryAppletMode mode) { - const auto program_id = static_cast(AppletIdToProgramId(applet_id)); - - auto process = std::make_unique(system); - auto applet = std::make_shared(system, std::move(process), false); - applet->program_id = program_id; - applet->applet_id = applet_id; - applet->type = AppletType::LibraryApplet; - applet->library_applet_mode = mode; - - auto storage = std::make_shared(system); - applet->caller_applet = caller_applet; - applet->caller_applet_broker = storage; - applet->frontend = system.GetFrontendAppletHolder().GetApplet(applet, applet_id, mode); - { - std::scoped_lock lk{caller_applet->lock}; - caller_applet->child_applets.push_back(applet); - } - return std::make_shared(system, storage, applet); -} - -class ILibraryAppletCreator final : public ServiceFramework { -public: - explicit ILibraryAppletCreator(Core::System& system_, std::shared_ptr applet, WindowSystem& window_system) - : ServiceFramework{system_, "ILibraryAppletCreator"} - , m_window_system{window_system}, m_applet{std::move(applet)} { - } - ~ILibraryAppletCreator() override = default; - - Result CreateLibraryApplet( - Out> out_library_applet_accessor, AppletId applet_id, - LibraryAppletMode library_applet_mode) { - LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={}", applet_id, - library_applet_mode); - - std::shared_ptr library_applet; - if (ShouldCreateGuestApplet(applet_id)) { - library_applet = - CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); - } - if (!library_applet) { - library_applet = - CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); - } - if (!library_applet) { - LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id); - R_THROW(ResultUnknown); - } - - // Applet is created, can now be launched. - m_applet->library_applet_launchable_event.Signal(system.Kernel()); - *out_library_applet_accessor = library_applet; - R_SUCCEED(); - } - - Result CreateLibraryAppletEx( - Out> out_library_applet_accessor, AppletId applet_id, - LibraryAppletMode library_applet_mode, u64 thread_id) { - LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={} thread_id={}", applet_id, - library_applet_mode, thread_id); - - std::shared_ptr library_applet; - if (ShouldCreateGuestApplet(applet_id)) { - library_applet = - CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); - } - if (!library_applet) { - library_applet = - CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); - } - if (!library_applet) { - LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id); - R_THROW(ResultUnknown); - } - - // Applet is created, can now be launched. - m_applet->library_applet_launchable_event.Signal(system.Kernel()); - *out_library_applet_accessor = library_applet; - R_SUCCEED(); - } - - Result CreateStorage(Out> out_storage, s64 size) { - LOG_DEBUG(Service_AM, "called, size={}", size); - - if (size <= 0) { - LOG_ERROR(Service_AM, "size is less than or equal to 0"); - R_THROW(ResultUnknown); - } - - *out_storage = std::make_shared(system, AM::CreateStorage(std::vector(size))); - R_SUCCEED(); - } - - Result CreateTransferMemoryStorage( - Out> out_storage, bool is_writable, s64 size, - InCopyHandle transfer_memory_handle) { - LOG_DEBUG(Service_AM, "called, is_writable={} size={}", is_writable, size); - - if (size <= 0) { - LOG_ERROR(Service_AM, "size is less than or equal to 0"); - R_THROW(ResultUnknown); - } - - if (!transfer_memory_handle) { - LOG_ERROR(Service_AM, "transfer_memory_handle is null"); - R_THROW(ResultUnknown); - } - - *out_storage = std::make_shared( - system, AM::CreateTransferMemoryStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(), - transfer_memory_handle.Get(), is_writable, size)); - R_SUCCEED(); - } - - Result CreateHandleStorage( - Out> out_storage, s64 size, - InCopyHandle transfer_memory_handle) { - LOG_DEBUG(Service_AM, "called, size={}", size); - - if (size <= 0) { - LOG_ERROR(Service_AM, "size is less than or equal to 0"); - R_THROW(ResultUnknown); - } - - if (!transfer_memory_handle) { - LOG_ERROR(Service_AM, "transfer_memory_handle is null"); - R_THROW(ResultUnknown); - } - - *out_storage = std::make_shared( - system, AM::CreateHandleStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(), - transfer_memory_handle.Get(), size)); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ILibraryAppletCreator::CreateLibraryApplet>, "CreateLibraryApplet"}, - FunctionInfo{1, nullptr, "TerminateAllLibraryApplets"}, - FunctionInfo{2, nullptr, "AreAnyLibraryAppletsLeft"}, - FunctionInfo{3, D<&ILibraryAppletCreator::CreateLibraryAppletEx>, "CreateLibraryAppletEx"}, - FunctionInfo{10, D<&ILibraryAppletCreator::CreateStorage>, "CreateStorage"}, - FunctionInfo{11, D<&ILibraryAppletCreator::CreateTransferMemoryStorage>, "CreateTransferMemoryStorage"}, - FunctionInfo{12, D<&ILibraryAppletCreator::CreateHandleStorage>, "CreateHandleStorage"} - ); - WindowSystem& m_window_system; - const std::shared_ptr m_applet; -}; - -class IAllSystemAppletProxiesService final - : public ServiceFramework { -public: - explicit IAllSystemAppletProxiesService(Core::System& system_, WindowSystem& window_system) - : ServiceFramework{system_, "appletAE"}, m_window_system{window_system} { - } - - ~IAllSystemAppletProxiesService() override = default; - - Result OpenSystemAppletProxy( - Out> out_system_applet_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_DEBUG(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid); applet) { - *out_system_applet_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } - } - - Result OpenLibraryAppletProxy( - Out> out_library_applet_proxy, ClientProcessId pid, - InCopyHandle process_handle, - InLargeData attribute) { - LOG_DEBUG(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid); applet) { - *out_library_applet_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } - } - - Result OpenOverlayAppletProxy( - Out> out_overlay_applet_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_WARNING(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid); applet) { - *out_overlay_applet_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } - } - - Result OpenSystemApplicationProxy( - Out> out_system_application_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_DEBUG(Service_AM, "called"); - - if (const auto applet = this->GetAppletFromProcessId(pid); applet) { - *out_system_application_proxy = std::make_shared( - system, applet, process_handle.Get(), m_window_system); - R_SUCCEED(); - } else { - UNIMPLEMENTED(); - R_THROW(ResultUnknown); - } - } - - Result OpenLibraryAppletProxyOld( - Out> out_library_applet_proxy, ClientProcessId pid, - InCopyHandle process_handle) { - LOG_DEBUG(Service_AM, "called"); - - AppletAttribute attribute{}; - R_RETURN(this->OpenLibraryAppletProxy(out_library_applet_proxy, pid, process_handle, attribute)); - } - - Result GetSystemProcessCommonFunctions() { - LOG_DEBUG(Service_AM, "(STUBBED) called."); - // TODO (jarrodnorwell) - R_SUCCEED(); - } - - Result GetAppletAlternativeFunctions() { - LOG_DEBUG(Service_AM, "(STUBBED) called."); - // TODO (maufeat) - R_SUCCEED(); - } - - std::shared_ptr GetAppletFromProcessId(ProcessId process_id) { - return m_window_system.GetByAppletResourceUserId(process_id.pid); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{100, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxy"}, - FunctionInfo{110, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxyEx"}, - FunctionInfo{200, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld>, "OpenLibraryAppletProxyOld"}, - FunctionInfo{201, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxy>, "OpenLibraryAppletProxy"}, - FunctionInfo{300, D<&IAllSystemAppletProxiesService::OpenOverlayAppletProxy>, "OpenOverlayAppletProxy"}, - FunctionInfo{350, D<&IAllSystemAppletProxiesService::OpenSystemApplicationProxy>, "OpenSystemApplicationProxy"}, - FunctionInfo{400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"}, - FunctionInfo{410, nullptr, "GetSystemAppletControllerForDebug"}, - FunctionInfo{450, D<&IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions>, "GetSystemProcessCommonFunctions", MakeVersionGate({19,0,0})}, - FunctionInfo{460, D<&IAllSystemAppletProxiesService::GetAppletAlternativeFunctions>, "GetAppletAlternativeFunctions", MakeVersionGate({20,0,0})}, - FunctionInfo{1000, nullptr, "GetDebugFunctions"} - ); - WindowSystem& m_window_system; -}; - void LoopProcess(Core::System& system) { WindowSystem window_system(system); ButtonPoller button_poller(system, window_system); @@ -1345,8 +21,10 @@ void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("appletAE", std::make_shared(system, window_system)); - server_manager->RegisterNamedService("appletOE", std::make_shared(system, window_system)); + server_manager->RegisterNamedService( + "appletAE", std::make_shared(system, window_system)); + server_manager->RegisterNamedService( + "appletOE", std::make_shared(system, window_system)); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index 1afe253aed..0bf5880f30 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/am/applet_manager.h b/src/core/hle/service/am/applet_manager.h index 2b0714adf7..cd3035de31 100644 --- a/src/core/hle/service/am/applet_manager.h +++ b/src/core/hle/service/am/applet_manager.h @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/core/hle/service/am/frontend/applet_cabinet.h b/src/core/hle/service/am/frontend/applet_cabinet.h index 3a211ed372..a74f233569 100644 --- a/src/core/hle/service/am/frontend/applet_cabinet.h +++ b/src/core/hle/service/am/frontend/applet_cabinet.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/am/frontend/applet_controller.h b/src/core/hle/service/am/frontend/applet_controller.h index 341ebed234..3877a7b02e 100644 --- a/src/core/hle/service/am/frontend/applet_controller.h +++ b/src/core/hle/service/am/frontend/applet_controller.h @@ -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-FileCopyrightText: Copyright 2020 yuzu Emulator Project diff --git a/src/core/hle/service/am/frontend/applet_error.h b/src/core/hle/service/am/frontend/applet_error.h index 678bf33fac..af3e2134a5 100644 --- a/src/core/hle/service/am/frontend/applet_error.h +++ b/src/core/hle/service/am/frontend/applet_error.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/am/frontend/applet_general.h b/src/core/hle/service/am/frontend/applet_general.h index eaa7ae25fe..ceb0537119 100644 --- a/src/core/hle/service/am/frontend/applet_general.h +++ b/src/core/hle/service/am/frontend/applet_general.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/am/frontend/applet_mii_edit.h b/src/core/hle/service/am/frontend/applet_mii_edit.h index 5db792f7d2..8654426431 100644 --- a/src/core/hle/service/am/frontend/applet_mii_edit.h +++ b/src/core/hle/service/am/frontend/applet_mii_edit.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/am/frontend/applet_mii_edit_types.h b/src/core/hle/service/am/frontend/applet_mii_edit_types.h index 23d9d7a69b..9c354bd947 100644 --- a/src/core/hle/service/am/frontend/applet_mii_edit_types.h +++ b/src/core/hle/service/am/frontend/applet_mii_edit_types.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/am/frontend/applet_net_connect.h b/src/core/hle/service/am/frontend/applet_net_connect.h index d5d503ed41..0986b63c60 100644 --- a/src/core/hle/service/am/frontend/applet_net_connect.h +++ b/src/core/hle/service/am/frontend/applet_net_connect.h @@ -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 #pragma once diff --git a/src/core/hle/service/am/frontend/applet_profile_select.cpp b/src/core/hle/service/am/frontend/applet_profile_select.cpp index 89b5a1eabe..0f46ee6232 100644 --- a/src/core/hle/service/am/frontend/applet_profile_select.cpp +++ b/src/core/hle/service/am/frontend/applet_profile_select.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/am/frontend/applet_profile_select.h b/src/core/hle/service/am/frontend/applet_profile_select.h index 674e7afe17..4feba73a37 100644 --- a/src/core/hle/service/am/frontend/applet_profile_select.h +++ b/src/core/hle/service/am/frontend/applet_profile_select.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/am/frontend/applet_software_keyboard_types.h b/src/core/hle/service/am/frontend/applet_software_keyboard_types.h index a25ff2a6d2..6bb8f437d3 100644 --- a/src/core/hle/service/am/frontend/applet_software_keyboard_types.h +++ b/src/core/hle/service/am/frontend/applet_software_keyboard_types.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/am/frontend/applet_web_browser.h b/src/core/hle/service/am/frontend/applet_web_browser.h index ae62389f13..41461a93d0 100644 --- a/src/core/hle/service/am/frontend/applet_web_browser.h +++ b/src/core/hle/service/am/frontend/applet_web_browser.h @@ -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-FileCopyrightText: Copyright 2020 yuzu Emulator Project diff --git a/src/core/hle/service/am/frontend/applets.h b/src/core/hle/service/am/frontend/applets.h index 8eb08ea77b..6259a5668a 100644 --- a/src/core/hle/service/am/frontend/applets.h +++ b/src/core/hle/service/am/frontend/applets.h @@ -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-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/core/hle/service/am/process_holder.cpp b/src/core/hle/service/am/process_holder.cpp index 21ef5bf838..8ad6599fd6 100644 --- a/src/core/hle/service/am/process_holder.cpp +++ b/src/core/hle/service/am/process_holder.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/am/process_holder.h b/src/core/hle/service/am/process_holder.h index 3a9b81dfb4..dbf04668dc 100644 --- a/src/core/hle/service/am/process_holder.h +++ b/src/core/hle/service/am/process_holder.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp b/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp new file mode 100644 index 0000000000..437032c2f4 --- /dev/null +++ b/src/core/hle/service/am/service/all_system_applet_proxies_service.cpp @@ -0,0 +1,135 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/core.h" +#include "core/hle/service/am/applet_manager.h" +#include "core/hle/service/am/service/all_system_applet_proxies_service.h" +#include "core/hle/service/am/service/application_proxy.h" +#include "core/hle/service/am/service/library_applet_proxy.h" +#include "core/hle/service/am/service/system_applet_proxy.h" +#include "core/hle/service/am/service/overlay_applet_proxy.h" +#include "core/hle/service/am/window_system.h" +#include "core/hle/service/cmif_serialization.h" + +namespace Service::AM { + +IAllSystemAppletProxiesService::IAllSystemAppletProxiesService(Core::System& system_, + WindowSystem& window_system) + : ServiceFramework{system_, "appletAE"}, m_window_system{window_system} { + // clang-format off + static const FunctionInfo functions[] = { + {100, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxy"}, + {110, D<&IAllSystemAppletProxiesService::OpenSystemAppletProxy>, "OpenSystemAppletProxyEx"}, + {200, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld>, "OpenLibraryAppletProxyOld"}, + {201, D<&IAllSystemAppletProxiesService::OpenLibraryAppletProxy>, "OpenLibraryAppletProxy"}, + {300, D<&IAllSystemAppletProxiesService::OpenOverlayAppletProxy>, "OpenOverlayAppletProxy"}, + {350, D<&IAllSystemAppletProxiesService::OpenSystemApplicationProxy>, "OpenSystemApplicationProxy"}, + {400, nullptr, "CreateSelfLibraryAppletCreatorForDevelop"}, + {410, nullptr, "GetSystemAppletControllerForDebug"}, + {450, D<&IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions>, "GetSystemProcessCommonFunctions"}, // 19.0.0+ + {460, D<&IAllSystemAppletProxiesService::GetAppletAlternativeFunctions>, "GetAppletAlternativeFunctions"}, // 20.0.0+ + {1000, nullptr, "GetDebugFunctions"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +IAllSystemAppletProxiesService::~IAllSystemAppletProxiesService() = default; + +Result IAllSystemAppletProxiesService::OpenSystemAppletProxy( + Out> out_system_applet_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_DEBUG(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid); applet) { + *out_system_applet_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } +} + +Result IAllSystemAppletProxiesService::OpenLibraryAppletProxy( + Out> out_library_applet_proxy, ClientProcessId pid, + InCopyHandle process_handle, + InLargeData attribute) { + LOG_DEBUG(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid); applet) { + *out_library_applet_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } +} + +Result IAllSystemAppletProxiesService::OpenOverlayAppletProxy( + Out> out_overlay_applet_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_WARNING(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid); applet) { + *out_overlay_applet_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } +} + +Result IAllSystemAppletProxiesService::OpenSystemApplicationProxy( + Out> out_system_application_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_DEBUG(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid); applet) { + *out_system_application_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } +} + +Result IAllSystemAppletProxiesService::OpenLibraryAppletProxyOld( + Out> out_library_applet_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_DEBUG(Service_AM, "called"); + + AppletAttribute attribute{}; + R_RETURN( + this->OpenLibraryAppletProxy(out_library_applet_proxy, pid, process_handle, attribute)); +} + +Result IAllSystemAppletProxiesService::GetSystemProcessCommonFunctions() { + LOG_DEBUG(Service_AM, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + R_SUCCEED(); +} + +Result IAllSystemAppletProxiesService::GetAppletAlternativeFunctions() { + LOG_DEBUG(Service_AM, "(STUBBED) called."); + + // TODO (maufeat) + + R_SUCCEED(); +} + +std::shared_ptr IAllSystemAppletProxiesService::GetAppletFromProcessId( + ProcessId process_id) { + return m_window_system.GetByAppletResourceUserId(process_id.pid); +} + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/all_system_applet_proxies_service.h b/src/core/hle/service/am/service/all_system_applet_proxies_service.h new file mode 100644 index 0000000000..73cb8a09ac --- /dev/null +++ b/src/core/hle/service/am/service/all_system_applet_proxies_service.h @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" +#include "core/hle/service/am/service/overlay_applet_proxy.h" + +namespace Service { + +namespace AM { + +struct Applet; +struct AppletAttribute; +class IApplicationProxy; +class ILibraryAppletProxy; +class ISystemAppletProxy; +class WindowSystem; + +class IAllSystemAppletProxiesService final + : public ServiceFramework { +public: + explicit IAllSystemAppletProxiesService(Core::System& system_, WindowSystem& window_system); + ~IAllSystemAppletProxiesService() override; + +private: + Result OpenSystemAppletProxy(Out> out_system_applet_proxy, + ClientProcessId pid, + InCopyHandle process_handle); + Result OpenLibraryAppletProxy(Out> out_library_applet_proxy, + ClientProcessId pid, + InCopyHandle process_handle, + InLargeData attribute); + Result OpenOverlayAppletProxy(Out> out_overlay_applet_proxy, + ClientProcessId pid, InCopyHandle process_handle); + Result OpenLibraryAppletProxyOld( + Out> out_library_applet_proxy, ClientProcessId pid, + InCopyHandle process_handle); + Result OpenSystemApplicationProxy( + Out> out_system_application_proxy, ClientProcessId pid, + InCopyHandle process_handle); + Result GetSystemProcessCommonFunctions(); + Result GetAppletAlternativeFunctions(); + +private: + std::shared_ptr GetAppletFromProcessId(ProcessId pid); + + WindowSystem& m_window_system; +}; + +} // namespace AM +} // namespace Service diff --git a/src/core/hle/service/am/service/applet_common_functions.cpp b/src/core/hle/service/am/service/applet_common_functions.cpp new file mode 100644 index 0000000000..5ffec23b3e --- /dev/null +++ b/src/core/hle/service/am/service/applet_common_functions.cpp @@ -0,0 +1,98 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/core.h" +#include "core/file_sys/common_funcs.h" +#include "core/hle/service/am/applet.h" +#include "core/hle/service/am/service/applet_common_functions.h" +#include "core/hle/service/cmif_serialization.h" + +namespace Service::AM { + +IAppletCommonFunctions::IAppletCommonFunctions(Core::System& system_, + std::shared_ptr applet_) + : ServiceFramework{system_, "IAppletCommonFunctions"}, applet{std::move(applet_)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "SetTerminateResult"}, + {10, nullptr, "ReadThemeStorage"}, + {11, nullptr, "WriteThemeStorage"}, + {20, nullptr, "PushToAppletBoundChannel"}, + {21, nullptr, "TryPopFromAppletBoundChannel"}, + {40, nullptr, "GetDisplayLogicalResolution"}, + {42, D<&IAppletCommonFunctions::SetDisplayMagnification>, "SetDisplayMagnification"}, + {50, D<&IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled>, "SetHomeButtonDoubleClickEnabled"}, + {51, D<&IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled>, "GetHomeButtonDoubleClickEnabled"}, + {52, nullptr, "IsHomeButtonShortPressedBlocked"}, + {60, nullptr, "IsVrModeCurtainRequired"}, + {61, nullptr, "IsSleepRequiredByHighTemperature"}, + {62, nullptr, "IsSleepRequiredByLowBattery"}, + {70, D<&IAppletCommonFunctions::SetCpuBoostRequestPriority>, "SetCpuBoostRequestPriority"}, + {80, nullptr, "SetHandlingCaptureButtonShortPressedMessageEnabledForApplet"}, + {81, nullptr, "SetHandlingCaptureButtonLongPressedMessageEnabledForApplet"}, + {90, nullptr, "OpenNamedChannelAsParent"}, + {91, nullptr, "OpenNamedChannelAsChild"}, + {100, nullptr, "SetApplicationCoreUsageMode"}, + {300, D<&IAppletCommonFunctions::GetCurrentApplicationId>, "GetCurrentApplicationId"}, + {310, nullptr, "IsSystemAppletHomeMenu"}, //19.0.0+ + {320, D<&IAppletCommonFunctions::SetGpuTimeSliceBoost>, "SetGpuTimeSliceBoost"}, //19.0.0+ + {321, nullptr, "SetGpuTimeSliceBoostDueToApplication"}, //19.0.0+ + {350, D<&IAppletCommonFunctions::Unknown350>, "Unknown350"} //20.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); +} + +IAppletCommonFunctions::~IAppletCommonFunctions() = default; + +Result IAppletCommonFunctions::SetHomeButtonDoubleClickEnabled( + bool home_button_double_click_enabled) { + LOG_WARNING(Service_AM, "(STUBBED) called, home_button_double_click_enabled={}", + home_button_double_click_enabled); + R_SUCCEED(); +} + +Result IAppletCommonFunctions::GetHomeButtonDoubleClickEnabled( + Out out_home_button_double_click_enabled) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_home_button_double_click_enabled = false; + R_SUCCEED(); +} + +Result IAppletCommonFunctions::SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height) { + LOG_DEBUG(Service_AM, "(STUBBED) called, x={}, y={}, width={}, height={}", x, y, width, + height); + std::scoped_lock lk{applet->lock}; + applet->display_magnification = Common::Rectangle{x, y, x + width, y + height}; + R_SUCCEED(); +} + +Result IAppletCommonFunctions::SetCpuBoostRequestPriority(s32 priority) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + std::scoped_lock lk{applet->lock}; + applet->cpu_boost_request_priority = priority; + R_SUCCEED(); +} + +Result IAppletCommonFunctions::GetCurrentApplicationId(Out out_application_id) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_application_id = FileSys::GetBaseTitleID(system.GetApplicationProcessProgramID()); + R_SUCCEED(); +} + +Result IAppletCommonFunctions::SetGpuTimeSliceBoost(s64 time_span) { + LOG_WARNING(Service_AM, "(STUBBED) called, time_span={}", time_span); + R_SUCCEED(); +} + +Result IAppletCommonFunctions::Unknown350(Out out_unknown) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_unknown = 0; + R_SUCCEED(); +} + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/applet_common_functions.h b/src/core/hle/service/am/service/applet_common_functions.h new file mode 100644 index 0000000000..696fcd5bd1 --- /dev/null +++ b/src/core/hle/service/am/service/applet_common_functions.h @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Service::AM { + +struct Applet; + +class IAppletCommonFunctions final : public ServiceFramework { +public: + explicit IAppletCommonFunctions(Core::System& system_, std::shared_ptr applet_); + ~IAppletCommonFunctions() override; + +private: + Result SetHomeButtonDoubleClickEnabled(bool home_button_double_click_enabled); + Result GetHomeButtonDoubleClickEnabled(Out out_home_button_double_click_enabled); + Result SetDisplayMagnification(f32 x, f32 y, f32 width, f32 height); + Result SetCpuBoostRequestPriority(s32 priority); + Result GetCurrentApplicationId(Out out_application_id); + Result SetGpuTimeSliceBoost(s64 time_span); + Result Unknown350(Out out_unknown); + + const std::shared_ptr applet; +}; + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/application_accessor.cpp b/src/core/hle/service/am/service/application_accessor.cpp index d24c2616dc..f357871706 100644 --- a/src/core/hle/service/am/service/application_accessor.cpp +++ b/src/core/hle/service/am/service/application_accessor.cpp @@ -18,42 +18,42 @@ namespace Service::AM { -std::optional IApplicationAccessor::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IApplicationAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"}, - FunctionInfo{1, nullptr, "IsCompleted"}, - FunctionInfo{10, D<&IApplicationAccessor::Start>, "Start"}, - FunctionInfo{20, D<&IApplicationAccessor::RequestExit>, "RequestExit"}, - FunctionInfo{25, D<&IApplicationAccessor::Terminate>, "Terminate"}, - FunctionInfo{30, D<&IApplicationAccessor::GetResult>, "GetResult"}, - FunctionInfo{101, D<&IApplicationAccessor::RequestForApplicationToGetForeground>, "RequestForApplicationToGetForeground"}, - FunctionInfo{110, nullptr, "TerminateAllLibraryApplets"}, - FunctionInfo{111, nullptr, "AreAnyLibraryAppletsLeft"}, - FunctionInfo{112, D<&IApplicationAccessor::GetCurrentLibraryApplet>, "GetCurrentLibraryApplet"}, - FunctionInfo{120, nullptr, "GetApplicationId"}, - FunctionInfo{121, D<&IApplicationAccessor::PushLaunchParameter>, "PushLaunchParameter"}, - FunctionInfo{122, D<&IApplicationAccessor::GetApplicationControlProperty>, "GetApplicationControlProperty"}, - FunctionInfo{123, nullptr, "GetApplicationLaunchProperty"}, - FunctionInfo{124, nullptr, "GetApplicationLaunchRequestInfo"}, - FunctionInfo{130, D<&IApplicationAccessor::SetUsers>, "SetUsers"}, - FunctionInfo{131, D<&IApplicationAccessor::CheckRightsEnvironmentAvailable>, "CheckRightsEnvironmentAvailable"}, - FunctionInfo{132, D<&IApplicationAccessor::GetNsRightsEnvironmentHandle>, "GetNsRightsEnvironmentHandle"}, - FunctionInfo{140, nullptr, "GetDesirableUids"}, - FunctionInfo{150, D<&IApplicationAccessor::ReportApplicationExitTimeout>, "ReportApplicationExitTimeout"}, - FunctionInfo{160, nullptr, "SetApplicationAttribute"}, - FunctionInfo{170, nullptr, "HasSaveDataAccessPermission"}, - FunctionInfo{180, nullptr, "PushToFriendInvitationStorageChannel"}, - FunctionInfo{190, nullptr, "PushToNotificationStorageChannel"}, - FunctionInfo{200, nullptr, "RequestApplicationSoftReset"}, - FunctionInfo{201, nullptr, "RestartApplicationTimer"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IApplicationAccessor::IApplicationAccessor(Core::System& system_, std::shared_ptr applet, WindowSystem& window_system) : ServiceFramework{system_, "IApplicationAccessor"}, m_window_system(window_system), m_applet(std::move(applet)) { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IApplicationAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"}, + {1, nullptr, "IsCompleted"}, + {10, D<&IApplicationAccessor::Start>, "Start"}, + {20, D<&IApplicationAccessor::RequestExit>, "RequestExit"}, + {25, D<&IApplicationAccessor::Terminate>, "Terminate"}, + {30, D<&IApplicationAccessor::GetResult>, "GetResult"}, + {101, D<&IApplicationAccessor::RequestForApplicationToGetForeground>, "RequestForApplicationToGetForeground"}, + {110, nullptr, "TerminateAllLibraryApplets"}, + {111, nullptr, "AreAnyLibraryAppletsLeft"}, + {112, D<&IApplicationAccessor::GetCurrentLibraryApplet>, "GetCurrentLibraryApplet"}, + {120, nullptr, "GetApplicationId"}, + {121, D<&IApplicationAccessor::PushLaunchParameter>, "PushLaunchParameter"}, + {122, D<&IApplicationAccessor::GetApplicationControlProperty>, "GetApplicationControlProperty"}, + {123, nullptr, "GetApplicationLaunchProperty"}, + {124, nullptr, "GetApplicationLaunchRequestInfo"}, + {130, D<&IApplicationAccessor::SetUsers>, "SetUsers"}, + {131, D<&IApplicationAccessor::CheckRightsEnvironmentAvailable>, "CheckRightsEnvironmentAvailable"}, + {132, D<&IApplicationAccessor::GetNsRightsEnvironmentHandle>, "GetNsRightsEnvironmentHandle"}, + {140, nullptr, "GetDesirableUids"}, + {150, D<&IApplicationAccessor::ReportApplicationExitTimeout>, "ReportApplicationExitTimeout"}, + {160, nullptr, "SetApplicationAttribute"}, + {170, nullptr, "HasSaveDataAccessPermission"}, + {180, nullptr, "PushToFriendInvitationStorageChannel"}, + {190, nullptr, "PushToNotificationStorageChannel"}, + {200, nullptr, "RequestApplicationSoftReset"}, + {201, nullptr, "RestartApplicationTimer"}, + }; + // clang-format on + + RegisterHandlers(functions); } IApplicationAccessor::~IApplicationAccessor() = default; diff --git a/src/core/hle/service/am/service/application_accessor.h b/src/core/hle/service/am/service/application_accessor.h index 57b222fc19..7908099916 100644 --- a/src/core/hle/service/am/service/application_accessor.h +++ b/src/core/hle/service/am/service/application_accessor.h @@ -39,7 +39,6 @@ private: Result GetNsRightsEnvironmentHandle(Out out_handle); Result ReportApplicationExitTimeout(); - std::optional FindRequest(u32 key) override; WindowSystem& m_window_system; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/application_creator.cpp b/src/core/hle/service/am/service/application_creator.cpp index 8d57f917fb..4eb2f29e22 100644 --- a/src/core/hle/service/am/service/application_creator.cpp +++ b/src/core/hle/service/am/service/application_creator.cpp @@ -20,16 +20,6 @@ namespace Service::AM { -std::optional IApplicationCreator::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IApplicationCreator::CreateApplication>, "CreateApplication"}, - FunctionInfo{1, nullptr, "PopLaunchRequestedApplication"}, - FunctionInfo{10, D<&IApplicationCreator::CreateSystemApplication>, "CreateSystemApplication"}, - FunctionInfo{100, nullptr, "PopFloatingApplicationForDevelopment"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - namespace { Result CreateGuestApplication(SharedPointer* out_application_accessor, Core::System& system, WindowSystem& window_system, u64 program_id) { @@ -64,6 +54,16 @@ Result CreateGuestApplication(SharedPointer* out_applicati IApplicationCreator::IApplicationCreator(Core::System& system_, WindowSystem& window_system) : ServiceFramework{system_, "IApplicationCreator"}, m_window_system{window_system} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IApplicationCreator::CreateApplication>, "CreateApplication"}, + {1, nullptr, "PopLaunchRequestedApplication"}, + {10, D<&IApplicationCreator::CreateSystemApplication>, "CreateSystemApplication"}, + {100, nullptr, "PopFloatingApplicationForDevelopment"}, + }; + // clang-format on + + RegisterHandlers(functions); } IApplicationCreator::~IApplicationCreator() = default; diff --git a/src/core/hle/service/am/service/application_creator.h b/src/core/hle/service/am/service/application_creator.h index 64434af542..59ae924131 100644 --- a/src/core/hle/service/am/service/application_creator.h +++ b/src/core/hle/service/am/service/application_creator.h @@ -24,7 +24,6 @@ private: Result CreateApplication(Out>, u64 application_id); Result CreateSystemApplication(Out>, u64 application_id); - std::optional FindRequest(u32 key) override; WindowSystem& m_window_system; }; diff --git a/src/core/hle/service/am/service/application_functions.cpp b/src/core/hle/service/am/service/application_functions.cpp index 4fda5eedd6..90d292c4a2 100644 --- a/src/core/hle/service/am/service/application_functions.cpp +++ b/src/core/hle/service/am/service/application_functions.cpp @@ -51,84 +51,83 @@ FileSys::PatchManager::Metadata GetApplicationMetadata(Core::System& system, u64 } // Anonymous namespace -std::optional IApplicationFunctions::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, D<&IApplicationFunctions::PopLaunchParameter>, "PopLaunchParameter"}, - FunctionInfo{10, nullptr, "CreateApplicationAndPushAndRequestToStart"}, - FunctionInfo{11, nullptr, "CreateApplicationAndPushAndRequestToStartForQuest"}, - FunctionInfo{12, D<&IApplicationFunctions::CreateApplicationAndRequestToStart>, "CreateApplicationAndRequestToStart"}, - FunctionInfo{13, nullptr, "CreateApplicationAndRequestToStartForQuest"}, - FunctionInfo{14, nullptr, "CreateApplicationWithAttributeAndPushAndRequestToStartForQuest"}, - FunctionInfo{15, nullptr, "CreateApplicationWithAttributeAndRequestToStartForQuest"}, - FunctionInfo{20, D<&IApplicationFunctions::EnsureSaveData>, "EnsureSaveData"}, - FunctionInfo{21, D<&IApplicationFunctions::GetDesiredLanguage>, "GetDesiredLanguage"}, - FunctionInfo{22, D<&IApplicationFunctions::SetTerminateResult>, "SetTerminateResult"}, - FunctionInfo{23, D<&IApplicationFunctions::GetDisplayVersion>, "GetDisplayVersion"}, - FunctionInfo{24, nullptr, "GetLaunchStorageInfoForDebug"}, - FunctionInfo{25, D<&IApplicationFunctions::ExtendSaveData>, "ExtendSaveData"}, - FunctionInfo{26, D<&IApplicationFunctions::GetSaveDataSize>, "GetSaveDataSize"}, - FunctionInfo{27, D<&IApplicationFunctions::CreateCacheStorage>, "CreateCacheStorage"}, - FunctionInfo{28, D<&IApplicationFunctions::GetSaveDataSizeMax>, "GetSaveDataSizeMax"}, - FunctionInfo{29, D<&IApplicationFunctions::GetCacheStorageMax>, "GetCacheStorageMax"}, - FunctionInfo{30, D<&IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed>, "BeginBlockingHomeButtonShortAndLongPressed"}, - FunctionInfo{31, D<&IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed>, "EndBlockingHomeButtonShortAndLongPressed"}, - FunctionInfo{32, D<&IApplicationFunctions::BeginBlockingHomeButton>, "BeginBlockingHomeButton"}, - FunctionInfo{33, D<&IApplicationFunctions::EndBlockingHomeButton>, "EndBlockingHomeButton"}, - FunctionInfo{34, nullptr, "SelectApplicationLicense"}, - FunctionInfo{35, nullptr, "GetDeviceSaveDataSizeMax"}, - FunctionInfo{36, nullptr, "GetLimitedApplicationLicense"}, - FunctionInfo{37, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"}, - FunctionInfo{40, D<&IApplicationFunctions::NotifyRunning>, "NotifyRunning"}, - FunctionInfo{50, D<&IApplicationFunctions::GetPseudoDeviceId>, "GetPseudoDeviceId"}, - FunctionInfo{60, D<&IApplicationFunctions::SetMediaPlaybackStateForApplication>, "SetMediaPlaybackStateForApplication"}, - FunctionInfo{65, D<&IApplicationFunctions::IsGamePlayRecordingSupported>, "IsGamePlayRecordingSupported"}, - FunctionInfo{66, D<&IApplicationFunctions::InitializeGamePlayRecording>, "InitializeGamePlayRecording"}, - FunctionInfo{67, D<&IApplicationFunctions::SetGamePlayRecordingState>, "SetGamePlayRecordingState"}, - FunctionInfo{68, nullptr, "RequestFlushGamePlayingMovieForDebug"}, - FunctionInfo{70, nullptr, "RequestToShutdown"}, - FunctionInfo{71, nullptr, "RequestToReboot"}, - FunctionInfo{72, nullptr, "RequestToSleep"}, - FunctionInfo{80, nullptr, "ExitAndRequestToShowThanksMessage"}, - FunctionInfo{90, D<&IApplicationFunctions::EnableApplicationCrashReport>, "EnableApplicationCrashReport"}, - FunctionInfo{100, D<&IApplicationFunctions::InitializeApplicationCopyrightFrameBuffer>, "InitializeApplicationCopyrightFrameBuffer"}, - FunctionInfo{101, D<&IApplicationFunctions::SetApplicationCopyrightImage>, "SetApplicationCopyrightImage"}, - FunctionInfo{102, D<&IApplicationFunctions::SetApplicationCopyrightVisibility>, "SetApplicationCopyrightVisibility"}, - FunctionInfo{110, D<&IApplicationFunctions::QueryApplicationPlayStatistics>, "QueryApplicationPlayStatistics"}, - FunctionInfo{111, D<&IApplicationFunctions::QueryApplicationPlayStatisticsByUid>, "QueryApplicationPlayStatisticsByUid"}, - FunctionInfo{120, D<&IApplicationFunctions::ExecuteProgram>, "ExecuteProgram"}, - FunctionInfo{121, D<&IApplicationFunctions::ClearUserChannel>, "ClearUserChannel"}, - FunctionInfo{122, D<&IApplicationFunctions::UnpopToUserChannel>, "UnpopToUserChannel"}, - FunctionInfo{123, D<&IApplicationFunctions::GetPreviousProgramIndex>, "GetPreviousProgramIndex"}, - FunctionInfo{124, nullptr, "EnableApplicationAllThreadDumpOnCrash"}, - FunctionInfo{130, D<&IApplicationFunctions::GetGpuErrorDetectedSystemEvent>, "GetGpuErrorDetectedSystemEvent"}, - FunctionInfo{131, nullptr, "SetDelayTimeToAbortOnGpuError"}, - FunctionInfo{140, D<&IApplicationFunctions::GetFriendInvitationStorageChannelEvent>, "GetFriendInvitationStorageChannelEvent"}, - FunctionInfo{141, D<&IApplicationFunctions::TryPopFromFriendInvitationStorageChannel>, "TryPopFromFriendInvitationStorageChannel"}, - FunctionInfo{150, D<&IApplicationFunctions::GetNotificationStorageChannelEvent>, "GetNotificationStorageChannelEvent"}, - FunctionInfo{151, nullptr, "TryPopFromNotificationStorageChannel"}, - FunctionInfo{160, D<&IApplicationFunctions::GetHealthWarningDisappearedSystemEvent>, "GetHealthWarningDisappearedSystemEvent"}, - FunctionInfo{170, nullptr, "SetHdcpAuthenticationActivated"}, - FunctionInfo{180, nullptr, "GetLaunchRequiredVersion"}, - FunctionInfo{181, nullptr, "UpgradeLaunchRequiredVersion"}, - FunctionInfo{190, nullptr, "SendServerMaintenanceOverlayNotification"}, - FunctionInfo{200, nullptr, "GetLastApplicationExitReason"}, - FunctionInfo{210, D<&IApplicationFunctions::GetUnknownEvent210>, "Unknown210"}, - FunctionInfo{220, nullptr, "Unknown220"}, // [20.0.0+] - FunctionInfo{300, nullptr, "CreateMovieWriter"}, // [19.0.0+] - FunctionInfo{310, nullptr, "Unknown310"}, // [20.0.0+] - FunctionInfo{320, nullptr, "Unknown320"}, // [20.0.0+] - FunctionInfo{330, D<&IApplicationFunctions::Unknown330>, "Unknown330"}, // [20.0.0+] - FunctionInfo{500, nullptr, "StartContinuousRecordingFlushForDebug"}, - FunctionInfo{1000, nullptr, "CreateMovieMaker"}, - FunctionInfo{1001, D<&IApplicationFunctions::PrepareForJit>, "PrepareForJit"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IApplicationFunctions::IApplicationFunctions(Core::System& system_, std::shared_ptr applet) - : ServiceFramework{system_, "IApplicationFunctions"} - , m_applet{std::move(applet)} -{} + : ServiceFramework{system_, "IApplicationFunctions"}, m_applet{std::move(applet)} { + // clang-format off + static const FunctionInfo functions[] = { + {1, D<&IApplicationFunctions::PopLaunchParameter>, "PopLaunchParameter"}, + {10, nullptr, "CreateApplicationAndPushAndRequestToStart"}, + {11, nullptr, "CreateApplicationAndPushAndRequestToStartForQuest"}, + {12, D<&IApplicationFunctions::CreateApplicationAndRequestToStart>, "CreateApplicationAndRequestToStart"}, + {13, nullptr, "CreateApplicationAndRequestToStartForQuest"}, + {14, nullptr, "CreateApplicationWithAttributeAndPushAndRequestToStartForQuest"}, + {15, nullptr, "CreateApplicationWithAttributeAndRequestToStartForQuest"}, + {20, D<&IApplicationFunctions::EnsureSaveData>, "EnsureSaveData"}, + {21, D<&IApplicationFunctions::GetDesiredLanguage>, "GetDesiredLanguage"}, + {22, D<&IApplicationFunctions::SetTerminateResult>, "SetTerminateResult"}, + {23, D<&IApplicationFunctions::GetDisplayVersion>, "GetDisplayVersion"}, + {24, nullptr, "GetLaunchStorageInfoForDebug"}, + {25, D<&IApplicationFunctions::ExtendSaveData>, "ExtendSaveData"}, + {26, D<&IApplicationFunctions::GetSaveDataSize>, "GetSaveDataSize"}, + {27, D<&IApplicationFunctions::CreateCacheStorage>, "CreateCacheStorage"}, + {28, D<&IApplicationFunctions::GetSaveDataSizeMax>, "GetSaveDataSizeMax"}, + {29, D<&IApplicationFunctions::GetCacheStorageMax>, "GetCacheStorageMax"}, + {30, D<&IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed>, "BeginBlockingHomeButtonShortAndLongPressed"}, + {31, D<&IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed>, "EndBlockingHomeButtonShortAndLongPressed"}, + {32, D<&IApplicationFunctions::BeginBlockingHomeButton>, "BeginBlockingHomeButton"}, + {33, D<&IApplicationFunctions::EndBlockingHomeButton>, "EndBlockingHomeButton"}, + {34, nullptr, "SelectApplicationLicense"}, + {35, nullptr, "GetDeviceSaveDataSizeMax"}, + {36, nullptr, "GetLimitedApplicationLicense"}, + {37, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"}, + {40, D<&IApplicationFunctions::NotifyRunning>, "NotifyRunning"}, + {50, D<&IApplicationFunctions::GetPseudoDeviceId>, "GetPseudoDeviceId"}, + {60, D<&IApplicationFunctions::SetMediaPlaybackStateForApplication>, "SetMediaPlaybackStateForApplication"}, + {65, D<&IApplicationFunctions::IsGamePlayRecordingSupported>, "IsGamePlayRecordingSupported"}, + {66, D<&IApplicationFunctions::InitializeGamePlayRecording>, "InitializeGamePlayRecording"}, + {67, D<&IApplicationFunctions::SetGamePlayRecordingState>, "SetGamePlayRecordingState"}, + {68, nullptr, "RequestFlushGamePlayingMovieForDebug"}, + {70, nullptr, "RequestToShutdown"}, + {71, nullptr, "RequestToReboot"}, + {72, nullptr, "RequestToSleep"}, + {80, nullptr, "ExitAndRequestToShowThanksMessage"}, + {90, D<&IApplicationFunctions::EnableApplicationCrashReport>, "EnableApplicationCrashReport"}, + {100, D<&IApplicationFunctions::InitializeApplicationCopyrightFrameBuffer>, "InitializeApplicationCopyrightFrameBuffer"}, + {101, D<&IApplicationFunctions::SetApplicationCopyrightImage>, "SetApplicationCopyrightImage"}, + {102, D<&IApplicationFunctions::SetApplicationCopyrightVisibility>, "SetApplicationCopyrightVisibility"}, + {110, D<&IApplicationFunctions::QueryApplicationPlayStatistics>, "QueryApplicationPlayStatistics"}, + {111, D<&IApplicationFunctions::QueryApplicationPlayStatisticsByUid>, "QueryApplicationPlayStatisticsByUid"}, + {120, D<&IApplicationFunctions::ExecuteProgram>, "ExecuteProgram"}, + {121, D<&IApplicationFunctions::ClearUserChannel>, "ClearUserChannel"}, + {122, D<&IApplicationFunctions::UnpopToUserChannel>, "UnpopToUserChannel"}, + {123, D<&IApplicationFunctions::GetPreviousProgramIndex>, "GetPreviousProgramIndex"}, + {124, nullptr, "EnableApplicationAllThreadDumpOnCrash"}, + {130, D<&IApplicationFunctions::GetGpuErrorDetectedSystemEvent>, "GetGpuErrorDetectedSystemEvent"}, + {131, nullptr, "SetDelayTimeToAbortOnGpuError"}, + {140, D<&IApplicationFunctions::GetFriendInvitationStorageChannelEvent>, "GetFriendInvitationStorageChannelEvent"}, + {141, D<&IApplicationFunctions::TryPopFromFriendInvitationStorageChannel>, "TryPopFromFriendInvitationStorageChannel"}, + {150, D<&IApplicationFunctions::GetNotificationStorageChannelEvent>, "GetNotificationStorageChannelEvent"}, + {151, nullptr, "TryPopFromNotificationStorageChannel"}, + {160, D<&IApplicationFunctions::GetHealthWarningDisappearedSystemEvent>, "GetHealthWarningDisappearedSystemEvent"}, + {170, nullptr, "SetHdcpAuthenticationActivated"}, + {180, nullptr, "GetLaunchRequiredVersion"}, + {181, nullptr, "UpgradeLaunchRequiredVersion"}, + {190, nullptr, "SendServerMaintenanceOverlayNotification"}, + {200, nullptr, "GetLastApplicationExitReason"}, + {210, D<&IApplicationFunctions::GetUnknownEvent210>, "Unknown210"}, + {220, nullptr, "Unknown220"}, // [20.0.0+] + {300, nullptr, "CreateMovieWriter"}, // [19.0.0+] + {310, nullptr, "Unknown310"}, // [20.0.0+] + {320, nullptr, "Unknown320"}, // [20.0.0+] + {330, D<&IApplicationFunctions::Unknown330>, "Unknown330"}, // [20.0.0+] + {500, nullptr, "StartContinuousRecordingFlushForDebug"}, + {1000, nullptr, "CreateMovieMaker"}, + {1001, D<&IApplicationFunctions::PrepareForJit>, "PrepareForJit"}, + }; + // clang-format on + + RegisterHandlers(functions); +} IApplicationFunctions::~IApplicationFunctions() = default; diff --git a/src/core/hle/service/am/service/application_functions.h b/src/core/hle/service/am/service/application_functions.h index 7093d13f82..b97ed7e25e 100644 --- a/src/core/hle/service/am/service/application_functions.h +++ b/src/core/hle/service/am/service/application_functions.h @@ -84,7 +84,6 @@ private: Result GetUnknownEvent210(OutCopyHandle out_event); Result Unknown330(Out out); Result PrepareForJit(); - std::optional FindRequest(u32 key) override; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/application_proxy.cpp b/src/core/hle/service/am/service/application_proxy.cpp new file mode 100644 index 0000000000..df438e1e17 --- /dev/null +++ b/src/core/hle/service/am/service/application_proxy.cpp @@ -0,0 +1,109 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/am/service/applet_common_functions.h" +#include "core/hle/service/am/service/application_functions.h" +#include "core/hle/service/am/service/application_proxy.h" +#include "core/hle/service/am/service/audio_controller.h" +#include "core/hle/service/am/service/common_state_getter.h" +#include "core/hle/service/am/service/debug_functions.h" +#include "core/hle/service/am/service/display_controller.h" +#include "core/hle/service/am/service/library_applet_creator.h" +#include "core/hle/service/am/service/process_winding_controller.h" +#include "core/hle/service/am/service/self_controller.h" +#include "core/hle/service/am/service/window_controller.h" +#include "core/hle/service/cmif_serialization.h" + +namespace Service::AM { + +IApplicationProxy::IApplicationProxy(Core::System& system_, std::shared_ptr applet, + Kernel::KProcess* process, WindowSystem& window_system) + : ServiceFramework{system_, "IApplicationProxy"}, + m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IApplicationProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, + {1, D<&IApplicationProxy::GetSelfController>, "GetSelfController"}, + {2, D<&IApplicationProxy::GetWindowController>, "GetWindowController"}, + {3, D<&IApplicationProxy::GetAudioController>, "GetAudioController"}, + {4, D<&IApplicationProxy::GetDisplayController>, "GetDisplayController"}, + {10, D<&IApplicationProxy::GetProcessWindingController>, "GetProcessWindingController"}, + {11, D<&IApplicationProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, + {20, D<&IApplicationProxy::GetApplicationFunctions>, "GetApplicationFunctions"}, + {1000, D<&IApplicationProxy::GetDebugFunctions>, "GetDebugFunctions"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +IApplicationProxy::~IApplicationProxy() = default; + +Result IApplicationProxy::GetAudioController( + Out> out_audio_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_audio_controller = std::make_shared(system); + R_SUCCEED(); +} + +Result IApplicationProxy::GetDisplayController( + Out> out_display_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_display_controller = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result IApplicationProxy::GetProcessWindingController( + Out> out_process_winding_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_process_winding_controller = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result IApplicationProxy::GetDebugFunctions( + Out> out_debug_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_debug_functions = std::make_shared(system); + R_SUCCEED(); +} + +Result IApplicationProxy::GetWindowController( + Out> out_window_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_window_controller = std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result IApplicationProxy::GetSelfController( + Out> out_self_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_self_controller = std::make_shared(system, m_applet, m_process); + R_SUCCEED(); +} + +Result IApplicationProxy::GetCommonStateGetter( + Out> out_common_state_getter) { + LOG_DEBUG(Service_AM, "called"); + *out_common_state_getter = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result IApplicationProxy::GetLibraryAppletCreator( + Out> out_library_applet_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_creator = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result IApplicationProxy::GetApplicationFunctions( + Out> out_application_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_application_functions = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/application_proxy.h b/src/core/hle/service/am/service/application_proxy.h new file mode 100644 index 0000000000..b56f597605 --- /dev/null +++ b/src/core/hle/service/am/service/application_proxy.h @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Service::AM { + +struct Applet; +class IAudioController; +class IApplicationFunctions; +class ICommonStateGetter; +class IDebugFunctions; +class IDisplayController; +class ILibraryAppletCreator; +class IProcessWindingController; +class ISelfController; +class IWindowController; +class WindowSystem; + +class IApplicationProxy final : public ServiceFramework { +public: + explicit IApplicationProxy(Core::System& system_, std::shared_ptr applet, + Kernel::KProcess* process, WindowSystem& window_system); + ~IApplicationProxy(); + +private: + Result GetAudioController(Out> out_audio_controller); + Result GetDisplayController(Out> out_display_controller); + Result GetProcessWindingController( + Out> out_process_winding_controller); + Result GetDebugFunctions(Out> out_debug_functions); + Result GetWindowController(Out> out_window_controller); + Result GetSelfController(Out> out_self_controller); + Result GetCommonStateGetter(Out> out_common_state_getter); + Result GetLibraryAppletCreator( + Out> out_library_applet_creator); + Result GetApplicationFunctions( + Out> out_application_functions); + +private: + WindowSystem& m_window_system; + Kernel::KProcess* const m_process; + const std::shared_ptr m_applet; +}; + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/application_proxy_service.cpp b/src/core/hle/service/am/service/application_proxy_service.cpp new file mode 100644 index 0000000000..7727951d8c --- /dev/null +++ b/src/core/hle/service/am/service/application_proxy_service.cpp @@ -0,0 +1,47 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/core.h" +#include "core/hle/service/am/am.h" +#include "core/hle/service/am/applet_manager.h" +#include "core/hle/service/am/service/application_proxy.h" +#include "core/hle/service/am/service/application_proxy_service.h" +#include "core/hle/service/am/window_system.h" +#include "core/hle/service/cmif_serialization.h" + +namespace Service::AM { + +IApplicationProxyService::IApplicationProxyService(Core::System& system_, + WindowSystem& window_system) + : ServiceFramework{system_, "appletOE"}, m_window_system{window_system} { + static const FunctionInfo functions[] = { + {0, D<&IApplicationProxyService::OpenApplicationProxy>, "OpenApplicationProxy"}, + }; + RegisterHandlers(functions); +} + +IApplicationProxyService::~IApplicationProxyService() = default; + +Result IApplicationProxyService::OpenApplicationProxy( + Out> out_application_proxy, ClientProcessId pid, + InCopyHandle process_handle) { + LOG_DEBUG(Service_AM, "called"); + + if (const auto applet = this->GetAppletFromProcessId(pid)) { + *out_application_proxy = std::make_shared( + system, applet, process_handle.Get(), m_window_system); + R_SUCCEED(); + } else { + UNIMPLEMENTED(); + R_THROW(ResultUnknown); + } +} + +std::shared_ptr IApplicationProxyService::GetAppletFromProcessId(ProcessId process_id) { + return m_window_system.GetByAppletResourceUserId(process_id.pid); +} + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/application_proxy_service.h b/src/core/hle/service/am/service/application_proxy_service.h new file mode 100644 index 0000000000..fce860a7c1 --- /dev/null +++ b/src/core/hle/service/am/service/application_proxy_service.h @@ -0,0 +1,36 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Service { + +namespace AM { + +struct Applet; +class IApplicationProxy; +class WindowSystem; + +class IApplicationProxyService final : public ServiceFramework { +public: + explicit IApplicationProxyService(Core::System& system_, WindowSystem& window_system); + ~IApplicationProxyService() override; + +private: + Result OpenApplicationProxy(Out> out_application_proxy, + ClientProcessId pid, InCopyHandle process_handle); + +private: + std::shared_ptr GetAppletFromProcessId(ProcessId pid); + + WindowSystem& m_window_system; +}; + +} // namespace AM +} // namespace Service diff --git a/src/core/hle/service/am/service/audio_controller.cpp b/src/core/hle/service/am/service/audio_controller.cpp index 2c8494e056..4e9af756f2 100644 --- a/src/core/hle/service/am/service/audio_controller.cpp +++ b/src/core/hle/service/am/service/audio_controller.cpp @@ -9,20 +9,20 @@ namespace Service::AM { -std::optional IAudioController::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IAudioController::SetExpectedMasterVolume>, "SetExpectedMasterVolume"}, - FunctionInfo{1, D<&IAudioController::GetMainAppletExpectedMasterVolume>, "GetMainAppletExpectedMasterVolume"}, - FunctionInfo{2, D<&IAudioController::GetLibraryAppletExpectedMasterVolume>, "GetLibraryAppletExpectedMasterVolume"}, - FunctionInfo{3, D<&IAudioController::ChangeMainAppletMasterVolume>, "ChangeMainAppletMasterVolume"}, - FunctionInfo{4, D<&IAudioController::SetTransparentVolumeRate>, "SetTransparentVolumeRate"}, - FunctionInfo{5, nullptr, "Unknown5", MakeVersionGate({20,0,0})} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IAudioController::IAudioController(Core::System& system_) : ServiceFramework{system_, "IAudioController"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IAudioController::SetExpectedMasterVolume>, "SetExpectedMasterVolume"}, + {1, D<&IAudioController::GetMainAppletExpectedMasterVolume>, "GetMainAppletExpectedMasterVolume"}, + {2, D<&IAudioController::GetLibraryAppletExpectedMasterVolume>, "GetLibraryAppletExpectedMasterVolume"}, + {3, D<&IAudioController::ChangeMainAppletMasterVolume>, "ChangeMainAppletMasterVolume"}, + {4, D<&IAudioController::SetTransparentVolumeRate>, "SetTransparentVolumeRate"}, + {5, nullptr, "Unknown5"}, //20.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); } IAudioController::~IAudioController() = default; diff --git a/src/core/hle/service/am/service/audio_controller.h b/src/core/hle/service/am/service/audio_controller.h index 9cdb33820d..a13f3b199b 100644 --- a/src/core/hle/service/am/service/audio_controller.h +++ b/src/core/hle/service/am/service/audio_controller.h @@ -23,7 +23,6 @@ private: Result ChangeMainAppletMasterVolume(f32 volume, s64 fade_time_ns); Result SetTransparentVolumeRate(f32 transparent_volume_rate); - std::optional FindRequest(u32 key) override; static constexpr float MinAllowedVolume = 0.0f; static constexpr float MaxAllowedVolume = 1.0f; diff --git a/src/core/hle/service/am/service/common_state_getter.cpp b/src/core/hle/service/am/service/common_state_getter.cpp index 6a6a51f42e..044929e434 100644 --- a/src/core/hle/service/am/service/common_state_getter.cpp +++ b/src/core/hle/service/am/service/common_state_getter.cpp @@ -8,6 +8,7 @@ #include "core/hle/service/am/am_results.h" #include "core/hle/service/am/applet.h" #include "core/hle/service/am/service/common_state_getter.h" +#include "core/hle/service/am/service/lock_accessor.h" #include "core/hle/service/am/service/storage.h" #include "core/hle/service/apm/apm_interface.h" #include "core/hle/service/cmif_serialization.h" @@ -17,147 +18,77 @@ namespace Service::AM { -std::optional ICommonStateGetter::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ICommonStateGetter::GetEventHandle>, "GetEventHandle"}, - FunctionInfo{1, D<&ICommonStateGetter::ReceiveMessage>, "ReceiveMessage"}, - FunctionInfo{2, nullptr, "GetThisAppletKind"}, - FunctionInfo{3, nullptr, "AllowToEnterSleep"}, - FunctionInfo{4, nullptr, "DisallowToEnterSleep"}, - FunctionInfo{5, D<&ICommonStateGetter::GetOperationMode>, "GetOperationMode"}, - FunctionInfo{6, D<&ICommonStateGetter::GetPerformanceMode>, "GetPerformanceMode"}, - FunctionInfo{7, nullptr, "GetCradleStatus"}, - FunctionInfo{8, D<&ICommonStateGetter::GetBootMode>, "GetBootMode"}, - FunctionInfo{9, D<&ICommonStateGetter::GetCurrentFocusState>, "GetCurrentFocusState"}, - FunctionInfo{10, D<&ICommonStateGetter::RequestToAcquireSleepLock>, "RequestToAcquireSleepLock"}, - FunctionInfo{11, D<&ICommonStateGetter::ReleaseSleepLock>, "ReleaseSleepLock"}, - FunctionInfo{12, D<&ICommonStateGetter::ReleaseSleepLockTransiently>, "ReleaseSleepLockTransiently"}, - FunctionInfo{13, D<&ICommonStateGetter::GetAcquiredSleepLockEvent>, "GetAcquiredSleepLockEvent"}, - FunctionInfo{14, nullptr, "GetWakeupCount", MakeVersionGate({11,0,0})}, - FunctionInfo{15, nullptr, "Unknown15", MakeVersionGate({19,0,0})}, - FunctionInfo{20, D<&ICommonStateGetter::PushToGeneralChannel>, "PushToGeneralChannel"}, - FunctionInfo{30, D<&ICommonStateGetter::GetHomeButtonReaderLockAccessor>, "GetHomeButtonReaderLockAccessor"}, - FunctionInfo{31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx", MakeVersionGate({2,0,0})}, - FunctionInfo{32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx", MakeVersionGate({7,0,0})}, - FunctionInfo{40, nullptr, "GetCradleFwVersion", MakeVersionGate({2,0,0})}, - FunctionInfo{50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled", MakeVersionGate({3,0,0})}, - FunctionInfo{51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled", MakeVersionGate({3,0,0})}, - FunctionInfo{52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled", MakeVersionGate({4,0,0})}, - FunctionInfo{53, D<&ICommonStateGetter::BeginVrModeEx>, "BeginVrModeEx", MakeVersionGate({7,0,0})}, - FunctionInfo{54, D<&ICommonStateGetter::EndVrModeEx>, "EndVrModeEx", MakeVersionGate({7,0,0})}, - FunctionInfo{55, D<&ICommonStateGetter::IsInControllerFirmwareUpdateSection>, "IsInControllerFirmwareUpdateSection", MakeVersionGate({3,0,0})}, - FunctionInfo{59, nullptr, "SetVrPositionForDebug", MakeVersionGate({1,0,0})}, - FunctionInfo{60, D<&ICommonStateGetter::GetDefaultDisplayResolution>, "GetDefaultDisplayResolution"}, - FunctionInfo{61, D<&ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent>, "GetDefaultDisplayResolutionChangeEvent"}, - FunctionInfo{62, D<&ICommonStateGetter::GetHdcpAuthenticationState>, "GetHdcpAuthenticationState"}, - FunctionInfo{63, D<&ICommonStateGetter::GetHdcpAuthenticationStateChangeEvent>, "GetHdcpAuthenticationStateChangeEvent"}, - FunctionInfo{64, nullptr, "SetTvPowerStateMatchingMode"}, - FunctionInfo{65, nullptr, "GetApplicationIdByContentActionName"}, - FunctionInfo{66, &ICommonStateGetter::SetCpuBoostMode, "SetCpuBoostMode"}, - FunctionInfo{67, nullptr, "CancelCpuBoostMode"}, - FunctionInfo{68, D<&ICommonStateGetter::GetBuiltInDisplayType>, "GetBuiltInDisplayType"}, - FunctionInfo{80, D<&ICommonStateGetter::PerformSystemButtonPressingIfInFocus>, "PerformSystemButtonPressingIfInFocus"}, - FunctionInfo{90, nullptr, "SetPerformanceConfigurationChangedNotification"}, - FunctionInfo{91, nullptr, "GetCurrentPerformanceConfiguration"}, - FunctionInfo{100, D<&ICommonStateGetter::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"}, - FunctionInfo{110, nullptr, "OpenMyGpuErrorHandler"}, - FunctionInfo{120, D<&ICommonStateGetter::GetAppletLaunchedHistory>, "GetAppletLaunchedHistory", MakeVersionGate({13,0,0})}, - FunctionInfo{130, D<&ICommonStateGetter::EnableStartupLogoDisappearedMessage>, "EnableStartupLogoDisappearedMessage", MakeVersionGate({21,0,0})}, - FunctionInfo{200, D<&ICommonStateGetter::GetOperationModeSystemInfo>, "GetOperationModeSystemInfo"}, - FunctionInfo{300, D<&ICommonStateGetter::GetSettingsPlatformRegion>, "GetSettingsPlatformRegion"}, - FunctionInfo{400, nullptr, "ActivateMigrationService"}, - FunctionInfo{401, nullptr, "DeactivateMigrationService"}, - FunctionInfo{500, nullptr, "DisableSleepTillShutdown"}, - FunctionInfo{501, nullptr, "SuppressDisablingSleepTemporarily"}, - FunctionInfo{502, nullptr, "IsSleepEnabled"}, - FunctionInfo{503, nullptr, "IsDisablingSleepSuppressed"}, - FunctionInfo{600, nullptr, "SetHidInputMagnificationForApplication", MakeVersionGate({20,0,0})}, - FunctionInfo{610, D<&ICommonStateGetter::Unknown610>, "Unknown610", MakeVersionGate({21,0,0})}, - FunctionInfo{611, D<&ICommonStateGetter::Unknown611>, "Unknown611", MakeVersionGate({22,0,0})}, - FunctionInfo{900, D<&ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled>, "SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled", MakeVersionGate({11,0,0})}, - FunctionInfo{910, nullptr, "GetLaunchRequiredTick", MakeVersionGate({17,0,0})}, - FunctionInfo{1000, D<&ICommonStateGetter::BeginVrMode3d>, "BeginVrMode3d", MakeVersionGate({19,0,0})}, - FunctionInfo{1001, D<&ICommonStateGetter::EndVrMode3d>, "EndVrMode3d", MakeVersionGate({19,0,0})}, - FunctionInfo{1002, D<&ICommonStateGetter::IsVrModeEnabled3d>, "IsVrModeEnabled3d", MakeVersionGate({19,0,0})}, - FunctionInfo{1003, D<&ICommonStateGetter::GetVrLaboGoggleViewport>, "GetVrLaboGoggleViewport", MakeVersionGate({21,0,0})}, - FunctionInfo{1004, D<&ICommonStateGetter::GetPanelPhysicalSizeForSpecificTitle>, "GetPanelPhysicalSizeForSpecificTitle", MakeVersionGate({21,0,0})}, - FunctionInfo{1005, D<&ICommonStateGetter::GetPanelResolutionForSpecificTitle>, "GetPanelResolutionForSpecificTitle", MakeVersionGate({21,0,0})} - ); - return HandlerTableGenerateWithFind(key, functions); -} - -class ILockAccessor final : public ServiceFramework { -public: - explicit ILockAccessor(Core::System& system_) - : ServiceFramework{system_, "ILockAccessor"}, m_context{system_, "ILockAccessor"}, - m_event{m_context} { - m_event.Signal(system.Kernel()); - } - ~ILockAccessor() override = default; - - Result TryLock(Out out_is_locked, OutCopyHandle out_handle, bool return_handle) { - LOG_INFO(Service_AM, "called, return_handle={}", return_handle); - - { - std::scoped_lock lk{m_mutex}; - if (m_is_locked) { - *out_is_locked = false; - } else { - m_is_locked = true; - *out_is_locked = true; - } - } - - if (return_handle) { - *out_handle = m_event.GetHandle(); - } - - R_SUCCEED(); - } - - Result Unlock() { - LOG_INFO(Service_AM, "called"); - - { - std::scoped_lock lk{m_mutex}; - m_is_locked = false; - } - - m_event.Signal(system.Kernel()); - R_SUCCEED(); - } - - Result GetEvent(OutCopyHandle out_handle) { - LOG_INFO(Service_AM, "called"); - *out_handle = m_event.GetHandle(); - R_SUCCEED(); - } - - Result IsLocked(Out out_is_locked) { - LOG_INFO(Service_AM, "called"); - std::scoped_lock lk{m_mutex}; - *out_is_locked = m_is_locked; - R_SUCCEED(); - } - -private: - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, D<&ILockAccessor::TryLock>, "TryLock"}, - FunctionInfo{2, D<&ILockAccessor::Unlock>, "Unlock"}, - FunctionInfo{3, D<&ILockAccessor::GetEvent>, "GetEvent"}, - FunctionInfo{4, D<&ILockAccessor::IsLocked>, "IsLocked"} - ); - KernelHelpers::ServiceContext m_context; - Event m_event; - std::mutex m_mutex{}; - bool m_is_locked{}; -}; - ICommonStateGetter::ICommonStateGetter(Core::System& system_, std::shared_ptr applet) : ServiceFramework{system_, "ICommonStateGetter"}, m_applet{std::move(applet)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ICommonStateGetter::GetEventHandle>, "GetEventHandle"}, + {1, D<&ICommonStateGetter::ReceiveMessage>, "ReceiveMessage"}, + {2, nullptr, "GetThisAppletKind"}, + {3, nullptr, "AllowToEnterSleep"}, + {4, nullptr, "DisallowToEnterSleep"}, + {5, D<&ICommonStateGetter::GetOperationMode>, "GetOperationMode"}, + {6, D<&ICommonStateGetter::GetPerformanceMode>, "GetPerformanceMode"}, + {7, nullptr, "GetCradleStatus"}, + {8, D<&ICommonStateGetter::GetBootMode>, "GetBootMode"}, + {9, D<&ICommonStateGetter::GetCurrentFocusState>, "GetCurrentFocusState"}, + {10, D<&ICommonStateGetter::RequestToAcquireSleepLock>, "RequestToAcquireSleepLock"}, + {11, D<&ICommonStateGetter::ReleaseSleepLock>, "ReleaseSleepLock"}, + {12, D<&ICommonStateGetter::ReleaseSleepLockTransiently>, "ReleaseSleepLockTransiently"}, + {13, D<&ICommonStateGetter::GetAcquiredSleepLockEvent>, "GetAcquiredSleepLockEvent"}, + {14, nullptr, "GetWakeupCount"}, //11.0.0+ + {15, nullptr, "Unknown15"}, //19.0.0+ + {20, D<&ICommonStateGetter::PushToGeneralChannel>, "PushToGeneralChannel"}, + {30, D<&ICommonStateGetter::GetHomeButtonReaderLockAccessor>, "GetHomeButtonReaderLockAccessor"}, + {31, D<&ICommonStateGetter::GetReaderLockAccessorEx>, "GetReaderLockAccessorEx"}, //2.0.0+ + {32, D<&ICommonStateGetter::GetWriterLockAccessorEx>, "GetWriterLockAccessorEx"}, //7.0.0+ + {40, nullptr, "GetCradleFwVersion"}, //2.0.0+ + {50, D<&ICommonStateGetter::IsVrModeEnabled>, "IsVrModeEnabled"}, //3.0.0+ + {51, D<&ICommonStateGetter::SetVrModeEnabled>, "SetVrModeEnabled"}, //3.0.0+ + {52, D<&ICommonStateGetter::SetLcdBacklighOffEnabled>, "SetLcdBacklighOffEnabled"}, //4.0.0+ + {53, D<&ICommonStateGetter::BeginVrModeEx>, "BeginVrModeEx"}, //7.0.0+ + {54, D<&ICommonStateGetter::EndVrModeEx>, "EndVrModeEx"}, //7.0.0+ + {55, D<&ICommonStateGetter::IsInControllerFirmwareUpdateSection>, "IsInControllerFirmwareUpdateSection"}, //3.0.0+ + {59, nullptr, "SetVrPositionForDebug"}, //1.0.0+ + {60, D<&ICommonStateGetter::GetDefaultDisplayResolution>, "GetDefaultDisplayResolution"}, + {61, D<&ICommonStateGetter::GetDefaultDisplayResolutionChangeEvent>, "GetDefaultDisplayResolutionChangeEvent"}, + {62, D<&ICommonStateGetter::GetHdcpAuthenticationState>, "GetHdcpAuthenticationState"}, + {63, D<&ICommonStateGetter::GetHdcpAuthenticationStateChangeEvent>, "GetHdcpAuthenticationStateChangeEvent"}, + {64, nullptr, "SetTvPowerStateMatchingMode"}, + {65, nullptr, "GetApplicationIdByContentActionName"}, + {66, &ICommonStateGetter::SetCpuBoostMode, "SetCpuBoostMode"}, + {67, nullptr, "CancelCpuBoostMode"}, + {68, D<&ICommonStateGetter::GetBuiltInDisplayType>, "GetBuiltInDisplayType"}, + {80, D<&ICommonStateGetter::PerformSystemButtonPressingIfInFocus>, "PerformSystemButtonPressingIfInFocus"}, + {90, nullptr, "SetPerformanceConfigurationChangedNotification"}, + {91, nullptr, "GetCurrentPerformanceConfiguration"}, + {100, D<&ICommonStateGetter::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"}, + {110, nullptr, "OpenMyGpuErrorHandler"}, + {120, D<&ICommonStateGetter::GetAppletLaunchedHistory>, "GetAppletLaunchedHistory"}, //13.0.0+ + {130, D<&ICommonStateGetter::EnableStartupLogoDisappearedMessage>, "EnableStartupLogoDisappearedMessage"}, //21.0.0+ + {200, D<&ICommonStateGetter::GetOperationModeSystemInfo>, "GetOperationModeSystemInfo"}, + {300, D<&ICommonStateGetter::GetSettingsPlatformRegion>, "GetSettingsPlatformRegion"}, + {400, nullptr, "ActivateMigrationService"}, + {401, nullptr, "DeactivateMigrationService"}, + {500, nullptr, "DisableSleepTillShutdown"}, + {501, nullptr, "SuppressDisablingSleepTemporarily"}, + {502, nullptr, "IsSleepEnabled"}, + {503, nullptr, "IsDisablingSleepSuppressed"}, + {600, nullptr, "SetHidInputMagnificationForApplication"}, //20.0.0+ + {610, D<&ICommonStateGetter::Unknown610>, "Unknown610"}, //21.0.0+ + {611, D<&ICommonStateGetter::Unknown611>, "Unknown611"}, //22.0.0+ + {900, D<&ICommonStateGetter::SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled>, "SetRequestExitToLibraryAppletAtExecuteNextProgramEnabled"}, //11.0.0+ + {910, nullptr, "GetLaunchRequiredTick"}, //17.0.0+ + {1000, D<&ICommonStateGetter::BeginVrMode3d>, "BeginVrMode3d"}, //19.0.0+ + {1001, D<&ICommonStateGetter::EndVrMode3d>, "EndVrMode3d"}, //19.0.0+ + {1002, D<&ICommonStateGetter::IsVrModeEnabled3d>, "IsVrModeEnabled3d"}, //19.0.0+ + {1003, D<&ICommonStateGetter::GetVrLaboGoggleViewport>, "GetVrLaboGoggleViewport"}, //21.0.0+ + {1004, D<&ICommonStateGetter::GetPanelPhysicalSizeForSpecificTitle>, "GetPanelPhysicalSizeForSpecificTitle"}, //21.0.0+ + {1005, D<&ICommonStateGetter::GetPanelResolutionForSpecificTitle>, "GetPanelResolutionForSpecificTitle"}, //21.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); } ICommonStateGetter::~ICommonStateGetter() = default; diff --git a/src/core/hle/service/am/service/common_state_getter.h b/src/core/hle/service/am/service/common_state_getter.h index ad782ca48e..da86b5d079 100644 --- a/src/core/hle/service/am/service/common_state_getter.h +++ b/src/core/hle/service/am/service/common_state_getter.h @@ -76,7 +76,6 @@ private: void SetCpuBoostMode(HLERequestContext& ctx); - std::optional FindRequest(u32 key) override; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/cradle_firmware_updater.cpp b/src/core/hle/service/am/service/cradle_firmware_updater.cpp index a8097ea209..b9f19e59d2 100644 --- a/src/core/hle/service/am/service/cradle_firmware_updater.cpp +++ b/src/core/hle/service/am/service/cradle_firmware_updater.cpp @@ -9,21 +9,22 @@ namespace Service::AM { - std::optional ICradleFirmwareUpdater::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ICradleFirmwareUpdater::StartUpdate>, "StartUpdate"}, - FunctionInfo{1, D<&ICradleFirmwareUpdater::FinishUpdate>, "FinishUpdate"}, - FunctionInfo{2, D<&ICradleFirmwareUpdater::GetCradleDeviceInfo>, "GetCradleDeviceInfo"}, - FunctionInfo{3, D<&ICradleFirmwareUpdater::GetCradleDeviceInfoChangeEvent>, "GetCradleDeviceInfoChangeEvent"}, - FunctionInfo{4, nullptr, "GetUpdateProgressInfo"}, - FunctionInfo{5, nullptr, "GetLastInternalResult"} - ); - return HandlerTableGenerateWithFind(key, functions); - } - ICradleFirmwareUpdater::ICradleFirmwareUpdater(Core::System& system_) : ServiceFramework{system_, "ICradleFirmwareUpdater"}, m_context{system, "ICradleFirmwareUpdater"}, m_cradle_device_info_event{m_context} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ICradleFirmwareUpdater::StartUpdate>, "StartUpdate"}, + {1, D<&ICradleFirmwareUpdater::FinishUpdate>, "FinishUpdate"}, + {2, D<&ICradleFirmwareUpdater::GetCradleDeviceInfo>, "GetCradleDeviceInfo"}, + {3, D<&ICradleFirmwareUpdater::GetCradleDeviceInfoChangeEvent>, "GetCradleDeviceInfoChangeEvent"}, + {4, nullptr, "GetUpdateProgressInfo"}, + {5, nullptr, "GetLastInternalResult"}, + + }; + // clang-format on + + RegisterHandlers(functions); } ICradleFirmwareUpdater::~ICradleFirmwareUpdater() = default; diff --git a/src/core/hle/service/am/service/cradle_firmware_updater.h b/src/core/hle/service/am/service/cradle_firmware_updater.h index f8e4b93b27..c895a34c22 100644 --- a/src/core/hle/service/am/service/cradle_firmware_updater.h +++ b/src/core/hle/service/am/service/cradle_firmware_updater.h @@ -33,7 +33,6 @@ private: Result GetCradleDeviceInfoChangeEvent(OutCopyHandle out_event); private: - std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext m_context; Event m_cradle_device_info_event; }; diff --git a/src/core/hle/service/am/service/debug_functions.cpp b/src/core/hle/service/am/service/debug_functions.cpp new file mode 100644 index 0000000000..4128366270 --- /dev/null +++ b/src/core/hle/service/am/service/debug_functions.cpp @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/am/service/debug_functions.h" + +namespace Service::AM { + +IDebugFunctions::IDebugFunctions(Core::System& system_) + : ServiceFramework{system_, "IDebugFunctions"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "NotifyMessageToHomeMenuForDebug"}, + {1, nullptr, "OpenMainApplication"}, + {10, nullptr, "PerformSystemButtonPressing"}, + {20, nullptr, "InvalidateTransitionLayer"}, + {30, nullptr, "RequestLaunchApplicationWithUserAndArgumentForDebug"}, + {31, nullptr, "RequestLaunchApplicationByApplicationLaunchInfoForDebug"}, + {40, nullptr, "GetAppletResourceUsageInfo"}, + {50, nullptr, "AddSystemProgramIdAndAppletIdForDebug"}, + {51, nullptr, "AddOperationConfirmedLibraryAppletIdForDebug"}, + {100, nullptr, "SetCpuBoostModeForApplet"}, + {101, nullptr, "CancelCpuBoostModeForApplet"}, + {110, nullptr, "PushToAppletBoundChannelForDebug"}, + {111, nullptr, "TryPopFromAppletBoundChannelForDebug"}, + {120, nullptr, "AlarmSettingNotificationEnableAppEventReserve"}, + {121, nullptr, "AlarmSettingNotificationDisableAppEventReserve"}, + {122, nullptr, "AlarmSettingNotificationPushAppEventNotify"}, + {130, nullptr, "FriendInvitationSetApplicationParameter"}, + {131, nullptr, "FriendInvitationClearApplicationParameter"}, + {132, nullptr, "FriendInvitationPushApplicationParameter"}, + {140, nullptr, "RestrictPowerOperationForSecureLaunchModeForDebug"}, + {200, nullptr, "CreateFloatingLibraryAppletAccepterForDebug"}, + {300, nullptr, "TerminateAllRunningApplicationsForDebug"}, + {900, nullptr, "GetGrcProcessLaunchedSystemEvent"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +IDebugFunctions::~IDebugFunctions() = default; + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/debug_functions.h b/src/core/hle/service/am/service/debug_functions.h new file mode 100644 index 0000000000..381499e93d --- /dev/null +++ b/src/core/hle/service/am/service/debug_functions.h @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/service.h" + +namespace Service::AM { + +class IDebugFunctions final : public ServiceFramework { +public: + explicit IDebugFunctions(Core::System& system_); + ~IDebugFunctions() override; +}; + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/display_controller.cpp b/src/core/hle/service/am/service/display_controller.cpp index eb95dd1b86..8f87327b17 100644 --- a/src/core/hle/service/am/service/display_controller.cpp +++ b/src/core/hle/service/am/service/display_controller.cpp @@ -12,42 +12,42 @@ namespace Service::AM { -std::optional IDisplayController::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetLastForegroundCaptureImage"}, - FunctionInfo{1, nullptr, "UpdateLastForegroundCaptureImage"}, - FunctionInfo{2, nullptr, "GetLastApplicationCaptureImage"}, - FunctionInfo{3, nullptr, "GetCallerAppletCaptureImage"}, - FunctionInfo{4, nullptr, "UpdateCallerAppletCaptureImage"}, - FunctionInfo{5, D<&IDisplayController::GetLastForegroundCaptureImageEx>, "GetLastForegroundCaptureImageEx"}, - FunctionInfo{6, nullptr, "GetLastApplicationCaptureImageEx"}, - FunctionInfo{7, D<&IDisplayController::GetCallerAppletCaptureImageEx>, "GetCallerAppletCaptureImageEx"}, - FunctionInfo{8, D<&IDisplayController::TakeScreenShotOfOwnLayer>, "TakeScreenShotOfOwnLayer"}, - FunctionInfo{9, nullptr, "CopyBetweenCaptureBuffers"}, - FunctionInfo{10, nullptr, "AcquireLastApplicationCaptureBuffer"}, - FunctionInfo{11, nullptr, "ReleaseLastApplicationCaptureBuffer"}, - FunctionInfo{12, nullptr, "AcquireLastForegroundCaptureBuffer"}, - FunctionInfo{13, nullptr, "ReleaseLastForegroundCaptureBuffer"}, - FunctionInfo{14, nullptr, "AcquireCallerAppletCaptureBuffer"}, - FunctionInfo{15, nullptr, "ReleaseCallerAppletCaptureBuffer"}, - FunctionInfo{16, nullptr, "AcquireLastApplicationCaptureBufferEx"}, - FunctionInfo{17, nullptr, "AcquireLastForegroundCaptureBufferEx"}, - FunctionInfo{18, nullptr, "AcquireCallerAppletCaptureBufferEx"}, - FunctionInfo{20, D<&IDisplayController::ClearCaptureBuffer>, "ClearCaptureBuffer"}, - FunctionInfo{21, nullptr, "ClearAppletTransitionBuffer"}, - FunctionInfo{22, D<&IDisplayController::AcquireLastApplicationCaptureSharedBuffer>, "AcquireLastApplicationCaptureSharedBuffer"}, - FunctionInfo{23, D<&IDisplayController::ReleaseLastApplicationCaptureSharedBuffer>, "ReleaseLastApplicationCaptureSharedBuffer"}, - FunctionInfo{24, D<&IDisplayController::AcquireLastForegroundCaptureSharedBuffer>, "AcquireLastForegroundCaptureSharedBuffer"}, - FunctionInfo{25, D<&IDisplayController::ReleaseLastForegroundCaptureSharedBuffer>, "ReleaseLastForegroundCaptureSharedBuffer"}, - FunctionInfo{26, D<&IDisplayController::AcquireCallerAppletCaptureSharedBuffer>, "AcquireCallerAppletCaptureSharedBuffer"}, - FunctionInfo{27, D<&IDisplayController::ReleaseCallerAppletCaptureSharedBuffer>, "ReleaseCallerAppletCaptureSharedBuffer"}, - FunctionInfo{28, nullptr, "TakeScreenShotOfOwnLayerEx"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IDisplayController::IDisplayController(Core::System& system_, std::shared_ptr applet_) : ServiceFramework{system_, "IDisplayController"}, applet(std::move(applet_)) { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetLastForegroundCaptureImage"}, + {1, nullptr, "UpdateLastForegroundCaptureImage"}, + {2, nullptr, "GetLastApplicationCaptureImage"}, + {3, nullptr, "GetCallerAppletCaptureImage"}, + {4, nullptr, "UpdateCallerAppletCaptureImage"}, + {5, D<&IDisplayController::GetLastForegroundCaptureImageEx>, "GetLastForegroundCaptureImageEx"}, + {6, nullptr, "GetLastApplicationCaptureImageEx"}, + {7, D<&IDisplayController::GetCallerAppletCaptureImageEx>, "GetCallerAppletCaptureImageEx"}, + {8, D<&IDisplayController::TakeScreenShotOfOwnLayer>, "TakeScreenShotOfOwnLayer"}, + {9, nullptr, "CopyBetweenCaptureBuffers"}, + {10, nullptr, "AcquireLastApplicationCaptureBuffer"}, + {11, nullptr, "ReleaseLastApplicationCaptureBuffer"}, + {12, nullptr, "AcquireLastForegroundCaptureBuffer"}, + {13, nullptr, "ReleaseLastForegroundCaptureBuffer"}, + {14, nullptr, "AcquireCallerAppletCaptureBuffer"}, + {15, nullptr, "ReleaseCallerAppletCaptureBuffer"}, + {16, nullptr, "AcquireLastApplicationCaptureBufferEx"}, + {17, nullptr, "AcquireLastForegroundCaptureBufferEx"}, + {18, nullptr, "AcquireCallerAppletCaptureBufferEx"}, + {20, D<&IDisplayController::ClearCaptureBuffer>, "ClearCaptureBuffer"}, + {21, nullptr, "ClearAppletTransitionBuffer"}, + {22, D<&IDisplayController::AcquireLastApplicationCaptureSharedBuffer>, "AcquireLastApplicationCaptureSharedBuffer"}, + {23, D<&IDisplayController::ReleaseLastApplicationCaptureSharedBuffer>, "ReleaseLastApplicationCaptureSharedBuffer"}, + {24, D<&IDisplayController::AcquireLastForegroundCaptureSharedBuffer>, "AcquireLastForegroundCaptureSharedBuffer"}, + {25, D<&IDisplayController::ReleaseLastForegroundCaptureSharedBuffer>, "ReleaseLastForegroundCaptureSharedBuffer"}, + {26, D<&IDisplayController::AcquireCallerAppletCaptureSharedBuffer>, "AcquireCallerAppletCaptureSharedBuffer"}, + {27, D<&IDisplayController::ReleaseCallerAppletCaptureSharedBuffer>, "ReleaseCallerAppletCaptureSharedBuffer"}, + {28, nullptr, "TakeScreenShotOfOwnLayerEx"}, + }; + // clang-format on + + RegisterHandlers(functions); } IDisplayController::~IDisplayController() = default; diff --git a/src/core/hle/service/am/service/display_controller.h b/src/core/hle/service/am/service/display_controller.h index 03d29f93c5..35e98b9ad3 100644 --- a/src/core/hle/service/am/service/display_controller.h +++ b/src/core/hle/service/am/service/display_controller.h @@ -35,7 +35,6 @@ private: Out out_fbshare_layer_index); Result ReleaseLastApplicationCaptureSharedBuffer(); - std::optional FindRequest(u32 key) override; const std::shared_ptr applet; }; diff --git a/src/core/hle/service/am/service/global_state_controller.cpp b/src/core/hle/service/am/service/global_state_controller.cpp index be080ffcb3..e7cd60927c 100644 --- a/src/core/hle/service/am/service/global_state_controller.cpp +++ b/src/core/hle/service/am/service/global_state_controller.cpp @@ -10,28 +10,28 @@ namespace Service::AM { - std::optional IGlobalStateController::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestToEnterSleep"}, - FunctionInfo{1, nullptr, "EnterSleep"}, - FunctionInfo{2, nullptr, "StartSleepSequence"}, - FunctionInfo{3, D<&IGlobalStateController::StartShutdownSequence>, "StartShutdownSequence"}, - FunctionInfo{4, D<&IGlobalStateController::StartRebootSequence>, "StartRebootSequence"}, - FunctionInfo{9, nullptr, "IsAutoPowerDownRequested"}, - FunctionInfo{10, D<&IGlobalStateController::LoadAndApplyIdlePolicySettings>, "LoadAndApplyIdlePolicySettings"}, - FunctionInfo{11, nullptr, "NotifyCecSettingsChanged"}, - FunctionInfo{12, nullptr, "SetDefaultHomeButtonLongPressTime"}, - FunctionInfo{13, nullptr, "UpdateDefaultDisplayResolution"}, - FunctionInfo{14, D<&IGlobalStateController::ShouldSleepOnBoot>, "ShouldSleepOnBoot"}, - FunctionInfo{15, D<&IGlobalStateController::GetHdcpAuthenticationFailedEvent>, "GetHdcpAuthenticationFailedEvent"}, - FunctionInfo{30, D<&IGlobalStateController::OpenCradleFirmwareUpdater>, "OpenCradleFirmwareUpdater"} - ); - return HandlerTableGenerateWithFind(key, functions); - } - IGlobalStateController::IGlobalStateController(Core::System& system_) : ServiceFramework{system_, "IGlobalStateController"}, m_context{system_, "IGlobalStateController"}, m_hdcp_authentication_failed_event{m_context} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestToEnterSleep"}, + {1, nullptr, "EnterSleep"}, + {2, nullptr, "StartSleepSequence"}, + {3, D<&IGlobalStateController::StartShutdownSequence>, "StartShutdownSequence"}, + {4, D<&IGlobalStateController::StartRebootSequence>, "StartRebootSequence"}, + {9, nullptr, "IsAutoPowerDownRequested"}, + {10, D<&IGlobalStateController::LoadAndApplyIdlePolicySettings>, "LoadAndApplyIdlePolicySettings"}, + {11, nullptr, "NotifyCecSettingsChanged"}, + {12, nullptr, "SetDefaultHomeButtonLongPressTime"}, + {13, nullptr, "UpdateDefaultDisplayResolution"}, + {14, D<&IGlobalStateController::ShouldSleepOnBoot>, "ShouldSleepOnBoot"}, + {15, D<&IGlobalStateController::GetHdcpAuthenticationFailedEvent>, "GetHdcpAuthenticationFailedEvent"}, + {30, D<&IGlobalStateController::OpenCradleFirmwareUpdater>, "OpenCradleFirmwareUpdater"}, + }; + // clang-format on + + RegisterHandlers(functions); } Result IGlobalStateController::StartShutdownSequence() { diff --git a/src/core/hle/service/am/service/global_state_controller.h b/src/core/hle/service/am/service/global_state_controller.h index 0de1415295..012692ecd8 100644 --- a/src/core/hle/service/am/service/global_state_controller.h +++ b/src/core/hle/service/am/service/global_state_controller.h @@ -26,9 +26,9 @@ private: Result LoadAndApplyIdlePolicySettings(); Result ShouldSleepOnBoot(Out out_should_sleep_on_boot); Result GetHdcpAuthenticationFailedEvent(OutCopyHandle out_event); - Result OpenCradleFirmwareUpdater(Out> out_cradle_firmware_updater); + Result OpenCradleFirmwareUpdater( + Out> out_cradle_firmware_updater); - std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext m_context; Event m_hdcp_authentication_failed_event; }; diff --git a/src/core/hle/service/am/service/home_menu_functions.cpp b/src/core/hle/service/am/service/home_menu_functions.cpp index 5f61c842a2..f9d402ca99 100644 --- a/src/core/hle/service/am/service/home_menu_functions.cpp +++ b/src/core/hle/service/am/service/home_menu_functions.cpp @@ -14,31 +14,31 @@ namespace Service::AM { -std::optional IHomeMenuFunctions::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{10, D<&IHomeMenuFunctions::RequestToGetForeground>, "RequestToGetForeground"}, - FunctionInfo{11, D<&IHomeMenuFunctions::LockForeground>, "LockForeground"}, - FunctionInfo{12, D<&IHomeMenuFunctions::UnlockForeground>, "UnlockForeground"}, - FunctionInfo{20, D<&IHomeMenuFunctions::PopFromGeneralChannel>, "PopFromGeneralChannel"}, - FunctionInfo{21, D<&IHomeMenuFunctions::GetPopFromGeneralChannelEvent>, "GetPopFromGeneralChannelEvent"}, - FunctionInfo{30, nullptr, "GetHomeButtonWriterLockAccessor"}, - FunctionInfo{31, nullptr, "GetWriterLockAccessorEx"}, - FunctionInfo{40, D<&IHomeMenuFunctions::IsSleepEnabled>, "IsSleepEnabled"}, - FunctionInfo{41, D<&IHomeMenuFunctions::IsRebootEnabled>, "IsRebootEnabled"}, - FunctionInfo{50, nullptr, "LaunchSystemApplet"}, - FunctionInfo{51, nullptr, "LaunchStarter"}, - FunctionInfo{100, nullptr, "PopRequestLaunchApplicationForDebug"}, - FunctionInfo{110, D<&IHomeMenuFunctions::IsForceTerminateApplicationDisabledForDebug>, "IsForceTerminateApplicationDisabledForDebug"}, - FunctionInfo{200, nullptr, "LaunchDevMenu"}, - FunctionInfo{1000, nullptr, "SetLastApplicationExitReason"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IHomeMenuFunctions::IHomeMenuFunctions(Core::System& system_, std::shared_ptr applet, WindowSystem& window_system) : ServiceFramework{system_, "IHomeMenuFunctions"}, m_window_system{window_system}, m_applet{std::move(applet)}, m_context{system, "IHomeMenuFunctions"} { + // clang-format off + static const FunctionInfo functions[] = { + {10, D<&IHomeMenuFunctions::RequestToGetForeground>, "RequestToGetForeground"}, + {11, D<&IHomeMenuFunctions::LockForeground>, "LockForeground"}, + {12, D<&IHomeMenuFunctions::UnlockForeground>, "UnlockForeground"}, + {20, D<&IHomeMenuFunctions::PopFromGeneralChannel>, "PopFromGeneralChannel"}, + {21, D<&IHomeMenuFunctions::GetPopFromGeneralChannelEvent>, "GetPopFromGeneralChannelEvent"}, + {30, nullptr, "GetHomeButtonWriterLockAccessor"}, + {31, nullptr, "GetWriterLockAccessorEx"}, + {40, D<&IHomeMenuFunctions::IsSleepEnabled>, "IsSleepEnabled"}, + {41, D<&IHomeMenuFunctions::IsRebootEnabled>, "IsRebootEnabled"}, + {50, nullptr, "LaunchSystemApplet"}, + {51, nullptr, "LaunchStarter"}, + {100, nullptr, "PopRequestLaunchApplicationForDebug"}, + {110, D<&IHomeMenuFunctions::IsForceTerminateApplicationDisabledForDebug>, "IsForceTerminateApplicationDisabledForDebug"}, + {200, nullptr, "LaunchDevMenu"}, + {1000, nullptr, "SetLastApplicationExitReason"}, + }; + // clang-format on + + RegisterHandlers(functions); } IHomeMenuFunctions::~IHomeMenuFunctions() = default; diff --git a/src/core/hle/service/am/service/home_menu_functions.h b/src/core/hle/service/am/service/home_menu_functions.h index 25eb9db45e..2c3ef54375 100644 --- a/src/core/hle/service/am/service/home_menu_functions.h +++ b/src/core/hle/service/am/service/home_menu_functions.h @@ -34,7 +34,6 @@ private: Result IsForceTerminateApplicationDisabledForDebug( Out out_is_force_terminate_application_disabled_for_debug); - std::optional FindRequest(u32 key) override; WindowSystem& m_window_system; const std::shared_ptr m_applet; KernelHelpers::ServiceContext m_context; diff --git a/src/core/hle/service/am/service/library_applet_accessor.cpp b/src/core/hle/service/am/service/library_applet_accessor.cpp index c5386fb1a1..849e5794cf 100644 --- a/src/core/hle/service/am/service/library_applet_accessor.cpp +++ b/src/core/hle/service/am/service/library_applet_accessor.cpp @@ -17,7 +17,9 @@ namespace Service::AM { -static void EnableSingleUserPlay(const std::shared_ptr& impl) { +namespace { + +void EnableSingleUserPlay(const std::shared_ptr& impl) { constexpr s64 DisplayOptionsOffset = 0x90; constexpr s64 IsSkipEnabledOffset = 1; constexpr s64 ShowSkipButtonOffset = 4; @@ -27,7 +29,7 @@ static void EnableSingleUserPlay(const std::shared_ptr& im impl->Write(DisplayOptionsOffset + ShowSkipButtonOffset, &enabled, sizeof(enabled)); } -static void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr& impl) { +void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr& impl) { Frontend::UiReturnArg return_arg{}; impl->Read(0, &return_arg, sizeof(return_arg)); @@ -45,40 +47,42 @@ static void ReplaceEmptyUuidWithCurrentUser(const std::shared_ptr ILibraryAppletAccessor::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ILibraryAppletAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"}, - FunctionInfo{1, D<&ILibraryAppletAccessor::IsCompleted>, "IsCompleted"}, - FunctionInfo{10, D<&ILibraryAppletAccessor::Start>, "Start"}, - FunctionInfo{20, D<&ILibraryAppletAccessor::RequestExit>, "RequestExit"}, - FunctionInfo{25, D<&ILibraryAppletAccessor::Terminate>, "Terminate"}, - FunctionInfo{30, D<&ILibraryAppletAccessor::GetResult>, "GetResult"}, - FunctionInfo{50, nullptr, "SetOutOfFocusApplicationSuspendingEnabled"}, - FunctionInfo{60, D<&ILibraryAppletAccessor::PresetLibraryAppletGpuTimeSliceZero>, "PresetLibraryAppletGpuTimeSliceZero", MakeVersionGate({10,0,0})}, - FunctionInfo{80, nullptr, "RequestForLibraryAppletToGetForeground", MakeVersionGate({19,0,0})}, - FunctionInfo{81, nullptr, "GetCurrentChildLibraryApplet", MakeVersionGate({19,0,0})}, - FunctionInfo{90, D<&ILibraryAppletAccessor::Unknown90>, "Unknown90", MakeVersionGate({20,0,0})}, - FunctionInfo{100, D<&ILibraryAppletAccessor::PushInData>, "PushInData"}, - FunctionInfo{101, D<&ILibraryAppletAccessor::PopOutData>, "PopOutData"}, - FunctionInfo{102, nullptr, "PushExtraStorage"}, - FunctionInfo{103, D<&ILibraryAppletAccessor::PushInteractiveInData>, "PushInteractiveInData"}, - FunctionInfo{104, D<&ILibraryAppletAccessor::PopInteractiveOutData>, "PopInteractiveOutData"}, - FunctionInfo{105, D<&ILibraryAppletAccessor::GetPopOutDataEvent>, "GetPopOutDataEvent"}, - FunctionInfo{106, D<&ILibraryAppletAccessor::GetPopInteractiveOutDataEvent>, "GetPopInteractiveOutDataEvent"}, - FunctionInfo{110, nullptr, "NeedsToExitProcess"}, - FunctionInfo{120, D<&ILibraryAppletAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"}, - FunctionInfo{150, nullptr, "RequestForAppletToGetForeground"}, - FunctionInfo{160, D<&ILibraryAppletAccessor::GetIndirectLayerConsumerHandle>, "GetIndirectLayerConsumerHandle", MakeVersionGate({2,0,0})}, - FunctionInfo{170, D<&ILibraryAppletAccessor::Unknown170>, "Unknown170", MakeVersionGate({22,0,0})} - ); - return HandlerTableGenerateWithFind(key, functions); - } +} // namespace ILibraryAppletAccessor::ILibraryAppletAccessor(Core::System& system_, std::shared_ptr broker, std::shared_ptr applet) : ServiceFramework{system_, "ILibraryAppletAccessor"}, m_broker{std::move(broker)}, m_applet{std::move(applet)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ILibraryAppletAccessor::GetAppletStateChangedEvent>, "GetAppletStateChangedEvent"}, + {1, D<&ILibraryAppletAccessor::IsCompleted>, "IsCompleted"}, + {10, D<&ILibraryAppletAccessor::Start>, "Start"}, + {20, D<&ILibraryAppletAccessor::RequestExit>, "RequestExit"}, + {25, D<&ILibraryAppletAccessor::Terminate>, "Terminate"}, + {30, D<&ILibraryAppletAccessor::GetResult>, "GetResult"}, + {50, nullptr, "SetOutOfFocusApplicationSuspendingEnabled"}, + {60, D<&ILibraryAppletAccessor::PresetLibraryAppletGpuTimeSliceZero>, "PresetLibraryAppletGpuTimeSliceZero"}, //10.0.0+ + {80, nullptr, "RequestForLibraryAppletToGetForeground"}, //19.0.0+ + {81, nullptr, "GetCurrentChildLibraryApplet"}, //19.0.0+ + {90, D<&ILibraryAppletAccessor::Unknown90>, "Unknown90"}, //20.0.0+ + {100, D<&ILibraryAppletAccessor::PushInData>, "PushInData"}, + {101, D<&ILibraryAppletAccessor::PopOutData>, "PopOutData"}, + {102, nullptr, "PushExtraStorage"}, + {103, D<&ILibraryAppletAccessor::PushInteractiveInData>, "PushInteractiveInData"}, + {104, D<&ILibraryAppletAccessor::PopInteractiveOutData>, "PopInteractiveOutData"}, + {105, D<&ILibraryAppletAccessor::GetPopOutDataEvent>, "GetPopOutDataEvent"}, + {106, D<&ILibraryAppletAccessor::GetPopInteractiveOutDataEvent>, "GetPopInteractiveOutDataEvent"}, + {110, nullptr, "NeedsToExitProcess"}, + {120, D<&ILibraryAppletAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"}, + {150, nullptr, "RequestForAppletToGetForeground"}, + {160, D<&ILibraryAppletAccessor::GetIndirectLayerConsumerHandle>, "GetIndirectLayerConsumerHandle"}, //2.0.0+ + {170, D<&ILibraryAppletAccessor::Unknown170>, "Unknown170"}, //22.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); } ILibraryAppletAccessor::~ILibraryAppletAccessor() = default; diff --git a/src/core/hle/service/am/service/library_applet_accessor.h b/src/core/hle/service/am/service/library_applet_accessor.h index e14ddb3bde..ad40bc76c7 100644 --- a/src/core/hle/service/am/service/library_applet_accessor.h +++ b/src/core/hle/service/am/service/library_applet_accessor.h @@ -6,6 +6,7 @@ #pragma once +#include "core/hle/service/am/service/library_applet_self_accessor.h" #include "core/hle/service/cmif_types.h" #include "core/hle/service/service.h" @@ -15,26 +16,6 @@ class AppletDataBroker; struct Applet; class IStorage; -struct LibraryAppletInfo { - AppletId applet_id; - LibraryAppletMode library_applet_mode; -}; -static_assert(sizeof(LibraryAppletInfo) == 0x8, "LibraryAppletInfo has incorrect size."); - -struct ErrorCode { - u32 category; - u32 number; -}; -static_assert(sizeof(ErrorCode) == 0x8, "ErrorCode has incorrect size."); - -struct ErrorContext { - u8 type; - INSERT_PADDING_BYTES_NOINIT(0x7); - std::array data; - Result result; -}; -static_assert(sizeof(ErrorContext) == 0x200, "ErrorContext has incorrect size."); - class ILibraryAppletAccessor final : public ServiceFramework { public: explicit ILibraryAppletAccessor(Core::System& system_, std::shared_ptr broker, @@ -68,7 +49,6 @@ private: void FrontendExecuteInteractive(); void FrontendRequestExit(); - std::optional FindRequest(u32 key) override; const std::shared_ptr m_broker; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/library_applet_creator.cpp b/src/core/hle/service/am/service/library_applet_creator.cpp new file mode 100644 index 0000000000..4ee92908b5 --- /dev/null +++ b/src/core/hle/service/am/service/library_applet_creator.cpp @@ -0,0 +1,287 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/settings.h" +#include "core/hle/kernel/k_transfer_memory.h" +#include "core/hle/service/am/applet_data_broker.h" +#include "core/hle/service/am/applet_manager.h" +#include "core/hle/service/am/frontend/applets.h" +#include "core/hle/service/am/library_applet_storage.h" +#include "core/hle/service/am/process_creation.h" +#include "core/hle/service/am/service/library_applet_accessor.h" +#include "core/hle/service/am/service/library_applet_creator.h" + +#include "core/hle/api_version.h" +#include "core/hle/service/am/service/storage.h" +#include "core/hle/service/am/window_system.h" +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/sm/sm.h" + +namespace Service::AM { + +namespace { + +bool ShouldCreateGuestApplet(AppletId applet_id) { +#define X(Name, name) \ + if (applet_id == AppletId::Name && \ + Settings::values.name##_applet_mode.GetValue() != Settings::AppletMode::LLE) { \ + return false; \ + } + + X(Cabinet, cabinet) + X(Controller, controller) + X(DataErase, data_erase) + X(Error, error) + X(NetConnect, net_connect) + X(ProfileSelect, player_select) + X(SoftwareKeyboard, swkbd) + X(MiiEdit, mii_edit) + X(Web, web) + X(Shop, shop) + X(PhotoViewer, photo_viewer) + X(OfflineWeb, offline_web) + X(LoginShare, login_share) + X(WebAuth, wifi_web_auth) + X(MyPage, my_page) + +#undef X + + return true; +} + +AppletProgramId AppletIdToProgramId(AppletId applet_id) { + switch (applet_id) { + case AppletId::OverlayDisplay: + return AppletProgramId::OverlayDisplay; + case AppletId::QLaunch: + return AppletProgramId::QLaunch; + case AppletId::Starter: + return AppletProgramId::Starter; + case AppletId::Auth: + return AppletProgramId::Auth; + case AppletId::Cabinet: + return AppletProgramId::Cabinet; + case AppletId::Controller: + return AppletProgramId::Controller; + case AppletId::DataErase: + return AppletProgramId::DataErase; + case AppletId::Error: + return AppletProgramId::Error; + case AppletId::NetConnect: + return AppletProgramId::NetConnect; + case AppletId::ProfileSelect: + return AppletProgramId::ProfileSelect; + case AppletId::SoftwareKeyboard: + return AppletProgramId::SoftwareKeyboard; + case AppletId::MiiEdit: + return AppletProgramId::MiiEdit; + case AppletId::Web: + return AppletProgramId::Web; + case AppletId::Shop: + return AppletProgramId::Shop; + case AppletId::PhotoViewer: + return AppletProgramId::PhotoViewer; + case AppletId::Settings: + return AppletProgramId::Settings; + case AppletId::OfflineWeb: + return AppletProgramId::OfflineWeb; + case AppletId::LoginShare: + return AppletProgramId::LoginShare; + case AppletId::WebAuth: + return AppletProgramId::WebAuth; + case AppletId::MyPage: + return AppletProgramId::MyPage; + default: + return static_cast(0); + } +} + +std::shared_ptr CreateGuestApplet(Core::System& system, + WindowSystem& window_system, + std::shared_ptr caller_applet, + AppletId applet_id, + LibraryAppletMode mode) { + const auto program_id = static_cast(AppletIdToProgramId(applet_id)); + if (program_id == 0) { + // Unknown applet + return {}; + } + + auto process = CreateProcess(system, program_id, 1, HLE::ApiVersion::HOS_VERSION_MAJOR); + if (process) { + const auto applet = std::make_shared(system, std::move(process), false); + applet->program_id = program_id; + applet->applet_id = applet_id; + applet->type = AppletType::LibraryApplet; + applet->library_applet_mode = mode; + applet->window_visible = mode != LibraryAppletMode::AllForegroundInitiallyHidden; + + auto broker = std::make_shared(system); + applet->caller_applet = caller_applet; + applet->caller_applet_broker = broker; + { + std::scoped_lock lk{caller_applet->lock}; + caller_applet->child_applets.push_back(applet); + } + window_system.TrackApplet(applet, false); + return std::make_shared(system, broker, applet); + } + // Couldn't initialize the guest process + return {}; +} + +std::shared_ptr CreateFrontendApplet(Core::System& system, + WindowSystem& window_system, + std::shared_ptr caller_applet, + AppletId applet_id, + LibraryAppletMode mode) { + const auto program_id = static_cast(AppletIdToProgramId(applet_id)); + + auto process = std::make_unique(system); + auto applet = std::make_shared(system, std::move(process), false); + applet->program_id = program_id; + applet->applet_id = applet_id; + applet->type = AppletType::LibraryApplet; + applet->library_applet_mode = mode; + + auto storage = std::make_shared(system); + applet->caller_applet = caller_applet; + applet->caller_applet_broker = storage; + applet->frontend = system.GetFrontendAppletHolder().GetApplet(applet, applet_id, mode); + { + std::scoped_lock lk{caller_applet->lock}; + caller_applet->child_applets.push_back(applet); + } + return std::make_shared(system, storage, applet); +} + +} // namespace + +ILibraryAppletCreator::ILibraryAppletCreator(Core::System& system_, std::shared_ptr applet, + WindowSystem& window_system) + : ServiceFramework{system_, "ILibraryAppletCreator"}, + m_window_system{window_system}, m_applet{std::move(applet)} { + static const FunctionInfo functions[] = { + {0, D<&ILibraryAppletCreator::CreateLibraryApplet>, "CreateLibraryApplet"}, + {1, nullptr, "TerminateAllLibraryApplets"}, + {2, nullptr, "AreAnyLibraryAppletsLeft"}, + {3, D<&ILibraryAppletCreator::CreateLibraryAppletEx>, "CreateLibraryAppletEx"}, + {10, D<&ILibraryAppletCreator::CreateStorage>, "CreateStorage"}, + {11, D<&ILibraryAppletCreator::CreateTransferMemoryStorage>, "CreateTransferMemoryStorage"}, + {12, D<&ILibraryAppletCreator::CreateHandleStorage>, "CreateHandleStorage"}, + }; + RegisterHandlers(functions); +} + +ILibraryAppletCreator::~ILibraryAppletCreator() = default; + +Result ILibraryAppletCreator::CreateLibraryApplet( + Out> out_library_applet_accessor, AppletId applet_id, + LibraryAppletMode library_applet_mode) { + LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={}", applet_id, + library_applet_mode); + + std::shared_ptr library_applet; + if (ShouldCreateGuestApplet(applet_id)) { + library_applet = + CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); + } + if (!library_applet) { + library_applet = + CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); + } + if (!library_applet) { + LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id); + R_THROW(ResultUnknown); + } + + // Applet is created, can now be launched. + m_applet->library_applet_launchable_event.Signal(system.Kernel()); + *out_library_applet_accessor = library_applet; + R_SUCCEED(); +} + +Result ILibraryAppletCreator::CreateLibraryAppletEx( + Out> out_library_applet_accessor, AppletId applet_id, + LibraryAppletMode library_applet_mode, u64 thread_id) { + LOG_DEBUG(Service_AM, "called with applet_id={} applet_mode={} thread_id={}", applet_id, + library_applet_mode, thread_id); + + std::shared_ptr library_applet; + if (ShouldCreateGuestApplet(applet_id)) { + library_applet = + CreateGuestApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); + } + if (!library_applet) { + library_applet = + CreateFrontendApplet(system, m_window_system, m_applet, applet_id, library_applet_mode); + } + if (!library_applet) { + LOG_ERROR(Service_AM, "Applet doesn't exist! applet_id={}", applet_id); + R_THROW(ResultUnknown); + } + + // Applet is created, can now be launched. + m_applet->library_applet_launchable_event.Signal(system.Kernel()); + *out_library_applet_accessor = library_applet; + R_SUCCEED(); +} + +Result ILibraryAppletCreator::CreateStorage(Out> out_storage, s64 size) { + LOG_DEBUG(Service_AM, "called, size={}", size); + + if (size <= 0) { + LOG_ERROR(Service_AM, "size is less than or equal to 0"); + R_THROW(ResultUnknown); + } + + *out_storage = std::make_shared(system, AM::CreateStorage(std::vector(size))); + R_SUCCEED(); +} + +Result ILibraryAppletCreator::CreateTransferMemoryStorage( + Out> out_storage, bool is_writable, s64 size, + InCopyHandle transfer_memory_handle) { + LOG_DEBUG(Service_AM, "called, is_writable={} size={}", is_writable, size); + + if (size <= 0) { + LOG_ERROR(Service_AM, "size is less than or equal to 0"); + R_THROW(ResultUnknown); + } + + if (!transfer_memory_handle) { + LOG_ERROR(Service_AM, "transfer_memory_handle is null"); + R_THROW(ResultUnknown); + } + + *out_storage = std::make_shared( + system, AM::CreateTransferMemoryStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(), + transfer_memory_handle.Get(), is_writable, size)); + R_SUCCEED(); +} + +Result ILibraryAppletCreator::CreateHandleStorage( + Out> out_storage, s64 size, + InCopyHandle transfer_memory_handle) { + LOG_DEBUG(Service_AM, "called, size={}", size); + + if (size <= 0) { + LOG_ERROR(Service_AM, "size is less than or equal to 0"); + R_THROW(ResultUnknown); + } + + if (!transfer_memory_handle) { + LOG_ERROR(Service_AM, "transfer_memory_handle is null"); + R_THROW(ResultUnknown); + } + + *out_storage = std::make_shared( + system, AM::CreateHandleStorage(system.Kernel(), transfer_memory_handle->GetOwner()->GetMemory(), + transfer_memory_handle.Get(), size)); + R_SUCCEED(); +} + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/library_applet_creator.h b/src/core/hle/service/am/service/library_applet_creator.h new file mode 100644 index 0000000000..1c7f930055 --- /dev/null +++ b/src/core/hle/service/am/service/library_applet_creator.h @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/am/am_types.h" +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Service::AM { + +struct Applet; +class ILibraryAppletAccessor; +class IStorage; +class WindowSystem; + +class ILibraryAppletCreator final : public ServiceFramework { +public: + explicit ILibraryAppletCreator(Core::System& system_, std::shared_ptr applet, + WindowSystem& window_system); + ~ILibraryAppletCreator() override; + +private: + Result CreateLibraryApplet( + Out> out_library_applet_accessor, AppletId applet_id, + LibraryAppletMode library_applet_mode); + Result CreateLibraryAppletEx( + Out> out_library_applet_accessor, AppletId applet_id, + LibraryAppletMode library_applet_mode, u64 thread_id); + Result CreateStorage(Out> out_storage, s64 size); + Result CreateTransferMemoryStorage( + Out> out_storage, bool is_writable, s64 size, + InCopyHandle transfer_memory_handle); + Result CreateHandleStorage(Out> out_storage, s64 size, + InCopyHandle transfer_memory_handle); + + WindowSystem& m_window_system; + const std::shared_ptr m_applet; +}; + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/library_applet_proxy.cpp b/src/core/hle/service/am/service/library_applet_proxy.cpp new file mode 100644 index 0000000000..567ff75797 --- /dev/null +++ b/src/core/hle/service/am/service/library_applet_proxy.cpp @@ -0,0 +1,137 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/am/service/applet_common_functions.h" +#include "core/hle/service/am/service/audio_controller.h" +#include "core/hle/service/am/service/common_state_getter.h" +#include "core/hle/service/am/service/debug_functions.h" +#include "core/hle/service/am/service/display_controller.h" +#include "core/hle/service/am/service/global_state_controller.h" +#include "core/hle/service/am/service/home_menu_functions.h" +#include "core/hle/service/am/service/library_applet_creator.h" +#include "core/hle/service/am/service/library_applet_proxy.h" +#include "core/hle/service/am/service/library_applet_self_accessor.h" +#include "core/hle/service/am/service/process_winding_controller.h" +#include "core/hle/service/am/service/self_controller.h" +#include "core/hle/service/am/service/window_controller.h" +#include "core/hle/service/cmif_serialization.h" + +namespace Service::AM { + +ILibraryAppletProxy::ILibraryAppletProxy(Core::System& system_, std::shared_ptr applet, + Kernel::KProcess* process, WindowSystem& window_system) + : ServiceFramework{system_, "ILibraryAppletProxy"}, + m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ILibraryAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, + {1, D<&ILibraryAppletProxy::GetSelfController>, "GetSelfController"}, + {2, D<&ILibraryAppletProxy::GetWindowController>, "GetWindowController"}, + {3, D<&ILibraryAppletProxy::GetAudioController>, "GetAudioController"}, + {4, D<&ILibraryAppletProxy::GetDisplayController>, "GetDisplayController"}, + {10, D<&ILibraryAppletProxy::GetProcessWindingController>, "GetProcessWindingController"}, + {11, D<&ILibraryAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, + {20, D<&ILibraryAppletProxy::OpenLibraryAppletSelfAccessor>, "OpenLibraryAppletSelfAccessor"}, + {21, D<&ILibraryAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"}, + {22, D<&ILibraryAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"}, + {23, D<&ILibraryAppletProxy::GetGlobalStateController>, "GetGlobalStateController"}, + {1000, D<&ILibraryAppletProxy::GetDebugFunctions>, "GetDebugFunctions"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +ILibraryAppletProxy::~ILibraryAppletProxy() = default; + +Result ILibraryAppletProxy::GetAudioController( + Out> out_audio_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_audio_controller = std::make_shared(system); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetDisplayController( + Out> out_display_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_display_controller = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetProcessWindingController( + Out> out_process_winding_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_process_winding_controller = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetDebugFunctions( + Out> out_debug_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_debug_functions = std::make_shared(system); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetWindowController( + Out> out_window_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_window_controller = std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetSelfController( + Out> out_self_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_self_controller = std::make_shared(system, m_applet, m_process); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetCommonStateGetter( + Out> out_common_state_getter) { + LOG_DEBUG(Service_AM, "called"); + *out_common_state_getter = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetLibraryAppletCreator( + Out> out_library_applet_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_creator = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::OpenLibraryAppletSelfAccessor( + Out> out_library_applet_self_accessor) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_self_accessor = + std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetAppletCommonFunctions( + Out> out_applet_common_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_applet_common_functions = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetHomeMenuFunctions( + Out> out_home_menu_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_home_menu_functions = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result ILibraryAppletProxy::GetGlobalStateController( + Out> out_global_state_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_global_state_controller = std::make_shared(system); + R_SUCCEED(); +} + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/library_applet_proxy.h b/src/core/hle/service/am/service/library_applet_proxy.h new file mode 100644 index 0000000000..c659dbe187 --- /dev/null +++ b/src/core/hle/service/am/service/library_applet_proxy.h @@ -0,0 +1,59 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Service::AM { + +struct Applet; +class IAppletCommonFunctions; +class IAudioController; +class ICommonStateGetter; +class IDebugFunctions; +class IDisplayController; +class IHomeMenuFunctions; +class IGlobalStateController; +class ILibraryAppletCreator; +class ILibraryAppletSelfAccessor; +class IProcessWindingController; +class ISelfController; +class IWindowController; +class WindowSystem; + +class ILibraryAppletProxy final : public ServiceFramework { +public: + explicit ILibraryAppletProxy(Core::System& system_, std::shared_ptr applet, + Kernel::KProcess* process, WindowSystem& window_system); + ~ILibraryAppletProxy(); + +private: + Result GetAudioController(Out> out_audio_controller); + Result GetDisplayController(Out> out_display_controller); + Result GetProcessWindingController( + Out> out_process_winding_controller); + Result GetDebugFunctions(Out> out_debug_functions); + Result GetWindowController(Out> out_window_controller); + Result GetSelfController(Out> out_self_controller); + Result GetCommonStateGetter(Out> out_common_state_getter); + Result GetLibraryAppletCreator( + Out> out_library_applet_creator); + Result OpenLibraryAppletSelfAccessor( + Out> out_library_applet_self_accessor); + Result GetAppletCommonFunctions( + Out> out_applet_common_functions); + Result GetHomeMenuFunctions(Out> out_home_menu_functions); + Result GetGlobalStateController( + Out> out_global_state_controller); + + WindowSystem& m_window_system; + Kernel::KProcess* const m_process; + const std::shared_ptr m_applet; +}; + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/library_applet_self_accessor.cpp b/src/core/hle/service/am/service/library_applet_self_accessor.cpp new file mode 100644 index 0000000000..907be49204 --- /dev/null +++ b/src/core/hle/service/am/service/library_applet_self_accessor.cpp @@ -0,0 +1,332 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/core_timing.h" +#include "core/file_sys/control_metadata.h" +#include "core/file_sys/patch_manager.h" +#include "core/file_sys/registered_cache.h" +#include "core/hle/service/acc/profile_manager.h" +#include "core/hle/service/am/applet_data_broker.h" +#include "core/hle/service/am/applet_manager.h" +#include "core/hle/service/am/frontend/applets.h" +#include "core/hle/service/am/service/library_applet_self_accessor.h" +#include "core/hle/service/am/service/storage.h" +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/filesystem/filesystem.h" +#include "core/hle/service/glue/glue_manager.h" +#include "core/hle/service/ns/application_manager_interface.h" +#include "core/hle/service/ns/service_getter_interface.h" +#include "core/hle/service/sm/sm.h" + +namespace Service::AM { + +namespace { + +AppletIdentityInfo GetCallerIdentity(Applet& applet) { + if (const auto caller_applet = applet.caller_applet.lock(); caller_applet) { + // TODO: is this actually the application ID? + return { + .applet_id = caller_applet->applet_id, + .application_id = caller_applet->program_id, + }; + } else { + return { + .applet_id = AppletId::QLaunch, + .application_id = 0x0100000000001000ull, + }; + } +} + +} // namespace + +ILibraryAppletSelfAccessor::ILibraryAppletSelfAccessor(Core::System& system_, + std::shared_ptr applet) + : ServiceFramework{system_, "ILibraryAppletSelfAccessor"}, m_applet{std::move(applet)}, + m_broker{m_applet->caller_applet_broker} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ILibraryAppletSelfAccessor::PopInData>, "PopInData"}, + {1, D<&ILibraryAppletSelfAccessor::PushOutData>, "PushOutData"}, + {2, D<&ILibraryAppletSelfAccessor::PopInteractiveInData>, "PopInteractiveInData"}, + {3, D<&ILibraryAppletSelfAccessor::PushInteractiveOutData>, "PushInteractiveOutData"}, + {5, D<&ILibraryAppletSelfAccessor::GetPopInDataEvent>, "GetPopInDataEvent"}, + {6, D<&ILibraryAppletSelfAccessor::GetPopInteractiveInDataEvent>, "GetPopInteractiveInDataEvent"}, + {10, D<&ILibraryAppletSelfAccessor::ExitProcessAndReturn>, "ExitProcessAndReturn"}, + {11, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfo>, "GetLibraryAppletInfo"}, + {12, D<&ILibraryAppletSelfAccessor::GetMainAppletIdentityInfo>, "GetMainAppletIdentityInfo"}, + {13, D<&ILibraryAppletSelfAccessor::CanUseApplicationCore>, "CanUseApplicationCore"}, + {14, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo>, "GetCallerAppletIdentityInfo"}, + {15, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationControlProperty>, "GetMainAppletApplicationControlProperty"}, + {16, D<&ILibraryAppletSelfAccessor::GetMainAppletStorageId>, "GetMainAppletStorageId"}, + {17, D<&ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfoStack>, "GetCallerAppletIdentityInfoStack"}, + {18, nullptr, "GetNextReturnDestinationAppletIdentityInfo"}, + {19, D<&ILibraryAppletSelfAccessor::GetDesirableKeyboardLayout>, "GetDesirableKeyboardLayout"}, + {20, nullptr, "PopExtraStorage"}, + {25, nullptr, "GetPopExtraStorageEvent"}, + {30, D<&ILibraryAppletSelfAccessor::UnpopInData>, "UnpopInData"}, + {31, nullptr, "UnpopExtraStorage"}, + {40, nullptr, "GetIndirectLayerProducerHandle"}, + {50, D<&ILibraryAppletSelfAccessor::ReportVisibleError>, "ReportVisibleError"}, + {51, D<&ILibraryAppletSelfAccessor::ReportVisibleErrorWithErrorContext>, "ReportVisibleErrorWithErrorContext"}, + {60, D<&ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage>, "GetMainAppletApplicationDesiredLanguage"}, + {70, D<&ILibraryAppletSelfAccessor::GetCurrentApplicationId>, "GetCurrentApplicationId"}, + {80, nullptr, "RequestExitToSelf"}, + {90, nullptr, "CreateApplicationAndPushAndRequestToLaunch"}, + {100, nullptr, "CreateGameMovieTrimmer"}, + {101, nullptr, "ReserveResourceForMovieOperation"}, + {102, nullptr, "UnreserveResourceForMovieOperation"}, + {110, D<&ILibraryAppletSelfAccessor::GetMainAppletAvailableUsers>, "GetMainAppletAvailableUsers"}, + {120, nullptr, "GetLaunchStorageInfoForDebug"}, + {130, nullptr, "GetGpuErrorDetectedSystemEvent"}, + {140, nullptr, "SetApplicationMemoryReservation"}, + {150, D<&ILibraryAppletSelfAccessor::ShouldSetGpuTimeSliceManually>, "ShouldSetGpuTimeSliceManually"}, + {160, D<&ILibraryAppletSelfAccessor::GetLibraryAppletInfoEx>, "GetLibraryAppletInfoEx"}, + }; + // clang-format on + RegisterHandlers(functions); +} + +ILibraryAppletSelfAccessor::~ILibraryAppletSelfAccessor() = default; + +Result ILibraryAppletSelfAccessor::PopInData(Out> out_storage) { + LOG_INFO(Service_AM, "called"); + R_RETURN(m_broker->GetInData().Pop(system.Kernel(), out_storage)); +} + +Result ILibraryAppletSelfAccessor::PushOutData(SharedPointer storage) { + LOG_INFO(Service_AM, "called"); + m_broker->GetOutData().Push(system.Kernel(), storage); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::PopInteractiveInData(Out> out_storage) { + LOG_INFO(Service_AM, "called"); + R_RETURN(m_broker->GetInteractiveInData().Pop(system.Kernel(), out_storage)); +} + +Result ILibraryAppletSelfAccessor::PushInteractiveOutData(SharedPointer storage) { + LOG_INFO(Service_AM, "called"); + m_broker->GetInteractiveOutData().Push(system.Kernel(), storage); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetPopInDataEvent( + OutCopyHandle out_event) { + LOG_INFO(Service_AM, "called"); + *out_event = m_broker->GetInData().GetEvent(); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetPopInteractiveInDataEvent( + OutCopyHandle out_event) { + LOG_INFO(Service_AM, "called"); + *out_event = m_broker->GetInteractiveInData().GetEvent(); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetLibraryAppletInfo( + Out out_library_applet_info) { + LOG_INFO(Service_AM, "called"); + *out_library_applet_info = { + .applet_id = m_applet->applet_id, + .library_applet_mode = m_applet->library_applet_mode, + }; + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetMainAppletIdentityInfo( + Out out_identity_info) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_identity_info = { + .applet_id = AppletId::QLaunch, + .application_id = 0x0100000000001000ull, + }; + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::CanUseApplicationCore(Out out_can_use_application_core) { + // TODO: This appears to read the NPDM from state and check the core mask of the applet. + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_can_use_application_core = false; + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetMainAppletApplicationControlProperty( + OutLargeData, BufferAttr_HipcMapAlias> out_nacp) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + + // TODO: this should be the main applet, not the caller applet + const auto application = GetCallerIdentity(*m_applet); + std::vector nacp; + const auto result = + system.GetARPManager().GetControlProperty(&nacp, application.application_id); + + if (R_SUCCEEDED(result)) { + std::memcpy(out_nacp->data(), nacp.data(), (std::min)(nacp.size(), out_nacp->size())); + } + + R_RETURN(result); +} + +Result ILibraryAppletSelfAccessor::GetMainAppletStorageId(Out out_storage_id) { + LOG_INFO(Service_AM, "(STUBBED) called"); + *out_storage_id = FileSys::StorageId::NandUser; + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::ExitProcessAndReturn() { + LOG_INFO(Service_AM, "called"); + + if (const auto caller_applet = m_applet->caller_applet.lock(); caller_applet) { + m_applet->process->Terminate(); + } else { + system.GetUserChannel() = m_applet->user_channel_launch_parameter; + system.ExecuteProgram(0); + } + + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfo( + Out out_identity_info) { + LOG_INFO(Service_AM, "called"); + *out_identity_info = GetCallerIdentity(*m_applet); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetCallerAppletIdentityInfoStack( + Out out_count, OutArray out_identity_info) { + LOG_INFO(Service_AM, "called"); + + std::shared_ptr applet = m_applet; + *out_count = 0; + + do { + if (*out_count >= static_cast(out_identity_info.size())) { + break; + } + out_identity_info[(*out_count)++] = GetCallerIdentity(*applet); + } while ((applet = applet->caller_applet.lock())); + + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetDesirableKeyboardLayout(Out out_desirable_layout) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + *out_desirable_layout = 0; + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::ReportVisibleError(ErrorCode error_code) { + LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category, + error_code.number); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::ReportVisibleErrorWithErrorContext( + ErrorCode error_code, InLargeData error_context) { + LOG_WARNING(Service_AM, "(STUBBED) called, error {}-{}", error_code.category, + error_code.number); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::UnpopInData(SharedPointer storage) { + LOG_INFO(Service_AM, "called"); + m_broker->GetInData().Unpop(system.Kernel(), storage); + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage( + Out out_desired_language) { + // FIXME: this is copied from IApplicationFunctions::GetDesiredLanguage + // FIXME: all of this stuff belongs to ns + auto identity = GetCallerIdentity(*m_applet); + + // TODO(bunnei): This should be configurable + LOG_DEBUG(Service_AM, "called"); + + // Get supported languages from NACP, if possible + // Default to 0 (all languages supported) + u32 supported_languages = 0; + + const auto res = FileSys::PatchManager::GetMetadataFromBaseOrUpdate(system, identity.application_id); + + if (res.first != nullptr) { + supported_languages = res.first->GetSupportedLanguages(); + } + + // Call IApplicationManagerInterface implementation. + auto& service_manager = system.ServiceManager(); + auto ns_am2 = service_manager.GetService("ns:am2"); + + std::shared_ptr app_man; + R_TRY(ns_am2->GetApplicationManagerInterface(&app_man)); + + // Get desired application language + NS::ApplicationLanguage desired_language{}; + R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages)); + + // Convert to settings language code. + u64 language_code{}; + R_TRY(app_man->ConvertApplicationLanguageToLanguageCode(&language_code, desired_language)); + + LOG_DEBUG(Service_AM, "got desired_language={:016X}", language_code); + + *out_desired_language = language_code; + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetCurrentApplicationId(Out out_application_id) { + LOG_WARNING(Service_AM, "(STUBBED) called"); + + // TODO: this should be the main applet, not the caller applet + const auto main_applet = GetCallerIdentity(*m_applet); + *out_application_id = main_applet.application_id; + + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetMainAppletAvailableUsers( + Out out_can_select_any_user, Out out_users_count, + OutArray out_users) { + const Service::Account::ProfileManager manager{}; + + *out_can_select_any_user = false; + *out_users_count = -1; + + LOG_INFO(Service_AM, "called"); + + if (manager.GetUserCount() > 0) { + *out_can_select_any_user = true; + *out_users_count = static_cast(manager.GetUserCount()); + + const auto users = manager.GetAllUsers(); + for (size_t i = 0; i < users.size() && i < out_users.size(); i++) { + out_users[i] = users[i]; + } + } + + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::ShouldSetGpuTimeSliceManually( + Out out_should_set_gpu_time_slice_manually) { + LOG_INFO(Service_AM, "(STUBBED) called"); + *out_should_set_gpu_time_slice_manually = false; + R_SUCCEED(); +} + +Result ILibraryAppletSelfAccessor::GetLibraryAppletInfoEx( + Out out_library_applet_info) { + LOG_INFO(Service_AM, "called"); + *out_library_applet_info = { + .applet_id = m_applet->applet_id, + .library_applet_mode = m_applet->library_applet_mode, + }; + R_SUCCEED(); +} + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/library_applet_self_accessor.h b/src/core/hle/service/am/service/library_applet_self_accessor.h new file mode 100644 index 0000000000..d287f6b403 --- /dev/null +++ b/src/core/hle/service/am/service/library_applet_self_accessor.h @@ -0,0 +1,87 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/uuid.h" +#include "core/hle/service/am/am_types.h" +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace FileSys { +enum class StorageId : u8; +} + +namespace Kernel { +class KReadableEvent; +} + +namespace Service::AM { + +class AppletDataBroker; +struct Applet; +class IStorage; + +struct LibraryAppletInfo { + AppletId applet_id; + LibraryAppletMode library_applet_mode; +}; +static_assert(sizeof(LibraryAppletInfo) == 0x8, "LibraryAppletInfo has incorrect size."); + +struct ErrorCode { + u32 category; + u32 number; +}; +static_assert(sizeof(ErrorCode) == 0x8, "ErrorCode has incorrect size."); + +struct ErrorContext { + u8 type; + INSERT_PADDING_BYTES_NOINIT(0x7); + std::array data; + Result result; +}; +static_assert(sizeof(ErrorContext) == 0x200, "ErrorContext has incorrect size."); + +class ILibraryAppletSelfAccessor final : public ServiceFramework { +public: + explicit ILibraryAppletSelfAccessor(Core::System& system_, std::shared_ptr applet); + ~ILibraryAppletSelfAccessor() override; + +private: + Result PopInData(Out> out_storage); + Result PushOutData(SharedPointer storage); + Result PopInteractiveInData(Out> out_storage); + Result PushInteractiveOutData(SharedPointer storage); + Result GetPopInDataEvent(OutCopyHandle out_event); + Result GetPopInteractiveInDataEvent(OutCopyHandle out_event); + Result GetLibraryAppletInfo(Out out_library_applet_info); + Result GetMainAppletIdentityInfo(Out out_identity_info); + Result CanUseApplicationCore(Out out_can_use_application_core); + Result GetMainAppletApplicationControlProperty( + OutLargeData, BufferAttr_HipcMapAlias> out_nacp); + Result GetMainAppletStorageId(Out out_storage_id); + Result ExitProcessAndReturn(); + Result GetCallerAppletIdentityInfo(Out out_identity_info); + Result GetCallerAppletIdentityInfoStack( + Out out_count, + OutArray out_identity_info); + Result GetDesirableKeyboardLayout(Out out_desirable_layout); + Result ReportVisibleError(ErrorCode error_code); + Result ReportVisibleErrorWithErrorContext( + ErrorCode error_code, InLargeData error_context); + Result UnpopInData(SharedPointer storage); + Result GetMainAppletApplicationDesiredLanguage(Out out_desired_language); + Result GetCurrentApplicationId(Out out_application_id); + Result GetMainAppletAvailableUsers(Out out_can_select_any_user, Out out_users_count, + OutArray out_users); + Result ShouldSetGpuTimeSliceManually(Out out_should_set_gpu_time_slice_manually); + Result GetLibraryAppletInfoEx(Out out_library_applet_info); + + const std::shared_ptr m_applet; + const std::shared_ptr m_broker; +}; + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/lock_accessor.cpp b/src/core/hle/service/am/service/lock_accessor.cpp new file mode 100644 index 0000000000..0341254449 --- /dev/null +++ b/src/core/hle/service/am/service/lock_accessor.cpp @@ -0,0 +1,78 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/am/service/lock_accessor.h" +#include "core/hle/service/cmif_serialization.h" + +namespace Service::AM { + +ILockAccessor::ILockAccessor(Core::System& system_) + : ServiceFramework{system_, "ILockAccessor"}, m_context{system_, "ILockAccessor"}, + m_event{m_context} { + // clang-format off + static const FunctionInfo functions[] = { + {1, D<&ILockAccessor::TryLock>, "TryLock"}, + {2, D<&ILockAccessor::Unlock>, "Unlock"}, + {3, D<&ILockAccessor::GetEvent>, "GetEvent"}, + {4, D<&ILockAccessor::IsLocked>, "IsLocked"}, + }; + // clang-format on + + RegisterHandlers(functions); + + m_event.Signal(system.Kernel()); +} + +ILockAccessor::~ILockAccessor() = default; + +Result ILockAccessor::TryLock(Out out_is_locked, + OutCopyHandle out_handle, + bool return_handle) { + LOG_INFO(Service_AM, "called, return_handle={}", return_handle); + + { + std::scoped_lock lk{m_mutex}; + if (m_is_locked) { + *out_is_locked = false; + } else { + m_is_locked = true; + *out_is_locked = true; + } + } + + if (return_handle) { + *out_handle = m_event.GetHandle(); + } + + R_SUCCEED(); +} + +Result ILockAccessor::Unlock() { + LOG_INFO(Service_AM, "called"); + + { + std::scoped_lock lk{m_mutex}; + m_is_locked = false; + } + + m_event.Signal(system.Kernel()); + R_SUCCEED(); +} + +Result ILockAccessor::GetEvent(OutCopyHandle out_handle) { + LOG_INFO(Service_AM, "called"); + *out_handle = m_event.GetHandle(); + R_SUCCEED(); +} + +Result ILockAccessor::IsLocked(Out out_is_locked) { + LOG_INFO(Service_AM, "called"); + std::scoped_lock lk{m_mutex}; + *out_is_locked = m_is_locked; + R_SUCCEED(); +} + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/lock_accessor.h b/src/core/hle/service/am/service/lock_accessor.h new file mode 100644 index 0000000000..fe3f11dcf0 --- /dev/null +++ b/src/core/hle/service/am/service/lock_accessor.h @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/kernel_helpers.h" +#include "core/hle/service/os/event.h" +#include "core/hle/service/service.h" + +namespace Service::AM { + +class ILockAccessor final : public ServiceFramework { +public: + explicit ILockAccessor(Core::System& system_); + ~ILockAccessor() override; + +private: + Result TryLock(Out out_is_locked, OutCopyHandle out_handle, + bool return_handle); + Result Unlock(); + Result GetEvent(OutCopyHandle out_handle); + Result IsLocked(Out out_is_locked); + +private: + KernelHelpers::ServiceContext m_context; + Event m_event; + std::mutex m_mutex{}; + bool m_is_locked{}; +}; + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/overlay_applet_proxy.cpp b/src/core/hle/service/am/service/overlay_applet_proxy.cpp new file mode 100644 index 0000000000..735ba9d307 --- /dev/null +++ b/src/core/hle/service/am/service/overlay_applet_proxy.cpp @@ -0,0 +1,120 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "core/hle/service/am/service/common_state_getter.h" +#include "core/hle/service/am/service/display_controller.h" +#include "core/hle/service/am/service/global_state_controller.h" +#include "core/hle/service/am/service/audio_controller.h" +#include "core/hle/service/am/service/applet_common_functions.h" +#include "core/hle/service/am/service/overlay_applet_proxy.h" +#include "core/hle/service/am/service/library_applet_creator.h" +#include "core/hle/service/am/service/process_winding_controller.h" +#include "core/hle/service/am/service/self_controller.h" +#include "core/hle/service/am/service/window_controller.h" +#include "core/hle/service/am/service/debug_functions.h" +#include "core/hle/service/cmif_serialization.h" + +namespace Service::AM { + IOverlayAppletProxy::IOverlayAppletProxy(Core::System &system_, std::shared_ptr applet, + Kernel::KProcess *process, WindowSystem &window_system) + : ServiceFramework{system_, "IOverlayAppletProxy"}, + m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IOverlayAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, + {1, D<&IOverlayAppletProxy::GetSelfController>, "GetSelfController"}, + {2, D<&IOverlayAppletProxy::GetWindowController>, "GetWindowController"}, + {3, D<&IOverlayAppletProxy::GetAudioController>, "GetAudioController"}, + {4, D<&IOverlayAppletProxy::GetDisplayController>, "GetDisplayController"}, + {10, D<&IOverlayAppletProxy::GetProcessWindingController>, "GetProcessWindingController"}, + {11, D<&IOverlayAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, + {20, D<&IOverlayAppletProxy::GetOverlayFunctions>, "GetOverlayFunctions"}, + {21, D<&IOverlayAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"}, + {23, D<&IOverlayAppletProxy::GetGlobalStateController>, "GetGlobalStateController"}, + {1000, D<&IOverlayAppletProxy::GetDebugFunctions>, "GetDebugFunctions"}, + }; + // clang-format on + + RegisterHandlers(functions); + } + + IOverlayAppletProxy::~IOverlayAppletProxy() = default; + + Result IOverlayAppletProxy::GetCommonStateGetter( + Out > out_common_state_getter) { + LOG_DEBUG(Service_AM, "called"); + *out_common_state_getter = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetSelfController( + Out > out_self_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_self_controller = std::make_shared(system, m_applet, m_process); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetWindowController( + Out > out_window_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_window_controller = std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetAudioController( + Out > out_audio_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_audio_controller = std::make_shared(system); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetDisplayController( + Out > out_display_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_display_controller = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetProcessWindingController( + Out > out_process_winding_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_process_winding_controller = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetLibraryAppletCreator( + Out > out_library_applet_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_creator = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetOverlayFunctions( + Out > out_overlay_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_overlay_functions = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetAppletCommonFunctions( + Out > out_applet_common_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_applet_common_functions = std::make_shared(system, m_applet); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetGlobalStateController( + Out > out_global_state_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_global_state_controller = std::make_shared(system); + R_SUCCEED(); + } + + Result IOverlayAppletProxy::GetDebugFunctions( + Out > out_debug_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_debug_functions = std::make_shared(system); + R_SUCCEED(); + } +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/overlay_applet_proxy.h b/src/core/hle/service/am/service/overlay_applet_proxy.h new file mode 100644 index 0000000000..6c02166a2d --- /dev/null +++ b/src/core/hle/service/am/service/overlay_applet_proxy.h @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" +#include "core/hle/service/am/service/overlay_functions.h" + +namespace Service::AM { + +struct Applet; +class IAppletCommonFunctions; +class IAudioController; +class ICommonStateGetter; +class IDebugFunctions; +class IDisplayController; +class IHomeMenuFunctions; +class IGlobalStateController; +class ILibraryAppletCreator; +class ILibraryAppletSelfAccessor; +class IProcessWindingController; +class ISelfController; +class IWindowController; +class WindowSystem; + +class IOverlayAppletProxy final : public ServiceFramework { +public: + explicit IOverlayAppletProxy(Core::System& system_, std::shared_ptr applet, + Kernel::KProcess* process, WindowSystem& window_system); + ~IOverlayAppletProxy(); + +private: + Result GetCommonStateGetter(Out> out_common_state_getter); + Result GetSelfController(Out> out_self_controller); + Result GetWindowController(Out> out_window_controller); + Result GetAudioController(Out> out_audio_controller); + Result GetDisplayController(Out> out_display_controller); + Result GetProcessWindingController( + Out> out_process_winding_controller); + Result GetLibraryAppletCreator( + Out> out_library_applet_creator); + Result GetOverlayFunctions(Out> out_overlay_functions); + Result GetAppletCommonFunctions( + Out> out_applet_common_functions); + Result GetGlobalStateController( + Out> out_global_state_controller); + Result GetDebugFunctions(Out> out_debug_functions); + + WindowSystem& m_window_system; + Kernel::KProcess* const m_process; + const std::shared_ptr m_applet; +}; + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/overlay_functions.cpp b/src/core/hle/service/am/service/overlay_functions.cpp index 006610bd47..8150b5dd07 100644 --- a/src/core/hle/service/am/service/overlay_functions.cpp +++ b/src/core/hle/service/am/service/overlay_functions.cpp @@ -8,34 +8,34 @@ #include "core/hle/service/am/window_system.h" namespace Service::AM { - std::optional IOverlayFunctions::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IOverlayFunctions::BeginToWatchShortHomeButtonMessage>, "BeginToWatchShortHomeButtonMessage"}, - FunctionInfo{1, D<&IOverlayFunctions::EndToWatchShortHomeButtonMessage>, "EndToWatchShortHomeButtonMessage"}, - FunctionInfo{2, D<&IOverlayFunctions::GetApplicationIdForLogo>, "GetApplicationIdForLogo"}, - FunctionInfo{3, nullptr, "SetGpuTimeSliceBoost"}, - FunctionInfo{4, D<&IOverlayFunctions::SetAutoSleepTimeAndDimmingTimeEnabled>, "SetAutoSleepTimeAndDimmingTimeEnabled"}, - FunctionInfo{5, nullptr, "TerminateApplicationAndSetReason"}, - FunctionInfo{6, nullptr, "SetScreenShotPermissionGlobally"}, - FunctionInfo{10, nullptr, "StartShutdownSequenceForOverlay"}, - FunctionInfo{11, nullptr, "StartRebootSequenceForOverlay"}, - FunctionInfo{20, D<&IOverlayFunctions::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"}, - FunctionInfo{21, D<&IOverlayFunctions::SetHandlingTouchScreenInputEnabled>, "SetHandlingTouchScreenInputEnabled"}, - FunctionInfo{30, nullptr, "SetHealthWarningShowingState"}, - FunctionInfo{31, D<&IOverlayFunctions::IsHealthWarningRequired>, "IsHealthWarningRequired"}, - FunctionInfo{40, nullptr, "GetApplicationNintendoLogo"}, - FunctionInfo{41, nullptr, "GetApplicationStartupMovie"}, - FunctionInfo{50, nullptr, "SetGpuTimeSliceBoostForApplication"}, - FunctionInfo{60, nullptr, "Unknown60"}, - FunctionInfo{70, D<&IOverlayFunctions::Unknown70>, "Unknown70"}, - FunctionInfo{90, nullptr, "SetRequiresGpuResourceUse"}, - FunctionInfo{101, nullptr, "BeginToObserveHidInputForDevelop"} - ); - return HandlerTableGenerateWithFind(key, functions); - } - IOverlayFunctions::IOverlayFunctions(Core::System &system_, std::shared_ptr applet) : ServiceFramework{system_, "IOverlayFunctions"}, m_applet{std::move(applet)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IOverlayFunctions::BeginToWatchShortHomeButtonMessage>, "BeginToWatchShortHomeButtonMessage"}, + {1, D<&IOverlayFunctions::EndToWatchShortHomeButtonMessage>, "EndToWatchShortHomeButtonMessage"}, + {2, D<&IOverlayFunctions::GetApplicationIdForLogo>, "GetApplicationIdForLogo"}, + {3, nullptr, "SetGpuTimeSliceBoost"}, + {4, D<&IOverlayFunctions::SetAutoSleepTimeAndDimmingTimeEnabled>, "SetAutoSleepTimeAndDimmingTimeEnabled"}, + {5, nullptr, "TerminateApplicationAndSetReason"}, + {6, nullptr, "SetScreenShotPermissionGlobally"}, + {10, nullptr, "StartShutdownSequenceForOverlay"}, + {11, nullptr, "StartRebootSequenceForOverlay"}, + {20, D<&IOverlayFunctions::SetHandlingHomeButtonShortPressedEnabled>, "SetHandlingHomeButtonShortPressedEnabled"}, + {21, D<&IOverlayFunctions::SetHandlingTouchScreenInputEnabled>, "SetHandlingTouchScreenInputEnabled"}, + {30, nullptr, "SetHealthWarningShowingState"}, + {31, D<&IOverlayFunctions::IsHealthWarningRequired>, "IsHealthWarningRequired"}, + {40, nullptr, "GetApplicationNintendoLogo"}, + {41, nullptr, "GetApplicationStartupMovie"}, + {50, nullptr, "SetGpuTimeSliceBoostForApplication"}, + {60, nullptr, "Unknown60"}, + {70, D<&IOverlayFunctions::Unknown70>, "Unknown70"}, + {90, nullptr, "SetRequiresGpuResourceUse"}, + {101, nullptr, "BeginToObserveHidInputForDevelop"}, + }; + // clang-format on + + RegisterHandlers(functions); } IOverlayFunctions::~IOverlayFunctions() = default; diff --git a/src/core/hle/service/am/service/overlay_functions.h b/src/core/hle/service/am/service/overlay_functions.h index b94f0cc0d5..eefd8d862b 100644 --- a/src/core/hle/service/am/service/overlay_functions.h +++ b/src/core/hle/service/am/service/overlay_functions.h @@ -6,25 +6,24 @@ #include "core/hle/service/service.h" namespace Service::AM { -struct Applet; + struct Applet; -class IOverlayFunctions final : public ServiceFramework { -public: - explicit IOverlayFunctions(Core::System &system_, std::shared_ptr applet); - ~IOverlayFunctions() override; + class IOverlayFunctions final : public ServiceFramework { + public: + explicit IOverlayFunctions(Core::System &system_, std::shared_ptr applet); + ~IOverlayFunctions() override; -private: - Result BeginToWatchShortHomeButtonMessage(); - Result EndToWatchShortHomeButtonMessage(); - Result GetApplicationIdForLogo(Out out_application_id); - Result SetAutoSleepTimeAndDimmingTimeEnabled(bool enabled); - Result IsHealthWarningRequired(Out is_required); - Result SetHandlingHomeButtonShortPressedEnabled(bool enabled); - Result SetHandlingTouchScreenInputEnabled(bool enabled); - Result Unknown70(); + private: + Result BeginToWatchShortHomeButtonMessage(); + Result EndToWatchShortHomeButtonMessage(); + Result GetApplicationIdForLogo(Out out_application_id); + Result SetAutoSleepTimeAndDimmingTimeEnabled(bool enabled); + Result IsHealthWarningRequired(Out is_required); + Result SetHandlingHomeButtonShortPressedEnabled(bool enabled); + Result SetHandlingTouchScreenInputEnabled(bool enabled); + Result Unknown70(); -private: - std::optional FindRequest(u32 key) override; - const std::shared_ptr m_applet; -}; + private: + const std::shared_ptr m_applet; + }; } // namespace Service::AM diff --git a/src/core/hle/service/am/service/process_winding_controller.cpp b/src/core/hle/service/am/service/process_winding_controller.cpp index 159f4dfd5c..e284aa2d89 100644 --- a/src/core/hle/service/am/service/process_winding_controller.cpp +++ b/src/core/hle/service/am/service/process_winding_controller.cpp @@ -13,23 +13,23 @@ namespace Service::AM { - std::optional IProcessWindingController::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IProcessWindingController::GetLaunchReason>, "GetLaunchReason"}, - FunctionInfo{11, D<&IProcessWindingController::OpenCallingLibraryApplet>, "OpenCallingLibraryApplet"}, - FunctionInfo{21, D<&IProcessWindingController::PushContext>, "PushContext"}, - FunctionInfo{22, D<&IProcessWindingController::PopContext>, "PopContext"}, - FunctionInfo{23, D<&IProcessWindingController::CancelWindingReservation>, "CancelWindingReservation"}, - FunctionInfo{30, D<&IProcessWindingController::WindAndDoReserved>, "WindAndDoReserved"}, - FunctionInfo{40, D<&IProcessWindingController::ReserveToStartAndWaitAndUnwindThis>, "ReserveToStartAndWaitAndUnwindThis"}, - FunctionInfo{41, D<&IProcessWindingController::ReserveToStartAndWait>, "ReserveToStartAndWait"} - ); - return HandlerTableGenerateWithFind(key, functions); - } - IProcessWindingController::IProcessWindingController(Core::System& system_, std::shared_ptr applet) : ServiceFramework{system_, "IProcessWindingController"}, m_applet{std::move(applet)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IProcessWindingController::GetLaunchReason>, "GetLaunchReason"}, + {11, D<&IProcessWindingController::OpenCallingLibraryApplet>, "OpenCallingLibraryApplet"}, + {21, D<&IProcessWindingController::PushContext>, "PushContext"}, + {22, D<&IProcessWindingController::PopContext>, "PopContext"}, + {23, D<&IProcessWindingController::CancelWindingReservation>, "CancelWindingReservation"}, + {30, D<&IProcessWindingController::WindAndDoReserved>, "WindAndDoReserved"}, + {40, D<&IProcessWindingController::ReserveToStartAndWaitAndUnwindThis>, "ReserveToStartAndWaitAndUnwindThis"}, + {41, D<&IProcessWindingController::ReserveToStartAndWait>, "ReserveToStartAndWait"}, + }; + // clang-format on + + RegisterHandlers(functions); } IProcessWindingController::~IProcessWindingController() = default; diff --git a/src/core/hle/service/am/service/process_winding_controller.h b/src/core/hle/service/am/service/process_winding_controller.h index 91b29ac04b..f3417bcd97 100644 --- a/src/core/hle/service/am/service/process_winding_controller.h +++ b/src/core/hle/service/am/service/process_winding_controller.h @@ -33,7 +33,6 @@ private: SharedPointer reserved_applet_accessor); Result ReserveToStartAndWait(SharedPointer reserved_applet_accessor); - std::optional FindRequest(u32 key) override; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/self_controller.cpp b/src/core/hle/service/am/service/self_controller.cpp index ce8a308d6a..3a654b9daa 100644 --- a/src/core/hle/service/am/service/self_controller.cpp +++ b/src/core/hle/service/am/service/self_controller.cpp @@ -17,66 +17,67 @@ namespace Service::AM { - std::optional ISelfController::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ISelfController::Exit>, "Exit"}, - FunctionInfo{1, D<&ISelfController::LockExit>, "LockExit"}, - FunctionInfo{2, D<&ISelfController::UnlockExit>, "UnlockExit"}, - FunctionInfo{3, D<&ISelfController::EnterFatalSection>, "EnterFatalSection"}, - FunctionInfo{4, D<&ISelfController::LeaveFatalSection>, "LeaveFatalSection"}, - FunctionInfo{9, D<&ISelfController::GetLibraryAppletLaunchableEvent>, "GetLibraryAppletLaunchableEvent"}, - FunctionInfo{10, D<&ISelfController::SetScreenShotPermission>, "SetScreenShotPermission"}, - FunctionInfo{11, D<&ISelfController::SetOperationModeChangedNotification>, "SetOperationModeChangedNotification"}, - FunctionInfo{12, D<&ISelfController::SetPerformanceModeChangedNotification>, "SetPerformanceModeChangedNotification"}, - FunctionInfo{13, D<&ISelfController::SetFocusHandlingMode>, "SetFocusHandlingMode"}, - FunctionInfo{14, D<&ISelfController::SetRestartMessageEnabled>, "SetRestartMessageEnabled"}, - FunctionInfo{15, D<&ISelfController::SetScreenShotAppletIdentityInfo>, "SetScreenShotAppletIdentityInfo"}, - FunctionInfo{16, D<&ISelfController::SetOutOfFocusSuspendingEnabled>, "SetOutOfFocusSuspendingEnabled"}, - FunctionInfo{17, nullptr, "SetControllerFirmwareUpdateSection"}, - FunctionInfo{18, nullptr, "SetRequiresCaptureButtonShortPressedMessage"}, - FunctionInfo{19, D<&ISelfController::SetAlbumImageOrientation>, "SetAlbumImageOrientation"}, - FunctionInfo{20, nullptr, "SetDesirableKeyboardLayout"}, - FunctionInfo{21, nullptr, "GetScreenShotProgramId"}, - FunctionInfo{40, D<&ISelfController::CreateManagedDisplayLayer>, "CreateManagedDisplayLayer"}, - FunctionInfo{41, D<&ISelfController::IsSystemBufferSharingEnabled>, "IsSystemBufferSharingEnabled"}, - FunctionInfo{42, D<&ISelfController::GetSystemSharedLayerHandle>, "GetSystemSharedLayerHandle"}, - FunctionInfo{43, D<&ISelfController::GetSystemSharedBufferHandle>, "GetSystemSharedBufferHandle"}, - FunctionInfo{44, D<&ISelfController::CreateManagedDisplaySeparableLayer>, "CreateManagedDisplaySeparableLayer"}, - FunctionInfo{45, nullptr, "SetManagedDisplayLayerSeparationMode"}, - FunctionInfo{46, nullptr, "SetRecordingLayerCompositionEnabled"}, - FunctionInfo{50, D<&ISelfController::SetHandlesRequestToDisplay>, "SetHandlesRequestToDisplay"}, - FunctionInfo{51, D<&ISelfController::ApproveToDisplay>, "ApproveToDisplay"}, - FunctionInfo{60, D<&ISelfController::OverrideAutoSleepTimeAndDimmingTime>, "OverrideAutoSleepTimeAndDimmingTime"}, - FunctionInfo{61, D<&ISelfController::SetMediaPlaybackState>, "SetMediaPlaybackState"}, - FunctionInfo{62, D<&ISelfController::SetIdleTimeDetectionExtension>, "SetIdleTimeDetectionExtension"}, - FunctionInfo{63, D<&ISelfController::GetIdleTimeDetectionExtension>, "GetIdleTimeDetectionExtension"}, - FunctionInfo{64, nullptr, "SetInputDetectionSourceSet"}, - FunctionInfo{65, D<&ISelfController::ReportUserIsActive>, "ReportUserIsActive"}, - FunctionInfo{66, nullptr, "GetCurrentIlluminance"}, - FunctionInfo{67, D<&ISelfController::IsIlluminanceAvailable>, "IsIlluminanceAvailable"}, - FunctionInfo{68, D<&ISelfController::SetAutoSleepDisabled>, "SetAutoSleepDisabled"}, - FunctionInfo{69, D<&ISelfController::IsAutoSleepDisabled>, "IsAutoSleepDisabled"}, - FunctionInfo{70, nullptr, "ReportMultimediaError"}, - FunctionInfo{71, nullptr, "GetCurrentIlluminanceEx"}, - FunctionInfo{72, D<&ISelfController::SetInputDetectionPolicy>, "SetInputDetectionPolicy"}, - FunctionInfo{80, nullptr, "SetWirelessPriorityMode"}, - FunctionInfo{90, D<&ISelfController::GetAccumulatedSuspendedTickValue>, "GetAccumulatedSuspendedTickValue"}, - FunctionInfo{91, D<&ISelfController::GetAccumulatedSuspendedTickChangedEvent>, "GetAccumulatedSuspendedTickChangedEvent"}, - FunctionInfo{100, D<&ISelfController::SetAlbumImageTakenNotificationEnabled>, "SetAlbumImageTakenNotificationEnabled"}, - FunctionInfo{110, nullptr, "SetApplicationAlbumUserData"}, - FunctionInfo{120, D<&ISelfController::SaveCurrentScreenshot>, "SaveCurrentScreenshot"}, - FunctionInfo{130, D<&ISelfController::SetRecordVolumeMuted>, "SetRecordVolumeMuted"}, - FunctionInfo{230, D<&ISelfController::Unknown230>, "Unknown230"}, - FunctionInfo{240, D<&ISelfController::Unknown240>, "Unknown240"}, - FunctionInfo{1000, nullptr, "GetDebugStorageChannel"} - ); - return HandlerTableGenerateWithFind(key, functions); - } - ISelfController::ISelfController(Core::System& system_, std::shared_ptr applet, Kernel::KProcess* process) : ServiceFramework{system_, "ISelfController"}, m_process{process}, m_applet{ std::move(applet)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ISelfController::Exit>, "Exit"}, + {1, D<&ISelfController::LockExit>, "LockExit"}, + {2, D<&ISelfController::UnlockExit>, "UnlockExit"}, + {3, D<&ISelfController::EnterFatalSection>, "EnterFatalSection"}, + {4, D<&ISelfController::LeaveFatalSection>, "LeaveFatalSection"}, + {9, D<&ISelfController::GetLibraryAppletLaunchableEvent>, "GetLibraryAppletLaunchableEvent"}, + {10, D<&ISelfController::SetScreenShotPermission>, "SetScreenShotPermission"}, + {11, D<&ISelfController::SetOperationModeChangedNotification>, "SetOperationModeChangedNotification"}, + {12, D<&ISelfController::SetPerformanceModeChangedNotification>, "SetPerformanceModeChangedNotification"}, + {13, D<&ISelfController::SetFocusHandlingMode>, "SetFocusHandlingMode"}, + {14, D<&ISelfController::SetRestartMessageEnabled>, "SetRestartMessageEnabled"}, + {15, D<&ISelfController::SetScreenShotAppletIdentityInfo>, "SetScreenShotAppletIdentityInfo"}, + {16, D<&ISelfController::SetOutOfFocusSuspendingEnabled>, "SetOutOfFocusSuspendingEnabled"}, + {17, nullptr, "SetControllerFirmwareUpdateSection"}, + {18, nullptr, "SetRequiresCaptureButtonShortPressedMessage"}, + {19, D<&ISelfController::SetAlbumImageOrientation>, "SetAlbumImageOrientation"}, + {20, nullptr, "SetDesirableKeyboardLayout"}, + {21, nullptr, "GetScreenShotProgramId"}, + {40, D<&ISelfController::CreateManagedDisplayLayer>, "CreateManagedDisplayLayer"}, + {41, D<&ISelfController::IsSystemBufferSharingEnabled>, "IsSystemBufferSharingEnabled"}, + {42, D<&ISelfController::GetSystemSharedLayerHandle>, "GetSystemSharedLayerHandle"}, + {43, D<&ISelfController::GetSystemSharedBufferHandle>, "GetSystemSharedBufferHandle"}, + {44, D<&ISelfController::CreateManagedDisplaySeparableLayer>, "CreateManagedDisplaySeparableLayer"}, + {45, nullptr, "SetManagedDisplayLayerSeparationMode"}, + {46, nullptr, "SetRecordingLayerCompositionEnabled"}, + {50, D<&ISelfController::SetHandlesRequestToDisplay>, "SetHandlesRequestToDisplay"}, + {51, D<&ISelfController::ApproveToDisplay>, "ApproveToDisplay"}, + {60, D<&ISelfController::OverrideAutoSleepTimeAndDimmingTime>, "OverrideAutoSleepTimeAndDimmingTime"}, + {61, D<&ISelfController::SetMediaPlaybackState>, "SetMediaPlaybackState"}, + {62, D<&ISelfController::SetIdleTimeDetectionExtension>, "SetIdleTimeDetectionExtension"}, + {63, D<&ISelfController::GetIdleTimeDetectionExtension>, "GetIdleTimeDetectionExtension"}, + {64, nullptr, "SetInputDetectionSourceSet"}, + {65, D<&ISelfController::ReportUserIsActive>, "ReportUserIsActive"}, + {66, nullptr, "GetCurrentIlluminance"}, + {67, D<&ISelfController::IsIlluminanceAvailable>, "IsIlluminanceAvailable"}, + {68, D<&ISelfController::SetAutoSleepDisabled>, "SetAutoSleepDisabled"}, + {69, D<&ISelfController::IsAutoSleepDisabled>, "IsAutoSleepDisabled"}, + {70, nullptr, "ReportMultimediaError"}, + {71, nullptr, "GetCurrentIlluminanceEx"}, + {72, D<&ISelfController::SetInputDetectionPolicy>, "SetInputDetectionPolicy"}, + {80, nullptr, "SetWirelessPriorityMode"}, + {90, D<&ISelfController::GetAccumulatedSuspendedTickValue>, "GetAccumulatedSuspendedTickValue"}, + {91, D<&ISelfController::GetAccumulatedSuspendedTickChangedEvent>, "GetAccumulatedSuspendedTickChangedEvent"}, + {100, D<&ISelfController::SetAlbumImageTakenNotificationEnabled>, "SetAlbumImageTakenNotificationEnabled"}, + {110, nullptr, "SetApplicationAlbumUserData"}, + {120, D<&ISelfController::SaveCurrentScreenshot>, "SaveCurrentScreenshot"}, + {130, D<&ISelfController::SetRecordVolumeMuted>, "SetRecordVolumeMuted"}, + {230, D<&ISelfController::Unknown230>, "Unknown230"}, + {240, D<&ISelfController::Unknown240>, "Unknown240"}, + {1000, nullptr, "GetDebugStorageChannel"}, + }; + // clang-format on + + RegisterHandlers(functions); + std::scoped_lock lk{m_applet->lock}; m_applet->display_layer_manager.Initialize(system, m_process, m_applet->applet_id, m_applet->library_applet_mode); diff --git a/src/core/hle/service/am/service/self_controller.h b/src/core/hle/service/am/service/self_controller.h index ce77769da2..c9f480f575 100644 --- a/src/core/hle/service/am/service/self_controller.h +++ b/src/core/hle/service/am/service/self_controller.h @@ -70,7 +70,6 @@ private: Result Unknown230(u32 in_val, Out out_val); Result Unknown240(u32 in_val); - std::optional FindRequest(u32 key) override; Kernel::KProcess* const m_process; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/am/service/storage.cpp b/src/core/hle/service/am/service/storage.cpp index 110a9f5a42..5fe191bf2f 100644 --- a/src/core/hle/service/am/service/storage.cpp +++ b/src/core/hle/service/am/service/storage.cpp @@ -4,86 +4,22 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "core/hle/kernel/k_transfer_memory.h" #include "core/hle/service/am/am_results.h" #include "core/hle/service/am/library_applet_storage.h" #include "core/hle/service/am/service/storage.h" +#include "core/hle/service/am/service/storage_accessor.h" #include "core/hle/service/cmif_serialization.h" namespace Service::AM { -class IStorageAccessor final : public ServiceFramework { -public: - explicit IStorageAccessor(Core::System& system_, std::shared_ptr impl) : ServiceFramework{system_, "IStorageAccessor"}, m_impl{std::move(impl)} {} - ~IStorageAccessor() override = default; - - Result GetSize(Out out_size) { - LOG_DEBUG(Service_AM, "called"); - *out_size = m_impl->GetSize(); - R_SUCCEED(); - } - - Result Write(InBuffer buffer, s64 offset) { - LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, buffer.size()); - R_RETURN(m_impl->Write(offset, buffer.data(), buffer.size())); - } - - Result Read(OutBuffer out_buffer, s64 offset) { - LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, out_buffer.size()); - R_RETURN(m_impl->Read(offset, out_buffer.data(), out_buffer.size())); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IStorageAccessor::GetSize>, "GetSize"}, - FunctionInfo{10, D<&IStorageAccessor::Write>, "Write"}, - FunctionInfo{11, D<&IStorageAccessor::Read>, "Read"} - ); - - const std::shared_ptr m_impl; -}; - -class ITransferStorageAccessor final : public ServiceFramework { -public: - explicit ITransferStorageAccessor(Core::System& system_, std::shared_ptr impl) : ServiceFramework{system_, "ITransferStorageAccessor"}, m_impl{std::move(impl)} {} - ~ITransferStorageAccessor() override = default; - - Result GetSize(Out out_size) { - LOG_DEBUG(Service_AM, "called"); - *out_size = m_impl->GetSize(); - R_SUCCEED(); - } - - Result GetHandle(Out out_size, OutCopyHandle out_handle) { - LOG_INFO(Service_AM, "called"); - *out_size = m_impl->GetSize(); - *out_handle = m_impl->GetHandle(); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ITransferStorageAccessor::GetSize>, "GetSize"}, - FunctionInfo{1, D<&ITransferStorageAccessor::GetHandle>, "GetHandle"} - ); - - const std::shared_ptr m_impl; -}; - -std::optional IStorage::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IStorage::Open>, "Open"}, - FunctionInfo{1, D<&IStorage::OpenTransferStorage>, "OpenTransferStorage"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IStorage::IStorage(Core::System& system_, std::shared_ptr impl) : ServiceFramework{system_, "IStorage"}, m_impl{std::move(impl)} { + static const FunctionInfo functions[] = { + {0, D<&IStorage::Open>, "Open"}, + {1, D<&IStorage::OpenTransferStorage>, "OpenTransferStorage"}, + }; + + RegisterHandlers(functions); } IStorage::IStorage(Core::System& system_, std::vector&& data) diff --git a/src/core/hle/service/am/service/storage.h b/src/core/hle/service/am/service/storage.h index 63b7a0ad4c..462c823206 100644 --- a/src/core/hle/service/am/service/storage.h +++ b/src/core/hle/service/am/service/storage.h @@ -32,7 +32,6 @@ private: Result OpenTransferStorage( Out> out_transfer_storage_accessor); - std::optional FindRequest(u32 key) override; const std::shared_ptr m_impl; }; diff --git a/src/core/hle/service/am/service/storage_accessor.cpp b/src/core/hle/service/am/service/storage_accessor.cpp new file mode 100644 index 0000000000..2fe379a74d --- /dev/null +++ b/src/core/hle/service/am/service/storage_accessor.cpp @@ -0,0 +1,71 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/kernel/k_transfer_memory.h" +#include "core/hle/service/am/library_applet_storage.h" +#include "core/hle/service/am/service/storage_accessor.h" +#include "core/hle/service/cmif_serialization.h" + +namespace Service::AM { + +IStorageAccessor::IStorageAccessor(Core::System& system_, + std::shared_ptr impl) + : ServiceFramework{system_, "IStorageAccessor"}, m_impl{std::move(impl)} { + static const FunctionInfo functions[] = { + {0, D<&IStorageAccessor::GetSize>, "GetSize"}, + {10, D<&IStorageAccessor::Write>, "Write"}, + {11, D<&IStorageAccessor::Read>, "Read"}, + }; + + RegisterHandlers(functions); +} + +IStorageAccessor::~IStorageAccessor() = default; + +Result IStorageAccessor::GetSize(Out out_size) { + LOG_DEBUG(Service_AM, "called"); + *out_size = m_impl->GetSize(); + R_SUCCEED(); +} + +Result IStorageAccessor::Write(InBuffer buffer, s64 offset) { + LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, buffer.size()); + R_RETURN(m_impl->Write(offset, buffer.data(), buffer.size())); +} + +Result IStorageAccessor::Read(OutBuffer out_buffer, s64 offset) { + LOG_DEBUG(Service_AM, "called, offset={} size={}", offset, out_buffer.size()); + R_RETURN(m_impl->Read(offset, out_buffer.data(), out_buffer.size())); +} + +ITransferStorageAccessor::ITransferStorageAccessor(Core::System& system_, + std::shared_ptr impl) + : ServiceFramework{system_, "ITransferStorageAccessor"}, m_impl{std::move(impl)} { + static const FunctionInfo functions[] = { + {0, D<&ITransferStorageAccessor::GetSize>, "GetSize"}, + {1, D<&ITransferStorageAccessor::GetHandle>, "GetHandle"}, + }; + + RegisterHandlers(functions); +} + +ITransferStorageAccessor::~ITransferStorageAccessor() = default; + +Result ITransferStorageAccessor::GetSize(Out out_size) { + LOG_DEBUG(Service_AM, "called"); + *out_size = m_impl->GetSize(); + R_SUCCEED(); +} + +Result ITransferStorageAccessor::GetHandle(Out out_size, + OutCopyHandle out_handle) { + LOG_INFO(Service_AM, "called"); + *out_size = m_impl->GetSize(); + *out_handle = m_impl->GetHandle(); + R_SUCCEED(); +} + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/storage_accessor.h b/src/core/hle/service/am/service/storage_accessor.h new file mode 100644 index 0000000000..76af3de363 --- /dev/null +++ b/src/core/hle/service/am/service/storage_accessor.h @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/am/library_applet_storage.h" +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Service::AM { + +class IStorageAccessor final : public ServiceFramework { +public: + explicit IStorageAccessor(Core::System& system_, std::shared_ptr impl); + ~IStorageAccessor() override; + +private: + Result GetSize(Out out_size); + Result Write(InBuffer buffer, s64 offset); + Result Read(OutBuffer out_buffer, s64 offset); + + const std::shared_ptr m_impl; +}; + +class ITransferStorageAccessor final : public ServiceFramework { +public: + explicit ITransferStorageAccessor(Core::System& system_, + std::shared_ptr impl); + ~ITransferStorageAccessor() override; + +private: + Result GetSize(Out out_size); + Result GetHandle(Out out_size, OutCopyHandle out_handle); + + const std::shared_ptr m_impl; +}; + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/system_applet_proxy.cpp b/src/core/hle/service/am/service/system_applet_proxy.cpp new file mode 100644 index 0000000000..bb56750d09 --- /dev/null +++ b/src/core/hle/service/am/service/system_applet_proxy.cpp @@ -0,0 +1,136 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/am/service/applet_common_functions.h" +#include "core/hle/service/am/service/application_creator.h" +#include "core/hle/service/am/service/audio_controller.h" +#include "core/hle/service/am/service/common_state_getter.h" +#include "core/hle/service/am/service/debug_functions.h" +#include "core/hle/service/am/service/display_controller.h" +#include "core/hle/service/am/service/global_state_controller.h" +#include "core/hle/service/am/service/home_menu_functions.h" +#include "core/hle/service/am/service/library_applet_creator.h" +#include "core/hle/service/am/service/process_winding_controller.h" +#include "core/hle/service/am/service/self_controller.h" +#include "core/hle/service/am/service/system_applet_proxy.h" +#include "core/hle/service/am/service/window_controller.h" +#include "core/hle/service/cmif_serialization.h" + +namespace Service::AM { + +ISystemAppletProxy::ISystemAppletProxy(Core::System& system_, std::shared_ptr applet, + Kernel::KProcess* process, WindowSystem& window_system) + : ServiceFramework{system_, "ISystemAppletProxy"}, + m_window_system{window_system}, m_process{process}, m_applet{std::move(applet)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ISystemAppletProxy::GetCommonStateGetter>, "GetCommonStateGetter"}, + {1, D<&ISystemAppletProxy::GetSelfController>, "GetSelfController"}, + {2, D<&ISystemAppletProxy::GetWindowController>, "GetWindowController"}, + {3, D<&ISystemAppletProxy::GetAudioController>, "GetAudioController"}, + {4, D<&ISystemAppletProxy::GetDisplayController>, "GetDisplayController"}, + {10, D<&ISystemAppletProxy::GetProcessWindingController>, "GetProcessWindingController"}, + {11, D<&ISystemAppletProxy::GetLibraryAppletCreator>, "GetLibraryAppletCreator"}, + {20, D<&ISystemAppletProxy::GetHomeMenuFunctions>, "GetHomeMenuFunctions"}, + {21, D<&ISystemAppletProxy::GetGlobalStateController>, "GetGlobalStateController"}, + {22, D<&ISystemAppletProxy::GetApplicationCreator>, "GetApplicationCreator"}, + {23, D<&ISystemAppletProxy::GetAppletCommonFunctions>, "GetAppletCommonFunctions"}, + {1000, D<&ISystemAppletProxy::GetDebugFunctions>, "GetDebugFunctions"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +ISystemAppletProxy::~ISystemAppletProxy() = default; + +Result ISystemAppletProxy::GetAudioController( + Out> out_audio_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_audio_controller = std::make_shared(system); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetDisplayController( + Out> out_display_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_display_controller = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetProcessWindingController( + Out> out_process_winding_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_process_winding_controller = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetDebugFunctions( + Out> out_debug_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_debug_functions = std::make_shared(system); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetWindowController( + Out> out_window_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_window_controller = std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetSelfController( + Out> out_self_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_self_controller = std::make_shared(system, m_applet, m_process); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetCommonStateGetter( + Out> out_common_state_getter) { + LOG_DEBUG(Service_AM, "called"); + *out_common_state_getter = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetLibraryAppletCreator( + Out> out_library_applet_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_library_applet_creator = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetApplicationCreator( + Out> out_application_creator) { + LOG_DEBUG(Service_AM, "called"); + *out_application_creator = std::make_shared(system, m_window_system); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetAppletCommonFunctions( + Out> out_applet_common_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_applet_common_functions = std::make_shared(system, m_applet); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetHomeMenuFunctions( + Out> out_home_menu_functions) { + LOG_DEBUG(Service_AM, "called"); + *out_home_menu_functions = + std::make_shared(system, m_applet, m_window_system); + R_SUCCEED(); +} + +Result ISystemAppletProxy::GetGlobalStateController( + Out> out_global_state_controller) { + LOG_DEBUG(Service_AM, "called"); + *out_global_state_controller = std::make_shared(system); + R_SUCCEED(); +} + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/system_applet_proxy.h b/src/core/hle/service/am/service/system_applet_proxy.h new file mode 100644 index 0000000000..76cef507a5 --- /dev/null +++ b/src/core/hle/service/am/service/system_applet_proxy.h @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Service::AM { + +struct Applet; +class IAppletCommonFunctions; +class IApplicationCreator; +class IAudioController; +class ICommonStateGetter; +class IDebugFunctions; +class IDisplayController; +class IHomeMenuFunctions; +class IGlobalStateController; +class ILibraryAppletCreator; +class IProcessWindingController; +class ISelfController; +class IWindowController; +class WindowSystem; + +class ISystemAppletProxy final : public ServiceFramework { +public: + explicit ISystemAppletProxy(Core::System& system, std::shared_ptr applet, + Kernel::KProcess* process, WindowSystem& window_system); + ~ISystemAppletProxy(); + +private: + Result GetCommonStateGetter(Out> out_common_state_getter); + Result GetSelfController(Out> out_self_controller); + Result GetWindowController(Out> out_window_controller); + Result GetAudioController(Out> out_audio_controller); + Result GetDisplayController(Out> out_display_controller); + Result GetProcessWindingController( + Out> out_process_winding_controller); + Result GetDebugFunctions(Out> out_debug_functions); + Result GetLibraryAppletCreator( + Out> out_library_applet_creator); + Result GetApplicationCreator(Out> out_application_creator); + Result GetAppletCommonFunctions( + Out> out_applet_common_functions); + Result GetHomeMenuFunctions(Out> out_home_menu_functions); + Result GetGlobalStateController( + Out> out_global_state_controller); + + WindowSystem& m_window_system; + Kernel::KProcess* const m_process; + const std::shared_ptr m_applet; +}; + +} // namespace Service::AM diff --git a/src/core/hle/service/am/service/window_controller.cpp b/src/core/hle/service/am/service/window_controller.cpp index d07aba0c79..f2b9dccb27 100644 --- a/src/core/hle/service/am/service/window_controller.cpp +++ b/src/core/hle/service/am/service/window_controller.cpp @@ -12,24 +12,24 @@ namespace Service::AM { -std::optional IWindowController::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateWindow"}, - FunctionInfo{1, D<&IWindowController::GetAppletResourceUserId>, "GetAppletResourceUserId"}, - FunctionInfo{2, D<&IWindowController::GetAppletResourceUserIdOfCallerApplet>, "GetAppletResourceUserIdOfCallerApplet"}, - FunctionInfo{10, D<&IWindowController::AcquireForegroundRights>, "AcquireForegroundRights"}, - FunctionInfo{11, D<&IWindowController::ReleaseForegroundRights>, "ReleaseForegroundRights"}, - FunctionInfo{12, D<&IWindowController::RejectToChangeIntoBackground>, "RejectToChangeIntoBackground"}, - FunctionInfo{20, D<&IWindowController::SetAppletWindowVisibility>, "SetAppletWindowVisibility"}, - FunctionInfo{21, D<&IWindowController::SetAppletGpuTimeSlice>, "SetAppletGpuTimeSlice"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IWindowController::IWindowController(Core::System& system_, std::shared_ptr applet, WindowSystem& window_system) : ServiceFramework{system_, "IWindowController"}, m_window_system{window_system}, m_applet{std::move(applet)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "CreateWindow"}, + {1, D<&IWindowController::GetAppletResourceUserId>, "GetAppletResourceUserId"}, + {2, D<&IWindowController::GetAppletResourceUserIdOfCallerApplet>, "GetAppletResourceUserIdOfCallerApplet"}, + {10, D<&IWindowController::AcquireForegroundRights>, "AcquireForegroundRights"}, + {11, D<&IWindowController::ReleaseForegroundRights>, "ReleaseForegroundRights"}, + {12, D<&IWindowController::RejectToChangeIntoBackground>, "RejectToChangeIntoBackground"}, + {20, D<&IWindowController::SetAppletWindowVisibility>, "SetAppletWindowVisibility"}, + {21, D<&IWindowController::SetAppletGpuTimeSlice>, "SetAppletGpuTimeSlice"}, + }; + // clang-format on + + RegisterHandlers(functions); } IWindowController::~IWindowController() = default; diff --git a/src/core/hle/service/am/service/window_controller.h b/src/core/hle/service/am/service/window_controller.h index 29fd723421..51a67f3039 100644 --- a/src/core/hle/service/am/service/window_controller.h +++ b/src/core/hle/service/am/service/window_controller.h @@ -29,7 +29,6 @@ private: Result SetAppletWindowVisibility(bool visible); Result SetAppletGpuTimeSlice(s64 time_slice); - std::optional FindRequest(u32 key) override; WindowSystem& m_window_system; const std::shared_ptr m_applet; }; diff --git a/src/core/hle/service/aoc/addon_content_manager.cpp b/src/core/hle/service/aoc/addon_content_manager.cpp index 0222d9c52b..be2aa34baa 100644 --- a/src/core/hle/service/aoc/addon_content_manager.cpp +++ b/src/core/hle/service/aoc/addon_content_manager.cpp @@ -28,34 +28,6 @@ namespace Service::AOC { -std::optional IAddOnContentManager::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CountAddOnContentByApplicationId"}, - FunctionInfo{1, nullptr, "ListAddOnContentByApplicationId"}, - FunctionInfo{2, D<&IAddOnContentManager::CountAddOnContent>, "CountAddOnContent"}, - FunctionInfo{3, D<&IAddOnContentManager::ListAddOnContent>, "ListAddOnContent"}, - FunctionInfo{4, nullptr, "GetAddOnContentBaseIdByApplicationId"}, - FunctionInfo{5, D<&IAddOnContentManager::GetAddOnContentBaseId>, "GetAddOnContentBaseId"}, - FunctionInfo{6, nullptr, "PrepareAddOnContentByApplicationId"}, - FunctionInfo{7, D<&IAddOnContentManager::PrepareAddOnContent>, "PrepareAddOnContent"}, - FunctionInfo{8, D<&IAddOnContentManager::GetAddOnContentListChangedEvent>, "GetAddOnContentListChangedEvent"}, - FunctionInfo{9, nullptr, "GetAddOnContentLostErrorCode"}, - FunctionInfo{10, D<&IAddOnContentManager::GetAddOnContentListChangedEventWithProcessId>, "GetAddOnContentListChangedEventWithProcessId"}, - FunctionInfo{11, D<&IAddOnContentManager::NotifyMountAddOnContent>, "NotifyMountAddOnContent"}, - FunctionInfo{12, D<&IAddOnContentManager::NotifyUnmountAddOnContent>, "NotifyUnmountAddOnContent"}, - FunctionInfo{13, nullptr, "IsAddOnContentMountedForDebug"}, - FunctionInfo{50, D<&IAddOnContentManager::CheckAddOnContentMountStatus>, "CheckAddOnContentMountStatus"}, - FunctionInfo{100, D<&IAddOnContentManager::CreateEcPurchasedEventManager>, "CreateEcPurchasedEventManager"}, - FunctionInfo{101, D<&IAddOnContentManager::CreatePermanentEcPurchasedEventManager>, "CreatePermanentEcPurchasedEventManager"}, - FunctionInfo{110, nullptr, "CreateContentsServiceManager"}, - FunctionInfo{200, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"}, - FunctionInfo{300, nullptr, "SetupHostAddOnContent"}, - FunctionInfo{301, nullptr, "GetRegisteredAddOnContentPath"}, - FunctionInfo{302, nullptr, "UpdateCachedList"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - static bool CheckAOCTitleIDMatchesBase(u64 title_id, u64 base) { return FileSys::GetBaseTitleID(title_id) == base; } @@ -85,6 +57,35 @@ static std::vector AccumulateAOCTitleIDs(Core::System& system) { IAddOnContentManager::IAddOnContentManager(Core::System& system_) : ServiceFramework{system_, "aoc:u"}, add_on_content{AccumulateAOCTitleIDs(system)}, service_context{system_, "aoc:u"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "CountAddOnContentByApplicationId"}, + {1, nullptr, "ListAddOnContentByApplicationId"}, + {2, D<&IAddOnContentManager::CountAddOnContent>, "CountAddOnContent"}, + {3, D<&IAddOnContentManager::ListAddOnContent>, "ListAddOnContent"}, + {4, nullptr, "GetAddOnContentBaseIdByApplicationId"}, + {5, D<&IAddOnContentManager::GetAddOnContentBaseId>, "GetAddOnContentBaseId"}, + {6, nullptr, "PrepareAddOnContentByApplicationId"}, + {7, D<&IAddOnContentManager::PrepareAddOnContent>, "PrepareAddOnContent"}, + {8, D<&IAddOnContentManager::GetAddOnContentListChangedEvent>, "GetAddOnContentListChangedEvent"}, + {9, nullptr, "GetAddOnContentLostErrorCode"}, + {10, D<&IAddOnContentManager::GetAddOnContentListChangedEventWithProcessId>, "GetAddOnContentListChangedEventWithProcessId"}, + {11, D<&IAddOnContentManager::NotifyMountAddOnContent>, "NotifyMountAddOnContent"}, + {12, D<&IAddOnContentManager::NotifyUnmountAddOnContent>, "NotifyUnmountAddOnContent"}, + {13, nullptr, "IsAddOnContentMountedForDebug"}, + {50, D<&IAddOnContentManager::CheckAddOnContentMountStatus>, "CheckAddOnContentMountStatus"}, + {100, D<&IAddOnContentManager::CreateEcPurchasedEventManager>, "CreateEcPurchasedEventManager"}, + {101, D<&IAddOnContentManager::CreatePermanentEcPurchasedEventManager>, "CreatePermanentEcPurchasedEventManager"}, + {110, nullptr, "CreateContentsServiceManager"}, + {200, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"}, + {300, nullptr, "SetupHostAddOnContent"}, + {301, nullptr, "GetRegisteredAddOnContentPath"}, + {302, nullptr, "UpdateCachedList"}, + }; + // clang-format on + + RegisterHandlers(functions); + aoc_change_event = service_context.CreateEvent("GetAddOnContentListChanged:Event"); } diff --git a/src/core/hle/service/aoc/addon_content_manager.h b/src/core/hle/service/aoc/addon_content_manager.h index 8ddb86cf19..b505525590 100644 --- a/src/core/hle/service/aoc/addon_content_manager.h +++ b/src/core/hle/service/aoc/addon_content_manager.h @@ -43,9 +43,9 @@ public: OutInterface out_interface); private: - std::optional FindRequest(u32 key) override; std::vector add_on_content; KernelHelpers::ServiceContext service_context; + Kernel::KEvent* aoc_change_event; }; diff --git a/src/core/hle/service/aoc/purchase_event_manager.cpp b/src/core/hle/service/aoc/purchase_event_manager.cpp index eded803b25..64e1244967 100644 --- a/src/core/hle/service/aoc/purchase_event_manager.cpp +++ b/src/core/hle/service/aoc/purchase_event_manager.cpp @@ -11,20 +11,21 @@ namespace Service::AOC { constexpr Result ResultNoPurchasedProductInfoAvailable{ErrorModule::NIMShop, 400}; -std::optional IPurchaseEventManager::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IPurchaseEventManager::SetDefaultDeliveryTarget>, "SetDefaultDeliveryTarget"}, - FunctionInfo{1, D<&IPurchaseEventManager::SetDeliveryTarget>, "SetDeliveryTarget"}, - FunctionInfo{2, D<&IPurchaseEventManager::GetPurchasedEvent>, "GetPurchasedEvent"}, - FunctionInfo{3, D<&IPurchaseEventManager::PopPurchasedProductInfo>, "PopPurchasedProductInfo"}, - FunctionInfo{4, D<&IPurchaseEventManager::PopPurchasedProductInfoWithUid>, "PopPurchasedProductInfoWithUid"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IPurchaseEventManager::IPurchaseEventManager(Core::System& system_) - : ServiceFramework{system_, "IPurchaseEventManager"} - , service_context{system, "IPurchaseEventManager"} { + : ServiceFramework{system_, "IPurchaseEventManager"}, service_context{system, + "IPurchaseEventManager"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IPurchaseEventManager::SetDefaultDeliveryTarget>, "SetDefaultDeliveryTarget"}, + {1, D<&IPurchaseEventManager::SetDeliveryTarget>, "SetDeliveryTarget"}, + {2, D<&IPurchaseEventManager::GetPurchasedEvent>, "GetPurchasedEvent"}, + {3, D<&IPurchaseEventManager::PopPurchasedProductInfo>, "PopPurchasedProductInfo"}, + {4, D<&IPurchaseEventManager::PopPurchasedProductInfoWithUid>, "PopPurchasedProductInfoWithUid"}, + }; + // clang-format on + + RegisterHandlers(functions); + purchased_event = service_context.CreateEvent("IPurchaseEventManager:PurchasedEvent"); } diff --git a/src/core/hle/service/aoc/purchase_event_manager.h b/src/core/hle/service/aoc/purchase_event_manager.h index d11089e567..c0bdfaf242 100644 --- a/src/core/hle/service/aoc/purchase_event_manager.h +++ b/src/core/hle/service/aoc/purchase_event_manager.h @@ -25,8 +25,6 @@ public: Result PopPurchasedProductInfo(); Result PopPurchasedProductInfoWithUid(); - std::optional FindRequest(u32 key) override; - private: KernelHelpers::ServiceContext service_context; Kernel::KEvent* purchased_event; diff --git a/src/core/hle/service/apm/apm.h b/src/core/hle/service/apm/apm.h index e188b4e446..265e581697 100644 --- a/src/core/hle/service/apm/apm.h +++ b/src/core/hle/service/apm/apm.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/apm/apm_controller.h b/src/core/hle/service/apm/apm_controller.h index 3357b7762a..c2f65a2f0e 100644 --- a/src/core/hle/service/apm/apm_controller.h +++ b/src/core/hle/service/apm/apm_controller.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/apm/apm_interface.cpp b/src/core/hle/service/apm/apm_interface.cpp index 2b4768478e..51c01e2f25 100644 --- a/src/core/hle/service/apm/apm_interface.cpp +++ b/src/core/hle/service/apm/apm_interface.cpp @@ -14,7 +14,15 @@ namespace Service::APM { class ISession final : public ServiceFramework { public: - explicit ISession(Core::System& system_, Controller& controller_) : ServiceFramework{system_, "ISession"}, controller{controller_} {} + explicit ISession(Core::System& system_, Controller& controller_) + : ServiceFramework{system_, "ISession"}, controller{controller_} { + static const FunctionInfo functions[] = { + {0, &ISession::SetPerformanceConfiguration, "SetPerformanceConfiguration"}, + {1, &ISession::GetPerformanceConfiguration, "GetPerformanceConfiguration"}, + {2, &ISession::SetCpuOverclockEnabled, "SetCpuOverclockEnabled"}, + }; + RegisterHandlers(functions); + } private: void SetPerformanceConfiguration(HLERequestContext& ctx) { @@ -53,20 +61,18 @@ private: rb.Push(ResultSuccess); } - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &ISession::SetPerformanceConfiguration, "SetPerformanceConfiguration"}, - FunctionInfo{1, &ISession::GetPerformanceConfiguration, "GetPerformanceConfiguration"}, - FunctionInfo{2, &ISession::SetCpuOverclockEnabled, "SetCpuOverclockEnabled"} - ); Controller& controller; }; APM::APM(Core::System& system_, std::shared_ptr apm_, Controller& controller_, const char* name) : ServiceFramework{system_, name}, apm(std::move(apm_)), controller{controller_} { + static const FunctionInfo functions[] = { + {0, &APM::OpenSession, "OpenSession"}, + {1, &APM::GetPerformanceMode, "GetPerformanceMode"}, + {6, &APM::IsCpuOverclockEnabled, "IsCpuOverclockEnabled"}, + }; + RegisterHandlers(functions); } APM::~APM() = default; @@ -96,6 +102,20 @@ void APM::IsCpuOverclockEnabled(HLERequestContext& ctx) { APM_Sys::APM_Sys(Core::System& system_, Controller& controller_) : ServiceFramework{system_, "apm:sys"}, controller{controller_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestPerformanceMode"}, + {1, &APM_Sys::GetPerformanceEvent, "GetPerformanceEvent"}, + {2, nullptr, "GetThrottlingState"}, + {3, nullptr, "GetLastThrottlingState"}, + {4, nullptr, "ClearLastThrottlingState"}, + {5, nullptr, "LoadAndApplySettings"}, + {6, &APM_Sys::SetCpuBoostMode, "SetCpuBoostMode"}, + {7, &APM_Sys::GetCurrentPerformanceConfiguration, "GetCurrentPerformanceConfiguration"}, + }; + // clang-format on + + RegisterHandlers(functions); } APM_Sys::~APM_Sys() = default; diff --git a/src/core/hle/service/apm/apm_interface.h b/src/core/hle/service/apm/apm_interface.h index 0bbcd185a3..eeac3474b0 100644 --- a/src/core/hle/service/apm/apm_interface.h +++ b/src/core/hle/service/apm/apm_interface.h @@ -24,14 +24,6 @@ private: void GetPerformanceMode(HLERequestContext& ctx); void IsCpuOverclockEnabled(HLERequestContext& ctx); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &APM::OpenSession, "OpenSession"}, - FunctionInfo{1, &APM::GetPerformanceMode, "GetPerformanceMode"}, - FunctionInfo{6, &APM::IsCpuOverclockEnabled, "IsCpuOverclockEnabled"} - ); std::shared_ptr apm; Controller& controller; }; @@ -47,19 +39,6 @@ private: void GetPerformanceEvent(HLERequestContext& ctx); void GetCurrentPerformanceConfiguration(HLERequestContext& ctx); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestPerformanceMode"}, - FunctionInfo{1, &APM_Sys::GetPerformanceEvent, "GetPerformanceEvent"}, - FunctionInfo{2, nullptr, "GetThrottlingState"}, - FunctionInfo{3, nullptr, "GetLastThrottlingState"}, - FunctionInfo{4, nullptr, "ClearLastThrottlingState"}, - FunctionInfo{5, nullptr, "LoadAndApplySettings"}, - FunctionInfo{6, &APM_Sys::SetCpuBoostMode, "SetCpuBoostMode"}, - FunctionInfo{7, &APM_Sys::GetCurrentPerformanceConfiguration, "GetCurrentPerformanceConfiguration"} - ); Controller& controller; }; diff --git a/src/core/hle/service/audio/audio.cpp b/src/core/hle/service/audio/audio.cpp index 6177efd46c..fde766a275 100644 --- a/src/core/hle/service/audio/audio.cpp +++ b/src/core/hle/service/audio/audio.cpp @@ -21,164 +21,164 @@ namespace Service::Audio { class IAudioOutManagerForApplet final : public ServiceFramework { public: explicit IAudioOutManagerForApplet(Core::System& system_) - : ServiceFramework{system_, "audout:a"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspend"}, - FunctionInfo{1, nullptr, "RequestResume"}, - FunctionInfo{2, nullptr, "GetProcessMasterVolume"}, - FunctionInfo{3, nullptr, "SetProcessMasterVolume"}, - FunctionInfo{4, nullptr, "GetProcessRecordVolume"}, - FunctionInfo{5, nullptr, "SetProcessRecordVolume"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "audout:a"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspend"}, + {1, nullptr, "RequestResume"}, + {2, nullptr, "GetProcessMasterVolume"}, + {3, nullptr, "SetProcessMasterVolume"}, + {4, nullptr, "GetProcessRecordVolume"}, + {5, nullptr, "SetProcessRecordVolume"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IAudioSnoopManager final : public ServiceFramework { public: explicit IAudioSnoopManager(Core::System& system_) - : ServiceFramework{system_, "auddev"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetDspStatistics"}, - FunctionInfo{1, nullptr, "GetAppletStateSummaries"}, - FunctionInfo{2, nullptr, "SetDspStatisticsParameter"}, - FunctionInfo{3, nullptr, "GetDspStatisticsParameter"}, - FunctionInfo{6, nullptr, "GetDspUsage"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "auddev"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetDspStatistics"}, + {1, nullptr, "GetAppletStateSummaries"}, + {2, nullptr, "SetDspStatisticsParameter"}, + {3, nullptr, "GetDspStatisticsParameter"}, + {6, nullptr, "GetDspUsage"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IAudioInManagerForApplet final : public ServiceFramework { public: explicit IAudioInManagerForApplet(Core::System& system_) - : ServiceFramework{system_, "audin:a"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspend"}, - FunctionInfo{1, nullptr, "RequestResume"}, - FunctionInfo{2, nullptr, "GetProcessMasterVolume"}, - FunctionInfo{3, nullptr, "SetProcessMasterVolume"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "audin:a"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspend"}, + {1, nullptr, "RequestResume"}, + {2, nullptr, "GetProcessMasterVolume"}, + {3, nullptr, "SetProcessMasterVolume"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IAudioRendererManagerForApplet final : public ServiceFramework { public: explicit IAudioRendererManagerForApplet(Core::System& system_) - : ServiceFramework{system_, "audren:a"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspend"}, - FunctionInfo{1, nullptr, "RequestResume"}, - FunctionInfo{2, nullptr, "GetProcessMasterVolume"}, - FunctionInfo{3, nullptr, "SetProcessMasterVolume"}, - FunctionInfo{4, nullptr, "RegisterAppletResourceUserId"}, - FunctionInfo{5, nullptr, "UnregisterAppletResourceUserId"}, - FunctionInfo{6, nullptr, "GetProcessRecordVolume"}, - FunctionInfo{7, nullptr, "SetProcessRecordVolume"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "audren:a"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspend"}, + {1, nullptr, "RequestResume"}, + {2, nullptr, "GetProcessMasterVolume"}, + {3, nullptr, "SetProcessMasterVolume"}, + {4, nullptr, "RegisterAppletResourceUserId"}, + {5, nullptr, "UnregisterAppletResourceUserId"}, + {6, nullptr, "GetProcessRecordVolume"}, + {7, nullptr, "SetProcessRecordVolume"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IAudioOutManagerForDebugger final : public ServiceFramework { public: explicit IAudioOutManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "audout:d"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspend"}, - FunctionInfo{1, nullptr, "RequestResume"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "audout:d"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspend"}, + {1, nullptr, "RequestResume"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IAudioInManagerForDebugger final : public ServiceFramework { public: explicit IAudioInManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "audin:d"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspend"}, - FunctionInfo{1, nullptr, "RequestResume"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "audin:d"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspend"}, + {1, nullptr, "RequestResume"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IFinalOutputRecorderManagerForDebugger final : public ServiceFramework { public: explicit IFinalOutputRecorderManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "audrec:d"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspend"}, - FunctionInfo{1, nullptr, "RequestResume"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "audrec:d"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspend"}, + {1, nullptr, "RequestResume"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IAudioRendererManagerForDebugger final : public ServiceFramework { public: explicit IAudioRendererManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "audren:d"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspend"}, - FunctionInfo{1, nullptr, "RequestResume"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "audren:d"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspend"}, + {1, nullptr, "RequestResume"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IAudioSystemManagerForApplet final : public ServiceFramework { public: explicit IAudioSystemManagerForApplet(Core::System& system_) - : ServiceFramework{system_, "aud:a"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RegisterAppletResourceUserId"}, - FunctionInfo{1, nullptr, "UnregisterAppletResourceUserId"}, - FunctionInfo{2, nullptr, "RequestSuspendAudio"}, - FunctionInfo{3, nullptr, "RequestResumeAudio"}, - FunctionInfo{4, nullptr, "GetAudioOutputProcessMasterVolume"}, - FunctionInfo{5, nullptr, "SetAudioOutputProcessMasterVolume"}, - FunctionInfo{6, nullptr, "GetAudioInputProcessMasterVolume"}, - FunctionInfo{7, nullptr, "SetAudioInputProcessMasterVolume"}, - FunctionInfo{8, nullptr, "GetAudioOutputProcessRecordVolume"}, - FunctionInfo{9, nullptr, "SetAudioOutputProcessRecordVolume"}, - FunctionInfo{10, nullptr, "GetAppletStateSummaries"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "aud:a"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RegisterAppletResourceUserId"}, + {1, nullptr, "UnregisterAppletResourceUserId"}, + {2, nullptr, "RequestSuspendAudio"}, + {3, nullptr, "RequestResumeAudio"}, + {4, nullptr, "GetAudioOutputProcessMasterVolume"}, + {5, nullptr, "SetAudioOutputProcessMasterVolume"}, + {6, nullptr, "GetAudioInputProcessMasterVolume"}, + {7, nullptr, "SetAudioInputProcessMasterVolume"}, + {8, nullptr, "GetAudioOutputProcessRecordVolume"}, + {9, nullptr, "SetAudioOutputProcessRecordVolume"}, + {10, nullptr, "GetAppletStateSummaries"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IAudioSystemManagerForDebugger final : public ServiceFramework { public: explicit IAudioSystemManagerForDebugger(Core::System& system_) - : ServiceFramework{system_, "aud:d"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspendAudioForDebug"}, - FunctionInfo{1, nullptr, "RequestResumeAudioForDebug"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "aud:d"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspendAudioForDebug"}, + {1, nullptr, "RequestResumeAudioForDebug"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/audio/audio.h b/src/core/hle/service/audio/audio.h index d70f022c73..eb8f482690 100644 --- a/src/core/hle/service/audio/audio.h +++ b/src/core/hle/service/audio/audio.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/audio/audio_controller.cpp b/src/core/hle/service/audio/audio_controller.cpp index d912a5e86a..9e2db4a84c 100644 --- a/src/core/hle/service/audio/audio_controller.cpp +++ b/src/core/hle/service/audio/audio_controller.cpp @@ -1,9 +1,6 @@ // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -20,75 +17,77 @@ namespace Service::Audio { -std::optional IAudioController::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IAudioController::GetTargetVolume>, "GetTargetVolume"}, - FunctionInfo{1, D<&IAudioController::SetTargetVolume>, "SetTargetVolume"}, - FunctionInfo{2, D<&IAudioController::GetTargetVolumeMin>, "GetTargetVolumeMin"}, - FunctionInfo{3, D<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"}, - FunctionInfo{4, D<&IAudioController::IsTargetMute>, "IsTargetMute"}, - FunctionInfo{5, D<&IAudioController::SetTargetMute>, "SetTargetMute"}, - FunctionInfo{6, nullptr, "IsTargetConnected", MakeVersionGate({20,0,0})}, - FunctionInfo{7, nullptr, "SetDefaultTarget"}, - FunctionInfo{8, nullptr, "GetDefaultTarget"}, - FunctionInfo{9, D<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"}, - FunctionInfo{10, D<&IAudioController::SetAudioOutputMode>, "SetAudioOutputMode"}, - FunctionInfo{11, nullptr, "SetForceMutePolicy"}, - FunctionInfo{12, D<&IAudioController::GetForceMutePolicy>, "GetForceMutePolicy"}, - FunctionInfo{13, D<&IAudioController::GetOutputModeSetting>, "GetOutputModeSetting"}, - FunctionInfo{14, D<&IAudioController::SetOutputModeSetting>, "SetOutputModeSetting"}, - FunctionInfo{15, nullptr, "SetOutputTarget"}, - FunctionInfo{16, nullptr, "SetInputTargetForceEnabled"}, - FunctionInfo{17, D<&IAudioController::SetHeadphoneOutputLevelMode>, "SetHeadphoneOutputLevelMode"}, - FunctionInfo{18, D<&IAudioController::GetHeadphoneOutputLevelMode>, "GetHeadphoneOutputLevelMode"}, - FunctionInfo{19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"}, - FunctionInfo{20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"}, - FunctionInfo{21, nullptr, "GetAudioOutputTargetForPlayReport"}, - FunctionInfo{22, D<&IAudioController::NotifyHeadphoneVolumeWarningDisplayedEvent>, "NotifyHeadphoneVolumeWarningDisplayedEvent"}, - FunctionInfo{23, nullptr, "SetSystemOutputMasterVolume"}, - FunctionInfo{24, nullptr, "GetSystemOutputMasterVolume"}, - FunctionInfo{25, nullptr, "GetAudioVolumeDataForPlayReport"}, - FunctionInfo{26, nullptr, "UpdateHeadphoneSettings"}, - FunctionInfo{27, nullptr, "SetVolumeMappingTableForDev"}, - FunctionInfo{28, nullptr, "GetAudioOutputChannelCountForPlayReport"}, - FunctionInfo{29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"}, - FunctionInfo{30, D<&IAudioController::SetSpeakerAutoMuteEnabled>, "SetSpeakerAutoMuteEnabled"}, - FunctionInfo{31, D<&IAudioController::IsSpeakerAutoMuteEnabled>, "IsSpeakerAutoMuteEnabled"}, - FunctionInfo{32, D<&IAudioController::GetActiveOutputTarget>, "GetActiveOutputTarget"}, - FunctionInfo{33, nullptr, "GetTargetDeviceInfo"}, - FunctionInfo{34, D<&IAudioController::AcquireTargetNotification>, "AcquireTargetNotification"}, - FunctionInfo{35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"}, - FunctionInfo{36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"}, - FunctionInfo{37, nullptr, "SetHearingProtectionSafeguardEnabled"}, - FunctionInfo{38, nullptr, "IsHearingProtectionSafeguardEnabled"}, - FunctionInfo{39, nullptr, "IsHearingProtectionSafeguardMonitoringOutputForDebug"}, - FunctionInfo{40, nullptr, "GetSystemInformationForDebug"}, - FunctionInfo{41, nullptr, "SetVolumeButtonLongPressTime"}, - FunctionInfo{42, nullptr, "SetNativeVolumeForDebug"}, - FunctionInfo{43, nullptr, "Unknown43", MakeVersionGate({21,0,0})}, - FunctionInfo{5000, D<&IAudioController::Unknown5000>, "Unknown5000", MakeVersionGate({19,0,0})}, - FunctionInfo{10000, nullptr, "NotifyAudioOutputTargetForPlayReport"}, - FunctionInfo{10001, nullptr, "NotifyAudioOutputChannelCountForPlayReport"}, - FunctionInfo{10002, nullptr, "NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport"}, - FunctionInfo{10100, nullptr, "GetAudioVolumeDataForPlayReport"}, - FunctionInfo{10101, nullptr, "BindAudioVolumeUpdateEventForPlayReport"}, - FunctionInfo{10102, nullptr, "BindAudioOutputTargetUpdateEventForPlayReport"}, - FunctionInfo{10103, nullptr, "GetAudioOutputTargetForPlayReport"}, - FunctionInfo{10104, nullptr, "GetAudioOutputChannelCountForPlayReport"}, - FunctionInfo{10105, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport", MakeVersionGate({14,0,0}, {19,0,1})}, - FunctionInfo{10106, nullptr, "GetDefaultAudioOutputTargetForPlayReport", MakeVersionGate({14,0,0}, {19,0,1})}, - FunctionInfo{10200, nullptr, "Unknown10200", MakeVersionGate({20,0,0})}, - FunctionInfo{50000, nullptr, "SetAnalogInputBoostGainForPrototyping", MakeVersionGate({15,0,0}, {18,1,0})}, - FunctionInfo{50001, nullptr, "OverrideDefaultTargetForDebug", MakeVersionGate({19,0,0}, {19,0,1})}, - FunctionInfo{50003, nullptr, "SetForceOverrideExternalDeviceNameForDebug", MakeVersionGate({19,0,0})}, - FunctionInfo{50004, nullptr, "ClearForceOverrideExternalDeviceNameForDebug", MakeVersionGate({19,0,0})} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IAudioController::IAudioController(Core::System& system_) : ServiceFramework{system_, "audctl"}, service_context{system, "audctl"} { - m_set_sys = system.ServiceManager().GetService("set:sys", true); + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IAudioController::GetTargetVolume>, "GetTargetVolume"}, + {1, D<&IAudioController::SetTargetVolume>, "SetTargetVolume"}, + {2, D<&IAudioController::GetTargetVolumeMin>, "GetTargetVolumeMin"}, + {3, D<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"}, + {4, D<&IAudioController::IsTargetMute>, "IsTargetMute"}, + {5, D<&IAudioController::SetTargetMute>, "SetTargetMute"}, + {6, nullptr, "IsTargetConnected"}, //20.0.0+ + {7, nullptr, "SetDefaultTarget"}, + {8, nullptr, "GetDefaultTarget"}, + {9, D<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"}, + {10, D<&IAudioController::SetAudioOutputMode>, "SetAudioOutputMode"}, + {11, nullptr, "SetForceMutePolicy"}, + {12, D<&IAudioController::GetForceMutePolicy>, "GetForceMutePolicy"}, + {13, D<&IAudioController::GetOutputModeSetting>, "GetOutputModeSetting"}, + {14, D<&IAudioController::SetOutputModeSetting>, "SetOutputModeSetting"}, + {15, nullptr, "SetOutputTarget"}, + {16, nullptr, "SetInputTargetForceEnabled"}, + {17, D<&IAudioController::SetHeadphoneOutputLevelMode>, "SetHeadphoneOutputLevelMode"}, + {18, D<&IAudioController::GetHeadphoneOutputLevelMode>, "GetHeadphoneOutputLevelMode"}, + {19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"}, + {20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"}, + {21, nullptr, "GetAudioOutputTargetForPlayReport"}, + {22, D<&IAudioController::NotifyHeadphoneVolumeWarningDisplayedEvent>, "NotifyHeadphoneVolumeWarningDisplayedEvent"}, + {23, nullptr, "SetSystemOutputMasterVolume"}, + {24, nullptr, "GetSystemOutputMasterVolume"}, + {25, nullptr, "GetAudioVolumeDataForPlayReport"}, + {26, nullptr, "UpdateHeadphoneSettings"}, + {27, nullptr, "SetVolumeMappingTableForDev"}, + {28, nullptr, "GetAudioOutputChannelCountForPlayReport"}, + {29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"}, + {30, D<&IAudioController::SetSpeakerAutoMuteEnabled>, "SetSpeakerAutoMuteEnabled"}, + {31, D<&IAudioController::IsSpeakerAutoMuteEnabled>, "IsSpeakerAutoMuteEnabled"}, + {32, D<&IAudioController::GetActiveOutputTarget>, "GetActiveOutputTarget"}, + {33, nullptr, "GetTargetDeviceInfo"}, + {34, D<&IAudioController::AcquireTargetNotification>, "AcquireTargetNotification"}, + {35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"}, + {36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"}, + {37, nullptr, "SetHearingProtectionSafeguardEnabled"}, + {38, nullptr, "IsHearingProtectionSafeguardEnabled"}, + {39, nullptr, "IsHearingProtectionSafeguardMonitoringOutputForDebug"}, + {40, nullptr, "GetSystemInformationForDebug"}, + {41, nullptr, "SetVolumeButtonLongPressTime"}, + {42, nullptr, "SetNativeVolumeForDebug"}, + {43, nullptr, "Unknown43"}, //21.0.0+ + {5000, D<&IAudioController::Unknown5000>, "Unknown5000"}, //19.0.0+ + {10000, nullptr, "NotifyAudioOutputTargetForPlayReport"}, + {10001, nullptr, "NotifyAudioOutputChannelCountForPlayReport"}, + {10002, nullptr, "NotifyUnsupportedUsbOutputDeviceAttachedForPlayReport"}, + {10100, nullptr, "GetAudioVolumeDataForPlayReport"}, + {10101, nullptr, "BindAudioVolumeUpdateEventForPlayReport"}, + {10102, nullptr, "BindAudioOutputTargetUpdateEventForPlayReport"}, + {10103, nullptr, "GetAudioOutputTargetForPlayReport"}, + {10104, nullptr, "GetAudioOutputChannelCountForPlayReport"}, + {10105, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"}, //14.0.0-19.0.1 + {10106, nullptr, "GetDefaultAudioOutputTargetForPlayReport"}, //14.0.0-19.0.1 + {10200, nullptr, "Unknown10200"}, //20.0.0+ + {50000, nullptr, "SetAnalogInputBoostGainForPrototyping"}, //15.0.0-18.1.0 + {50001, nullptr, "OverrideDefaultTargetForDebug"}, //19.0.0-19.0.1 + {50003, nullptr, "SetForceOverrideExternalDeviceNameForDebug"}, //19.0.0+ + {50004, nullptr, "ClearForceOverrideExternalDeviceNameForDebug"} //19.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); + + m_set_sys = + system.ServiceManager().GetService("set:sys", true); notification_event = service_context.CreateEvent("IAudioController:NotificationEvent"); // Probably shouldn't do this in constructor? diff --git a/src/core/hle/service/audio/audio_controller.h b/src/core/hle/service/audio/audio_controller.h index e5c615fa21..a30b572ac7 100644 --- a/src/core/hle/service/audio/audio_controller.h +++ b/src/core/hle/service/audio/audio_controller.h @@ -59,8 +59,8 @@ private: Result AcquireTargetNotification(OutCopyHandle out_notification_event); Result Unknown5000(Out> out_audio_controller); - std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext service_context; + Kernel::KEvent* notification_event; std::shared_ptr m_set_sys; std::array m_target_volumes{{15, 15, 15, 15, 15, 15}}; diff --git a/src/core/hle/service/audio/audio_device.cpp b/src/core/hle/service/audio/audio_device.cpp index fc24bf3ccd..e9f7e074a1 100644 --- a/src/core/hle/service/audio/audio_device.cpp +++ b/src/core/hle/service/audio/audio_device.cpp @@ -12,38 +12,36 @@ namespace Service::Audio { using namespace AudioCore::Renderer; -std::optional IAudioDevice::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IAudioDevice::ListAudioDeviceName>, "ListAudioDeviceName"}, - FunctionInfo{1, D<&IAudioDevice::SetAudioDeviceOutputVolume>, "SetAudioDeviceOutputVolume"}, - FunctionInfo{2, D<&IAudioDevice::GetAudioDeviceOutputVolume>, "GetAudioDeviceOutputVolume"}, - FunctionInfo{3, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioDeviceName"}, - FunctionInfo{4, D<&IAudioDevice::QueryAudioDeviceSystemEvent>, "QueryAudioDeviceSystemEvent"}, - FunctionInfo{5, D<&IAudioDevice::GetActiveChannelCount>, "GetActiveChannelCount"}, - FunctionInfo{6, D<&IAudioDevice::ListAudioDeviceNameAuto>, "ListAudioDeviceNameAuto"}, - FunctionInfo{7, D<&IAudioDevice::SetAudioDeviceOutputVolumeAuto>, "SetAudioDeviceOutputVolumeAuto"}, - FunctionInfo{8, D<&IAudioDevice::GetAudioDeviceOutputVolumeAuto>, "GetAudioDeviceOutputVolumeAuto"}, - FunctionInfo{10, D<&IAudioDevice::GetActiveAudioDeviceNameAuto>, "GetActiveAudioDeviceNameAuto"}, - FunctionInfo{11, D<&IAudioDevice::QueryAudioDeviceInputEvent>, "QueryAudioDeviceInputEvent"}, - FunctionInfo{12, D<&IAudioDevice::QueryAudioDeviceOutputEvent>, "QueryAudioDeviceOutputEvent"}, - FunctionInfo{13, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioOutputDeviceName"}, - FunctionInfo{14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"}, - FunctionInfo{15, nullptr, "AcquireAudioInputDeviceNotification", MakeVersionGate({17,0,0})}, - FunctionInfo{16, nullptr, "ReleaseAudioInputDeviceNotification", MakeVersionGate({17,0,0})}, - FunctionInfo{17, nullptr, "AcquireAudioOutputDeviceNotification", MakeVersionGate({17,0,0})}, - FunctionInfo{18, nullptr, "ReleaseAudioOutputDeviceNotification", MakeVersionGate({17,0,0})}, - FunctionInfo{19, D<&IAudioDevice::SetAudioDeviceOutputVolumeAutoTuneEnabled>, "SetAudioDeviceOutputVolumeAutoTuneEnabled", MakeVersionGate({18,0,0})}, - FunctionInfo{20, D<&IAudioDevice::IsAudioDeviceOutputVolumeAutoTuneEnabled>, "IsAudioDeviceOutputVolumeAutoTuneEnabled", MakeVersionGate({18,0,0})}, - FunctionInfo{21, nullptr, "IsActiveOutputDeviceEstimatedLowLatency", MakeVersionGate({21,0,0})} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IAudioDevice::IAudioDevice(Core::System& system_, u64 applet_resource_user_id, u32 revision, u32 device_num) : ServiceFramework{system_, "IAudioDevice"}, service_context{system_, "IAudioDevice"}, impl{std::make_unique(system_, applet_resource_user_id, revision)}, event{service_context.CreateEvent(fmt::format("IAudioDeviceEvent-{}", device_num))} { + static const FunctionInfo functions[] = { + {0, D<&IAudioDevice::ListAudioDeviceName>, "ListAudioDeviceName"}, + {1, D<&IAudioDevice::SetAudioDeviceOutputVolume>, "SetAudioDeviceOutputVolume"}, + {2, D<&IAudioDevice::GetAudioDeviceOutputVolume>, "GetAudioDeviceOutputVolume"}, + {3, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioDeviceName"}, + {4, D<&IAudioDevice::QueryAudioDeviceSystemEvent>, "QueryAudioDeviceSystemEvent"}, + {5, D<&IAudioDevice::GetActiveChannelCount>, "GetActiveChannelCount"}, + {6, D<&IAudioDevice::ListAudioDeviceNameAuto>, "ListAudioDeviceNameAuto"}, + {7, D<&IAudioDevice::SetAudioDeviceOutputVolumeAuto>, "SetAudioDeviceOutputVolumeAuto"}, + {8, D<&IAudioDevice::GetAudioDeviceOutputVolumeAuto>, "GetAudioDeviceOutputVolumeAuto"}, + {10, D<&IAudioDevice::GetActiveAudioDeviceNameAuto>, "GetActiveAudioDeviceNameAuto"}, + {11, D<&IAudioDevice::QueryAudioDeviceInputEvent>, "QueryAudioDeviceInputEvent"}, + {12, D<&IAudioDevice::QueryAudioDeviceOutputEvent>, "QueryAudioDeviceOutputEvent"}, + {13, D<&IAudioDevice::GetActiveAudioDeviceName>, "GetActiveAudioOutputDeviceName"}, + {14, D<&IAudioDevice::ListAudioOutputDeviceName>, "ListAudioOutputDeviceName"}, + {15, nullptr, "AcquireAudioInputDeviceNotification"}, //17.0.0+ + {16, nullptr, "ReleaseAudioInputDeviceNotification"}, //17.0.0+ + {17, nullptr, "AcquireAudioOutputDeviceNotification"}, //17.0.0+ + {18, nullptr, "ReleaseAudioOutputDeviceNotification"}, //17.0.0+ + {19, D<&IAudioDevice::SetAudioDeviceOutputVolumeAutoTuneEnabled>, "SetAudioDeviceOutputVolumeAutoTuneEnabled"}, //18.0.0+ + {20, D<&IAudioDevice::IsAudioDeviceOutputVolumeAutoTuneEnabled>, "IsAudioDeviceOutputVolumeAutoTuneEnabled"}, //18.0.0+ + {21, nullptr, "IsActiveOutputDeviceEstimatedLowLatency"} //21.0.0+ + }; + RegisterHandlers(functions); + event->Signal(system.Kernel()); } diff --git a/src/core/hle/service/audio/audio_device.h b/src/core/hle/service/audio/audio_device.h index bd0aaa5f7c..f6c12fbfeb 100644 --- a/src/core/hle/service/audio/audio_device.h +++ b/src/core/hle/service/audio/audio_device.h @@ -55,7 +55,6 @@ private: Result SetAudioDeviceOutputVolumeAutoTuneEnabled(bool enabled); Result IsAudioDeviceOutputVolumeAutoTuneEnabled(Out out_enabled); - std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext service_context; std::unique_ptr impl; Kernel::KEvent* event; diff --git a/src/core/hle/service/audio/audio_in.cpp b/src/core/hle/service/audio/audio_in.cpp index 068574dbd2..6208c2d104 100644 --- a/src/core/hle/service/audio/audio_in.cpp +++ b/src/core/hle/service/audio/audio_in.cpp @@ -11,33 +11,35 @@ namespace Service::Audio { using namespace AudioCore::AudioIn; -std::optional IAudioIn::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IAudioIn::GetAudioInState>, "GetAudioInState"}, - FunctionInfo{1, D<&IAudioIn::Start>, "Start"}, - FunctionInfo{2, D<&IAudioIn::Stop>, "Stop"}, - FunctionInfo{3, D<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBuffer"}, - FunctionInfo{4, D<&IAudioIn::RegisterBufferEvent>, "RegisterBufferEvent"}, - FunctionInfo{5, D<&IAudioIn::GetReleasedAudioInBuffers>, "GetReleasedAudioInBuffers"}, - FunctionInfo{6, D<&IAudioIn::ContainsAudioInBuffer>, "ContainsAudioInBuffer"}, - FunctionInfo{7, D<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBuffer"}, - FunctionInfo{8, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendAudioInBufferAuto"}, - FunctionInfo{9, D<&IAudioIn::GetReleasedAudioInBuffersAuto>, "GetReleasedAudioInBuffersAuto"}, - FunctionInfo{10, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendUacInBufferAuto"}, - FunctionInfo{11, D<&IAudioIn::GetAudioInBufferCount>, "GetAudioInBufferCount"}, - FunctionInfo{12, D<&IAudioIn::SetDeviceGain>, "SetDeviceGain"}, - FunctionInfo{13, D<&IAudioIn::GetDeviceGain>, "GetDeviceGain"}, - FunctionInfo{14, D<&IAudioIn::FlushAudioInBuffers>, "FlushAudioInBuffers"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IAudioIn::IAudioIn(Core::System& system_, Manager& manager, size_t session_id, const std::string& device_name, const AudioInParameter& in_params, Kernel::KProcess* handle, u64 applet_resource_user_id) - : ServiceFramework{system_, "IAudioIn"}, process{handle}, service_context{system_, "IAudioIn"} - , event{service_context.CreateEvent("AudioInEvent")}, impl{std::make_shared(system_, manager, event, session_id)} -{ + : ServiceFramework{system_, "IAudioIn"}, process{handle}, service_context{system_, "IAudioIn"}, + event{service_context.CreateEvent("AudioInEvent")}, impl{std::make_shared(system_, + manager, event, + session_id)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IAudioIn::GetAudioInState>, "GetAudioInState"}, + {1, D<&IAudioIn::Start>, "Start"}, + {2, D<&IAudioIn::Stop>, "Stop"}, + {3, D<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBuffer"}, + {4, D<&IAudioIn::RegisterBufferEvent>, "RegisterBufferEvent"}, + {5, D<&IAudioIn::GetReleasedAudioInBuffers>, "GetReleasedAudioInBuffers"}, + {6, D<&IAudioIn::ContainsAudioInBuffer>, "ContainsAudioInBuffer"}, + {7, D<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBuffer"}, + {8, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendAudioInBufferAuto"}, + {9, D<&IAudioIn::GetReleasedAudioInBuffersAuto>, "GetReleasedAudioInBuffersAuto"}, + {10, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendUacInBufferAuto"}, + {11, D<&IAudioIn::GetAudioInBufferCount>, "GetAudioInBufferCount"}, + {12, D<&IAudioIn::SetDeviceGain>, "SetDeviceGain"}, + {13, D<&IAudioIn::GetDeviceGain>, "GetDeviceGain"}, + {14, D<&IAudioIn::FlushAudioInBuffers>, "FlushAudioInBuffers"}, + }; + // clang-format on + + RegisterHandlers(functions); + process->Open(system.Kernel()); if (impl->GetSystem() diff --git a/src/core/hle/service/audio/audio_in.h b/src/core/hle/service/audio/audio_in.h index dd7a41f300..793d2b3ad4 100644 --- a/src/core/hle/service/audio/audio_in.h +++ b/src/core/hle/service/audio/audio_in.h @@ -46,7 +46,6 @@ public: Result FlushAudioInBuffers(Out out_flushed); private: - std::optional FindRequest(u32 key) override; Kernel::KProcess* process; KernelHelpers::ServiceContext service_context; Kernel::KEvent* event; diff --git a/src/core/hle/service/audio/audio_in_manager.cpp b/src/core/hle/service/audio/audio_in_manager.cpp index 422e72148b..fccfe38b3b 100644 --- a/src/core/hle/service/audio/audio_in_manager.cpp +++ b/src/core/hle/service/audio/audio_in_manager.cpp @@ -12,22 +12,22 @@ namespace Service::Audio { using namespace AudioCore::AudioIn; -std::optional IAudioInManager::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IAudioInManager::ListAudioIns>, "ListAudioIns"}, - FunctionInfo{1, D<&IAudioInManager::OpenAudioIn>, "OpenAudioIn"}, - FunctionInfo{2, D<&IAudioInManager::ListAudioIns>, "ListAudioInsAuto"}, - FunctionInfo{3, D<&IAudioInManager::OpenAudioIn>, "OpenAudioInAuto"}, - FunctionInfo{4, D<&IAudioInManager::ListAudioInsAutoFiltered>, "ListAudioInsAutoFiltered"}, - FunctionInfo{5, D<&IAudioInManager::OpenAudioInProtocolSpecified>, "OpenAudioInProtocolSpecified"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IAudioInManager::IAudioInManager(Core::System& system_) - : ServiceFramework{system_, "audin:u"} - , impl{std::make_unique(system_)} -{} + : ServiceFramework{system_, "audin:u"}, impl{std::make_unique( + system_)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IAudioInManager::ListAudioIns>, "ListAudioIns"}, + {1, D<&IAudioInManager::OpenAudioIn>, "OpenAudioIn"}, + {2, D<&IAudioInManager::ListAudioIns>, "ListAudioInsAuto"}, + {3, D<&IAudioInManager::OpenAudioIn>, "OpenAudioInAuto"}, + {4, D<&IAudioInManager::ListAudioInsAutoFiltered>, "ListAudioInsAutoFiltered"}, + {5, D<&IAudioInManager::OpenAudioInProtocolSpecified>, "OpenAudioInProtocolSpecified"}, + }; + // clang-format on + + RegisterHandlers(functions); +} IAudioInManager::~IAudioInManager() = default; diff --git a/src/core/hle/service/audio/audio_in_manager.h b/src/core/hle/service/audio/audio_in_manager.h index 0ee0badba7..d8f63972c3 100644 --- a/src/core/hle/service/audio/audio_in_manager.h +++ b/src/core/hle/service/audio/audio_in_manager.h @@ -54,7 +54,6 @@ private: AudioCore::AudioIn::AudioInParameter parameter, InCopyHandle process_handle, ClientAppletResourceUserId aruid); - std::optional FindRequest(u32 key) override; std::unique_ptr impl; }; diff --git a/src/core/hle/service/audio/audio_out.cpp b/src/core/hle/service/audio/audio_out.cpp index a5f06faab8..996eeede58 100644 --- a/src/core/hle/service/audio/audio_out.cpp +++ b/src/core/hle/service/audio/audio_out.cpp @@ -15,26 +15,6 @@ namespace Service::Audio { using namespace AudioCore::AudioOut; -std::optional IAudioOut::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IAudioOut::GetAudioOutState>, "GetAudioOutState"}, - FunctionInfo{1, D<&IAudioOut::Start>, "Start"}, - FunctionInfo{2, D<&IAudioOut::Stop>, "Stop"}, - FunctionInfo{3, D<&IAudioOut::AppendAudioOutBuffer>, "AppendAudioOutBuffer"}, - FunctionInfo{4, D<&IAudioOut::RegisterBufferEvent>, "RegisterBufferEvent"}, - FunctionInfo{5, D<&IAudioOut::GetReleasedAudioOutBuffers>, "GetReleasedAudioOutBuffers"}, - FunctionInfo{6, D<&IAudioOut::ContainsAudioOutBuffer>, "ContainsAudioOutBuffer"}, - FunctionInfo{7, D<&IAudioOut::AppendAudioOutBufferAuto>, "AppendAudioOutBufferAuto"}, - FunctionInfo{8, D<&IAudioOut::GetReleasedAudioOutBuffersAuto>, "GetReleasedAudioOutBuffersAuto"}, - FunctionInfo{9, D<&IAudioOut::GetAudioOutBufferCount>, "GetAudioOutBufferCount"}, - FunctionInfo{10, D<&IAudioOut::GetAudioOutPlayedSampleCount>, "GetAudioOutPlayedSampleCount"}, - FunctionInfo{11, D<&IAudioOut::FlushAudioOutBuffers>, "FlushAudioOutBuffers"}, - FunctionInfo{12, D<&IAudioOut::SetAudioOutVolume>, "SetAudioOutVolume"}, - FunctionInfo{13, D<&IAudioOut::GetAudioOutVolume>, "GetAudioOutVolume"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IAudioOut::IAudioOut(Core::System& system_, Manager& manager, size_t session_id, const std::string& device_name, const AudioOutParameter& in_params, Kernel::KProcess* handle, u64 applet_resource_user_id) @@ -42,6 +22,26 @@ IAudioOut::IAudioOut(Core::System& system_, Manager& manager, size_t session_id, event{service_context.CreateEvent("AudioOutEvent")}, process{handle}, impl{std::make_shared(system_, manager, event, session_id)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IAudioOut::GetAudioOutState>, "GetAudioOutState"}, + {1, D<&IAudioOut::Start>, "Start"}, + {2, D<&IAudioOut::Stop>, "Stop"}, + {3, D<&IAudioOut::AppendAudioOutBuffer>, "AppendAudioOutBuffer"}, + {4, D<&IAudioOut::RegisterBufferEvent>, "RegisterBufferEvent"}, + {5, D<&IAudioOut::GetReleasedAudioOutBuffers>, "GetReleasedAudioOutBuffers"}, + {6, D<&IAudioOut::ContainsAudioOutBuffer>, "ContainsAudioOutBuffer"}, + {7, D<&IAudioOut::AppendAudioOutBufferAuto>, "AppendAudioOutBufferAuto"}, + {8, D<&IAudioOut::GetReleasedAudioOutBuffersAuto>, "GetReleasedAudioOutBuffersAuto"}, + {9, D<&IAudioOut::GetAudioOutBufferCount>, "GetAudioOutBufferCount"}, + {10, D<&IAudioOut::GetAudioOutPlayedSampleCount>, "GetAudioOutPlayedSampleCount"}, + {11, D<&IAudioOut::FlushAudioOutBuffers>, "FlushAudioOutBuffers"}, + {12, D<&IAudioOut::SetAudioOutVolume>, "SetAudioOutVolume"}, + {13, D<&IAudioOut::GetAudioOutVolume>, "GetAudioOutVolume"}, + }; + // clang-format on + RegisterHandlers(functions); + process->Open(system.Kernel()); } diff --git a/src/core/hle/service/audio/audio_out.h b/src/core/hle/service/audio/audio_out.h index 311eb84afe..178ee57df6 100644 --- a/src/core/hle/service/audio/audio_out.h +++ b/src/core/hle/service/audio/audio_out.h @@ -52,8 +52,6 @@ public: Result GetAudioOutVolume(Out out_volume); private: - std::optional FindRequest(u32 key) override; - KernelHelpers::ServiceContext service_context; Kernel::KEvent* event; Kernel::KProcess* process; diff --git a/src/core/hle/service/audio/audio_out_manager.cpp b/src/core/hle/service/audio/audio_out_manager.cpp index 9f24bc3513..3b2087932c 100644 --- a/src/core/hle/service/audio/audio_out_manager.cpp +++ b/src/core/hle/service/audio/audio_out_manager.cpp @@ -13,20 +13,20 @@ namespace Service::Audio { using namespace AudioCore::AudioOut; -std::optional IAudioOutManager::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"}, - FunctionInfo{1, D<&IAudioOutManager::OpenAudioOut>, "OpenAudioOut"}, - FunctionInfo{2, D<&IAudioOutManager::ListAudioOutsAuto>, "ListAudioOutsAuto"}, - FunctionInfo{3, D<&IAudioOutManager::OpenAudioOutAuto>, "OpenAudioOutAuto"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IAudioOutManager::IAudioOutManager(Core::System& system_) : ServiceFramework{system_, "audout:u"} , impl(system_) { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"}, + {1, D<&IAudioOutManager::OpenAudioOut>, "OpenAudioOut"}, + {2, D<&IAudioOutManager::ListAudioOutsAuto>, "ListAudioOutsAuto"}, + {3, D<&IAudioOutManager::OpenAudioOutAuto>, "OpenAudioOutAuto"}, + }; + // clang-format on + + RegisterHandlers(functions); } IAudioOutManager::~IAudioOutManager() = default; diff --git a/src/core/hle/service/audio/audio_out_manager.h b/src/core/hle/service/audio/audio_out_manager.h index 4c71c12cdf..ec974aaba4 100644 --- a/src/core/hle/service/audio/audio_out_manager.h +++ b/src/core/hle/service/audio/audio_out_manager.h @@ -43,7 +43,6 @@ private: AudioCore::AudioOut::AudioOutParameter parameter, InCopyHandle process_handle, ClientAppletResourceUserId aruid); - std::optional FindRequest(u32 key) override; std::optional impl; }; diff --git a/src/core/hle/service/audio/audio_renderer.cpp b/src/core/hle/service/audio/audio_renderer.cpp index bcb2adaf61..dd76544094 100644 --- a/src/core/hle/service/audio/audio_renderer.cpp +++ b/src/core/hle/service/audio/audio_renderer.cpp @@ -10,37 +10,38 @@ namespace Service::Audio { using namespace AudioCore::Renderer; -std::optional IAudioRenderer::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IAudioRenderer::GetSampleRate>, "GetSampleRate"}, - FunctionInfo{1, D<&IAudioRenderer::GetSampleCount>, "GetSampleCount"}, - FunctionInfo{2, D<&IAudioRenderer::GetMixBufferCount>, "GetMixBufferCount"}, - FunctionInfo{3, D<&IAudioRenderer::GetState>, "GetState"}, - FunctionInfo{4, D<&IAudioRenderer::RequestUpdate>, "RequestUpdate"}, - FunctionInfo{5, D<&IAudioRenderer::Start>, "Start"}, - FunctionInfo{6, D<&IAudioRenderer::Stop>, "Stop"}, - FunctionInfo{7, D<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"}, - FunctionInfo{8, D<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"}, - FunctionInfo{9, D<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"}, - FunctionInfo{10, D<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto", MakeVersionGate({3,0,0})}, - FunctionInfo{11, nullptr, "ExecuteAudioRendererRendering", MakeVersionGate({3,0,0})}, - FunctionInfo{12, D<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter", MakeVersionGate({15,0,0})}, - FunctionInfo{13, D<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter", MakeVersionGate({15,0,0})} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_, AudioCore::AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, Kernel::KProcess* process_handle_, u64 applet_resource_user_id, s32 session_id) - : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"} - , rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_} - , impl{std::make_unique(system_, manager, rendered_event)} - , process_handle{process_handle_} { + : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"}, + rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_}, + impl{std::make_unique(system_, manager, rendered_event)}, process_handle{ + process_handle_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IAudioRenderer::GetSampleRate>, "GetSampleRate"}, + {1, D<&IAudioRenderer::GetSampleCount>, "GetSampleCount"}, + {2, D<&IAudioRenderer::GetMixBufferCount>, "GetMixBufferCount"}, + {3, D<&IAudioRenderer::GetState>, "GetState"}, + {4, D<&IAudioRenderer::RequestUpdate>, "RequestUpdate"}, + {5, D<&IAudioRenderer::Start>, "Start"}, + {6, D<&IAudioRenderer::Stop>, "Stop"}, + {7, D<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"}, + {8, D<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"}, + {9, D<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"}, + {10, D<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto"}, //3.0.0+ + {11, nullptr, "ExecuteAudioRendererRendering"}, //3.0.0+ + {12, D<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter"}, //15.0.0+ + {13, D<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter"}, //15.0.0+ + }; + // clang-format on + RegisterHandlers(functions); + process_handle->Open(system_.Kernel()); - impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle, applet_resource_user_id, session_id); + impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle, + applet_resource_user_id, session_id); } IAudioRenderer::~IAudioRenderer() { diff --git a/src/core/hle/service/audio/audio_renderer.h b/src/core/hle/service/audio/audio_renderer.h index e03fc6551d..7f4ea9a662 100644 --- a/src/core/hle/service/audio/audio_renderer.h +++ b/src/core/hle/service/audio/audio_renderer.h @@ -45,7 +45,6 @@ private: Result SetVoiceDropParameter(f32 voice_drop_parameter); Result GetVoiceDropParameter(Out out_voice_drop_parameter); - std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext service_context; Kernel::KEvent* rendered_event; AudioCore::Renderer::Manager& manager; diff --git a/src/core/hle/service/audio/audio_renderer_manager.cpp b/src/core/hle/service/audio/audio_renderer_manager.cpp index 98701c79c1..4756802eeb 100644 --- a/src/core/hle/service/audio/audio_renderer_manager.cpp +++ b/src/core/hle/service/audio/audio_renderer_manager.cpp @@ -18,21 +18,21 @@ namespace Service::Audio { using namespace AudioCore::Renderer; -std::optional IAudioRendererManager::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"}, - FunctionInfo{1, D<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"}, - FunctionInfo{2, D<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"}, - FunctionInfo{3, nullptr, "OpenAudioRendererForManualExecution"}, - FunctionInfo{4, D<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IAudioRendererManager::IAudioRendererManager(Core::System& system_) : ServiceFramework{system_, "audren:u"} , impl(system_) { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"}, + {1, D<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"}, + {2, D<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"}, + {3, nullptr, "OpenAudioRendererForManualExecution"}, + {4, D<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"}, + }; + // clang-format on + + RegisterHandlers(functions); } IAudioRendererManager::~IAudioRendererManager() = default; diff --git a/src/core/hle/service/audio/audio_renderer_manager.h b/src/core/hle/service/audio/audio_renderer_manager.h index bd3ea06326..fdce8b6ffa 100644 --- a/src/core/hle/service/audio/audio_renderer_manager.h +++ b/src/core/hle/service/audio/audio_renderer_manager.h @@ -33,7 +33,6 @@ private: Result GetAudioDeviceServiceWithRevisionInfo(Out> out_audio_device, u32 revision, ClientAppletResourceUserId aruid); - std::optional FindRequest(u32 key) override; std::optional impl; u32 num_audio_devices{0}; }; diff --git a/src/core/hle/service/audio/final_output_recorder_manager.cpp b/src/core/hle/service/audio/final_output_recorder_manager.cpp index 9c51613de6..2bc9d29e3e 100644 --- a/src/core/hle/service/audio/final_output_recorder_manager.cpp +++ b/src/core/hle/service/audio/final_output_recorder_manager.cpp @@ -11,29 +11,34 @@ namespace Service::Audio { class IFinalOutputRecorder final : public ServiceFramework { public: explicit IFinalOutputRecorder(Core::System& system_) - : ServiceFramework{system_, "IFinalOutputRecorder"} {} + : ServiceFramework{system_, "IFinalOutputRecorder"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetFinalOutputRecorderState"}, + {1, nullptr, "Start"}, + {2, nullptr, "Stop"}, + {3, nullptr, "AppendFinalOutputRecorderBuffer"}, + {4, nullptr, "RegisterBufferEvent"}, + {5, nullptr, "GetReleasedFinalOutputRecorderBuffers"}, + {6, nullptr, "ContainsFinalOutputRecorderBuffer"}, + {7, nullptr, "GetFinalOutputRecorderBufferEndTime"}, + {8, nullptr, "AppendFinalOutputRecorderBufferAuto"}, + {9, nullptr, "GetReleasedFinalOutputRecorderBufferAuto"}, + {10, nullptr, "FlushFinalOutputRecorderBuffers"}, + {11, nullptr, "AttachWorkBuffer"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetFinalOutputRecorderState"}, - FunctionInfo{1, nullptr, "Start"}, - FunctionInfo{2, nullptr, "Stop"}, - FunctionInfo{3, nullptr, "AppendFinalOutputRecorderBuffer"}, - FunctionInfo{4, nullptr, "RegisterBufferEvent"}, - FunctionInfo{5, nullptr, "GetReleasedFinalOutputRecorderBuffers"}, - FunctionInfo{6, nullptr, "ContainsFinalOutputRecorderBuffer"}, - FunctionInfo{7, nullptr, "GetFinalOutputRecorderBufferEndTime"}, - FunctionInfo{8, nullptr, "AppendFinalOutputRecorderBufferAuto"}, - FunctionInfo{9, nullptr, "GetReleasedFinalOutputRecorderBufferAuto"}, - FunctionInfo{10, nullptr, "FlushFinalOutputRecorderBuffers"}, - FunctionInfo{11, nullptr, "AttachWorkBuffer"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; IFinalOutputRecorderManager::IFinalOutputRecorderManager(Core::System& system_) : ServiceFramework{system_, "audrec:u"} { + static const FunctionInfo functions[] = { + {0, nullptr, "OpenFinalOutputRecorder"}, + }; + RegisterHandlers(functions); } IFinalOutputRecorderManager::~IFinalOutputRecorderManager() = default; diff --git a/src/core/hle/service/audio/final_output_recorder_manager.h b/src/core/hle/service/audio/final_output_recorder_manager.h index ee392b2ada..833c621be7 100644 --- a/src/core/hle/service/audio/final_output_recorder_manager.h +++ b/src/core/hle/service/audio/final_output_recorder_manager.h @@ -18,13 +18,6 @@ class IFinalOutputRecorderManager final : public ServiceFramework FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenFinalOutputRecorder"} - ); }; } // namespace Service::Audio diff --git a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp index 42c08d90ec..dc2ea63aa0 100644 --- a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp +++ b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.cpp @@ -10,6 +10,14 @@ namespace Service::Audio { IFinalOutputRecorderManagerForApplet::IFinalOutputRecorderManagerForApplet(Core::System& system_) : ServiceFramework{system_, "audrec:a"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestSuspend"}, + {1, nullptr, "RequestResume"}, + }; + // clang-format on + + RegisterHandlers(functions); } IFinalOutputRecorderManagerForApplet::~IFinalOutputRecorderManagerForApplet() = default; diff --git a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h index 7beaa888ff..32efb75b5e 100644 --- a/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h +++ b/src/core/hle/service/audio/final_output_recorder_manager_for_applet.h @@ -19,14 +19,6 @@ class IFinalOutputRecorderManagerForApplet final public: explicit IFinalOutputRecorderManagerForApplet(Core::System& system_); ~IFinalOutputRecorderManagerForApplet() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestSuspend"}, - FunctionInfo{1, nullptr, "RequestResume"} - ); }; } // namespace Service::Audio diff --git a/src/core/hle/service/audio/hardware_opus_decoder.cpp b/src/core/hle/service/audio/hardware_opus_decoder.cpp index f0dde63e14..14888afa0d 100644 --- a/src/core/hle/service/audio/hardware_opus_decoder.cpp +++ b/src/core/hle/service/audio/hardware_opus_decoder.cpp @@ -11,25 +11,25 @@ namespace Service::Audio { using namespace AudioCore::OpusDecoder; - std::optional IHardwareOpusDecoder::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IHardwareOpusDecoder::DecodeInterleavedOld>, "DecodeInterleavedOld"}, - FunctionInfo{1, D<&IHardwareOpusDecoder::SetContext>, "SetContext"}, - FunctionInfo{2, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamOld>, "DecodeInterleavedForMultiStreamOld"}, - FunctionInfo{3, D<&IHardwareOpusDecoder::SetContextForMultiStream>, "SetContextForMultiStream"}, - FunctionInfo{4, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfOld>, "DecodeInterleavedWithPerfOld"}, - FunctionInfo{5, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfOld>, "DecodeInterleavedForMultiStreamWithPerfOld"}, - FunctionInfo{6, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfAndResetOld>, "DecodeInterleavedWithPerfAndResetOld"}, - FunctionInfo{7, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfAndResetOld>, "DecodeInterleavedForMultiStreamWithPerfAndResetOld"}, - FunctionInfo{8, D<&IHardwareOpusDecoder::DecodeInterleaved>, "DecodeInterleaved"}, - FunctionInfo{9, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStream>, "DecodeInterleavedForMultiStream"} - ); - return HandlerTableGenerateWithFind(key, functions); - } - IHardwareOpusDecoder::IHardwareOpusDecoder(Core::System& system_, HardwareOpus& hardware_opus) : ServiceFramework{system_, "IHardwareOpusDecoder"}, impl{std::make_unique(system_, hardware_opus)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IHardwareOpusDecoder::DecodeInterleavedOld>, "DecodeInterleavedOld"}, + {1, D<&IHardwareOpusDecoder::SetContext>, "SetContext"}, + {2, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamOld>, "DecodeInterleavedForMultiStreamOld"}, + {3, D<&IHardwareOpusDecoder::SetContextForMultiStream>, "SetContextForMultiStream"}, + {4, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfOld>, "DecodeInterleavedWithPerfOld"}, + {5, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfOld>, "DecodeInterleavedForMultiStreamWithPerfOld"}, + {6, D<&IHardwareOpusDecoder::DecodeInterleavedWithPerfAndResetOld>, "DecodeInterleavedWithPerfAndResetOld"}, + {7, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfAndResetOld>, "DecodeInterleavedForMultiStreamWithPerfAndResetOld"}, + {8, D<&IHardwareOpusDecoder::DecodeInterleaved>, "DecodeInterleaved"}, + {9, D<&IHardwareOpusDecoder::DecodeInterleavedForMultiStream>, "DecodeInterleavedForMultiStream"}, + }; + // clang-format on + + RegisterHandlers(functions); } IHardwareOpusDecoder::~IHardwareOpusDecoder() = default; diff --git a/src/core/hle/service/audio/hardware_opus_decoder.h b/src/core/hle/service/audio/hardware_opus_decoder.h index 9f9b17bc81..5297572da8 100644 --- a/src/core/hle/service/audio/hardware_opus_decoder.h +++ b/src/core/hle/service/audio/hardware_opus_decoder.h @@ -58,7 +58,6 @@ private: Out out_data_size, Out out_sample_count, Out out_time_taken, InBuffer opus_data, bool reset); - std::optional FindRequest(u32 key) override; std::unique_ptr impl; Common::ScratchBuffer output_data; diff --git a/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp b/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp index 3000ba8c60..b89e210012 100644 --- a/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp +++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp @@ -12,24 +12,23 @@ namespace Service::Audio { using namespace AudioCore::OpusDecoder; -std::optional IHardwareOpusDecoderManager::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoder>, "OpenHardwareOpusDecoder"}, - FunctionInfo{1, D<&IHardwareOpusDecoderManager::GetWorkBufferSize>, "GetWorkBufferSize"}, - FunctionInfo{2, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream>, "OpenOpusDecoderForMultiStream"}, - FunctionInfo{3, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream>, "GetWorkBufferSizeForMultiStream"}, - FunctionInfo{4, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx>, "OpenHardwareOpusDecoderEx"}, - FunctionInfo{5, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeEx>, "GetWorkBufferSizeEx"}, - FunctionInfo{6, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx>, "OpenHardwareOpusDecoderForMultiStreamEx"}, - FunctionInfo{7, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx>, "GetWorkBufferSizeForMultiStreamEx"}, - FunctionInfo{8, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeExEx>, "GetWorkBufferSizeExEx"}, - FunctionInfo{9, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx>, "GetWorkBufferSizeForMultiStreamExEx"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IHardwareOpusDecoderManager::IHardwareOpusDecoderManager(Core::System& system_) : ServiceFramework{system_, "hwopus"}, system{system_}, impl{system} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoder>, "OpenHardwareOpusDecoder"}, + {1, D<&IHardwareOpusDecoderManager::GetWorkBufferSize>, "GetWorkBufferSize"}, + {2, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream>, "OpenOpusDecoderForMultiStream"}, + {3, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream>, "GetWorkBufferSizeForMultiStream"}, + {4, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx>, "OpenHardwareOpusDecoderEx"}, + {5, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeEx>, "GetWorkBufferSizeEx"}, + {6, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx>, "OpenHardwareOpusDecoderForMultiStreamEx"}, + {7, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx>, "GetWorkBufferSizeForMultiStreamEx"}, + {8, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeExEx>, "GetWorkBufferSizeExEx"}, + {9, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx>, "GetWorkBufferSizeForMultiStreamExEx"}, + }; + // clang-format on + RegisterHandlers(functions); } IHardwareOpusDecoderManager::~IHardwareOpusDecoderManager() = default; diff --git a/src/core/hle/service/audio/hardware_opus_decoder_manager.h b/src/core/hle/service/audio/hardware_opus_decoder_manager.h index 1dbac9addb..4dd211e232 100644 --- a/src/core/hle/service/audio/hardware_opus_decoder_manager.h +++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.h @@ -49,7 +49,6 @@ private: Result GetWorkBufferSizeForMultiStreamExEx( Out out_size, InLargeData params); - std::optional FindRequest(u32 key) override; Core::System& system; AudioCore::OpusDecoder::OpusDecoderManager impl; }; diff --git a/src/core/hle/service/bcat/bcat.h b/src/core/hle/service/bcat/bcat.h index 2aaffc693b..65961baffe 100644 --- a/src/core/hle/service/bcat/bcat.h +++ b/src/core/hle/service/bcat/bcat.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/bcat/bcat_result.h b/src/core/hle/service/bcat/bcat_result.h index edf8a65641..c6fa1b4e26 100644 --- a/src/core/hle/service/bcat/bcat_result.h +++ b/src/core/hle/service/bcat/bcat_result.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/bcat/bcat_service.cpp b/src/core/hle/service/bcat/bcat_service.cpp index 85f262f6eb..bc2a3e3457 100644 --- a/src/core/hle/service/bcat/bcat_service.cpp +++ b/src/core/hle/service/bcat/bcat_service.cpp @@ -24,45 +24,44 @@ static u64 GetCurrentBuildID(const Core::System::CurrentBuildProcessID& id) { return out; } -std::optional IBcatService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{10100, D<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"}, - FunctionInfo{10101, D<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"}, - FunctionInfo{10200, nullptr, "CancelSyncDeliveryCacheRequest"}, - FunctionInfo{20100, nullptr, "RequestSyncDeliveryCacheWithApplicationId"}, - FunctionInfo{20101, nullptr, "RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName"}, - FunctionInfo{20300, nullptr, "GetDeliveryCacheStorageUpdateNotifier"}, - FunctionInfo{20301, nullptr, "RequestSuspendDeliveryTask"}, - FunctionInfo{20400, nullptr, "RegisterSystemApplicationDeliveryTask"}, - FunctionInfo{20401, nullptr, "UnregisterSystemApplicationDeliveryTask"}, - FunctionInfo{20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"}, - FunctionInfo{30100, D<&IBcatService::SetPassphrase>, "SetPassphrase"}, - FunctionInfo{30101, nullptr, "Unknown30101", MakeVersionGate({2,0,0}, {2,3,0})}, - FunctionInfo{30102, nullptr, "Unknown30102", MakeVersionGate({2,0,0}, {2,3,0})}, - FunctionInfo{30200, nullptr, "RegisterBackgroundDeliveryTask"}, - FunctionInfo{30201, nullptr, "UnregisterBackgroundDeliveryTask"}, - FunctionInfo{30202, nullptr, "BlockDeliveryTask"}, - FunctionInfo{30203, nullptr, "UnblockDeliveryTask"}, - FunctionInfo{30210, nullptr, "SetDeliveryTaskTimer"}, - FunctionInfo{30300, D<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"}, - FunctionInfo{90100, nullptr, "GetDeliveryTaskList"}, - FunctionInfo{90101, nullptr, "GetDeliveryTaskListForSystem", MakeVersionGate({11,0,0})}, - FunctionInfo{90200, nullptr, "GetDeliveryList"}, - FunctionInfo{90201, D<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"}, - FunctionInfo{90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"}, - FunctionInfo{90300, nullptr, "GetPushNotificationLog"}, - FunctionInfo{90301, nullptr, "GetDeliveryCacheStorageUsage", MakeVersionGate({11,0,0})} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IBcatService::IBcatService(Core::System& system_, BcatBackend& backend_, u64 program_id_) - : ServiceFramework{system_, "IBcatService"}, backend{backend_}, program_id{program_id_} - , progress{{ - ProgressServiceBackend{system_, "Normal"}, - ProgressServiceBackend{system_, "Directory"}, - }} -{} + : ServiceFramework{system_, "IBcatService"}, backend{backend_}, program_id{program_id_}, + progress{{ + ProgressServiceBackend{system_, "Normal"}, + ProgressServiceBackend{system_, "Directory"}, + }} { + // clang-format off + static const FunctionInfo functions[] = { + {10100, D<&IBcatService::RequestSyncDeliveryCache>, "RequestSyncDeliveryCache"}, + {10101, D<&IBcatService::RequestSyncDeliveryCacheWithDirectoryName>, "RequestSyncDeliveryCacheWithDirectoryName"}, + {10200, nullptr, "CancelSyncDeliveryCacheRequest"}, + {20100, nullptr, "RequestSyncDeliveryCacheWithApplicationId"}, + {20101, nullptr, "RequestSyncDeliveryCacheWithApplicationIdAndDirectoryName"}, + {20300, nullptr, "GetDeliveryCacheStorageUpdateNotifier"}, + {20301, nullptr, "RequestSuspendDeliveryTask"}, + {20400, nullptr, "RegisterSystemApplicationDeliveryTask"}, + {20401, nullptr, "UnregisterSystemApplicationDeliveryTask"}, + {20410, nullptr, "SetSystemApplicationDeliveryTaskTimer"}, + {30100, D<&IBcatService::SetPassphrase>, "SetPassphrase"}, + {30101, nullptr, "Unknown30101"}, //2.0.0-2.3.0 + {30102, nullptr, "Unknown30102"}, //2.0.0-2.3.0 + {30200, nullptr, "RegisterBackgroundDeliveryTask"}, + {30201, nullptr, "UnregisterBackgroundDeliveryTask"}, + {30202, nullptr, "BlockDeliveryTask"}, + {30203, nullptr, "UnblockDeliveryTask"}, + {30210, nullptr, "SetDeliveryTaskTimer"}, + {30300, D<&IBcatService::RegisterSystemApplicationDeliveryTasks>, "RegisterSystemApplicationDeliveryTasks"}, + {90100, nullptr, "GetDeliveryTaskList"}, + {90101, nullptr, "GetDeliveryTaskListForSystem"}, //11.0.0+ + {90200, nullptr, "GetDeliveryList"}, + {90201, D<&IBcatService::ClearDeliveryCacheStorage>, "ClearDeliveryCacheStorage"}, + {90202, nullptr, "ClearDeliveryTaskSubscriptionStatus"}, + {90300, nullptr, "GetPushNotificationLog"}, + {90301, nullptr, "GetDeliveryCacheStorageUsage"}, //11.0.0+ + }; + // clang-format on + RegisterHandlers(functions); +} IBcatService::~IBcatService() = default; diff --git a/src/core/hle/service/bcat/bcat_service.h b/src/core/hle/service/bcat/bcat_service.h index ed95f021d0..5e11059a78 100644 --- a/src/core/hle/service/bcat/bcat_service.h +++ b/src/core/hle/service/bcat/bcat_service.h @@ -41,7 +41,6 @@ private: ProgressServiceBackend& GetProgressBackend(SyncType type); const ProgressServiceBackend& GetProgressBackend(SyncType type) const; - std::optional FindRequest(u32 key) override; BcatBackend& backend; u64 program_id; std::array(SyncType::Count)> progress; diff --git a/src/core/hle/service/bcat/delivery_cache_directory_service.cpp b/src/core/hle/service/bcat/delivery_cache_directory_service.cpp index 0d464a2fdc..8ead0bae99 100644 --- a/src/core/hle/service/bcat/delivery_cache_directory_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_directory_service.cpp @@ -27,18 +27,18 @@ static BcatDigest DigestFile(const FileSys::VirtualFile& file) { return out; } -std::optional IDeliveryCacheDirectoryService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IDeliveryCacheDirectoryService::Open>, "Open"}, - FunctionInfo{1, D<&IDeliveryCacheDirectoryService::Read>, "Read"}, - FunctionInfo{2, D<&IDeliveryCacheDirectoryService::GetCount>, "GetCount"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IDeliveryCacheDirectoryService::IDeliveryCacheDirectoryService(Core::System& system_, FileSys::VirtualDir root_) : ServiceFramework{system_, "IDeliveryCacheDirectoryService"}, root(std::move(root_)) { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IDeliveryCacheDirectoryService::Open>, "Open"}, + {1, D<&IDeliveryCacheDirectoryService::Read>, "Read"}, + {2, D<&IDeliveryCacheDirectoryService::GetCount>, "GetCount"}, + }; + // clang-format on + + RegisterHandlers(functions); } IDeliveryCacheDirectoryService::~IDeliveryCacheDirectoryService() = default; diff --git a/src/core/hle/service/bcat/delivery_cache_directory_service.h b/src/core/hle/service/bcat/delivery_cache_directory_service.h index af90680390..cea67b0d87 100644 --- a/src/core/hle/service/bcat/delivery_cache_directory_service.h +++ b/src/core/hle/service/bcat/delivery_cache_directory_service.h @@ -29,7 +29,6 @@ private: OutArray out_buffer); Result GetCount(Out out_count); - std::optional FindRequest(u32 key) override; FileSys::VirtualDir root; FileSys::VirtualDir current_dir; }; diff --git a/src/core/hle/service/bcat/delivery_cache_file_service.cpp b/src/core/hle/service/bcat/delivery_cache_file_service.cpp index d9b6ff77ee..1d961e1655 100644 --- a/src/core/hle/service/bcat/delivery_cache_file_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_file_service.cpp @@ -12,19 +12,19 @@ namespace Service::BCAT { -std::optional IDeliveryCacheFileService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IDeliveryCacheFileService::Open>, "Open"}, - FunctionInfo{1, D<&IDeliveryCacheFileService::Read>, "Read"}, - FunctionInfo{2, D<&IDeliveryCacheFileService::GetSize>, "GetSize"}, - FunctionInfo{3, D<&IDeliveryCacheFileService::GetDigest>, "GetDigest"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IDeliveryCacheFileService::IDeliveryCacheFileService(Core::System& system_, FileSys::VirtualDir root_) : ServiceFramework{system_, "IDeliveryCacheFileService"}, root(std::move(root_)) { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IDeliveryCacheFileService::Open>, "Open"}, + {1, D<&IDeliveryCacheFileService::Read>, "Read"}, + {2, D<&IDeliveryCacheFileService::GetSize>, "GetSize"}, + {3, D<&IDeliveryCacheFileService::GetDigest>, "GetDigest"}, + }; + // clang-format on + + RegisterHandlers(functions); } IDeliveryCacheFileService::~IDeliveryCacheFileService() = default; diff --git a/src/core/hle/service/bcat/delivery_cache_file_service.h b/src/core/hle/service/bcat/delivery_cache_file_service.h index 176c8eb3e5..911bda55b3 100644 --- a/src/core/hle/service/bcat/delivery_cache_file_service.h +++ b/src/core/hle/service/bcat/delivery_cache_file_service.h @@ -29,7 +29,6 @@ private: Result GetSize(Out out_size); Result GetDigest(Out out_digest); - std::optional FindRequest(u32 key) override; FileSys::VirtualDir root; FileSys::VirtualFile current_file; }; diff --git a/src/core/hle/service/bcat/delivery_cache_progress_service.cpp b/src/core/hle/service/bcat/delivery_cache_progress_service.cpp index 4de42dd580..873977bf90 100644 --- a/src/core/hle/service/bcat/delivery_cache_progress_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_progress_service.cpp @@ -10,18 +10,18 @@ namespace Service::BCAT { -std::optional IDeliveryCacheProgressService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IDeliveryCacheProgressService::GetEvent>, "GetEvent"}, - FunctionInfo{1, D<&IDeliveryCacheProgressService::GetImpl>, "GetImpl"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IDeliveryCacheProgressService::IDeliveryCacheProgressService(Core::System& system_, Kernel::KReadableEvent& event_, const DeliveryCacheProgressImpl& impl_) : ServiceFramework{system_, "IDeliveryCacheProgressService"}, event{event_}, impl{impl_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IDeliveryCacheProgressService::GetEvent>, "Get"}, + {1, D<&IDeliveryCacheProgressService::GetImpl>, "Get"}, + }; + // clang-format on + + RegisterHandlers(functions); } IDeliveryCacheProgressService::~IDeliveryCacheProgressService() = default; diff --git a/src/core/hle/service/bcat/delivery_cache_progress_service.h b/src/core/hle/service/bcat/delivery_cache_progress_service.h index 88f49cea85..83d4d35827 100644 --- a/src/core/hle/service/bcat/delivery_cache_progress_service.h +++ b/src/core/hle/service/bcat/delivery_cache_progress_service.h @@ -31,7 +31,6 @@ private: Result GetEvent(OutCopyHandle out_event); Result GetImpl(OutLargeData out_impl); - std::optional FindRequest(u32 key) override; Kernel::KReadableEvent& event; const DeliveryCacheProgressImpl& impl; }; diff --git a/src/core/hle/service/bcat/delivery_cache_storage_service.cpp b/src/core/hle/service/bcat/delivery_cache_storage_service.cpp index 67dc857642..a363bcb2d1 100644 --- a/src/core/hle/service/bcat/delivery_cache_storage_service.cpp +++ b/src/core/hle/service/bcat/delivery_cache_storage_service.cpp @@ -12,18 +12,18 @@ namespace Service::BCAT { -std::optional IDeliveryCacheStorageService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IDeliveryCacheStorageService::CreateFileService>, "CreateFileService"}, - FunctionInfo{1, D<&IDeliveryCacheStorageService::CreateDirectoryService>, "CreateDirectoryService"}, - FunctionInfo{10, D<&IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory>, "EnumerateDeliveryCacheDirectory"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IDeliveryCacheStorageService::IDeliveryCacheStorageService(Core::System& system_, FileSys::VirtualDir root_) : ServiceFramework{system_, "IDeliveryCacheStorageService"}, root(std::move(root_)) { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IDeliveryCacheStorageService::CreateFileService>, "CreateFileService"}, + {1, D<&IDeliveryCacheStorageService::CreateDirectoryService>, "CreateDirectoryService"}, + {10, D<&IDeliveryCacheStorageService::EnumerateDeliveryCacheDirectory>, "EnumerateDeliveryCacheDirectory"}, + }; + // clang-format on + + RegisterHandlers(functions); } IDeliveryCacheStorageService::~IDeliveryCacheStorageService() = default; diff --git a/src/core/hle/service/bcat/delivery_cache_storage_service.h b/src/core/hle/service/bcat/delivery_cache_storage_service.h index b30f24fb47..4849e58047 100644 --- a/src/core/hle/service/bcat/delivery_cache_storage_service.h +++ b/src/core/hle/service/bcat/delivery_cache_storage_service.h @@ -31,7 +31,6 @@ private: Out out_directory_count, OutArray out_directories); - std::optional FindRequest(u32 key) override; FileSys::VirtualDir root; std::vector entries; std::size_t next_read_index = 0; diff --git a/src/core/hle/service/bcat/news/builtin_news.h b/src/core/hle/service/bcat/news/builtin_news.h index cb06b2d4e3..e47cc89588 100644 --- a/src/core/hle/service/bcat/news/builtin_news.h +++ b/src/core/hle/service/bcat/news/builtin_news.h @@ -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 #pragma once diff --git a/src/core/hle/service/bcat/news/msgpack.cpp b/src/core/hle/service/bcat/news/msgpack.cpp index b67b75ea9d..9cea2de522 100644 --- a/src/core/hle/service/bcat/news/msgpack.cpp +++ b/src/core/hle/service/bcat/news/msgpack.cpp @@ -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 #include "core/hle/service/bcat/news/msgpack.h" diff --git a/src/core/hle/service/bcat/news/msgpack.h b/src/core/hle/service/bcat/news/msgpack.h index a7a2aa40ba..3163689782 100644 --- a/src/core/hle/service/bcat/news/msgpack.h +++ b/src/core/hle/service/bcat/news/msgpack.h @@ -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 #pragma once diff --git a/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp b/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp index 57d71c49d8..b60de3b1f5 100644 --- a/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp +++ b/src/core/hle/service/bcat/news/newly_arrived_event_holder.cpp @@ -9,16 +9,17 @@ namespace Service::News { -std::optional INewlyArrivedEventHolder::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&INewlyArrivedEventHolder::Get>, "Get"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - INewlyArrivedEventHolder::INewlyArrivedEventHolder(Core::System& system_) - : ServiceFramework{system_, "INewlyArrivedEventHolder"} - , service_context{system_, "INewlyArrivedEventHolder"} { + : ServiceFramework{system_, "INewlyArrivedEventHolder"}, service_context{ + system_, + "INewlyArrivedEventHolder"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&INewlyArrivedEventHolder::Get>, "Get"}, + }; + // clang-format on + + RegisterHandlers(functions); arrived_event = service_context.CreateEvent("INewlyArrivedEventHolder::ArrivedEvent"); } diff --git a/src/core/hle/service/bcat/news/newly_arrived_event_holder.h b/src/core/hle/service/bcat/news/newly_arrived_event_holder.h index fccc8d6e55..5c2aeec182 100644 --- a/src/core/hle/service/bcat/news/newly_arrived_event_holder.h +++ b/src/core/hle/service/bcat/news/newly_arrived_event_holder.h @@ -29,7 +29,6 @@ public: private: Result Get(OutCopyHandle out_event); - std::optional FindRequest(u32 key) override; Kernel::KEvent* arrived_event; KernelHelpers::ServiceContext service_context; }; diff --git a/src/core/hle/service/bcat/news/news_data_service.cpp b/src/core/hle/service/bcat/news/news_data_service.cpp index f5de93db49..200d00e785 100644 --- a/src/core/hle/service/bcat/news/news_data_service.cpp +++ b/src/core/hle/service/bcat/news/news_data_service.cpp @@ -24,19 +24,16 @@ std::string_view ToStringView(std::span buf) { } // namespace -std::optional INewsDataService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&INewsDataService::Open>, "Open"}, - FunctionInfo{1, D<&INewsDataService::OpenWithNewsRecordV1>, "OpenWithNewsRecordV1"}, - FunctionInfo{2, D<&INewsDataService::Read>, "Read"}, - FunctionInfo{3, D<&INewsDataService::GetSize>, "GetSize"}, - FunctionInfo{1001, D<&INewsDataService::OpenWithNewsRecord>, "OpenWithNewsRecord"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - INewsDataService::INewsDataService(Core::System& system_) : ServiceFramework{system_, "INewsDataService"} { + static const FunctionInfo functions[] = { + {0, D<&INewsDataService::Open>, "Open"}, + {1, D<&INewsDataService::OpenWithNewsRecordV1>, "OpenWithNewsRecordV1"}, + {2, D<&INewsDataService::Read>, "Read"}, + {3, D<&INewsDataService::GetSize>, "GetSize"}, + {1001, D<&INewsDataService::OpenWithNewsRecord>, "OpenWithNewsRecord"}, + }; + RegisterHandlers(functions); } INewsDataService::~INewsDataService() = default; diff --git a/src/core/hle/service/bcat/news/news_data_service.h b/src/core/hle/service/bcat/news/news_data_service.h index 8ce10c045d..45fe4bafcc 100644 --- a/src/core/hle/service/bcat/news/news_data_service.h +++ b/src/core/hle/service/bcat/news/news_data_service.h @@ -31,7 +31,6 @@ private: Result Read(Out out_size, s64 offset, OutBuffer out_buffer); Result GetSize(Out out_size); - std::optional FindRequest(u32 key) override; std::vector opened_payload; }; diff --git a/src/core/hle/service/bcat/news/news_database_service.cpp b/src/core/hle/service/bcat/news/news_database_service.cpp index 08fdfcb58b..27ca1ad378 100644 --- a/src/core/hle/service/bcat/news/news_database_service.cpp +++ b/src/core/hle/service/bcat/news/news_database_service.cpp @@ -45,21 +45,18 @@ bool UpdateField(NewsRecord& rec, std::string_view column, s32 value, bool addit } // namespace -std::optional INewsDatabaseService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&INewsDatabaseService::GetListV1>, "GetListV1"}, - FunctionInfo{1, D<&INewsDatabaseService::Count>, "Count"}, - FunctionInfo{2, D<&INewsDatabaseService::CountWithKey>, "CountWithKey"}, - FunctionInfo{3, D<&INewsDatabaseService::UpdateIntegerValue>, "UpdateIntegerValue"}, - FunctionInfo{4, D<&INewsDatabaseService::UpdateIntegerValueWithAddition>, "UpdateIntegerValueWithAddition"}, - FunctionInfo{5, D<&INewsDatabaseService::UpdateStringValue>, "UpdateStringValue"}, - FunctionInfo{1000, D<&INewsDatabaseService::GetList>, "GetList"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - INewsDatabaseService::INewsDatabaseService(Core::System& system_) : ServiceFramework{system_, "INewsDatabaseService"} { + static const FunctionInfo functions[] = { + {0, D<&INewsDatabaseService::GetListV1>, "GetListV1"}, + {1, D<&INewsDatabaseService::Count>, "Count"}, + {2, D<&INewsDatabaseService::CountWithKey>, "CountWithKey"}, + {3, D<&INewsDatabaseService::UpdateIntegerValue>, "UpdateIntegerValue"}, + {4, D<&INewsDatabaseService::UpdateIntegerValueWithAddition>, "UpdateIntegerValueWithAddition"}, + {5, D<&INewsDatabaseService::UpdateStringValue>, "UpdateStringValue"}, + {1000, D<&INewsDatabaseService::GetList>, "GetList"}, + }; + RegisterHandlers(functions); } INewsDatabaseService::~INewsDatabaseService() = default; diff --git a/src/core/hle/service/bcat/news/news_database_service.h b/src/core/hle/service/bcat/news/news_database_service.h index 0a097b97bc..7552da23de 100644 --- a/src/core/hle/service/bcat/news/news_database_service.h +++ b/src/core/hle/service/bcat/news/news_database_service.h @@ -49,8 +49,6 @@ private: InBuffer where_phrase, InBuffer order_by_phrase, s32 offset); - - std::optional FindRequest(u32 key) override; }; } // namespace Service::News diff --git a/src/core/hle/service/bcat/news/news_service.cpp b/src/core/hle/service/bcat/news/news_service.cpp index 7cb931896c..4dcaa14881 100644 --- a/src/core/hle/service/bcat/news/news_service.cpp +++ b/src/core/hle/service/bcat/news/news_service.cpp @@ -12,32 +12,32 @@ namespace Service::News { -std::optional INewsService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{10100, D<&INewsService::PostLocalNews>, "PostLocalNews"}, - FunctionInfo{20100, D<&INewsService::SetPassphrase>, "SetPassphrase"}, - FunctionInfo{30100, D<&INewsService::GetSubscriptionStatus>, "GetSubscriptionStatus"}, - FunctionInfo{30101, D<&INewsService::GetTopicList>, "GetTopicList", MakeVersionGate({3,0,0})}, - FunctionInfo{30110, D<&INewsService::GetTopicList>, "Unknown30110", MakeVersionGate({6,0,0})}, // stub - FunctionInfo{30200, D<&INewsService::IsSystemUpdateRequired>, "IsSystemUpdateRequired"}, - FunctionInfo{30201, D<&INewsService::IsSystemUpdateRequired>, "Unknown30201", MakeVersionGate({8,0,0})}, // stub - FunctionInfo{30210, D<&INewsService::IsSystemUpdateRequired>, "Unknown30210", MakeVersionGate({10,0,0})}, // stub - FunctionInfo{30300, nullptr, "RequestImmediateReception"}, - FunctionInfo{30400, nullptr, "DecodeArchiveFile", MakeVersionGate({3,0,0}, {18,1,0})}, // stub - FunctionInfo{30500, nullptr, "Unknown30500", MakeVersionGate({8,0,0})}, // stub - FunctionInfo{30900, nullptr, "Unknown30900", MakeVersionGate({1,0,0})}, // stub - FunctionInfo{30901, nullptr, "Unknown30901", MakeVersionGate({1,0,0})}, // stub - FunctionInfo{30902, nullptr, "Unknown30902", MakeVersionGate({1,0,0})}, // stub - FunctionInfo{40100, nullptr, "SetSubscriptionStatus"}, - FunctionInfo{40101, D<&INewsService::RequestAutoSubscription>, "RequestAutoSubscription", MakeVersionGate({3,0,0})}, - FunctionInfo{40200, D<&INewsService::ClearStorage>, "ClearStorage"}, - FunctionInfo{40201, D<&INewsService::ClearSubscriptionStatusAll>, "ClearSubscriptionStatusAll"}, - FunctionInfo{90100, D<&INewsService::GetNewsDatabaseDump>, "GetNewsDatabaseDump"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - INewsService::INewsService(Core::System& system_) : ServiceFramework{system_, "INewsService"} { + // clang-format off + static const FunctionInfo functions[] = { + {10100, D<&INewsService::PostLocalNews>, "PostLocalNews"}, + {20100, D<&INewsService::SetPassphrase>, "SetPassphrase"}, + {30100, D<&INewsService::GetSubscriptionStatus>, "GetSubscriptionStatus"}, + {30101, D<&INewsService::GetTopicList>, "GetTopicList"}, //3.0.0+ + {30110, D<&INewsService::GetTopicList>, "Unknown30110"}, //6.0.0+ (stub) + {30200, D<&INewsService::IsSystemUpdateRequired>, "IsSystemUpdateRequired"}, + {30201, D<&INewsService::IsSystemUpdateRequired>, "Unknown30201"}, //8.0.0+ (stub) + {30210, D<&INewsService::IsSystemUpdateRequired>, "Unknown30210"}, //10.0.0+ (stub) + {30300, nullptr, "RequestImmediateReception"}, + {30400, nullptr, "DecodeArchiveFile"}, //3.0.0-18.1.0 (stub) + {30500, nullptr, "Unknown30500"}, //8.0.0+ (stub) + {30900, nullptr, "Unknown30900"}, //1.0.0 (stub) + {30901, nullptr, "Unknown30901"}, //1.0.0 (stub) + {30902, nullptr, "Unknown30902"}, //1.0.0 (stub) + {40100, nullptr, "SetSubscriptionStatus"}, + {40101, D<&INewsService::RequestAutoSubscription>, "RequestAutoSubscription"}, //3.0.0+ + {40200, D<&INewsService::ClearStorage>, "ClearStorage"}, + {40201, D<&INewsService::ClearSubscriptionStatusAll>, "ClearSubscriptionStatusAll"}, + {90100, D<&INewsService::GetNewsDatabaseDump>, "GetNewsDatabaseDump"}, + }; + // clang-format on + + RegisterHandlers(functions); } INewsService::~INewsService() = default; diff --git a/src/core/hle/service/bcat/news/news_service.h b/src/core/hle/service/bcat/news/news_service.h index 577147e604..5d6109243b 100644 --- a/src/core/hle/service/bcat/news/news_service.h +++ b/src/core/hle/service/bcat/news/news_service.h @@ -22,15 +22,22 @@ public: private: Result PostLocalNews(InBuffer buffer_data); + Result SetPassphrase(InBuffer buffer_data); + Result GetSubscriptionStatus(Out out_status, InBuffer buffer_data); + Result GetTopicList(Out out_count, OutBuffer out_topics, s32 filter); + Result IsSystemUpdateRequired(Out out_is_system_update_required); + Result RequestAutoSubscription(u64 value); + Result ClearStorage(); + Result ClearSubscriptionStatusAll(); + Result GetNewsDatabaseDump(); - std::optional FindRequest(u32 key) override; }; } // namespace Service::News diff --git a/src/core/hle/service/bcat/news/news_storage.cpp b/src/core/hle/service/bcat/news/news_storage.cpp index 793c1fa94f..b65b680771 100644 --- a/src/core/hle/service/bcat/news/news_storage.cpp +++ b/src/core/hle/service/bcat/news/news_storage.cpp @@ -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 #include "core/hle/service/bcat/news/news_storage.h" diff --git a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp index a6b3029e83..08449f1c4a 100644 --- a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp +++ b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp @@ -9,16 +9,16 @@ namespace Service::News { -std::optional IOverwriteEventHolder::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IOverwriteEventHolder::Get>, "Get"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IOverwriteEventHolder::IOverwriteEventHolder(Core::System& system_) - : ServiceFramework{system_, "IOverwriteEventHolder"} - , service_context{system_, "IOverwriteEventHolder"} { + : ServiceFramework{system_, "IOverwriteEventHolder"}, service_context{system_, + "IOverwriteEventHolder"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IOverwriteEventHolder::Get>, "Get"}, + }; + // clang-format on + + RegisterHandlers(functions); overwrite_event = service_context.CreateEvent("IOverwriteEventHolder::OverwriteEvent"); } diff --git a/src/core/hle/service/bcat/news/overwrite_event_holder.h b/src/core/hle/service/bcat/news/overwrite_event_holder.h index ba52a36527..507f6ab668 100644 --- a/src/core/hle/service/bcat/news/overwrite_event_holder.h +++ b/src/core/hle/service/bcat/news/overwrite_event_holder.h @@ -29,7 +29,6 @@ public: private: Result Get(OutCopyHandle out_event); - std::optional FindRequest(u32 key) override; Kernel::KEvent* overwrite_event; KernelHelpers::ServiceContext service_context; }; diff --git a/src/core/hle/service/bcat/news/service_creator.cpp b/src/core/hle/service/bcat/news/service_creator.cpp index 66e3b1277e..f27e4e52e6 100644 --- a/src/core/hle/service/bcat/news/service_creator.cpp +++ b/src/core/hle/service/bcat/news/service_creator.cpp @@ -14,19 +14,19 @@ namespace Service::News { -std::optional IServiceCreator::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IServiceCreator::CreateNewsService>, "CreateNewsService"}, - FunctionInfo{1, D<&IServiceCreator::CreateNewlyArrivedEventHolder>, "CreateNewlyArrivedEventHolder"}, - FunctionInfo{2, D<&IServiceCreator::CreateNewsDataService>, "CreateNewsDataService"}, - FunctionInfo{3, D<&IServiceCreator::CreateNewsDatabaseService>, "CreateNewsDatabaseService"}, - FunctionInfo{4, D<&IServiceCreator::CreateOverwriteEventHolder>, "CreateOverwriteEventHolder"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IServiceCreator::IServiceCreator(Core::System& system_, u32 permissions_, const char* name_) : ServiceFramework{system_, name_}, permissions{permissions_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IServiceCreator::CreateNewsService>, "CreateNewsService"}, + {1, D<&IServiceCreator::CreateNewlyArrivedEventHolder>, "CreateNewlyArrivedEventHolder"}, + {2, D<&IServiceCreator::CreateNewsDataService>, "CreateNewsDataService"}, + {3, D<&IServiceCreator::CreateNewsDatabaseService>, "CreateNewsDatabaseService"}, + {4, D<&IServiceCreator::CreateOverwriteEventHolder>, "CreateOverwriteEventHolder"}, + }; + // clang-format on + + RegisterHandlers(functions); } IServiceCreator::~IServiceCreator() = default; diff --git a/src/core/hle/service/bcat/news/service_creator.h b/src/core/hle/service/bcat/news/service_creator.h index a87f30b67e..42fbccd2a0 100644 --- a/src/core/hle/service/bcat/news/service_creator.h +++ b/src/core/hle/service/bcat/news/service_creator.h @@ -32,7 +32,6 @@ private: Result CreateNewsDatabaseService(OutInterface out_interface); Result CreateOverwriteEventHolder(OutInterface out_interface); - std::optional FindRequest(u32 key) override; u32 permissions; }; diff --git a/src/core/hle/service/bcat/service_creator.cpp b/src/core/hle/service/bcat/service_creator.cpp index 83f97bb17a..15f59d3056 100644 --- a/src/core/hle/service/bcat/service_creator.cpp +++ b/src/core/hle/service/bcat/service_creator.cpp @@ -13,17 +13,6 @@ namespace Service::BCAT { -std::optional IServiceCreator::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IServiceCreator::CreateBcatService>, "CreateBcatService"}, - FunctionInfo{1, D<&IServiceCreator::CreateDeliveryCacheStorageService>, "CreateDeliveryCacheStorageService"}, - FunctionInfo{2, D<&IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId>, "CreateDeliveryCacheStorageServiceWithApplicationId"}, - FunctionInfo{3, nullptr, "CreateDeliveryCacheProgressService"}, - FunctionInfo{4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - std::unique_ptr CreateBackendFromSettings([[maybe_unused]] Core::System& system, DirectoryGetter getter) { return std::make_unique(std::move(getter)); @@ -31,7 +20,20 @@ std::unique_ptr CreateBackendFromSettings([[maybe_unused]] Core::Sy IServiceCreator::IServiceCreator(Core::System& system_, const char* name_) : ServiceFramework{system_, name_}, fsc{system.GetFileSystemController()} { - backend = CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); }); + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IServiceCreator::CreateBcatService>, "CreateBcatService"}, + {1, D<&IServiceCreator::CreateDeliveryCacheStorageService>, "CreateDeliveryCacheStorageService"}, + {2, D<&IServiceCreator::CreateDeliveryCacheStorageServiceWithApplicationId>, "CreateDeliveryCacheStorageServiceWithApplicationId"}, + {3, nullptr, "CreateDeliveryCacheProgressService"}, + {4, nullptr, "CreateDeliveryCacheProgressServiceWithApplicationId"}, + }; + // clang-format on + + RegisterHandlers(functions); + + backend = + CreateBackendFromSettings(system_, [this](u64 tid) { return fsc.GetBCATDirectory(tid); }); } IServiceCreator::~IServiceCreator() = default; diff --git a/src/core/hle/service/bcat/service_creator.h b/src/core/hle/service/bcat/service_creator.h index 02527574dc..2245007d6c 100644 --- a/src/core/hle/service/bcat/service_creator.h +++ b/src/core/hle/service/bcat/service_creator.h @@ -36,7 +36,6 @@ private: Result CreateDeliveryCacheStorageServiceWithApplicationId( u64 application_id, OutInterface out_interface); - std::optional FindRequest(u32 key) override; std::unique_ptr backend; Service::FileSystem::FileSystemController& fsc; }; diff --git a/src/core/hle/service/bpc/bpc.cpp b/src/core/hle/service/bpc/bpc.cpp index 7c31cd190d..6f2e00b22b 100644 --- a/src/core/hle/service/bpc/bpc.cpp +++ b/src/core/hle/service/bpc/bpc.cpp @@ -14,101 +14,103 @@ namespace Service::BPC { class BPC final : public ServiceFramework { public: - explicit BPC(Core::System& system_) : ServiceFramework{system_, "bpc"} {} + explicit BPC(Core::System& system_) : ServiceFramework{system_, "bpc"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "ShutdownSystem"}, + {1, nullptr, "RebootSystem"}, + {2, nullptr, "GetWakeupReason"}, + {3, nullptr, "GetShutdownReason"}, + {4, nullptr, "GetAcOk"}, + {5, nullptr, "GetBoardPowerControlEvent"}, + {6, nullptr, "GetSleepButtonState"}, + {7, nullptr, "GetPowerEvent"}, + {8, nullptr, "CreateWakeupTimer"}, + {9, nullptr, "CancelWakeupTimer"}, + {10, nullptr, "EnableWakeupTimerOnDevice"}, + {11, nullptr, "CreateWakeupTimerEx"}, + {12, nullptr, "GetLastEnabledWakeupTimerType"}, + {13, nullptr, "CleanAllWakeupTimers"}, + {14, nullptr, "GetPowerButton"}, + {15, nullptr, "SetEnableWakeupTimer"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "ShutdownSystem"}, - FunctionInfo{1, nullptr, "RebootSystem"}, - FunctionInfo{2, nullptr, "GetWakeupReason"}, - FunctionInfo{3, nullptr, "GetShutdownReason"}, - FunctionInfo{4, nullptr, "GetAcOk"}, - FunctionInfo{5, nullptr, "GetBoardPowerControlEvent"}, - FunctionInfo{6, nullptr, "GetSleepButtonState"}, - FunctionInfo{7, nullptr, "GetPowerEvent"}, - FunctionInfo{8, nullptr, "CreateWakeupTimer"}, - FunctionInfo{9, nullptr, "CancelWakeupTimer"}, - FunctionInfo{10, nullptr, "EnableWakeupTimerOnDevice"}, - FunctionInfo{11, nullptr, "CreateWakeupTimerEx"}, - FunctionInfo{12, nullptr, "GetLastEnabledWakeupTimerType"}, - FunctionInfo{13, nullptr, "CleanAllWakeupTimers"}, - FunctionInfo{14, nullptr, "GetPowerButton"}, - FunctionInfo{15, nullptr, "SetEnableWakeupTimer"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class BPC_R final : public ServiceFramework { public: - explicit BPC_R(Core::System& system_) : ServiceFramework{system_, "bpc:r"} {} + explicit BPC_R(Core::System& system_) : ServiceFramework{system_, "bpc:r"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetRtcTime"}, + {1, nullptr, "SetRtcTime"}, + {2, nullptr, "GetRtcResetDetected"}, + {3, nullptr, "ClearRtcResetDetected"}, + {4, nullptr, "SetUpRtcResetOnShutdown"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetRtcTime"}, - FunctionInfo{1, nullptr, "SetRtcTime"}, - FunctionInfo{2, nullptr, "GetRtcResetDetected"}, - FunctionInfo{3, nullptr, "ClearRtcResetDetected"}, - FunctionInfo{4, nullptr, "SetUpRtcResetOnShutdown"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class BPC_C final : public ServiceFramework { public: - explicit BPC_C(Core::System& system_) : ServiceFramework{system_, "bpc:c"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "ShutdownSystem"}, - FunctionInfo{1, nullptr, "RebootSystem"}, - FunctionInfo{2, nullptr, "GetWakeupReason"}, - FunctionInfo{3, nullptr, "GetShutdownReason"}, - FunctionInfo{4, nullptr, "GetAcOk"}, - FunctionInfo{5, nullptr, "GetPowerEvent"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit BPC_C(Core::System& system_) : ServiceFramework{system_, "bpc:c"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "ShutdownSystem"}, + {1, nullptr, "RebootSystem"}, + {2, nullptr, "GetWakeupReason"}, + {3, nullptr, "GetShutdownReason"}, + {4, nullptr, "GetAcOk"}, + {5, nullptr, "GetPowerEvent"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class BPC_B final : public ServiceFramework { public: - explicit BPC_B(Core::System& system_) : ServiceFramework{system_, "bpc:b"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetSleepButtonState"}, - FunctionInfo{1, nullptr, "GetPowerButtonEvent"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit BPC_B(Core::System& system_) : ServiceFramework{system_, "bpc:b"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetSleepButtonState"}, + {1, nullptr, "GetPowerButtonEvent"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class BPC_W final : public ServiceFramework { public: - explicit BPC_W(Core::System& system_) : ServiceFramework{system_, "bpc:w"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateWakeupTimer"}, - FunctionInfo{1, nullptr, "CancelWakeupTimer"}, - FunctionInfo{2, nullptr, "EnableWakeupTimerOnDevice"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit BPC_W(Core::System& system_) : ServiceFramework{system_, "bpc:w"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "CreateWakeupTimer"}, + {1, nullptr, "CancelWakeupTimer"}, + {2, nullptr, "EnableWakeupTimerOnDevice"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class BPC_AMS final : public ServiceFramework { public: - explicit BPC_AMS(Core::System& system_) : ServiceFramework{system_, "bpc:ams"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{65000, nullptr, "RebootToFatalError"}, - FunctionInfo{65001, nullptr, "SetRebootPayload"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit BPC_AMS(Core::System& system_) : ServiceFramework{system_, "bpc:ams"} { + // clang-format off + static const FunctionInfo functions[] = { + {65000, nullptr, "RebootToFatalError"}, + {65001, nullptr, "SetRebootPayload"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/bpc/bpc.h b/src/core/hle/service/bpc/bpc.h index 524391ddb5..bf13ce5bae 100644 --- a/src/core/hle/service/bpc/bpc.h +++ b/src/core/hle/service/bpc/bpc.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/btdrv/btdrv.cpp b/src/core/hle/service/btdrv/btdrv.cpp index 913c9475e9..256a722a84 100644 --- a/src/core/hle/service/btdrv/btdrv.cpp +++ b/src/core/hle/service/btdrv/btdrv.cpp @@ -20,13 +20,24 @@ namespace Service::BtDrv { class IBluetoothUser final : public ServiceFramework { public: explicit IBluetoothUser(Core::System& system_) - : ServiceFramework{system_, "bt"} - , service_context{system_, "bt"} { - register_event = service_context.CreateEvent("BT:RegisterEvent"); - } + : ServiceFramework{system_, "bt"}, service_context{system_, "bt"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "LeClientReadCharacteristic"}, + {1, nullptr, "LeClientReadDescriptor"}, + {2, nullptr, "LeClientWriteCharacteristic"}, + {3, nullptr, "LeClientWriteDescriptor"}, + {4, nullptr, "LeClientRegisterNotification"}, + {5, nullptr, "LeClientDeregisterNotification"}, + {6, nullptr, "SetLeResponse"}, + {7, nullptr, "LeSendIndication"}, + {8, nullptr, "GetLeEventInfo"}, + {9, C<&IBluetoothUser::RegisterBleEvent>, "RegisterBleEvent"}, + }; + // clang-format on + RegisterHandlers(functions); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + register_event = service_context.CreateEvent("BT:RegisterEvent"); } ~IBluetoothUser() override { @@ -41,28 +52,151 @@ private: R_SUCCEED(); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "LeClientReadCharacteristic"}, - FunctionInfo{1, nullptr, "LeClientReadDescriptor"}, - FunctionInfo{2, nullptr, "LeClientWriteCharacteristic"}, - FunctionInfo{3, nullptr, "LeClientWriteDescriptor"}, - FunctionInfo{4, nullptr, "LeClientRegisterNotification"}, - FunctionInfo{5, nullptr, "LeClientDeregisterNotification"}, - FunctionInfo{6, nullptr, "SetLeResponse"}, - FunctionInfo{7, nullptr, "LeSendIndication"}, - FunctionInfo{8, nullptr, "GetLeEventInfo"}, - FunctionInfo{9, C<&IBluetoothUser::RegisterBleEvent>, "RegisterBleEvent"} - ); KernelHelpers::ServiceContext service_context; + Kernel::KEvent* register_event; }; class IBluetoothDriver final : public ServiceFramework { public: - explicit IBluetoothDriver(Core::System& system_) : ServiceFramework{system_, "btdrv"} {} + explicit IBluetoothDriver(Core::System& system_) : ServiceFramework{system_, "btdrv"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "InitializeBluetoothDriver"}, + {1, nullptr, "InitializeBluetooth"}, + {2, nullptr, "EnableBluetooth"}, + {3, nullptr, "DisableBluetooth"}, + {4, nullptr, "FinalizeBluetooth"}, + {5, nullptr, "GetAdapterProperties"}, + {6, nullptr, "GetAdapterProperty"}, + {7, nullptr, "SetAdapterProperty"}, + {8, nullptr, "StartInquiry"}, + {9, nullptr, "StopInquiry"}, + {10, nullptr, "CreateBond"}, + {11, nullptr, "RemoveBond"}, + {12, nullptr, "CancelBond"}, + {13, nullptr, "RespondToPinRequest"}, + {14, nullptr, "RespondToSspRequest"}, + {15, nullptr, "GetEventInfo"}, + {16, nullptr, "InitializeHid"}, + {17, nullptr, "OpenHidConnection"}, + {18, nullptr, "CloseHidConnection"}, + {19, nullptr, "WriteHidData"}, + {20, nullptr, "WriteHidData2"}, + {21, nullptr, "SetHidReport"}, + {22, nullptr, "GetHidReport"}, + {23, nullptr, "TriggerConnection"}, + {24, nullptr, "AddPairedDeviceInfo"}, + {25, nullptr, "GetPairedDeviceInfo"}, + {26, nullptr, "FinalizeHid"}, + {27, nullptr, "GetHidEventInfo"}, + {28, nullptr, "SetTsi"}, + {29, nullptr, "EnableBurstMode"}, + {30, nullptr, "SetZeroRetransmission"}, + {31, nullptr, "EnableMcMode"}, + {32, nullptr, "EnableLlrScan"}, + {33, nullptr, "DisableLlrScan"}, + {34, C<&IBluetoothDriver::EnableRadio>, "EnableRadio"}, + {35, nullptr, "SetVisibility"}, + {36, nullptr, "EnableTbfcScan"}, + {37, nullptr, "RegisterHidReportEvent"}, + {38, nullptr, "GetHidReportEventInfo"}, + {39, nullptr, "GetLatestPlr"}, + {40, nullptr, "GetPendingConnections"}, + {41, nullptr, "GetChannelMap"}, + {42, nullptr, "EnableTxPowerBoostSetting"}, + {43, nullptr, "IsTxPowerBoostSettingEnabled"}, + {44, nullptr, "EnableAfhSetting"}, + {45, nullptr, "IsAfhSettingEnabled"}, + {46, nullptr, "InitializeBle"}, + {47, nullptr, "EnableBle"}, + {48, nullptr, "DisableBle"}, + {49, nullptr, "FinalizeBle"}, + {50, nullptr, "SetBleVisibility"}, + {51, nullptr, "SetBleConnectionParameter"}, + {52, nullptr, "SetBleDefaultConnectionParameter"}, + {53, nullptr, "SetBleAdvertiseData"}, + {54, nullptr, "SetBleAdvertiseParameter"}, + {55, nullptr, "StartBleScan"}, + {56, nullptr, "StopBleScan"}, + {57, nullptr, "AddBleScanFilterCondition"}, + {58, nullptr, "DeleteBleScanFilterCondition"}, + {59, nullptr, "DeleteBleScanFilter"}, + {60, nullptr, "ClearBleScanFilters"}, + {61, nullptr, "EnableBleScanFilter"}, + {62, nullptr, "RegisterGattClient"}, + {63, nullptr, "UnregisterGattClient"}, + {64, nullptr, "UnregisterAllGattClients"}, + {65, nullptr, "ConnectGattServer"}, + {66, nullptr, "CancelConnectGattServer"}, + {67, nullptr, "DisconnectGattServer"}, + {68, nullptr, "GetGattAttribute"}, + {69, nullptr, "GetGattService"}, + {70, nullptr, "ConfigureAttMtu"}, + {71, nullptr, "RegisterGattServer"}, + {72, nullptr, "UnregisterGattServer"}, + {73, nullptr, "ConnectGattClient"}, + {74, nullptr, "DisconnectGattClient"}, + {75, nullptr, "AddGattService"}, + {76, nullptr, "EnableGattService"}, + {77, nullptr, "AddGattCharacteristic"}, + {78, nullptr, "AddGattDescriptor"}, + {79, nullptr, "GetBleManagedEventInfo"}, + {80, nullptr, "GetGattFirstCharacteristic"}, + {81, nullptr, "GetGattNextCharacteristic"}, + {82, nullptr, "GetGattFirstDescriptor"}, + {83, nullptr, "GetGattNextDescriptor"}, + {84, nullptr, "RegisterGattManagedDataPath"}, + {85, nullptr, "UnregisterGattManagedDataPath"}, + {86, nullptr, "RegisterGattHidDataPath"}, + {87, nullptr, "UnregisterGattHidDataPath"}, + {88, nullptr, "RegisterGattDataPath"}, + {89, nullptr, "UnregisterGattDataPath"}, + {90, nullptr, "ReadGattCharacteristic"}, + {91, nullptr, "ReadGattDescriptor"}, + {92, nullptr, "WriteGattCharacteristic"}, + {93, nullptr, "WriteGattDescriptor"}, + {94, nullptr, "RegisterGattNotification"}, + {95, nullptr, "UnregisterGattNotification"}, + {96, nullptr, "GetLeHidEventInfo"}, + {97, nullptr, "RegisterBleHidEvent"}, + {98, nullptr, "SetBleScanParameter"}, + {99, nullptr, "MoveToSecondaryPiconet"}, + {100, nullptr, "IsBluetoothEnabled"}, + {128, nullptr, "AcquireAudioEvent"}, + {129, nullptr, "GetAudioEventInfo"}, + {130, nullptr, "OpenAudioConnection"}, + {131, nullptr, "CloseAudioConnection"}, + {132, nullptr, "OpenAudioOut"}, + {133, nullptr, "CloseAudioOut"}, + {134, nullptr, "AcquireAudioOutStateChangedEvent"}, + {135, nullptr, "StartAudioOut"}, + {136, nullptr, "StopAudioOut"}, + {137, nullptr, "GetAudioOutState"}, + {138, nullptr, "GetAudioOutFeedingCodec"}, + {139, nullptr, "GetAudioOutFeedingParameter"}, + {140, nullptr, "AcquireAudioOutBufferAvailableEvent"}, + {141, nullptr, "SendAudioData"}, + {142, nullptr, "AcquireAudioControlInputStateChangedEvent"}, + {143, nullptr, "GetAudioControlInputState"}, + {144, nullptr, "AcquireAudioConnectionStateChangedEvent"}, + {145, nullptr, "GetConnectedAudioDevice"}, + {146, nullptr, "CloseAudioControlInput"}, + {147, nullptr, "RegisterAudioControlNotification"}, + {148, nullptr, "SendAudioControlPassthroughCommand"}, + {149, nullptr, "SendAudioControlSetAbsoluteVolumeCommand"}, + {150, nullptr, "AcquireAudioSinkVolumeLocallyChangedEvent"}, + {151, nullptr, "AcquireAudioSinkVolumeUpdateRequestCompletedEvent"}, + {152, nullptr, "GetAudioSinkVolume"}, + {153, nullptr, "RequestUpdateAudioSinkVolume"}, + {154, nullptr, "IsAudioSinkVolumeSupported"}, + {256, nullptr, "IsManufacturingMode"}, + {257, nullptr, "EmulateBluetoothCrash"}, + {258, nullptr, "GetBleChannelMap"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -70,140 +204,6 @@ private: LOG_WARNING(Service_BTDRV, "(STUBBED) called"); R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "InitializeBluetoothDriver"}, - FunctionInfo{1, nullptr, "InitializeBluetooth"}, - FunctionInfo{2, nullptr, "EnableBluetooth"}, - FunctionInfo{3, nullptr, "DisableBluetooth"}, - FunctionInfo{4, nullptr, "FinalizeBluetooth"}, - FunctionInfo{5, nullptr, "GetAdapterProperties"}, - FunctionInfo{6, nullptr, "GetAdapterProperty"}, - FunctionInfo{7, nullptr, "SetAdapterProperty"}, - FunctionInfo{8, nullptr, "StartInquiry"}, - FunctionInfo{9, nullptr, "StopInquiry"}, - FunctionInfo{10, nullptr, "CreateBond"}, - FunctionInfo{11, nullptr, "RemoveBond"}, - FunctionInfo{12, nullptr, "CancelBond"}, - FunctionInfo{13, nullptr, "RespondToPinRequest"}, - FunctionInfo{14, nullptr, "RespondToSspRequest"}, - FunctionInfo{15, nullptr, "GetEventInfo"}, - FunctionInfo{16, nullptr, "InitializeHid"}, - FunctionInfo{17, nullptr, "OpenHidConnection"}, - FunctionInfo{18, nullptr, "CloseHidConnection"}, - FunctionInfo{19, nullptr, "WriteHidData"}, - FunctionInfo{20, nullptr, "WriteHidData2"}, - FunctionInfo{21, nullptr, "SetHidReport"}, - FunctionInfo{22, nullptr, "GetHidReport"}, - FunctionInfo{23, nullptr, "TriggerConnection"}, - FunctionInfo{24, nullptr, "AddPairedDeviceInfo"}, - FunctionInfo{25, nullptr, "GetPairedDeviceInfo"}, - FunctionInfo{26, nullptr, "FinalizeHid"}, - FunctionInfo{27, nullptr, "GetHidEventInfo"}, - FunctionInfo{28, nullptr, "SetTsi"}, - FunctionInfo{29, nullptr, "EnableBurstMode"}, - FunctionInfo{30, nullptr, "SetZeroRetransmission"}, - FunctionInfo{31, nullptr, "EnableMcMode"}, - FunctionInfo{32, nullptr, "EnableLlrScan"}, - FunctionInfo{33, nullptr, "DisableLlrScan"}, - FunctionInfo{34, C<&IBluetoothDriver::EnableRadio>, "EnableRadio"}, - FunctionInfo{35, nullptr, "SetVisibility"}, - FunctionInfo{36, nullptr, "EnableTbfcScan"}, - FunctionInfo{37, nullptr, "RegisterHidReportEvent"}, - FunctionInfo{38, nullptr, "GetHidReportEventInfo"}, - FunctionInfo{39, nullptr, "GetLatestPlr"}, - FunctionInfo{40, nullptr, "GetPendingConnections"}, - FunctionInfo{41, nullptr, "GetChannelMap"}, - FunctionInfo{42, nullptr, "EnableTxPowerBoostSetting"}, - FunctionInfo{43, nullptr, "IsTxPowerBoostSettingEnabled"}, - FunctionInfo{44, nullptr, "EnableAfhSetting"}, - FunctionInfo{45, nullptr, "IsAfhSettingEnabled"}, - FunctionInfo{46, nullptr, "InitializeBle"}, - FunctionInfo{47, nullptr, "EnableBle"}, - FunctionInfo{48, nullptr, "DisableBle"}, - FunctionInfo{49, nullptr, "FinalizeBle"}, - FunctionInfo{50, nullptr, "SetBleVisibility"}, - FunctionInfo{51, nullptr, "SetBleConnectionParameter"}, - FunctionInfo{52, nullptr, "SetBleDefaultConnectionParameter"}, - FunctionInfo{53, nullptr, "SetBleAdvertiseData"}, - FunctionInfo{54, nullptr, "SetBleAdvertiseParameter"}, - FunctionInfo{55, nullptr, "StartBleScan"}, - FunctionInfo{56, nullptr, "StopBleScan"}, - FunctionInfo{57, nullptr, "AddBleScanFilterCondition"}, - FunctionInfo{58, nullptr, "DeleteBleScanFilterCondition"}, - FunctionInfo{59, nullptr, "DeleteBleScanFilter"}, - FunctionInfo{60, nullptr, "ClearBleScanFilters"}, - FunctionInfo{61, nullptr, "EnableBleScanFilter"}, - FunctionInfo{62, nullptr, "RegisterGattClient"}, - FunctionInfo{63, nullptr, "UnregisterGattClient"}, - FunctionInfo{64, nullptr, "UnregisterAllGattClients"}, - FunctionInfo{65, nullptr, "ConnectGattServer"}, - FunctionInfo{66, nullptr, "CancelConnectGattServer"}, - FunctionInfo{67, nullptr, "DisconnectGattServer"}, - FunctionInfo{68, nullptr, "GetGattAttribute"}, - FunctionInfo{69, nullptr, "GetGattService"}, - FunctionInfo{70, nullptr, "ConfigureAttMtu"}, - FunctionInfo{71, nullptr, "RegisterGattServer"}, - FunctionInfo{72, nullptr, "UnregisterGattServer"}, - FunctionInfo{73, nullptr, "ConnectGattClient"}, - FunctionInfo{74, nullptr, "DisconnectGattClient"}, - FunctionInfo{75, nullptr, "AddGattService"}, - FunctionInfo{76, nullptr, "EnableGattService"}, - FunctionInfo{77, nullptr, "AddGattCharacteristic"}, - FunctionInfo{78, nullptr, "AddGattDescriptor"}, - FunctionInfo{79, nullptr, "GetBleManagedEventInfo"}, - FunctionInfo{80, nullptr, "GetGattFirstCharacteristic"}, - FunctionInfo{81, nullptr, "GetGattNextCharacteristic"}, - FunctionInfo{82, nullptr, "GetGattFirstDescriptor"}, - FunctionInfo{83, nullptr, "GetGattNextDescriptor"}, - FunctionInfo{84, nullptr, "RegisterGattManagedDataPath"}, - FunctionInfo{85, nullptr, "UnregisterGattManagedDataPath"}, - FunctionInfo{86, nullptr, "RegisterGattHidDataPath"}, - FunctionInfo{87, nullptr, "UnregisterGattHidDataPath"}, - FunctionInfo{88, nullptr, "RegisterGattDataPath"}, - FunctionInfo{89, nullptr, "UnregisterGattDataPath"}, - FunctionInfo{90, nullptr, "ReadGattCharacteristic"}, - FunctionInfo{91, nullptr, "ReadGattDescriptor"}, - FunctionInfo{92, nullptr, "WriteGattCharacteristic"}, - FunctionInfo{93, nullptr, "WriteGattDescriptor"}, - FunctionInfo{94, nullptr, "RegisterGattNotification"}, - FunctionInfo{95, nullptr, "UnregisterGattNotification"}, - FunctionInfo{96, nullptr, "GetLeHidEventInfo"}, - FunctionInfo{97, nullptr, "RegisterBleHidEvent"}, - FunctionInfo{98, nullptr, "SetBleScanParameter"}, - FunctionInfo{99, nullptr, "MoveToSecondaryPiconet"}, - FunctionInfo{100, nullptr, "IsBluetoothEnabled"}, - FunctionInfo{128, nullptr, "AcquireAudioEvent"}, - FunctionInfo{129, nullptr, "GetAudioEventInfo"}, - FunctionInfo{130, nullptr, "OpenAudioConnection"}, - FunctionInfo{131, nullptr, "CloseAudioConnection"}, - FunctionInfo{132, nullptr, "OpenAudioOut"}, - FunctionInfo{133, nullptr, "CloseAudioOut"}, - FunctionInfo{134, nullptr, "AcquireAudioOutStateChangedEvent"}, - FunctionInfo{135, nullptr, "StartAudioOut"}, - FunctionInfo{136, nullptr, "StopAudioOut"}, - FunctionInfo{137, nullptr, "GetAudioOutState"}, - FunctionInfo{138, nullptr, "GetAudioOutFeedingCodec"}, - FunctionInfo{139, nullptr, "GetAudioOutFeedingParameter"}, - FunctionInfo{140, nullptr, "AcquireAudioOutBufferAvailableEvent"}, - FunctionInfo{141, nullptr, "SendAudioData"}, - FunctionInfo{142, nullptr, "AcquireAudioControlInputStateChangedEvent"}, - FunctionInfo{143, nullptr, "GetAudioControlInputState"}, - FunctionInfo{144, nullptr, "AcquireAudioConnectionStateChangedEvent"}, - FunctionInfo{145, nullptr, "GetConnectedAudioDevice"}, - FunctionInfo{146, nullptr, "CloseAudioControlInput"}, - FunctionInfo{147, nullptr, "RegisterAudioControlNotification"}, - FunctionInfo{148, nullptr, "SendAudioControlPassthroughCommand"}, - FunctionInfo{149, nullptr, "SendAudioControlSetAbsoluteVolumeCommand"}, - FunctionInfo{150, nullptr, "AcquireAudioSinkVolumeLocallyChangedEvent"}, - FunctionInfo{151, nullptr, "AcquireAudioSinkVolumeUpdateRequestCompletedEvent"}, - FunctionInfo{152, nullptr, "GetAudioSinkVolume"}, - FunctionInfo{153, nullptr, "RequestUpdateAudioSinkVolume"}, - FunctionInfo{154, nullptr, "IsAudioSinkVolumeSupported"}, - FunctionInfo{256, nullptr, "IsManufacturingMode"}, - FunctionInfo{257, nullptr, "EmulateBluetoothCrash"}, - FunctionInfo{258, nullptr, "GetBleChannelMap"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/btdrv/btdrv.h b/src/core/hle/service/btdrv/btdrv.h index 42713860e6..4e739a96e3 100644 --- a/src/core/hle/service/btdrv/btdrv.h +++ b/src/core/hle/service/btdrv/btdrv.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/btm/btm.cpp b/src/core/hle/service/btm/btm.cpp index e8fa29af7c..b358387ffe 100644 --- a/src/core/hle/service/btm/btm.cpp +++ b/src/core/hle/service/btm/btm.cpp @@ -6,414 +6,111 @@ #include -#include "common/logging.h" -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/set/system_settings_server.h" -#include "core/hle/service/sm/sm.h" #include "core/hle/service/btm/btm.h" +#include "core/hle/service/btm/btm_debug.h" +#include "core/hle/service/btm/btm_system.h" +#include "core/hle/service/btm/btm_user.h" #include "core/hle/service/server_manager.h" #include "core/hle/service/service.h" -namespace Kernel { -class KEvent; -class KReadableEvent; -} // namespace Kernel - -namespace Core { -class System; -} - -namespace Service::Set { -class ISystemSettingsServer; -} - namespace Service::BTM { -class IBtmSystemCore final : public ServiceFramework { -public: - explicit IBtmSystemCore(Core::System& system_) - : ServiceFramework{system_, "IBtmSystemCore"}, service_context{system_, "IBtmSystemCore"} { - radio_event = service_context.CreateEvent("IBtmSystemCore:RadioEvent"); - audio_device_connection_event = service_context.CreateEvent("IBtmSystemCore:AudioDeviceConnectionEvent"); - m_set_sys = system.ServiceManager().GetService("set:sys", true); - } - - ~IBtmSystemCore() override { - service_context.CloseEvent(radio_event); - service_context.CloseEvent(audio_device_connection_event); - } - - Result StartGamepadPairing() { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - R_SUCCEED(); - } - - Result CancelGamepadPairing() { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - R_SUCCEED(); - } - - Result EnableRadio() { - LOG_DEBUG(Service_BTM, "called"); - - R_RETURN(m_set_sys->SetBluetoothEnableFlag(true)); - } - Result DisableRadio() { - LOG_DEBUG(Service_BTM, "called"); - - R_RETURN(m_set_sys->SetBluetoothEnableFlag(false)); - } - - Result IsRadioEnabled(Out out_is_enabled) { - LOG_DEBUG(Service_BTM, "called"); - - R_RETURN(m_set_sys->GetBluetoothEnableFlag(out_is_enabled)); - } - - Result AcquireRadioEvent(Out out_is_valid, - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &radio_event->GetReadableEvent(); - R_SUCCEED(); - } - - Result GetDiscoveredAudioDevice(OutArray, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out out_total) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - R_SUCCEED(); - } - - Result AcquireAudioDeviceConnectionEvent( - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_event = &audio_device_connection_event->GetReadableEvent(); - R_SUCCEED(); - } - - Result GetConnectedAudioDevices( - Out out_count, OutArray, BufferAttr_HipcPointer> out_audio_devices) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_count = 0; - R_SUCCEED(); - } - - Result GetPairedAudioDevices( - Out out_count, OutArray, BufferAttr_HipcPointer> out_audio_devices) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_count = 0; - R_SUCCEED(); - } - - Result RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) { - LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid); - R_SUCCEED(); - } - - Result CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) { - LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IBtmSystemCore::StartGamepadPairing>, "StartGamepadPairing"}, - FunctionInfo{1, C<&IBtmSystemCore::CancelGamepadPairing>, "CancelGamepadPairing"}, - FunctionInfo{2, nullptr, "ClearGamepadPairingDatabase"}, - FunctionInfo{3, nullptr, "GetPairedGamepadCount"}, - FunctionInfo{4, C<&IBtmSystemCore::EnableRadio>, "EnableRadio"}, - FunctionInfo{5, C<&IBtmSystemCore::DisableRadio>, "DisableRadio"}, - FunctionInfo{6, C<&IBtmSystemCore::IsRadioEnabled>, "IsRadioEnabled"}, - FunctionInfo{7, C<&IBtmSystemCore::AcquireRadioEvent>, "AcquireRadioEvent"}, - FunctionInfo{8, nullptr, "AcquireGamepadPairingEvent"}, - FunctionInfo{9, nullptr, "IsGamepadPairingStarted"}, - FunctionInfo{10, nullptr, "StartAudioDeviceDiscovery"}, - FunctionInfo{11, nullptr, "StopAudioDeviceDiscovery"}, - FunctionInfo{12, nullptr, "IsDiscoveryingAudioDevice"}, - FunctionInfo{13, C<&IBtmSystemCore::GetDiscoveredAudioDevice>, "GetDiscoveredAudioDevice"}, - FunctionInfo{14, C<&IBtmSystemCore::AcquireAudioDeviceConnectionEvent>, "AcquireAudioDeviceConnectionEvent"}, - FunctionInfo{15, nullptr, "ConnectAudioDevice"}, - FunctionInfo{16, nullptr, "IsConnectingAudioDevice"}, - FunctionInfo{17, C<&IBtmSystemCore::GetConnectedAudioDevices>, "GetConnectedAudioDevices"}, - FunctionInfo{18, nullptr, "DisconnectAudioDevice"}, - FunctionInfo{19, nullptr, "AcquirePairedAudioDeviceInfoChangedEvent"}, - FunctionInfo{20, C<&IBtmSystemCore::GetPairedAudioDevices>, "GetPairedAudioDevices"}, - FunctionInfo{21, nullptr, "RemoveAudioDevicePairing"}, - FunctionInfo{22, C<&IBtmSystemCore::RequestAudioDeviceConnectionRejection>, "RequestAudioDeviceConnectionRejection"}, - FunctionInfo{23, C<&IBtmSystemCore::CancelAudioDeviceConnectionRejection>, "CancelAudioDeviceConnectionRejection"} - ); - KernelHelpers::ServiceContext service_context; - Kernel::KEvent* radio_event; - Kernel::KEvent* audio_device_connection_event; - std::shared_ptr m_set_sys; -}; - -class IBtmSystem final : public ServiceFramework { -public: - explicit IBtmSystem(Core::System& system_) : ServiceFramework{system_, "btm:sys"} {} - ~IBtmSystem() override = default; - - Result GetCore(OutInterface out_interface) { - LOG_WARNING(Service_BTM, "called"); - - *out_interface = std::make_shared(system); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IBtmSystem::GetCore>, "GetCore"} - ); -}; - -class IBtmUserCore final : public ServiceFramework { -public: - explicit IBtmUserCore(Core::System& system_) - : ServiceFramework{system_, "IBtmUserCore"}, service_context{system_, "IBtmUserCore"} { - scan_event = service_context.CreateEvent("IBtmUserCore:ScanEvent"); - connection_event = service_context.CreateEvent("IBtmUserCore:ConnectionEvent"); - service_discovery_event = service_context.CreateEvent("IBtmUserCore:DiscoveryEvent"); - config_event = service_context.CreateEvent("IBtmUserCore:ConfigEvent"); - } - - ~IBtmUserCore() override { - service_context.CloseEvent(scan_event); - service_context.CloseEvent(connection_event); - service_context.CloseEvent(service_discovery_event); - service_context.CloseEvent(config_event); - } - - Result AcquireBleScanEvent(Out out_is_valid, - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &scan_event->GetReadableEvent(); - R_SUCCEED(); - } - - Result AcquireBleConnectionEvent(Out out_is_valid, - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &connection_event->GetReadableEvent(); - R_SUCCEED(); - } - - Result AcquireBleServiceDiscoveryEvent( - Out out_is_valid, OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &service_discovery_event->GetReadableEvent(); - R_SUCCEED(); - } - - Result AcquireBleMtuConfigEvent(Out out_is_valid, - OutCopyHandle out_event) { - LOG_WARNING(Service_BTM, "(STUBBED) called"); - - *out_is_valid = true; - *out_event = &config_event->GetReadableEvent(); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IBtmUserCore::AcquireBleScanEvent>, "AcquireBleScanEvent"}, - FunctionInfo{1, nullptr, "GetBleScanFilterParameter"}, - FunctionInfo{2, nullptr, "GetBleScanFilterParameter2"}, - FunctionInfo{3, nullptr, "StartBleScanForGeneral"}, - FunctionInfo{4, nullptr, "StopBleScanForGeneral"}, - FunctionInfo{5, nullptr, "GetBleScanResultsForGeneral"}, - FunctionInfo{6, nullptr, "StartBleScanForPaired"}, - FunctionInfo{7, nullptr, "StopBleScanForPaired"}, - FunctionInfo{8, nullptr, "StartBleScanForSmartDevice"}, - FunctionInfo{9, nullptr, "StopBleScanForSmartDevice"}, - FunctionInfo{10, nullptr, "GetBleScanResultsForSmartDevice"}, - FunctionInfo{17, C<&IBtmUserCore::AcquireBleConnectionEvent>, "AcquireBleConnectionEvent"}, - FunctionInfo{18, nullptr, "BleConnect"}, - FunctionInfo{19, nullptr, "BleDisconnect"}, - FunctionInfo{20, nullptr, "BleGetConnectionState"}, - FunctionInfo{21, nullptr, "AcquireBlePairingEvent"}, - FunctionInfo{22, nullptr, "BlePairDevice"}, - FunctionInfo{23, nullptr, "BleUnPairDevice"}, - FunctionInfo{24, nullptr, "BleUnPairDevice2"}, - FunctionInfo{25, nullptr, "BleGetPairedDevices"}, - FunctionInfo{26, C<&IBtmUserCore::AcquireBleServiceDiscoveryEvent>, "AcquireBleServiceDiscoveryEvent"}, - FunctionInfo{27, nullptr, "GetGattServices"}, - FunctionInfo{28, nullptr, "GetGattService"}, - FunctionInfo{29, nullptr, "GetGattIncludedServices"}, - FunctionInfo{30, nullptr, "GetBelongingGattService"}, - FunctionInfo{31, nullptr, "GetGattCharacteristics"}, - FunctionInfo{32, nullptr, "GetGattDescriptors"}, - FunctionInfo{33, C<&IBtmUserCore::AcquireBleMtuConfigEvent>, "AcquireBleMtuConfigEvent"}, - FunctionInfo{34, nullptr, "ConfigureBleMtu"}, - FunctionInfo{35, nullptr, "GetBleMtu"}, - FunctionInfo{36, nullptr, "RegisterBleGattDataPath"}, - FunctionInfo{37, nullptr, "UnregisterBleGattDataPath"} - ); - KernelHelpers::ServiceContext service_context; - Kernel::KEvent* scan_event; - Kernel::KEvent* connection_event; - Kernel::KEvent* service_discovery_event; - Kernel::KEvent* config_event; -}; - -class IBtmUser final : public ServiceFramework { -public: - explicit IBtmUser(Core::System& system_) : ServiceFramework{system_, "btm:u"} {} - ~IBtmUser() override = default; - - Result GetCore(OutInterface out_interface) { - LOG_WARNING(Service_BTM, "called"); - - *out_interface = std::make_shared(system); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IBtmUser::GetCore>, "GetCore"} - ); -}; - -class IBtmDebug final : public ServiceFramework { -public: - explicit IBtmDebug(Core::System& system_) : ServiceFramework{system_, "btm:dbg"} {} - ~IBtmDebug() override = default; - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "AcquireDiscoveryEvent"}, - FunctionInfo{1, nullptr, "StartDiscovery"}, - FunctionInfo{2, nullptr, "CancelDiscovery"}, - FunctionInfo{3, nullptr, "GetDeviceProperty"}, - FunctionInfo{4, nullptr, "CreateBond"}, - FunctionInfo{5, nullptr, "CancelBond"}, - FunctionInfo{6, nullptr, "SetTsiMode"}, - FunctionInfo{7, nullptr, "GeneralTest"}, - FunctionInfo{8, nullptr, "HidConnect"}, - FunctionInfo{9, nullptr, "GeneralGet", MakeVersionGate({5,0,0})}, - FunctionInfo{10, nullptr, "GetGattClientDisconnectionReason", MakeVersionGate({5,0,0})}, - FunctionInfo{11, nullptr, "GetBleConnectionParameter", MakeVersionGate({5,1,0})}, - FunctionInfo{12, nullptr, "GetBleConnectionParameterRequest", MakeVersionGate({5,1,0})}, - FunctionInfo{13, nullptr, "GetDiscoveredDevice", MakeVersionGate({12,0,0})}, - FunctionInfo{14, nullptr, "SleepAwakeLoopTest", MakeVersionGate({15,0,0})}, - FunctionInfo{15, nullptr, "SleepTest", MakeVersionGate({15,0,0})}, - FunctionInfo{16, nullptr, "MinimumAwakeTest", MakeVersionGate({15,0,0})}, - FunctionInfo{17, nullptr, "ForceEnableBtm", MakeVersionGate({15,0,0})} - ); -}; - class IBtm final : public ServiceFramework { public: - explicit IBtm(Core::System& system_) : ServiceFramework{system_, "btm"} {} + explicit IBtm(Core::System& system_) : ServiceFramework{system_, "btm"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetState"}, + {1, nullptr, "GetHostDeviceProperty"}, + {2, nullptr, "AcquireDeviceConditionEvent"}, + {3, nullptr, "GetDeviceCondition"}, + {4, nullptr, "SetBurstMode"}, + {5, nullptr, "SetSlotMode"}, + {6, nullptr, "SetBluetoothMode"}, + {7, nullptr, "SetWlanMode"}, + {8, nullptr, "AcquireDeviceInfoEvent"}, + {9, nullptr, "GetDeviceInfo"}, + {10, nullptr, "AddDeviceInfo"}, + {11, nullptr, "RemoveDeviceInfo"}, + {12, nullptr, "IncreaseDeviceInfoOrder"}, + {13, nullptr, "LlrNotify"}, + {14, nullptr, "EnableRadio"}, + {15, nullptr, "DisableRadio"}, + {16, nullptr, "HidDisconnect"}, + {17, nullptr, "HidSetRetransmissionMode"}, + {18, nullptr, "AcquireAwakeReqEvent"}, + {19, nullptr, "AcquireLlrStateEvent"}, + {20, nullptr, "IsLlrStarted"}, + {21, nullptr, "EnableSlotSaving"}, + {22, nullptr, "ProtectDeviceInfo"}, + {23, nullptr, "AcquireBleScanEvent"}, + {24, nullptr, "GetBleScanParameterGeneral"}, + {25, nullptr, "GetBleScanParameterSmartDevice"}, + {26, nullptr, "StartBleScanForGeneral"}, + {27, nullptr, "StopBleScanForGeneral"}, + {28, nullptr, "GetBleScanResultsForGeneral"}, + {29, nullptr, "StartBleScanForPairedDevice"}, + {30, nullptr, "StopBleScanForPairedDevice"}, + {31, nullptr, "StartBleScanForSmartDevice"}, + {32, nullptr, "StopBleScanForSmartDevice"}, + {33, nullptr, "GetBleScanResultsForSmartDevice"}, + {34, nullptr, "AcquireBleConnectionEvent"}, + {35, nullptr, "BleConnect"}, + {36, nullptr, "BleOverrideConnection"}, + {37, nullptr, "BleDisconnect"}, + {38, nullptr, "BleGetConnectionState"}, + {39, nullptr, "BleGetGattClientConditionList"}, + {40, nullptr, "AcquireBlePairingEvent"}, + {41, nullptr, "BlePairDevice"}, + {42, nullptr, "BleUnpairDeviceOnBoth"}, + {43, nullptr, "BleUnpairDevice"}, + {44, nullptr, "BleGetPairedAddresses"}, + {45, nullptr, "AcquireBleServiceDiscoveryEvent"}, + {46, nullptr, "GetGattServices"}, + {47, nullptr, "GetGattService"}, + {48, nullptr, "GetGattIncludedServices"}, + {49, nullptr, "GetBelongingService"}, + {50, nullptr, "GetGattCharacteristics"}, + {51, nullptr, "GetGattDescriptors"}, + {52, nullptr, "AcquireBleMtuConfigEvent"}, + {53, nullptr, "ConfigureBleMtu"}, + {54, nullptr, "GetBleMtu"}, + {55, nullptr, "RegisterBleGattDataPath"}, + {56, nullptr, "UnregisterBleGattDataPath"}, + {57, nullptr, "RegisterAppletResourceUserId"}, + {58, nullptr, "UnregisterAppletResourceUserId"}, + {59, nullptr, "SetAppletResourceUserId"}, + {60, nullptr, "AcquireBleConnectionParameterUpdateEvent"}, //8.0.0+ + {61, nullptr, "SetCeLength"}, //8.0.0+ + {62, nullptr, "EnsureSlotExpansion"}, //9.0.0+ + {63, nullptr, "IsSlotExpansionEnsured"}, //9.0.0+ + {64, nullptr, "CancelConnectionTrigger"}, //10.0.0+ + {65, nullptr, "GetConnectionCapacity"}, //13.0.0+ + {66, nullptr, "GetWlanMode"}, //13.0.0+ + {67, nullptr, "IsSlotSavingEnabled"}, //13.0.0+ + {68, nullptr, "IsSlotSavingForPairingEnabled"}, //13.0.0+ + {69, nullptr, "AcquireAudioDeviceConnectionEvent"}, //13.0.0+ + {70, nullptr, "GetConnectedAudioDevices"}, //13.0.0+ + {71, nullptr, "SetAudioSourceVolume"}, //13.0.0+ + {72, nullptr, "GetAudioSourceVolume"}, //13.0.0+ + {73, nullptr, "RequestAudioDeviceConnectionRejection"}, //13.0.0+ + {74, nullptr, "CancelAudioDeviceConnectionRejection"}, //13.0.0+ + {75, nullptr, "GetPairedAudioDevices"}, //13.0.0+ + {76, nullptr, "SetWlanModeWithOption"}, //13.1.0+ + {100, nullptr, "AcquireConnectionDisallowedEvent"}, //13.0.0+ + {101, nullptr, "GetUsecaseViolationFactor"}, //13.0.0+ + {110, nullptr, "GetShortenedDeviceInfo"}, //13.0.0+ + {111, nullptr, "AcquirePairingCountUpdateEvent"},//13.0.0+ + {112, nullptr, "Unknown112"}, //14.0.0-14.1.2 + {113, nullptr, "Unknown113"}, //14.0.0-14.1.2 + {114, nullptr, "IsFirstAudioControlConnection"}, //14.0.0+ + {115, nullptr, "GetShortenedDeviceCondition"}, //14.0.0+ + {116, nullptr, "SetAudioSinkVolume"}, //15.0.0+ + {117, nullptr, "GetAudioSinkVolume"}, //15.0.0+ + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetState"}, - FunctionInfo{1, nullptr, "GetHostDeviceProperty"}, - FunctionInfo{2, nullptr, "AcquireDeviceConditionEvent"}, - FunctionInfo{3, nullptr, "GetDeviceCondition"}, - FunctionInfo{4, nullptr, "SetBurstMode"}, - FunctionInfo{5, nullptr, "SetSlotMode"}, - FunctionInfo{6, nullptr, "SetBluetoothMode"}, - FunctionInfo{7, nullptr, "SetWlanMode"}, - FunctionInfo{8, nullptr, "AcquireDeviceInfoEvent"}, - FunctionInfo{9, nullptr, "GetDeviceInfo"}, - FunctionInfo{10, nullptr, "AddDeviceInfo"}, - FunctionInfo{11, nullptr, "RemoveDeviceInfo"}, - FunctionInfo{12, nullptr, "IncreaseDeviceInfoOrder"}, - FunctionInfo{13, nullptr, "LlrNotify"}, - FunctionInfo{14, nullptr, "EnableRadio"}, - FunctionInfo{15, nullptr, "DisableRadio"}, - FunctionInfo{16, nullptr, "HidDisconnect"}, - FunctionInfo{17, nullptr, "HidSetRetransmissionMode"}, - FunctionInfo{18, nullptr, "AcquireAwakeReqEvent"}, - FunctionInfo{19, nullptr, "AcquireLlrStateEvent"}, - FunctionInfo{20, nullptr, "IsLlrStarted"}, - FunctionInfo{21, nullptr, "EnableSlotSaving"}, - FunctionInfo{22, nullptr, "ProtectDeviceInfo"}, - FunctionInfo{23, nullptr, "AcquireBleScanEvent"}, - FunctionInfo{24, nullptr, "GetBleScanParameterGeneral"}, - FunctionInfo{25, nullptr, "GetBleScanParameterSmartDevice"}, - FunctionInfo{26, nullptr, "StartBleScanForGeneral"}, - FunctionInfo{27, nullptr, "StopBleScanForGeneral"}, - FunctionInfo{28, nullptr, "GetBleScanResultsForGeneral"}, - FunctionInfo{29, nullptr, "StartBleScanForPairedDevice"}, - FunctionInfo{30, nullptr, "StopBleScanForPairedDevice"}, - FunctionInfo{31, nullptr, "StartBleScanForSmartDevice"}, - FunctionInfo{32, nullptr, "StopBleScanForSmartDevice"}, - FunctionInfo{33, nullptr, "GetBleScanResultsForSmartDevice"}, - FunctionInfo{34, nullptr, "AcquireBleConnectionEvent"}, - FunctionInfo{35, nullptr, "BleConnect"}, - FunctionInfo{36, nullptr, "BleOverrideConnection"}, - FunctionInfo{37, nullptr, "BleDisconnect"}, - FunctionInfo{38, nullptr, "BleGetConnectionState"}, - FunctionInfo{39, nullptr, "BleGetGattClientConditionList"}, - FunctionInfo{40, nullptr, "AcquireBlePairingEvent"}, - FunctionInfo{41, nullptr, "BlePairDevice"}, - FunctionInfo{42, nullptr, "BleUnpairDeviceOnBoth"}, - FunctionInfo{43, nullptr, "BleUnpairDevice"}, - FunctionInfo{44, nullptr, "BleGetPairedAddresses"}, - FunctionInfo{45, nullptr, "AcquireBleServiceDiscoveryEvent"}, - FunctionInfo{46, nullptr, "GetGattServices"}, - FunctionInfo{47, nullptr, "GetGattService"}, - FunctionInfo{48, nullptr, "GetGattIncludedServices"}, - FunctionInfo{49, nullptr, "GetBelongingService"}, - FunctionInfo{50, nullptr, "GetGattCharacteristics"}, - FunctionInfo{51, nullptr, "GetGattDescriptors"}, - FunctionInfo{52, nullptr, "AcquireBleMtuConfigEvent"}, - FunctionInfo{53, nullptr, "ConfigureBleMtu"}, - FunctionInfo{54, nullptr, "GetBleMtu"}, - FunctionInfo{55, nullptr, "RegisterBleGattDataPath"}, - FunctionInfo{56, nullptr, "UnregisterBleGattDataPath"}, - FunctionInfo{57, nullptr, "RegisterAppletResourceUserId"}, - FunctionInfo{58, nullptr, "UnregisterAppletResourceUserId"}, - FunctionInfo{59, nullptr, "SetAppletResourceUserId"}, - FunctionInfo{60, nullptr, "AcquireBleConnectionParameterUpdateEvent", MakeVersionGate({8,0,0})}, - FunctionInfo{61, nullptr, "SetCeLength", MakeVersionGate({8,0,0})}, - FunctionInfo{62, nullptr, "EnsureSlotExpansion", MakeVersionGate({9,0,0})}, - FunctionInfo{63, nullptr, "IsSlotExpansionEnsured", MakeVersionGate({9,0,0})}, - FunctionInfo{64, nullptr, "CancelConnectionTrigger", MakeVersionGate({10,0,0})}, - FunctionInfo{65, nullptr, "GetConnectionCapacity", MakeVersionGate({13,0,0})}, - FunctionInfo{66, nullptr, "GetWlanMode", MakeVersionGate({13,0,0})}, - FunctionInfo{67, nullptr, "IsSlotSavingEnabled", MakeVersionGate({13,0,0})}, - FunctionInfo{68, nullptr, "IsSlotSavingForPairingEnabled", MakeVersionGate({13,0,0})}, - FunctionInfo{69, nullptr, "AcquireAudioDeviceConnectionEvent", MakeVersionGate({13,0,0})}, - FunctionInfo{70, nullptr, "GetConnectedAudioDevices", MakeVersionGate({13,0,0})}, - FunctionInfo{71, nullptr, "SetAudioSourceVolume", MakeVersionGate({13,0,0})}, - FunctionInfo{72, nullptr, "GetAudioSourceVolume", MakeVersionGate({13,0,0})}, - FunctionInfo{73, nullptr, "RequestAudioDeviceConnectionRejection", MakeVersionGate({13,0,0})}, - FunctionInfo{74, nullptr, "CancelAudioDeviceConnectionRejection", MakeVersionGate({13,0,0})}, - FunctionInfo{75, nullptr, "GetPairedAudioDevices", MakeVersionGate({13,0,0})}, - FunctionInfo{76, nullptr, "SetWlanModeWithOption", MakeVersionGate({13,1,0})}, - FunctionInfo{100, nullptr, "AcquireConnectionDisallowedEvent", MakeVersionGate({13,0,0})}, - FunctionInfo{101, nullptr, "GetUsecaseViolationFactor", MakeVersionGate({13,0,0})}, - FunctionInfo{110, nullptr, "GetShortenedDeviceInfo", MakeVersionGate({13,0,0})}, - FunctionInfo{111, nullptr, "AcquirePairingCountUpdateEvent"},//13.0.0+ - FunctionInfo{112, nullptr, "Unknown112", MakeVersionGate({14,0,0}, {14,1,2})}, - FunctionInfo{113, nullptr, "Unknown113", MakeVersionGate({14,0,0}, {14,1,2})}, - FunctionInfo{114, nullptr, "IsFirstAudioControlConnection", MakeVersionGate({14,0,0})}, - FunctionInfo{115, nullptr, "GetShortenedDeviceCondition", MakeVersionGate({14,0,0})}, - FunctionInfo{116, nullptr, "SetAudioSinkVolume", MakeVersionGate({15,0,0})}, - FunctionInfo{117, nullptr, "GetAudioSinkVolume", MakeVersionGate({15,0,0})} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/btm/btm.h b/src/core/hle/service/btm/btm.h index 0bf77d053e..902a61d8cc 100644 --- a/src/core/hle/service/btm/btm.h +++ b/src/core/hle/service/btm/btm.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/btm/btm_debug.cpp b/src/core/hle/service/btm/btm_debug.cpp new file mode 100644 index 0000000000..abbe7d4832 --- /dev/null +++ b/src/core/hle/service/btm/btm_debug.cpp @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "core/hle/service/btm/btm_debug.h" + +namespace Service::BTM { + +IBtmDebug::IBtmDebug(Core::System& system_) : ServiceFramework{system_, "btm:dbg"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "AcquireDiscoveryEvent"}, + {1, nullptr, "StartDiscovery"}, + {2, nullptr, "CancelDiscovery"}, + {3, nullptr, "GetDeviceProperty"}, + {4, nullptr, "CreateBond"}, + {5, nullptr, "CancelBond"}, + {6, nullptr, "SetTsiMode"}, + {7, nullptr, "GeneralTest"}, + {8, nullptr, "HidConnect"}, + {9, nullptr, "GeneralGet"}, //5.0.0+ + {10, nullptr, "GetGattClientDisconnectionReason"}, //5.0.0+ + {11, nullptr, "GetBleConnectionParameter"}, //5.1.0+ + {12, nullptr, "GetBleConnectionParameterRequest"}, //5.1.0+ + {13, nullptr, "GetDiscoveredDevice"}, //12.0.0+ + {14, nullptr, "SleepAwakeLoopTest"}, //15.0.0+ + {15, nullptr, "SleepTest"}, //15.0.0+ + {16, nullptr, "MinimumAwakeTest"}, //15.0.0+ + {17, nullptr, "ForceEnableBtm"}, //15.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); +} + +IBtmDebug::~IBtmDebug() = default; + +} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_debug.h b/src/core/hle/service/btm/btm_debug.h new file mode 100644 index 0000000000..fad760d674 --- /dev/null +++ b/src/core/hle/service/btm/btm_debug.h @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Core { +class System; +} + +namespace Service::BTM { + +class IBtmDebug final : public ServiceFramework { +public: + explicit IBtmDebug(Core::System& system_); + ~IBtmDebug() override; +}; + +} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_system.cpp b/src/core/hle/service/btm/btm_system.cpp new file mode 100644 index 0000000000..1684b0193e --- /dev/null +++ b/src/core/hle/service/btm/btm_system.cpp @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "common/logging.h" +#include "core/hle/service/btm/btm_system.h" +#include "core/hle/service/btm/btm_system_core.h" +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/service.h" + +namespace Service::BTM { + +IBtmSystem::IBtmSystem(Core::System& system_) : ServiceFramework{system_, "btm:sys"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&IBtmSystem::GetCore>, "GetCore"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +IBtmSystem::~IBtmSystem() = default; + +Result IBtmSystem::GetCore(OutInterface out_interface) { + LOG_WARNING(Service_BTM, "called"); + + *out_interface = std::make_shared(system); + R_SUCCEED(); +} + +} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_system.h b/src/core/hle/service/btm/btm_system.h new file mode 100644 index 0000000000..9755540204 --- /dev/null +++ b/src/core/hle/service/btm/btm_system.h @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Core { +class System; +} + +namespace Service::BTM { +class IBtmSystemCore; + +class IBtmSystem final : public ServiceFramework { +public: + explicit IBtmSystem(Core::System& system_); + ~IBtmSystem() override; + +private: + Result GetCore(OutInterface out_interface); +}; + +} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_system_core.cpp b/src/core/hle/service/btm/btm_system_core.cpp new file mode 100644 index 0000000000..318657fc32 --- /dev/null +++ b/src/core/hle/service/btm/btm_system_core.cpp @@ -0,0 +1,135 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "common/logging.h" +#include "core/hle/service/btm/btm_system_core.h" +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/set/system_settings_server.h" +#include "core/hle/service/sm/sm.h" + +namespace Service::BTM { + +IBtmSystemCore::IBtmSystemCore(Core::System& system_) + : ServiceFramework{system_, "IBtmSystemCore"}, service_context{system_, "IBtmSystemCore"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&IBtmSystemCore::StartGamepadPairing>, "StartGamepadPairing"}, + {1, C<&IBtmSystemCore::CancelGamepadPairing>, "CancelGamepadPairing"}, + {2, nullptr, "ClearGamepadPairingDatabase"}, + {3, nullptr, "GetPairedGamepadCount"}, + {4, C<&IBtmSystemCore::EnableRadio>, "EnableRadio"}, + {5, C<&IBtmSystemCore::DisableRadio>, "DisableRadio"}, + {6, C<&IBtmSystemCore::IsRadioEnabled>, "IsRadioEnabled"}, + {7, C<&IBtmSystemCore::AcquireRadioEvent>, "AcquireRadioEvent"}, + {8, nullptr, "AcquireGamepadPairingEvent"}, + {9, nullptr, "IsGamepadPairingStarted"}, + {10, nullptr, "StartAudioDeviceDiscovery"}, + {11, nullptr, "StopAudioDeviceDiscovery"}, + {12, nullptr, "IsDiscoveryingAudioDevice"}, + {13, C<&IBtmSystemCore::GetDiscoveredAudioDevice>, "GetDiscoveredAudioDevice"}, + {14, C<&IBtmSystemCore::AcquireAudioDeviceConnectionEvent>, "AcquireAudioDeviceConnectionEvent"}, + {15, nullptr, "ConnectAudioDevice"}, + {16, nullptr, "IsConnectingAudioDevice"}, + {17, C<&IBtmSystemCore::GetConnectedAudioDevices>, "GetConnectedAudioDevices"}, + {18, nullptr, "DisconnectAudioDevice"}, + {19, nullptr, "AcquirePairedAudioDeviceInfoChangedEvent"}, + {20, C<&IBtmSystemCore::GetPairedAudioDevices>, "GetPairedAudioDevices"}, + {21, nullptr, "RemoveAudioDevicePairing"}, + {22, C<&IBtmSystemCore::RequestAudioDeviceConnectionRejection>, "RequestAudioDeviceConnectionRejection"}, + {23, C<&IBtmSystemCore::CancelAudioDeviceConnectionRejection>, "CancelAudioDeviceConnectionRejection"} + }; + // clang-format on + + RegisterHandlers(functions); + radio_event = service_context.CreateEvent("IBtmSystemCore::RadioEvent"); + audio_device_connection_event = + service_context.CreateEvent("IBtmSystemCore::AudioDeviceConnectionEvent"); + + m_set_sys = + system.ServiceManager().GetService("set:sys", true); +} + +IBtmSystemCore::~IBtmSystemCore() { + service_context.CloseEvent(radio_event); + service_context.CloseEvent(audio_device_connection_event); +} + +Result IBtmSystemCore::StartGamepadPairing() { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + R_SUCCEED(); +} + +Result IBtmSystemCore::CancelGamepadPairing() { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + R_SUCCEED(); +} + +Result IBtmSystemCore::EnableRadio() { + LOG_DEBUG(Service_BTM, "called"); + + R_RETURN(m_set_sys->SetBluetoothEnableFlag(true)); +} +Result IBtmSystemCore::DisableRadio() { + LOG_DEBUG(Service_BTM, "called"); + + R_RETURN(m_set_sys->SetBluetoothEnableFlag(false)); +} + +Result IBtmSystemCore::IsRadioEnabled(Out out_is_enabled) { + LOG_DEBUG(Service_BTM, "called"); + + R_RETURN(m_set_sys->GetBluetoothEnableFlag(out_is_enabled)); +} + +Result IBtmSystemCore::AcquireRadioEvent(Out out_is_valid, + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &radio_event->GetReadableEvent(); + R_SUCCEED(); +} + +Result IBtmSystemCore::GetDiscoveredAudioDevice(OutArray, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out out_total) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + R_SUCCEED(); +} + +Result IBtmSystemCore::AcquireAudioDeviceConnectionEvent( + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_event = &audio_device_connection_event->GetReadableEvent(); + R_SUCCEED(); +} + +Result IBtmSystemCore::GetConnectedAudioDevices( + Out out_count, OutArray, BufferAttr_HipcPointer> out_audio_devices) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_count = 0; + R_SUCCEED(); +} + +Result IBtmSystemCore::GetPairedAudioDevices( + Out out_count, OutArray, BufferAttr_HipcPointer> out_audio_devices) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_count = 0; + R_SUCCEED(); +} + +Result IBtmSystemCore::RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) { + LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid); + R_SUCCEED(); +} + +Result IBtmSystemCore::CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) { + LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid); + R_SUCCEED(); +} + +} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_system_core.h b/src/core/hle/service/btm/btm_system_core.h new file mode 100644 index 0000000000..3fc4c0d56c --- /dev/null +++ b/src/core/hle/service/btm/btm_system_core.h @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/kernel_helpers.h" +#include "core/hle/service/service.h" + +namespace Kernel { +class KEvent; +class KReadableEvent; +} // namespace Kernel + +namespace Core { +class System; +} + +namespace Service::Set { +class ISystemSettingsServer; +} + +namespace Service::BTM { + +class IBtmSystemCore final : public ServiceFramework { +public: + explicit IBtmSystemCore(Core::System& system_); + ~IBtmSystemCore() override; + +private: + Result StartGamepadPairing(); + Result CancelGamepadPairing(); + Result EnableRadio(); + Result DisableRadio(); + Result IsRadioEnabled(Out out_is_enabled); + + Result AcquireRadioEvent(Out out_is_valid, OutCopyHandle out_event); + Result GetDiscoveredAudioDevice(OutArray, BufferAttr_HipcPointer> out_audio_devices, s32 count, Out out_total); + Result AcquireAudioDeviceConnectionEvent(OutCopyHandle out_event); + + Result GetConnectedAudioDevices( + Out out_count, + OutArray, BufferAttr_HipcPointer> out_audio_devices); + + Result GetPairedAudioDevices( + Out out_count, + OutArray, BufferAttr_HipcPointer> out_audio_devices); + + Result RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid); + Result CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid); + + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* radio_event; + Kernel::KEvent* audio_device_connection_event; + std::shared_ptr m_set_sys; +}; + +} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_user.cpp b/src/core/hle/service/btm/btm_user.cpp new file mode 100644 index 0000000000..c380c573fa --- /dev/null +++ b/src/core/hle/service/btm/btm_user.cpp @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "common/logging.h" +#include "core/hle/service/btm/btm_user.h" +#include "core/hle/service/btm/btm_user_core.h" +#include "core/hle/service/cmif_serialization.h" + +namespace Service::BTM { + +IBtmUser::IBtmUser(Core::System& system_) : ServiceFramework{system_, "btm:u"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&IBtmUser::GetCore>, "GetCore"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +IBtmUser::~IBtmUser() = default; + +Result IBtmUser::GetCore(OutInterface out_interface) { + LOG_WARNING(Service_BTM, "called"); + + *out_interface = std::make_shared(system); + R_SUCCEED(); +} + +} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_user.h b/src/core/hle/service/btm/btm_user.h new file mode 100644 index 0000000000..d6cf330ed6 --- /dev/null +++ b/src/core/hle/service/btm/btm_user.h @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Core { +class System; +} + +namespace Service::BTM { +class IBtmUserCore; + +class IBtmUser final : public ServiceFramework { +public: + explicit IBtmUser(Core::System& system_); + ~IBtmUser() override; + +private: + Result GetCore(OutInterface out_interface); +}; + +} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_user_core.cpp b/src/core/hle/service/btm/btm_user_core.cpp new file mode 100644 index 0000000000..b120df14c0 --- /dev/null +++ b/src/core/hle/service/btm/btm_user_core.cpp @@ -0,0 +1,106 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include + +#include "common/logging.h" +#include "core/core.h" +#include "core/hle/kernel/k_event.h" +#include "core/hle/service/btm/btm_user_core.h" +#include "core/hle/service/cmif_serialization.h" + +namespace Service::BTM { + +IBtmUserCore::IBtmUserCore(Core::System& system_) + : ServiceFramework{system_, "IBtmUserCore"}, service_context{system_, "IBtmUserCore"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&IBtmUserCore::AcquireBleScanEvent>, "AcquireBleScanEvent"}, + {1, nullptr, "GetBleScanFilterParameter"}, + {2, nullptr, "GetBleScanFilterParameter2"}, + {3, nullptr, "StartBleScanForGeneral"}, + {4, nullptr, "StopBleScanForGeneral"}, + {5, nullptr, "GetBleScanResultsForGeneral"}, + {6, nullptr, "StartBleScanForPaired"}, + {7, nullptr, "StopBleScanForPaired"}, + {8, nullptr, "StartBleScanForSmartDevice"}, + {9, nullptr, "StopBleScanForSmartDevice"}, + {10, nullptr, "GetBleScanResultsForSmartDevice"}, + {17, C<&IBtmUserCore::AcquireBleConnectionEvent>, "AcquireBleConnectionEvent"}, + {18, nullptr, "BleConnect"}, + {19, nullptr, "BleDisconnect"}, + {20, nullptr, "BleGetConnectionState"}, + {21, nullptr, "AcquireBlePairingEvent"}, + {22, nullptr, "BlePairDevice"}, + {23, nullptr, "BleUnPairDevice"}, + {24, nullptr, "BleUnPairDevice2"}, + {25, nullptr, "BleGetPairedDevices"}, + {26, C<&IBtmUserCore::AcquireBleServiceDiscoveryEvent>, "AcquireBleServiceDiscoveryEvent"}, + {27, nullptr, "GetGattServices"}, + {28, nullptr, "GetGattService"}, + {29, nullptr, "GetGattIncludedServices"}, + {30, nullptr, "GetBelongingGattService"}, + {31, nullptr, "GetGattCharacteristics"}, + {32, nullptr, "GetGattDescriptors"}, + {33, C<&IBtmUserCore::AcquireBleMtuConfigEvent>, "AcquireBleMtuConfigEvent"}, + {34, nullptr, "ConfigureBleMtu"}, + {35, nullptr, "GetBleMtu"}, + {36, nullptr, "RegisterBleGattDataPath"}, + {37, nullptr, "UnregisterBleGattDataPath"}, + }; + // clang-format on + RegisterHandlers(functions); + + scan_event = service_context.CreateEvent("IBtmUserCore:ScanEvent"); + connection_event = service_context.CreateEvent("IBtmUserCore:ConnectionEvent"); + service_discovery_event = service_context.CreateEvent("IBtmUserCore:DiscoveryEvent"); + config_event = service_context.CreateEvent("IBtmUserCore:ConfigEvent"); +} + +IBtmUserCore::~IBtmUserCore() { + service_context.CloseEvent(scan_event); + service_context.CloseEvent(connection_event); + service_context.CloseEvent(service_discovery_event); + service_context.CloseEvent(config_event); +} + +Result IBtmUserCore::AcquireBleScanEvent(Out out_is_valid, + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &scan_event->GetReadableEvent(); + R_SUCCEED(); +} + +Result IBtmUserCore::AcquireBleConnectionEvent(Out out_is_valid, + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &connection_event->GetReadableEvent(); + R_SUCCEED(); +} + +Result IBtmUserCore::AcquireBleServiceDiscoveryEvent( + Out out_is_valid, OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &service_discovery_event->GetReadableEvent(); + R_SUCCEED(); +} + +Result IBtmUserCore::AcquireBleMtuConfigEvent(Out out_is_valid, + OutCopyHandle out_event) { + LOG_WARNING(Service_BTM, "(STUBBED) called"); + + *out_is_valid = true; + *out_event = &config_event->GetReadableEvent(); + R_SUCCEED(); +} + +} // namespace Service::BTM diff --git a/src/core/hle/service/btm/btm_user_core.h b/src/core/hle/service/btm/btm_user_core.h new file mode 100644 index 0000000000..5a565a5897 --- /dev/null +++ b/src/core/hle/service/btm/btm_user_core.h @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/kernel_helpers.h" +#include "core/hle/service/service.h" + +namespace Kernel { +class KEvent; +class KReadableEvent; +} // namespace Kernel + +namespace Core { +class System; +} + +namespace Service::BTM { + +class IBtmUserCore final : public ServiceFramework { +public: + explicit IBtmUserCore(Core::System& system_); + ~IBtmUserCore() override; + +private: + Result AcquireBleScanEvent(Out out_is_valid, + OutCopyHandle out_event); + + Result AcquireBleConnectionEvent(Out out_is_valid, + OutCopyHandle out_event); + + Result AcquireBleServiceDiscoveryEvent(Out out_is_valid, + OutCopyHandle out_event); + + Result AcquireBleMtuConfigEvent(Out out_is_valid, + OutCopyHandle out_event); + + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* scan_event; + Kernel::KEvent* connection_event; + Kernel::KEvent* service_discovery_event; + Kernel::KEvent* config_event; +}; + +} // namespace Service::BTM diff --git a/src/core/hle/service/caps/caps.cpp b/src/core/hle/service/caps/caps.cpp index 6cc37999f3..f07fbd2185 100644 --- a/src/core/hle/service/caps/caps.cpp +++ b/src/core/hle/service/caps/caps.cpp @@ -5,6 +5,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "core/hle/service/caps/caps.h" +#include "core/hle/service/caps/caps_a.h" #include "core/hle/service/caps/caps_c.h" #include "core/hle/service/caps/caps_manager.h" #include "core/hle/service/caps/caps_sc.h" @@ -13,223 +14,24 @@ #include "core/hle/service/caps/caps_u.h" #include "core/hle/service/server_manager.h" #include "core/hle/service/service.h" -#include "common/logging.h" #include "frontend_common/firmware_manager.h" -#include "core/hle/service/caps/caps_result.h" -#include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/ipc_helpers.h" namespace Service::Capture { class IDecoderControlService final : public ServiceFramework { public: - explicit IDecoderControlService(Core::System& system_) : ServiceFramework{system_, "grc:d"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{3001, nullptr, "DecodeJpeg"}, - FunctionInfo{4001, nullptr, "ShrinkJpeg"}, - FunctionInfo{4002, nullptr, "ShrinkJpegEx"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit IDecoderControlService(Core::System& system_) : ServiceFramework{system_, "grc:d"} { + // clang-format off + static const FunctionInfo functions[] = { + {3001, nullptr, "DecodeJpeg"}, + {4001, nullptr, "ShrinkJpeg"}, + {4002, nullptr, "ShrinkJpegEx"}, + }; + // clang-format on + RegisterHandlers(functions); } }; -class IAlbumAccessorService final : public ServiceFramework { -public: - explicit IAlbumAccessorService(Core::System& system_, std::shared_ptr album_manager) : ServiceFramework{system_, "caps:a"}, manager{album_manager} {} - ~IAlbumAccessorService() override = default; - - Result GetAlbumFileList( - Out out_count, AlbumStorage storage, - OutArray out_entries) { - LOG_INFO(Service_Capture, "called, storage={}", storage); - - const Result result = manager->GetAlbumFileList(out_entries, *out_count, storage, 0); - R_RETURN(TranslateResult(result)); - } - - Result DeleteAlbumFile(AlbumFileId file_id) { - LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}", - file_id.application_id, file_id.storage, file_id.type); - - const Result result = manager->DeleteAlbumFile(file_id); - R_RETURN(TranslateResult(result)); - } - - Result IsAlbumMounted(Out out_is_mounted, AlbumStorage storage) { - LOG_INFO(Service_Capture, "called, storage={}", storage); - - const Result result = manager->IsAlbumMounted(storage); - *out_is_mounted = result.IsSuccess(); - R_RETURN(TranslateResult(result)); - } - - Result Unknown18( - Out out_buffer_size, - OutArray out_buffer) { - LOG_WARNING(Service_Capture, "(STUBBED) called"); - *out_buffer_size = 0; - R_SUCCEED(); - } - - Result GetAlbumFileListEx0( - Out out_entries_size, AlbumStorage storage, u8 flags, - OutArray out_entries) { - LOG_INFO(Service_Capture, "called, storage={}, flags={}", storage, flags); - - const Result result = manager->GetAlbumFileList(out_entries, *out_entries_size, storage, flags); - R_RETURN(TranslateResult(result)); - } - - Result GetAutoSavingStorage(Out out_is_autosaving) { - LOG_WARNING(Service_Capture, "(STUBBED) called"); - - const Result result = manager->GetAutoSavingStorage(*out_is_autosaving); - R_RETURN(TranslateResult(result)); - } - - Result LoadAlbumScreenShotImageEx1( - const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, - OutLargeData out_image_output, - OutArray out_image, - OutArray out_buffer) { - LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}", - file_id.application_id, file_id.storage, file_id.type, decoder_options.flags); - - const Result result = - manager->LoadAlbumScreenShotImage(*out_image_output, out_image, file_id, decoder_options); - R_RETURN(TranslateResult(result)); - } - - Result LoadAlbumScreenShotThumbnailImageEx1( - const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, - OutLargeData out_image_output, - OutArray out_image, - OutArray out_buffer) { - LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}", - file_id.application_id, file_id.storage, file_id.type, decoder_options.flags); - - const Result result = manager->LoadAlbumScreenShotThumbnail(*out_image_output, out_image, - file_id, decoder_options); - R_RETURN(TranslateResult(result)); - } - - Result TranslateResult(Result in_result) { - if (in_result.IsSuccess()) { - return in_result; - } - - if ((in_result.raw & 0x3801ff) == ResultUnknown1024.raw) { - if (in_result.GetDescription() - 0x514 < 100) { - return ResultInvalidFileData; - } - if (in_result.GetDescription() - 0x5dc < 100) { - return ResultInvalidFileData; - } - - if (in_result.GetDescription() - 0x578 < 100) { - if (in_result == ResultFileCountLimit) { - return ResultUnknown22; - } - return ResultUnknown25; - } - - if (in_result.raw < ResultUnknown1801.raw) { - if (in_result == ResultUnknown1202) { - return ResultUnknown810; - } - if (in_result == ResultUnknown1203) { - return ResultUnknown810; - } - if (in_result == ResultUnknown1701) { - return ResultUnknown5; - } - } else if (in_result.raw < ResultUnknown1803.raw) { - if (in_result == ResultUnknown1801) { - return ResultUnknown5; - } - if (in_result == ResultUnknown1802) { - return ResultUnknown6; - } - } else { - if (in_result == ResultUnknown1803) { - return ResultUnknown7; - } - if (in_result == ResultUnknown1804) { - return ResultOutOfRange; - } - } - return ResultUnknown1024; - } - - if (in_result.GetModule() == ErrorModule::FS) { - if ((in_result.GetDescription() >> 0xc < 0x7d) || - (in_result.GetDescription() - 1000 < 2000) || - (((in_result.GetDescription() - 3000) >> 3) < 0x271)) { - // TODO: Translate FS error - return in_result; - } - } - - return in_result; - } - - Result GetAlbumAccessResultForDebug(Out out_result) { - LOG_WARNING(Service_Capture, "(STUBBED) called"); - *out_result = ResultSuccess; - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetAlbumFileCount"}, - FunctionInfo{1, C<&IAlbumAccessorService::GetAlbumFileList>, "GetAlbumFileList"}, - FunctionInfo{2, nullptr, "LoadAlbumFile"}, - FunctionInfo{3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"}, - FunctionInfo{4, nullptr, "StorageCopyAlbumFile"}, - FunctionInfo{5, C<&IAlbumAccessorService::IsAlbumMounted>, "IsAlbumMounted"}, - FunctionInfo{6, nullptr, "GetAlbumUsage"}, - FunctionInfo{7, nullptr, "GetAlbumFileSize"}, - FunctionInfo{8, nullptr, "LoadAlbumFileThumbnail"}, - FunctionInfo{9, nullptr, "LoadAlbumScreenShotImage"}, - FunctionInfo{10, nullptr, "LoadAlbumScreenShotThumbnailImage"}, - FunctionInfo{11, nullptr, "GetAlbumEntryFromApplicationAlbumEntry"}, - FunctionInfo{12, nullptr, "LoadAlbumScreenShotImageEx"}, - FunctionInfo{13, nullptr, "LoadAlbumScreenShotThumbnailImageEx"}, - FunctionInfo{14, nullptr, "LoadAlbumScreenShotImageEx0"}, - FunctionInfo{15, nullptr, "GetAlbumUsage3"}, - FunctionInfo{16, nullptr, "GetAlbumMountResult"}, - FunctionInfo{17, nullptr, "GetAlbumUsage16"}, - FunctionInfo{18, C<&IAlbumAccessorService::Unknown18>, "Unknown18"}, - FunctionInfo{19, nullptr, "Unknown19"}, - FunctionInfo{100, nullptr, "GetAlbumFileCountEx0"}, - FunctionInfo{101, C<&IAlbumAccessorService::GetAlbumFileListEx0>, "GetAlbumFileListEx0"}, - FunctionInfo{202, nullptr, "SaveEditedScreenShot"}, - FunctionInfo{301, nullptr, "GetLastThumbnail"}, - FunctionInfo{302, nullptr, "GetLastOverlayMovieThumbnail"}, - FunctionInfo{401, C<&IAlbumAccessorService::GetAutoSavingStorage>, "GetAutoSavingStorage"}, - FunctionInfo{501, nullptr, "GetRequiredStorageSpaceSizeToCopyAll"}, - FunctionInfo{1001, nullptr, "LoadAlbumScreenShotThumbnailImageEx0"}, - FunctionInfo{1002, C<&IAlbumAccessorService::LoadAlbumScreenShotImageEx1>, "LoadAlbumScreenShotImageEx1"}, - FunctionInfo{1003, C<&IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1>, "LoadAlbumScreenShotThumbnailImageEx1"}, - FunctionInfo{8001, nullptr, "ForceAlbumUnmounted"}, - FunctionInfo{8002, nullptr, "ResetAlbumMountStatus"}, - FunctionInfo{8011, nullptr, "RefreshAlbumCache"}, - FunctionInfo{8012, nullptr, "GetAlbumCache"}, - FunctionInfo{8013, nullptr, "GetAlbumCacheEx"}, - FunctionInfo{8021, nullptr, "GetAlbumEntryFromApplicationAlbumEntryAruid"}, - FunctionInfo{10011, nullptr, "SetInternalErrorConversionEnabled"}, - FunctionInfo{50000, nullptr, "LoadMakerNoteInfoForDebug"}, - FunctionInfo{50011, C<&IAlbumAccessorService::GetAlbumAccessResultForDebug>, "GetAlbumAccessResultForDebug"}, - FunctionInfo{60002, nullptr, "OpenAccessorSession"} - ); - - std::shared_ptr manager = nullptr; -}; - void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); auto album_manager = std::make_shared(system); diff --git a/src/core/hle/service/caps/caps.h b/src/core/hle/service/caps/caps.h index 58e9725b85..670ee59cda 100644 --- a/src/core/hle/service/caps/caps.h +++ b/src/core/hle/service/caps/caps.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/caps/caps_a.cpp b/src/core/hle/service/caps/caps_a.cpp new file mode 100644 index 0000000000..8f561bfcdc --- /dev/null +++ b/src/core/hle/service/caps/caps_a.cpp @@ -0,0 +1,211 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/logging.h" +#include "core/hle/service/caps/caps_a.h" +#include "core/hle/service/caps/caps_manager.h" +#include "core/hle/service/caps/caps_result.h" +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/ipc_helpers.h" + +namespace Service::Capture { + +IAlbumAccessorService::IAlbumAccessorService(Core::System& system_, + std::shared_ptr album_manager) + : ServiceFramework{system_, "caps:a"}, manager{album_manager} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetAlbumFileCount"}, + {1, C<&IAlbumAccessorService::GetAlbumFileList>, "GetAlbumFileList"}, + {2, nullptr, "LoadAlbumFile"}, + {3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"}, + {4, nullptr, "StorageCopyAlbumFile"}, + {5, C<&IAlbumAccessorService::IsAlbumMounted>, "IsAlbumMounted"}, + {6, nullptr, "GetAlbumUsage"}, + {7, nullptr, "GetAlbumFileSize"}, + {8, nullptr, "LoadAlbumFileThumbnail"}, + {9, nullptr, "LoadAlbumScreenShotImage"}, + {10, nullptr, "LoadAlbumScreenShotThumbnailImage"}, + {11, nullptr, "GetAlbumEntryFromApplicationAlbumEntry"}, + {12, nullptr, "LoadAlbumScreenShotImageEx"}, + {13, nullptr, "LoadAlbumScreenShotThumbnailImageEx"}, + {14, nullptr, "LoadAlbumScreenShotImageEx0"}, + {15, nullptr, "GetAlbumUsage3"}, + {16, nullptr, "GetAlbumMountResult"}, + {17, nullptr, "GetAlbumUsage16"}, + {18, C<&IAlbumAccessorService::Unknown18>, "Unknown18"}, + {19, nullptr, "Unknown19"}, + {100, nullptr, "GetAlbumFileCountEx0"}, + {101, C<&IAlbumAccessorService::GetAlbumFileListEx0>, "GetAlbumFileListEx0"}, + {202, nullptr, "SaveEditedScreenShot"}, + {301, nullptr, "GetLastThumbnail"}, + {302, nullptr, "GetLastOverlayMovieThumbnail"}, + {401, C<&IAlbumAccessorService::GetAutoSavingStorage>, "GetAutoSavingStorage"}, + {501, nullptr, "GetRequiredStorageSpaceSizeToCopyAll"}, + {1001, nullptr, "LoadAlbumScreenShotThumbnailImageEx0"}, + {1002, C<&IAlbumAccessorService::LoadAlbumScreenShotImageEx1>, "LoadAlbumScreenShotImageEx1"}, + {1003, C<&IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1>, "LoadAlbumScreenShotThumbnailImageEx1"}, + {8001, nullptr, "ForceAlbumUnmounted"}, + {8002, nullptr, "ResetAlbumMountStatus"}, + {8011, nullptr, "RefreshAlbumCache"}, + {8012, nullptr, "GetAlbumCache"}, + {8013, nullptr, "GetAlbumCacheEx"}, + {8021, nullptr, "GetAlbumEntryFromApplicationAlbumEntryAruid"}, + {10011, nullptr, "SetInternalErrorConversionEnabled"}, + {50000, nullptr, "LoadMakerNoteInfoForDebug"}, + {50011, C<&IAlbumAccessorService::GetAlbumAccessResultForDebug>, "GetAlbumAccessResultForDebug"}, + {60002, nullptr, "OpenAccessorSession"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +IAlbumAccessorService::~IAlbumAccessorService() = default; + +Result IAlbumAccessorService::GetAlbumFileList( + Out out_count, AlbumStorage storage, + OutArray out_entries) { + LOG_INFO(Service_Capture, "called, storage={}", storage); + + const Result result = manager->GetAlbumFileList(out_entries, *out_count, storage, 0); + R_RETURN(TranslateResult(result)); +} + +Result IAlbumAccessorService::DeleteAlbumFile(AlbumFileId file_id) { + LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}", + file_id.application_id, file_id.storage, file_id.type); + + const Result result = manager->DeleteAlbumFile(file_id); + R_RETURN(TranslateResult(result)); +} + +Result IAlbumAccessorService::IsAlbumMounted(Out out_is_mounted, AlbumStorage storage) { + LOG_INFO(Service_Capture, "called, storage={}", storage); + + const Result result = manager->IsAlbumMounted(storage); + *out_is_mounted = result.IsSuccess(); + R_RETURN(TranslateResult(result)); +} + +Result IAlbumAccessorService::Unknown18( + Out out_buffer_size, + OutArray out_buffer) { + LOG_WARNING(Service_Capture, "(STUBBED) called"); + *out_buffer_size = 0; + R_SUCCEED(); +} + +Result IAlbumAccessorService::GetAlbumFileListEx0( + Out out_entries_size, AlbumStorage storage, u8 flags, + OutArray out_entries) { + LOG_INFO(Service_Capture, "called, storage={}, flags={}", storage, flags); + + const Result result = manager->GetAlbumFileList(out_entries, *out_entries_size, storage, flags); + R_RETURN(TranslateResult(result)); +} + +Result IAlbumAccessorService::GetAutoSavingStorage(Out out_is_autosaving) { + LOG_WARNING(Service_Capture, "(STUBBED) called"); + + const Result result = manager->GetAutoSavingStorage(*out_is_autosaving); + R_RETURN(TranslateResult(result)); +} + +Result IAlbumAccessorService::LoadAlbumScreenShotImageEx1( + const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, + OutLargeData out_image_output, + OutArray out_image, + OutArray out_buffer) { + LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}", + file_id.application_id, file_id.storage, file_id.type, decoder_options.flags); + + const Result result = + manager->LoadAlbumScreenShotImage(*out_image_output, out_image, file_id, decoder_options); + R_RETURN(TranslateResult(result)); +} + +Result IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1( + const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, + OutLargeData out_image_output, + OutArray out_image, + OutArray out_buffer) { + LOG_INFO(Service_Capture, "called, application_id={:#0x}, storage={}, type={}, flags={}", + file_id.application_id, file_id.storage, file_id.type, decoder_options.flags); + + const Result result = manager->LoadAlbumScreenShotThumbnail(*out_image_output, out_image, + file_id, decoder_options); + R_RETURN(TranslateResult(result)); +} + +Result IAlbumAccessorService::TranslateResult(Result in_result) { + if (in_result.IsSuccess()) { + return in_result; + } + + if ((in_result.raw & 0x3801ff) == ResultUnknown1024.raw) { + if (in_result.GetDescription() - 0x514 < 100) { + return ResultInvalidFileData; + } + if (in_result.GetDescription() - 0x5dc < 100) { + return ResultInvalidFileData; + } + + if (in_result.GetDescription() - 0x578 < 100) { + if (in_result == ResultFileCountLimit) { + return ResultUnknown22; + } + return ResultUnknown25; + } + + if (in_result.raw < ResultUnknown1801.raw) { + if (in_result == ResultUnknown1202) { + return ResultUnknown810; + } + if (in_result == ResultUnknown1203) { + return ResultUnknown810; + } + if (in_result == ResultUnknown1701) { + return ResultUnknown5; + } + } else if (in_result.raw < ResultUnknown1803.raw) { + if (in_result == ResultUnknown1801) { + return ResultUnknown5; + } + if (in_result == ResultUnknown1802) { + return ResultUnknown6; + } + } else { + if (in_result == ResultUnknown1803) { + return ResultUnknown7; + } + if (in_result == ResultUnknown1804) { + return ResultOutOfRange; + } + } + return ResultUnknown1024; + } + + if (in_result.GetModule() == ErrorModule::FS) { + if ((in_result.GetDescription() >> 0xc < 0x7d) || + (in_result.GetDescription() - 1000 < 2000) || + (((in_result.GetDescription() - 3000) >> 3) < 0x271)) { + // TODO: Translate FS error + return in_result; + } + } + + return in_result; +} + + +Result IAlbumAccessorService::GetAlbumAccessResultForDebug(Out out_result) { + LOG_WARNING(Service_Capture, "(STUBBED) called"); + *out_result = ResultSuccess; + R_SUCCEED(); +} + +} // namespace Service::Capture diff --git a/src/core/hle/service/caps/caps_a.h b/src/core/hle/service/caps/caps_a.h new file mode 100644 index 0000000000..c6aa8f9210 --- /dev/null +++ b/src/core/hle/service/caps/caps_a.h @@ -0,0 +1,63 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/caps/caps_types.h" +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Core { +class System; +} + +namespace Service::Capture { +class AlbumManager; + +class IAlbumAccessorService final : public ServiceFramework { +public: + explicit IAlbumAccessorService(Core::System& system_, + std::shared_ptr album_manager); + ~IAlbumAccessorService() override; + +private: + Result GetAlbumFileList(Out out_count, AlbumStorage storage, + OutArray out_entries); + + Result DeleteAlbumFile(AlbumFileId file_id); + + Result IsAlbumMounted(Out out_is_mounted, AlbumStorage storage); + + Result Unknown18( + Out out_buffer_size, + OutArray + out_buffer); + + Result GetAlbumFileListEx0(Out out_entries_size, AlbumStorage storage, u8 flags, + OutArray out_entries); + + Result GetAutoSavingStorage(Out out_is_autosaving); + + Result LoadAlbumScreenShotImageEx1( + const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, + OutLargeData out_image_output, + OutArray out_image, + OutArray out_buffer); + + Result LoadAlbumScreenShotThumbnailImageEx1( + const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options, + OutLargeData out_image_output, + OutArray out_image, + OutArray out_buffer); + + Result TranslateResult(Result in_result); + + Result GetAlbumAccessResultForDebug(Out out_result); + + std::shared_ptr manager = nullptr; +}; + +} // namespace Service::Capture diff --git a/src/core/hle/service/caps/caps_c.cpp b/src/core/hle/service/caps/caps_c.cpp index c62c3cd5d3..6c9f8e964d 100644 --- a/src/core/hle/service/caps/caps_c.cpp +++ b/src/core/hle/service/caps/caps_c.cpp @@ -14,34 +14,34 @@ namespace Service::Capture { -std::optional IAlbumControlService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, nullptr, "CaptureRawImage"}, - FunctionInfo{2, nullptr, "CaptureRawImageWithTimeout"}, - FunctionInfo{33, C<&IAlbumControlService::SetShimLibraryVersion>, "SetShimLibraryVersion"}, - FunctionInfo{1001, nullptr, "RequestTakingScreenShot"}, - FunctionInfo{1002, nullptr, "RequestTakingScreenShotWithTimeout"}, - FunctionInfo{1011, nullptr, "NotifyTakingScreenShotRefused"}, - FunctionInfo{2001, nullptr, "NotifyAlbumStorageIsAvailable"}, - FunctionInfo{2002, nullptr, "NotifyAlbumStorageIsUnavailable"}, - FunctionInfo{2011, nullptr, "RegisterAppletResourceUserId"}, - FunctionInfo{2012, nullptr, "UnregisterAppletResourceUserId"}, - FunctionInfo{2013, nullptr, "GetApplicationIdFromAruid"}, - FunctionInfo{2014, nullptr, "CheckApplicationIdRegistered"}, - FunctionInfo{2101, nullptr, "GenerateCurrentAlbumFileId"}, - FunctionInfo{2102, nullptr, "GenerateApplicationAlbumEntry"}, - FunctionInfo{2201, nullptr, "SaveAlbumScreenShotFile"}, - FunctionInfo{2202, nullptr, "SaveAlbumScreenShotFileEx"}, - FunctionInfo{2301, nullptr, "SetOverlayScreenShotThumbnailData"}, - FunctionInfo{2302, nullptr, "SetOverlayMovieThumbnailData"}, - FunctionInfo{60001, nullptr, "OpenControlSession"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IAlbumControlService::IAlbumControlService(Core::System& system_, std::shared_ptr album_manager) : ServiceFramework{system_, "caps:c"}, manager{album_manager} { + // clang-format off + static const FunctionInfo functions[] = { + {1, nullptr, "CaptureRawImage"}, + {2, nullptr, "CaptureRawImageWithTimeout"}, + {33, C<&IAlbumControlService::SetShimLibraryVersion>, "SetShimLibraryVersion"}, + {1001, nullptr, "RequestTakingScreenShot"}, + {1002, nullptr, "RequestTakingScreenShotWithTimeout"}, + {1011, nullptr, "NotifyTakingScreenShotRefused"}, + {2001, nullptr, "NotifyAlbumStorageIsAvailable"}, + {2002, nullptr, "NotifyAlbumStorageIsUnavailable"}, + {2011, nullptr, "RegisterAppletResourceUserId"}, + {2012, nullptr, "UnregisterAppletResourceUserId"}, + {2013, nullptr, "GetApplicationIdFromAruid"}, + {2014, nullptr, "CheckApplicationIdRegistered"}, + {2101, nullptr, "GenerateCurrentAlbumFileId"}, + {2102, nullptr, "GenerateApplicationAlbumEntry"}, + {2201, nullptr, "SaveAlbumScreenShotFile"}, + {2202, nullptr, "SaveAlbumScreenShotFileEx"}, + {2301, nullptr, "SetOverlayScreenShotThumbnailData"}, + {2302, nullptr, "SetOverlayMovieThumbnailData"}, + {60001, nullptr, "OpenControlSession"}, + }; + // clang-format on + + RegisterHandlers(functions); } IAlbumControlService::~IAlbumControlService() = default; diff --git a/src/core/hle/service/caps/caps_c.h b/src/core/hle/service/caps/caps_c.h index a1f19bbfc3..f50de0ee8c 100644 --- a/src/core/hle/service/caps/caps_c.h +++ b/src/core/hle/service/caps/caps_c.h @@ -19,11 +19,14 @@ enum class ShimLibraryVersion : u64; class IAlbumControlService final : public ServiceFramework { public: - explicit IAlbumControlService(Core::System& system_, std::shared_ptr album_manager); + explicit IAlbumControlService(Core::System& system_, + std::shared_ptr album_manager); ~IAlbumControlService() override; + private: - Result SetShimLibraryVersion(ShimLibraryVersion library_version, ClientAppletResourceUserId aruid); - std::optional FindRequest(u32 key) override; + Result SetShimLibraryVersion(ShimLibraryVersion library_version, + ClientAppletResourceUserId aruid); + std::shared_ptr manager = nullptr; }; diff --git a/src/core/hle/service/caps/caps_result.h b/src/core/hle/service/caps/caps_result.h index 179ae48409..b7ba2a642d 100644 --- a/src/core/hle/service/caps/caps_result.h +++ b/src/core/hle/service/caps/caps_result.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/caps/caps_sc.cpp b/src/core/hle/service/caps/caps_sc.cpp index 59119d8ed7..92d53da9f5 100644 --- a/src/core/hle/service/caps/caps_sc.cpp +++ b/src/core/hle/service/caps/caps_sc.cpp @@ -10,6 +10,32 @@ namespace Service::Capture { IScreenShotControlService::IScreenShotControlService(Core::System& system_) : ServiceFramework{system_, "caps:sc"} { + // clang-format off + static const FunctionInfo functions[] = { + {1, nullptr, "CaptureRawImage"}, + {2, nullptr, "CaptureRawImageWithTimeout"}, + {3, nullptr, "AttachSharedBuffer"}, + {5, nullptr, "CaptureRawImageToAttachedSharedBuffer"}, + {210, nullptr, "Unknown210"}, + {1001, nullptr, "RequestTakingScreenShot"}, + {1002, nullptr, "RequestTakingScreenShotWithTimeout"}, + {1003, nullptr, "RequestTakingScreenShotEx"}, + {1004, nullptr, "RequestTakingScreenShotEx1"}, + {1009, nullptr, "CancelTakingScreenShot"}, + {1010, nullptr, "SetTakingScreenShotCancelState"}, + {1011, nullptr, "NotifyTakingScreenShotRefused"}, + {1012, nullptr, "NotifyTakingScreenShotFailed"}, + {1101, nullptr, "SetupOverlayMovieThumbnail"}, + {1106, nullptr, "Unknown1106"}, + {1107, nullptr, "Unknown1107"}, + {1201, nullptr, "OpenRawScreenShotReadStream"}, + {1202, nullptr, "CloseRawScreenShotReadStream"}, + {1203, nullptr, "ReadRawScreenShotReadStream"}, + {1204, nullptr, "Unknown1204"}, + }; + // clang-format on + + RegisterHandlers(functions); } IScreenShotControlService::~IScreenShotControlService() = default; diff --git a/src/core/hle/service/caps/caps_sc.h b/src/core/hle/service/caps/caps_sc.h index 422f062e59..72e947bf16 100644 --- a/src/core/hle/service/caps/caps_sc.h +++ b/src/core/hle/service/caps/caps_sc.h @@ -18,32 +18,6 @@ class IScreenShotControlService final : public ServiceFramework FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, nullptr, "CaptureRawImage"}, - FunctionInfo{2, nullptr, "CaptureRawImageWithTimeout"}, - FunctionInfo{3, nullptr, "AttachSharedBuffer"}, - FunctionInfo{5, nullptr, "CaptureRawImageToAttachedSharedBuffer"}, - FunctionInfo{210, nullptr, "Unknown210"}, - FunctionInfo{1001, nullptr, "RequestTakingScreenShot"}, - FunctionInfo{1002, nullptr, "RequestTakingScreenShotWithTimeout"}, - FunctionInfo{1003, nullptr, "RequestTakingScreenShotEx"}, - FunctionInfo{1004, nullptr, "RequestTakingScreenShotEx1"}, - FunctionInfo{1009, nullptr, "CancelTakingScreenShot"}, - FunctionInfo{1010, nullptr, "SetTakingScreenShotCancelState"}, - FunctionInfo{1011, nullptr, "NotifyTakingScreenShotRefused"}, - FunctionInfo{1012, nullptr, "NotifyTakingScreenShotFailed"}, - FunctionInfo{1101, nullptr, "SetupOverlayMovieThumbnail"}, - FunctionInfo{1106, nullptr, "Unknown1106"}, - FunctionInfo{1107, nullptr, "Unknown1107"}, - FunctionInfo{1201, nullptr, "OpenRawScreenShotReadStream"}, - FunctionInfo{1202, nullptr, "CloseRawScreenShotReadStream"}, - FunctionInfo{1203, nullptr, "ReadRawScreenShotReadStream"}, - FunctionInfo{1204, nullptr, "Unknown1204"} - ); }; } // namespace Service::Capture diff --git a/src/core/hle/service/caps/caps_ss.cpp b/src/core/hle/service/caps/caps_ss.cpp index 0c444116b7..0cd641f551 100644 --- a/src/core/hle/service/caps/caps_ss.cpp +++ b/src/core/hle/service/caps/caps_ss.cpp @@ -12,22 +12,22 @@ namespace Service::Capture { -std::optional IScreenShotService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{201, nullptr, "SaveScreenShot"}, - FunctionInfo{202, nullptr, "SaveEditedScreenShot"}, - FunctionInfo{203, C<&IScreenShotService::SaveScreenShotEx0>, "SaveScreenShotEx0"}, - FunctionInfo{204, nullptr, "SaveEditedScreenShotEx0"}, - FunctionInfo{206, C<&IScreenShotService::SaveEditedScreenShotEx1>, "SaveEditedScreenShotEx1"}, - FunctionInfo{208, nullptr, "SaveScreenShotOfMovieEx1"}, - FunctionInfo{1000, nullptr, "Unknown1000"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IScreenShotService::IScreenShotService(Core::System& system_, std::shared_ptr album_manager) : ServiceFramework{system_, "caps:ss"}, manager{album_manager} { + // clang-format off + static const FunctionInfo functions[] = { + {201, nullptr, "SaveScreenShot"}, + {202, nullptr, "SaveEditedScreenShot"}, + {203, C<&IScreenShotService::SaveScreenShotEx0>, "SaveScreenShotEx0"}, + {204, nullptr, "SaveEditedScreenShotEx0"}, + {206, C<&IScreenShotService::SaveEditedScreenShotEx1>, "SaveEditedScreenShotEx1"}, + {208, nullptr, "SaveScreenShotOfMovieEx1"}, + {1000, nullptr, "Unknown1000"}, + }; + // clang-format on + + RegisterHandlers(functions); } IScreenShotService::~IScreenShotService() = default; diff --git a/src/core/hle/service/caps/caps_ss.h b/src/core/hle/service/caps/caps_ss.h index 8817637fb8..78971bde0e 100644 --- a/src/core/hle/service/caps/caps_ss.h +++ b/src/core/hle/service/caps/caps_ss.h @@ -37,7 +37,6 @@ private: const InBuffer thumbnail_image_data_buffer); - std::optional FindRequest(u32 key) override; std::shared_ptr manager; }; diff --git a/src/core/hle/service/caps/caps_su.cpp b/src/core/hle/service/caps/caps_su.cpp index e708ddbb68..4ecfc840e4 100644 --- a/src/core/hle/service/caps/caps_su.cpp +++ b/src/core/hle/service/caps/caps_su.cpp @@ -15,20 +15,20 @@ namespace Service::Capture { -std::optional IScreenShotApplicationService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{32, C<&IScreenShotApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"}, - FunctionInfo{201, nullptr, "SaveScreenShot"}, - FunctionInfo{203, C<&IScreenShotApplicationService::SaveScreenShotEx0>, "SaveScreenShotEx0"}, - FunctionInfo{205, C<&IScreenShotApplicationService::SaveScreenShotEx1>, "SaveScreenShotEx1"}, - FunctionInfo{210, nullptr, "SaveScreenShotEx2"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IScreenShotApplicationService::IScreenShotApplicationService( Core::System& system_, std::shared_ptr album_manager) : ServiceFramework{system_, "caps:su"}, manager{album_manager} { + // clang-format off + static const FunctionInfo functions[] = { + {32, C<&IScreenShotApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"}, + {201, nullptr, "SaveScreenShot"}, + {203, C<&IScreenShotApplicationService::SaveScreenShotEx0>, "SaveScreenShotEx0"}, + {205, C<&IScreenShotApplicationService::SaveScreenShotEx1>, "SaveScreenShotEx1"}, + {210, nullptr, "SaveScreenShotEx2"}, + }; + // clang-format on + + RegisterHandlers(functions); } IScreenShotApplicationService::~IScreenShotApplicationService() = default; diff --git a/src/core/hle/service/caps/caps_su.h b/src/core/hle/service/caps/caps_su.h index 0fdc994a25..b7e53007ce 100644 --- a/src/core/hle/service/caps/caps_su.h +++ b/src/core/hle/service/caps/caps_su.h @@ -45,8 +45,8 @@ private: const InBuffer image_data_buffer); - std::optional FindRequest(u32 key) override; std::array image_data; + std::shared_ptr manager; }; diff --git a/src/core/hle/service/caps/caps_u.cpp b/src/core/hle/service/caps/caps_u.cpp index c1fa418e03..6472b2bac6 100644 --- a/src/core/hle/service/caps/caps_u.cpp +++ b/src/core/hle/service/caps/caps_u.cpp @@ -13,29 +13,29 @@ namespace Service::Capture { -std::optional IAlbumApplicationService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{32, C<&IAlbumApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"}, - FunctionInfo{102, C<&IAlbumApplicationService::GetAlbumFileList0AafeAruidDeprecated>, "GetAlbumFileList0AafeAruidDeprecated"}, - FunctionInfo{103, nullptr, "DeleteAlbumFileByAruid"}, - FunctionInfo{104, nullptr, "GetAlbumFileSizeByAruid"}, - FunctionInfo{105, nullptr, "DeleteAlbumFileByAruidForDebug"}, - FunctionInfo{110, nullptr, "LoadAlbumScreenShotImageByAruid"}, - FunctionInfo{120, nullptr, "LoadAlbumScreenShotThumbnailImageByAruid"}, - FunctionInfo{130, nullptr, "PrecheckToCreateContentsByAruid"}, - FunctionInfo{140, nullptr, "GetAlbumFileList1AafeAruidDeprecated"}, - FunctionInfo{141, nullptr, "GetAlbumFileList2AafeUidAruidDeprecated"}, - FunctionInfo{142, C<&IAlbumApplicationService::GetAlbumFileList3AaeAruid>, "GetAlbumFileList3AaeAruid"}, - FunctionInfo{143, nullptr, "GetAlbumFileList4AaeUidAruid"}, - FunctionInfo{144, nullptr, "GetAllAlbumFileList3AaeAruid"}, - FunctionInfo{60002, nullptr, "OpenAccessorSessionForApplication"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IAlbumApplicationService::IAlbumApplicationService(Core::System& system_, std::shared_ptr album_manager) : ServiceFramework{system_, "caps:u"}, manager{album_manager} { + // clang-format off + static const FunctionInfo functions[] = { + {32, C<&IAlbumApplicationService::SetShimLibraryVersion>, "SetShimLibraryVersion"}, + {102, C<&IAlbumApplicationService::GetAlbumFileList0AafeAruidDeprecated>, "GetAlbumFileList0AafeAruidDeprecated"}, + {103, nullptr, "DeleteAlbumFileByAruid"}, + {104, nullptr, "GetAlbumFileSizeByAruid"}, + {105, nullptr, "DeleteAlbumFileByAruidForDebug"}, + {110, nullptr, "LoadAlbumScreenShotImageByAruid"}, + {120, nullptr, "LoadAlbumScreenShotThumbnailImageByAruid"}, + {130, nullptr, "PrecheckToCreateContentsByAruid"}, + {140, nullptr, "GetAlbumFileList1AafeAruidDeprecated"}, + {141, nullptr, "GetAlbumFileList2AafeUidAruidDeprecated"}, + {142, C<&IAlbumApplicationService::GetAlbumFileList3AaeAruid>, "GetAlbumFileList3AaeAruid"}, + {143, nullptr, "GetAlbumFileList4AaeUidAruid"}, + {144, nullptr, "GetAllAlbumFileList3AaeAruid"}, + {60002, nullptr, "OpenAccessorSessionForApplication"}, + }; + // clang-format on + + RegisterHandlers(functions); } IAlbumApplicationService::~IAlbumApplicationService() = default; diff --git a/src/core/hle/service/caps/caps_u.h b/src/core/hle/service/caps/caps_u.h index 52e151bbe2..debae97a46 100644 --- a/src/core/hle/service/caps/caps_u.h +++ b/src/core/hle/service/caps/caps_u.h @@ -36,7 +36,6 @@ private: AlbumFileDateTime end_date_time, ClientAppletResourceUserId aruid, OutArray out_entries); - std::optional FindRequest(u32 key) override; std::shared_ptr manager = nullptr; }; diff --git a/src/core/hle/service/cmif_types.h b/src/core/hle/service/cmif_types.h index dad358b87c..783bce7781 100644 --- a/src/core/hle/service/cmif_types.h +++ b/src/core/hle/service/cmif_types.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/erpt/erpt.cpp b/src/core/hle/service/erpt/erpt.cpp index 7bed893bd7..014f1da62f 100644 --- a/src/core/hle/service/erpt/erpt.cpp +++ b/src/core/hle/service/erpt/erpt.cpp @@ -17,10 +17,30 @@ namespace Service::ERPT { class ErrorReportContext final : public ServiceFramework { public: - explicit ErrorReportContext(Core::System& system_) : ServiceFramework{system_, "erpt:c"} {} + explicit ErrorReportContext(Core::System& system_) : ServiceFramework{system_, "erpt:c"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&ErrorReportContext::SubmitContext>, "SubmitContext"}, + {1, C<&ErrorReportContext::CreateReportV0>, "CreateReportV0"}, + {2, nullptr, "SetInitialLaunchSettingsCompletionTime"}, + {3, nullptr, "ClearInitialLaunchSettingsCompletionTime"}, + {4, nullptr, "UpdatePowerOnTime"}, + {5, D<&ErrorReportContext::UpdateAwakeTime>, "UpdateAwakeTime"}, + {6, nullptr, "SubmitMultipleCategoryContext"}, + {7, nullptr, "UpdateApplicationLaunchTime"}, + {8, nullptr, "ClearApplicationLaunchTime"}, + {9, nullptr, "SubmitAttachment"}, + {10, nullptr, "CreateReportWithAttachments"}, + {11, C<&ErrorReportContext::CreateReportV1>, "CreateReportV1"}, + {12, C<&ErrorReportContext::CreateReport>, "CreateReport"}, + {20, nullptr, "RegisterRunningApplet"}, + {21, nullptr, "UnregisterRunningApplet"}, + {22, nullptr, "UpdateAppletSuspendedDuration"}, + {30, nullptr, "InvalidateForcedShutdownDetection"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -65,41 +85,21 @@ private: data_a.size(), data_b.size(), flag_a, flag_b); R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&ErrorReportContext::SubmitContext>, "SubmitContext"}, - FunctionInfo{1, C<&ErrorReportContext::CreateReportV0>, "CreateReportV0"}, - FunctionInfo{2, nullptr, "SetInitialLaunchSettingsCompletionTime"}, - FunctionInfo{3, nullptr, "ClearInitialLaunchSettingsCompletionTime"}, - FunctionInfo{4, nullptr, "UpdatePowerOnTime"}, - FunctionInfo{5, D<&ErrorReportContext::UpdateAwakeTime>, "UpdateAwakeTime"}, - FunctionInfo{6, nullptr, "SubmitMultipleCategoryContext"}, - FunctionInfo{7, nullptr, "UpdateApplicationLaunchTime"}, - FunctionInfo{8, nullptr, "ClearApplicationLaunchTime"}, - FunctionInfo{9, nullptr, "SubmitAttachment"}, - FunctionInfo{10, nullptr, "CreateReportWithAttachments"}, - FunctionInfo{11, C<&ErrorReportContext::CreateReportV1>, "CreateReportV1"}, - FunctionInfo{12, C<&ErrorReportContext::CreateReport>, "CreateReport"}, - FunctionInfo{20, nullptr, "RegisterRunningApplet"}, - FunctionInfo{21, nullptr, "UnregisterRunningApplet"}, - FunctionInfo{22, nullptr, "UpdateAppletSuspendedDuration"}, - FunctionInfo{30, nullptr, "InvalidateForcedShutdownDetection"} - ); }; class ErrorReportSession final : public ServiceFramework { public: - explicit ErrorReportSession(Core::System& system_) : ServiceFramework{system_, "erpt:r"} {} + explicit ErrorReportSession(Core::System& system_) : ServiceFramework{system_, "erpt:r"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "OpenReport"}, + {1, nullptr, "OpenManager"}, + {2, nullptr, "OpenAttachment"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenReport"}, - FunctionInfo{1, nullptr, "OpenManager"}, - FunctionInfo{2, nullptr, "OpenAttachment"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/erpt/erpt.h b/src/core/hle/service/erpt/erpt.h index 60094f556e..456e9af910 100644 --- a/src/core/hle/service/erpt/erpt.h +++ b/src/core/hle/service/erpt/erpt.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/es/es.cpp b/src/core/hle/service/es/es.cpp index 01d11183c9..432783f96e 100644 --- a/src/core/hle/service/es/es.cpp +++ b/src/core/hle/service/es/es.cpp @@ -19,14 +19,110 @@ constexpr Result ERROR_INVALID_RIGHTS_ID{ErrorModule::ETicket, 3}; class ETicket final : public ServiceFramework { public: explicit ETicket(Core::System& system_) : ServiceFramework{system_, "es"} { + // clang-format off + static const FunctionInfo functions[] = { + {1, &ETicket::ImportTicket, "ImportTicket"}, + {2, nullptr, "ImportTicketCertificateSet"}, + {3, nullptr, "DeleteTicket"}, + {4, nullptr, "DeletePersonalizedTicket"}, + {5, nullptr, "DeleteAllCommonTicket"}, + {6, nullptr, "DeleteAllPersonalizedTicket"}, + {7, nullptr, "DeleteAllPersonalizedTicketEx"}, + {8, &ETicket::GetTitleKey, "GetTitleKey"}, + {9, &ETicket::CountCommonTicket, "CountCommonTicket"}, + {10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"}, + {11, &ETicket::ListCommonTicketRightsIds, "ListCommonTicketRightsIds"}, + {12, &ETicket::ListPersonalizedTicketRightsIds, "ListPersonalizedTicketRightsIds"}, + {13, nullptr, "ListMissingPersonalizedTicket"}, + {14, &ETicket::GetCommonTicketSize, "GetCommonTicketSize"}, + {15, &ETicket::GetPersonalizedTicketSize, "GetPersonalizedTicketSize"}, + {16, &ETicket::GetCommonTicketData, "GetCommonTicketData"}, + {17, &ETicket::GetPersonalizedTicketData, "GetPersonalizedTicketData"}, + {18, nullptr, "OwnTicket"}, + {19, nullptr, "GetTicketInfo"}, + {20, nullptr, "ListLightTicketInfo"}, + {21, nullptr, "SignData"}, + {22, nullptr, "GetCommonTicketAndCertificateSize"}, + {23, nullptr, "GetCommonTicketAndCertificateData"}, + {24, nullptr, "ImportPrepurchaseRecord"}, + {25, nullptr, "DeletePrepurchaseRecord"}, + {26, nullptr, "DeleteAllPrepurchaseRecord"}, + {27, nullptr, "CountPrepurchaseRecord"}, + {28, nullptr, "ListPrepurchaseRecordRightsIds"}, + {29, nullptr, "ListPrepurchaseRecordInfo"}, + {30, nullptr, "CountTicket"}, + {31, nullptr, "ListTicketRightsIds"}, + {32, nullptr, "CountPrepurchaseRecordEx"}, + {33, nullptr, "ListPrepurchaseRecordRightsIdsEx"}, + {34, nullptr, "GetEncryptedTicketSize"}, + {35, nullptr, "GetEncryptedTicketData"}, + {36, nullptr, "DeleteAllInactiveELicenseRequiredPersonalizedTicket"}, + {37, nullptr, "OwnTicket2"}, + {38, nullptr, "OwnTicket3"}, + {39, nullptr, "DeleteAllInactivePersonalizedTicket"}, + {40, nullptr, "DeletePrepurchaseRecordByNintendoAccountId"}, + {101, nullptr, "Unknown101"}, //18.0.0+ + {102, nullptr, "Unknown102"}, //18.0.0+ + {103, nullptr, "Unknown103"}, //18.0.0+ + {104, nullptr, "Unknown104"}, //18.0.0+ + {105, nullptr, "Unknown105"}, //20.0.0+ + {201, nullptr, "Unknown201"}, //18.0.0+ + {202, nullptr, "Unknown202"}, //18.0.0+ + {203, nullptr, "Unknown203"}, //18.0.0+ + {204, nullptr, "Unknown204"}, //18.0.0+ + {205, nullptr, "Unknown205"}, //18.0.0+ + {501, nullptr, "Unknown501"}, + {502, nullptr, "Unknown502"}, + {503, nullptr, "GetTitleKey"}, + {504, nullptr, "Unknown504"}, + {508, nullptr, "Unknown508"}, + {509, nullptr, "Unknown509"}, + {510, nullptr, "Unknown510"}, + {511, nullptr, "Unknown511"}, + {1001, nullptr, "Unknown1001"}, + {1002, nullptr, "Unknown1001"}, + {1003, nullptr, "Unknown1003"}, + {1004, nullptr, "Unknown1004"}, + {1005, nullptr, "Unknown1005"}, + {1006, nullptr, "Unknown1006"}, + {1007, nullptr, "Unknown1007"}, + {1009, nullptr, "Unknown1009"}, + {1010, nullptr, "Unknown1010"}, + {1011, nullptr, "Unknown1011"}, + {1012, nullptr, "Unknown1012"}, + {1013, nullptr, "Unknown1013"}, + {1014, nullptr, "Unknown1014"}, + {1015, nullptr, "Unknown1015"}, + {1016, nullptr, "Unknown1016"}, + {1017, nullptr, "Unknown1017"}, + {1018, nullptr, "Unknown1018"}, + {1019, nullptr, "Unknown1019"}, + {1020, nullptr, "Unknown1020"}, + {1021, nullptr, "Unknown1021"}, + {1501, nullptr, "Unknown1501"}, + {1502, nullptr, "Unknown1502"}, + {1503, nullptr, "Unknown1503"}, + {1504, nullptr, "Unknown1504"}, + {1505, nullptr, "Unknown1505"}, + {1506, nullptr, "Unknown1506"}, + {2000, nullptr, "Unknown2000"}, + {2001, nullptr, "Unknown2001"}, + {2002, nullptr, "Unknown2002"}, + {2003, nullptr, "Unknown2003"}, + {2100, nullptr, "Unknown2100"}, + {2501, nullptr, "Unknown2501"}, + {2502, nullptr, "Unknown2502"}, + {2601, nullptr, "Unknown2601"}, + {3001, nullptr, "Unknown3001"}, + {3002, nullptr, "Unknown3002"}, + }; + // clang-format on + RegisterHandlers(functions); + keys.PopulateTickets(); keys.SynthesizeTickets(); } - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - private: bool CheckRightsId(HLERequestContext& ctx, const u128& rights_id) { if (rights_id == u128{}) { @@ -221,185 +317,89 @@ private: rb.Push(write_size); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, &ETicket::ImportTicket, "ImportTicket"}, - FunctionInfo{2, nullptr, "ImportTicketCertificateSet"}, - FunctionInfo{3, nullptr, "DeleteTicket"}, - FunctionInfo{4, nullptr, "DeletePersonalizedTicket"}, - FunctionInfo{5, nullptr, "DeleteAllCommonTicket"}, - FunctionInfo{6, nullptr, "DeleteAllPersonalizedTicket"}, - FunctionInfo{7, nullptr, "DeleteAllPersonalizedTicketEx"}, - FunctionInfo{8, &ETicket::GetTitleKey, "GetTitleKey"}, - FunctionInfo{9, &ETicket::CountCommonTicket, "CountCommonTicket"}, - FunctionInfo{10, &ETicket::CountPersonalizedTicket, "CountPersonalizedTicket"}, - FunctionInfo{11, &ETicket::ListCommonTicketRightsIds, "ListCommonTicketRightsIds"}, - FunctionInfo{12, &ETicket::ListPersonalizedTicketRightsIds, "ListPersonalizedTicketRightsIds"}, - FunctionInfo{13, nullptr, "ListMissingPersonalizedTicket"}, - FunctionInfo{14, &ETicket::GetCommonTicketSize, "GetCommonTicketSize"}, - FunctionInfo{15, &ETicket::GetPersonalizedTicketSize, "GetPersonalizedTicketSize"}, - FunctionInfo{16, &ETicket::GetCommonTicketData, "GetCommonTicketData"}, - FunctionInfo{17, &ETicket::GetPersonalizedTicketData, "GetPersonalizedTicketData"}, - FunctionInfo{18, nullptr, "OwnTicket"}, - FunctionInfo{19, nullptr, "GetTicketInfo"}, - FunctionInfo{20, nullptr, "ListLightTicketInfo"}, - FunctionInfo{21, nullptr, "SignData"}, - FunctionInfo{22, nullptr, "GetCommonTicketAndCertificateSize"}, - FunctionInfo{23, nullptr, "GetCommonTicketAndCertificateData"}, - FunctionInfo{24, nullptr, "ImportPrepurchaseRecord"}, - FunctionInfo{25, nullptr, "DeletePrepurchaseRecord"}, - FunctionInfo{26, nullptr, "DeleteAllPrepurchaseRecord"}, - FunctionInfo{27, nullptr, "CountPrepurchaseRecord"}, - FunctionInfo{28, nullptr, "ListPrepurchaseRecordRightsIds"}, - FunctionInfo{29, nullptr, "ListPrepurchaseRecordInfo"}, - FunctionInfo{30, nullptr, "CountTicket"}, - FunctionInfo{31, nullptr, "ListTicketRightsIds"}, - FunctionInfo{32, nullptr, "CountPrepurchaseRecordEx"}, - FunctionInfo{33, nullptr, "ListPrepurchaseRecordRightsIdsEx"}, - FunctionInfo{34, nullptr, "GetEncryptedTicketSize"}, - FunctionInfo{35, nullptr, "GetEncryptedTicketData"}, - FunctionInfo{36, nullptr, "DeleteAllInactiveELicenseRequiredPersonalizedTicket"}, - FunctionInfo{37, nullptr, "OwnTicket2"}, - FunctionInfo{38, nullptr, "OwnTicket3"}, - FunctionInfo{39, nullptr, "DeleteAllInactivePersonalizedTicket"}, - FunctionInfo{40, nullptr, "DeletePrepurchaseRecordByNintendoAccountId"}, - FunctionInfo{101, nullptr, "Unknown101", MakeVersionGate({18,0,0})}, - FunctionInfo{102, nullptr, "Unknown102", MakeVersionGate({18,0,0})}, - FunctionInfo{103, nullptr, "Unknown103", MakeVersionGate({18,0,0})}, - FunctionInfo{104, nullptr, "Unknown104", MakeVersionGate({18,0,0})}, - FunctionInfo{105, nullptr, "Unknown105", MakeVersionGate({20,0,0})}, - FunctionInfo{201, nullptr, "Unknown201", MakeVersionGate({18,0,0})}, - FunctionInfo{202, nullptr, "Unknown202", MakeVersionGate({18,0,0})}, - FunctionInfo{203, nullptr, "Unknown203", MakeVersionGate({18,0,0})}, - FunctionInfo{204, nullptr, "Unknown204", MakeVersionGate({18,0,0})}, - FunctionInfo{205, nullptr, "Unknown205", MakeVersionGate({18,0,0})}, - FunctionInfo{501, nullptr, "Unknown501"}, - FunctionInfo{502, nullptr, "Unknown502"}, - FunctionInfo{503, nullptr, "GetTitleKey"}, - FunctionInfo{504, nullptr, "Unknown504"}, - FunctionInfo{508, nullptr, "Unknown508"}, - FunctionInfo{509, nullptr, "Unknown509"}, - FunctionInfo{510, nullptr, "Unknown510"}, - FunctionInfo{511, nullptr, "Unknown511"}, - FunctionInfo{1001, nullptr, "Unknown1001"}, - FunctionInfo{1002, nullptr, "Unknown1001"}, - FunctionInfo{1003, nullptr, "Unknown1003"}, - FunctionInfo{1004, nullptr, "Unknown1004"}, - FunctionInfo{1005, nullptr, "Unknown1005"}, - FunctionInfo{1006, nullptr, "Unknown1006"}, - FunctionInfo{1007, nullptr, "Unknown1007"}, - FunctionInfo{1009, nullptr, "Unknown1009"}, - FunctionInfo{1010, nullptr, "Unknown1010"}, - FunctionInfo{1011, nullptr, "Unknown1011"}, - FunctionInfo{1012, nullptr, "Unknown1012"}, - FunctionInfo{1013, nullptr, "Unknown1013"}, - FunctionInfo{1014, nullptr, "Unknown1014"}, - FunctionInfo{1015, nullptr, "Unknown1015"}, - FunctionInfo{1016, nullptr, "Unknown1016"}, - FunctionInfo{1017, nullptr, "Unknown1017"}, - FunctionInfo{1018, nullptr, "Unknown1018"}, - FunctionInfo{1019, nullptr, "Unknown1019"}, - FunctionInfo{1020, nullptr, "Unknown1020"}, - FunctionInfo{1021, nullptr, "Unknown1021"}, - FunctionInfo{1501, nullptr, "Unknown1501"}, - FunctionInfo{1502, nullptr, "Unknown1502"}, - FunctionInfo{1503, nullptr, "Unknown1503"}, - FunctionInfo{1504, nullptr, "Unknown1504"}, - FunctionInfo{1505, nullptr, "Unknown1505"}, - FunctionInfo{1506, nullptr, "Unknown1506"}, - FunctionInfo{2000, nullptr, "Unknown2000"}, - FunctionInfo{2001, nullptr, "Unknown2001"}, - FunctionInfo{2002, nullptr, "Unknown2002"}, - FunctionInfo{2003, nullptr, "Unknown2003"}, - FunctionInfo{2100, nullptr, "Unknown2100"}, - FunctionInfo{2501, nullptr, "Unknown2501"}, - FunctionInfo{2502, nullptr, "Unknown2502"}, - FunctionInfo{2601, nullptr, "Unknown2601"}, - FunctionInfo{3001, nullptr, "Unknown3001"}, - FunctionInfo{3002, nullptr, "Unknown3002"} - ); Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::Instance(); }; class NDRM_LU final : public ServiceFramework { public: explicit NDRM_LU(Core::System& system_) - : ServiceFramework{system_, "ndrm:lu"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, nullptr, "Cmd1"}, - FunctionInfo{2, nullptr, "Cmd2"}, - FunctionInfo{3, nullptr, "Cmd3"}, - FunctionInfo{1000, nullptr, "Cmd1000"}, - FunctionInfo{8000, nullptr, "Cmd8000"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "ndrm:lu"} { + // clang-format off + static const FunctionInfo functions[] = { + {1, nullptr, "Cmd1"}, + {2, nullptr, "Cmd2"}, + {3, nullptr, "Cmd3"}, + {1000, nullptr, "Cmd1000"}, + {8000, nullptr, "Cmd8000"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class NDRM_LA final : public ServiceFramework { public: explicit NDRM_LA(Core::System& system_) - : ServiceFramework{system_, "ndrm:la"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, nullptr, "Cmd1"}, - FunctionInfo{2, nullptr, "Cmd2"}, - FunctionInfo{3, nullptr, "Cmd3"}, - FunctionInfo{4, nullptr, "Cmd4"}, - FunctionInfo{5, nullptr, "Cmd5"}, - FunctionInfo{6, nullptr, "Cmd6"}, - FunctionInfo{7, nullptr, "Cmd7"}, - FunctionInfo{8, nullptr, "Cmd8"}, - FunctionInfo{9, nullptr, "Cmd9"}, - FunctionInfo{10, nullptr, "Cmd10"}, - FunctionInfo{11, nullptr, "Cmd11"}, - FunctionInfo{12, nullptr, "Cmd12"}, - FunctionInfo{13, nullptr, "Cmd13"}, - FunctionInfo{14, nullptr, "Cmd14"}, - FunctionInfo{15, nullptr, "Cmd15"}, - FunctionInfo{16, nullptr, "Cmd16"}, - FunctionInfo{17, nullptr, "Cmd17"}, - FunctionInfo{18, nullptr, "Cmd18"}, - FunctionInfo{19, nullptr, "Cmd19"}, - FunctionInfo{20, nullptr, "Cmd20"}, - FunctionInfo{21, nullptr, "Cmd21"}, - FunctionInfo{22, nullptr, "Cmd22"}, - FunctionInfo{23, nullptr, "Cmd23"}, - FunctionInfo{24, nullptr, "Cmd24"}, - FunctionInfo{25, nullptr, "Cmd25"}, - FunctionInfo{26, nullptr, "Cmd26"}, - FunctionInfo{27, nullptr, "Cmd27"}, - FunctionInfo{28, nullptr, "Cmd28"}, - FunctionInfo{29, nullptr, "Cmd29"}, - FunctionInfo{30, nullptr, "Cmd30"}, - FunctionInfo{31, nullptr, "Cmd31"}, - FunctionInfo{32, nullptr, "Cmd32"}, - FunctionInfo{33, nullptr, "Cmd33"}, - FunctionInfo{34, nullptr, "Cmd34"}, - FunctionInfo{35, nullptr, "Cmd35"}, - FunctionInfo{36, nullptr, "Cmd36"}, - FunctionInfo{37, nullptr, "Cmd37"}, - FunctionInfo{38, nullptr, "Cmd38"}, - FunctionInfo{39, nullptr, "Cmd39"}, - FunctionInfo{40, nullptr, "Cmd40"}, - FunctionInfo{42, nullptr, "Cmd42"}, - FunctionInfo{43, nullptr, "Cmd43"}, - FunctionInfo{44, nullptr, "Cmd44"}, - FunctionInfo{45, nullptr, "Cmd45"}, - FunctionInfo{46, nullptr, "Cmd46"}, - FunctionInfo{47, nullptr, "Cmd47"}, - FunctionInfo{48, nullptr, "Cmd48"}, - FunctionInfo{49, nullptr, "Cmd49"}, - FunctionInfo{50, nullptr, "Cmd50"}, - FunctionInfo{51, nullptr, "Cmd51"}, - FunctionInfo{8000, nullptr, "Cmd8000"}, - FunctionInfo{8001, nullptr, "Cmd8001"}, - FunctionInfo{8002, nullptr, "Cmd8002"}, - FunctionInfo{8003, nullptr, "Cmd8003"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "ndrm:la"} { + // clang-format off + static const FunctionInfo functions[] = { + {1, nullptr, "Cmd1"}, + {2, nullptr, "Cmd2"}, + {3, nullptr, "Cmd3"}, + {4, nullptr, "Cmd4"}, + {5, nullptr, "Cmd5"}, + {6, nullptr, "Cmd6"}, + {7, nullptr, "Cmd7"}, + {8, nullptr, "Cmd8"}, + {9, nullptr, "Cmd9"}, + {10, nullptr, "Cmd10"}, + {11, nullptr, "Cmd11"}, + {12, nullptr, "Cmd12"}, + {13, nullptr, "Cmd13"}, + {14, nullptr, "Cmd14"}, + {15, nullptr, "Cmd15"}, + {16, nullptr, "Cmd16"}, + {17, nullptr, "Cmd17"}, + {18, nullptr, "Cmd18"}, + {19, nullptr, "Cmd19"}, + {20, nullptr, "Cmd20"}, + {21, nullptr, "Cmd21"}, + {22, nullptr, "Cmd22"}, + {23, nullptr, "Cmd23"}, + {24, nullptr, "Cmd24"}, + {25, nullptr, "Cmd25"}, + {26, nullptr, "Cmd26"}, + {27, nullptr, "Cmd27"}, + {28, nullptr, "Cmd28"}, + {29, nullptr, "Cmd29"}, + {30, nullptr, "Cmd30"}, + {31, nullptr, "Cmd31"}, + {32, nullptr, "Cmd32"}, + {33, nullptr, "Cmd33"}, + {34, nullptr, "Cmd34"}, + {35, nullptr, "Cmd35"}, + {36, nullptr, "Cmd36"}, + {37, nullptr, "Cmd37"}, + {38, nullptr, "Cmd38"}, + {39, nullptr, "Cmd39"}, + {40, nullptr, "Cmd40"}, + {42, nullptr, "Cmd42"}, + {43, nullptr, "Cmd43"}, + {44, nullptr, "Cmd44"}, + {45, nullptr, "Cmd45"}, + {46, nullptr, "Cmd46"}, + {47, nullptr, "Cmd47"}, + {48, nullptr, "Cmd48"}, + {49, nullptr, "Cmd49"}, + {50, nullptr, "Cmd50"}, + {51, nullptr, "Cmd51"}, + {8000, nullptr, "Cmd8000"}, + {8001, nullptr, "Cmd8001"}, + {8002, nullptr, "Cmd8002"}, + {8003, nullptr, "Cmd8003"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/es/es.h b/src/core/hle/service/es/es.h index 3176806252..215aadb98f 100644 --- a/src/core/hle/service/es/es.h +++ b/src/core/hle/service/es/es.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/eupld/eupld.cpp b/src/core/hle/service/eupld/eupld.cpp index ed1e1c19c5..9b26ae9c83 100644 --- a/src/core/hle/service/eupld/eupld.cpp +++ b/src/core/hle/service/eupld/eupld.cpp @@ -14,34 +14,36 @@ namespace Service::EUPLD { class ErrorUploadContext final : public ServiceFramework { public: - explicit ErrorUploadContext(Core::System& system_) : ServiceFramework{system_, "eupld:c"} {} + explicit ErrorUploadContext(Core::System& system_) : ServiceFramework{system_, "eupld:c"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "SetUrl"}, + {1, nullptr, "ImportCrt"}, + {2, nullptr, "ImportPki"}, + {3, nullptr, "SetAutoUpload"}, + {4, nullptr, "GetAutoUpload"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SetUrl"}, - FunctionInfo{1, nullptr, "ImportCrt"}, - FunctionInfo{2, nullptr, "ImportPki"}, - FunctionInfo{3, nullptr, "SetAutoUpload"}, - FunctionInfo{4, nullptr, "GetAutoUpload"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class ErrorUploadRequest final : public ServiceFramework { public: - explicit ErrorUploadRequest(Core::System& system_) : ServiceFramework{system_, "eupld:r"} {} + explicit ErrorUploadRequest(Core::System& system_) : ServiceFramework{system_, "eupld:r"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Initialize"}, + {1, nullptr, "UploadAll"}, + {2, nullptr, "UploadSelected"}, + {3, nullptr, "GetUploadStatus"}, + {4, nullptr, "CancelUpload"}, + {5, nullptr, "GetResult"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Initialize"}, - FunctionInfo{1, nullptr, "UploadAll"}, - FunctionInfo{2, nullptr, "UploadSelected"}, - FunctionInfo{3, nullptr, "GetUploadStatus"}, - FunctionInfo{4, nullptr, "CancelUpload"}, - FunctionInfo{5, nullptr, "GetResult"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/eupld/eupld.h b/src/core/hle/service/eupld/eupld.h index 8eb0a5b4f2..851e286733 100644 --- a/src/core/hle/service/eupld/eupld.h +++ b/src/core/hle/service/eupld/eupld.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/fatal/fatal.cpp b/src/core/hle/service/fatal/fatal.cpp index 4c9eca5d5b..db48526614 100644 --- a/src/core/hle/service/fatal/fatal.cpp +++ b/src/core/hle/service/fatal/fatal.cpp @@ -13,6 +13,8 @@ #include "common/swap.h" #include "core/core.h" #include "core/hle/service/fatal/fatal.h" +#include "core/hle/service/fatal/fatal_p.h" +#include "core/hle/service/fatal/fatal_u.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/server_manager.h" #include "core/reporter.h" @@ -165,35 +167,6 @@ void Module::Interface::ThrowFatalWithCpuContext(HLERequestContext& ctx) { rb.Push(ResultSuccess); } -class Fatal_P final : public Module::Interface { -public: - explicit Fatal_P(std::shared_ptr module_, Core::System& system_) : Interface(std::move(module_), system_, "fatal:p") {} - ~Fatal_P() override = default; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetFatalEvent"}, - FunctionInfo{10, nullptr, "GetFatalContext"} - ); -}; - -class Fatal_U final : public Module::Interface { -public: - explicit Fatal_U(std::shared_ptr module_, Core::System& system_) : Interface(std::move(module_), system_, "fatal:u") {} - ~Fatal_U() override = default; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &Fatal_U::ThrowFatal, "ThrowFatal"}, - FunctionInfo{1, &Fatal_U::ThrowFatalWithPolicy, "ThrowFatalWithPolicy"}, - FunctionInfo{2, &Fatal_U::ThrowFatalWithCpuContext, "ThrowFatalWithCpuContext"} - ); -}; - void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); auto module = std::make_shared(); diff --git a/src/core/hle/service/fatal/fatal.h b/src/core/hle/service/fatal/fatal.h index f1c1104060..176ad8d0d9 100644 --- a/src/core/hle/service/fatal/fatal.h +++ b/src/core/hle/service/fatal/fatal.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/fatal/fatal_p.cpp b/src/core/hle/service/fatal/fatal_p.cpp new file mode 100644 index 0000000000..345743d6bc --- /dev/null +++ b/src/core/hle/service/fatal/fatal_p.cpp @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/fatal/fatal_p.h" + +namespace Service::Fatal { + +Fatal_P::Fatal_P(std::shared_ptr module_, Core::System& system_) + : Interface(std::move(module_), system_, "fatal:p") { + static const FunctionInfo functions[] = { + {0, nullptr, "GetFatalEvent"}, + {10, nullptr, "GetFatalContext"}, + }; + RegisterHandlers(functions); +} + +Fatal_P::~Fatal_P() = default; + +} // namespace Service::Fatal diff --git a/src/core/hle/service/fatal/fatal_p.h b/src/core/hle/service/fatal/fatal_p.h new file mode 100644 index 0000000000..ea2183c125 --- /dev/null +++ b/src/core/hle/service/fatal/fatal_p.h @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/fatal/fatal.h" + +namespace Service::Fatal { + +class Fatal_P final : public Module::Interface { +public: + explicit Fatal_P(std::shared_ptr module_, Core::System& system_); + ~Fatal_P() override; +}; + +} // namespace Service::Fatal diff --git a/src/core/hle/service/fatal/fatal_u.cpp b/src/core/hle/service/fatal/fatal_u.cpp new file mode 100644 index 0000000000..b2850c3e62 --- /dev/null +++ b/src/core/hle/service/fatal/fatal_u.cpp @@ -0,0 +1,23 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/fatal/fatal_u.h" + +namespace Service::Fatal { + +Fatal_U::Fatal_U(std::shared_ptr module_, Core::System& system_) + : Interface(std::move(module_), system_, "fatal:u") { + static const FunctionInfo functions[] = { + {0, &Fatal_U::ThrowFatal, "ThrowFatal"}, + {1, &Fatal_U::ThrowFatalWithPolicy, "ThrowFatalWithPolicy"}, + {2, &Fatal_U::ThrowFatalWithCpuContext, "ThrowFatalWithCpuContext"}, + }; + RegisterHandlers(functions); +} + +Fatal_U::~Fatal_U() = default; + +} // namespace Service::Fatal diff --git a/src/core/hle/service/fatal/fatal_u.h b/src/core/hle/service/fatal/fatal_u.h new file mode 100644 index 0000000000..4d193857d0 --- /dev/null +++ b/src/core/hle/service/fatal/fatal_u.h @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/fatal/fatal.h" + +namespace Service::Fatal { + +class Fatal_U final : public Module::Interface { +public: + explicit Fatal_U(std::shared_ptr module_, Core::System& system_); + ~Fatal_U() override; +}; + +} // namespace Service::Fatal diff --git a/src/core/hle/service/fgm/fgm.cpp b/src/core/hle/service/fgm/fgm.cpp index 96ea3478ea..cac03ae24c 100644 --- a/src/core/hle/service/fgm/fgm.cpp +++ b/src/core/hle/service/fgm/fgm.cpp @@ -16,26 +16,30 @@ namespace Service::FGM { class IRequest final : public ServiceFramework { public: - explicit IRequest(Core::System& system_) : ServiceFramework{system_, "IRequest"} {} + explicit IRequest(Core::System& system_) : ServiceFramework{system_, "IRequest"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Initialize"}, + {1, nullptr, "Set"}, + {2, nullptr, "Get"}, + {3, nullptr, "Cancel"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Initialize"}, - FunctionInfo{1, nullptr, "Set"}, - FunctionInfo{2, nullptr, "Get"}, - FunctionInfo{3, nullptr, "Cancel"} - ); }; class FGM final : public ServiceFramework { public: - explicit FGM(Core::System& system_, const char* name) : ServiceFramework{system_, name} {} + explicit FGM(Core::System& system_, const char* name) : ServiceFramework{system_, name} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &FGM::Initialize, "Initialize"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -46,25 +50,21 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &FGM::Initialize, "Initialize"} - ); }; class FGM_DBG final : public ServiceFramework { public: - explicit FGM_DBG(Core::System& system_) : ServiceFramework{system_, "fgm:dbg"} {} + explicit FGM_DBG(Core::System& system_) : ServiceFramework{system_, "fgm:dbg"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Initialize"}, + {1, nullptr, "Read"}, + {2, nullptr, "Cancel"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Initialize"}, - FunctionInfo{1, nullptr, "Read"}, - FunctionInfo{2, nullptr, "Cancel"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/fgm/fgm.h b/src/core/hle/service/fgm/fgm.h index 9d2465c0fb..89ef7096bb 100644 --- a/src/core/hle/service/fgm/fgm.h +++ b/src/core/hle/service/fgm/fgm.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp b/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp index 793b86cc51..c4e3c81f22 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_directory.cpp @@ -11,18 +11,15 @@ namespace Service::FileSystem { -std::optional IDirectory::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IDirectory::Read>, "Read"}, - FunctionInfo{1, D<&IDirectory::GetEntryCount>, "GetEntryCount"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IDirectory::IDirectory(Core::System& system_, FileSys::VirtualDir directory_, FileSys::OpenDirectoryMode mode) : ServiceFramework{system_, "IDirectory"}, backend(std::make_unique(directory_, mode)) { + static const FunctionInfo functions[] = { + {0, D<&IDirectory::Read>, "Read"}, + {1, D<&IDirectory::GetEntryCount>, "GetEntryCount"}, + }; + RegisterHandlers(functions); } Result IDirectory::Read( diff --git a/src/core/hle/service/filesystem/fsp/fs_i_directory.h b/src/core/hle/service/filesystem/fsp/fs_i_directory.h index f2a57260e1..79256604f3 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_directory.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_directory.h @@ -29,8 +29,6 @@ private: Result Read(Out out_count, const OutArray out_entries); Result GetEntryCount(Out out_count); - - std::optional FindRequest(u32 key) override; }; } // namespace Service::FileSystem diff --git a/src/core/hle/service/filesystem/fsp/fs_i_file.cpp b/src/core/hle/service/filesystem/fsp/fs_i_file.cpp index 78ca90a4af..22cbe2be2c 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_file.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_file.cpp @@ -12,6 +12,18 @@ namespace Service::FileSystem { IFile::IFile(Core::System& system_, FileSys::VirtualFile file_) : ServiceFramework{system_, "IFile"}, backend{std::make_unique(file_)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IFile::Read>, "Read"}, + {1, D<&IFile::Write>, "Write"}, + {2, D<&IFile::Flush>, "Flush"}, + {3, D<&IFile::SetSize>, "SetSize"}, + {4, D<&IFile::GetSize>, "GetSize"}, + {5, nullptr, "OperateRange"}, + {6, nullptr, "OperateRangeWithBuffer"}, + }; + // clang-format on + RegisterHandlers(functions); } Result IFile::Read( diff --git a/src/core/hle/service/filesystem/fsp/fs_i_file.h b/src/core/hle/service/filesystem/fsp/fs_i_file.h index 992330e149..14348f7fc6 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_file.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_file.h @@ -30,19 +30,6 @@ private: Result Flush(); Result SetSize(s64 size); Result GetSize(Out out_size); - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IFile::Read>, "Read"}, - FunctionInfo{1, D<&IFile::Write>, "Write"}, - FunctionInfo{2, D<&IFile::Flush>, "Flush"}, - FunctionInfo{3, D<&IFile::SetSize>, "SetSize"}, - FunctionInfo{4, D<&IFile::GetSize>, "GetSize"}, - FunctionInfo{5, nullptr, "OperateRange"}, - FunctionInfo{6, nullptr, "OperateRangeWithBuffer"} - ); }; } // namespace Service::FileSystem diff --git a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp index 6ab4916a36..edd381f57c 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.cpp @@ -13,33 +13,30 @@ namespace Service::FileSystem { -std::optional IFileSystem::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IFileSystem::CreateFile>, "CreateFile"}, - FunctionInfo{1, D<&IFileSystem::DeleteFile>, "DeleteFile"}, - FunctionInfo{2, D<&IFileSystem::CreateDirectory>, "CreateDirectory"}, - FunctionInfo{3, D<&IFileSystem::DeleteDirectory>, "DeleteDirectory"}, - FunctionInfo{4, D<&IFileSystem::DeleteDirectoryRecursively>, "DeleteDirectoryRecursively"}, - FunctionInfo{5, D<&IFileSystem::RenameFile>, "RenameFile"}, - FunctionInfo{6, D<&IFileSystem::RenameDirectory>, "RenameDirectory"}, - FunctionInfo{7, D<&IFileSystem::GetEntryType>, "GetEntryType"}, - FunctionInfo{8, D<&IFileSystem::OpenFile>, "OpenFile"}, - FunctionInfo{9, D<&IFileSystem::OpenDirectory>, "OpenDirectory"}, - FunctionInfo{10, D<&IFileSystem::Commit>, "Commit"}, - FunctionInfo{11, D<&IFileSystem::GetFreeSpaceSize>, "GetFreeSpaceSize"}, - FunctionInfo{12, D<&IFileSystem::GetTotalSpaceSize>, "GetTotalSpaceSize"}, - FunctionInfo{13, D<&IFileSystem::CleanDirectoryRecursively>, "CleanDirectoryRecursively"}, - FunctionInfo{14, D<&IFileSystem::GetFileTimeStampRaw>, "GetFileTimeStampRaw"}, - FunctionInfo{15, nullptr, "QueryEntry"}, - FunctionInfo{16, D<&IFileSystem::GetFileSystemAttribute>, "GetFileSystemAttribute"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IFileSystem::IFileSystem(Core::System& system_, FileSys::VirtualDir dir_, SizeGetter size_getter_) : ServiceFramework{system_, "IFileSystem"}, backend{std::make_unique( dir_)}, size_getter{std::move(size_getter_)} { + static const FunctionInfo functions[] = { + {0, D<&IFileSystem::CreateFile>, "CreateFile"}, + {1, D<&IFileSystem::DeleteFile>, "DeleteFile"}, + {2, D<&IFileSystem::CreateDirectory>, "CreateDirectory"}, + {3, D<&IFileSystem::DeleteDirectory>, "DeleteDirectory"}, + {4, D<&IFileSystem::DeleteDirectoryRecursively>, "DeleteDirectoryRecursively"}, + {5, D<&IFileSystem::RenameFile>, "RenameFile"}, + {6, D<&IFileSystem::RenameDirectory>, "RenameDirectory"}, + {7, D<&IFileSystem::GetEntryType>, "GetEntryType"}, + {8, D<&IFileSystem::OpenFile>, "OpenFile"}, + {9, D<&IFileSystem::OpenDirectory>, "OpenDirectory"}, + {10, D<&IFileSystem::Commit>, "Commit"}, + {11, D<&IFileSystem::GetFreeSpaceSize>, "GetFreeSpaceSize"}, + {12, D<&IFileSystem::GetTotalSpaceSize>, "GetTotalSpaceSize"}, + {13, D<&IFileSystem::CleanDirectoryRecursively>, "CleanDirectoryRecursively"}, + {14, D<&IFileSystem::GetFileTimeStampRaw>, "GetFileTimeStampRaw"}, + {15, nullptr, "QueryEntry"}, + {16, D<&IFileSystem::GetFileSystemAttribute>, "GetFileSystemAttribute"}, + }; + RegisterHandlers(functions); } Result IFileSystem::CreateFile(const InLargeData path, diff --git a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h index 11d3c7fb31..ed03c3ef83 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_filesystem.h @@ -58,7 +58,6 @@ public: Result GetFileSystemAttribute(Out out_attribute); private: - std::optional FindRequest(u32 key) override; std::unique_ptr backend; SizeGetter size_getter; }; diff --git a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp index f6eac6ca10..4af0a4ea2d 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.cpp @@ -12,6 +12,11 @@ namespace Service::FileSystem { IMultiCommitManager::IMultiCommitManager(Core::System& system_) : ServiceFramework{system_, "IMultiCommitManager"} { + static const FunctionInfo functions[] = { + {1, D<&IMultiCommitManager::Add>, "Add"}, + {2, D<&IMultiCommitManager::Commit>, "Commit"}, + }; + RegisterHandlers(functions); } IMultiCommitManager::~IMultiCommitManager() = default; diff --git a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h index 31182e9159..3ebeb2cb0a 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_multi_commit_manager.h @@ -20,13 +20,6 @@ private: Result Add(std::shared_ptr filesystem); Result Commit(); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, D<&IMultiCommitManager::Add>, "Add"}, - FunctionInfo{2, D<&IMultiCommitManager::Commit>, "Commit"} - ); FileSys::VirtualFile backend; }; diff --git a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp index 8353b72c24..0cac094caf 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.cpp @@ -17,6 +17,11 @@ ISaveDataInfoReader::ISaveDataInfoReader(Core::System& system_, FileSys::SaveDataSpaceId space) : ServiceFramework{system_, "ISaveDataInfoReader"}, save_data_controller{ save_data_controller_} { + static const FunctionInfo functions[] = { + {0, D<&ISaveDataInfoReader::ReadSaveDataInfo>, "ReadSaveDataInfo"}, + }; + RegisterHandlers(functions); + FindAllSaves(space); } diff --git a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h index 7faa4291c0..d2b8eb97cf 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_save_data_info_reader.h @@ -45,12 +45,6 @@ private: void FindNormalSaves(FileSys::SaveDataSpaceId space, const FileSys::VirtualDir& type); void FindTemporaryStorageSaves(FileSys::SaveDataSpaceId space, const FileSys::VirtualDir& type); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ISaveDataInfoReader::ReadSaveDataInfo>, "ReadSaveDataInfo"} - ); std::shared_ptr save_data_controller; std::vector info; u64 next_entry_index = 0; diff --git a/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp b/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp index ac884b3b28..50b7d1e765 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp @@ -12,6 +12,15 @@ namespace Service::FileSystem { IStorage::IStorage(Core::System& system_, FileSys::VirtualFile backend_) : ServiceFramework{system_, "IStorage"}, backend(std::move(backend_)) { + static const FunctionInfo functions[] = { + {0, D<&IStorage::Read>, "Read"}, + {1, nullptr, "Write"}, + {2, nullptr, "Flush"}, + {3, nullptr, "SetSize"}, + {4, D<&IStorage::GetSize>, "GetSize"}, + {5, nullptr, "OperateRange"}, + }; + RegisterHandlers(functions); } Result IStorage::Read( diff --git a/src/core/hle/service/filesystem/fsp/fs_i_storage.h b/src/core/hle/service/filesystem/fsp/fs_i_storage.h index 44d5a6c8bb..e676c52220 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_storage.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_storage.h @@ -18,23 +18,12 @@ public: explicit IStorage(Core::System& system_, FileSys::VirtualFile backend_); private: + FileSys::VirtualFile backend; + Result Read( OutBuffer out_bytes, s64 offset, s64 length); Result GetSize(Out out_size); - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IStorage::Read>, "Read"}, - FunctionInfo{1, nullptr, "Write"}, - FunctionInfo{2, nullptr, "Flush"}, - FunctionInfo{3, nullptr, "SetSize"}, - FunctionInfo{4, D<&IStorage::GetSize>, "GetSize"}, - FunctionInfo{5, nullptr, "OperateRange"} - ); - FileSys::VirtualFile backend; }; } // namespace Service::FileSystem diff --git a/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp b/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp index 1f83d6509b..1dcacb0231 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_ldr.cpp @@ -9,6 +9,15 @@ namespace Service::FileSystem { FSP_LDR::FSP_LDR(Core::System& system_) : ServiceFramework{system_, "fsp:ldr"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "OpenCodeFileSystem"}, + {1, nullptr, "IsArchivedProgram"}, + {2, nullptr, "SetCurrentProcess"}, + }; + // clang-format on + + RegisterHandlers(functions); } FSP_LDR::~FSP_LDR() = default; diff --git a/src/core/hle/service/filesystem/fsp/fsp_ldr.h b/src/core/hle/service/filesystem/fsp/fsp_ldr.h index fe3abeff1d..b642efe7ad 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_ldr.h +++ b/src/core/hle/service/filesystem/fsp/fsp_ldr.h @@ -18,15 +18,6 @@ class FSP_LDR final : public ServiceFramework { public: explicit FSP_LDR(Core::System& system_); ~FSP_LDR() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenCodeFileSystem"}, - FunctionInfo{1, nullptr, "IsArchivedProgram"}, - FunctionInfo{2, nullptr, "SetCurrentProcess"} - ); }; } // namespace Service::FileSystem diff --git a/src/core/hle/service/filesystem/fsp/fsp_pr.cpp b/src/core/hle/service/filesystem/fsp/fsp_pr.cpp index 9378e6e0c6..e7941ef9c9 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_pr.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_pr.cpp @@ -9,6 +9,16 @@ namespace Service::FileSystem { FSP_PR::FSP_PR(Core::System& system_) : ServiceFramework{system_, "fsp:pr"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RegisterProgram"}, + {1, nullptr, "UnregisterProgram"}, + {2, nullptr, "SetCurrentProcess"}, + {256, nullptr, "SetEnabledProgramVerification"}, + }; + // clang-format on + + RegisterHandlers(functions); } FSP_PR::~FSP_PR() = default; diff --git a/src/core/hle/service/filesystem/fsp/fsp_pr.h b/src/core/hle/service/filesystem/fsp/fsp_pr.h index bc692151a5..175a3c7a23 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_pr.h +++ b/src/core/hle/service/filesystem/fsp/fsp_pr.h @@ -18,16 +18,6 @@ class FSP_PR final : public ServiceFramework { public: explicit FSP_PR(Core::System& system_); ~FSP_PR() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RegisterProgram"}, - FunctionInfo{1, nullptr, "UnregisterProgram"}, - FunctionInfo{2, nullptr, "SetCurrentProcess"}, - FunctionInfo{256, nullptr, "SetEnabledProgramVerification"} - ); }; } // namespace Service::FileSystem diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp index cb349636d5..58303a0bd6 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp/fsp_srv.cpp @@ -47,142 +47,143 @@ namespace Service::FileSystem { -std::optional FSP_SRV::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenFileSystem"}, - FunctionInfo{1, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"}, - FunctionInfo{2, D<&FSP_SRV::OpenDataFileSystemByCurrentProcess>, "OpenDataFileSystemByCurrentProcess"}, - FunctionInfo{7, D<&FSP_SRV::OpenFileSystemWithPatch>, "OpenFileSystemWithPatch"}, - FunctionInfo{8, nullptr, "OpenFileSystemWithId"}, - FunctionInfo{9, nullptr, "OpenDataFileSystemByApplicationId"}, - FunctionInfo{11, nullptr, "OpenBisFileSystem"}, - FunctionInfo{12, nullptr, "OpenBisStorage"}, - FunctionInfo{13, nullptr, "InvalidateBisCache"}, - FunctionInfo{17, nullptr, "OpenHostFileSystem"}, - FunctionInfo{18, D<&FSP_SRV::OpenSdCardFileSystem>, "OpenSdCardFileSystem"}, - FunctionInfo{19, nullptr, "FormatSdCardFileSystem"}, - FunctionInfo{21, nullptr, "DeleteSaveDataFileSystem"}, - FunctionInfo{22, D<&FSP_SRV::CreateSaveDataFileSystem>, "CreateSaveDataFileSystem"}, - FunctionInfo{23, D<&FSP_SRV::CreateSaveDataFileSystemBySystemSaveDataId>, "CreateSaveDataFileSystemBySystemSaveDataId"}, - FunctionInfo{24, nullptr, "RegisterSaveDataFileSystemAtomicDeletion"}, - FunctionInfo{25, nullptr, "DeleteSaveDataFileSystemBySaveDataSpaceId"}, - FunctionInfo{26, nullptr, "FormatSdCardDryRun"}, - FunctionInfo{27, D<&FSP_SRV::IsExFatSupported>, "IsExFatSupported"}, - FunctionInfo{28, nullptr, "DeleteSaveDataFileSystemBySaveDataAttribute"}, - FunctionInfo{30, nullptr, "OpenGameCardStorage"}, - FunctionInfo{31, nullptr, "OpenGameCardFileSystem"}, - FunctionInfo{32, D<&FSP_SRV::ExtendSaveDataFileSystem>, "ExtendSaveDataFileSystem"}, - FunctionInfo{33, nullptr, "DeleteCacheStorage"}, - FunctionInfo{34, D<&FSP_SRV::GetCacheStorageSize>, "GetCacheStorageSize"}, - FunctionInfo{35, nullptr, "CreateSaveDataFileSystemByHashSalt"}, - FunctionInfo{36, nullptr, "OpenHostFileSystemWithOption"}, - FunctionInfo{37, D<&FSP_SRV::CreateSaveDataFileSystemWithCreationInfo2>, "CreateSaveDataFileSystemWithCreationInfo2"}, - FunctionInfo{51, D<&FSP_SRV::OpenSaveDataFileSystem>, "OpenSaveDataFileSystem"}, - FunctionInfo{52, D<&FSP_SRV::OpenSaveDataFileSystemBySystemSaveDataId>, "OpenSaveDataFileSystemBySystemSaveDataId"}, - FunctionInfo{53, D<&FSP_SRV::OpenReadOnlySaveDataFileSystem>, "OpenReadOnlySaveDataFileSystem"}, - FunctionInfo{57, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataSpaceId>, "ReadSaveDataFileSystemExtraDataBySaveDataSpaceId"}, - FunctionInfo{58, D<&FSP_SRV::ReadSaveDataFileSystemExtraData>, "ReadSaveDataFileSystemExtraData"}, - FunctionInfo{59, D<&FSP_SRV::WriteSaveDataFileSystemExtraData>, "WriteSaveDataFileSystemExtraData"}, - FunctionInfo{60, nullptr, "OpenSaveDataInfoReader"}, - FunctionInfo{61, D<&FSP_SRV::OpenSaveDataInfoReaderBySaveDataSpaceId>, "OpenSaveDataInfoReaderBySaveDataSpaceId"}, - FunctionInfo{62, D<&FSP_SRV::OpenSaveDataInfoReaderOnlyCacheStorage>, "OpenSaveDataInfoReaderOnlyCacheStorage"}, - FunctionInfo{64, nullptr, "OpenSaveDataInternalStorageFileSystem"}, - FunctionInfo{65, nullptr, "UpdateSaveDataMacForDebug"}, - FunctionInfo{66, nullptr, "WriteSaveDataFileSystemExtraData2"}, - FunctionInfo{67, D<&FSP_SRV::FindSaveDataWithFilter>, "FindSaveDataWithFilter"}, - FunctionInfo{68, nullptr, "OpenSaveDataInfoReaderBySaveDataFilter"}, - FunctionInfo{69, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataBySaveDataAttribute"}, - FunctionInfo{70, D<&FSP_SRV::WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"}, - FunctionInfo{71, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"}, - FunctionInfo{80, nullptr, "OpenSaveDataMetaFile"}, - FunctionInfo{81, nullptr, "OpenSaveDataTransferManager"}, - FunctionInfo{82, nullptr, "OpenSaveDataTransferManagerVersion2"}, - FunctionInfo{83, D<&FSP_SRV::OpenSaveDataTransferProhibiter>, "OpenSaveDataTransferProhibiter"}, - FunctionInfo{84, nullptr, "ListApplicationAccessibleSaveDataOwnerId"}, - FunctionInfo{85, nullptr, "OpenSaveDataTransferManagerForSaveDataRepair"}, - FunctionInfo{86, nullptr, "OpenSaveDataMover"}, - FunctionInfo{87, nullptr, "OpenSaveDataTransferManagerForRepair"}, - FunctionInfo{100, nullptr, "OpenImageDirectoryFileSystem"}, - FunctionInfo{101, nullptr, "OpenBaseFileSystem"}, - FunctionInfo{102, nullptr, "FormatBaseFileSystem"}, - FunctionInfo{110, nullptr, "OpenContentStorageFileSystem"}, - FunctionInfo{120, nullptr, "OpenCloudBackupWorkStorageFileSystem"}, - FunctionInfo{130, nullptr, "OpenCustomStorageFileSystem"}, - FunctionInfo{200, D<&FSP_SRV::OpenDataStorageByCurrentProcess>, "OpenDataStorageByCurrentProcess"}, - FunctionInfo{201, nullptr, "OpenDataStorageByProgramId"}, - FunctionInfo{202, D<&FSP_SRV::OpenDataStorageByDataId>, "OpenDataStorageByDataId"}, - FunctionInfo{203, D<&FSP_SRV::OpenPatchDataStorageByCurrentProcess>, "OpenPatchDataStorageByCurrentProcess"}, - FunctionInfo{204, nullptr, "OpenDataFileSystemByProgramIndex"}, - FunctionInfo{205, D<&FSP_SRV::OpenDataStorageWithProgramIndex>, "OpenDataStorageWithProgramIndex"}, - FunctionInfo{206, nullptr, "OpenDataStorageByPath"}, - FunctionInfo{210, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"}, - FunctionInfo{400, nullptr, "OpenDeviceOperator"}, - FunctionInfo{500, nullptr, "OpenSdCardDetectionEventNotifier"}, - FunctionInfo{501, nullptr, "OpenGameCardDetectionEventNotifier"}, - FunctionInfo{510, nullptr, "OpenSystemDataUpdateEventNotifier"}, - FunctionInfo{511, nullptr, "NotifySystemDataUpdateEvent"}, - FunctionInfo{520, nullptr, "SimulateGameCardDetectionEvent"}, - FunctionInfo{600, nullptr, "SetCurrentPosixTime"}, - FunctionInfo{601, nullptr, "QuerySaveDataTotalSize"}, - FunctionInfo{602, nullptr, "VerifySaveDataFileSystem"}, - FunctionInfo{603, nullptr, "CorruptSaveDataFileSystem"}, - FunctionInfo{604, nullptr, "CreatePaddingFile"}, - FunctionInfo{605, nullptr, "DeleteAllPaddingFiles"}, - FunctionInfo{606, nullptr, "GetRightsId"}, - FunctionInfo{607, nullptr, "RegisterExternalKey"}, - FunctionInfo{608, nullptr, "UnregisterAllExternalKey"}, - FunctionInfo{609, nullptr, "GetRightsIdByPath"}, - FunctionInfo{610, nullptr, "GetRightsIdAndKeyGenerationByPath"}, - FunctionInfo{611, nullptr, "SetCurrentPosixTimeWithTimeDifference"}, - FunctionInfo{612, nullptr, "GetFreeSpaceSizeForSaveData"}, - FunctionInfo{613, nullptr, "VerifySaveDataFileSystemBySaveDataSpaceId"}, - FunctionInfo{614, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId"}, - FunctionInfo{615, nullptr, "QuerySaveDataInternalStorageTotalSize"}, - FunctionInfo{616, nullptr, "GetSaveDataCommitId"}, - FunctionInfo{617, nullptr, "UnregisterExternalKey"}, - FunctionInfo{620, nullptr, "SetSdCardEncryptionSeed"}, - FunctionInfo{630, nullptr, "SetSdCardAccessibility"}, - FunctionInfo{631, D<&FSP_SRV::IsSdCardAccessible>, "IsSdCardAccessible"}, - FunctionInfo{640, nullptr, "IsSignedSystemPartitionOnSdCardValid"}, - FunctionInfo{700, nullptr, "OpenAccessFailureResolver"}, - FunctionInfo{701, nullptr, "GetAccessFailureDetectionEvent"}, - FunctionInfo{702, nullptr, "IsAccessFailureDetected"}, - FunctionInfo{710, nullptr, "ResolveAccessFailure"}, - FunctionInfo{720, nullptr, "AbandonAccessFailure"}, - FunctionInfo{800, nullptr, "GetAndClearFileSystemProxyErrorInfo"}, - FunctionInfo{810, nullptr, "RegisterProgramIndexMapInfo"}, - FunctionInfo{820, nullptr, "GetContentStorageInfoIndex"}, - FunctionInfo{830, nullptr, "EncryptStreamPlaySaveData"}, - FunctionInfo{831, nullptr, "DecryptStreamPlaySaveData"}, - FunctionInfo{1000, nullptr, "SetBisRootForHost"}, - FunctionInfo{1001, nullptr, "SetSaveDataSize"}, - FunctionInfo{1002, nullptr, "SetSaveDataRootPath"}, - FunctionInfo{1003, D<&FSP_SRV::DisableAutoSaveDataCreation>, "DisableAutoSaveDataCreation"}, - FunctionInfo{1004, D<&FSP_SRV::SetGlobalAccessLogMode>, "SetGlobalAccessLogMode"}, - FunctionInfo{1005, D<&FSP_SRV::GetGlobalAccessLogMode>, "GetGlobalAccessLogMode"}, - FunctionInfo{1006, D<&FSP_SRV::OutputAccessLogToSdCard>, "OutputAccessLogToSdCard"}, - FunctionInfo{1007, nullptr, "RegisterUpdatePartition"}, - FunctionInfo{1008, nullptr, "OpenRegisteredUpdatePartition"}, - FunctionInfo{1009, nullptr, "GetAndClearMemoryReportInfo"}, - FunctionInfo{1010, nullptr, "SetDataStorageRedirectTarget"}, - FunctionInfo{1011, D<&FSP_SRV::GetProgramIndexForAccessLog>, "GetProgramIndexForAccessLog"}, - FunctionInfo{1012, nullptr, "GetFsStackUsage"}, - FunctionInfo{1013, nullptr, "UnsetSaveDataRootPath"}, - FunctionInfo{1014, nullptr, "OutputMultiProgramTagAccessLog"}, - FunctionInfo{1016, D<&FSP_SRV::FlushAccessLogOnSdCard>, "FlushAccessLogOnSdCard"}, - FunctionInfo{1017, nullptr, "OutputApplicationInfoAccessLog"}, - FunctionInfo{1018, nullptr, "SetDebugOption"}, - FunctionInfo{1019, nullptr, "UnsetDebugOption"}, - FunctionInfo{1100, nullptr, "OverrideSaveDataTransferTokenSignVerificationKey"}, - FunctionInfo{1110, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId2"}, - FunctionInfo{1200, D<&FSP_SRV::OpenMultiCommitManager>, "OpenMultiCommitManager"}, - FunctionInfo{1300, nullptr, "OpenBisWiper"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - FSP_SRV::FSP_SRV(Core::System& system_) - : ServiceFramework{system_, "fsp-srv"}, fsc{system.GetFileSystemController()}, content_provider{system.GetContentProvider()}, reporter{system.GetReporter()} { + : ServiceFramework{system_, "fsp-srv"}, fsc{system.GetFileSystemController()}, + content_provider{system.GetContentProvider()}, reporter{system.GetReporter()} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "OpenFileSystem"}, + {1, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"}, + {2, D<&FSP_SRV::OpenDataFileSystemByCurrentProcess>, "OpenDataFileSystemByCurrentProcess"}, + {7, D<&FSP_SRV::OpenFileSystemWithPatch>, "OpenFileSystemWithPatch"}, + {8, nullptr, "OpenFileSystemWithId"}, + {9, nullptr, "OpenDataFileSystemByApplicationId"}, + {11, nullptr, "OpenBisFileSystem"}, + {12, nullptr, "OpenBisStorage"}, + {13, nullptr, "InvalidateBisCache"}, + {17, nullptr, "OpenHostFileSystem"}, + {18, D<&FSP_SRV::OpenSdCardFileSystem>, "OpenSdCardFileSystem"}, + {19, nullptr, "FormatSdCardFileSystem"}, + {21, nullptr, "DeleteSaveDataFileSystem"}, + {22, D<&FSP_SRV::CreateSaveDataFileSystem>, "CreateSaveDataFileSystem"}, + {23, D<&FSP_SRV::CreateSaveDataFileSystemBySystemSaveDataId>, "CreateSaveDataFileSystemBySystemSaveDataId"}, + {24, nullptr, "RegisterSaveDataFileSystemAtomicDeletion"}, + {25, nullptr, "DeleteSaveDataFileSystemBySaveDataSpaceId"}, + {26, nullptr, "FormatSdCardDryRun"}, + {27, D<&FSP_SRV::IsExFatSupported>, "IsExFatSupported"}, + {28, nullptr, "DeleteSaveDataFileSystemBySaveDataAttribute"}, + {30, nullptr, "OpenGameCardStorage"}, + {31, nullptr, "OpenGameCardFileSystem"}, + {32, D<&FSP_SRV::ExtendSaveDataFileSystem>, "ExtendSaveDataFileSystem"}, + {33, nullptr, "DeleteCacheStorage"}, + {34, D<&FSP_SRV::GetCacheStorageSize>, "GetCacheStorageSize"}, + {35, nullptr, "CreateSaveDataFileSystemByHashSalt"}, + {36, nullptr, "OpenHostFileSystemWithOption"}, + {37, D<&FSP_SRV::CreateSaveDataFileSystemWithCreationInfo2>, "CreateSaveDataFileSystemWithCreationInfo2"}, + {51, D<&FSP_SRV::OpenSaveDataFileSystem>, "OpenSaveDataFileSystem"}, + {52, D<&FSP_SRV::OpenSaveDataFileSystemBySystemSaveDataId>, "OpenSaveDataFileSystemBySystemSaveDataId"}, + {53, D<&FSP_SRV::OpenReadOnlySaveDataFileSystem>, "OpenReadOnlySaveDataFileSystem"}, + {57, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataSpaceId>, "ReadSaveDataFileSystemExtraDataBySaveDataSpaceId"}, + {58, D<&FSP_SRV::ReadSaveDataFileSystemExtraData>, "ReadSaveDataFileSystemExtraData"}, + {59, D<&FSP_SRV::WriteSaveDataFileSystemExtraData>, "WriteSaveDataFileSystemExtraData"}, + {60, nullptr, "OpenSaveDataInfoReader"}, + {61, D<&FSP_SRV::OpenSaveDataInfoReaderBySaveDataSpaceId>, "OpenSaveDataInfoReaderBySaveDataSpaceId"}, + {62, D<&FSP_SRV::OpenSaveDataInfoReaderOnlyCacheStorage>, "OpenSaveDataInfoReaderOnlyCacheStorage"}, + {64, nullptr, "OpenSaveDataInternalStorageFileSystem"}, + {65, nullptr, "UpdateSaveDataMacForDebug"}, + {66, nullptr, "WriteSaveDataFileSystemExtraData2"}, + {67, D<&FSP_SRV::FindSaveDataWithFilter>, "FindSaveDataWithFilter"}, + {68, nullptr, "OpenSaveDataInfoReaderBySaveDataFilter"}, + {69, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataBySaveDataAttribute"}, + {70, D<&FSP_SRV::WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"}, + {71, D<&FSP_SRV::ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute>, "ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute"}, + {80, nullptr, "OpenSaveDataMetaFile"}, + {81, nullptr, "OpenSaveDataTransferManager"}, + {82, nullptr, "OpenSaveDataTransferManagerVersion2"}, + {83, D<&FSP_SRV::OpenSaveDataTransferProhibiter>, "OpenSaveDataTransferProhibiter"}, + {84, nullptr, "ListApplicationAccessibleSaveDataOwnerId"}, + {85, nullptr, "OpenSaveDataTransferManagerForSaveDataRepair"}, + {86, nullptr, "OpenSaveDataMover"}, + {87, nullptr, "OpenSaveDataTransferManagerForRepair"}, + {100, nullptr, "OpenImageDirectoryFileSystem"}, + {101, nullptr, "OpenBaseFileSystem"}, + {102, nullptr, "FormatBaseFileSystem"}, + {110, nullptr, "OpenContentStorageFileSystem"}, + {120, nullptr, "OpenCloudBackupWorkStorageFileSystem"}, + {130, nullptr, "OpenCustomStorageFileSystem"}, + {200, D<&FSP_SRV::OpenDataStorageByCurrentProcess>, "OpenDataStorageByCurrentProcess"}, + {201, nullptr, "OpenDataStorageByProgramId"}, + {202, D<&FSP_SRV::OpenDataStorageByDataId>, "OpenDataStorageByDataId"}, + {203, D<&FSP_SRV::OpenPatchDataStorageByCurrentProcess>, "OpenPatchDataStorageByCurrentProcess"}, + {204, nullptr, "OpenDataFileSystemByProgramIndex"}, + {205, D<&FSP_SRV::OpenDataStorageWithProgramIndex>, "OpenDataStorageWithProgramIndex"}, + {206, nullptr, "OpenDataStorageByPath"}, + {210, D<&FSP_SRV::SetCurrentProcess>, "SetCurrentProcess"}, + {400, nullptr, "OpenDeviceOperator"}, + {500, nullptr, "OpenSdCardDetectionEventNotifier"}, + {501, nullptr, "OpenGameCardDetectionEventNotifier"}, + {510, nullptr, "OpenSystemDataUpdateEventNotifier"}, + {511, nullptr, "NotifySystemDataUpdateEvent"}, + {520, nullptr, "SimulateGameCardDetectionEvent"}, + {600, nullptr, "SetCurrentPosixTime"}, + {601, nullptr, "QuerySaveDataTotalSize"}, + {602, nullptr, "VerifySaveDataFileSystem"}, + {603, nullptr, "CorruptSaveDataFileSystem"}, + {604, nullptr, "CreatePaddingFile"}, + {605, nullptr, "DeleteAllPaddingFiles"}, + {606, nullptr, "GetRightsId"}, + {607, nullptr, "RegisterExternalKey"}, + {608, nullptr, "UnregisterAllExternalKey"}, + {609, nullptr, "GetRightsIdByPath"}, + {610, nullptr, "GetRightsIdAndKeyGenerationByPath"}, + {611, nullptr, "SetCurrentPosixTimeWithTimeDifference"}, + {612, nullptr, "GetFreeSpaceSizeForSaveData"}, + {613, nullptr, "VerifySaveDataFileSystemBySaveDataSpaceId"}, + {614, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId"}, + {615, nullptr, "QuerySaveDataInternalStorageTotalSize"}, + {616, nullptr, "GetSaveDataCommitId"}, + {617, nullptr, "UnregisterExternalKey"}, + {620, nullptr, "SetSdCardEncryptionSeed"}, + {630, nullptr, "SetSdCardAccessibility"}, + {631, D<&FSP_SRV::IsSdCardAccessible>, "IsSdCardAccessible"}, + {640, nullptr, "IsSignedSystemPartitionOnSdCardValid"}, + {700, nullptr, "OpenAccessFailureResolver"}, + {701, nullptr, "GetAccessFailureDetectionEvent"}, + {702, nullptr, "IsAccessFailureDetected"}, + {710, nullptr, "ResolveAccessFailure"}, + {720, nullptr, "AbandonAccessFailure"}, + {800, nullptr, "GetAndClearFileSystemProxyErrorInfo"}, + {810, nullptr, "RegisterProgramIndexMapInfo"}, + {820, nullptr, "GetContentStorageInfoIndex"}, + {830, nullptr, "EncryptStreamPlaySaveData"}, + {831, nullptr, "DecryptStreamPlaySaveData"}, + {1000, nullptr, "SetBisRootForHost"}, + {1001, nullptr, "SetSaveDataSize"}, + {1002, nullptr, "SetSaveDataRootPath"}, + {1003, D<&FSP_SRV::DisableAutoSaveDataCreation>, "DisableAutoSaveDataCreation"}, + {1004, D<&FSP_SRV::SetGlobalAccessLogMode>, "SetGlobalAccessLogMode"}, + {1005, D<&FSP_SRV::GetGlobalAccessLogMode>, "GetGlobalAccessLogMode"}, + {1006, D<&FSP_SRV::OutputAccessLogToSdCard>, "OutputAccessLogToSdCard"}, + {1007, nullptr, "RegisterUpdatePartition"}, + {1008, nullptr, "OpenRegisteredUpdatePartition"}, + {1009, nullptr, "GetAndClearMemoryReportInfo"}, + {1010, nullptr, "SetDataStorageRedirectTarget"}, + {1011, D<&FSP_SRV::GetProgramIndexForAccessLog>, "GetProgramIndexForAccessLog"}, + {1012, nullptr, "GetFsStackUsage"}, + {1013, nullptr, "UnsetSaveDataRootPath"}, + {1014, nullptr, "OutputMultiProgramTagAccessLog"}, + {1016, D<&FSP_SRV::FlushAccessLogOnSdCard>, "FlushAccessLogOnSdCard"}, + {1017, nullptr, "OutputApplicationInfoAccessLog"}, + {1018, nullptr, "SetDebugOption"}, + {1019, nullptr, "UnsetDebugOption"}, + {1100, nullptr, "OverrideSaveDataTransferTokenSignVerificationKey"}, + {1110, nullptr, "CorruptSaveDataFileSystemBySaveDataSpaceId2"}, + {1200, D<&FSP_SRV::OpenMultiCommitManager>, "OpenMultiCommitManager"}, + {1300, nullptr, "OpenBisWiper"}, + }; + // clang-format on + RegisterHandlers(functions); + if (Settings::values.enable_fs_access_log) { access_log_mode = AccessLogMode::SdCard; } diff --git a/src/core/hle/service/filesystem/fsp/fsp_srv.h b/src/core/hle/service/filesystem/fsp/fsp_srv.h index ebda008bcc..156cf4e571 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_srv.h +++ b/src/core/hle/service/filesystem/fsp/fsp_srv.h @@ -115,7 +115,6 @@ private: s64 available_size, s64 journal_size); Result GetCacheStorageSize(s32 index, Out out_data_size, Out out_journal_size); - std::optional FindRequest(u32 key) override; FileSystemController& fsc; const FileSys::ContentProvider& content_provider; const Core::Reporter& reporter; diff --git a/src/core/hle/service/filesystem/fsp/fsp_types.h b/src/core/hle/service/filesystem/fsp/fsp_types.h index 294da6a2de..c704203ad1 100644 --- a/src/core/hle/service/filesystem/fsp/fsp_types.h +++ b/src/core/hle/service/filesystem/fsp/fsp_types.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.cpp b/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.cpp index d8d6289fe1..f4c218db8d 100644 --- a/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.cpp +++ b/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.h b/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.h index d206e1dea4..6141bae18c 100644 --- a/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.h +++ b/src/core/hle/service/filesystem/fsp/save_data_transfer_prohibiter.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/filesystem/romfs_controller.cpp b/src/core/hle/service/filesystem/romfs_controller.cpp index 19c9cec722..9725d02f4b 100644 --- a/src/core/hle/service/filesystem/romfs_controller.cpp +++ b/src/core/hle/service/filesystem/romfs_controller.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/filesystem/romfs_controller.h b/src/core/hle/service/filesystem/romfs_controller.h index 3c3ead344c..5471e136c3 100644 --- a/src/core/hle/service/filesystem/romfs_controller.h +++ b/src/core/hle/service/filesystem/romfs_controller.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/filesystem/save_data_controller.cpp b/src/core/hle/service/filesystem/save_data_controller.cpp index 8720681d17..d3e22b1552 100644 --- a/src/core/hle/service/filesystem/save_data_controller.cpp +++ b/src/core/hle/service/filesystem/save_data_controller.cpp @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/core/hle/service/filesystem/save_data_controller.h b/src/core/hle/service/filesystem/save_data_controller.h index dc9d713dfb..afb95cb949 100644 --- a/src/core/hle/service/filesystem/save_data_controller.h +++ b/src/core/hle/service/filesystem/save_data_controller.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/friend/friend.cpp b/src/core/hle/service/friend/friend.cpp index 5480d22b83..f8690dbb8b 100644 --- a/src/core/hle/service/friend/friend.cpp +++ b/src/core/hle/service/friend/friend.cpp @@ -11,36 +11,137 @@ #include "core/hle/kernel/k_event.h" #include "core/hle/service/acc/errors.h" #include "core/hle/service/friend/friend.h" +#include "core/hle/service/friend/friend_interface.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/kernel_helpers.h" #include "core/hle/service/server_manager.h" namespace Service::Friend { -class Friend final : public Module::Interface { -public: - explicit Friend(std::shared_ptr module_, Core::System& system_, const char* name) : Interface(std::move(module_), system_, name) {} - ~Friend() override = default; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &Friend::CreateFriendService, "CreateFriendService"}, - FunctionInfo{1, &Friend::CreateNotificationService, "CreateNotificationService"}, - FunctionInfo{2, nullptr, "CreateDaemonSuspendSessionService"} - ); -}; - class IFriendService final : public ServiceFramework { public: explicit IFriendService(Core::System& system_) : ServiceFramework{system_, "IFriendService"}, service_context{system, "IFriendService"} { - completion_event = service_context.CreateEvent("IFriendService:CompletionEvent"); - } + // clang-format off + static const FunctionInfo functions[] = { + {0, &IFriendService::GetCompletionEvent, "GetCompletionEvent"}, + {1, &IFriendService::Cancel, "Cancel"}, + {10100, nullptr, "GetFriendListIds"}, + {10101, &IFriendService::GetFriendList, "GetFriendList"}, + {10102, nullptr, "UpdateFriendInfo"}, + {10110, nullptr, "GetFriendProfileImage"}, + {10111, nullptr, "GetFriendProfileImageWithImageSize"}, // 18.0.0+ + {10120, &IFriendService::CheckFriendListAvailability, "CheckFriendListAvailability"}, + {10121, nullptr, "EnsureFriendListAvailable"}, + {10200, nullptr, "SendFriendRequestForApplication"}, + {10211, nullptr, "AddFacedFriendRequestForApplication"}, + {10400, &IFriendService::GetBlockedUserListIds, "GetBlockedUserListIds"}, + {10420, &IFriendService::CheckBlockedUserListAvailability, "CheckBlockedUserListAvailability"}, + {10421, nullptr, "EnsureBlockedUserListAvailable"}, + {10500, nullptr, "GetProfileList"}, + {10501, nullptr, "GetProfileListV2"}, // 18.0.0+ + {10600, nullptr, "DeclareOpenOnlinePlaySession"}, + {10601, &IFriendService::DeclareCloseOnlinePlaySession, "DeclareCloseOnlinePlaySession"}, + {10610, &IFriendService::UpdateUserPresence, "UpdateUserPresence"}, + {10700, &IFriendService::GetPlayHistoryRegistrationKey, "GetPlayHistoryRegistrationKey"}, + {10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"}, + {10702, nullptr, "AddPlayHistory"}, + {11000, nullptr, "GetProfileImageUrl"}, + {11001, nullptr, "GetProfileImageUrlV2"}, // 18.0.0+ + {20100, &IFriendService::GetFriendCount, "GetFriendCount"}, + {20101, &IFriendService::GetNewlyFriendCount, "GetNewlyFriendCount"}, + {20102, nullptr, "GetFriendDetailedInfo"}, + {20103, nullptr, "SyncFriendList"}, + {20104, &IFriendService::RequestSyncFriendList, "RequestSyncFriendList"}, + {20105, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV1"}, + {20106, nullptr, "UpdateFriendInfoForViewerV1"}, + {20107, nullptr, "GetFriendDetailedInfoV2"}, // 20.0.0+ + {20108, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV2"}, // 22.0.0+ + {20109, nullptr, "UpdateFriendInfoForViewerV2"}, // 22.0.0+ + {20110, nullptr, "LoadFriendSettingV1"}, + {20111, nullptr, "LoadFriendSettingV2"}, // 22.0.0+ + {20200, &IFriendService::GetReceivedFriendRequestCount, "GetReceivedFriendRequestCount"}, + {20201, nullptr, "GetFriendRequestListV1"}, + {20202, nullptr, "GetFriendRequestListV2"}, // 20.0.0+ + {20203, nullptr, "GetFriendRequestReceivedNotificationCount"}, // 22.0.0+ + {20300, nullptr, "GetFriendCandidateList"}, + {20301, nullptr, "GetNintendoNetworkIdInfo"}, + {20302, nullptr, "GetSnsAccountLinkage"}, // 5.0.0-19.0.1 + {20303, nullptr, "GetSnsAccountProfile"}, // 5.0.0-19.0.1 + {20304, nullptr, "GetSnsAccountFriendList"}, // 5.0.0-19.0.1 + {20400, nullptr, "GetBlockedUserListV1"}, + {20401, nullptr, "SyncBlockedUserList"}, + {20402, nullptr, "GetBlockedUserListV2"}, // 20.0.0+ + {20500, nullptr, "GetProfileExtraListV1"}, + {20501, nullptr, "GetRelationship"}, + {20502, nullptr, "GetProfileExtraListV2"}, // 19.0.0+ + {20600, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV1"}, + {20601, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV2"}, // 19.0.0+ + {20700, nullptr, "GetPlayHistoryListV1"}, + {20701, &IFriendService::GetPlayHistoryStatistics, "GetPlayHistoryStatistics"}, + {20702, nullptr, "GetPlayHistoryListV2"}, // 19.0.0+ + {20800, &IFriendService::LoadUserSetting, "LoadUserSettingV1"}, + {20801, nullptr, "SyncUserSetting"}, + {20802, &IFriendService::LoadUserSetting, "LoadUserSettingV2"}, // 19.0.0+ + {20900, &IFriendService::RequestListSummaryOverlayNotification, "RequestListSummaryOverlayNotification"}, + {21000, nullptr, "GetExternalApplicationCatalog"}, + {22000, nullptr, "GetReceivedFriendInvitationListV1"}, + {22001, nullptr, "GetReceivedFriendInvitationDetailedInfoV1"}, + {22002, nullptr, "GetReceivedFriendInvitationListV2"}, // 19.0.0+ + {22003, nullptr, "GetReceivedFriendInvitationDetailedInfoV2"}, // 19.0.0+ + {22010, &IFriendService::GetReceivedFriendInvitationCountCache, "GetReceivedFriendInvitationCountCache"}, + {30100, nullptr, "DropFriendNewlyFlags"}, + {30101, nullptr, "DeleteFriend"}, + {30110, nullptr, "DropFriendNewlyFlag"}, + {30120, nullptr, "ChangeFriendFavoriteFlag"}, + {30121, nullptr, "ChangeFriendOnlineNotificationFlag"}, + {30130, nullptr, "SetFriendNote"}, // 22.0.0+ + {30131, nullptr, "RequestUploadPendingNote"}, // 22.0.0+ + {30190, nullptr, "RequestSyncLocalUpdates"}, // 22.0.0+ + {30200, nullptr, "SendFriendRequest"}, + {30201, nullptr, "SendFriendRequestWithApplicationInfoV1"}, + {30202, nullptr, "CancelFriendRequest"}, + {30203, nullptr, "AcceptFriendRequest"}, + {30204, nullptr, "RejectFriendRequest"}, + {30205, nullptr, "ReadFriendRequest"}, + {30210, nullptr, "GetFacedFriendRequestRegistrationKey"}, + {30211, nullptr, "AddFacedFriendRequest"}, + {30212, nullptr, "CancelFacedFriendRequest"}, + {30213, nullptr, "GetFacedFriendRequestProfileImage"}, + {30214, nullptr, "GetFacedFriendRequestProfileImageFromPath"}, + {30215, nullptr, "SendFriendRequestWithExternalApplicationCatalogId"}, + {30216, nullptr, "ResendFacedFriendRequest"}, + {30217, nullptr, "SendFriendRequestWithNintendoNetworkIdInfo"}, + {30218, nullptr, "SendFriendRequestWithApplicationInfoV2"}, // 20.0.0+ + {30300, nullptr, "GetSnsAccountLinkPageUrl"}, // 5.0.0-19.0.1 + {30301, nullptr, "UnlinkSnsAccount"}, // 5.0.0-19.0.1 + {30400, nullptr, "BlockUser"}, + {30401, nullptr, "BlockUserWithApplicationInfoV1"}, + {30402, nullptr, "UnblockUser"}, + {30403, nullptr, "BlockUserWithApplicationInfoV2"}, // 20.0.0+ + {30500, nullptr, "GetProfileExtraFromFriendCodeV1"}, + {30501, nullptr, "GetProfileExtraFromFriendCodeV2"}, // 19.0.0+ + {30700, nullptr, "DeletePlayHistory"}, + {30701, nullptr, "AddPlayHistoryWithApplication"}, // 19.0.0+ + {30810, nullptr, "ChangePresencePermission"}, + {30811, nullptr, "ChangeFriendRequestReception"}, + {30812, nullptr, "ChangePlayLogPermission"}, + {30820, nullptr, "IssueFriendCode"}, + {30830, nullptr, "ClearPlayLog"}, + {30900, nullptr, "SendFriendInvitationV1"}, + {30901, nullptr, "SendFriendInvitationV2"}, // 19.0.0+ + {30910, nullptr, "ReadFriendInvitation"}, + {30911, nullptr, "ReadAllFriendInvitations"}, + {31000, nullptr, "OpenUser"}, // 19.0.0+ + {40100, nullptr, "DeleteFriendListCache"}, + {40400, nullptr, "DeleteBlockedUserListCache"}, + {49900, nullptr, "DeleteNetworkServiceAccountCache"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + completion_event = service_context.CreateEvent("IFriendService:CompletionEvent"); } ~IFriendService() override { @@ -266,134 +367,27 @@ private: rb.Push(0); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IFriendService::GetCompletionEvent, "GetCompletionEvent"}, - FunctionInfo{1, &IFriendService::Cancel, "Cancel"}, - FunctionInfo{10100, nullptr, "GetFriendListIds"}, - FunctionInfo{10101, &IFriendService::GetFriendList, "GetFriendList"}, - FunctionInfo{10102, nullptr, "UpdateFriendInfo"}, - FunctionInfo{10110, nullptr, "GetFriendProfileImage"}, - FunctionInfo{10111, nullptr, "GetFriendProfileImageWithImageSize", MakeVersionGate({18,0,0})}, - FunctionInfo{10120, &IFriendService::CheckFriendListAvailability, "CheckFriendListAvailability"}, - FunctionInfo{10121, nullptr, "EnsureFriendListAvailable"}, - FunctionInfo{10200, nullptr, "SendFriendRequestForApplication"}, - FunctionInfo{10211, nullptr, "AddFacedFriendRequestForApplication"}, - FunctionInfo{10400, &IFriendService::GetBlockedUserListIds, "GetBlockedUserListIds"}, - FunctionInfo{10420, &IFriendService::CheckBlockedUserListAvailability, "CheckBlockedUserListAvailability"}, - FunctionInfo{10421, nullptr, "EnsureBlockedUserListAvailable"}, - FunctionInfo{10500, nullptr, "GetProfileList"}, - FunctionInfo{10501, nullptr, "GetProfileListV2", MakeVersionGate({18,0,0})}, - FunctionInfo{10600, nullptr, "DeclareOpenOnlinePlaySession"}, - FunctionInfo{10601, &IFriendService::DeclareCloseOnlinePlaySession, "DeclareCloseOnlinePlaySession"}, - FunctionInfo{10610, &IFriendService::UpdateUserPresence, "UpdateUserPresence"}, - FunctionInfo{10700, &IFriendService::GetPlayHistoryRegistrationKey, "GetPlayHistoryRegistrationKey"}, - FunctionInfo{10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"}, - FunctionInfo{10702, nullptr, "AddPlayHistory"}, - FunctionInfo{11000, nullptr, "GetProfileImageUrl"}, - FunctionInfo{11001, nullptr, "GetProfileImageUrlV2", MakeVersionGate({18,0,0})}, - FunctionInfo{20100, &IFriendService::GetFriendCount, "GetFriendCount"}, - FunctionInfo{20101, &IFriendService::GetNewlyFriendCount, "GetNewlyFriendCount"}, - FunctionInfo{20102, nullptr, "GetFriendDetailedInfo"}, - FunctionInfo{20103, nullptr, "SyncFriendList"}, - FunctionInfo{20104, &IFriendService::RequestSyncFriendList, "RequestSyncFriendList"}, - FunctionInfo{20105, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV1"}, - FunctionInfo{20106, nullptr, "UpdateFriendInfoForViewerV1"}, - FunctionInfo{20107, nullptr, "GetFriendDetailedInfoV2", MakeVersionGate({20,0,0})}, - FunctionInfo{20108, &IFriendService::GetFriendListForViewer, "GetFriendListForViewerV2", MakeVersionGate({22,0,0})}, - FunctionInfo{20109, nullptr, "UpdateFriendInfoForViewerV2", MakeVersionGate({22,0,0})}, - FunctionInfo{20110, nullptr, "LoadFriendSettingV1"}, - FunctionInfo{20111, nullptr, "LoadFriendSettingV2", MakeVersionGate({22,0,0})}, - FunctionInfo{20200, &IFriendService::GetReceivedFriendRequestCount, "GetReceivedFriendRequestCount"}, - FunctionInfo{20201, nullptr, "GetFriendRequestListV1"}, - FunctionInfo{20202, nullptr, "GetFriendRequestListV2", MakeVersionGate({20,0,0})}, - FunctionInfo{20203, nullptr, "GetFriendRequestReceivedNotificationCount", MakeVersionGate({22,0,0})}, - FunctionInfo{20300, nullptr, "GetFriendCandidateList"}, - FunctionInfo{20301, nullptr, "GetNintendoNetworkIdInfo"}, - FunctionInfo{20302, nullptr, "GetSnsAccountLinkage", MakeVersionGate({5,0,0}, {19,0,1})}, - FunctionInfo{20303, nullptr, "GetSnsAccountProfile", MakeVersionGate({5,0,0}, {19,0,1})}, - FunctionInfo{20304, nullptr, "GetSnsAccountFriendList", MakeVersionGate({5,0,0}, {19,0,1})}, - FunctionInfo{20400, nullptr, "GetBlockedUserListV1"}, - FunctionInfo{20401, nullptr, "SyncBlockedUserList"}, - FunctionInfo{20402, nullptr, "GetBlockedUserListV2", MakeVersionGate({20,0,0})}, - FunctionInfo{20500, nullptr, "GetProfileExtraListV1"}, - FunctionInfo{20501, nullptr, "GetRelationship"}, - FunctionInfo{20502, nullptr, "GetProfileExtraListV2", MakeVersionGate({19,0,0})}, - FunctionInfo{20600, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV1"}, - FunctionInfo{20601, &IFriendService::GetUserPresenceView, "GetUserPresenceViewV2", MakeVersionGate({19,0,0})}, - FunctionInfo{20700, nullptr, "GetPlayHistoryListV1"}, - FunctionInfo{20701, &IFriendService::GetPlayHistoryStatistics, "GetPlayHistoryStatistics"}, - FunctionInfo{20702, nullptr, "GetPlayHistoryListV2", MakeVersionGate({19,0,0})}, - FunctionInfo{20800, &IFriendService::LoadUserSetting, "LoadUserSettingV1"}, - FunctionInfo{20801, nullptr, "SyncUserSetting"}, - FunctionInfo{20802, &IFriendService::LoadUserSetting, "LoadUserSettingV2", MakeVersionGate({19,0,0})}, - FunctionInfo{20900, &IFriendService::RequestListSummaryOverlayNotification, "RequestListSummaryOverlayNotification"}, - FunctionInfo{21000, nullptr, "GetExternalApplicationCatalog"}, - FunctionInfo{22000, nullptr, "GetReceivedFriendInvitationListV1"}, - FunctionInfo{22001, nullptr, "GetReceivedFriendInvitationDetailedInfoV1"}, - FunctionInfo{22002, nullptr, "GetReceivedFriendInvitationListV2", MakeVersionGate({19,0,0})}, - FunctionInfo{22003, nullptr, "GetReceivedFriendInvitationDetailedInfoV2", MakeVersionGate({19,0,0})}, - FunctionInfo{22010, &IFriendService::GetReceivedFriendInvitationCountCache, "GetReceivedFriendInvitationCountCache"}, - FunctionInfo{30100, nullptr, "DropFriendNewlyFlags"}, - FunctionInfo{30101, nullptr, "DeleteFriend"}, - FunctionInfo{30110, nullptr, "DropFriendNewlyFlag"}, - FunctionInfo{30120, nullptr, "ChangeFriendFavoriteFlag"}, - FunctionInfo{30121, nullptr, "ChangeFriendOnlineNotificationFlag"}, - FunctionInfo{30130, nullptr, "SetFriendNote", MakeVersionGate({22,0,0})}, - FunctionInfo{30131, nullptr, "RequestUploadPendingNote", MakeVersionGate({22,0,0})}, - FunctionInfo{30190, nullptr, "RequestSyncLocalUpdates", MakeVersionGate({22,0,0})}, - FunctionInfo{30200, nullptr, "SendFriendRequest"}, - FunctionInfo{30201, nullptr, "SendFriendRequestWithApplicationInfoV1"}, - FunctionInfo{30202, nullptr, "CancelFriendRequest"}, - FunctionInfo{30203, nullptr, "AcceptFriendRequest"}, - FunctionInfo{30204, nullptr, "RejectFriendRequest"}, - FunctionInfo{30205, nullptr, "ReadFriendRequest"}, - FunctionInfo{30210, nullptr, "GetFacedFriendRequestRegistrationKey"}, - FunctionInfo{30211, nullptr, "AddFacedFriendRequest"}, - FunctionInfo{30212, nullptr, "CancelFacedFriendRequest"}, - FunctionInfo{30213, nullptr, "GetFacedFriendRequestProfileImage"}, - FunctionInfo{30214, nullptr, "GetFacedFriendRequestProfileImageFromPath"}, - FunctionInfo{30215, nullptr, "SendFriendRequestWithExternalApplicationCatalogId"}, - FunctionInfo{30216, nullptr, "ResendFacedFriendRequest"}, - FunctionInfo{30217, nullptr, "SendFriendRequestWithNintendoNetworkIdInfo"}, - FunctionInfo{30218, nullptr, "SendFriendRequestWithApplicationInfoV2", MakeVersionGate({20,0,0})}, - FunctionInfo{30300, nullptr, "GetSnsAccountLinkPageUrl", MakeVersionGate({5,0,0}, {19,0,1})}, - FunctionInfo{30301, nullptr, "UnlinkSnsAccount", MakeVersionGate({5,0,0}, {19,0,1})}, - FunctionInfo{30400, nullptr, "BlockUser"}, - FunctionInfo{30401, nullptr, "BlockUserWithApplicationInfoV1"}, - FunctionInfo{30402, nullptr, "UnblockUser"}, - FunctionInfo{30403, nullptr, "BlockUserWithApplicationInfoV2", MakeVersionGate({20,0,0})}, - FunctionInfo{30500, nullptr, "GetProfileExtraFromFriendCodeV1"}, - FunctionInfo{30501, nullptr, "GetProfileExtraFromFriendCodeV2", MakeVersionGate({19,0,0})}, - FunctionInfo{30700, nullptr, "DeletePlayHistory"}, - FunctionInfo{30701, nullptr, "AddPlayHistoryWithApplication", MakeVersionGate({19,0,0})}, - FunctionInfo{30810, nullptr, "ChangePresencePermission"}, - FunctionInfo{30811, nullptr, "ChangeFriendRequestReception"}, - FunctionInfo{30812, nullptr, "ChangePlayLogPermission"}, - FunctionInfo{30820, nullptr, "IssueFriendCode"}, - FunctionInfo{30830, nullptr, "ClearPlayLog"}, - FunctionInfo{30900, nullptr, "SendFriendInvitationV1"}, - FunctionInfo{30901, nullptr, "SendFriendInvitationV2", MakeVersionGate({19,0,0})}, - FunctionInfo{30910, nullptr, "ReadFriendInvitation"}, - FunctionInfo{30911, nullptr, "ReadAllFriendInvitations"}, - FunctionInfo{31000, nullptr, "OpenUser", MakeVersionGate({19,0,0})}, - FunctionInfo{40100, nullptr, "DeleteFriendListCache"}, - FunctionInfo{40400, nullptr, "DeleteBlockedUserListCache"}, - FunctionInfo{49900, nullptr, "DeleteNetworkServiceAccountCache"} - ); KernelHelpers::ServiceContext service_context; + Kernel::KEvent* completion_event; }; class INotificationService final : public ServiceFramework { public: explicit INotificationService(Core::System& system_, Common::UUID uuid_) - : ServiceFramework{system_, "INotificationService"}, uuid{uuid_} - , service_context{system_, "INotificationService"} { - notification_event = service_context.CreateEvent("INotificationService:NotifyEvent"); - } + : ServiceFramework{system_, "INotificationService"}, uuid{uuid_}, + service_context{system_, "INotificationService"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &INotificationService::GetEvent, "GetEvent"}, + {1, &INotificationService::Clear, "Clear"}, + {2, &INotificationService::Pop, "Pop"} + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + notification_event = service_context.CreateEvent("INotificationService:NotifyEvent"); } ~INotificationService() override { @@ -471,13 +465,9 @@ private: bool has_received_friend_request; }; - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &INotificationService::GetEvent, "GetEvent"}, - FunctionInfo{1, &INotificationService::Clear, "Clear"}, - FunctionInfo{2, &INotificationService::Pop, "Pop"} - ); Common::UUID uuid; KernelHelpers::ServiceContext service_context; + Kernel::KEvent* notification_event; std::queue notifications; States states{}; @@ -511,67 +501,61 @@ class IServiceForApplication final : public ServiceFramework FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + {0, nullptr, "GetReceivableNeighborInfoCountMax"}, + {10, nullptr, "IsNeighborDetectionEnabled"}, + }; + RegisterHandlers(functions); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetReceivableNeighborInfoCountMax"}, - FunctionInfo{10, nullptr, "IsNeighborDetectionEnabled"} - ); }; class IServiceForSystem final : public ServiceFramework { public: explicit IServiceForSystem(Core::System& system_) : ServiceFramework{system_, "nd:sys"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + {0, nullptr, "GetReceivableNeighborInfoCountMax"}, + {10, nullptr, "IsNeighborDetectionEnabled"}, + {200, nullptr, "SetSystemData"}, + {201, nullptr, "ClearSystemData"}, + {203, nullptr, "GetReceivableNeighborInfoCountForSystem"}, + {204, nullptr, "ReceiveNeighborInfoForSystem"}, + {205, nullptr, "SetSender"}, + {206, nullptr, "GetSender"}, + {207, nullptr, "CreateScannerForSystem"}, + {208, nullptr, "CreateReceiveEventHolderForSystem"}, + {223, nullptr, "EnableNeighborDetection"}, + {224, nullptr, "DisableNeighborDetection"}, + {226, nullptr, "EnablePowerSave"}, + {227, nullptr, "DisablePowerSave"}, + {228, nullptr, "IsPowerSaveEnabled"}, + {232, nullptr, "ClearBlockedUsers"}, + {233, nullptr, "GetBlockedUserCount"}, + {234, nullptr, "BlockUserByLocalUserId"}, + {235, nullptr, "BlockUserByNetworkUserId"}, + {236, nullptr, "UnblockUserByLocalUserId"}, + {237, nullptr, "UnblockUserByNetworkUserId"}, + {240, nullptr, "DeleteApplication"}, + {250, nullptr, "InitializeApplicationInfo"}, + {260, nullptr, "CreateAccountSystemSaveDataAccessSuppressor"}, + {300, nullptr, "AddReceivedNeighborInfoForSystemForDebug"}, + {301, nullptr, "GetSendDataForDebug"}, + {302, nullptr, "ClearReceiveCounterForDebug"}, + {303, nullptr, "GetNextReceiveCounterForDebug"}, + {304, nullptr, "ListBlockedUsersForDebug"}, + {305, nullptr, "RefreshSendDataIdForDebug"}, + {306, nullptr, "ReloadFwdbgSettingsForDebug"}, + {307, nullptr, "EnableApplicationForDebug"}, + {308, nullptr, "GetNextReceiveCountersForDebug"}, + {309, nullptr, "ListApplicationInfoForDebug"}, + {310, nullptr, "SetApplicationDataForDebug"}, + {400, nullptr, "GetNetworkUserId"}, + {401, nullptr, "DeleteNetworkUserId"}, + }; + RegisterHandlers(functions); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetReceivableNeighborInfoCountMax"}, - FunctionInfo{10, nullptr, "IsNeighborDetectionEnabled"}, - FunctionInfo{200, nullptr, "SetSystemData"}, - FunctionInfo{201, nullptr, "ClearSystemData"}, - FunctionInfo{203, nullptr, "GetReceivableNeighborInfoCountForSystem"}, - FunctionInfo{204, nullptr, "ReceiveNeighborInfoForSystem"}, - FunctionInfo{205, nullptr, "SetSender"}, - FunctionInfo{206, nullptr, "GetSender"}, - FunctionInfo{207, nullptr, "CreateScannerForSystem"}, - FunctionInfo{208, nullptr, "CreateReceiveEventHolderForSystem"}, - FunctionInfo{223, nullptr, "EnableNeighborDetection"}, - FunctionInfo{224, nullptr, "DisableNeighborDetection"}, - FunctionInfo{226, nullptr, "EnablePowerSave"}, - FunctionInfo{227, nullptr, "DisablePowerSave"}, - FunctionInfo{228, nullptr, "IsPowerSaveEnabled"}, - FunctionInfo{232, nullptr, "ClearBlockedUsers"}, - FunctionInfo{233, nullptr, "GetBlockedUserCount"}, - FunctionInfo{234, nullptr, "BlockUserByLocalUserId"}, - FunctionInfo{235, nullptr, "BlockUserByNetworkUserId"}, - FunctionInfo{236, nullptr, "UnblockUserByLocalUserId"}, - FunctionInfo{237, nullptr, "UnblockUserByNetworkUserId"}, - FunctionInfo{240, nullptr, "DeleteApplication"}, - FunctionInfo{250, nullptr, "InitializeApplicationInfo"}, - FunctionInfo{260, nullptr, "CreateAccountSystemSaveDataAccessSuppressor"}, - FunctionInfo{300, nullptr, "AddReceivedNeighborInfoForSystemForDebug"}, - FunctionInfo{301, nullptr, "GetSendDataForDebug"}, - FunctionInfo{302, nullptr, "ClearReceiveCounterForDebug"}, - FunctionInfo{303, nullptr, "GetNextReceiveCounterForDebug"}, - FunctionInfo{304, nullptr, "ListBlockedUsersForDebug"}, - FunctionInfo{305, nullptr, "RefreshSendDataIdForDebug"}, - FunctionInfo{306, nullptr, "ReloadFwdbgSettingsForDebug"}, - FunctionInfo{307, nullptr, "EnableApplicationForDebug"}, - FunctionInfo{308, nullptr, "GetNextReceiveCountersForDebug"}, - FunctionInfo{309, nullptr, "ListApplicationInfoForDebug"}, - FunctionInfo{310, nullptr, "SetApplicationDataForDebug"}, - FunctionInfo{400, nullptr, "GetNetworkUserId"}, - FunctionInfo{401, nullptr, "DeleteNetworkUserId"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/friend/friend.h b/src/core/hle/service/friend/friend.h index 2824dc7866..61ac92fbb4 100644 --- a/src/core/hle/service/friend/friend.h +++ b/src/core/hle/service/friend/friend.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/friend/friend_interface.cpp b/src/core/hle/service/friend/friend_interface.cpp new file mode 100644 index 0000000000..b436d43303 --- /dev/null +++ b/src/core/hle/service/friend/friend_interface.cpp @@ -0,0 +1,23 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/friend/friend_interface.h" + +namespace Service::Friend { + +Friend::Friend(std::shared_ptr module_, Core::System& system_, const char* name) + : Interface(std::move(module_), system_, name) { + static const FunctionInfo functions[] = { + {0, &Friend::CreateFriendService, "CreateFriendService"}, + {1, &Friend::CreateNotificationService, "CreateNotificationService"}, + {2, nullptr, "CreateDaemonSuspendSessionService"}, + }; + RegisterHandlers(functions); +} + +Friend::~Friend() = default; + +} // namespace Service::Friend diff --git a/src/core/hle/service/friend/friend_interface.h b/src/core/hle/service/friend/friend_interface.h new file mode 100644 index 0000000000..0315c62c39 --- /dev/null +++ b/src/core/hle/service/friend/friend_interface.h @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/friend/friend.h" + +namespace Service::Friend { + +class Friend final : public Module::Interface { +public: + explicit Friend(std::shared_ptr module_, Core::System& system_, const char* name); + ~Friend() override; +}; + +} // namespace Service::Friend diff --git a/src/core/hle/service/glue/arp.cpp b/src/core/hle/service/glue/arp.cpp index 203adb7ca7..7eda57ddc3 100644 --- a/src/core/hle/service/glue/arp.cpp +++ b/src/core/hle/service/glue/arp.cpp @@ -35,6 +35,22 @@ std::optional GetTitleIDForProcessID(Core::System& system, u64 process_id) ARP_R::ARP_R(Core::System& system_, const ARPManager& manager_) : ServiceFramework{system_, "arp:r"}, manager{manager_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &ARP_R::GetApplicationLaunchProperty, "GetApplicationLaunchProperty"}, + {1, &ARP_R::GetApplicationLaunchPropertyWithApplicationId, "GetApplicationLaunchPropertyWithApplicationId"}, + {2, &ARP_R::GetApplicationControlProperty, "GetApplicationControlProperty"}, + {3, &ARP_R::GetApplicationControlPropertyWithApplicationId, "GetApplicationControlPropertyWithApplicationId"}, + {4, nullptr, "GetApplicationInstanceUnregistrationNotifier"}, + {5, nullptr, "ListApplicationInstanceId"}, + {6, nullptr, "GetMicroApplicationInstanceId"}, + {7, nullptr, "GetApplicationCertificate"}, + {9998, nullptr, "GetPreomiaApplicationLaunchProperty"}, + {9999, nullptr, "GetPreomiaApplicationControlProperty"}, + }; + // clang-format on + + RegisterHandlers(functions); } ARP_R::~ARP_R() = default; @@ -148,10 +164,16 @@ public: using IssuerFn = std::function)>; explicit IRegistrar(Core::System& system_, IssuerFn&& issuer) - : ServiceFramework{system_, "IRegistrar"}, issue_process_id{std::move(issuer)} {} + : ServiceFramework{system_, "IRegistrar"}, issue_process_id{std::move(issuer)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IRegistrar::Issue, "Issue"}, + {1, &IRegistrar::SetApplicationLaunchProperty, "SetApplicationLaunchProperty"}, + {2, &IRegistrar::SetApplicationControlProperty, "SetApplicationControlProperty"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -216,11 +238,6 @@ private: rb.Push(ResultSuccess); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IRegistrar::Issue, "Issue"}, - FunctionInfo{1, &IRegistrar::SetApplicationLaunchProperty, "SetApplicationLaunchProperty"}, - FunctionInfo{2, &IRegistrar::SetApplicationControlProperty, "SetApplicationControlProperty"} - ); IssuerFn issue_process_id; bool issued = false; ApplicationLaunchProperty launch{}; @@ -229,6 +246,15 @@ private: ARP_W::ARP_W(Core::System& system_, ARPManager& manager_) : ServiceFramework{system_, "arp:w"}, manager{manager_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &ARP_W::AcquireRegistrar, "AcquireRegistrar"}, + {1, &ARP_W::UnregisterApplicationInstance , "UnregisterApplicationInstance "}, + {2, nullptr, "AcquireUpdater"}, + }; + // clang-format on + + RegisterHandlers(functions); } ARP_W::~ARP_W() = default; diff --git a/src/core/hle/service/glue/arp.h b/src/core/hle/service/glue/arp.h index de966475f9..ec3d809b5b 100644 --- a/src/core/hle/service/glue/arp.h +++ b/src/core/hle/service/glue/arp.h @@ -24,21 +24,6 @@ private: void GetApplicationControlProperty(HLERequestContext& ctx); void GetApplicationControlPropertyWithApplicationId(HLERequestContext& ctx); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &ARP_R::GetApplicationLaunchProperty, "GetApplicationLaunchProperty"}, - FunctionInfo{1, &ARP_R::GetApplicationLaunchPropertyWithApplicationId, "GetApplicationLaunchPropertyWithApplicationId"}, - FunctionInfo{2, &ARP_R::GetApplicationControlProperty, "GetApplicationControlProperty"}, - FunctionInfo{3, &ARP_R::GetApplicationControlPropertyWithApplicationId, "GetApplicationControlPropertyWithApplicationId"}, - FunctionInfo{4, nullptr, "GetApplicationInstanceUnregistrationNotifier"}, - FunctionInfo{5, nullptr, "ListApplicationInstanceId"}, - FunctionInfo{6, nullptr, "GetMicroApplicationInstanceId"}, - FunctionInfo{7, nullptr, "GetApplicationCertificate"}, - FunctionInfo{9998, nullptr, "GetPreomiaApplicationLaunchProperty"}, - FunctionInfo{9999, nullptr, "GetPreomiaApplicationControlProperty"} - ); const ARPManager& manager; }; @@ -51,14 +36,6 @@ private: void AcquireRegistrar(HLERequestContext& ctx); void UnregisterApplicationInstance(HLERequestContext& ctx); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &ARP_W::AcquireRegistrar, "AcquireRegistrar"}, - FunctionInfo{1, &ARP_W::UnregisterApplicationInstance , "UnregisterApplicationInstance "}, - FunctionInfo{2, nullptr, "AcquireUpdater"} - ); ARPManager& manager; std::shared_ptr registrar; }; diff --git a/src/core/hle/service/glue/bgtc.cpp b/src/core/hle/service/glue/bgtc.cpp index 7c7b5ea13c..360f16f0dd 100644 --- a/src/core/hle/service/glue/bgtc.cpp +++ b/src/core/hle/service/glue/bgtc.cpp @@ -11,7 +11,15 @@ namespace Service::Glue { -BGTC_T::BGTC_T(Core::System& system_) : ServiceFramework{system_, "bgtc:t"} {} +BGTC_T::BGTC_T(Core::System& system_) : ServiceFramework{system_, "bgtc:t"} { + // clang-format off + static const FunctionInfo functions[] = { + {100, &BGTC_T::OpenTaskService, "OpenTaskService"}, + }; + // clang-format on + + RegisterHandlers(functions); +} BGTC_T::~BGTC_T() = default; @@ -24,11 +32,44 @@ void BGTC_T::OpenTaskService(HLERequestContext& ctx) { } ITaskService::ITaskService(Core::System& system_) : ServiceFramework{system_, "ITaskService"} { + // clang-format off + static const FunctionInfo functions[] = { + {1, nullptr, "NotifyTaskStarting"}, + {2, nullptr, "NotifyTaskFinished"}, + {3, nullptr, "GetTriggerEvent"}, + {4, nullptr, "IsInHalfAwake"}, + {5, nullptr, "NotifyClientName"}, + {6, nullptr, "IsInFullAwake"}, + {11, nullptr, "ScheduleTask"}, + {12, nullptr, "GetScheduledTaskInterval"}, + {13, nullptr, "UnscheduleTask"}, + {14, nullptr, "GetScheduleEvent"}, + {15, nullptr, "SchedulePeriodicTask"}, + {16, nullptr, "Unknown16"}, + {101, nullptr, "GetOperationMode"}, + {102, nullptr, "WillDisconnectNetworkWhenEnteringSleep"}, + {103, nullptr, "WillStayHalfAwakeInsteadSleep"}, + {200, nullptr, "Unknown200"}, + }; + // clang-format on + + RegisterHandlers(functions); } ITaskService::~ITaskService() = default; BGTC_SC::BGTC_SC(Core::System& system_) : ServiceFramework{system_, "bgtc:sc"} { + // clang-format off + static const FunctionInfo functions[] = { + {1, nullptr, "GetState"}, + {2, nullptr, "GetStateChangedEvent"}, + {3, nullptr, "NotifyEnteringHalfAwake"}, + {4, nullptr, "NotifyLeavingHalfAwake"}, + {5, nullptr, "SetIsUsingSleepUnsupportedDevices"}, + }; + // clang-format on + + RegisterHandlers(functions); } BGTC_SC::~BGTC_SC() = default; diff --git a/src/core/hle/service/glue/bgtc.h b/src/core/hle/service/glue/bgtc.h index 0ef0ab902f..129193da1f 100644 --- a/src/core/hle/service/glue/bgtc.h +++ b/src/core/hle/service/glue/bgtc.h @@ -20,57 +20,18 @@ public: ~BGTC_T() override; void OpenTaskService(HLERequestContext& ctx); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{100, &BGTC_T::OpenTaskService, "OpenTaskService"} - ); }; class ITaskService final : public ServiceFramework { public: explicit ITaskService(Core::System& system_); ~ITaskService() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, nullptr, "NotifyTaskStarting"}, - FunctionInfo{2, nullptr, "NotifyTaskFinished"}, - FunctionInfo{3, nullptr, "GetTriggerEvent"}, - FunctionInfo{4, nullptr, "IsInHalfAwake"}, - FunctionInfo{5, nullptr, "NotifyClientName"}, - FunctionInfo{6, nullptr, "IsInFullAwake"}, - FunctionInfo{11, nullptr, "ScheduleTask"}, - FunctionInfo{12, nullptr, "GetScheduledTaskInterval"}, - FunctionInfo{13, nullptr, "UnscheduleTask"}, - FunctionInfo{14, nullptr, "GetScheduleEvent"}, - FunctionInfo{15, nullptr, "SchedulePeriodicTask"}, - FunctionInfo{16, nullptr, "Unknown16"}, - FunctionInfo{101, nullptr, "GetOperationMode"}, - FunctionInfo{102, nullptr, "WillDisconnectNetworkWhenEnteringSleep"}, - FunctionInfo{103, nullptr, "WillStayHalfAwakeInsteadSleep"}, - FunctionInfo{200, nullptr, "Unknown200"} - ); }; class BGTC_SC final : public ServiceFramework { public: explicit BGTC_SC(Core::System& system_); ~BGTC_SC() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, nullptr, "GetState"}, - FunctionInfo{2, nullptr, "GetStateChangedEvent"}, - FunctionInfo{3, nullptr, "NotifyEnteringHalfAwake"}, - FunctionInfo{4, nullptr, "NotifyLeavingHalfAwake"}, - FunctionInfo{5, nullptr, "SetIsUsingSleepUnsupportedDevices"} - ); }; } // namespace Service::Glue diff --git a/src/core/hle/service/glue/ectx.cpp b/src/core/hle/service/glue/ectx.cpp index 80d22a0ca7..322ae45254 100644 --- a/src/core/hle/service/glue/ectx.cpp +++ b/src/core/hle/service/glue/ectx.cpp @@ -12,10 +12,14 @@ namespace Service::Glue { // This is nn::err::context::IContextRegistrar class IContextRegistrar : public ServiceFramework { public: - IContextRegistrar(Core::System& system_) : ServiceFramework{system_, "IContextRegistrar"} {} + IContextRegistrar(Core::System& system_) : ServiceFramework{system_, "IContextRegistrar"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IContextRegistrar::Complete, "Complete"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } ~IContextRegistrar() override = default; @@ -37,21 +41,41 @@ private: rb.Push(ResultSuccess); rb.Push(0); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IContextRegistrar::Complete, "Complete"} - ); }; ECTX_W::ECTX_W(Core::System& system_) : ServiceFramework{system_, "ectx:w"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "CreateContextRegistrar"}, + {1, nullptr, "CommitContext"}, + {2, nullptr, "RemoveContext"}, + }; + // clang-format on + RegisterHandlers(functions); } ECTX_W::~ECTX_W() = default; ECTX_R::ECTX_R(Core::System& system_) : ServiceFramework{system_, "ectx:r"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetContextInfo"}, + {1, nullptr, "PullContext"}, + {2, nullptr, "ListContextDescriptorWithResultForDebug"}, + }; + // clang-format on + RegisterHandlers(functions); } ECTX_R::~ECTX_R() = default; ECTX_AW::ECTX_AW(Core::System& system_) : ServiceFramework{system_, "ectx:aw"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &ECTX_AW::CreateContextRegistrar, "CreateContextRegistrar"}, + {1, nullptr, "CommitContext"}, + }; + // clang-format on + + RegisterHandlers(functions); } ECTX_AW::~ECTX_AW() = default; diff --git a/src/core/hle/service/glue/ectx.h b/src/core/hle/service/glue/ectx.h index 01f109c609..ff48075eda 100644 --- a/src/core/hle/service/glue/ectx.h +++ b/src/core/hle/service/glue/ectx.h @@ -18,30 +18,12 @@ class ECTX_W final : public ServiceFramework { public: explicit ECTX_W(Core::System& system_); ~ECTX_W() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateContextRegistrar"}, - FunctionInfo{1, nullptr, "CommitContext"}, - FunctionInfo{2, nullptr, "RemoveContext"} - ); }; class ECTX_R final : public ServiceFramework { public: explicit ECTX_R(Core::System& system_); ~ECTX_R() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetContextInfo"}, - FunctionInfo{1, nullptr, "PullContext"}, - FunctionInfo{2, nullptr, "ListContextDescriptorWithResultForDebug"} - ); }; class ECTX_AW final : public ServiceFramework { @@ -51,14 +33,6 @@ public: private: void CreateContextRegistrar(HLERequestContext& ctx); - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &ECTX_AW::CreateContextRegistrar, "CreateContextRegistrar"}, - FunctionInfo{1, nullptr, "CommitContext"} - ); }; } // namespace Service::Glue diff --git a/src/core/hle/service/glue/errors.h b/src/core/hle/service/glue/errors.h index 30feaa5c03..9839271447 100644 --- a/src/core/hle/service/glue/errors.h +++ b/src/core/hle/service/glue/errors.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/glue/glue.h b/src/core/hle/service/glue/glue.h index 2a906f5ad6..64d45cfc14 100644 --- a/src/core/hle/service/glue/glue.h +++ b/src/core/hle/service/glue/glue.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/glue/glue_manager.cpp b/src/core/hle/service/glue/glue_manager.cpp index 22f0017044..78fc5ebac3 100644 --- a/src/core/hle/service/glue/glue_manager.cpp +++ b/src/core/hle/service/glue/glue_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/glue/glue_manager.h b/src/core/hle/service/glue/glue_manager.h index 216aa34c19..6330828834 100644 --- a/src/core/hle/service/glue/glue_manager.h +++ b/src/core/hle/service/glue/glue_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/glue/notif.cpp b/src/core/hle/service/glue/notif.cpp index a369b78ddd..716e4da32d 100644 --- a/src/core/hle/service/glue/notif.cpp +++ b/src/core/hle/service/glue/notif.cpp @@ -17,45 +17,9 @@ namespace Service::Glue { namespace { + constexpr inline std::size_t MaxAlarms = 8; -} -std::optional INotificationServicesForApplication::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{500, D<&INotificationServicesForApplication::RegisterAlarmSetting>, "RegisterAlarmSetting"}, - FunctionInfo{510, D<&INotificationServicesForApplication::UpdateAlarmSetting>, "UpdateAlarmSetting"}, - FunctionInfo{520, D<&INotificationServicesForApplication::ListAlarmSettings>, "ListAlarmSettings"}, - FunctionInfo{530, D<&INotificationServicesForApplication::LoadApplicationParameter>, "LoadApplicationParameter"}, - FunctionInfo{540, D<&INotificationServicesForApplication::DeleteAlarmSetting>, "DeleteAlarmSetting"}, - FunctionInfo{1000, D<&INotificationServicesForApplication::Initialize>, "Initialize"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - -std::optional INotificationServices::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{500, D<&INotificationServices::RegisterAlarmSetting>, "RegisterAlarmSetting"}, - FunctionInfo{510, D<&INotificationServices::UpdateAlarmSetting>, "UpdateAlarmSetting"}, - FunctionInfo{520, D<&INotificationServices::ListAlarmSettings>, "ListAlarmSettings"}, - FunctionInfo{530, D<&INotificationServices::LoadApplicationParameter>, "LoadApplicationParameter"}, - FunctionInfo{540, D<&INotificationServices::DeleteAlarmSetting>, "DeleteAlarmSetting"}, - FunctionInfo{1000, D<&INotificationServices::Initialize>, "Initialize"}, - FunctionInfo{1010, nullptr, "ListNotifications"}, - FunctionInfo{1020, nullptr, "DeleteNotification"}, - FunctionInfo{1030, nullptr, "ClearNotifications"}, - FunctionInfo{1040, D<&INotificationServices::OpenNotificationSystemEventAccessor>, "OpenNotificationSystemEventAccessor"}, - FunctionInfo{1500, nullptr, "SetNotificationPresentationSetting"}, - FunctionInfo{1510, D<&INotificationServices::GetNotificationPresentationSetting>, "GetNotificationPresentationSetting"}, - FunctionInfo{2000, nullptr, "GetAlarmSetting"}, - FunctionInfo{2001, nullptr, "GetAlarmSettingWithApplicationParameter"}, - FunctionInfo{2010, nullptr, "MuteAlarmSetting"}, - FunctionInfo{2020, nullptr, "IsAlarmSettingReady"}, - FunctionInfo{8000, nullptr, "RegisterAppletResourceUserId"}, - FunctionInfo{8010, nullptr, "UnregisterAppletResourceUserId"}, - FunctionInfo{8999, nullptr, "GetCurrentTime"}, - FunctionInfo{9000, nullptr, "GetAlarmSettingNextNotificationTime"} - ); - return HandlerTableGenerateWithFind(key, functions); } Result NotificationServiceImpl::RegisterAlarmSetting(AlarmSettingId* out_alarm_setting_id, @@ -160,6 +124,18 @@ std::vector::iterator NotificationServiceImpl::GetAlarmFromId(Alar INotificationServicesForApplication::INotificationServicesForApplication(Core::System& system_) : ServiceFramework{system_, "notif:a"} { + // clang-format off + static const FunctionInfo functions[] = { + {500, D<&INotificationServicesForApplication::RegisterAlarmSetting>, "RegisterAlarmSetting"}, + {510, D<&INotificationServicesForApplication::UpdateAlarmSetting>, "UpdateAlarmSetting"}, + {520, D<&INotificationServicesForApplication::ListAlarmSettings>, "ListAlarmSettings"}, + {530, D<&INotificationServicesForApplication::LoadApplicationParameter>, "LoadApplicationParameter"}, + {540, D<&INotificationServicesForApplication::DeleteAlarmSetting>, "DeleteAlarmSetting"}, + {1000, D<&INotificationServicesForApplication::Initialize>, "Initialize"}, + }; + // clang-format on + + RegisterHandlers(functions); } INotificationServicesForApplication::~INotificationServicesForApplication() = default; @@ -202,13 +178,18 @@ class INotificationSystemEventAccessor final : public ServiceFramework { public: explicit INotificationSystemEventAccessor(Core::System& system_) - : ServiceFramework{system_, "INotificationSystemEventAccessor"} - , service_context{system_, "INotificationSystemEventAccessor"} { - notification_event = service_context.CreateEvent("INotificationSystemEventAccessor:NotificationEvent"); - } + : ServiceFramework{system_, "INotificationSystemEventAccessor"}, + service_context{system_, "INotificationSystemEventAccessor"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&INotificationSystemEventAccessor::GetSystemEvent>, "GetSystemEvent"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + notification_event = + service_context.CreateEvent("INotificationSystemEventAccessor:NotificationEvent"); } ~INotificationSystemEventAccessor() { @@ -223,15 +204,38 @@ private: R_SUCCEED(); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&INotificationSystemEventAccessor::GetSystemEvent>, "GetSystemEvent"} - ); KernelHelpers::ServiceContext service_context; Kernel::KEvent* notification_event; }; INotificationServices::INotificationServices(Core::System& system_) : ServiceFramework{system_, "notif:s"} { + // clang-format off + static const FunctionInfo functions[] = { + {500, D<&INotificationServices::RegisterAlarmSetting>, "RegisterAlarmSetting"}, + {510, D<&INotificationServices::UpdateAlarmSetting>, "UpdateAlarmSetting"}, + {520, D<&INotificationServices::ListAlarmSettings>, "ListAlarmSettings"}, + {530, D<&INotificationServices::LoadApplicationParameter>, "LoadApplicationParameter"}, + {540, D<&INotificationServices::DeleteAlarmSetting>, "DeleteAlarmSetting"}, + {1000, D<&INotificationServices::Initialize>, "Initialize"}, + {1010, nullptr, "ListNotifications"}, + {1020, nullptr, "DeleteNotification"}, + {1030, nullptr, "ClearNotifications"}, + {1040, D<&INotificationServices::OpenNotificationSystemEventAccessor>, "OpenNotificationSystemEventAccessor"}, + {1500, nullptr, "SetNotificationPresentationSetting"}, + {1510, D<&INotificationServices::GetNotificationPresentationSetting>, "GetNotificationPresentationSetting"}, + {2000, nullptr, "GetAlarmSetting"}, + {2001, nullptr, "GetAlarmSettingWithApplicationParameter"}, + {2010, nullptr, "MuteAlarmSetting"}, + {2020, nullptr, "IsAlarmSettingReady"}, + {8000, nullptr, "RegisterAppletResourceUserId"}, + {8010, nullptr, "UnregisterAppletResourceUserId"}, + {8999, nullptr, "GetCurrentTime"}, + {9000, nullptr, "GetAlarmSettingNextNotificationTime"}, + }; + // clang-format on + + RegisterHandlers(functions); } INotificationServices::~INotificationServices() = default; diff --git a/src/core/hle/service/glue/notif.h b/src/core/hle/service/glue/notif.h index c5367e5da4..7ae20ba6f8 100644 --- a/src/core/hle/service/glue/notif.h +++ b/src/core/hle/service/glue/notif.h @@ -101,7 +101,6 @@ private: Result DeleteAlarmSetting(AlarmSettingId alarm_setting_id); Result Initialize(ClientAppletResourceUserId aruid); - std::optional FindRequest(u32 key) override; NotificationServiceImpl impl; }; @@ -131,7 +130,6 @@ private: Out out_notification_presentation_setting, NotificationChannel notification_channel); - std::optional FindRequest(u32 key) override; NotificationServiceImpl impl; }; } // namespace Service::Glue diff --git a/src/core/hle/service/glue/time/alarm_worker.h b/src/core/hle/service/glue/time/alarm_worker.h index 131d012a6a..c8882fed88 100644 --- a/src/core/hle/service/glue/time/alarm_worker.h +++ b/src/core/hle/service/glue/time/alarm_worker.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/glue/time/file_timestamp_worker.cpp b/src/core/hle/service/glue/time/file_timestamp_worker.cpp index 048ff174c9..60bd688e72 100644 --- a/src/core/hle/service/glue/time/file_timestamp_worker.cpp +++ b/src/core/hle/service/glue/time/file_timestamp_worker.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/glue/time/file_timestamp_worker.h b/src/core/hle/service/glue/time/file_timestamp_worker.h index 5f8b9b0499..58f74e7d29 100644 --- a/src/core/hle/service/glue/time/file_timestamp_worker.h +++ b/src/core/hle/service/glue/time/file_timestamp_worker.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/glue/time/manager.cpp b/src/core/hle/service/glue/time/manager.cpp index 0da790e1c8..0b3312904e 100644 --- a/src/core/hle/service/glue/time/manager.cpp +++ b/src/core/hle/service/glue/time/manager.cpp @@ -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-FileCopyrightText: Copyright 2023 yuzu Emulator Project diff --git a/src/core/hle/service/glue/time/manager.h b/src/core/hle/service/glue/time/manager.h index 87e6a21fd5..5a86585754 100644 --- a/src/core/hle/service/glue/time/manager.h +++ b/src/core/hle/service/glue/time/manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/glue/time/pm_state_change_handler.cpp b/src/core/hle/service/glue/time/pm_state_change_handler.cpp index 7470fb2259..0bc37f75da 100644 --- a/src/core/hle/service/glue/time/pm_state_change_handler.cpp +++ b/src/core/hle/service/glue/time/pm_state_change_handler.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/glue/time/pm_state_change_handler.h b/src/core/hle/service/glue/time/pm_state_change_handler.h index 27d9f78726..bf99fa8a14 100644 --- a/src/core/hle/service/glue/time/pm_state_change_handler.h +++ b/src/core/hle/service/glue/time/pm_state_change_handler.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/glue/time/standard_steady_clock_resource.cpp b/src/core/hle/service/glue/time/standard_steady_clock_resource.cpp index 5ebaa33e00..e191405567 100644 --- a/src/core/hle/service/glue/time/standard_steady_clock_resource.cpp +++ b/src/core/hle/service/glue/time/standard_steady_clock_resource.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/glue/time/standard_steady_clock_resource.h b/src/core/hle/service/glue/time/standard_steady_clock_resource.h index 978d6b63b8..b5168cb837 100644 --- a/src/core/hle/service/glue/time/standard_steady_clock_resource.h +++ b/src/core/hle/service/glue/time/standard_steady_clock_resource.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/glue/time/static.cpp b/src/core/hle/service/glue/time/static.cpp index dc7651fd1f..beccf6ce43 100644 --- a/src/core/hle/service/glue/time/static.cpp +++ b/src/core/hle/service/glue/time/static.cpp @@ -24,42 +24,42 @@ namespace Service::Glue::Time { -std::optional StaticService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"}, - FunctionInfo{1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"}, - FunctionInfo{2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"}, - FunctionInfo{3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"}, - FunctionInfo{4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"}, - FunctionInfo{5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"}, - FunctionInfo{20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"}, - FunctionInfo{50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"}, - FunctionInfo{51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"}, - FunctionInfo{100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"}, - FunctionInfo{101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"}, - FunctionInfo{102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"}, - FunctionInfo{200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"}, - FunctionInfo{201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"}, - FunctionInfo{300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"}, - FunctionInfo{400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"}, - FunctionInfo{401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"}, - FunctionInfo{500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"}, - FunctionInfo{501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - StaticService::StaticService(Core::System& system_, Service::PSC::Time::StaticServiceSetupInfo setup_info, std::shared_ptr time, const char* name) - : ServiceFramework{system_, name}, m_time_m{time->m_time_m}, + : ServiceFramework{system_, name}, m_system{system_}, m_time_m{time->m_time_m}, m_setup_info{setup_info}, m_time_sm{time->m_time_sm}, m_file_timestamp_worker{time->m_file_timestamp_worker}, m_standard_steady_clock_resource{time->m_steady_clock_resource}, m_time_zone_binary{time->m_time_zone_binary} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"}, + {1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"}, + {2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"}, + {3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"}, + {4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"}, + {5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"}, + {20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"}, + {50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"}, + {51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"}, + {100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"}, + {101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"}, + {102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"}, + {200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"}, + {201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"}, + {300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"}, + {400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"}, + {401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"}, + {500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"}, + {501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"}, + }; + // clang-format on + + RegisterHandlers(functions); m_set_sys = - system.ServiceManager().GetService("set:sys", true); + m_system.ServiceManager().GetService("set:sys", true); if (m_setup_info.can_write_local_clock && m_setup_info.can_write_user_clock && !m_setup_info.can_write_network_clock && m_setup_info.can_write_timezone_device_location && @@ -109,7 +109,7 @@ Result StaticService::GetTimeZoneService(OutInterface out_servi LOG_DEBUG(Service_Time, "called."); *out_service = std::make_shared( - system, m_file_timestamp_worker, m_setup_info.can_write_timezone_device_location, + m_system, m_file_timestamp_worker, m_setup_info.can_write_timezone_device_location, m_time_zone_binary, m_time_zone); R_SUCCEED(); } diff --git a/src/core/hle/service/glue/time/static.h b/src/core/hle/service/glue/time/static.h index 5856553461..a52b84bf31 100644 --- a/src/core/hle/service/glue/time/static.h +++ b/src/core/hle/service/glue/time/static.h @@ -72,11 +72,12 @@ public: Result CalculateSpanBetween(Out out_time, InClockSnapshot a, InClockSnapshot b); private: - std::optional FindRequest(u32 key) override; + Core::System& m_system; std::shared_ptr m_set_sys; std::shared_ptr m_time_m; std::shared_ptr m_wrapped_service; + Service::PSC::Time::StaticServiceSetupInfo m_setup_info; std::shared_ptr m_time_sm; std::shared_ptr m_time_zone; diff --git a/src/core/hle/service/glue/time/time_zone.cpp b/src/core/hle/service/glue/time/time_zone.cpp index 6e861b4060..52bd651f2b 100644 --- a/src/core/hle/service/glue/time/time_zone.cpp +++ b/src/core/hle/service/glue/time/time_zone.cpp @@ -19,26 +19,6 @@ namespace Service::Glue::Time { -std::optional TimeZoneService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"}, - FunctionInfo{1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"}, - FunctionInfo{2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"}, - FunctionInfo{3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"}, - FunctionInfo{4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"}, - FunctionInfo{5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"}, - FunctionInfo{6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"}, - FunctionInfo{7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"}, - FunctionInfo{8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"}, - FunctionInfo{20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"}, - FunctionInfo{100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"}, - FunctionInfo{101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"}, - FunctionInfo{201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"}, - FunctionInfo{202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - TimeZoneService::TimeZoneService( Core::System& system_, FileTimestampWorker& file_timestamp_worker, bool can_write_timezone_device_location, TimeZoneBinary& time_zone_binary, @@ -50,6 +30,26 @@ TimeZoneService::TimeZoneService( , m_operation_event{system} , m_time_zone_binary{time_zone_binary} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"}, + {1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"}, + {2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"}, + {3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"}, + {4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"}, + {5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"}, + {6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"}, + {7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"}, + {8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"}, + {20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"}, + {100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"}, + {101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"}, + {201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"}, + {202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"}, + }; + // clang-format on + RegisterHandlers(functions); + m_set_sys = system.ServiceManager().GetService("set:sys", true); } diff --git a/src/core/hle/service/glue/time/time_zone.h b/src/core/hle/service/glue/time/time_zone.h index 839d823e67..635070263b 100644 --- a/src/core/hle/service/glue/time/time_zone.h +++ b/src/core/hle/service/glue/time/time_zone.h @@ -80,7 +80,6 @@ public: const Service::PSC::Time::CalendarTime& calendar_time); private: - std::optional FindRequest(u32 key) override; std::shared_ptr m_set_sys; bool m_can_write_timezone_device_location; FileTimestampWorker& m_file_timestamp_worker; diff --git a/src/core/hle/service/glue/time/time_zone_binary.cpp b/src/core/hle/service/glue/time/time_zone_binary.cpp index 3cc1a62afd..eadad551e5 100644 --- a/src/core/hle/service/glue/time/time_zone_binary.cpp +++ b/src/core/hle/service/glue/time/time_zone_binary.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/glue/time/time_zone_binary.h b/src/core/hle/service/glue/time/time_zone_binary.h index 135da631f2..012b933573 100644 --- a/src/core/hle/service/glue/time/time_zone_binary.h +++ b/src/core/hle/service/glue/time/time_zone_binary.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/glue/time/worker.h b/src/core/hle/service/glue/time/worker.h index 69904e6748..f4be2ff367 100644 --- a/src/core/hle/service/glue/time/worker.h +++ b/src/core/hle/service/glue/time/worker.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/gpio/gpio.cpp b/src/core/hle/service/gpio/gpio.cpp index 5441149c65..8b4aa0f5ab 100644 --- a/src/core/hle/service/gpio/gpio.cpp +++ b/src/core/hle/service/gpio/gpio.cpp @@ -13,15 +13,15 @@ namespace Service::GPIO { class GPIO final : public ServiceFramework { public: - explicit GPIO(Core::System& system_) : ServiceFramework{system_, "gpio"} {} - ~GPIO() override = default; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit GPIO(Core::System& system_) + : ServiceFramework{system_, "gpio"} + { + static const FunctionInfo functions[] = { + {0, nullptr, "Cmd0"}, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Cmd0"} - ); + ~GPIO() override = default; }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/grc/grc.cpp b/src/core/hle/service/grc/grc.cpp index 5f6c84e914..e8e901662d 100644 --- a/src/core/hle/service/grc/grc.cpp +++ b/src/core/hle/service/grc/grc.cpp @@ -14,31 +14,32 @@ namespace Service::GRC { class GRC final : public ServiceFramework { public: - explicit GRC(Core::System& system_) : ServiceFramework{system_, "grc:c"} {} + explicit GRC(Core::System& system_) : ServiceFramework{system_, "grc:c"} { + // clang-format off + static const FunctionInfo functions[] = { + {1, nullptr, "OpenContinuousRecorder"}, + {2, nullptr, "OpenGameMovieTrimmer"}, + {3, nullptr, "OpenOffscreenRecorder"}, + {101, nullptr, "CreateMovieMaker"}, + {9903, nullptr, "SetOffscreenRecordingMarker"} + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, nullptr, "OpenContinuousRecorder"}, - FunctionInfo{2, nullptr, "OpenGameMovieTrimmer"}, - FunctionInfo{3, nullptr, "OpenOffscreenRecorder"}, - FunctionInfo{101, nullptr, "CreateMovieMaker"}, - FunctionInfo{9903, nullptr, "SetOffscreenRecordingMarker"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class GRC_D final : public ServiceFramework { public: - explicit GRC_D(Core::System& system_) : ServiceFramework{system_, "grc:d"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, nullptr, "Initialize"}, - FunctionInfo{2, nullptr, "Transfer"}, - FunctionInfo{3, nullptr, "Cmd3"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit GRC_D(Core::System& system_) : ServiceFramework{system_, "grc:d"} { + // clang-format off + static const FunctionInfo functions[] = { + {1, nullptr, "Initialize"}, + {2, nullptr, "Transfer"}, + {3, nullptr, "Cmd3"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/grc/grc.h b/src/core/hle/service/grc/grc.h index a3f8a5b90e..4c2b45057d 100644 --- a/src/core/hle/service/grc/grc.h +++ b/src/core/hle/service/grc/grc.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/hid/active_vibration_device_list.cpp b/src/core/hle/service/hid/active_vibration_device_list.cpp index 7a4f4cce2c..e0d6d3f2d9 100644 --- a/src/core/hle/service/hid/active_vibration_device_list.cpp +++ b/src/core/hle/service/hid/active_vibration_device_list.cpp @@ -14,16 +14,16 @@ namespace Service::HID { -std::optional IActiveVibrationDeviceList::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IActiveVibrationDeviceList::ActivateVibrationDevice>, "ActivateVibrationDevice"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IActiveVibrationDeviceList::IActiveVibrationDeviceList(Core::System& system_, std::shared_ptr resource) : ServiceFramework{system_, "IActiveVibrationDeviceList"}, resource_manager(resource) { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&IActiveVibrationDeviceList::ActivateVibrationDevice>, "ActivateVibrationDevice"}, + }; + // clang-format on + + RegisterHandlers(functions); } IActiveVibrationDeviceList::~IActiveVibrationDeviceList() = default; diff --git a/src/core/hle/service/hid/active_vibration_device_list.h b/src/core/hle/service/hid/active_vibration_device_list.h index 57c31a8df1..f155eaf839 100644 --- a/src/core/hle/service/hid/active_vibration_device_list.h +++ b/src/core/hle/service/hid/active_vibration_device_list.h @@ -29,8 +29,8 @@ public: private: static constexpr std::size_t MaxVibrationDevicesHandles{0x100}; + Result ActivateVibrationDevice(Core::HID::VibrationDeviceHandle vibration_device_handle); - std::optional FindRequest(u32 key) override; mutable std::mutex mutex; std::size_t list_size{}; diff --git a/src/core/hle/service/hid/applet_resource.cpp b/src/core/hle/service/hid/applet_resource.cpp index 6f658fa875..44ae767841 100644 --- a/src/core/hle/service/hid/applet_resource.cpp +++ b/src/core/hle/service/hid/applet_resource.cpp @@ -12,17 +12,14 @@ namespace Service::HID { -std::optional IAppletResource::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IAppletResource::GetSharedMemoryHandle>, "GetSharedMemoryHandle"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IAppletResource::IAppletResource(Core::System& system_, std::shared_ptr resource, u64 applet_resource_user_id) : ServiceFramework{system_, "IAppletResource"}, aruid{applet_resource_user_id}, resource_manager{resource} { + static const FunctionInfo functions[] = { + {0, C<&IAppletResource::GetSharedMemoryHandle>, "GetSharedMemoryHandle"}, + }; + RegisterHandlers(functions); } IAppletResource::~IAppletResource() { diff --git a/src/core/hle/service/hid/applet_resource.h b/src/core/hle/service/hid/applet_resource.h index 7b5d915218..40c3852baa 100644 --- a/src/core/hle/service/hid/applet_resource.h +++ b/src/core/hle/service/hid/applet_resource.h @@ -32,7 +32,6 @@ public: private: Result GetSharedMemoryHandle(OutCopyHandle out_shared_memory_handle); - std::optional FindRequest(u32 key) override; u64 aruid{}; std::shared_ptr resource_manager; }; diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 0ea587312b..25096ff36f 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -16,24 +16,19 @@ #include "core/hle/service/server_manager.h" #include "hid_core/resource_manager.h" #include "hid_core/resources/hid_firmware_settings.h" -#include "core/hle/service/ipc_helpers.h" -#include "hid_core/hid_types.h" -#include "hid_core/resources/touch_screen/gesture.h" -#include "hid_core/resources/touch_screen/touch_screen.h" -#include "core/hle/service/cmif_serialization.h" namespace Service::HID { class IHidTemporaryServer final : public ServiceFramework { public: explicit IHidTemporaryServer(Core::System& system_) - : ServiceFramework{system_, "hid:tmp"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetConsoleSixAxisSensorCalibrationValues"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "hid:tmp"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetConsoleSixAxisSensorCalibrationValues"}, + }; + // clang-format on + RegisterHandlers(functions); } ~IHidTemporaryServer() override = default; }; @@ -41,17 +36,17 @@ public: class AHID_CD final : public ServiceFramework { public: explicit AHID_CD(Core::System& system_) - : ServiceFramework{system_, "ahid:cd"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "AcquireDevice"}, - FunctionInfo{1, nullptr, "ReleaseDevice"}, - FunctionInfo{2, nullptr, "GetCtrlSession"}, - FunctionInfo{3, nullptr, "GetReadSession"}, - FunctionInfo{4, nullptr, "GetWriteSession"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "ahid:cd"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "AcquireDevice"}, + {1, nullptr, "ReleaseDevice"}, + {2, nullptr, "GetCtrlSession"}, + {3, nullptr, "GetReadSession"}, + {4, nullptr, "GetWriteSession"}, + }; + // clang-format on + RegisterHandlers(functions); } ~AHID_CD() override = default; }; @@ -59,322 +54,22 @@ public: class AHID_HDR final : public ServiceFramework { public: explicit AHID_HDR(Core::System& system_) - : ServiceFramework{system_, "ahid:hdr"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetDeviceEntries"}, - FunctionInfo{1, nullptr, "GetDeviceList"}, - FunctionInfo{2, nullptr, "GetDeviceParameters"}, - FunctionInfo{3, nullptr, "AttachDevice"}, - FunctionInfo{4, nullptr, "DetachDevice"}, - FunctionInfo{5, nullptr, "SetDeviceFilter"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "ahid:hdr"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetDeviceEntries"}, + {1, nullptr, "GetDeviceList"}, + {2, nullptr, "GetDeviceParameters"}, + {3, nullptr, "AttachDevice"}, + {4, nullptr, "DetachDevice"}, + {5, nullptr, "SetDeviceFilter"}, + }; + // clang-format on + RegisterHandlers(functions); } ~AHID_HDR() override = default; }; -class IHidDebugServer final : public ServiceFramework { -public: - explicit IHidDebugServer(Core::System& system_, std::shared_ptr resource, - std::shared_ptr settings) - : ServiceFramework{system_, "hid:dbg"} - , resource_manager{resource} - , firmware_settings{settings} - {} - - ~IHidDebugServer() override = default; - - Result DeactivateTouchScreen() { - LOG_INFO(Service_HID, "called"); - - if (!firmware_settings->IsDeviceManaged()) { - R_RETURN(GetResourceManager()->GetTouchScreen()->Deactivate()); - } - - R_SUCCEED(); - } - - Result SetTouchScreenAutoPilotState( - InArray auto_pilot_buffer) { - AutoPilotState auto_pilot{}; - - auto_pilot.count = - static_cast((std::min)(auto_pilot_buffer.size(), auto_pilot.state.size())); - memcpy(auto_pilot.state.data(), auto_pilot_buffer.data(), - auto_pilot.count * sizeof(TouchState)); - - LOG_INFO(Service_HID, "called, auto_pilot_count={}", auto_pilot.count); - - R_RETURN(GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot)); - } - - Result UnsetTouchScreenAutoPilotState() { - LOG_INFO(Service_HID, "called"); - R_RETURN(GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState()); - } - - Result GetTouchScreenConfiguration( - Out out_touchscreen_config, - ClientAppletResourceUserId aruid) { - LOG_INFO(Service_HID, "called, applet_resource_user_id={}", aruid.pid); - - R_TRY(GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration( - *out_touchscreen_config, aruid.pid)); - - if (out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Heat2 && - out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Finger) { - out_touchscreen_config->mode = Core::HID::TouchScreenModeForNx::UseSystemSetting; - } - - R_SUCCEED(); - } - - Result ProcessTouchScreenAutoTune() { - LOG_INFO(Service_HID, "called"); - R_RETURN(GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune()); - } - - Result ForceStopTouchScreenManagement() { - LOG_INFO(Service_HID, "called"); - - if (!firmware_settings->IsDeviceManaged()) { - R_SUCCEED(); - } - - auto touch_screen = GetResourceManager()->GetTouchScreen(); - auto gesture = GetResourceManager()->GetGesture(); - - if (firmware_settings->IsTouchI2cManaged()) { - bool is_touch_active{}; - bool is_gesture_active{}; - R_TRY(touch_screen->IsActive(is_touch_active)); - R_TRY(gesture->IsActive(is_gesture_active)); - - if (is_touch_active) { - R_TRY(touch_screen->Deactivate()); - } - if (is_gesture_active) { - R_TRY(gesture->Deactivate()); - } - } - - R_SUCCEED(); - } - - Result ForceRestartTouchScreenManagement(u32 basic_gesture_id, - ClientAppletResourceUserId aruid) { - LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}", - basic_gesture_id, aruid.pid); - - auto touch_screen = GetResourceManager()->GetTouchScreen(); - auto gesture = GetResourceManager()->GetGesture(); - - if (firmware_settings->IsDeviceManaged() && firmware_settings->IsTouchI2cManaged()) { - R_TRY(gesture->Activate()); - R_TRY(gesture->Activate(aruid.pid, basic_gesture_id)); - R_TRY(touch_screen->Activate()); - R_TRY(touch_screen->Activate(aruid.pid)); - } - - R_SUCCEED(); - } - - Result IsTouchScreenManaged(Out out_is_managed) { - LOG_INFO(Service_HID, "called"); - - bool is_touch_active{}; - bool is_gesture_active{}; - R_TRY(GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active)); - R_TRY(GetResourceManager()->GetGesture()->IsActive(is_gesture_active)); - - *out_is_managed = is_touch_active || is_gesture_active; - R_SUCCEED(); - } - - Result DeactivateGesture() { - LOG_INFO(Service_HID, "called"); - - if (!firmware_settings->IsDeviceManaged()) { - R_RETURN(GetResourceManager()->GetGesture()->Deactivate()); - } - - R_SUCCEED(); - } - - std::shared_ptr GetResourceManager() { - resource_manager->Initialize(); - return resource_manager; - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "DeactivateDebugPad"}, - FunctionInfo{1, nullptr, "SetDebugPadAutoPilotState"}, - FunctionInfo{2, nullptr, "UnsetDebugPadAutoPilotState"}, - FunctionInfo{10, C<&IHidDebugServer::DeactivateTouchScreen>, "DeactivateTouchScreen"}, - FunctionInfo{11, C<&IHidDebugServer::SetTouchScreenAutoPilotState>, "SetTouchScreenAutoPilotState"}, - FunctionInfo{12, C<&IHidDebugServer::UnsetTouchScreenAutoPilotState>, "UnsetTouchScreenAutoPilotState"}, - FunctionInfo{13, C<&IHidDebugServer::GetTouchScreenConfiguration>, "GetTouchScreenConfiguration"}, - FunctionInfo{14, C<&IHidDebugServer::ProcessTouchScreenAutoTune>, "ProcessTouchScreenAutoTune"}, - FunctionInfo{15, C<&IHidDebugServer::ForceStopTouchScreenManagement>, "ForceStopTouchScreenManagement"}, - FunctionInfo{16, C<&IHidDebugServer::ForceRestartTouchScreenManagement>, "ForceRestartTouchScreenManagement"}, - FunctionInfo{17, C<&IHidDebugServer::IsTouchScreenManaged>, "IsTouchScreenManaged"}, - FunctionInfo{20, nullptr, "DeactivateMouse"}, - FunctionInfo{21, nullptr, "SetMouseAutoPilotState"}, - FunctionInfo{22, nullptr, "UnsetMouseAutoPilotState"}, - FunctionInfo{23, nullptr, "AddMouseSideWheelDelta"}, - FunctionInfo{25, nullptr, "SetDebugMouseAutoPilotState"}, - FunctionInfo{26, nullptr, "UnsetDebugMouseAutoPilotState"}, - FunctionInfo{30, nullptr, "DeactivateKeyboard"}, - FunctionInfo{31, nullptr, "SetKeyboardAutoPilotState"}, - FunctionInfo{32, nullptr, "UnsetKeyboardAutoPilotState"}, - FunctionInfo{50, nullptr, "DeactivateXpad"}, - FunctionInfo{51, nullptr, "SetXpadAutoPilotState"}, - FunctionInfo{52, nullptr, "UnsetXpadAutoPilotState"}, - FunctionInfo{53, nullptr, "DeactivateJoyXpad"}, - FunctionInfo{60, nullptr, "ClearNpadSystemCommonPolicy"}, - FunctionInfo{61, nullptr, "DeactivateNpad"}, - FunctionInfo{62, nullptr, "ForceDisconnectNpad"}, - FunctionInfo{91, C<&IHidDebugServer::DeactivateGesture>, "DeactivateGesture"}, - FunctionInfo{110, nullptr, "DeactivateHomeButton"}, - FunctionInfo{111, nullptr, "SetHomeButtonAutoPilotState"}, - FunctionInfo{112, nullptr, "UnsetHomeButtonAutoPilotState"}, - FunctionInfo{120, nullptr, "DeactivateSleepButton"}, - FunctionInfo{121, nullptr, "SetSleepButtonAutoPilotState"}, - FunctionInfo{122, nullptr, "UnsetSleepButtonAutoPilotState"}, - FunctionInfo{123, nullptr, "DeactivateInputDetector"}, - FunctionInfo{130, nullptr, "DeactivateCaptureButton"}, - FunctionInfo{131, nullptr, "SetCaptureButtonAutoPilotState"}, - FunctionInfo{132, nullptr, "UnsetCaptureButtonAutoPilotState"}, - FunctionInfo{133, nullptr, "SetShiftAccelerometerCalibrationValue"}, - FunctionInfo{134, nullptr, "GetShiftAccelerometerCalibrationValue"}, - FunctionInfo{135, nullptr, "SetShiftGyroscopeCalibrationValue"}, - FunctionInfo{136, nullptr, "GetShiftGyroscopeCalibrationValue"}, - FunctionInfo{140, nullptr, "DeactivateConsoleSixAxisSensor"}, - FunctionInfo{141, nullptr, "GetConsoleSixAxisSensorSamplingFrequency"}, - FunctionInfo{142, nullptr, "DeactivateSevenSixAxisSensor"}, - FunctionInfo{143, nullptr, "GetConsoleSixAxisSensorCountStates"}, - FunctionInfo{144, nullptr, "GetAccelerometerFsr"}, - FunctionInfo{145, nullptr, "SetAccelerometerFsr"}, - FunctionInfo{146, nullptr, "GetAccelerometerOdr"}, - FunctionInfo{147, nullptr, "SetAccelerometerOdr"}, - FunctionInfo{148, nullptr, "GetGyroscopeFsr"}, - FunctionInfo{149, nullptr, "SetGyroscopeFsr"}, - FunctionInfo{150, nullptr, "GetGyroscopeOdr"}, - FunctionInfo{151, nullptr, "SetGyroscopeOdr"}, - FunctionInfo{152, nullptr, "GetWhoAmI"}, - FunctionInfo{201, nullptr, "ActivateFirmwareUpdate"}, - FunctionInfo{202, nullptr, "DeactivateFirmwareUpdate"}, - FunctionInfo{203, nullptr, "StartFirmwareUpdate"}, - FunctionInfo{204, nullptr, "GetFirmwareUpdateStage"}, - FunctionInfo{205, nullptr, "GetFirmwareVersion"}, - FunctionInfo{206, nullptr, "GetDestinationFirmwareVersion"}, - FunctionInfo{207, nullptr, "DiscardFirmwareInfoCacheForRevert"}, - FunctionInfo{208, nullptr, "StartFirmwareUpdateForRevert"}, - FunctionInfo{209, nullptr, "GetAvailableFirmwareVersionForRevert"}, - FunctionInfo{210, nullptr, "IsFirmwareUpdatingDevice"}, - FunctionInfo{211, nullptr, "StartFirmwareUpdateIndividual"}, - FunctionInfo{212, nullptr, "GetDetailFirmwareVersion", MakeVersionGate({19,0,0})}, - FunctionInfo{215, nullptr, "SetUsbFirmwareForceUpdateEnabled"}, - FunctionInfo{216, nullptr, "SetAllKuinaDevicesToFirmwareUpdateMode"}, - FunctionInfo{221, nullptr, "UpdateControllerColor"}, - FunctionInfo{222, nullptr, "ConnectUsbPadsAsync"}, - FunctionInfo{223, nullptr, "DisconnectUsbPadsAsync"}, - FunctionInfo{224, nullptr, "UpdateDesignInfo"}, - FunctionInfo{225, nullptr, "GetUniquePadDriverState"}, - FunctionInfo{226, nullptr, "GetSixAxisSensorDriverStates"}, - FunctionInfo{227, nullptr, "GetRxPacketHistory"}, - FunctionInfo{228, nullptr, "AcquireOperationEventHandle"}, - FunctionInfo{229, nullptr, "ReadSerialFlash"}, - FunctionInfo{230, nullptr, "WriteSerialFlash"}, - FunctionInfo{231, nullptr, "GetOperationResult"}, - FunctionInfo{232, nullptr, "EnableShipmentMode"}, - FunctionInfo{233, nullptr, "ClearPairingInfo"}, - FunctionInfo{234, nullptr, "GetUniquePadDeviceTypeSetInternal"}, - FunctionInfo{235, nullptr, "EnableAnalogStickPower"}, - FunctionInfo{236, nullptr, "RequestKuinaUartClockCal"}, - FunctionInfo{237, nullptr, "GetKuinaUartClockCal"}, - FunctionInfo{238, nullptr, "SetKuinaUartClockTrim"}, - FunctionInfo{239, nullptr, "KuinaLoopbackTest"}, - FunctionInfo{240, nullptr, "RequestBatteryVoltage"}, - FunctionInfo{241, nullptr, "GetBatteryVoltage"}, - FunctionInfo{242, nullptr, "GetUniquePadPowerInfo"}, - FunctionInfo{243, nullptr, "RebootUniquePad"}, - FunctionInfo{244, nullptr, "RequestKuinaFirmwareVersion"}, - FunctionInfo{245, nullptr, "GetKuinaFirmwareVersion"}, - FunctionInfo{246, nullptr, "GetVidPid"}, - FunctionInfo{247, nullptr, "GetAnalogStickCalibrationValue"}, - FunctionInfo{248, nullptr, "GetUniquePadIdsFull"}, - FunctionInfo{249, nullptr, "ConnectUniquePad"}, - FunctionInfo{250, nullptr, "IsVirtual"}, - FunctionInfo{251, nullptr, "GetAnalogStickModuleParam"}, - FunctionInfo{253, nullptr, "ClearStorageForShipment", MakeVersionGate({19,0,0})}, - FunctionInfo{261, nullptr, "UpdateDesignInfo12", MakeVersionGate({21,0,0})}, - FunctionInfo{262, nullptr, "GetUniquePadButtonCount", MakeVersionGate({21,0,0})}, - FunctionInfo{267, nullptr, "SetAnalogStickCalibration", MakeVersionGate({21,0,0})}, - FunctionInfo{268, nullptr, "ResetAnalogStickCalibration", MakeVersionGate({21,0,0})}, - FunctionInfo{301, nullptr, "GetAbstractedPadHandles"}, - FunctionInfo{302, nullptr, "GetAbstractedPadState"}, - FunctionInfo{303, nullptr, "GetAbstractedPadsState"}, - FunctionInfo{321, nullptr, "SetAutoPilotVirtualPadState"}, - FunctionInfo{322, nullptr, "UnsetAutoPilotVirtualPadState"}, - FunctionInfo{323, nullptr, "UnsetAllAutoPilotVirtualPadState"}, - FunctionInfo{324, nullptr, "AttachHdlsWorkBuffer"}, - FunctionInfo{325, nullptr, "ReleaseHdlsWorkBuffer"}, - FunctionInfo{326, nullptr, "DumpHdlsNpadAssignmentState"}, - FunctionInfo{327, nullptr, "DumpHdlsStates"}, - FunctionInfo{328, nullptr, "ApplyHdlsNpadAssignmentState"}, - FunctionInfo{329, nullptr, "ApplyHdlsStateList"}, - FunctionInfo{330, nullptr, "AttachHdlsVirtualDevice"}, - FunctionInfo{331, nullptr, "DetachHdlsVirtualDevice"}, - FunctionInfo{332, nullptr, "SetHdlsState"}, - FunctionInfo{350, nullptr, "AddRegisteredDevice"}, - FunctionInfo{351, nullptr, "GetRegisteredDevicesCountDebug", MakeVersionGate({17,0,0}, {18,1,0})}, - FunctionInfo{352, nullptr, "DeleteRegisteredDevicesDebug", MakeVersionGate({17,0,0}, {18,1,0})}, - FunctionInfo{400, nullptr, "DisableExternalMcuOnNxDevice"}, - FunctionInfo{401, nullptr, "DisableRailDeviceFiltering"}, - FunctionInfo{402, nullptr, "EnableWiredPairing"}, - FunctionInfo{403, nullptr, "EnableShipmentModeAutoClear"}, - FunctionInfo{404, nullptr, "SetRailEnabled"}, - FunctionInfo{500, nullptr, "SetFactoryInt"}, - FunctionInfo{501, nullptr, "IsFactoryBootEnabled"}, - FunctionInfo{550, nullptr, "SetAnalogStickModelDataTemporarily"}, - FunctionInfo{551, nullptr, "GetAnalogStickModelData"}, - FunctionInfo{552, nullptr, "ResetAnalogStickModelData"}, - FunctionInfo{600, nullptr, "ConvertPadState"}, - FunctionInfo{601, nullptr, "IsButtonConfigSupported", MakeVersionGate({18,0,0})}, - FunctionInfo{602, nullptr, "IsButtonConfigEmbeddedSupported", MakeVersionGate({18,0,0})}, - FunctionInfo{603, nullptr, "DeleteButtonConfig", MakeVersionGate({18,0,0})}, - FunctionInfo{604, nullptr, "DeleteButtonConfigEmbedded", MakeVersionGate({18,0,0})}, - FunctionInfo{605, nullptr, "SetButtonConfigEnabled", MakeVersionGate({18,0,0})}, - FunctionInfo{606, nullptr, "SetButtonConfigEmbeddedEnabled", MakeVersionGate({18,0,0})}, - FunctionInfo{607, nullptr, "IsButtonConfigEnabled", MakeVersionGate({18,0,0})}, - FunctionInfo{608, nullptr, "IsButtonConfigEmbeddedEnabled", MakeVersionGate({18,0,0})}, - FunctionInfo{609, nullptr, "SetButtonConfigEmbedded", MakeVersionGate({18,0,0})}, - FunctionInfo{610, nullptr, "SetButtonConfigFull", MakeVersionGate({18,0,0})}, - FunctionInfo{611, nullptr, "SetButtonConfigLeft", MakeVersionGate({18,0,0})}, - FunctionInfo{612, nullptr, "SetButtonConfigRight", MakeVersionGate({18,0,0})}, - FunctionInfo{613, nullptr, "GetButtonConfigEmbedded", MakeVersionGate({18,0,0})}, - FunctionInfo{614, nullptr, "GetButtonConfigFull", MakeVersionGate({18,0,0})}, - FunctionInfo{615, nullptr, "GetButtonConfigLeft", MakeVersionGate({18,0,0})}, - FunctionInfo{616, nullptr, "GetButtonConfigRight", MakeVersionGate({18,0,0})}, - FunctionInfo{650, nullptr, "AddButtonPlayData"}, - FunctionInfo{651, nullptr, "StartButtonPlayData"}, - FunctionInfo{652, nullptr, "StopButtonPlayData"}, - FunctionInfo{700, nullptr, "GetRailAttachEventCount", MakeVersionGate({21,0,0})}, - FunctionInfo{2000, nullptr, "DeactivateDigitizer"}, - FunctionInfo{2001, nullptr, "SetDigitizerAutoPilotState"}, - FunctionInfo{2002, nullptr, "UnsetDigitizerAutoPilotState"}, - FunctionInfo{3000, nullptr, "ReloadFirmwareDebugSettings"} - ); - std::shared_ptr resource_manager; - std::shared_ptr firmware_settings; -}; - void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); auto firmware_settings = std::make_shared(system); diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index ec5463f4e2..bf8cd44481 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/hid/hid_debug_server.cpp b/src/core/hle/service/hid/hid_debug_server.cpp index 091d09dae5..42428a9ff9 100644 --- a/src/core/hle/service/hid/hid_debug_server.cpp +++ b/src/core/hle/service/hid/hid_debug_server.cpp @@ -18,4 +18,298 @@ namespace Service::HID { +IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr resource, + std::shared_ptr settings) + : ServiceFramework{system_, "hid:dbg"}, resource_manager{resource}, firmware_settings{ + settings} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "DeactivateDebugPad"}, + {1, nullptr, "SetDebugPadAutoPilotState"}, + {2, nullptr, "UnsetDebugPadAutoPilotState"}, + {10, C<&IHidDebugServer::DeactivateTouchScreen>, "DeactivateTouchScreen"}, + {11, C<&IHidDebugServer::SetTouchScreenAutoPilotState>, "SetTouchScreenAutoPilotState"}, + {12, C<&IHidDebugServer::UnsetTouchScreenAutoPilotState>, "UnsetTouchScreenAutoPilotState"}, + {13, C<&IHidDebugServer::GetTouchScreenConfiguration>, "GetTouchScreenConfiguration"}, + {14, C<&IHidDebugServer::ProcessTouchScreenAutoTune>, "ProcessTouchScreenAutoTune"}, + {15, C<&IHidDebugServer::ForceStopTouchScreenManagement>, "ForceStopTouchScreenManagement"}, + {16, C<&IHidDebugServer::ForceRestartTouchScreenManagement>, "ForceRestartTouchScreenManagement"}, + {17, C<&IHidDebugServer::IsTouchScreenManaged>, "IsTouchScreenManaged"}, + {20, nullptr, "DeactivateMouse"}, + {21, nullptr, "SetMouseAutoPilotState"}, + {22, nullptr, "UnsetMouseAutoPilotState"}, + {23, nullptr, "AddMouseSideWheelDelta"}, + {25, nullptr, "SetDebugMouseAutoPilotState"}, + {26, nullptr, "UnsetDebugMouseAutoPilotState"}, + {30, nullptr, "DeactivateKeyboard"}, + {31, nullptr, "SetKeyboardAutoPilotState"}, + {32, nullptr, "UnsetKeyboardAutoPilotState"}, + {50, nullptr, "DeactivateXpad"}, + {51, nullptr, "SetXpadAutoPilotState"}, + {52, nullptr, "UnsetXpadAutoPilotState"}, + {53, nullptr, "DeactivateJoyXpad"}, + {60, nullptr, "ClearNpadSystemCommonPolicy"}, + {61, nullptr, "DeactivateNpad"}, + {62, nullptr, "ForceDisconnectNpad"}, + {91, C<&IHidDebugServer::DeactivateGesture>, "DeactivateGesture"}, + {110, nullptr, "DeactivateHomeButton"}, + {111, nullptr, "SetHomeButtonAutoPilotState"}, + {112, nullptr, "UnsetHomeButtonAutoPilotState"}, + {120, nullptr, "DeactivateSleepButton"}, + {121, nullptr, "SetSleepButtonAutoPilotState"}, + {122, nullptr, "UnsetSleepButtonAutoPilotState"}, + {123, nullptr, "DeactivateInputDetector"}, + {130, nullptr, "DeactivateCaptureButton"}, + {131, nullptr, "SetCaptureButtonAutoPilotState"}, + {132, nullptr, "UnsetCaptureButtonAutoPilotState"}, + {133, nullptr, "SetShiftAccelerometerCalibrationValue"}, + {134, nullptr, "GetShiftAccelerometerCalibrationValue"}, + {135, nullptr, "SetShiftGyroscopeCalibrationValue"}, + {136, nullptr, "GetShiftGyroscopeCalibrationValue"}, + {140, nullptr, "DeactivateConsoleSixAxisSensor"}, + {141, nullptr, "GetConsoleSixAxisSensorSamplingFrequency"}, + {142, nullptr, "DeactivateSevenSixAxisSensor"}, + {143, nullptr, "GetConsoleSixAxisSensorCountStates"}, + {144, nullptr, "GetAccelerometerFsr"}, + {145, nullptr, "SetAccelerometerFsr"}, + {146, nullptr, "GetAccelerometerOdr"}, + {147, nullptr, "SetAccelerometerOdr"}, + {148, nullptr, "GetGyroscopeFsr"}, + {149, nullptr, "SetGyroscopeFsr"}, + {150, nullptr, "GetGyroscopeOdr"}, + {151, nullptr, "SetGyroscopeOdr"}, + {152, nullptr, "GetWhoAmI"}, + {201, nullptr, "ActivateFirmwareUpdate"}, + {202, nullptr, "DeactivateFirmwareUpdate"}, + {203, nullptr, "StartFirmwareUpdate"}, + {204, nullptr, "GetFirmwareUpdateStage"}, + {205, nullptr, "GetFirmwareVersion"}, + {206, nullptr, "GetDestinationFirmwareVersion"}, + {207, nullptr, "DiscardFirmwareInfoCacheForRevert"}, + {208, nullptr, "StartFirmwareUpdateForRevert"}, + {209, nullptr, "GetAvailableFirmwareVersionForRevert"}, + {210, nullptr, "IsFirmwareUpdatingDevice"}, + {211, nullptr, "StartFirmwareUpdateIndividual"}, + {212, nullptr, "GetDetailFirmwareVersion"}, // 19.0.0+ + {215, nullptr, "SetUsbFirmwareForceUpdateEnabled"}, + {216, nullptr, "SetAllKuinaDevicesToFirmwareUpdateMode"}, + {221, nullptr, "UpdateControllerColor"}, + {222, nullptr, "ConnectUsbPadsAsync"}, + {223, nullptr, "DisconnectUsbPadsAsync"}, + {224, nullptr, "UpdateDesignInfo"}, + {225, nullptr, "GetUniquePadDriverState"}, + {226, nullptr, "GetSixAxisSensorDriverStates"}, + {227, nullptr, "GetRxPacketHistory"}, + {228, nullptr, "AcquireOperationEventHandle"}, + {229, nullptr, "ReadSerialFlash"}, + {230, nullptr, "WriteSerialFlash"}, + {231, nullptr, "GetOperationResult"}, + {232, nullptr, "EnableShipmentMode"}, + {233, nullptr, "ClearPairingInfo"}, + {234, nullptr, "GetUniquePadDeviceTypeSetInternal"}, + {235, nullptr, "EnableAnalogStickPower"}, + {236, nullptr, "RequestKuinaUartClockCal"}, + {237, nullptr, "GetKuinaUartClockCal"}, + {238, nullptr, "SetKuinaUartClockTrim"}, + {239, nullptr, "KuinaLoopbackTest"}, + {240, nullptr, "RequestBatteryVoltage"}, + {241, nullptr, "GetBatteryVoltage"}, + {242, nullptr, "GetUniquePadPowerInfo"}, + {243, nullptr, "RebootUniquePad"}, + {244, nullptr, "RequestKuinaFirmwareVersion"}, + {245, nullptr, "GetKuinaFirmwareVersion"}, + {246, nullptr, "GetVidPid"}, + {247, nullptr, "GetAnalogStickCalibrationValue"}, + {248, nullptr, "GetUniquePadIdsFull"}, + {249, nullptr, "ConnectUniquePad"}, + {250, nullptr, "IsVirtual"}, + {251, nullptr, "GetAnalogStickModuleParam"}, + {253, nullptr, "ClearStorageForShipment"}, //19.0.0+ + {261, nullptr, "UpdateDesignInfo12"}, //21.0.0+ + {262, nullptr, "GetUniquePadButtonCount"}, //21.0.0+ + {267, nullptr, "SetAnalogStickCalibration"}, //21.0.0+ + {268, nullptr, "ResetAnalogStickCalibration"}, //21.0.0+ + {301, nullptr, "GetAbstractedPadHandles"}, + {302, nullptr, "GetAbstractedPadState"}, + {303, nullptr, "GetAbstractedPadsState"}, + {321, nullptr, "SetAutoPilotVirtualPadState"}, + {322, nullptr, "UnsetAutoPilotVirtualPadState"}, + {323, nullptr, "UnsetAllAutoPilotVirtualPadState"}, + {324, nullptr, "AttachHdlsWorkBuffer"}, + {325, nullptr, "ReleaseHdlsWorkBuffer"}, + {326, nullptr, "DumpHdlsNpadAssignmentState"}, + {327, nullptr, "DumpHdlsStates"}, + {328, nullptr, "ApplyHdlsNpadAssignmentState"}, + {329, nullptr, "ApplyHdlsStateList"}, + {330, nullptr, "AttachHdlsVirtualDevice"}, + {331, nullptr, "DetachHdlsVirtualDevice"}, + {332, nullptr, "SetHdlsState"}, + {350, nullptr, "AddRegisteredDevice"}, + {351, nullptr, "GetRegisteredDevicesCountDebug"}, //17.0.0-18.1.0 + {352, nullptr, "DeleteRegisteredDevicesDebug"}, //17.0.0-18.1.0 + {400, nullptr, "DisableExternalMcuOnNxDevice"}, + {401, nullptr, "DisableRailDeviceFiltering"}, + {402, nullptr, "EnableWiredPairing"}, + {403, nullptr, "EnableShipmentModeAutoClear"}, + {404, nullptr, "SetRailEnabled"}, + {500, nullptr, "SetFactoryInt"}, + {501, nullptr, "IsFactoryBootEnabled"}, + {550, nullptr, "SetAnalogStickModelDataTemporarily"}, + {551, nullptr, "GetAnalogStickModelData"}, + {552, nullptr, "ResetAnalogStickModelData"}, + {600, nullptr, "ConvertPadState"}, + {601, nullptr, "IsButtonConfigSupported"}, //18.0.0+ + {602, nullptr, "IsButtonConfigEmbeddedSupported"}, //18.0.0+ + {603, nullptr, "DeleteButtonConfig"}, //18.0.0+ + {604, nullptr, "DeleteButtonConfigEmbedded"}, //18.0.0+ + {605, nullptr, "SetButtonConfigEnabled"}, //18.0.0+ + {606, nullptr, "SetButtonConfigEmbeddedEnabled"}, //18.0.0+ + {607, nullptr, "IsButtonConfigEnabled"}, //18.0.0+ + {608, nullptr, "IsButtonConfigEmbeddedEnabled"}, //18.0.0+ + {609, nullptr, "SetButtonConfigEmbedded"}, //18.0.0+ + {610, nullptr, "SetButtonConfigFull"}, //18.0.0+ + {611, nullptr, "SetButtonConfigLeft"}, //18.0.0+ + {612, nullptr, "SetButtonConfigRight"}, //18.0.0+ + {613, nullptr, "GetButtonConfigEmbedded"}, //18.0.0+ + {614, nullptr, "GetButtonConfigFull"}, //18.0.0+ + {615, nullptr, "GetButtonConfigLeft"}, //18.0.0+ + {616, nullptr, "GetButtonConfigRight"}, //18.0.0+ + {650, nullptr, "AddButtonPlayData"}, + {651, nullptr, "StartButtonPlayData"}, + {652, nullptr, "StopButtonPlayData"}, + {700, nullptr, "GetRailAttachEventCount"}, //21.0.0+ + {2000, nullptr, "DeactivateDigitizer"}, + {2001, nullptr, "SetDigitizerAutoPilotState"}, + {2002, nullptr, "UnsetDigitizerAutoPilotState"}, + {3000, nullptr, "ReloadFirmwareDebugSettings"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +IHidDebugServer::~IHidDebugServer() = default; + +Result IHidDebugServer::DeactivateTouchScreen() { + LOG_INFO(Service_HID, "called"); + + if (!firmware_settings->IsDeviceManaged()) { + R_RETURN(GetResourceManager()->GetTouchScreen()->Deactivate()); + } + + R_SUCCEED(); +} + +Result IHidDebugServer::SetTouchScreenAutoPilotState( + InArray auto_pilot_buffer) { + AutoPilotState auto_pilot{}; + + auto_pilot.count = + static_cast((std::min)(auto_pilot_buffer.size(), auto_pilot.state.size())); + memcpy(auto_pilot.state.data(), auto_pilot_buffer.data(), + auto_pilot.count * sizeof(TouchState)); + + LOG_INFO(Service_HID, "called, auto_pilot_count={}", auto_pilot.count); + + R_RETURN(GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot)); +} + +Result IHidDebugServer::UnsetTouchScreenAutoPilotState() { + LOG_INFO(Service_HID, "called"); + R_RETURN(GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState()); +} + +Result IHidDebugServer::GetTouchScreenConfiguration( + Out out_touchscreen_config, + ClientAppletResourceUserId aruid) { + LOG_INFO(Service_HID, "called, applet_resource_user_id={}", aruid.pid); + + R_TRY(GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration( + *out_touchscreen_config, aruid.pid)); + + if (out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Heat2 && + out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Finger) { + out_touchscreen_config->mode = Core::HID::TouchScreenModeForNx::UseSystemSetting; + } + + R_SUCCEED(); +} + +Result IHidDebugServer::ProcessTouchScreenAutoTune() { + LOG_INFO(Service_HID, "called"); + R_RETURN(GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune()); +} + +Result IHidDebugServer::ForceStopTouchScreenManagement() { + LOG_INFO(Service_HID, "called"); + + if (!firmware_settings->IsDeviceManaged()) { + R_SUCCEED(); + } + + auto touch_screen = GetResourceManager()->GetTouchScreen(); + auto gesture = GetResourceManager()->GetGesture(); + + if (firmware_settings->IsTouchI2cManaged()) { + bool is_touch_active{}; + bool is_gesture_active{}; + R_TRY(touch_screen->IsActive(is_touch_active)); + R_TRY(gesture->IsActive(is_gesture_active)); + + if (is_touch_active) { + R_TRY(touch_screen->Deactivate()); + } + if (is_gesture_active) { + R_TRY(gesture->Deactivate()); + } + } + + R_SUCCEED(); +} + +Result IHidDebugServer::ForceRestartTouchScreenManagement(u32 basic_gesture_id, + ClientAppletResourceUserId aruid) { + LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}", + basic_gesture_id, aruid.pid); + + auto touch_screen = GetResourceManager()->GetTouchScreen(); + auto gesture = GetResourceManager()->GetGesture(); + + if (firmware_settings->IsDeviceManaged() && firmware_settings->IsTouchI2cManaged()) { + R_TRY(gesture->Activate()); + R_TRY(gesture->Activate(aruid.pid, basic_gesture_id)); + R_TRY(touch_screen->Activate()); + R_TRY(touch_screen->Activate(aruid.pid)); + } + + R_SUCCEED(); +} + +Result IHidDebugServer::IsTouchScreenManaged(Out out_is_managed) { + LOG_INFO(Service_HID, "called"); + + bool is_touch_active{}; + bool is_gesture_active{}; + R_TRY(GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active)); + R_TRY(GetResourceManager()->GetGesture()->IsActive(is_gesture_active)); + + *out_is_managed = is_touch_active || is_gesture_active; + R_SUCCEED(); +} + +Result IHidDebugServer::DeactivateGesture() { + LOG_INFO(Service_HID, "called"); + + if (!firmware_settings->IsDeviceManaged()) { + R_RETURN(GetResourceManager()->GetGesture()->Deactivate()); + } + + R_SUCCEED(); +} + +std::shared_ptr IHidDebugServer::GetResourceManager() { + resource_manager->Initialize(); + return resource_manager; +} + } // namespace Service::HID diff --git a/src/core/hle/service/hid/hid_debug_server.h b/src/core/hle/service/hid/hid_debug_server.h index 20cc1ed541..f48f0205ed 100644 --- a/src/core/hle/service/hid/hid_debug_server.h +++ b/src/core/hle/service/hid/hid_debug_server.h @@ -18,5 +18,31 @@ namespace Service::HID { class ResourceManager; class HidFirmwareSettings; +class IHidDebugServer final : public ServiceFramework { +public: + explicit IHidDebugServer(Core::System& system_, std::shared_ptr resource, + std::shared_ptr settings); + ~IHidDebugServer() override; + +private: + Result DeactivateTouchScreen(); + Result SetTouchScreenAutoPilotState( + InArray auto_pilot_buffer); + Result UnsetTouchScreenAutoPilotState(); + Result GetTouchScreenConfiguration( + Out out_touchscreen_config, + ClientAppletResourceUserId aruid); + Result ProcessTouchScreenAutoTune(); + Result ForceStopTouchScreenManagement(); + Result ForceRestartTouchScreenManagement(u32 basic_gesture_id, + ClientAppletResourceUserId aruid); + Result IsTouchScreenManaged(Out out_is_managed); + Result DeactivateGesture(); + + std::shared_ptr GetResourceManager(); + + std::shared_ptr resource_manager; + std::shared_ptr firmware_settings; +}; } // namespace Service::HID diff --git a/src/core/hle/service/hid/hid_server.cpp b/src/core/hle/service/hid/hid_server.cpp index 18e57628d0..9689bce8dd 100644 --- a/src/core/hle/service/hid/hid_server.cpp +++ b/src/core/hle/service/hid/hid_server.cpp @@ -42,207 +42,207 @@ namespace Service::HID { -std::optional IHidServer::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IHidServer::CreateAppletResource>, "CreateAppletResource"}, - FunctionInfo{1, C<&IHidServer::ActivateDebugPad>, "ActivateDebugPad"}, - FunctionInfo{11, C<&IHidServer::ActivateTouchScreen>, "ActivateTouchScreen"}, - FunctionInfo{21, C<&IHidServer::ActivateMouse>, "ActivateMouse"}, - FunctionInfo{26, C<&IHidServer::ActivateDebugMouse>, "ActivateDebugMouse"}, - FunctionInfo{31, C<&IHidServer::ActivateKeyboard>, "ActivateKeyboard"}, - FunctionInfo{32, C<&IHidServer::SendKeyboardLockKeyEvent>, "SendKeyboardLockKeyEvent"}, - FunctionInfo{40, C<&IHidServer::AcquireXpadIdEventHandle>, "AcquireXpadIdEventHandle"}, - FunctionInfo{41, C<&IHidServer::ReleaseXpadIdEventHandle>, "ReleaseXpadIdEventHandle"}, - FunctionInfo{51, C<&IHidServer::ActivateXpad>, "ActivateXpad"}, - FunctionInfo{55, C<&IHidServer::GetXpadIds>, "GetXpadIds"}, - FunctionInfo{56, C<&IHidServer::ActivateJoyXpad>, "ActivateJoyXpad"}, - FunctionInfo{58, C<&IHidServer::GetJoyXpadLifoHandle>, "GetJoyXpadLifoHandle"}, - FunctionInfo{59, C<&IHidServer::GetJoyXpadIds>, "GetJoyXpadIds"}, - FunctionInfo{60, C<&IHidServer::ActivateSixAxisSensor>, "ActivateSixAxisSensor"}, - FunctionInfo{61, C<&IHidServer::DeactivateSixAxisSensor>, "DeactivateSixAxisSensor"}, - FunctionInfo{62, C<&IHidServer::GetSixAxisSensorLifoHandle>, "GetSixAxisSensorLifoHandle"}, - FunctionInfo{63, C<&IHidServer::ActivateJoySixAxisSensor>, "ActivateJoySixAxisSensor"}, - FunctionInfo{64, C<&IHidServer::DeactivateJoySixAxisSensor>, "DeactivateJoySixAxisSensor"}, - FunctionInfo{65, C<&IHidServer::GetJoySixAxisSensorLifoHandle>, "GetJoySixAxisSensorLifoHandle"}, - FunctionInfo{66, C<&IHidServer::StartSixAxisSensor>, "StartSixAxisSensor"}, - FunctionInfo{67, C<&IHidServer::StopSixAxisSensor>, "StopSixAxisSensor"}, - FunctionInfo{68, C<&IHidServer::IsSixAxisSensorFusionEnabled>, "IsSixAxisSensorFusionEnabled"}, - FunctionInfo{69, C<&IHidServer::EnableSixAxisSensorFusion>, "EnableSixAxisSensorFusion"}, - FunctionInfo{70, C<&IHidServer::SetSixAxisSensorFusionParameters>, "SetSixAxisSensorFusionParameters"}, - FunctionInfo{71, C<&IHidServer::GetSixAxisSensorFusionParameters>, "GetSixAxisSensorFusionParameters"}, - FunctionInfo{72, C<&IHidServer::ResetSixAxisSensorFusionParameters>, "ResetSixAxisSensorFusionParameters"}, - FunctionInfo{73, nullptr, "SetAccelerometerParameters"}, - FunctionInfo{74, nullptr, "GetAccelerometerParameters"}, - FunctionInfo{75, nullptr, "ResetAccelerometerParameters"}, - FunctionInfo{76, nullptr, "SetAccelerometerPlayMode"}, - FunctionInfo{77, nullptr, "GetAccelerometerPlayMode"}, - FunctionInfo{78, nullptr, "ResetAccelerometerPlayMode"}, - FunctionInfo{79, C<&IHidServer::SetGyroscopeZeroDriftMode>, "SetGyroscopeZeroDriftMode"}, - FunctionInfo{80, C<&IHidServer::GetGyroscopeZeroDriftMode>, "GetGyroscopeZeroDriftMode"}, - FunctionInfo{81, C<&IHidServer::ResetGyroscopeZeroDriftMode>, "ResetGyroscopeZeroDriftMode"}, - FunctionInfo{82, C<&IHidServer::IsSixAxisSensorAtRest>, "IsSixAxisSensorAtRest"}, - FunctionInfo{83, C<&IHidServer::IsFirmwareUpdateAvailableForSixAxisSensor>, "IsFirmwareUpdateAvailableForSixAxisSensor"}, - FunctionInfo{84, C<&IHidServer::EnableSixAxisSensorUnalteredPassthrough>, "EnableSixAxisSensorUnalteredPassthrough"}, - FunctionInfo{85, C<&IHidServer::IsSixAxisSensorUnalteredPassthroughEnabled>, "IsSixAxisSensorUnalteredPassthroughEnabled"}, - FunctionInfo{86, nullptr, "StoreSixAxisSensorCalibrationParameter"}, - FunctionInfo{87, C<&IHidServer::LoadSixAxisSensorCalibrationParameter>, "LoadSixAxisSensorCalibrationParameter"}, - FunctionInfo{88, C<&IHidServer::GetSixAxisSensorIcInformation>, "GetSixAxisSensorIcInformation"}, - FunctionInfo{89, C<&IHidServer::ResetIsSixAxisSensorDeviceNewlyAssigned>, "ResetIsSixAxisSensorDeviceNewlyAssigned"}, - FunctionInfo{91, C<&IHidServer::ActivateGesture>, "ActivateGesture"}, - FunctionInfo{92, C<&IHidServer::SetGestureOutputRanges>, "SetGestureOutputRanges"}, - FunctionInfo{100, C<&IHidServer::SetSupportedNpadStyleSet>, "SetSupportedNpadStyleSet"}, - FunctionInfo{101, C<&IHidServer::GetSupportedNpadStyleSet>, "GetSupportedNpadStyleSet"}, - FunctionInfo{102, C<&IHidServer::SetSupportedNpadIdType>, "SetSupportedNpadIdType"}, - FunctionInfo{103, C<&IHidServer::ActivateNpad>, "ActivateNpad"}, - FunctionInfo{104, C<&IHidServer::DeactivateNpad>, "DeactivateNpad"}, - FunctionInfo{106, C<&IHidServer::AcquireNpadStyleSetUpdateEventHandle>, "AcquireNpadStyleSetUpdateEventHandle"}, - FunctionInfo{107, C<&IHidServer::DisconnectNpad>, "DisconnectNpad"}, - FunctionInfo{108, C<&IHidServer::GetPlayerLedPattern>, "GetPlayerLedPattern"}, - FunctionInfo{109, C<&IHidServer::ActivateNpadWithRevision>, "ActivateNpadWithRevision"}, - FunctionInfo{120, C<&IHidServer::SetNpadJoyHoldType>, "SetNpadJoyHoldType"}, - FunctionInfo{121, C<&IHidServer::GetNpadJoyHoldType>, "GetNpadJoyHoldType"}, - FunctionInfo{122, C<&IHidServer::SetNpadJoyAssignmentModeSingleByDefault>, "SetNpadJoyAssignmentModeSingleByDefault"}, - FunctionInfo{123, C<&IHidServer::SetNpadJoyAssignmentModeSingle>, "SetNpadJoyAssignmentModeSingle"}, - FunctionInfo{124, C<&IHidServer::SetNpadJoyAssignmentModeDual>, "SetNpadJoyAssignmentModeDual"}, - FunctionInfo{125, C<&IHidServer::MergeSingleJoyAsDualJoy>, "MergeSingleJoyAsDualJoy"}, - FunctionInfo{126, C<&IHidServer::StartLrAssignmentMode>, "StartLrAssignmentMode"}, - FunctionInfo{127, C<&IHidServer::StopLrAssignmentMode>, "StopLrAssignmentMode"}, - FunctionInfo{128, C<&IHidServer::SetNpadHandheldActivationMode>, "SetNpadHandheldActivationMode"}, - FunctionInfo{129, C<&IHidServer::GetNpadHandheldActivationMode>, "GetNpadHandheldActivationMode"}, - FunctionInfo{130, C<&IHidServer::SwapNpadAssignment>, "SwapNpadAssignment"}, - FunctionInfo{131, C<&IHidServer::IsUnintendedHomeButtonInputProtectionEnabled>, "IsUnintendedHomeButtonInputProtectionEnabled"}, - FunctionInfo{132, C<&IHidServer::EnableUnintendedHomeButtonInputProtection>, "EnableUnintendedHomeButtonInputProtection"}, - FunctionInfo{133, C<&IHidServer::SetNpadJoyAssignmentModeSingleWithDestination>, "SetNpadJoyAssignmentModeSingleWithDestination"}, - FunctionInfo{134, C<&IHidServer::SetNpadAnalogStickUseCenterClamp>, "SetNpadAnalogStickUseCenterClamp"}, - FunctionInfo{135, C<&IHidServer::SetNpadCaptureButtonAssignment>, "SetNpadCaptureButtonAssignment"}, - FunctionInfo{136, C<&IHidServer::ClearNpadCaptureButtonAssignment>, "ClearNpadCaptureButtonAssignment"}, - FunctionInfo{200, C<&IHidServer::GetVibrationDeviceInfo>, "GetVibrationDeviceInfo"}, - FunctionInfo{201, C<&IHidServer::SendVibrationValue>, "SendVibrationValue"}, - FunctionInfo{202, C<&IHidServer::GetActualVibrationValue>, "GetActualVibrationValue"}, - FunctionInfo{203, C<&IHidServer::CreateActiveVibrationDeviceList>, "CreateActiveVibrationDeviceList"}, - FunctionInfo{204, C<&IHidServer::PermitVibration>, "PermitVibration"}, - FunctionInfo{205, C<&IHidServer::IsVibrationPermitted>, "IsVibrationPermitted"}, - FunctionInfo{206, C<&IHidServer::SendVibrationValues>, "SendVibrationValues"}, - FunctionInfo{207, C<&IHidServer::SendVibrationGcErmCommand>, "SendVibrationGcErmCommand"}, - FunctionInfo{208, C<&IHidServer::GetActualVibrationGcErmCommand>, "GetActualVibrationGcErmCommand"}, - FunctionInfo{209, C<&IHidServer::BeginPermitVibrationSession>, "BeginPermitVibrationSession"}, - FunctionInfo{210, C<&IHidServer::EndPermitVibrationSession>, "EndPermitVibrationSession"}, - FunctionInfo{211, C<&IHidServer::IsVibrationDeviceMounted>, "IsVibrationDeviceMounted"}, - FunctionInfo{212, C<&IHidServer::SendVibrationValueInBool>, "SendVibrationValueInBool"}, - FunctionInfo{300, C<&IHidServer::ActivateConsoleSixAxisSensor>, "ActivateConsoleSixAxisSensor"}, - FunctionInfo{301, C<&IHidServer::StartConsoleSixAxisSensor>, "StartConsoleSixAxisSensor"}, - FunctionInfo{302, C<&IHidServer::StopConsoleSixAxisSensor>, "StopConsoleSixAxisSensor"}, - FunctionInfo{303, C<&IHidServer::ActivateSevenSixAxisSensor>, "ActivateSevenSixAxisSensor"}, - FunctionInfo{304, C<&IHidServer::StartSevenSixAxisSensor>, "StartSevenSixAxisSensor"}, - FunctionInfo{305, C<&IHidServer::StopSevenSixAxisSensor>, "StopSevenSixAxisSensor"}, - FunctionInfo{306, C<&IHidServer::InitializeSevenSixAxisSensor>, "InitializeSevenSixAxisSensor"}, - FunctionInfo{307, C<&IHidServer::FinalizeSevenSixAxisSensor>, "FinalizeSevenSixAxisSensor"}, - FunctionInfo{308, nullptr, "SetSevenSixAxisSensorFusionStrength"}, - FunctionInfo{309, nullptr, "GetSevenSixAxisSensorFusionStrength"}, - FunctionInfo{310, C<&IHidServer::ResetSevenSixAxisSensorTimestamp>, "ResetSevenSixAxisSensorTimestamp"}, - FunctionInfo{320, nullptr, "EnableNpadImu", MakeVersionGate({21,0,0})}, - FunctionInfo{321, nullptr, "DisableNpadImu", MakeVersionGate({21,0,0})}, - FunctionInfo{400, C<&IHidServer::IsUsbFullKeyControllerEnabled>, "IsUsbFullKeyControllerEnabled"}, - FunctionInfo{401, nullptr, "EnableUsbFullKeyController"}, - FunctionInfo{402, nullptr, "IsUsbFullKeyControllerConnected"}, - FunctionInfo{403, nullptr, "HasBattery"}, - FunctionInfo{404, nullptr, "HasLeftRightBattery"}, - FunctionInfo{405, nullptr, "GetNpadInterfaceType"}, - FunctionInfo{406, nullptr, "GetNpadLeftRightInterfaceType"}, - FunctionInfo{407, nullptr, "GetNpadOfHighestBatteryLevel"}, - FunctionInfo{408, nullptr, "GetNpadOfHighestBatteryLevelForJoyRight"}, - FunctionInfo{500, C<&IHidServer::GetPalmaConnectionHandle>, "GetPalmaConnectionHandle"}, - FunctionInfo{501, C<&IHidServer::InitializePalma>, "InitializePalma"}, - FunctionInfo{502, C<&IHidServer::AcquirePalmaOperationCompleteEvent>, "AcquirePalmaOperationCompleteEvent"}, - FunctionInfo{503, C<&IHidServer::GetPalmaOperationInfo>, "GetPalmaOperationInfo"}, - FunctionInfo{504, C<&IHidServer::PlayPalmaActivity>, "PlayPalmaActivity"}, - FunctionInfo{505, C<&IHidServer::SetPalmaFrModeType>, "SetPalmaFrModeType"}, - FunctionInfo{506, C<&IHidServer::ReadPalmaStep>, "ReadPalmaStep"}, - FunctionInfo{507, C<&IHidServer::EnablePalmaStep>, "EnablePalmaStep"}, - FunctionInfo{508, C<&IHidServer::ResetPalmaStep>, "ResetPalmaStep"}, - FunctionInfo{509, C<&IHidServer::ReadPalmaApplicationSection>, "ReadPalmaApplicationSection"}, - FunctionInfo{510, C<&IHidServer::WritePalmaApplicationSection>, "WritePalmaApplicationSection"}, - FunctionInfo{511, C<&IHidServer::ReadPalmaUniqueCode>, "ReadPalmaUniqueCode"}, - FunctionInfo{512, C<&IHidServer::SetPalmaUniqueCodeInvalid>, "SetPalmaUniqueCodeInvalid"}, - FunctionInfo{513, C<&IHidServer::WritePalmaActivityEntry>, "WritePalmaActivityEntry"}, - FunctionInfo{514, C<&IHidServer::WritePalmaRgbLedPatternEntry>, "WritePalmaRgbLedPatternEntry"}, - FunctionInfo{515, C<&IHidServer::WritePalmaWaveEntry>, "WritePalmaWaveEntry"}, - FunctionInfo{516, C<&IHidServer::SetPalmaDataBaseIdentificationVersion>, "SetPalmaDataBaseIdentificationVersion"}, - FunctionInfo{517, C<&IHidServer::GetPalmaDataBaseIdentificationVersion>, "GetPalmaDataBaseIdentificationVersion"}, - FunctionInfo{518, C<&IHidServer::SuspendPalmaFeature>, "SuspendPalmaFeature"}, - FunctionInfo{519, C<&IHidServer::GetPalmaOperationResult>, "GetPalmaOperationResult"}, - FunctionInfo{520, C<&IHidServer::ReadPalmaPlayLog>, "ReadPalmaPlayLog"}, - FunctionInfo{521, C<&IHidServer::ResetPalmaPlayLog>, "ResetPalmaPlayLog"}, - FunctionInfo{522, C<&IHidServer::SetIsPalmaAllConnectable>, "SetIsPalmaAllConnectable"}, - FunctionInfo{523, C<&IHidServer::SetIsPalmaPairedConnectable>, "SetIsPalmaPairedConnectable"}, - FunctionInfo{524, C<&IHidServer::PairPalma>, "PairPalma"}, - FunctionInfo{525, C<&IHidServer::SetPalmaBoostMode>, "SetPalmaBoostMode"}, - FunctionInfo{526, C<&IHidServer::CancelWritePalmaWaveEntry>, "CancelWritePalmaWaveEntry"}, - FunctionInfo{527, C<&IHidServer::EnablePalmaBoostMode>, "EnablePalmaBoostMode"}, - FunctionInfo{528, C<&IHidServer::GetPalmaBluetoothAddress>, "GetPalmaBluetoothAddress"}, - FunctionInfo{529, C<&IHidServer::SetDisallowedPalmaConnection>, "SetDisallowedPalmaConnection"}, - FunctionInfo{1000, C<&IHidServer::SetNpadCommunicationMode>, "SetNpadCommunicationMode"}, - FunctionInfo{1001, C<&IHidServer::GetNpadCommunicationMode>, "GetNpadCommunicationMode"}, - FunctionInfo{1002, C<&IHidServer::SetTouchScreenConfiguration>, "SetTouchScreenConfiguration"}, - FunctionInfo{1003, C<&IHidServer::IsFirmwareUpdateNeededForNotification>, "IsFirmwareUpdateNeededForNotification"}, - FunctionInfo{1004, C<&IHidServer::SetTouchScreenResolution>, "SetTouchScreenResolution"}, - FunctionInfo{1270, nullptr, "DeleteButtonConfigStorageRight"}, - FunctionInfo{1271, nullptr, "IsUsingCustomButtonConfig"}, - FunctionInfo{1272, nullptr, "IsAnyCustomButtonConfigEnabled"}, - FunctionInfo{1273, nullptr, "SetAllCustomButtonConfigEnabled"}, - FunctionInfo{1274, nullptr, "SetDefaultButtonConfig"}, - FunctionInfo{1275, nullptr, "SetAllDefaultButtonConfig"}, - FunctionInfo{1276, nullptr, "SetHidButtonConfigEmbedded"}, - FunctionInfo{1277, nullptr, "SetHidButtonConfigFull"}, - FunctionInfo{1278, nullptr, "SetHidButtonConfigLeft"}, - FunctionInfo{1279, nullptr, "SetHidButtonConfigRight"}, - FunctionInfo{1280, nullptr, "GetHidButtonConfigEmbedded"}, - FunctionInfo{1281, nullptr, "GetHidButtonConfigFull"}, - FunctionInfo{1282, nullptr, "GetHidButtonConfigLeft"}, - FunctionInfo{1283, nullptr, "GetHidButtonConfigRight"}, - FunctionInfo{1284, nullptr, "GetButtonConfigStorageEmbedded"}, - FunctionInfo{1285, nullptr, "GetButtonConfigStorageFull"}, - FunctionInfo{1286, nullptr, "GetButtonConfigStorageLeft"}, - FunctionInfo{1287, nullptr, "GetButtonConfigStorageRight"}, - FunctionInfo{1288, nullptr, "SetButtonConfigStorageEmbedded"}, - FunctionInfo{1289, nullptr, "SetButtonConfigStorageFull"}, - FunctionInfo{1290, nullptr, "SetButtonConfigStorageLeft"}, - FunctionInfo{1291, nullptr, "SetButtonConfigStorageRight"}, - FunctionInfo{1308, nullptr, "SetButtonConfigVisible"}, - FunctionInfo{1309, nullptr, "IsButtonConfigVisible"}, - FunctionInfo{1320, nullptr, "WakeTouchScreenUp"}, - FunctionInfo{1321, nullptr, "PutTouchScreenToSleep"}, - FunctionInfo{1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent"}, - FunctionInfo{1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings"}, - FunctionInfo{1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent"}, - FunctionInfo{1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement"}, - FunctionInfo{1420, nullptr, "GetAppletResourceProperty"}, - FunctionInfo{2000, nullptr, "ActivateDigitizer"}, - FunctionInfo{3000, nullptr, "GetDebugPadGenericPadMap"}, - FunctionInfo{3001, nullptr, "SetDebugPadGenericPadMap"}, - FunctionInfo{3002, nullptr, "ResetDebugPadGenericPadMap"}, - FunctionInfo{3003, nullptr, "GetDebugPadKeyboardMap"}, - FunctionInfo{3004, nullptr, "SetDebugPadKeyboardMap"}, - FunctionInfo{3005, nullptr, "ResetDebugPadKeyboardMap"}, - FunctionInfo{3006, nullptr, "GetFullKeyGenericPadMap"}, - FunctionInfo{3007, nullptr, "SetFullKeyGenericPadMap"}, - FunctionInfo{3008, nullptr, "ResetFullKeyGenericPadMap"}, - FunctionInfo{3009, nullptr, "GetFullKeyKeyboardMap"}, - FunctionInfo{3010, nullptr, "SetFullKeyKeyboardMap"}, - FunctionInfo{3011, nullptr, "ResetFullKeyKeyboardMap"}, - FunctionInfo{3012, nullptr, "GetDebugPadGenericPadMap", MakeVersionGate({21,0,0})}, - FunctionInfo{3013, nullptr, "SetDebugPadGenericPadMap", MakeVersionGate({21,0,0})}, - FunctionInfo{3014, nullptr, "GetDebugPadKeyboardMap", MakeVersionGate({21,0,0})}, - FunctionInfo{3015, nullptr, "SetDebugPadKeyboardMap", MakeVersionGate({21,0,0})}, - FunctionInfo{3150, C<&IHidServer::SetMouseLibraryVersion>, "SetMouseLibraryVersion", MakeVersionGate({21,0,0})} - // What? -- {12010, nullptr, "SetButtonConfigLeft"}, - ); - return HandlerTableGenerateWithFind(key, functions); -} - IHidServer::IHidServer(Core::System& system_, std::shared_ptr resource, std::shared_ptr settings) : ServiceFramework{system_, "hid"}, resource_manager{resource}, firmware_settings{settings} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&IHidServer::CreateAppletResource>, "CreateAppletResource"}, + {1, C<&IHidServer::ActivateDebugPad>, "ActivateDebugPad"}, + {11, C<&IHidServer::ActivateTouchScreen>, "ActivateTouchScreen"}, + {21, C<&IHidServer::ActivateMouse>, "ActivateMouse"}, + {26, C<&IHidServer::ActivateDebugMouse>, "ActivateDebugMouse"}, + {31, C<&IHidServer::ActivateKeyboard>, "ActivateKeyboard"}, + {32, C<&IHidServer::SendKeyboardLockKeyEvent>, "SendKeyboardLockKeyEvent"}, + {40, C<&IHidServer::AcquireXpadIdEventHandle>, "AcquireXpadIdEventHandle"}, + {41, C<&IHidServer::ReleaseXpadIdEventHandle>, "ReleaseXpadIdEventHandle"}, + {51, C<&IHidServer::ActivateXpad>, "ActivateXpad"}, + {55, C<&IHidServer::GetXpadIds>, "GetXpadIds"}, + {56, C<&IHidServer::ActivateJoyXpad>, "ActivateJoyXpad"}, + {58, C<&IHidServer::GetJoyXpadLifoHandle>, "GetJoyXpadLifoHandle"}, + {59, C<&IHidServer::GetJoyXpadIds>, "GetJoyXpadIds"}, + {60, C<&IHidServer::ActivateSixAxisSensor>, "ActivateSixAxisSensor"}, + {61, C<&IHidServer::DeactivateSixAxisSensor>, "DeactivateSixAxisSensor"}, + {62, C<&IHidServer::GetSixAxisSensorLifoHandle>, "GetSixAxisSensorLifoHandle"}, + {63, C<&IHidServer::ActivateJoySixAxisSensor>, "ActivateJoySixAxisSensor"}, + {64, C<&IHidServer::DeactivateJoySixAxisSensor>, "DeactivateJoySixAxisSensor"}, + {65, C<&IHidServer::GetJoySixAxisSensorLifoHandle>, "GetJoySixAxisSensorLifoHandle"}, + {66, C<&IHidServer::StartSixAxisSensor>, "StartSixAxisSensor"}, + {67, C<&IHidServer::StopSixAxisSensor>, "StopSixAxisSensor"}, + {68, C<&IHidServer::IsSixAxisSensorFusionEnabled>, "IsSixAxisSensorFusionEnabled"}, + {69, C<&IHidServer::EnableSixAxisSensorFusion>, "EnableSixAxisSensorFusion"}, + {70, C<&IHidServer::SetSixAxisSensorFusionParameters>, "SetSixAxisSensorFusionParameters"}, + {71, C<&IHidServer::GetSixAxisSensorFusionParameters>, "GetSixAxisSensorFusionParameters"}, + {72, C<&IHidServer::ResetSixAxisSensorFusionParameters>, "ResetSixAxisSensorFusionParameters"}, + {73, nullptr, "SetAccelerometerParameters"}, + {74, nullptr, "GetAccelerometerParameters"}, + {75, nullptr, "ResetAccelerometerParameters"}, + {76, nullptr, "SetAccelerometerPlayMode"}, + {77, nullptr, "GetAccelerometerPlayMode"}, + {78, nullptr, "ResetAccelerometerPlayMode"}, + {79, C<&IHidServer::SetGyroscopeZeroDriftMode>, "SetGyroscopeZeroDriftMode"}, + {80, C<&IHidServer::GetGyroscopeZeroDriftMode>, "GetGyroscopeZeroDriftMode"}, + {81, C<&IHidServer::ResetGyroscopeZeroDriftMode>, "ResetGyroscopeZeroDriftMode"}, + {82, C<&IHidServer::IsSixAxisSensorAtRest>, "IsSixAxisSensorAtRest"}, + {83, C<&IHidServer::IsFirmwareUpdateAvailableForSixAxisSensor>, "IsFirmwareUpdateAvailableForSixAxisSensor"}, + {84, C<&IHidServer::EnableSixAxisSensorUnalteredPassthrough>, "EnableSixAxisSensorUnalteredPassthrough"}, + {85, C<&IHidServer::IsSixAxisSensorUnalteredPassthroughEnabled>, "IsSixAxisSensorUnalteredPassthroughEnabled"}, + {86, nullptr, "StoreSixAxisSensorCalibrationParameter"}, + {87, C<&IHidServer::LoadSixAxisSensorCalibrationParameter>, "LoadSixAxisSensorCalibrationParameter"}, + {88, C<&IHidServer::GetSixAxisSensorIcInformation>, "GetSixAxisSensorIcInformation"}, + {89, C<&IHidServer::ResetIsSixAxisSensorDeviceNewlyAssigned>, "ResetIsSixAxisSensorDeviceNewlyAssigned"}, + {91, C<&IHidServer::ActivateGesture>, "ActivateGesture"}, + {92, C<&IHidServer::SetGestureOutputRanges>, "SetGestureOutputRanges"}, + {100, C<&IHidServer::SetSupportedNpadStyleSet>, "SetSupportedNpadStyleSet"}, + {101, C<&IHidServer::GetSupportedNpadStyleSet>, "GetSupportedNpadStyleSet"}, + {102, C<&IHidServer::SetSupportedNpadIdType>, "SetSupportedNpadIdType"}, + {103, C<&IHidServer::ActivateNpad>, "ActivateNpad"}, + {104, C<&IHidServer::DeactivateNpad>, "DeactivateNpad"}, + {106, C<&IHidServer::AcquireNpadStyleSetUpdateEventHandle>, "AcquireNpadStyleSetUpdateEventHandle"}, + {107, C<&IHidServer::DisconnectNpad>, "DisconnectNpad"}, + {108, C<&IHidServer::GetPlayerLedPattern>, "GetPlayerLedPattern"}, + {109, C<&IHidServer::ActivateNpadWithRevision>, "ActivateNpadWithRevision"}, + {120, C<&IHidServer::SetNpadJoyHoldType>, "SetNpadJoyHoldType"}, + {121, C<&IHidServer::GetNpadJoyHoldType>, "GetNpadJoyHoldType"}, + {122, C<&IHidServer::SetNpadJoyAssignmentModeSingleByDefault>, "SetNpadJoyAssignmentModeSingleByDefault"}, + {123, C<&IHidServer::SetNpadJoyAssignmentModeSingle>, "SetNpadJoyAssignmentModeSingle"}, + {124, C<&IHidServer::SetNpadJoyAssignmentModeDual>, "SetNpadJoyAssignmentModeDual"}, + {125, C<&IHidServer::MergeSingleJoyAsDualJoy>, "MergeSingleJoyAsDualJoy"}, + {126, C<&IHidServer::StartLrAssignmentMode>, "StartLrAssignmentMode"}, + {127, C<&IHidServer::StopLrAssignmentMode>, "StopLrAssignmentMode"}, + {128, C<&IHidServer::SetNpadHandheldActivationMode>, "SetNpadHandheldActivationMode"}, + {129, C<&IHidServer::GetNpadHandheldActivationMode>, "GetNpadHandheldActivationMode"}, + {130, C<&IHidServer::SwapNpadAssignment>, "SwapNpadAssignment"}, + {131, C<&IHidServer::IsUnintendedHomeButtonInputProtectionEnabled>, "IsUnintendedHomeButtonInputProtectionEnabled"}, + {132, C<&IHidServer::EnableUnintendedHomeButtonInputProtection>, "EnableUnintendedHomeButtonInputProtection"}, + {133, C<&IHidServer::SetNpadJoyAssignmentModeSingleWithDestination>, "SetNpadJoyAssignmentModeSingleWithDestination"}, + {134, C<&IHidServer::SetNpadAnalogStickUseCenterClamp>, "SetNpadAnalogStickUseCenterClamp"}, + {135, C<&IHidServer::SetNpadCaptureButtonAssignment>, "SetNpadCaptureButtonAssignment"}, + {136, C<&IHidServer::ClearNpadCaptureButtonAssignment>, "ClearNpadCaptureButtonAssignment"}, + {200, C<&IHidServer::GetVibrationDeviceInfo>, "GetVibrationDeviceInfo"}, + {201, C<&IHidServer::SendVibrationValue>, "SendVibrationValue"}, + {202, C<&IHidServer::GetActualVibrationValue>, "GetActualVibrationValue"}, + {203, C<&IHidServer::CreateActiveVibrationDeviceList>, "CreateActiveVibrationDeviceList"}, + {204, C<&IHidServer::PermitVibration>, "PermitVibration"}, + {205, C<&IHidServer::IsVibrationPermitted>, "IsVibrationPermitted"}, + {206, C<&IHidServer::SendVibrationValues>, "SendVibrationValues"}, + {207, C<&IHidServer::SendVibrationGcErmCommand>, "SendVibrationGcErmCommand"}, + {208, C<&IHidServer::GetActualVibrationGcErmCommand>, "GetActualVibrationGcErmCommand"}, + {209, C<&IHidServer::BeginPermitVibrationSession>, "BeginPermitVibrationSession"}, + {210, C<&IHidServer::EndPermitVibrationSession>, "EndPermitVibrationSession"}, + {211, C<&IHidServer::IsVibrationDeviceMounted>, "IsVibrationDeviceMounted"}, + {212, C<&IHidServer::SendVibrationValueInBool>, "SendVibrationValueInBool"}, + {300, C<&IHidServer::ActivateConsoleSixAxisSensor>, "ActivateConsoleSixAxisSensor"}, + {301, C<&IHidServer::StartConsoleSixAxisSensor>, "StartConsoleSixAxisSensor"}, + {302, C<&IHidServer::StopConsoleSixAxisSensor>, "StopConsoleSixAxisSensor"}, + {303, C<&IHidServer::ActivateSevenSixAxisSensor>, "ActivateSevenSixAxisSensor"}, + {304, C<&IHidServer::StartSevenSixAxisSensor>, "StartSevenSixAxisSensor"}, + {305, C<&IHidServer::StopSevenSixAxisSensor>, "StopSevenSixAxisSensor"}, + {306, C<&IHidServer::InitializeSevenSixAxisSensor>, "InitializeSevenSixAxisSensor"}, + {307, C<&IHidServer::FinalizeSevenSixAxisSensor>, "FinalizeSevenSixAxisSensor"}, + {308, nullptr, "SetSevenSixAxisSensorFusionStrength"}, + {309, nullptr, "GetSevenSixAxisSensorFusionStrength"}, + {310, C<&IHidServer::ResetSevenSixAxisSensorTimestamp>, "ResetSevenSixAxisSensorTimestamp"}, + {320, nullptr, "EnableNpadImu"}, //21.0.0+ + {321, nullptr, "DisableNpadImu"}, //21.0.0+ + {400, C<&IHidServer::IsUsbFullKeyControllerEnabled>, "IsUsbFullKeyControllerEnabled"}, + {401, nullptr, "EnableUsbFullKeyController"}, + {402, nullptr, "IsUsbFullKeyControllerConnected"}, + {403, nullptr, "HasBattery"}, + {404, nullptr, "HasLeftRightBattery"}, + {405, nullptr, "GetNpadInterfaceType"}, + {406, nullptr, "GetNpadLeftRightInterfaceType"}, + {407, nullptr, "GetNpadOfHighestBatteryLevel"}, + {408, nullptr, "GetNpadOfHighestBatteryLevelForJoyRight"}, + {500, C<&IHidServer::GetPalmaConnectionHandle>, "GetPalmaConnectionHandle"}, + {501, C<&IHidServer::InitializePalma>, "InitializePalma"}, + {502, C<&IHidServer::AcquirePalmaOperationCompleteEvent>, "AcquirePalmaOperationCompleteEvent"}, + {503, C<&IHidServer::GetPalmaOperationInfo>, "GetPalmaOperationInfo"}, + {504, C<&IHidServer::PlayPalmaActivity>, "PlayPalmaActivity"}, + {505, C<&IHidServer::SetPalmaFrModeType>, "SetPalmaFrModeType"}, + {506, C<&IHidServer::ReadPalmaStep>, "ReadPalmaStep"}, + {507, C<&IHidServer::EnablePalmaStep>, "EnablePalmaStep"}, + {508, C<&IHidServer::ResetPalmaStep>, "ResetPalmaStep"}, + {509, C<&IHidServer::ReadPalmaApplicationSection>, "ReadPalmaApplicationSection"}, + {510, C<&IHidServer::WritePalmaApplicationSection>, "WritePalmaApplicationSection"}, + {511, C<&IHidServer::ReadPalmaUniqueCode>, "ReadPalmaUniqueCode"}, + {512, C<&IHidServer::SetPalmaUniqueCodeInvalid>, "SetPalmaUniqueCodeInvalid"}, + {513, C<&IHidServer::WritePalmaActivityEntry>, "WritePalmaActivityEntry"}, + {514, C<&IHidServer::WritePalmaRgbLedPatternEntry>, "WritePalmaRgbLedPatternEntry"}, + {515, C<&IHidServer::WritePalmaWaveEntry>, "WritePalmaWaveEntry"}, + {516, C<&IHidServer::SetPalmaDataBaseIdentificationVersion>, "SetPalmaDataBaseIdentificationVersion"}, + {517, C<&IHidServer::GetPalmaDataBaseIdentificationVersion>, "GetPalmaDataBaseIdentificationVersion"}, + {518, C<&IHidServer::SuspendPalmaFeature>, "SuspendPalmaFeature"}, + {519, C<&IHidServer::GetPalmaOperationResult>, "GetPalmaOperationResult"}, + {520, C<&IHidServer::ReadPalmaPlayLog>, "ReadPalmaPlayLog"}, + {521, C<&IHidServer::ResetPalmaPlayLog>, "ResetPalmaPlayLog"}, + {522, C<&IHidServer::SetIsPalmaAllConnectable>, "SetIsPalmaAllConnectable"}, + {523, C<&IHidServer::SetIsPalmaPairedConnectable>, "SetIsPalmaPairedConnectable"}, + {524, C<&IHidServer::PairPalma>, "PairPalma"}, + {525, C<&IHidServer::SetPalmaBoostMode>, "SetPalmaBoostMode"}, + {526, C<&IHidServer::CancelWritePalmaWaveEntry>, "CancelWritePalmaWaveEntry"}, + {527, C<&IHidServer::EnablePalmaBoostMode>, "EnablePalmaBoostMode"}, + {528, C<&IHidServer::GetPalmaBluetoothAddress>, "GetPalmaBluetoothAddress"}, + {529, C<&IHidServer::SetDisallowedPalmaConnection>, "SetDisallowedPalmaConnection"}, + {1000, C<&IHidServer::SetNpadCommunicationMode>, "SetNpadCommunicationMode"}, + {1001, C<&IHidServer::GetNpadCommunicationMode>, "GetNpadCommunicationMode"}, + {1002, C<&IHidServer::SetTouchScreenConfiguration>, "SetTouchScreenConfiguration"}, + {1003, C<&IHidServer::IsFirmwareUpdateNeededForNotification>, "IsFirmwareUpdateNeededForNotification"}, + {1004, C<&IHidServer::SetTouchScreenResolution>, "SetTouchScreenResolution"}, + {1270, nullptr, "DeleteButtonConfigStorageRight"}, + {1271, nullptr, "IsUsingCustomButtonConfig"}, + {1272, nullptr, "IsAnyCustomButtonConfigEnabled"}, + {1273, nullptr, "SetAllCustomButtonConfigEnabled"}, + {1274, nullptr, "SetDefaultButtonConfig"}, + {1275, nullptr, "SetAllDefaultButtonConfig"}, + {1276, nullptr, "SetHidButtonConfigEmbedded"}, + {1277, nullptr, "SetHidButtonConfigFull"}, + {1278, nullptr, "SetHidButtonConfigLeft"}, + {1279, nullptr, "SetHidButtonConfigRight"}, + {1280, nullptr, "GetHidButtonConfigEmbedded"}, + {1281, nullptr, "GetHidButtonConfigFull"}, + {1282, nullptr, "GetHidButtonConfigLeft"}, + {1283, nullptr, "GetHidButtonConfigRight"}, + {1284, nullptr, "GetButtonConfigStorageEmbedded"}, + {1285, nullptr, "GetButtonConfigStorageFull"}, + {1286, nullptr, "GetButtonConfigStorageLeft"}, + {1287, nullptr, "GetButtonConfigStorageRight"}, + {1288, nullptr, "SetButtonConfigStorageEmbedded"}, + {1289, nullptr, "SetButtonConfigStorageFull"}, + {1290, nullptr, "SetButtonConfigStorageLeft"}, + {1291, nullptr, "SetButtonConfigStorageRight"}, + {1308, nullptr, "SetButtonConfigVisible"}, + {1309, nullptr, "IsButtonConfigVisible"}, + {1320, nullptr, "WakeTouchScreenUp"}, + {1321, nullptr, "PutTouchScreenToSleep"}, + {1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent"}, + {1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings"}, + {1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent"}, + {1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement"}, + {1420, nullptr, "GetAppletResourceProperty"}, + {2000, nullptr, "ActivateDigitizer"}, + {3000, nullptr, "GetDebugPadGenericPadMap"}, + {3001, nullptr, "SetDebugPadGenericPadMap"}, + {3002, nullptr, "ResetDebugPadGenericPadMap"}, + {3003, nullptr, "GetDebugPadKeyboardMap"}, + {3004, nullptr, "SetDebugPadKeyboardMap"}, + {3005, nullptr, "ResetDebugPadKeyboardMap"}, + {3006, nullptr, "GetFullKeyGenericPadMap"}, + {3007, nullptr, "SetFullKeyGenericPadMap"}, + {3008, nullptr, "ResetFullKeyGenericPadMap"}, + {3009, nullptr, "GetFullKeyKeyboardMap"}, + {3010, nullptr, "SetFullKeyKeyboardMap"}, + {3011, nullptr, "ResetFullKeyKeyboardMap"}, + {3012, nullptr, "GetDebugPadGenericPadMap"}, //21.0.0+ + {3013, nullptr, "SetDebugPadGenericPadMap"}, //21.0.0+ + {3014, nullptr, "GetDebugPadKeyboardMap"}, //21.0.0+ + {3015, nullptr, "SetDebugPadKeyboardMap"}, //21.0.0+ + {3150, C<&IHidServer::SetMouseLibraryVersion>, "SetMouseLibraryVersion"}, //21.0.0+ + // What? -- {12010, nullptr, "SetButtonConfigLeft"}, + }; + // clang-format on + + RegisterHandlers(functions); } IHidServer::~IHidServer() = default; diff --git a/src/core/hle/service/hid/hid_server.h b/src/core/hle/service/hid/hid_server.h index f2c08e9df8..57a1a04b9c 100644 --- a/src/core/hle/service/hid/hid_server.h +++ b/src/core/hle/service/hid/hid_server.h @@ -265,8 +265,6 @@ private: Result SetTouchScreenResolution(u32 width, u32 height, ClientAppletResourceUserId aruid); Result SetMouseLibraryVersion(ClientAppletResourceUserId aruid); - std::optional FindRequest(u32 key) override; - std::shared_ptr resource_manager; std::shared_ptr firmware_settings; }; diff --git a/src/core/hle/service/hid/hid_system_server.cpp b/src/core/hle/service/hid/hid_system_server.cpp index 4df021f443..e544adf03c 100644 --- a/src/core/hle/service/hid/hid_system_server.cpp +++ b/src/core/hle/service/hid/hid_system_server.cpp @@ -22,6 +22,252 @@ IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr settings) : ServiceFramework{system_, "hid:sys"}, service_context{system_, service_name}, resource_manager{resource}, firmware_settings{settings} { + // clang-format off + static const FunctionInfo functions[] = { + {31, nullptr, "SendKeyboardLockKeyEvent"}, + {101, nullptr, "AcquireHomeButtonEventHandle"}, + {111, nullptr, "ActivateHomeButton"}, + {121, nullptr, "AcquireSleepButtonEventHandle"}, + {131, nullptr, "ActivateSleepButton"}, + {141, nullptr, "AcquireCaptureButtonEventHandle"}, + {151, nullptr, "ActivateCaptureButton"}, + {161, &IHidSystemServer::GetPlatformConfig, "GetPlatformConfig"}, + {210, nullptr, "AcquireNfcDeviceUpdateEventHandle"}, + {211, nullptr, "GetNpadsWithNfc"}, + {212, nullptr, "AcquireNfcActivateEventHandle"}, + {213, nullptr, "ActivateNfc"}, + {214, nullptr, "GetXcdHandleForNpadWithNfc"}, + {215, nullptr, "IsNfcActivated"}, + {216, nullptr, "GetAbstractedPadIdForNpadWithNfc"}, + {217, nullptr, "SetNfcEvent"}, + {218, nullptr, "GetNfcInfo"}, + {219, nullptr, "StartNfcDiscovery"}, + {220, nullptr, "StopNfcDiscovery"}, + {221, nullptr, "StartNtagRead"}, + {222, nullptr, "StartNtagWrite"}, + {223, nullptr, "SendNfcRawData"}, + {224, nullptr, "RegisterMifareKey"}, + {225, nullptr, "ClearMifareKey"}, + {226, nullptr, "StartMifareRead"}, + {227, nullptr, "StartMifareWrite"}, + {230, nullptr, "AcquireIrSensorEventHndle" }, + {231, nullptr, "ActivateIrSensor"}, + {232, nullptr, "GetIrSensorState"}, + {233, nullptr, "GetXcdHandleForNpadWihIrSensor" }, + {234, nullptr, "GetNpadJoyHoldType"}, + {241, nullptr, "GetDataFormat"}, + {242, nullptr, "SetDataFormat"}, + {243, nullptr, "GetMcuState"}, + {244, nullptr, "SetMcuState"}, + {245, nullptr, "GetMcuVersionForNfc"}, + {246, nullptr, "CheckNfcDevicePower"}, + {247, nullptr, "SetMcuStateImmediate"}, + {301, nullptr, "ActivateNpadSystem"}, + {303, &IHidSystemServer::ApplyNpadSystemCommonPolicy, "ApplyNpadSystemCommonPolicy"}, + {304, &IHidSystemServer::EnableAssigningSingleOnSlSrPress, "EnableAssigningSingleOnSlSrPress"}, + {305, &IHidSystemServer::DisableAssigningSingleOnSlSrPress, "DisableAssigningSingleOnSlSrPress"}, + {306, &IHidSystemServer::GetLastActiveNpad, "GetLastActiveNpad"}, + {307, nullptr, "GetNpadSystemExtStyle"}, + {308, &IHidSystemServer::ApplyNpadSystemCommonPolicyFull, "ApplyNpadSystemCommonPolicyFull"}, + {309, &IHidSystemServer::GetNpadFullKeyGripColor, "GetNpadFullKeyGripColor"}, + {310, &IHidSystemServer::GetMaskedSupportedNpadStyleSet, "GetMaskedSupportedNpadStyleSet"}, + {311, nullptr, "SetNpadPlayerLedBlinkingDevice"}, + {312, &IHidSystemServer::SetSupportedNpadStyleSetAll, "SetSupportedNpadStyleSetAll"}, + {313, &IHidSystemServer::GetNpadCaptureButtonAssignment, "GetNpadCaptureButtonAssignment"}, + {314, nullptr, "GetAppletFooterUiType"}, + {315, &IHidSystemServer::GetAppletDetailedUiType, "GetAppletDetailedUiType"}, + {316, &IHidSystemServer::GetNpadInterfaceType, "GetNpadInterfaceType"}, + {317, &IHidSystemServer::GetNpadLeftRightInterfaceType, "GetNpadLeftRightInterfaceType"}, + {318, &IHidSystemServer::HasBattery, "HasBattery"}, + {319, &IHidSystemServer::HasLeftRightBattery, "HasLeftRightBattery"}, + {321, &IHidSystemServer::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"}, + {322, &IHidSystemServer::SetNpadSystemExtStateEnabled, "SetNpadSystemExtStateEnabled"}, + {323, nullptr, "GetLastActiveUniquePad"}, + {324, nullptr, "GetUniquePadButtonSet"}, + {325, nullptr, "GetUniquePadColor"}, + {326, nullptr, "GetUniquePadAppletDetailedUiType"}, + {327, nullptr, "GetAbstractedPadIdDataFromNpad"}, + {328, nullptr, "AttachAbstractedPadToNpad"}, + {329, nullptr, "DetachAbstractedPadAll"}, + {330, nullptr, "CheckAbstractedPadConnection"}, + {332, nullptr, "ConvertAppletDetailedUiTypeFromPlayReportType"}, //19.0.0+ + {333, nullptr, "SetNpadUserSpgApplet"}, //20.0.0+ + {334, nullptr, "AcquireUniquePadButtonStateChangedEventHandle"}, //20.0.0+ + {501, &IHidSystemServer::RegisterAppletResourceUserId, "RegisterAppletResourceUserId"}, + {502, &IHidSystemServer::UnregisterAppletResourceUserId, "UnregisterAppletResourceUserId"}, + {503, &IHidSystemServer::EnableAppletToGetInput, "EnableAppletToGetInput"}, + {504, &IHidSystemServer::SetAruidValidForVibration, "SetAruidValidForVibration"}, + {505, &IHidSystemServer::EnableAppletToGetSixAxisSensor, "EnableAppletToGetSixAxisSensor"}, + {506, &IHidSystemServer::EnableAppletToGetPadInput, "EnableAppletToGetPadInput"}, + {507, &IHidSystemServer::EnableAppletToGetTouchScreen, "EnableAppletToGetTouchScreen"}, + {510, &IHidSystemServer::SetVibrationMasterVolume, "SetVibrationMasterVolume"}, + {511, &IHidSystemServer::GetVibrationMasterVolume, "GetVibrationMasterVolume"}, + {512, &IHidSystemServer::BeginPermitVibrationSession, "BeginPermitVibrationSession"}, + {513, &IHidSystemServer::EndPermitVibrationSession, "EndPermitVibrationSession"}, + {514, nullptr, "Unknown514"}, + {520, nullptr, "EnableHandheldHids"}, + {521, nullptr, "DisableHandheldHids"}, + {522, nullptr, "SetJoyConRailEnabled"}, + {523, &IHidSystemServer::IsJoyConRailEnabled, "IsJoyConRailEnabled"}, + {524, nullptr, "IsHandheldHidsEnabled"}, + {525, &IHidSystemServer::IsJoyConAttachedOnAllRail, "IsJoyConAttachedOnAllRail"}, + {540, nullptr, "AcquirePlayReportControllerUsageUpdateEvent"}, + {541, nullptr, "GetPlayReportControllerUsages"}, + {542, nullptr, "AcquirePlayReportRegisteredDeviceUpdateEvent"}, + {543, nullptr, "GetRegisteredDevicesOld"}, + {544, &IHidSystemServer::AcquireConnectionTriggerTimeoutEvent, "AcquireConnectionTriggerTimeoutEvent"}, + {545, nullptr, "SendConnectionTrigger"}, + {546, &IHidSystemServer::AcquireDeviceRegisteredEventForControllerSupport, "AcquireDeviceRegisteredEventForControllerSupport"}, + {547, nullptr, "GetAllowedBluetoothLinksCount"}, + {548, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevices"}, + {549, nullptr, "GetConnectableRegisteredDevices"}, + {551, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevicesForControllerSupport"}, //20.0.0+ //mocked via 548 for Diablo 3 (at least) + {700, nullptr, "ActivateUniquePad"}, + {702, &IHidSystemServer::AcquireUniquePadConnectionEventHandle, "AcquireUniquePadConnectionEventHandle"}, + {703, &IHidSystemServer::GetUniquePadIds, "GetUniquePadIds"}, + {711, nullptr, "AcquireUniquePadConnectionOnHandheldForNsEventHandle"}, //20.0.0+ + {712, nullptr, "GetUniquePadColor12"}, //20.0.0+ + {751, &IHidSystemServer::AcquireJoyDetachOnBluetoothOffEventHandle, "AcquireJoyDetachOnBluetoothOffEventHandle"}, + {800, nullptr, "ListSixAxisSensorHandles"}, + {801, nullptr, "IsSixAxisSensorUserCalibrationSupported"}, + {802, nullptr, "ResetSixAxisSensorCalibrationValues"}, + {803, nullptr, "StartSixAxisSensorUserCalibration"}, + {804, nullptr, "CancelSixAxisSensorUserCalibration"}, + {805, nullptr, "GetUniquePadBluetoothAddress"}, + {806, nullptr, "DisconnectUniquePad"}, + {807, nullptr, "GetUniquePadType"}, + {808, nullptr, "GetUniquePadInterface"}, + {809, nullptr, "GetUniquePadSerialNumber"}, + {810, nullptr, "GetUniquePadControllerNumber"}, + {811, nullptr, "GetSixAxisSensorUserCalibrationStage"}, + {812, nullptr, "GetConsoleUniqueSixAxisSensorHandle"}, + {813, nullptr, "GetDeviceType"}, + {821, nullptr, "StartAnalogStickManualCalibration"}, + {822, nullptr, "RetryCurrentAnalogStickManualCalibrationStage"}, + {823, nullptr, "CancelAnalogStickManualCalibration"}, + {824, nullptr, "ResetAnalogStickManualCalibration"}, + {825, nullptr, "GetAnalogStickState"}, + {826, nullptr, "GetAnalogStickManualCalibrationStage"}, + {827, nullptr, "IsAnalogStickButtonPressed"}, + {828, nullptr, "IsAnalogStickInReleasePosition"}, + {829, nullptr, "IsAnalogStickInCircumference"}, + {830, nullptr, "SetNotificationLedPattern"}, + {831, nullptr, "SetNotificationLedPatternWithTimeout"}, + {832, nullptr, "PrepareHidsForNotificationWake"}, + {850, &IHidSystemServer::IsUsbFullKeyControllerEnabled, "IsUsbFullKeyControllerEnabled"}, + {851, &IHidSystemServer::EnableUsbFullKeyController, "EnableUsbFullKeyController"}, + {852, nullptr, "IsUsbConnected"}, + {870, &IHidSystemServer::IsHandheldButtonPressedOnConsoleMode, "IsHandheldButtonPressedOnConsoleMode"}, + {900, nullptr, "ActivateInputDetector"}, + {901, nullptr, "NotifyInputDetector"}, + {1000, &IHidSystemServer::InitializeFirmwareUpdate, "InitializeFirmwareUpdate"}, + {1001, nullptr, "GetFirmwareVersion"}, + {1002, nullptr, "GetAvailableFirmwareVersion"}, + {1003, nullptr, "IsFirmwareUpdateAvailable"}, + {1004, &IHidSystemServer::CheckFirmwareUpdateRequired, "CheckFirmwareUpdateRequired"}, + {1005, nullptr, "StartFirmwareUpdate"}, + {1006, nullptr, "AbortFirmwareUpdate"}, + {1007, nullptr, "GetFirmwareUpdateState"}, + {1008, nullptr, "ActivateAudioControl"}, + {1009, nullptr, "AcquireAudioControlEventHandle"}, + {1010, nullptr, "GetAudioControlStates"}, + {1011, nullptr, "DeactivateAudioControl"}, + {1012, nullptr, "GetFirmwareVersionStringForUserSupportPage"}, + {1050, nullptr, "IsSixAxisSensorAccurateUserCalibrationSupported"}, + {1051, nullptr, "StartSixAxisSensorAccurateUserCalibration"}, + {1052, nullptr, "CancelSixAxisSensorAccurateUserCalibration"}, + {1053, nullptr, "GetSixAxisSensorAccurateUserCalibrationState"}, + {1100, nullptr, "GetHidbusSystemServiceObject"}, + {1120, &IHidSystemServer::SetFirmwareHotfixUpdateSkipEnabled, "SetFirmwareHotfixUpdateSkipEnabled"}, + {1130, &IHidSystemServer::InitializeUsbFirmwareUpdate, "InitializeUsbFirmwareUpdate"}, + {1131, &IHidSystemServer::FinalizeUsbFirmwareUpdate, "FinalizeUsbFirmwareUpdate"}, + {1132, &IHidSystemServer::CheckUsbFirmwareUpdateRequired, "CheckUsbFirmwareUpdateRequired"}, + {1133, nullptr, "StartUsbFirmwareUpdate"}, + {1134, nullptr, "GetUsbFirmwareUpdateState"}, + {1135, &IHidSystemServer::InitializeUsbFirmwareUpdateWithoutMemory, "InitializeUsbFirmwareUpdateWithoutMemory"}, + {1150, &IHidSystemServer::SetTouchScreenMagnification, "SetTouchScreenMagnification"}, + {1151, &IHidSystemServer::GetTouchScreenFirmwareVersion, "GetTouchScreenFirmwareVersion"}, + {1152, &IHidSystemServer::SetTouchScreenDefaultConfiguration, "SetTouchScreenDefaultConfiguration"}, + {1153, &IHidSystemServer::GetTouchScreenDefaultConfiguration, "GetTouchScreenDefaultConfiguration"}, + {1154, nullptr, "IsFirmwareAvailableForNotification"}, + {1155, &IHidSystemServer::SetForceHandheldStyleVibration, "SetForceHandheldStyleVibration"}, + {1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"}, + {1157, nullptr, "CancelConnectionTrigger"}, + {1158, nullptr, "SetConnectionLimitForSplay"}, //20.1.0+ + {1159, nullptr, "ClearConnectionLimitForSplay"}, //20.1.0+ + {1200, nullptr, "IsButtonConfigSupported"}, + {1201, nullptr, "IsButtonConfigEmbeddedSupported"}, + {1202, nullptr, "DeleteButtonConfig"}, + {1203, nullptr, "DeleteButtonConfigEmbedded"}, + {1204, nullptr, "SetButtonConfigEnabled"}, + {1205, nullptr, "SetButtonConfigEmbeddedEnabled"}, + {1206, nullptr, "IsButtonConfigEnabled"}, + {1207, nullptr, "IsButtonConfigEmbeddedEnabled"}, + {1208, nullptr, "SetButtonConfigEmbedded"}, + {1209, nullptr, "SetButtonConfigFull"}, + {1210, nullptr, "SetButtonConfigLeft"}, + {1211, nullptr, "SetButtonConfigRight"}, + {1212, nullptr, "GetButtonConfigEmbedded"}, + {1213, nullptr, "GetButtonConfigFull"}, + {1214, nullptr, "GetButtonConfigLeft"}, + {1215, nullptr, "GetButtonConfigRight"}, + {1250, nullptr, "IsCustomButtonConfigSupported"}, + {1251, nullptr, "IsDefaultButtonConfigEmbedded"}, + {1252, nullptr, "IsDefaultButtonConfigFull"}, + {1253, nullptr, "IsDefaultButtonConfigLeft"}, + {1254, nullptr, "IsDefaultButtonConfigRight"}, + {1255, nullptr, "IsButtonConfigStorageEmbeddedEmpty"}, + {1256, nullptr, "IsButtonConfigStorageFullEmpty"}, + {1257, nullptr, "IsButtonConfigStorageLeftEmpty"}, + {1258, nullptr, "IsButtonConfigStorageRightEmpty"}, + {1259, nullptr, "GetButtonConfigStorageEmbeddedDeprecated"}, + {1260, nullptr, "GetButtonConfigStorageFullDeprecated"}, + {1261, nullptr, "GetButtonConfigStorageLeftDeprecated"}, + {1262, nullptr, "GetButtonConfigStorageRightDeprecated"}, + {1263, nullptr, "SetButtonConfigStorageEmbeddedDeprecated"}, + {1264, nullptr, "SetButtonConfigStorageFullDeprecated"}, + {1265, nullptr, "SetButtonConfigStorageLeftDeprecated"}, + {1266, nullptr, "SetButtonConfigStorageRightDeprecated"}, + {1267, nullptr, "DeleteButtonConfigStorageEmbedded"}, + {1268, nullptr, "DeleteButtonConfigStorageFull"}, + {1269, nullptr, "DeleteButtonConfigStorageLeft"}, + {1270, nullptr, "DeleteButtonConfigStorageRight"}, + {1271, &IHidSystemServer::IsUsingCustomButtonConfig, "IsUsingCustomButtonConfig"}, + {1272, &IHidSystemServer::IsAnyCustomButtonConfigEnabled, "IsAnyCustomButtonConfigEnabled"}, + {1273, nullptr, "SetAllCustomButtonConfigEnabled"}, + {1274, nullptr, "SetDefaultButtonConfig"}, + {1275, nullptr, "SetAllDefaultButtonConfig"}, + {1276, nullptr, "SetHidButtonConfigEmbedded"}, + {1277, nullptr, "SetHidButtonConfigFull"}, + {1278, nullptr, "SetHidButtonConfigLeft"}, + {1279, nullptr, "SetHidButtonConfigRight"}, + {1280, nullptr, "GetHidButtonConfigEmbedded"}, + {1281, nullptr, "GetHidButtonConfigFull"}, + {1282, nullptr, "GetHidButtonConfigLeft"}, + {1283, nullptr, "GetHidButtonConfigRight"}, + {1284, nullptr, "GetButtonConfigStorageEmbedded"}, + {1285, nullptr, "GetButtonConfigStorageFull"}, + {1286, nullptr, "GetButtonConfigStorageLeft"}, + {1287, nullptr, "GetButtonConfigStorageRight"}, + {1288, nullptr, "SetButtonConfigStorageEmbedded"}, + {1289, nullptr, "SetButtonConfigStorageFull"}, + {1290, nullptr, "DeleteButtonConfigStorageRight"}, + {1291, nullptr, "DeleteButtonConfigStorageRight"}, + {1308, nullptr, "SetButtonConfigVisible"}, //18.0.0+ + {1309, nullptr, "IsButtonConfigVisible"}, //18.0.0+ + {1320, nullptr, "WakeTouchScreenUp"}, //17.0.0+ + {1321, nullptr, "PutTouchScreenToSleep"}, //17.0.0+ + {1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent"}, //20.0.0+ + {1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings"}, //21.0.0+ + {1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent"}, //21.0.0+ + {1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement"}, //21.0.0+ + {1326, nullptr, "SetTouchScreenOffset"}, //21.0.0+ + {1420, nullptr, "GetAppletResourceProperty"}, //19.0.0+ + {12010, nullptr, "SetButtonConfigLeft"} //11.0.0-17.0.1 + }; + // clang-format on + + RegisterHandlers(functions); joy_detach_event = service_context.CreateEvent("IHidSystemServer::JoyDetachEvent"); acquire_device_registered_event = diff --git a/src/core/hle/service/hid/hid_system_server.h b/src/core/hle/service/hid/hid_system_server.h index e5da7bbdac..150b697305 100644 --- a/src/core/hle/service/hid/hid_system_server.h +++ b/src/core/hle/service/hid/hid_system_server.h @@ -84,252 +84,6 @@ private: std::shared_ptr GetResourceManager(); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{31, nullptr, "SendKeyboardLockKeyEvent"}, - FunctionInfo{101, nullptr, "AcquireHomeButtonEventHandle"}, - FunctionInfo{111, nullptr, "ActivateHomeButton"}, - FunctionInfo{121, nullptr, "AcquireSleepButtonEventHandle"}, - FunctionInfo{131, nullptr, "ActivateSleepButton"}, - FunctionInfo{141, nullptr, "AcquireCaptureButtonEventHandle"}, - FunctionInfo{151, nullptr, "ActivateCaptureButton"}, - FunctionInfo{161, &IHidSystemServer::GetPlatformConfig, "GetPlatformConfig"}, - FunctionInfo{210, nullptr, "AcquireNfcDeviceUpdateEventHandle"}, - FunctionInfo{211, nullptr, "GetNpadsWithNfc"}, - FunctionInfo{212, nullptr, "AcquireNfcActivateEventHandle"}, - FunctionInfo{213, nullptr, "ActivateNfc"}, - FunctionInfo{214, nullptr, "GetXcdHandleForNpadWithNfc"}, - FunctionInfo{215, nullptr, "IsNfcActivated"}, - FunctionInfo{216, nullptr, "GetAbstractedPadIdForNpadWithNfc"}, - FunctionInfo{217, nullptr, "SetNfcEvent"}, - FunctionInfo{218, nullptr, "GetNfcInfo"}, - FunctionInfo{219, nullptr, "StartNfcDiscovery"}, - FunctionInfo{220, nullptr, "StopNfcDiscovery"}, - FunctionInfo{221, nullptr, "StartNtagRead"}, - FunctionInfo{222, nullptr, "StartNtagWrite"}, - FunctionInfo{223, nullptr, "SendNfcRawData"}, - FunctionInfo{224, nullptr, "RegisterMifareKey"}, - FunctionInfo{225, nullptr, "ClearMifareKey"}, - FunctionInfo{226, nullptr, "StartMifareRead"}, - FunctionInfo{227, nullptr, "StartMifareWrite"}, - FunctionInfo{230, nullptr, "AcquireIrSensorEventHndle" }, - FunctionInfo{231, nullptr, "ActivateIrSensor"}, - FunctionInfo{232, nullptr, "GetIrSensorState"}, - FunctionInfo{233, nullptr, "GetXcdHandleForNpadWihIrSensor" }, - FunctionInfo{234, nullptr, "GetNpadJoyHoldType"}, - FunctionInfo{241, nullptr, "GetDataFormat"}, - FunctionInfo{242, nullptr, "SetDataFormat"}, - FunctionInfo{243, nullptr, "GetMcuState"}, - FunctionInfo{244, nullptr, "SetMcuState"}, - FunctionInfo{245, nullptr, "GetMcuVersionForNfc"}, - FunctionInfo{246, nullptr, "CheckNfcDevicePower"}, - FunctionInfo{247, nullptr, "SetMcuStateImmediate"}, - FunctionInfo{301, nullptr, "ActivateNpadSystem"}, - FunctionInfo{303, &IHidSystemServer::ApplyNpadSystemCommonPolicy, "ApplyNpadSystemCommonPolicy"}, - FunctionInfo{304, &IHidSystemServer::EnableAssigningSingleOnSlSrPress, "EnableAssigningSingleOnSlSrPress"}, - FunctionInfo{305, &IHidSystemServer::DisableAssigningSingleOnSlSrPress, "DisableAssigningSingleOnSlSrPress"}, - FunctionInfo{306, &IHidSystemServer::GetLastActiveNpad, "GetLastActiveNpad"}, - FunctionInfo{307, nullptr, "GetNpadSystemExtStyle"}, - FunctionInfo{308, &IHidSystemServer::ApplyNpadSystemCommonPolicyFull, "ApplyNpadSystemCommonPolicyFull"}, - FunctionInfo{309, &IHidSystemServer::GetNpadFullKeyGripColor, "GetNpadFullKeyGripColor"}, - FunctionInfo{310, &IHidSystemServer::GetMaskedSupportedNpadStyleSet, "GetMaskedSupportedNpadStyleSet"}, - FunctionInfo{311, nullptr, "SetNpadPlayerLedBlinkingDevice"}, - FunctionInfo{312, &IHidSystemServer::SetSupportedNpadStyleSetAll, "SetSupportedNpadStyleSetAll"}, - FunctionInfo{313, &IHidSystemServer::GetNpadCaptureButtonAssignment, "GetNpadCaptureButtonAssignment"}, - FunctionInfo{314, nullptr, "GetAppletFooterUiType"}, - FunctionInfo{315, &IHidSystemServer::GetAppletDetailedUiType, "GetAppletDetailedUiType"}, - FunctionInfo{316, &IHidSystemServer::GetNpadInterfaceType, "GetNpadInterfaceType"}, - FunctionInfo{317, &IHidSystemServer::GetNpadLeftRightInterfaceType, "GetNpadLeftRightInterfaceType"}, - FunctionInfo{318, &IHidSystemServer::HasBattery, "HasBattery"}, - FunctionInfo{319, &IHidSystemServer::HasLeftRightBattery, "HasLeftRightBattery"}, - FunctionInfo{321, &IHidSystemServer::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"}, - FunctionInfo{322, &IHidSystemServer::SetNpadSystemExtStateEnabled, "SetNpadSystemExtStateEnabled"}, - FunctionInfo{323, nullptr, "GetLastActiveUniquePad"}, - FunctionInfo{324, nullptr, "GetUniquePadButtonSet"}, - FunctionInfo{325, nullptr, "GetUniquePadColor"}, - FunctionInfo{326, nullptr, "GetUniquePadAppletDetailedUiType"}, - FunctionInfo{327, nullptr, "GetAbstractedPadIdDataFromNpad"}, - FunctionInfo{328, nullptr, "AttachAbstractedPadToNpad"}, - FunctionInfo{329, nullptr, "DetachAbstractedPadAll"}, - FunctionInfo{330, nullptr, "CheckAbstractedPadConnection"}, - FunctionInfo{332, nullptr, "ConvertAppletDetailedUiTypeFromPlayReportType", MakeVersionGate({19,0,0})}, - FunctionInfo{333, nullptr, "SetNpadUserSpgApplet", MakeVersionGate({20,0,0})}, - FunctionInfo{334, nullptr, "AcquireUniquePadButtonStateChangedEventHandle", MakeVersionGate({20,0,0})}, - FunctionInfo{501, &IHidSystemServer::RegisterAppletResourceUserId, "RegisterAppletResourceUserId"}, - FunctionInfo{502, &IHidSystemServer::UnregisterAppletResourceUserId, "UnregisterAppletResourceUserId"}, - FunctionInfo{503, &IHidSystemServer::EnableAppletToGetInput, "EnableAppletToGetInput"}, - FunctionInfo{504, &IHidSystemServer::SetAruidValidForVibration, "SetAruidValidForVibration"}, - FunctionInfo{505, &IHidSystemServer::EnableAppletToGetSixAxisSensor, "EnableAppletToGetSixAxisSensor"}, - FunctionInfo{506, &IHidSystemServer::EnableAppletToGetPadInput, "EnableAppletToGetPadInput"}, - FunctionInfo{507, &IHidSystemServer::EnableAppletToGetTouchScreen, "EnableAppletToGetTouchScreen"}, - FunctionInfo{510, &IHidSystemServer::SetVibrationMasterVolume, "SetVibrationMasterVolume"}, - FunctionInfo{511, &IHidSystemServer::GetVibrationMasterVolume, "GetVibrationMasterVolume"}, - FunctionInfo{512, &IHidSystemServer::BeginPermitVibrationSession, "BeginPermitVibrationSession"}, - FunctionInfo{513, &IHidSystemServer::EndPermitVibrationSession, "EndPermitVibrationSession"}, - FunctionInfo{514, nullptr, "Unknown514"}, - FunctionInfo{520, nullptr, "EnableHandheldHids"}, - FunctionInfo{521, nullptr, "DisableHandheldHids"}, - FunctionInfo{522, nullptr, "SetJoyConRailEnabled"}, - FunctionInfo{523, &IHidSystemServer::IsJoyConRailEnabled, "IsJoyConRailEnabled"}, - FunctionInfo{524, nullptr, "IsHandheldHidsEnabled"}, - FunctionInfo{525, &IHidSystemServer::IsJoyConAttachedOnAllRail, "IsJoyConAttachedOnAllRail"}, - FunctionInfo{540, nullptr, "AcquirePlayReportControllerUsageUpdateEvent"}, - FunctionInfo{541, nullptr, "GetPlayReportControllerUsages"}, - FunctionInfo{542, nullptr, "AcquirePlayReportRegisteredDeviceUpdateEvent"}, - FunctionInfo{543, nullptr, "GetRegisteredDevicesOld"}, - FunctionInfo{544, &IHidSystemServer::AcquireConnectionTriggerTimeoutEvent, "AcquireConnectionTriggerTimeoutEvent"}, - FunctionInfo{545, nullptr, "SendConnectionTrigger"}, - FunctionInfo{546, &IHidSystemServer::AcquireDeviceRegisteredEventForControllerSupport, "AcquireDeviceRegisteredEventForControllerSupport"}, - FunctionInfo{547, nullptr, "GetAllowedBluetoothLinksCount"}, - FunctionInfo{548, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevices"}, - FunctionInfo{549, nullptr, "GetConnectableRegisteredDevices"}, - FunctionInfo{551, &IHidSystemServer::GetRegisteredDevices, "GetRegisteredDevicesForControllerSupport", MakeVersionGate({20,0,0})}, //mocked via 548 for Diablo 3 (at least) - FunctionInfo{700, nullptr, "ActivateUniquePad"}, - FunctionInfo{702, &IHidSystemServer::AcquireUniquePadConnectionEventHandle, "AcquireUniquePadConnectionEventHandle"}, - FunctionInfo{703, &IHidSystemServer::GetUniquePadIds, "GetUniquePadIds"}, - FunctionInfo{711, nullptr, "AcquireUniquePadConnectionOnHandheldForNsEventHandle", MakeVersionGate({20,0,0})}, - FunctionInfo{712, nullptr, "GetUniquePadColor12", MakeVersionGate({20,0,0})}, - FunctionInfo{751, &IHidSystemServer::AcquireJoyDetachOnBluetoothOffEventHandle, "AcquireJoyDetachOnBluetoothOffEventHandle"}, - FunctionInfo{800, nullptr, "ListSixAxisSensorHandles"}, - FunctionInfo{801, nullptr, "IsSixAxisSensorUserCalibrationSupported"}, - FunctionInfo{802, nullptr, "ResetSixAxisSensorCalibrationValues"}, - FunctionInfo{803, nullptr, "StartSixAxisSensorUserCalibration"}, - FunctionInfo{804, nullptr, "CancelSixAxisSensorUserCalibration"}, - FunctionInfo{805, nullptr, "GetUniquePadBluetoothAddress"}, - FunctionInfo{806, nullptr, "DisconnectUniquePad"}, - FunctionInfo{807, nullptr, "GetUniquePadType"}, - FunctionInfo{808, nullptr, "GetUniquePadInterface"}, - FunctionInfo{809, nullptr, "GetUniquePadSerialNumber"}, - FunctionInfo{810, nullptr, "GetUniquePadControllerNumber"}, - FunctionInfo{811, nullptr, "GetSixAxisSensorUserCalibrationStage"}, - FunctionInfo{812, nullptr, "GetConsoleUniqueSixAxisSensorHandle"}, - FunctionInfo{813, nullptr, "GetDeviceType"}, - FunctionInfo{821, nullptr, "StartAnalogStickManualCalibration"}, - FunctionInfo{822, nullptr, "RetryCurrentAnalogStickManualCalibrationStage"}, - FunctionInfo{823, nullptr, "CancelAnalogStickManualCalibration"}, - FunctionInfo{824, nullptr, "ResetAnalogStickManualCalibration"}, - FunctionInfo{825, nullptr, "GetAnalogStickState"}, - FunctionInfo{826, nullptr, "GetAnalogStickManualCalibrationStage"}, - FunctionInfo{827, nullptr, "IsAnalogStickButtonPressed"}, - FunctionInfo{828, nullptr, "IsAnalogStickInReleasePosition"}, - FunctionInfo{829, nullptr, "IsAnalogStickInCircumference"}, - FunctionInfo{830, nullptr, "SetNotificationLedPattern"}, - FunctionInfo{831, nullptr, "SetNotificationLedPatternWithTimeout"}, - FunctionInfo{832, nullptr, "PrepareHidsForNotificationWake"}, - FunctionInfo{850, &IHidSystemServer::IsUsbFullKeyControllerEnabled, "IsUsbFullKeyControllerEnabled"}, - FunctionInfo{851, &IHidSystemServer::EnableUsbFullKeyController, "EnableUsbFullKeyController"}, - FunctionInfo{852, nullptr, "IsUsbConnected"}, - FunctionInfo{870, &IHidSystemServer::IsHandheldButtonPressedOnConsoleMode, "IsHandheldButtonPressedOnConsoleMode"}, - FunctionInfo{900, nullptr, "ActivateInputDetector"}, - FunctionInfo{901, nullptr, "NotifyInputDetector"}, - FunctionInfo{1000, &IHidSystemServer::InitializeFirmwareUpdate, "InitializeFirmwareUpdate"}, - FunctionInfo{1001, nullptr, "GetFirmwareVersion"}, - FunctionInfo{1002, nullptr, "GetAvailableFirmwareVersion"}, - FunctionInfo{1003, nullptr, "IsFirmwareUpdateAvailable"}, - FunctionInfo{1004, &IHidSystemServer::CheckFirmwareUpdateRequired, "CheckFirmwareUpdateRequired"}, - FunctionInfo{1005, nullptr, "StartFirmwareUpdate"}, - FunctionInfo{1006, nullptr, "AbortFirmwareUpdate"}, - FunctionInfo{1007, nullptr, "GetFirmwareUpdateState"}, - FunctionInfo{1008, nullptr, "ActivateAudioControl"}, - FunctionInfo{1009, nullptr, "AcquireAudioControlEventHandle"}, - FunctionInfo{1010, nullptr, "GetAudioControlStates"}, - FunctionInfo{1011, nullptr, "DeactivateAudioControl"}, - FunctionInfo{1012, nullptr, "GetFirmwareVersionStringForUserSupportPage"}, - FunctionInfo{1050, nullptr, "IsSixAxisSensorAccurateUserCalibrationSupported"}, - FunctionInfo{1051, nullptr, "StartSixAxisSensorAccurateUserCalibration"}, - FunctionInfo{1052, nullptr, "CancelSixAxisSensorAccurateUserCalibration"}, - FunctionInfo{1053, nullptr, "GetSixAxisSensorAccurateUserCalibrationState"}, - FunctionInfo{1100, nullptr, "GetHidbusSystemServiceObject"}, - FunctionInfo{1120, &IHidSystemServer::SetFirmwareHotfixUpdateSkipEnabled, "SetFirmwareHotfixUpdateSkipEnabled"}, - FunctionInfo{1130, &IHidSystemServer::InitializeUsbFirmwareUpdate, "InitializeUsbFirmwareUpdate"}, - FunctionInfo{1131, &IHidSystemServer::FinalizeUsbFirmwareUpdate, "FinalizeUsbFirmwareUpdate"}, - FunctionInfo{1132, &IHidSystemServer::CheckUsbFirmwareUpdateRequired, "CheckUsbFirmwareUpdateRequired"}, - FunctionInfo{1133, nullptr, "StartUsbFirmwareUpdate"}, - FunctionInfo{1134, nullptr, "GetUsbFirmwareUpdateState"}, - FunctionInfo{1135, &IHidSystemServer::InitializeUsbFirmwareUpdateWithoutMemory, "InitializeUsbFirmwareUpdateWithoutMemory"}, - FunctionInfo{1150, &IHidSystemServer::SetTouchScreenMagnification, "SetTouchScreenMagnification"}, - FunctionInfo{1151, &IHidSystemServer::GetTouchScreenFirmwareVersion, "GetTouchScreenFirmwareVersion"}, - FunctionInfo{1152, &IHidSystemServer::SetTouchScreenDefaultConfiguration, "SetTouchScreenDefaultConfiguration"}, - FunctionInfo{1153, &IHidSystemServer::GetTouchScreenDefaultConfiguration, "GetTouchScreenDefaultConfiguration"}, - FunctionInfo{1154, nullptr, "IsFirmwareAvailableForNotification"}, - FunctionInfo{1155, &IHidSystemServer::SetForceHandheldStyleVibration, "SetForceHandheldStyleVibration"}, - FunctionInfo{1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"}, - FunctionInfo{1157, nullptr, "CancelConnectionTrigger"}, - FunctionInfo{1158, nullptr, "SetConnectionLimitForSplay", MakeVersionGate({20,1,0})}, - FunctionInfo{1159, nullptr, "ClearConnectionLimitForSplay", MakeVersionGate({20,1,0})}, - FunctionInfo{1200, nullptr, "IsButtonConfigSupported"}, - FunctionInfo{1201, nullptr, "IsButtonConfigEmbeddedSupported"}, - FunctionInfo{1202, nullptr, "DeleteButtonConfig"}, - FunctionInfo{1203, nullptr, "DeleteButtonConfigEmbedded"}, - FunctionInfo{1204, nullptr, "SetButtonConfigEnabled"}, - FunctionInfo{1205, nullptr, "SetButtonConfigEmbeddedEnabled"}, - FunctionInfo{1206, nullptr, "IsButtonConfigEnabled"}, - FunctionInfo{1207, nullptr, "IsButtonConfigEmbeddedEnabled"}, - FunctionInfo{1208, nullptr, "SetButtonConfigEmbedded"}, - FunctionInfo{1209, nullptr, "SetButtonConfigFull"}, - FunctionInfo{1210, nullptr, "SetButtonConfigLeft"}, - FunctionInfo{1211, nullptr, "SetButtonConfigRight"}, - FunctionInfo{1212, nullptr, "GetButtonConfigEmbedded"}, - FunctionInfo{1213, nullptr, "GetButtonConfigFull"}, - FunctionInfo{1214, nullptr, "GetButtonConfigLeft"}, - FunctionInfo{1215, nullptr, "GetButtonConfigRight"}, - FunctionInfo{1250, nullptr, "IsCustomButtonConfigSupported"}, - FunctionInfo{1251, nullptr, "IsDefaultButtonConfigEmbedded"}, - FunctionInfo{1252, nullptr, "IsDefaultButtonConfigFull"}, - FunctionInfo{1253, nullptr, "IsDefaultButtonConfigLeft"}, - FunctionInfo{1254, nullptr, "IsDefaultButtonConfigRight"}, - FunctionInfo{1255, nullptr, "IsButtonConfigStorageEmbeddedEmpty"}, - FunctionInfo{1256, nullptr, "IsButtonConfigStorageFullEmpty"}, - FunctionInfo{1257, nullptr, "IsButtonConfigStorageLeftEmpty"}, - FunctionInfo{1258, nullptr, "IsButtonConfigStorageRightEmpty"}, - FunctionInfo{1259, nullptr, "GetButtonConfigStorageEmbeddedDeprecated"}, - FunctionInfo{1260, nullptr, "GetButtonConfigStorageFullDeprecated"}, - FunctionInfo{1261, nullptr, "GetButtonConfigStorageLeftDeprecated"}, - FunctionInfo{1262, nullptr, "GetButtonConfigStorageRightDeprecated"}, - FunctionInfo{1263, nullptr, "SetButtonConfigStorageEmbeddedDeprecated"}, - FunctionInfo{1264, nullptr, "SetButtonConfigStorageFullDeprecated"}, - FunctionInfo{1265, nullptr, "SetButtonConfigStorageLeftDeprecated"}, - FunctionInfo{1266, nullptr, "SetButtonConfigStorageRightDeprecated"}, - FunctionInfo{1267, nullptr, "DeleteButtonConfigStorageEmbedded"}, - FunctionInfo{1268, nullptr, "DeleteButtonConfigStorageFull"}, - FunctionInfo{1269, nullptr, "DeleteButtonConfigStorageLeft"}, - FunctionInfo{1270, nullptr, "DeleteButtonConfigStorageRight"}, - FunctionInfo{1271, &IHidSystemServer::IsUsingCustomButtonConfig, "IsUsingCustomButtonConfig"}, - FunctionInfo{1272, &IHidSystemServer::IsAnyCustomButtonConfigEnabled, "IsAnyCustomButtonConfigEnabled"}, - FunctionInfo{1273, nullptr, "SetAllCustomButtonConfigEnabled"}, - FunctionInfo{1274, nullptr, "SetDefaultButtonConfig"}, - FunctionInfo{1275, nullptr, "SetAllDefaultButtonConfig"}, - FunctionInfo{1276, nullptr, "SetHidButtonConfigEmbedded"}, - FunctionInfo{1277, nullptr, "SetHidButtonConfigFull"}, - FunctionInfo{1278, nullptr, "SetHidButtonConfigLeft"}, - FunctionInfo{1279, nullptr, "SetHidButtonConfigRight"}, - FunctionInfo{1280, nullptr, "GetHidButtonConfigEmbedded"}, - FunctionInfo{1281, nullptr, "GetHidButtonConfigFull"}, - FunctionInfo{1282, nullptr, "GetHidButtonConfigLeft"}, - FunctionInfo{1283, nullptr, "GetHidButtonConfigRight"}, - FunctionInfo{1284, nullptr, "GetButtonConfigStorageEmbedded"}, - FunctionInfo{1285, nullptr, "GetButtonConfigStorageFull"}, - FunctionInfo{1286, nullptr, "GetButtonConfigStorageLeft"}, - FunctionInfo{1287, nullptr, "GetButtonConfigStorageRight"}, - FunctionInfo{1288, nullptr, "SetButtonConfigStorageEmbedded"}, - FunctionInfo{1289, nullptr, "SetButtonConfigStorageFull"}, - FunctionInfo{1290, nullptr, "DeleteButtonConfigStorageRight"}, - FunctionInfo{1291, nullptr, "DeleteButtonConfigStorageRight"}, - FunctionInfo{1308, nullptr, "SetButtonConfigVisible", MakeVersionGate({18,0,0})}, - FunctionInfo{1309, nullptr, "IsButtonConfigVisible", MakeVersionGate({18,0,0})}, - FunctionInfo{1320, nullptr, "WakeTouchScreenUp", MakeVersionGate({17,0,0})}, - FunctionInfo{1321, nullptr, "PutTouchScreenToSleep", MakeVersionGate({17,0,0})}, - FunctionInfo{1322, nullptr, "AcquireTouchScreenAsyncWakeCompletedEvent", MakeVersionGate({20,0,0})}, - FunctionInfo{1323, nullptr, "StartTouchScreenAutoTuneForSystemSettings", MakeVersionGate({21,0,0})}, - FunctionInfo{1324, nullptr, "AcquireTouchScreenAutoTuneCompletedEvent", MakeVersionGate({21,0,0})}, - FunctionInfo{1325, nullptr, "IsTouchScreenAutoTuneRequiredForRepairProviderReplacement", MakeVersionGate({21,0,0})}, - FunctionInfo{1326, nullptr, "SetTouchScreenOffset", MakeVersionGate({21,0,0})}, - FunctionInfo{1420, nullptr, "GetAppletResourceProperty", MakeVersionGate({19,0,0})}, - FunctionInfo{12010, nullptr, "SetButtonConfigLeft", MakeVersionGate({11,0,0}, {17,0,1})} - ); - Kernel::KEvent* acquire_connection_trigger_timeout_event; Kernel::KEvent* acquire_device_registered_event; Kernel::KEvent* joy_detach_event; diff --git a/src/core/hle/service/hid/hidbus.cpp b/src/core/hle/service/hid/hidbus.cpp index 326cfbf74b..70bb5437e3 100644 --- a/src/core/hle/service/hid/hidbus.cpp +++ b/src/core/hle/service/hid/hidbus.cpp @@ -26,28 +26,30 @@ namespace Service::HID { // (15ms, 66Hz) constexpr auto hidbus_update_ns = std::chrono::nanoseconds{15 * 1000 * 1000}; -std::optional Hidbus::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, C<&Hidbus::GetBusHandle>, "GetBusHandle"}, - FunctionInfo{2, C<&Hidbus::IsExternalDeviceConnected>, "IsExternalDeviceConnected"}, - FunctionInfo{3, C<&Hidbus::Initialize>, "Initialize"}, - FunctionInfo{4, C<&Hidbus::Finalize>, "Finalize"}, - FunctionInfo{5, C<&Hidbus::EnableExternalDevice>, "EnableExternalDevice"}, - FunctionInfo{6, C<&Hidbus::GetExternalDeviceId>, "GetExternalDeviceId"}, - FunctionInfo{7, C<&Hidbus::SendCommandAsync>, "SendCommandAsync"}, - FunctionInfo{8, C<&Hidbus::GetSendCommandAsynceResult>, "GetSendCommandAsynceResult"}, - FunctionInfo{9, C<&Hidbus::SetEventForSendCommandAsycResult>, "SetEventForSendCommandAsycResult"}, - FunctionInfo{10, C<&Hidbus::GetSharedMemoryHandle>, "GetSharedMemoryHandle"}, - FunctionInfo{11, C<&Hidbus::EnableJoyPollingReceiveMode>, "EnableJoyPollingReceiveMode"}, - FunctionInfo{12, C<&Hidbus::DisableJoyPollingReceiveMode>, "DisableJoyPollingReceiveMode"}, - FunctionInfo{13, nullptr, "GetPollingData"}, - FunctionInfo{14, C<&Hidbus::SetStatusManagerType>, "SetStatusManagerType"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - Hidbus::Hidbus(Core::System& system_) : ServiceFramework{system_, "hidbus"}, service_context{system_, service_name} { + + // clang-format off + static const FunctionInfo functions[] = { + {1, C<&Hidbus::GetBusHandle>, "GetBusHandle"}, + {2, C<&Hidbus::IsExternalDeviceConnected>, "IsExternalDeviceConnected"}, + {3, C<&Hidbus::Initialize>, "Initialize"}, + {4, C<&Hidbus::Finalize>, "Finalize"}, + {5, C<&Hidbus::EnableExternalDevice>, "EnableExternalDevice"}, + {6, C<&Hidbus::GetExternalDeviceId>, "GetExternalDeviceId"}, + {7, C<&Hidbus::SendCommandAsync>, "SendCommandAsync"}, + {8, C<&Hidbus::GetSendCommandAsynceResult>, "GetSendCommandAsynceResult"}, + {9, C<&Hidbus::SetEventForSendCommandAsycResult>, "SetEventForSendCommandAsycResult"}, + {10, C<&Hidbus::GetSharedMemoryHandle>, "GetSharedMemoryHandle"}, + {11, C<&Hidbus::EnableJoyPollingReceiveMode>, "EnableJoyPollingReceiveMode"}, + {12, C<&Hidbus::DisableJoyPollingReceiveMode>, "DisableJoyPollingReceiveMode"}, + {13, nullptr, "GetPollingData"}, + {14, C<&Hidbus::SetStatusManagerType>, "SetStatusManagerType"}, + }; + // clang-format on + + RegisterHandlers(functions); + // Register update callbacks hidbus_update_event = Core::Timing::CreateEvent( "Hidbus::UpdateCallback", diff --git a/src/core/hle/service/hid/hidbus.h b/src/core/hle/service/hid/hidbus.h index 9ad097150e..19dd894ed3 100644 --- a/src/core/hle/service/hid/hidbus.h +++ b/src/core/hle/service/hid/hidbus.h @@ -147,8 +147,6 @@ private: } } - std::optional FindRequest(u32 key) override; - bool is_hidbus_enabled{false}; HidbusStatusManager hidbus_status{}; std::array devices{}; diff --git a/src/core/hle/service/hid/irs.cpp b/src/core/hle/service/hid/irs.cpp index a17395b596..3d87e6788d 100644 --- a/src/core/hle/service/hid/irs.cpp +++ b/src/core/hle/service/hid/irs.cpp @@ -29,32 +29,32 @@ namespace Service::IRS { -std::optional IRS::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{302, C<&IRS::ActivateIrsensor>, "ActivateIrsensor"}, - FunctionInfo{303, C<&IRS::DeactivateIrsensor>, "DeactivateIrsensor"}, - FunctionInfo{304, C<&IRS::GetIrsensorSharedMemoryHandle>, "GetIrsensorSharedMemoryHandle"}, - FunctionInfo{305, C<&IRS::StopImageProcessor>, "StopImageProcessor"}, - FunctionInfo{306, C<&IRS::RunMomentProcessor>, "RunMomentProcessor"}, - FunctionInfo{307, C<&IRS::RunClusteringProcessor>, "RunClusteringProcessor"}, - FunctionInfo{308, C<&IRS::RunImageTransferProcessor>, "RunImageTransferProcessor"}, - FunctionInfo{309, C<&IRS::GetImageTransferProcessorState>, "GetImageTransferProcessorState"}, - FunctionInfo{310, C<&IRS::RunTeraPluginProcessor>, "RunTeraPluginProcessor"}, - FunctionInfo{311, C<&IRS::GetNpadIrCameraHandle>, "GetNpadIrCameraHandle"}, - FunctionInfo{312, C<&IRS::RunPointingProcessor>, "RunPointingProcessor"}, - FunctionInfo{313, C<&IRS::SuspendImageProcessor>, "SuspendImageProcessor"}, - FunctionInfo{314, C<&IRS::CheckFirmwareVersion>, "CheckFirmwareVersion"}, - FunctionInfo{315, C<&IRS::SetFunctionLevel>, "SetFunctionLevel"}, - FunctionInfo{316, C<&IRS::RunImageTransferExProcessor>, "RunImageTransferExProcessor"}, - FunctionInfo{317, C<&IRS::RunIrLedProcessor>, "RunIrLedProcessor"}, - FunctionInfo{318, C<&IRS::StopImageProcessorAsync>, "StopImageProcessorAsync"}, - FunctionInfo{319, C<&IRS::ActivateIrsensorWithFunctionLevel>, "ActivateIrsensorWithFunctionLevel"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IRS::IRS(Core::System& system_) : ServiceFramework{system_, "irs"} { + // clang-format off + static const FunctionInfo functions[] = { + {302, C<&IRS::ActivateIrsensor>, "ActivateIrsensor"}, + {303, C<&IRS::DeactivateIrsensor>, "DeactivateIrsensor"}, + {304, C<&IRS::GetIrsensorSharedMemoryHandle>, "GetIrsensorSharedMemoryHandle"}, + {305, C<&IRS::StopImageProcessor>, "StopImageProcessor"}, + {306, C<&IRS::RunMomentProcessor>, "RunMomentProcessor"}, + {307, C<&IRS::RunClusteringProcessor>, "RunClusteringProcessor"}, + {308, C<&IRS::RunImageTransferProcessor>, "RunImageTransferProcessor"}, + {309, C<&IRS::GetImageTransferProcessorState>, "GetImageTransferProcessorState"}, + {310, C<&IRS::RunTeraPluginProcessor>, "RunTeraPluginProcessor"}, + {311, C<&IRS::GetNpadIrCameraHandle>, "GetNpadIrCameraHandle"}, + {312, C<&IRS::RunPointingProcessor>, "RunPointingProcessor"}, + {313, C<&IRS::SuspendImageProcessor>, "SuspendImageProcessor"}, + {314, C<&IRS::CheckFirmwareVersion>, "CheckFirmwareVersion"}, + {315, C<&IRS::SetFunctionLevel>, "SetFunctionLevel"}, + {316, C<&IRS::RunImageTransferExProcessor>, "RunImageTransferExProcessor"}, + {317, C<&IRS::RunIrLedProcessor>, "RunIrLedProcessor"}, + {318, C<&IRS::StopImageProcessorAsync>, "StopImageProcessorAsync"}, + {319, C<&IRS::ActivateIrsensorWithFunctionLevel>, "ActivateIrsensorWithFunctionLevel"}, + }; + // clang-format on + u8* raw_shared_memory = system.Kernel().GetIrsSharedMem().GetPointer(); + RegisterHandlers(functions); shared_memory = std::construct_at(reinterpret_cast(raw_shared_memory)); npad_device = system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1); @@ -369,6 +369,16 @@ Core::IrSensor::DeviceFormat& IRS::GetIrCameraSharedMemoryDeviceEntry( } IRS_SYS::IRS_SYS(Core::System& system_) : ServiceFramework{system_, "irs:sys"} { + // clang-format off + static const FunctionInfo functions[] = { + {500, nullptr, "SetAppletResourceUserId"}, + {501, nullptr, "RegisterAppletResourceUserId"}, + {502, nullptr, "UnregisterAppletResourceUserId"}, + {503, nullptr, "EnableAppletToGetInput"}, + }; + // clang-format on + + RegisterHandlers(functions); } IRS_SYS::~IRS_SYS() = default; diff --git a/src/core/hle/service/hid/irs.h b/src/core/hle/service/hid/irs.h index be81ea75a9..2ca34b9106 100644 --- a/src/core/hle/service/hid/irs.h +++ b/src/core/hle/service/hid/irs.h @@ -157,8 +157,6 @@ private: return static_cast(*processors[index]); } - std::optional FindRequest(u32 key) override; - Core::HID::EmulatedController* npad_device = nullptr; StatusManager* shared_memory = nullptr; std::array, 9> processors{}; @@ -168,16 +166,6 @@ class IRS_SYS final : public ServiceFramework { public: explicit IRS_SYS(Core::System& system); ~IRS_SYS() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{500, nullptr, "SetAppletResourceUserId"}, - FunctionInfo{501, nullptr, "RegisterAppletResourceUserId"}, - FunctionInfo{502, nullptr, "UnregisterAppletResourceUserId"}, - FunctionInfo{503, nullptr, "EnableAppletToGetInput"} - ); }; } // namespace Service::IRS diff --git a/src/core/hle/service/hid/xcd.cpp b/src/core/hle/service/hid/xcd.cpp index 6b8ae7048c..2e41cbd3da 100644 --- a/src/core/hle/service/hid/xcd.cpp +++ b/src/core/hle/service/hid/xcd.cpp @@ -9,6 +9,33 @@ namespace Service::HID { XCD_SYS::XCD_SYS(Core::System& system_) : ServiceFramework{system_, "xcd:sys"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetDataFormat"}, + {1, nullptr, "SetDataFormat"}, + {2, nullptr, "GetMcuState"}, + {3, nullptr, "SetMcuState"}, + {4, nullptr, "GetMcuVersionForNfc"}, + {5, nullptr, "CheckNfcDevicePower"}, + {10, nullptr, "SetNfcEvent"}, + {11, nullptr, "GetNfcInfo"}, + {12, nullptr, "StartNfcDiscovery"}, + {13, nullptr, "StopNfcDiscovery"}, + {14, nullptr, "StartNtagRead"}, + {15, nullptr, "StartNtagWrite"}, + {16, nullptr, "SendNfcRawData"}, + {17, nullptr, "RegisterMifareKey"}, + {18, nullptr, "ClearMifareKey"}, + {19, nullptr, "StartMifareRead"}, + {20, nullptr, "StartMifareWrite"}, + {101, nullptr, "GetAwakeTriggerReasonForLeftRail"}, + {102, nullptr, "GetAwakeTriggerReasonForRightRail"}, + {103, nullptr, "GetAwakeTriggerBatteryLevelTransitionForLeftRail"}, + {104, nullptr, "GetAwakeTriggerBatteryLevelTransitionForRightRail"}, + }; + // clang-format on + + RegisterHandlers(functions); } XCD_SYS::~XCD_SYS() = default; diff --git a/src/core/hle/service/hid/xcd.h b/src/core/hle/service/hid/xcd.h index af1dd88ef7..9000110a9a 100644 --- a/src/core/hle/service/hid/xcd.h +++ b/src/core/hle/service/hid/xcd.h @@ -18,33 +18,6 @@ class XCD_SYS final : public ServiceFramework { public: explicit XCD_SYS(Core::System& system_); ~XCD_SYS() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetDataFormat"}, - FunctionInfo{1, nullptr, "SetDataFormat"}, - FunctionInfo{2, nullptr, "GetMcuState"}, - FunctionInfo{3, nullptr, "SetMcuState"}, - FunctionInfo{4, nullptr, "GetMcuVersionForNfc"}, - FunctionInfo{5, nullptr, "CheckNfcDevicePower"}, - FunctionInfo{10, nullptr, "SetNfcEvent"}, - FunctionInfo{11, nullptr, "GetNfcInfo"}, - FunctionInfo{12, nullptr, "StartNfcDiscovery"}, - FunctionInfo{13, nullptr, "StopNfcDiscovery"}, - FunctionInfo{14, nullptr, "StartNtagRead"}, - FunctionInfo{15, nullptr, "StartNtagWrite"}, - FunctionInfo{16, nullptr, "SendNfcRawData"}, - FunctionInfo{17, nullptr, "RegisterMifareKey"}, - FunctionInfo{18, nullptr, "ClearMifareKey"}, - FunctionInfo{19, nullptr, "StartMifareRead"}, - FunctionInfo{20, nullptr, "StartMifareWrite"}, - FunctionInfo{101, nullptr, "GetAwakeTriggerReasonForLeftRail"}, - FunctionInfo{102, nullptr, "GetAwakeTriggerReasonForRightRail"}, - FunctionInfo{103, nullptr, "GetAwakeTriggerBatteryLevelTransitionForLeftRail"}, - FunctionInfo{104, nullptr, "GetAwakeTriggerBatteryLevelTransitionForRightRail"} - ); }; } // namespace Service::HID diff --git a/src/core/hle/service/i2c/i2c.cpp b/src/core/hle/service/i2c/i2c.cpp index d0a5e29f8c..0b242768c2 100644 --- a/src/core/hle/service/i2c/i2c.cpp +++ b/src/core/hle/service/i2c/i2c.cpp @@ -17,26 +17,25 @@ namespace Service::I2C { class I2CSession final : public ServiceFramework { public: - explicit I2CSession(Core::System& system_) : ServiceFramework{system_, "I2CSession"} {} + explicit I2CSession(Core::System& system_) + : ServiceFramework{system_, "I2CSession"} + { + static const FunctionInfo functions[] = { + {0, nullptr, "SendOld"}, + {1, nullptr, "ReceiveOld"}, + {2, nullptr, "ExecuteCommandListOld"}, + {10, C<&I2CSession::Send>, "Send"}, + {11, nullptr, "Receive"}, + {12, nullptr, "ExecuteCommandList"}, + {13, nullptr, "SetRetryPolicy"}, + }; + RegisterHandlers(functions); + } ~I2CSession() override = default; - Result Send(InBuffer in_data, u32 transaction_option) { LOG_WARNING(Service, "(stubbed) topt={}", transaction_option); R_THROW(ResultUnknown); } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SendOld"}, - FunctionInfo{1, nullptr, "ReceiveOld"}, - FunctionInfo{2, nullptr, "ExecuteCommandListOld"}, - FunctionInfo{10, C<&I2CSession::Send>, "Send"}, - FunctionInfo{11, nullptr, "Receive"}, - FunctionInfo{12, nullptr, "ExecuteCommandList"}, - FunctionInfo{13, nullptr, "SetRetryPolicy"} - ); }; enum class I2CDevice : u32 { @@ -46,9 +45,19 @@ enum class I2CDevice : u32 { class I2C final : public ServiceFramework { public: - explicit I2C(Core::System& system_) : ServiceFramework{system_, "i2c"} {} + explicit I2C(Core::System& system_) + : ServiceFramework{system_, "i2c"} + { + static const FunctionInfo functions[] = { + {0, C<&I2C::OpenSessionForDev>, "OpenSessionForDev"}, + {1, C<&I2C::OpenSession>, "OpenSession"}, + {2, C<&I2C::HasDevice>, "HasDevice"}, + {3, C<&I2C::HasDeviceForDev>, "HasDeviceForDev"}, + {4, C<&I2C::OpenSession2>, "OpenSession2"}, + }; + RegisterHandlers(functions); + } ~I2C() override = default; - Result OpenSessionForDev(OutInterface out_session, s32 bus_idx, u32 slave_address, u32 addressing_mode, u32 speed_mode) { LOG_DEBUG(Service, "(stubbed)"); *out_session = std::make_shared(system); @@ -74,17 +83,6 @@ public: *out_session = std::make_shared(system); R_SUCCEED(); } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&I2C::OpenSessionForDev>, "OpenSessionForDev"}, - FunctionInfo{1, C<&I2C::OpenSession>, "OpenSession"}, - FunctionInfo{2, C<&I2C::HasDevice>, "HasDevice"}, - FunctionInfo{3, C<&I2C::HasDeviceForDev>, "HasDeviceForDev"}, - FunctionInfo{4, C<&I2C::OpenSession2>, "OpenSession2"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/jit/jit.cpp b/src/core/hle/service/jit/jit.cpp index 9059aaf518..ec3a3a8dcb 100644 --- a/src/core/hle/service/jit/jit.cpp +++ b/src/core/hle/service/jit/jit.cpp @@ -37,6 +37,18 @@ public: , user_ro{std::move(user_ro_)} , context{process_->GetMemory()} { + + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&IJitEnvironment::GenerateCode>, "GenerateCode"}, + {1, C<&IJitEnvironment::Control>, "Control"}, + {1000, C<&IJitEnvironment::LoadPlugin>, "LoadPlugin"}, + {1001, C<&IJitEnvironment::GetCodeAddress>, "GetCodeAddress"}, + }; + // clang-format on + + RegisterHandlers(functions); + // Identity map user code range into sysmodule context configuration.user_rx_memory.size = user_rx.GetSize(); configuration.user_rx_memory.offset = user_rx.GetAddress(); @@ -47,10 +59,6 @@ public: configuration.sys_ro_memory = configuration.user_ro_memory; } - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - ~IJitEnvironment() { user_rx.Finalize(system.Kernel()); user_ro.Finalize(system.Kernel()); @@ -240,13 +248,6 @@ private: return in; } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IJitEnvironment::GenerateCode>, "GenerateCode"}, - FunctionInfo{1, C<&IJitEnvironment::Control>, "Control"}, - FunctionInfo{1000, C<&IJitEnvironment::LoadPlugin>, "LoadPlugin"}, - FunctionInfo{1001, C<&IJitEnvironment::GetCodeAddress>, "GetCodeAddress"} - ); - Kernel::KScopedAutoObject process; CodeMemory user_rx; CodeMemory user_ro; @@ -257,10 +258,14 @@ private: class JITU final : public ServiceFramework { public: - explicit JITU(Core::System& system_) : ServiceFramework{system_, "jit:u"} {} + explicit JITU(Core::System& system_) : ServiceFramework{system_, "jit:u"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&JITU::CreateJitEnvironment>, "CreateJitEnvironment"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -289,10 +294,6 @@ private: } private: - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&JITU::CreateJitEnvironment>, "CreateJitEnvironment"} - ); - std::mt19937_64 generate_random{}; }; diff --git a/src/core/hle/service/jit/jit.h b/src/core/hle/service/jit/jit.h index 19014c75a4..a9ebf146ec 100644 --- a/src/core/hle/service/jit/jit.h +++ b/src/core/hle/service/jit/jit.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/jit/jit_context.h b/src/core/hle/service/jit/jit_context.h index f17fc5e244..aa9a2d3589 100644 --- a/src/core/hle/service/jit/jit_context.h +++ b/src/core/hle/service/jit/jit_context.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/lbl/lbl.cpp b/src/core/hle/service/lbl/lbl.cpp index 9b245201ff..68a9bff2df 100644 --- a/src/core/hle/service/lbl/lbl.cpp +++ b/src/core/hle/service/lbl/lbl.cpp @@ -18,10 +18,43 @@ namespace Service::LBL { class LBL final : public ServiceFramework { public: - explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} {} + explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &LBL::SaveCurrentSetting, "SaveCurrentSetting"}, + {1, &LBL::LoadCurrentSetting, "LoadCurrentSetting"}, + {2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"}, + {3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"}, + {4, nullptr, "ApplyCurrentBrightnessSettingToBacklight"}, + {5, nullptr, "GetBrightnessSettingAppliedToBacklight"}, + {6, &LBL::SwitchBacklightOn, "SwitchBacklightOn"}, + {7, &LBL::SwitchBacklightOff, "SwitchBacklightOff"}, + {8, &LBL::GetBacklightSwitchStatus, "GetBacklightSwitchStatus"}, + {9, &LBL::EnableDimming, "EnableDimming"}, + {10, &LBL::DisableDimming, "DisableDimming"}, + {11, &LBL::IsDimmingEnabled, "IsDimmingEnabled"}, + {12, &LBL::EnableAutoBrightnessControl, "EnableAutoBrightnessControl"}, + {13, &LBL::DisableAutoBrightnessControl, "DisableAutoBrightnessControl"}, + {14, &LBL::IsAutoBrightnessControlEnabled, "IsAutoBrightnessControlEnabled"}, + {15, &LBL::SetAmbientLightSensorValue, "SetAmbientLightSensorValue"}, + {16, &LBL::GetAmbientLightSensorValue, "GetAmbientLightSensorValue"}, + {17, &LBL::SetBrightnessReflectionDelayLevel, "SetBrightnessReflectionDelayLevel"}, + {18, &LBL::GetBrightnessReflectionDelayLevel, "GetBrightnessReflectionDelayLevel"}, + {19, &LBL::SetCurrentBrightnessMapping, "SetCurrentBrightnessMapping"}, + {20, &LBL::GetCurrentBrightnessMapping, "GetCurrentBrightnessMapping"}, + {21, &LBL::SetCurrentAmbientLightSensorMapping, "SetCurrentAmbientLightSensorMapping"}, + {22, &LBL::GetCurrentAmbientLightSensorMapping, "GetCurrentAmbientLightSensorMapping"}, + {23, &LBL::IsAmbientLightSensorAvailable, "IsAmbientLightSensorAvailable"}, + {24, &LBL::SetCurrentBrightnessSettingForVrMode, "SetCurrentBrightnessSettingForVrMode"}, + {25, &LBL::GetCurrentBrightnessSettingForVrMode, "GetCurrentBrightnessSettingForVrMode"}, + {26, &LBL::EnableVrMode, "EnableVrMode"}, + {27, &LBL::DisableVrMode, "DisableVrMode"}, + {28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"}, + {29, &LBL::IsAutoBrightnessControlSupported, "IsAutoBrightnessControlSupported"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -302,38 +335,6 @@ private: rb.Push(auto_brightness_supported); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &LBL::SaveCurrentSetting, "SaveCurrentSetting"}, - FunctionInfo{1, &LBL::LoadCurrentSetting, "LoadCurrentSetting"}, - FunctionInfo{2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"}, - FunctionInfo{3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"}, - FunctionInfo{4, nullptr, "ApplyCurrentBrightnessSettingToBacklight"}, - FunctionInfo{5, nullptr, "GetBrightnessSettingAppliedToBacklight"}, - FunctionInfo{6, &LBL::SwitchBacklightOn, "SwitchBacklightOn"}, - FunctionInfo{7, &LBL::SwitchBacklightOff, "SwitchBacklightOff"}, - FunctionInfo{8, &LBL::GetBacklightSwitchStatus, "GetBacklightSwitchStatus"}, - FunctionInfo{9, &LBL::EnableDimming, "EnableDimming"}, - FunctionInfo{10, &LBL::DisableDimming, "DisableDimming"}, - FunctionInfo{11, &LBL::IsDimmingEnabled, "IsDimmingEnabled"}, - FunctionInfo{12, &LBL::EnableAutoBrightnessControl, "EnableAutoBrightnessControl"}, - FunctionInfo{13, &LBL::DisableAutoBrightnessControl, "DisableAutoBrightnessControl"}, - FunctionInfo{14, &LBL::IsAutoBrightnessControlEnabled, "IsAutoBrightnessControlEnabled"}, - FunctionInfo{15, &LBL::SetAmbientLightSensorValue, "SetAmbientLightSensorValue"}, - FunctionInfo{16, &LBL::GetAmbientLightSensorValue, "GetAmbientLightSensorValue"}, - FunctionInfo{17, &LBL::SetBrightnessReflectionDelayLevel, "SetBrightnessReflectionDelayLevel"}, - FunctionInfo{18, &LBL::GetBrightnessReflectionDelayLevel, "GetBrightnessReflectionDelayLevel"}, - FunctionInfo{19, &LBL::SetCurrentBrightnessMapping, "SetCurrentBrightnessMapping"}, - FunctionInfo{20, &LBL::GetCurrentBrightnessMapping, "GetCurrentBrightnessMapping"}, - FunctionInfo{21, &LBL::SetCurrentAmbientLightSensorMapping, "SetCurrentAmbientLightSensorMapping"}, - FunctionInfo{22, &LBL::GetCurrentAmbientLightSensorMapping, "GetCurrentAmbientLightSensorMapping"}, - FunctionInfo{23, &LBL::IsAmbientLightSensorAvailable, "IsAmbientLightSensorAvailable"}, - FunctionInfo{24, &LBL::SetCurrentBrightnessSettingForVrMode, "SetCurrentBrightnessSettingForVrMode"}, - FunctionInfo{25, &LBL::GetCurrentBrightnessSettingForVrMode, "GetCurrentBrightnessSettingForVrMode"}, - FunctionInfo{26, &LBL::EnableVrMode, "EnableVrMode"}, - FunctionInfo{27, &LBL::DisableVrMode, "DisableVrMode"}, - FunctionInfo{28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"}, - FunctionInfo{29, &LBL::IsAutoBrightnessControlSupported, "IsAutoBrightnessControlSupported"} - ); bool vr_mode_enabled = false; float current_brightness = 1.0f; float ambient_light_value = 0.0f; diff --git a/src/core/hle/service/lbl/lbl.h b/src/core/hle/service/lbl/lbl.h index e47759c01c..e2cd1b3980 100644 --- a/src/core/hle/service/lbl/lbl.h +++ b/src/core/hle/service/lbl/lbl.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/ldn/lan_discovery.cpp b/src/core/hle/service/ldn/lan_discovery.cpp index f37dbe492f..90adcdcee4 100644 --- a/src/core/hle/service/ldn/lan_discovery.cpp +++ b/src/core/hle/service/ldn/lan_discovery.cpp @@ -1,5 +1,6 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/ldn/lan_discovery.h b/src/core/hle/service/ldn/lan_discovery.h index 5d0642bd0f..f1f3c4bece 100644 --- a/src/core/hle/service/ldn/lan_discovery.h +++ b/src/core/hle/service/ldn/lan_discovery.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp index 838fe85f79..1a0165fd2e 100644 --- a/src/core/hle/service/ldn/ldn.cpp +++ b/src/core/hle/service/ldn/ldn.cpp @@ -9,6 +9,7 @@ #include "core/hle/service/ldn/ldn.h" #include "core/hle/service/ldn/monitor_service.h" #include "core/hle/service/ldn/sf_monitor_service.h" +#include "core/hle/service/ldn/sf_service.h" #include "core/hle/service/ldn/sf_service_monitor.h" #include "core/hle/service/ldn/system_local_communication_service.h" #include "core/hle/service/ldn/user_local_communication_service.h" @@ -18,10 +19,14 @@ namespace Service::LDN { class IClientProcessMonitor final : public ServiceFramework { public: - explicit IClientProcessMonitor(Core::System& system_) : ServiceFramework{system_, "IClientProcessMonitor"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit IClientProcessMonitor(Core::System& system_) + : ServiceFramework{system_, "IClientProcessMonitor"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"}, + }; + // clang-format on + RegisterHandlers(functions); } ~IClientProcessMonitor() override = default; private: @@ -29,19 +34,19 @@ private: LOG_WARNING(Service_LDN, "(STUBBED) called"); R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IClientProcessMonitor::RegisterClient>, "RegisterClient"} - ); }; class IMonitorServiceCreator final : public ServiceFramework { public: - explicit IMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:m"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit IMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:m"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&IMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"} + }; + // clang-format on + RegisterHandlers(functions); } + private: Result CreateMonitorService(OutInterface out_interface) { LOG_DEBUG(Service_LDN, "called"); @@ -49,19 +54,21 @@ private: *out_interface = std::make_shared(system); R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"} - ); }; class ISystemServiceCreator final : public ServiceFramework { public: - explicit ISystemServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:s"} {} + explicit ISystemServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:s"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"}, + {1, C<&ISystemServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+ + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } + private: Result CreateSystemLocalCommunicationService( OutInterface out_interface) { @@ -78,20 +85,21 @@ private: *out_interface = std::make_shared(system); R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&ISystemServiceCreator::CreateSystemLocalCommunicationService>, "CreateSystemLocalCommunicationService"}, - FunctionInfo{1, C<&ISystemServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor", MakeVersionGate({18,0,0})} - ); }; class IUserServiceCreator final : public ServiceFramework { public: - explicit IUserServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:u"} {} + explicit IUserServiceCreator(Core::System& system_) : ServiceFramework{system_, "ldn:u"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"}, + {1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor"} // 18.0.0+ + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } + private: Result CreateUserLocalCommunicationService( OutInterface out_interface) { @@ -108,50 +116,22 @@ private: *out_interface = std::make_shared(system); R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IUserServiceCreator::CreateUserLocalCommunicationService>, "CreateUserLocalCommunicationService"}, - FunctionInfo{1, D<&IUserServiceCreator::CreateClientProcessMonitor>, "CreateClientProcessMonitor", MakeVersionGate({18,0,0})} - ); -}; - -class ISfService final : public ServiceFramework { -public: - explicit ISfService(Core::System& system_) : ServiceFramework{system_, "ISfService"} {} - ~ISfService() override = default; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Initialize"}, - FunctionInfo{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"}, - FunctionInfo{264, nullptr, "GetNetworkInterfaceLastError"}, - FunctionInfo{272, nullptr, "GetRole"}, - FunctionInfo{280, nullptr, "GetAdvertiseData"}, - FunctionInfo{288, nullptr, "GetGroupInfo"}, - FunctionInfo{296, nullptr, "GetGroupInfo2"}, - FunctionInfo{304, nullptr, "GetGroupOwner"}, - FunctionInfo{312, nullptr, "GetIpConfig"}, - FunctionInfo{320, nullptr, "GetLinkLevel"}, - FunctionInfo{512, nullptr, "Scan"}, - FunctionInfo{768, nullptr, "CreateGroup"}, - FunctionInfo{776, nullptr, "DestroyGroup"}, - FunctionInfo{784, nullptr, "SetAdvertiseData"}, - FunctionInfo{1536, nullptr, "SendToOtherGroup"}, - FunctionInfo{1544, nullptr, "RecvFromOtherGroup"}, - FunctionInfo{1552, nullptr, "AddAcceptableGroupId"}, - FunctionInfo{1560, nullptr, "ClearAcceptableGroupId"} - ); }; class ISfServiceCreator final : public ServiceFramework { public: - explicit ISfServiceCreator(Core::System& system_, bool is_system_, const char* name_) : ServiceFramework{system_, name_}, is_system{is_system_} {} + explicit ISfServiceCreator(Core::System& system_, bool is_system_, const char* name_) + : ServiceFramework{system_, name_}, is_system{is_system_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&ISfServiceCreator::CreateNetworkService>, "CreateNetworkService"}, + {8, C<&ISfServiceCreator::CreateNetworkServiceMonitor>, "CreateNetworkServiceMonitor"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } + private: Result CreateNetworkService(OutInterface out_interface, u32 input, u64 reserved_input) { @@ -170,20 +150,21 @@ private: R_SUCCEED(); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&ISfServiceCreator::CreateNetworkService>, "CreateNetworkService"}, - FunctionInfo{8, C<&ISfServiceCreator::CreateNetworkServiceMonitor>, "CreateNetworkServiceMonitor"} - ); bool is_system{}; }; class ISfMonitorServiceCreator final : public ServiceFramework { public: - explicit ISfMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "lp2p:m"} {} + explicit ISfMonitorServiceCreator(Core::System& system_) : ServiceFramework{system_, "lp2p:m"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&ISfMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } + private: Result CreateMonitorService(OutInterface out_interface, u64 reserved_input) { LOG_INFO(Service_LDN, "called, reserved_input={}", reserved_input); @@ -191,10 +172,6 @@ private: *out_interface = std::make_shared(system); R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&ISfMonitorServiceCreator::CreateMonitorService>, "CreateMonitorService"} - ); }; void LoopProcess(Core::System& system) { @@ -204,9 +181,12 @@ void LoopProcess(Core::System& system) { server_manager->RegisterNamedService("ldn:s", std::make_shared(system)); server_manager->RegisterNamedService("ldn:u", std::make_shared(system)); - server_manager->RegisterNamedService("lp2p:app", std::make_shared(system, false, "lp2p:app")); - server_manager->RegisterNamedService("lp2p:sys", std::make_shared(system, true, "lp2p:sys")); - server_manager->RegisterNamedService("lp2p:m", std::make_shared(system)); + server_manager->RegisterNamedService( + "lp2p:app", std::make_shared(system, false, "lp2p:app")); + server_manager->RegisterNamedService( + "lp2p:sys", std::make_shared(system, true, "lp2p:sys")); + server_manager->RegisterNamedService("lp2p:m", + std::make_shared(system)); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/ldn/ldn.h b/src/core/hle/service/ldn/ldn.h index dae037fa8f..76c7f4f439 100644 --- a/src/core/hle/service/ldn/ldn.h +++ b/src/core/hle/service/ldn/ldn.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/ldn/ldn_results.h b/src/core/hle/service/ldn/ldn_results.h index f340bda422..cf6c22b54b 100644 --- a/src/core/hle/service/ldn/ldn_results.h +++ b/src/core/hle/service/ldn/ldn_results.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/ldn/monitor_service.cpp b/src/core/hle/service/ldn/monitor_service.cpp index 6a60b0b3d8..6cb7180b15 100644 --- a/src/core/hle/service/ldn/monitor_service.cpp +++ b/src/core/hle/service/ldn/monitor_service.cpp @@ -10,22 +10,22 @@ namespace Service::LDN { -std::optional IMonitorService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IMonitorService::GetStateForMonitor>, "GetStateForMonitor"}, - FunctionInfo{1, nullptr, "GetNetworkInfoForMonitor"}, - FunctionInfo{2, nullptr, "GetIpv4AddressForMonitor"}, - FunctionInfo{3, nullptr, "GetDisconnectReasonForMonitor"}, - FunctionInfo{4, nullptr, "GetSecurityParameterForMonitor"}, - FunctionInfo{5, nullptr, "GetNetworkConfigForMonitor"}, - FunctionInfo{100, C<&IMonitorService::InitializeMonitor>, "InitializeMonitor"}, - FunctionInfo{101, C<&IMonitorService::FinalizeMonitor>, "FinalizeMonitor"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IMonitorService::IMonitorService(Core::System& system_) : ServiceFramework{system_, "IMonitorService"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&IMonitorService::GetStateForMonitor>, "GetStateForMonitor"}, + {1, nullptr, "GetNetworkInfoForMonitor"}, + {2, nullptr, "GetIpv4AddressForMonitor"}, + {3, nullptr, "GetDisconnectReasonForMonitor"}, + {4, nullptr, "GetSecurityParameterForMonitor"}, + {5, nullptr, "GetNetworkConfigForMonitor"}, + {100, C<&IMonitorService::InitializeMonitor>, "InitializeMonitor"}, + {101, C<&IMonitorService::FinalizeMonitor>, "FinalizeMonitor"}, + }; + // clang-format on + + RegisterHandlers(functions); } IMonitorService::~IMonitorService() = default; diff --git a/src/core/hle/service/ldn/monitor_service.h b/src/core/hle/service/ldn/monitor_service.h index 9c1acd0a1e..2d4a69c311 100644 --- a/src/core/hle/service/ldn/monitor_service.h +++ b/src/core/hle/service/ldn/monitor_service.h @@ -26,7 +26,6 @@ private: Result InitializeMonitor(); Result FinalizeMonitor(); - std::optional FindRequest(u32 key) override; State state{State::None}; }; diff --git a/src/core/hle/service/ldn/sf_monitor_service.cpp b/src/core/hle/service/ldn/sf_monitor_service.cpp index ebe06b2059..5ac663b4c2 100644 --- a/src/core/hle/service/ldn/sf_monitor_service.cpp +++ b/src/core/hle/service/ldn/sf_monitor_service.cpp @@ -10,17 +10,17 @@ namespace Service::LDN { -std::optional ISfMonitorService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&ISfMonitorService::Initialize>, "Initialize"}, - FunctionInfo{288, C<&ISfMonitorService::GetGroupInfo>, "GetGroupInfo"}, - FunctionInfo{320, nullptr, "GetLinkLevel"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - ISfMonitorService::ISfMonitorService(Core::System& system_) : ServiceFramework{system_, "ISfMonitorService"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&ISfMonitorService::Initialize>, "Initialize"}, + {288, C<&ISfMonitorService::GetGroupInfo>, "GetGroupInfo"}, + {320, nullptr, "GetLinkLevel"}, + }; + // clang-format on + + RegisterHandlers(functions); } ISfMonitorService::~ISfMonitorService() = default; diff --git a/src/core/hle/service/ldn/sf_monitor_service.h b/src/core/hle/service/ldn/sf_monitor_service.h index 09ca16727d..a596093f1b 100644 --- a/src/core/hle/service/ldn/sf_monitor_service.h +++ b/src/core/hle/service/ldn/sf_monitor_service.h @@ -24,7 +24,6 @@ public: private: Result Initialize(Out out_value); Result GetGroupInfo(OutLargeData out_group_info); - std::optional FindRequest(u32 key) override; }; } // namespace Service::LDN diff --git a/src/core/hle/service/ldn/sf_service.cpp b/src/core/hle/service/ldn/sf_service.cpp new file mode 100644 index 0000000000..b77672a1b6 --- /dev/null +++ b/src/core/hle/service/ldn/sf_service.cpp @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "core/hle/service/ldn/sf_service.h" + +namespace Service::LDN { + +ISfService::ISfService(Core::System& system_) : ServiceFramework{system_, "ISfService"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Initialize"}, + {256, nullptr, "AttachNetworkInterfaceStateChangeEvent"}, + {264, nullptr, "GetNetworkInterfaceLastError"}, + {272, nullptr, "GetRole"}, + {280, nullptr, "GetAdvertiseData"}, + {288, nullptr, "GetGroupInfo"}, + {296, nullptr, "GetGroupInfo2"}, + {304, nullptr, "GetGroupOwner"}, + {312, nullptr, "GetIpConfig"}, + {320, nullptr, "GetLinkLevel"}, + {512, nullptr, "Scan"}, + {768, nullptr, "CreateGroup"}, + {776, nullptr, "DestroyGroup"}, + {784, nullptr, "SetAdvertiseData"}, + {1536, nullptr, "SendToOtherGroup"}, + {1544, nullptr, "RecvFromOtherGroup"}, + {1552, nullptr, "AddAcceptableGroupId"}, + {1560, nullptr, "ClearAcceptableGroupId"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +ISfService::~ISfService() = default; + +} // namespace Service::LDN diff --git a/src/core/hle/service/ldn/sf_service.h b/src/core/hle/service/ldn/sf_service.h new file mode 100644 index 0000000000..ca7a81cf29 --- /dev/null +++ b/src/core/hle/service/ldn/sf_service.h @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Core { +class System; +} + +namespace Service::LDN { + +class ISfService final : public ServiceFramework { +public: + explicit ISfService(Core::System& system_); + ~ISfService() override; +}; + +} // namespace Service::LDN diff --git a/src/core/hle/service/ldn/sf_service_monitor.cpp b/src/core/hle/service/ldn/sf_service_monitor.cpp index 574ba82a0b..95a9bcaf71 100644 --- a/src/core/hle/service/ldn/sf_service_monitor.cpp +++ b/src/core/hle/service/ldn/sf_service_monitor.cpp @@ -10,27 +10,27 @@ namespace Service::LDN { -std::optional ISfServiceMonitor::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&ISfServiceMonitor::Initialize>, "Initialize"}, - FunctionInfo{256, nullptr, "AttachNetworkInterfaceStateChangeEvent"}, - FunctionInfo{264, nullptr, "GetNetworkInterfaceLastError"}, - FunctionInfo{272, nullptr, "GetRole"}, - FunctionInfo{280, nullptr, "GetAdvertiseData"}, - FunctionInfo{281, nullptr, "GetAdvertiseData2"}, - FunctionInfo{288, C<&ISfServiceMonitor::GetGroupInfo>, "GetGroupInfo"}, - FunctionInfo{296, nullptr, "GetGroupInfo2"}, - FunctionInfo{304, nullptr, "GetGroupOwner"}, - FunctionInfo{312, nullptr, "GetIpConfig"}, - FunctionInfo{320, nullptr, "GetLinkLevel"}, - FunctionInfo{328, nullptr, "AttachJoinEvent"}, - FunctionInfo{336, nullptr, "GetMembers"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - ISfServiceMonitor::ISfServiceMonitor(Core::System& system_) : ServiceFramework{system_, "ISfServiceMonitor"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&ISfServiceMonitor::Initialize>, "Initialize"}, + {256, nullptr, "AttachNetworkInterfaceStateChangeEvent"}, + {264, nullptr, "GetNetworkInterfaceLastError"}, + {272, nullptr, "GetRole"}, + {280, nullptr, "GetAdvertiseData"}, + {281, nullptr, "GetAdvertiseData2"}, + {288, C<&ISfServiceMonitor::GetGroupInfo>, "GetGroupInfo"}, + {296, nullptr, "GetGroupInfo2"}, + {304, nullptr, "GetGroupOwner"}, + {312, nullptr, "GetIpConfig"}, + {320, nullptr, "GetLinkLevel"}, + {328, nullptr, "AttachJoinEvent"}, + {336, nullptr, "GetMembers"}, + }; + // clang-format on + + RegisterHandlers(functions); } ISfServiceMonitor::~ISfServiceMonitor() = default; diff --git a/src/core/hle/service/ldn/sf_service_monitor.h b/src/core/hle/service/ldn/sf_service_monitor.h index 5e5e64ae6c..87854b868d 100644 --- a/src/core/hle/service/ldn/sf_service_monitor.h +++ b/src/core/hle/service/ldn/sf_service_monitor.h @@ -23,8 +23,8 @@ public: private: Result Initialize(Out out_value); - Result GetGroupInfo(OutLargeData out_group_info, GroupInfo in_group_info); - std::optional FindRequest(u32 key) override; + Result GetGroupInfo(OutLargeData out_group_info, + GroupInfo in_group_info); }; } // namespace Service::LDN diff --git a/src/core/hle/service/ldn/system_local_communication_service.cpp b/src/core/hle/service/ldn/system_local_communication_service.cpp index 9d3d49aac4..57a1c6a6c2 100644 --- a/src/core/hle/service/ldn/system_local_communication_service.cpp +++ b/src/core/hle/service/ldn/system_local_communication_service.cpp @@ -9,44 +9,44 @@ namespace Service::LDN { -std::optional ISystemLocalCommunicationService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetState"}, - FunctionInfo{1, nullptr, "GetNetworkInfo"}, - FunctionInfo{2, nullptr, "GetIpv4Address"}, - FunctionInfo{3, nullptr, "GetDisconnectReason"}, - FunctionInfo{4, nullptr, "GetSecurityParameter"}, - FunctionInfo{5, nullptr, "GetNetworkConfig"}, - FunctionInfo{100, nullptr, "AttachStateChangeEvent"}, - FunctionInfo{101, nullptr, "GetNetworkInfoLatestUpdate"}, - FunctionInfo{102, nullptr, "Scan"}, - FunctionInfo{103, nullptr, "ScanPrivate"}, - FunctionInfo{104, nullptr, "SetWirelessControllerRestriction"}, - FunctionInfo{200, nullptr, "OpenAccessPoint"}, - FunctionInfo{201, nullptr, "CloseAccessPoint"}, - FunctionInfo{202, nullptr, "CreateNetwork"}, - FunctionInfo{203, nullptr, "CreateNetworkPrivate"}, - FunctionInfo{204, nullptr, "DestroyNetwork"}, - FunctionInfo{205, nullptr, "Reject"}, - FunctionInfo{206, nullptr, "SetAdvertiseData"}, - FunctionInfo{207, nullptr, "SetStationAcceptPolicy"}, - FunctionInfo{208, nullptr, "AddAcceptFilterEntry"}, - FunctionInfo{209, nullptr, "ClearAcceptFilter"}, - FunctionInfo{300, nullptr, "OpenStation"}, - FunctionInfo{301, nullptr, "CloseStation"}, - FunctionInfo{302, nullptr, "Connect"}, - FunctionInfo{303, nullptr, "ConnectPrivate"}, - FunctionInfo{304, nullptr, "Disconnect"}, - FunctionInfo{400, nullptr, "InitializeSystem"}, - FunctionInfo{401, nullptr, "FinalizeSystem"}, - FunctionInfo{402, nullptr, "SetOperationMode"}, - FunctionInfo{403, C<&ISystemLocalCommunicationService::InitializeSystem2>, "InitializeSystem2"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - ISystemLocalCommunicationService::ISystemLocalCommunicationService(Core::System& system_) : ServiceFramework{system_, "ISystemLocalCommunicationService"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetState"}, + {1, nullptr, "GetNetworkInfo"}, + {2, nullptr, "GetIpv4Address"}, + {3, nullptr, "GetDisconnectReason"}, + {4, nullptr, "GetSecurityParameter"}, + {5, nullptr, "GetNetworkConfig"}, + {100, nullptr, "AttachStateChangeEvent"}, + {101, nullptr, "GetNetworkInfoLatestUpdate"}, + {102, nullptr, "Scan"}, + {103, nullptr, "ScanPrivate"}, + {104, nullptr, "SetWirelessControllerRestriction"}, + {200, nullptr, "OpenAccessPoint"}, + {201, nullptr, "CloseAccessPoint"}, + {202, nullptr, "CreateNetwork"}, + {203, nullptr, "CreateNetworkPrivate"}, + {204, nullptr, "DestroyNetwork"}, + {205, nullptr, "Reject"}, + {206, nullptr, "SetAdvertiseData"}, + {207, nullptr, "SetStationAcceptPolicy"}, + {208, nullptr, "AddAcceptFilterEntry"}, + {209, nullptr, "ClearAcceptFilter"}, + {300, nullptr, "OpenStation"}, + {301, nullptr, "CloseStation"}, + {302, nullptr, "Connect"}, + {303, nullptr, "ConnectPrivate"}, + {304, nullptr, "Disconnect"}, + {400, nullptr, "InitializeSystem"}, + {401, nullptr, "FinalizeSystem"}, + {402, nullptr, "SetOperationMode"}, + {403, C<&ISystemLocalCommunicationService::InitializeSystem2>, "InitializeSystem2"}, + }; + // clang-format on + + RegisterHandlers(functions); } ISystemLocalCommunicationService::~ISystemLocalCommunicationService() = default; diff --git a/src/core/hle/service/ldn/system_local_communication_service.h b/src/core/hle/service/ldn/system_local_communication_service.h index c7e937e3a2..fa0e45bde4 100644 --- a/src/core/hle/service/ldn/system_local_communication_service.h +++ b/src/core/hle/service/ldn/system_local_communication_service.h @@ -23,7 +23,6 @@ public: private: Result InitializeSystem2(); - std::optional FindRequest(u32 key) override; }; } // namespace Service::LDN diff --git a/src/core/hle/service/ldn/user_local_communication_service.cpp b/src/core/hle/service/ldn/user_local_communication_service.cpp index 26a742bf0b..7011bd52f2 100644 --- a/src/core/hle/service/ldn/user_local_communication_service.cpp +++ b/src/core/hle/service/ldn/user_local_communication_service.cpp @@ -1,5 +1,6 @@ // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -21,46 +22,46 @@ namespace Service::LDN { -std::optional IUserLocalCommunicationService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IUserLocalCommunicationService::GetState>, "GetState"}, - FunctionInfo{1, D<&IUserLocalCommunicationService::GetNetworkInfo>, "GetNetworkInfo"}, - FunctionInfo{2, D<&IUserLocalCommunicationService::GetIpv4Address>, "GetIpv4Address"}, - FunctionInfo{3, D<&IUserLocalCommunicationService::GetDisconnectReason>, "GetDisconnectReason"}, - FunctionInfo{4, D<&IUserLocalCommunicationService::GetSecurityParameter>, "GetSecurityParameter"}, - FunctionInfo{5, D<&IUserLocalCommunicationService::GetNetworkConfig>, "GetNetworkConfig"}, - FunctionInfo{100, D<&IUserLocalCommunicationService::AttachStateChangeEvent>, "AttachStateChangeEvent"}, - FunctionInfo{101, D<&IUserLocalCommunicationService::GetNetworkInfoLatestUpdate>, "GetNetworkInfoLatestUpdate"}, - FunctionInfo{102, D<&IUserLocalCommunicationService::Scan>, "Scan"}, - FunctionInfo{103, D<&IUserLocalCommunicationService::ScanPrivate>, "ScanPrivate"}, - FunctionInfo{104, D<&IUserLocalCommunicationService::SetWirelessControllerRestriction>, "SetWirelessControllerRestriction"}, - FunctionInfo{106, D<&IUserLocalCommunicationService::SetProtocol>, "SetProtocol" }, - FunctionInfo{200, D<&IUserLocalCommunicationService::OpenAccessPoint>, "OpenAccessPoint"}, - FunctionInfo{201, D<&IUserLocalCommunicationService::CloseAccessPoint>, "CloseAccessPoint"}, - FunctionInfo{202, D<&IUserLocalCommunicationService::CreateNetwork>, "CreateNetwork"}, - FunctionInfo{203, D<&IUserLocalCommunicationService::CreateNetworkPrivate>, "CreateNetworkPrivate"}, - FunctionInfo{204, D<&IUserLocalCommunicationService::DestroyNetwork>, "DestroyNetwork"}, - FunctionInfo{205, nullptr, "Reject"}, - FunctionInfo{206, D<&IUserLocalCommunicationService::SetAdvertiseData>, "SetAdvertiseData"}, - FunctionInfo{207, D<&IUserLocalCommunicationService::SetStationAcceptPolicy>, "SetStationAcceptPolicy"}, - FunctionInfo{208, D<&IUserLocalCommunicationService::AddAcceptFilterEntry>, "AddAcceptFilterEntry"}, - FunctionInfo{209, nullptr, "ClearAcceptFilter"}, - FunctionInfo{300, D<&IUserLocalCommunicationService::OpenStation>, "OpenStation"}, - FunctionInfo{301, D<&IUserLocalCommunicationService::CloseStation>, "CloseStation"}, - FunctionInfo{302, D<&IUserLocalCommunicationService::Connect>, "Connect"}, - FunctionInfo{303, nullptr, "ConnectPrivate"}, - FunctionInfo{304, D<&IUserLocalCommunicationService::Disconnect>, "Disconnect"}, - FunctionInfo{400, D<&IUserLocalCommunicationService::Initialize>, "Initialize"}, - FunctionInfo{401, D<&IUserLocalCommunicationService::Finalize>, "Finalize"}, - FunctionInfo{402, D<&IUserLocalCommunicationService::Initialize2>, "Initialize2"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IUserLocalCommunicationService::IUserLocalCommunicationService(Core::System& system_) : ServiceFramework{system_, "IUserLocalCommunicationService"}, service_context{system, "IUserLocalCommunicationService"}, lan_discovery{} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IUserLocalCommunicationService::GetState>, "GetState"}, + {1, D<&IUserLocalCommunicationService::GetNetworkInfo>, "GetNetworkInfo"}, + {2, D<&IUserLocalCommunicationService::GetIpv4Address>, "GetIpv4Address"}, + {3, D<&IUserLocalCommunicationService::GetDisconnectReason>, "GetDisconnectReason"}, + {4, D<&IUserLocalCommunicationService::GetSecurityParameter>, "GetSecurityParameter"}, + {5, D<&IUserLocalCommunicationService::GetNetworkConfig>, "GetNetworkConfig"}, + {100, D<&IUserLocalCommunicationService::AttachStateChangeEvent>, "AttachStateChangeEvent"}, + {101, D<&IUserLocalCommunicationService::GetNetworkInfoLatestUpdate>, "GetNetworkInfoLatestUpdate"}, + {102, D<&IUserLocalCommunicationService::Scan>, "Scan"}, + {103, D<&IUserLocalCommunicationService::ScanPrivate>, "ScanPrivate"}, + {104, D<&IUserLocalCommunicationService::SetWirelessControllerRestriction>, "SetWirelessControllerRestriction"}, + { 106, D<&IUserLocalCommunicationService::SetProtocol>, "SetProtocol" }, + {200, D<&IUserLocalCommunicationService::OpenAccessPoint>, "OpenAccessPoint"}, + {201, D<&IUserLocalCommunicationService::CloseAccessPoint>, "CloseAccessPoint"}, + {202, D<&IUserLocalCommunicationService::CreateNetwork>, "CreateNetwork"}, + {203, D<&IUserLocalCommunicationService::CreateNetworkPrivate>, "CreateNetworkPrivate"}, + {204, D<&IUserLocalCommunicationService::DestroyNetwork>, "DestroyNetwork"}, + {205, nullptr, "Reject"}, + {206, D<&IUserLocalCommunicationService::SetAdvertiseData>, "SetAdvertiseData"}, + {207, D<&IUserLocalCommunicationService::SetStationAcceptPolicy>, "SetStationAcceptPolicy"}, + {208, D<&IUserLocalCommunicationService::AddAcceptFilterEntry>, "AddAcceptFilterEntry"}, + {209, nullptr, "ClearAcceptFilter"}, + {300, D<&IUserLocalCommunicationService::OpenStation>, "OpenStation"}, + {301, D<&IUserLocalCommunicationService::CloseStation>, "CloseStation"}, + {302, D<&IUserLocalCommunicationService::Connect>, "Connect"}, + {303, nullptr, "ConnectPrivate"}, + {304, D<&IUserLocalCommunicationService::Disconnect>, "Disconnect"}, + {400, D<&IUserLocalCommunicationService::Initialize>, "Initialize"}, + {401, D<&IUserLocalCommunicationService::Finalize>, "Finalize"}, + {402, D<&IUserLocalCommunicationService::Initialize2>, "Initialize2"}, + }; + // clang-format on + + RegisterHandlers(functions); state_change_event = service_context.CreateEvent("IUserLocalCommunicationService:StateChangeEvent"); diff --git a/src/core/hle/service/ldn/user_local_communication_service.h b/src/core/hle/service/ldn/user_local_communication_service.h index 6f832b7a23..720d5e9bf4 100644 --- a/src/core/hle/service/ldn/user_local_communication_service.h +++ b/src/core/hle/service/ldn/user_local_communication_service.h @@ -1,7 +1,7 @@ -// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once @@ -89,7 +89,6 @@ private: /// Callback to parse and handle a received LDN packet. void OnLDNPacketReceived(const Network::LDNPacket& packet); void OnEventFired(); - std::optional FindRequest(u32 key) override; KernelHelpers::ServiceContext service_context; Kernel::KEvent* state_change_event; diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp index 25ecc58fa4..db4d51b49d 100644 --- a/src/core/hle/service/ldr/ldr.cpp +++ b/src/core/hle/service/ldr/ldr.cpp @@ -12,44 +12,47 @@ namespace Service::LDR { class DebugMonitor final : public ServiceFramework { public: - explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "ldr:dmnt"} {} + explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "ldr:dmnt"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "SetProgramArgument"}, + {1, nullptr, "FlushArguments"}, + {2, nullptr, "GetProcessModuleInfo"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SetProgramArgument"}, - FunctionInfo{1, nullptr, "FlushArguments"}, - FunctionInfo{2, nullptr, "GetProcessModuleInfo"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class ProcessManager final : public ServiceFramework { public: - explicit ProcessManager(Core::System& system_) : ServiceFramework{system_, "ldr:pm"} {} + explicit ProcessManager(Core::System& system_) : ServiceFramework{system_, "ldr:pm"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "CreateProcess"}, + {1, nullptr, "GetProgramInfo"}, + {2, nullptr, "PinProgram"}, + {3, nullptr, "UnpinProgram"}, + {4, nullptr, "SetEnabledProgramVerification"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateProcess"}, - FunctionInfo{1, nullptr, "GetProgramInfo"}, - FunctionInfo{2, nullptr, "PinProgram"}, - FunctionInfo{3, nullptr, "UnpinProgram"}, - FunctionInfo{4, nullptr, "SetEnabledProgramVerification"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class Shell final : public ServiceFramework { public: - explicit Shell(Core::System& system_) : ServiceFramework{system_, "ldr:shel"} {} + explicit Shell(Core::System& system_) : ServiceFramework{system_, "ldr:shel"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "SetProgramArgument"}, + {1, nullptr, "FlushArguments"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SetProgramArgument"}, - FunctionInfo{1, nullptr, "FlushArguments"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/ldr/ldr.h b/src/core/hle/service/ldr/ldr.h index c9281dbfb2..12a6b1f507 100644 --- a/src/core/hle/service/ldr/ldr.h +++ b/src/core/hle/service/ldr/ldr.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp index be8cdf9aa9..d631a6dd80 100644 --- a/src/core/hle/service/lm/lm.cpp +++ b/src/core/hle/service/lm/lm.cpp @@ -87,7 +87,16 @@ DECLARE_ENUM_FLAG_OPERATORS(LogPacketFlags); class ILogger final : public ServiceFramework { public: - explicit ILogger(Core::System& system_) : ServiceFramework{system_, "ILogger"} {} + explicit ILogger(Core::System& system_) : ServiceFramework{system_, "ILogger"} { + static const FunctionInfo functions[] = { + {0, &ILogger::Log, "Log"}, + {1, &ILogger::SetDestination, "SetDestination"}, + {2, nullptr, "TransmitHashedLog"}, //20.0.0+ + {3, nullptr, "DevNotify"}, //20.0.0+ + }; + RegisterHandlers(functions); + } + private: void Log(HLERequestContext& ctx) { std::size_t offset{}; @@ -322,25 +331,20 @@ private: }; static_assert(sizeof(LogPacketHeader) == 0x18, "LogPacketHeader is an invalid size"); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &ILogger::Log, "Log"}, - FunctionInfo{1, &ILogger::SetDestination, "SetDestination"}, - FunctionInfo{2, nullptr, "TransmitHashedLog", MakeVersionGate({20,0,0})}, - FunctionInfo{3, nullptr, "DevNotify", MakeVersionGate({20,0,0})} - ); ::Common::unordered_map> entries{}; LogDestination destination{LogDestination::All}; }; class LM final : public ServiceFramework { public: - explicit LM(Core::System& system_) : ServiceFramework{system_, "lm"} {} + explicit LM(Core::System& system_) : ServiceFramework{system_, "lm"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &LM::OpenLogger, "OpenLogger"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -351,26 +355,21 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &LM::OpenLogger, "OpenLogger"} - ); }; class LM_GET final : public ServiceFramework { public: - explicit LM_GET(Core::System& system_) : ServiceFramework{system_, "lm:get"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit LM_GET(Core::System& system_) + : ServiceFramework{system_, "lm:get"} + { + static const FunctionInfo functions[] = { + {0, nullptr, "StartLogging"}, + {1, nullptr, "StopLogging"}, + {2, nullptr, "GetLog"}, + {100, nullptr, "CreateDevNotificationReceiver"}, + }; + RegisterHandlers(functions); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "StartLogging"}, - FunctionInfo{1, nullptr, "StopLogging"}, - FunctionInfo{2, nullptr, "GetLog"}, - FunctionInfo{100, nullptr, "CreateDevNotificationReceiver"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/lm/lm.h b/src/core/hle/service/lm/lm.h index 0d7c39cbc3..890344f44a 100644 --- a/src/core/hle/service/lm/lm.h +++ b/src/core/hle/service/lm/lm.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/mig/mig.cpp b/src/core/hle/service/mig/mig.cpp index 2560050622..7412674417 100644 --- a/src/core/hle/service/mig/mig.cpp +++ b/src/core/hle/service/mig/mig.cpp @@ -14,50 +14,50 @@ namespace Service::Migration { class MIG_USR final : public ServiceFramework { public: - explicit MIG_USR(Core::System& system_) : ServiceFramework{system_, "mig:usr"} {} + explicit MIG_USR(Core::System& system_) : ServiceFramework{system_, "mig:usr"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Unknown0"}, //19.0.0+ + {1, nullptr, "Unknown1"}, //20.0.0+ + {2, nullptr, "Unknown2"}, //20.0.0+ + {10, nullptr, "TryGetLastMigrationInfo"}, + {11, nullptr, "Unknown11"}, //20.0.0+ + {100, nullptr, "CreateUserMigrationServer"}, //7.0.0+ + {101, nullptr, "ResumeUserMigrationServer"}, //7.0.0+ + {200, nullptr, "CreateUserMigrationClient"}, //7.0.0+ + {201, nullptr, "ResumeUserMigrationClient"}, //7.0.0+ + {1001, nullptr, "GetSaveDataMigrationPolicyInfoAsync"}, //8.0.0-20.5.0 + {1010, nullptr, "TryGetLastSaveDataMigrationInfo"}, //7.0.0+ + {1100, nullptr, "CreateSaveDataMigrationServer"}, //7.0.0-19.0.1 + {1101, nullptr, "ResumeSaveDataMigrationServer"}, //7.0.0+ + {1110, nullptr, "Unknown1101"}, //17.0.0+ + {1200, nullptr, "CreateSaveDataMigrationClient"}, //7.0.0+ + {1201, nullptr, "ResumeSaveDataMigrationClient"}, //7.0.0+ + {2001, nullptr, "Unknown2001"}, //20.0.0+ + {2010, nullptr, "Unknown2010"}, //20.0.0+ + {2100, nullptr, "Unknown2100"}, //20.0.0+ + {2110, nullptr, "Unknown2110"}, //20.0.0+ + {2200, nullptr, "Unknown2200"}, //20.0.0+ + {2210, nullptr, "Unknown2210"}, //20.0.0+ + {2220, nullptr, "Unknown2220"}, //20.0.0+ + {2230, nullptr, "Unknown2230"}, //20.0.0+ + {2231, nullptr, "Unknown2231"}, //20.0.0+ + {2232, nullptr, "Unknown2232"}, //20.0.0+ + {2233, nullptr, "Unknown2233"}, //20.0.0+ + {2234, nullptr, "Unknown2234"}, //20.0.0+ + {2250, nullptr, "Unknown2250"}, //20.0.0+ + {2260, nullptr, "Unknown2260"}, //20.0.0+ + {2270, nullptr, "Unknown2270"}, //20.0.0+ + {2280, nullptr, "Unknown2280"}, //20.0.0+ + {2300, nullptr, "Unknown2300"}, //20.0.0+ + {2310, nullptr, "Unknown2310"}, //20.0.0+ + {2400, nullptr, "Unknown2400"}, //20.0.0+ + {2420, nullptr, "Unknown2420"}, //20.0.0+ + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Unknown0", MakeVersionGate({19,0,0})}, - FunctionInfo{1, nullptr, "Unknown1", MakeVersionGate({20,0,0})}, - FunctionInfo{2, nullptr, "Unknown2", MakeVersionGate({20,0,0})}, - FunctionInfo{10, nullptr, "TryGetLastMigrationInfo"}, - FunctionInfo{11, nullptr, "Unknown11", MakeVersionGate({20,0,0})}, - FunctionInfo{100, nullptr, "CreateUserMigrationServer", MakeVersionGate({7,0,0})}, - FunctionInfo{101, nullptr, "ResumeUserMigrationServer", MakeVersionGate({7,0,0})}, - FunctionInfo{200, nullptr, "CreateUserMigrationClient", MakeVersionGate({7,0,0})}, - FunctionInfo{201, nullptr, "ResumeUserMigrationClient", MakeVersionGate({7,0,0})}, - FunctionInfo{1001, nullptr, "GetSaveDataMigrationPolicyInfoAsync", MakeVersionGate({8,0,0}, {20,5,0})}, - FunctionInfo{1010, nullptr, "TryGetLastSaveDataMigrationInfo", MakeVersionGate({7,0,0})}, - FunctionInfo{1100, nullptr, "CreateSaveDataMigrationServer", MakeVersionGate({7,0,0}, {19,0,1})}, - FunctionInfo{1101, nullptr, "ResumeSaveDataMigrationServer", MakeVersionGate({7,0,0})}, - FunctionInfo{1110, nullptr, "Unknown1101", MakeVersionGate({17,0,0})}, - FunctionInfo{1200, nullptr, "CreateSaveDataMigrationClient", MakeVersionGate({7,0,0})}, - FunctionInfo{1201, nullptr, "ResumeSaveDataMigrationClient", MakeVersionGate({7,0,0})}, - FunctionInfo{2001, nullptr, "Unknown2001", MakeVersionGate({20,0,0})}, - FunctionInfo{2010, nullptr, "Unknown2010", MakeVersionGate({20,0,0})}, - FunctionInfo{2100, nullptr, "Unknown2100", MakeVersionGate({20,0,0})}, - FunctionInfo{2110, nullptr, "Unknown2110", MakeVersionGate({20,0,0})}, - FunctionInfo{2200, nullptr, "Unknown2200", MakeVersionGate({20,0,0})}, - FunctionInfo{2210, nullptr, "Unknown2210", MakeVersionGate({20,0,0})}, - FunctionInfo{2220, nullptr, "Unknown2220", MakeVersionGate({20,0,0})}, - FunctionInfo{2230, nullptr, "Unknown2230", MakeVersionGate({20,0,0})}, - FunctionInfo{2231, nullptr, "Unknown2231", MakeVersionGate({20,0,0})}, - FunctionInfo{2232, nullptr, "Unknown2232", MakeVersionGate({20,0,0})}, - FunctionInfo{2233, nullptr, "Unknown2233", MakeVersionGate({20,0,0})}, - FunctionInfo{2234, nullptr, "Unknown2234", MakeVersionGate({20,0,0})}, - FunctionInfo{2250, nullptr, "Unknown2250", MakeVersionGate({20,0,0})}, - FunctionInfo{2260, nullptr, "Unknown2260", MakeVersionGate({20,0,0})}, - FunctionInfo{2270, nullptr, "Unknown2270", MakeVersionGate({20,0,0})}, - FunctionInfo{2280, nullptr, "Unknown2280", MakeVersionGate({20,0,0})}, - FunctionInfo{2300, nullptr, "Unknown2300", MakeVersionGate({20,0,0})}, - FunctionInfo{2310, nullptr, "Unknown2310", MakeVersionGate({20,0,0})}, - FunctionInfo{2400, nullptr, "Unknown2400", MakeVersionGate({20,0,0})}, - FunctionInfo{2420, nullptr, "Unknown2420", MakeVersionGate({20,0,0})} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/mig/mig.h b/src/core/hle/service/mig/mig.h index c8ed732a5b..39e92a59eb 100644 --- a/src/core/hle/service/mig/mig.h +++ b/src/core/hle/service/mig/mig.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/mii/mii.cpp b/src/core/hle/service/mii/mii.cpp index 642a9e4907..513bb671f8 100644 --- a/src/core/hle/service/mii/mii.cpp +++ b/src/core/hle/service/mii/mii.cpp @@ -22,25 +22,49 @@ namespace Service::Mii { -std::optional IStaticService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IStaticService::GetDatabaseService>, "GetDatabaseService"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - class IDatabaseService final : public ServiceFramework { public: - explicit IDatabaseService(Core::System& system_, std::shared_ptr mii_manager, bool is_system_) - : ServiceFramework{system_, "IDatabaseService"} - , manager{mii_manager} - , is_system{is_system_} { - m_set_sys = system.ServiceManager().GetService("set:sys", true); - manager->Initialize(metadata); - } + explicit IDatabaseService(Core::System& system_, std::shared_ptr mii_manager, + bool is_system_) + : ServiceFramework{system_, "IDatabaseService"}, manager{mii_manager}, is_system{ + is_system_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IDatabaseService::IsUpdated>, "IsUpdated"}, + {1, D<&IDatabaseService::IsFullDatabase>, "IsFullDatabase"}, + {2, D<&IDatabaseService::GetCount>, "GetCount"}, + {3, D<&IDatabaseService::Get>, "Get"}, + {4, D<&IDatabaseService::Get1>, "Get1"}, + {5, D<&IDatabaseService::UpdateLatest>, "UpdateLatest"}, + {6, D<&IDatabaseService::BuildRandom>, "BuildRandom"}, + {7, D<&IDatabaseService::BuildDefault>, "BuildDefault"}, + {8, D<&IDatabaseService::Get2>, "Get2"}, + {9, D<&IDatabaseService::Get3>, "Get3"}, + {10, D<&IDatabaseService::UpdateLatest1>, "UpdateLatest1"}, + {11, D<&IDatabaseService::FindIndex>, "FindIndex"}, + {12, D<&IDatabaseService::Move>, "Move"}, + {13, D<&IDatabaseService::AddOrReplace>, "AddOrReplace"}, + {14, D<&IDatabaseService::Delete>, "Delete"}, + {15, D<&IDatabaseService::DestroyFile>, "DestroyFile"}, + {16, D<&IDatabaseService::DeleteFile>, "DeleteFile"}, + {17, D<&IDatabaseService::Format>, "Format"}, + {18, nullptr, "Import"}, + {19, nullptr, "Export"}, + {20, D<&IDatabaseService::IsBrokenDatabaseWithClearFlag>, "IsBrokenDatabaseWithClearFlag"}, + {21, D<&IDatabaseService::GetIndex>, "GetIndex"}, + {22, D<&IDatabaseService::SetInterfaceVersion>, "SetInterfaceVersion"}, + {23, D<&IDatabaseService::Convert>, "Convert"}, + {24, D<&IDatabaseService::ConvertCoreDataToCharInfo>, "ConvertCoreDataToCharInfo"}, + {25, D<&IDatabaseService::ConvertCharInfoToCoreData>, "ConvertCharInfoToCoreData"}, + {26, D<&IDatabaseService::Append>, "Append"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + m_set_sys = system.ServiceManager().GetService( + "set:sys", true); + manager->Initialize(metadata); } private: @@ -264,45 +288,23 @@ private: R_RETURN(manager->Append(metadata, char_info)); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IDatabaseService::IsUpdated>, "IsUpdated"}, - FunctionInfo{1, D<&IDatabaseService::IsFullDatabase>, "IsFullDatabase"}, - FunctionInfo{2, D<&IDatabaseService::GetCount>, "GetCount"}, - FunctionInfo{3, D<&IDatabaseService::Get>, "Get"}, - FunctionInfo{4, D<&IDatabaseService::Get1>, "Get1"}, - FunctionInfo{5, D<&IDatabaseService::UpdateLatest>, "UpdateLatest"}, - FunctionInfo{6, D<&IDatabaseService::BuildRandom>, "BuildRandom"}, - FunctionInfo{7, D<&IDatabaseService::BuildDefault>, "BuildDefault"}, - FunctionInfo{8, D<&IDatabaseService::Get2>, "Get2"}, - FunctionInfo{9, D<&IDatabaseService::Get3>, "Get3"}, - FunctionInfo{10, D<&IDatabaseService::UpdateLatest1>, "UpdateLatest1"}, - FunctionInfo{11, D<&IDatabaseService::FindIndex>, "FindIndex"}, - FunctionInfo{12, D<&IDatabaseService::Move>, "Move"}, - FunctionInfo{13, D<&IDatabaseService::AddOrReplace>, "AddOrReplace"}, - FunctionInfo{14, D<&IDatabaseService::Delete>, "Delete"}, - FunctionInfo{15, D<&IDatabaseService::DestroyFile>, "DestroyFile"}, - FunctionInfo{16, D<&IDatabaseService::DeleteFile>, "DeleteFile"}, - FunctionInfo{17, D<&IDatabaseService::Format>, "Format"}, - FunctionInfo{18, nullptr, "Import"}, - FunctionInfo{19, nullptr, "Export"}, - FunctionInfo{20, D<&IDatabaseService::IsBrokenDatabaseWithClearFlag>, "IsBrokenDatabaseWithClearFlag"}, - FunctionInfo{21, D<&IDatabaseService::GetIndex>, "GetIndex"}, - FunctionInfo{22, D<&IDatabaseService::SetInterfaceVersion>, "SetInterfaceVersion"}, - FunctionInfo{23, D<&IDatabaseService::Convert>, "Convert"}, - FunctionInfo{24, D<&IDatabaseService::ConvertCoreDataToCharInfo>, "ConvertCoreDataToCharInfo"}, - FunctionInfo{25, D<&IDatabaseService::ConvertCharInfoToCoreData>, "ConvertCharInfoToCoreData"}, - FunctionInfo{26, D<&IDatabaseService::Append>, "Append"} - ); - std::shared_ptr manager = nullptr; DatabaseSessionMetadata metadata{}; bool is_system{}; + std::shared_ptr m_set_sys; }; IStaticService::IStaticService(Core::System& system_, const char* name_, std::shared_ptr mii_manager, bool is_system_) : ServiceFramework{system_, name_}, manager{mii_manager}, is_system{is_system_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IStaticService::GetDatabaseService>, "GetDatabaseService"}, + }; + // clang-format on + + RegisterHandlers(functions); } IStaticService::~IStaticService() = default; @@ -322,10 +324,27 @@ std::shared_ptr IStaticService::GetMiiManager() { class IImageDatabaseService final : public ServiceFramework { public: - explicit IImageDatabaseService(Core::System& system_) : ServiceFramework{system_, "miiimg"} {} + explicit IImageDatabaseService(Core::System& system_) : ServiceFramework{system_, "miiimg"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IImageDatabaseService::Initialize>, "Initialize"}, + {10, nullptr, "Reload"}, + {11, D<&IImageDatabaseService::GetCount>, "GetCount"}, + {12, nullptr, "IsEmpty"}, + {13, nullptr, "IsFull"}, + {14, nullptr, "GetAttribute"}, + {15, nullptr, "LoadImage"}, + {16, nullptr, "AddOrUpdateImage"}, + {17, nullptr, "DeleteImages"}, + {100, nullptr, "DeleteFile"}, + {101, nullptr, "DestroyFile"}, + {102, nullptr, "ImportFile"}, + {103, nullptr, "ExportFile"}, + {104, nullptr, "ForceInitialize"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -342,23 +361,6 @@ private: R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IImageDatabaseService::Initialize>, "Initialize"}, - FunctionInfo{10, nullptr, "Reload"}, - FunctionInfo{11, D<&IImageDatabaseService::GetCount>, "GetCount"}, - FunctionInfo{12, nullptr, "IsEmpty"}, - FunctionInfo{13, nullptr, "IsFull"}, - FunctionInfo{14, nullptr, "GetAttribute"}, - FunctionInfo{15, nullptr, "LoadImage"}, - FunctionInfo{16, nullptr, "AddOrUpdateImage"}, - FunctionInfo{17, nullptr, "DeleteImages"}, - FunctionInfo{100, nullptr, "DeleteFile"}, - FunctionInfo{101, nullptr, "DestroyFile"}, - FunctionInfo{102, nullptr, "ImportFile"}, - FunctionInfo{103, nullptr, "ExportFile"}, - FunctionInfo{104, nullptr, "ForceInitialize"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/mii/mii.h b/src/core/hle/service/mii/mii.h index ba20db40d7..9ec6f248e5 100644 --- a/src/core/hle/service/mii/mii.h +++ b/src/core/hle/service/mii/mii.h @@ -27,7 +27,6 @@ public: private: Result GetDatabaseService(Out> out_database_service); - std::optional FindRequest(u32 key) override; std::shared_ptr manager{nullptr}; bool is_system{}; }; diff --git a/src/core/hle/service/mii/mii_database.cpp b/src/core/hle/service/mii/mii_database.cpp index d1f4e1f198..6dd9773b2b 100644 --- a/src/core/hle/service/mii/mii_database.cpp +++ b/src/core/hle/service/mii/mii_database.cpp @@ -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-FileCopyrightText: Copyright 2023 yuzu Emulator Project diff --git a/src/core/hle/service/mii/mii_database.h b/src/core/hle/service/mii/mii_database.h index 3bd240f93b..6d28696206 100644 --- a/src/core/hle/service/mii/mii_database.h +++ b/src/core/hle/service/mii/mii_database.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/mii/mii_database_manager.h b/src/core/hle/service/mii/mii_database_manager.h index 52c32be82c..52ec3a91cc 100644 --- a/src/core/hle/service/mii/mii_database_manager.h +++ b/src/core/hle/service/mii/mii_database_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/mii/mii_manager.h b/src/core/hle/service/mii/mii_manager.h index 48d8e8bb7d..9c546d2cbf 100644 --- a/src/core/hle/service/mii/mii_manager.h +++ b/src/core/hle/service/mii/mii_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/mii/mii_result.h b/src/core/hle/service/mii/mii_result.h index e2c36e556d..f4964133e7 100644 --- a/src/core/hle/service/mii/mii_result.h +++ b/src/core/hle/service/mii/mii_result.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/mii/mii_types.h b/src/core/hle/service/mii/mii_types.h index 08c6029dff..6afa07ef43 100644 --- a/src/core/hle/service/mii/mii_types.h +++ b/src/core/hle/service/mii/mii_types.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/mii/types/char_info.cpp b/src/core/hle/service/mii/types/char_info.cpp index e90124af4c..b5f4492994 100644 --- a/src/core/hle/service/mii/types/char_info.cpp +++ b/src/core/hle/service/mii/types/char_info.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/mii/types/char_info.h b/src/core/hle/service/mii/types/char_info.h index d0c457fd56..e9c41435e1 100644 --- a/src/core/hle/service/mii/types/char_info.h +++ b/src/core/hle/service/mii/types/char_info.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/mii/types/core_data.cpp b/src/core/hle/service/mii/types/core_data.cpp index ba1da76bae..7f2acea3ef 100644 --- a/src/core/hle/service/mii/types/core_data.cpp +++ b/src/core/hle/service/mii/types/core_data.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/mii/types/core_data.h b/src/core/hle/service/mii/types/core_data.h index 8897e4f3b3..48a1ba5c73 100644 --- a/src/core/hle/service/mii/types/core_data.h +++ b/src/core/hle/service/mii/types/core_data.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/mii/types/raw_data.h b/src/core/hle/service/mii/types/raw_data.h index 9a4cfa738e..f8182847ec 100644 --- a/src/core/hle/service/mii/types/raw_data.h +++ b/src/core/hle/service/mii/types/raw_data.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/mii/types/store_data.cpp b/src/core/hle/service/mii/types/store_data.cpp index 127221fdb6..fcef3850f2 100644 --- a/src/core/hle/service/mii/types/store_data.cpp +++ b/src/core/hle/service/mii/types/store_data.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/mii/types/store_data.h b/src/core/hle/service/mii/types/store_data.h index ed5dfb9494..5d5269a15b 100644 --- a/src/core/hle/service/mii/types/store_data.h +++ b/src/core/hle/service/mii/types/store_data.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/mii/types/ver3_store_data.cpp b/src/core/hle/service/mii/types/ver3_store_data.cpp index c27646fcfd..840e0f35b3 100644 --- a/src/core/hle/service/mii/types/ver3_store_data.cpp +++ b/src/core/hle/service/mii/types/ver3_store_data.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/mii/types/ver3_store_data.h b/src/core/hle/service/mii/types/ver3_store_data.h index 47907bf7d7..f2cb395136 100644 --- a/src/core/hle/service/mii/types/ver3_store_data.h +++ b/src/core/hle/service/mii/types/ver3_store_data.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/mm/mm_u.cpp b/src/core/hle/service/mm/mm_u.cpp index 0b361ecdd2..e5353ee42c 100644 --- a/src/core/hle/service/mm/mm_u.cpp +++ b/src/core/hle/service/mm/mm_u.cpp @@ -49,10 +49,21 @@ public: class MM_U final : public ServiceFramework { public: - explicit MM_U(Core::System& system_) : ServiceFramework{system_, "mm:u"} {} + explicit MM_U(Core::System& system_) : ServiceFramework{system_, "mm:u"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &MM_U::InitializeOld, "InitializeOld"}, + {1, &MM_U::FinalizeOld, "FinalizeOld"}, + {2, &MM_U::SetAndWaitOld, "SetAndWaitOld"}, + {3, &MM_U::GetOld, "GetOld"}, + {4, &MM_U::Initialize, "Initialize"}, + {5, &MM_U::Finalize, "Finalize"}, + {6, &MM_U::SetAndWait, "SetAndWait"}, + {7, &MM_U::Get, "Get"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -201,16 +212,6 @@ private: rb.Push(0); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &MM_U::InitializeOld, "InitializeOld"}, - FunctionInfo{1, &MM_U::FinalizeOld, "FinalizeOld"}, - FunctionInfo{2, &MM_U::SetAndWaitOld, "SetAndWaitOld"}, - FunctionInfo{3, &MM_U::GetOld, "GetOld"}, - FunctionInfo{4, &MM_U::Initialize, "Initialize"}, - FunctionInfo{5, &MM_U::Finalize, "Finalize"}, - FunctionInfo{6, &MM_U::SetAndWait, "SetAndWait"}, - FunctionInfo{7, &MM_U::Get, "Get"} - ); std::vector sessions; u32 request_id{1}; }; diff --git a/src/core/hle/service/mm/mm_u.h b/src/core/hle/service/mm/mm_u.h index 43117c9b1c..ab0e76f40a 100644 --- a/src/core/hle/service/mm/mm_u.h +++ b/src/core/hle/service/mm/mm_u.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/mnpp/mnpp.cpp b/src/core/hle/service/mnpp/mnpp.cpp index c5bc306302..11b6f3a386 100644 --- a/src/core/hle/service/mnpp/mnpp.cpp +++ b/src/core/hle/service/mnpp/mnpp.cpp @@ -14,10 +14,15 @@ namespace Service::MNPP { class MNPP_APP final : public ServiceFramework { public: - explicit MNPP_APP(Core::System& system_) : ServiceFramework{system_, "mnpp:app"} {} + explicit MNPP_APP(Core::System& system_) : ServiceFramework{system_, "mnpp:app"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &MNPP_APP::Cmd0, "Cmd0"}, + {1, &MNPP_APP::Cmd1, "Cmd1"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -34,43 +39,38 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &MNPP_APP::Cmd0, "Cmd0"}, - FunctionInfo{1, &MNPP_APP::Cmd1, "Cmd1"} - ); }; class MNPP_SYS final : public ServiceFramework { public: - explicit MNPP_SYS(Core::System& system_) : ServiceFramework{system_, "mnpp:sys"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Cmd0"}, - FunctionInfo{10, nullptr, "Cmd10"}, - FunctionInfo{100, nullptr, "Cmd100"}, - FunctionInfo{200, nullptr, "Cmd200"}, - FunctionInfo{300, nullptr, "Cmd300"}, - FunctionInfo{400, nullptr, "Cmd400"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit MNPP_SYS(Core::System& system_) : ServiceFramework{system_, "mnpp:sys"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Cmd0"}, + {10, nullptr, "Cmd10"}, + {100, nullptr, "Cmd100"}, + {200, nullptr, "Cmd200"}, + {300, nullptr, "Cmd300"}, + {400, nullptr, "Cmd400"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class MNPP_WEB final : public ServiceFramework { public: - explicit MNPP_WEB(Core::System& system_) : ServiceFramework{system_, "mnpp:web"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Cmd0"}, - FunctionInfo{1, nullptr, "Cmd1"}, - FunctionInfo{10, nullptr, "Cmd10"}, - FunctionInfo{20, nullptr, "Cmd20"}, - FunctionInfo{100, nullptr, "Cmd100"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit MNPP_WEB(Core::System& system_) : ServiceFramework{system_, "mnpp:web"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Cmd0"}, + {1, nullptr, "Cmd1"}, + {10, nullptr, "Cmd10"}, + {20, nullptr, "Cmd20"}, + {100, nullptr, "Cmd100"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/ncm/ncm.cpp b/src/core/hle/service/ncm/ncm.cpp index 4091eadcf9..6c754d5567 100644 --- a/src/core/hle/service/ncm/ncm.cpp +++ b/src/core/hle/service/ncm/ncm.cpp @@ -24,32 +24,33 @@ namespace Service::NCM { class ILocationResolver final : public ServiceFramework { public: explicit ILocationResolver(Core::System& system_, FileSys::StorageId id) - : ServiceFramework{system_, "ILocationResolver"}, storage{id} {} + : ServiceFramework{system_, "ILocationResolver"}, storage{id} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "ResolveProgramPath"}, + {1, nullptr, "RedirectProgramPath"}, + {2, nullptr, "ResolveApplicationControlPath"}, + {3, nullptr, "ResolveApplicationHtmlDocumentPath"}, + {4, nullptr, "ResolveDataPath"}, + {5, nullptr, "RedirectApplicationControlPath"}, + {6, nullptr, "RedirectApplicationHtmlDocumentPath"}, + {7, nullptr, "ResolveApplicationLegalInformationPath"}, + {8, nullptr, "RedirectApplicationLegalInformationPath"}, + {9, nullptr, "Refresh"}, + {10, nullptr, "RedirectApplicationProgramPath"}, + {11, nullptr, "ClearApplicationRedirection"}, + {12, nullptr, "EraseProgramRedirection"}, + {13, nullptr, "EraseApplicationControlRedirection"}, + {14, nullptr, "EraseApplicationHtmlDocumentRedirection"}, + {15, nullptr, "EraseApplicationLegalInformationRedirection"}, + {16, nullptr, "ResolveProgramPathForDebug"}, + {17, nullptr, "RedirectProgramPathForDebug"}, + {18, nullptr, "RedirectApplicationProgramPathForDebug"}, + {19, nullptr, "EraseProgramRedirectionForDebug"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "ResolveProgramPath"}, - FunctionInfo{1, nullptr, "RedirectProgramPath"}, - FunctionInfo{2, nullptr, "ResolveApplicationControlPath"}, - FunctionInfo{3, nullptr, "ResolveApplicationHtmlDocumentPath"}, - FunctionInfo{4, nullptr, "ResolveDataPath"}, - FunctionInfo{5, nullptr, "RedirectApplicationControlPath"}, - FunctionInfo{6, nullptr, "RedirectApplicationHtmlDocumentPath"}, - FunctionInfo{7, nullptr, "ResolveApplicationLegalInformationPath"}, - FunctionInfo{8, nullptr, "RedirectApplicationLegalInformationPath"}, - FunctionInfo{9, nullptr, "Refresh"}, - FunctionInfo{10, nullptr, "RedirectApplicationProgramPath"}, - FunctionInfo{11, nullptr, "ClearApplicationRedirection"}, - FunctionInfo{12, nullptr, "EraseProgramRedirection"}, - FunctionInfo{13, nullptr, "EraseApplicationControlRedirection"}, - FunctionInfo{14, nullptr, "EraseApplicationHtmlDocumentRedirection"}, - FunctionInfo{15, nullptr, "EraseApplicationLegalInformationRedirection"}, - FunctionInfo{16, nullptr, "ResolveProgramPathForDebug"}, - FunctionInfo{17, nullptr, "RedirectProgramPathForDebug"}, - FunctionInfo{18, nullptr, "RedirectApplicationProgramPathForDebug"}, - FunctionInfo{19, nullptr, "EraseProgramRedirectionForDebug"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -59,49 +60,60 @@ private: class IRegisteredLocationResolver final : public ServiceFramework { public: explicit IRegisteredLocationResolver(Core::System& system_) - : ServiceFramework{system_, "IRegisteredLocationResolver"} {} + : ServiceFramework{system_, "IRegisteredLocationResolver"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "ResolveProgramPath"}, + {1, nullptr, "RegisterProgramPath"}, + {2, nullptr, "UnregisterProgramPath"}, + {3, nullptr, "RedirectProgramPath"}, + {4, nullptr, "ResolveHtmlDocumentPath"}, + {5, nullptr, "RegisterHtmlDocumentPath"}, + {6, nullptr, "UnregisterHtmlDocumentPath"}, + {7, nullptr, "RedirectHtmlDocumentPath"}, + {8, nullptr, "Refresh"}, + {9, nullptr, "RefreshExcluding"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "ResolveProgramPath"}, - FunctionInfo{1, nullptr, "RegisterProgramPath"}, - FunctionInfo{2, nullptr, "UnregisterProgramPath"}, - FunctionInfo{3, nullptr, "RedirectProgramPath"}, - FunctionInfo{4, nullptr, "ResolveHtmlDocumentPath"}, - FunctionInfo{5, nullptr, "RegisterHtmlDocumentPath"}, - FunctionInfo{6, nullptr, "UnregisterHtmlDocumentPath"}, - FunctionInfo{7, nullptr, "RedirectHtmlDocumentPath"}, - FunctionInfo{8, nullptr, "Refresh"}, - FunctionInfo{9, nullptr, "RefreshExcluding"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IAddOnContentLocationResolver final : public ServiceFramework { public: explicit IAddOnContentLocationResolver(Core::System& system_) - : ServiceFramework{system_, "IAddOnContentLocationResolver"} {} + : ServiceFramework{system_, "IAddOnContentLocationResolver"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "ResolveAddOnContentPath"}, + {1, nullptr, "RegisterAddOnContentStorage"}, + {2, nullptr, "UnregisterAllAddOnContentPath"}, + {3, nullptr, "RefreshApplicationAddOnContent"}, + {4, nullptr, "UnregisterApplicationAddOnContent"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "ResolveAddOnContentPath"}, - FunctionInfo{1, nullptr, "RegisterAddOnContentStorage"}, - FunctionInfo{2, nullptr, "UnregisterAllAddOnContentPath"}, - FunctionInfo{3, nullptr, "RefreshApplicationAddOnContent"}, - FunctionInfo{4, nullptr, "UnregisterApplicationAddOnContent"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IContentStorage final : public ServiceFramework { public: explicit IContentStorage(Core::System& system_, FileSys::StorageId id) - : ServiceFramework{system_, "IContentStorage"}, storage{id} {} + : ServiceFramework{system_, "IContentStorage"}, storage{id} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IContentStorage::GeneratePlaceHolderId, "GeneratePlaceHolderId"}, + {1, &IContentStorage::CreatePlaceHolder, "CreatePlaceHolder"}, + {2, &IContentStorage::DeletePlaceHolder, "DeletePlaceHolder"}, + {4, &IContentStorage::WritePlaceHolder, "WritePlaceHolder"}, + {5, &IContentStorage::Register, "Register"}, + {6, &IContentStorage::Delete, "Delete"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -240,24 +252,23 @@ private: rb.Push(succeeded ? ResultSuccess : ResultUnknown); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IContentStorage::GeneratePlaceHolderId, "GeneratePlaceHolderId"}, - FunctionInfo{1, &IContentStorage::CreatePlaceHolder, "CreatePlaceHolder"}, - FunctionInfo{2, &IContentStorage::DeletePlaceHolder, "DeletePlaceHolder"}, - FunctionInfo{4, &IContentStorage::WritePlaceHolder, "WritePlaceHolder"}, - FunctionInfo{5, &IContentStorage::Register, "Register"}, - FunctionInfo{6, &IContentStorage::Delete, "Delete"} - ); FileSys::StorageId storage; }; class IContentMetaDatabase final : public ServiceFramework { public: explicit IContentMetaDatabase(Core::System& system_, FileSys::StorageId id) - : ServiceFramework{system_, "IContentMetaDatabase"}, storage{id} {} + : ServiceFramework{system_, "IContentMetaDatabase"}, storage{id} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IContentMetaDatabase::Set, "Set"}, + {2, &IContentMetaDatabase::Remove, "Remove"}, + {8, &IContentMetaDatabase::Has, "Has"}, + {15, &IContentMetaDatabase::Commit, "Commit"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -345,37 +356,51 @@ private: rb.Push(ResultSuccess); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IContentMetaDatabase::Set, "Set"}, - FunctionInfo{2, &IContentMetaDatabase::Remove, "Remove"}, - FunctionInfo{8, &IContentMetaDatabase::Has, "Has"}, - FunctionInfo{15, &IContentMetaDatabase::Commit, "Commit"} - ); FileSys::StorageId storage; std::vector entries; }; class LR final : public ServiceFramework { public: - explicit LR(Core::System& system_) : ServiceFramework{system_, "lr"} {} + explicit LR(Core::System& system_) : ServiceFramework{system_, "lr"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "OpenLocationResolver"}, + {1, nullptr, "OpenRegisteredLocationResolver"}, + {2, nullptr, "RefreshLocationResolver"}, + {3, nullptr, "OpenAddOnContentLocationResolver"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenLocationResolver"}, - FunctionInfo{1, nullptr, "OpenRegisteredLocationResolver"}, - FunctionInfo{2, nullptr, "RefreshLocationResolver"}, - FunctionInfo{3, nullptr, "OpenAddOnContentLocationResolver"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class NCM final : public ServiceFramework { public: - explicit NCM(Core::System& system_) : ServiceFramework{system_, "ncm"} {} + explicit NCM(Core::System& system_) : ServiceFramework{system_, "ncm"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "CreateContentStorage"}, + {1, nullptr, "CreateContentMetaDatabase"}, + {2, nullptr, "VerifyContentStorage"}, + {3, nullptr, "VerifyContentMetaDatabase"}, + {4, &NCM::OpenContentStorage, "OpenContentStorage"}, + {5, &NCM::OpenContentMetaDatabase, "OpenContentMetaDatabase"}, + {6, nullptr, "CloseContentStorageForcibly"}, + {7, nullptr, "CloseContentMetaDatabaseForcibly"}, + {8, nullptr, "CleanupContentMetaDatabase"}, + {9, nullptr, "ActivateContentStorage"}, + {10, nullptr, "InactivateContentStorage"}, + {11, nullptr, "ActivateContentMetaDatabase"}, + {12, nullptr, "InactivateContentMetaDatabase"}, + {13, nullptr, "InvalidateRightsIdCache"}, + {14, nullptr, "GetMemoryReport"}, + {15, nullptr, "ActivateFsContentStorage"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -400,39 +425,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system, storage_id); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateContentStorage"}, - FunctionInfo{1, nullptr, "CreateContentMetaDatabase"}, - FunctionInfo{2, nullptr, "VerifyContentStorage"}, - FunctionInfo{3, nullptr, "VerifyContentMetaDatabase"}, - FunctionInfo{4, &NCM::OpenContentStorage, "OpenContentStorage"}, - FunctionInfo{5, &NCM::OpenContentMetaDatabase, "OpenContentMetaDatabase"}, - FunctionInfo{6, nullptr, "CloseContentStorageForcibly"}, - FunctionInfo{7, nullptr, "CloseContentMetaDatabaseForcibly"}, - FunctionInfo{8, nullptr, "CleanupContentMetaDatabase"}, - FunctionInfo{9, nullptr, "ActivateContentStorage"}, - FunctionInfo{10, nullptr, "InactivateContentStorage"}, - FunctionInfo{11, nullptr, "ActivateContentMetaDatabase"}, - FunctionInfo{12, nullptr, "InactivateContentMetaDatabase"}, - FunctionInfo{13, nullptr, "InvalidateRightsIdCache"}, - FunctionInfo{14, nullptr, "GetMemoryReport"}, - FunctionInfo{15, nullptr, "ActivateFsContentStorage"} - ); }; class NCM_V final : public ServiceFramework { public: explicit NCM_V(Core::System& system_) : ServiceFramework{system_, "ncm:v"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + {0, nullptr, "GetSystemVersion"}, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetSystemVersion"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/ncm/ncm.h b/src/core/hle/service/ncm/ncm.h index b78efdcd79..1d8bc7a9ea 100644 --- a/src/core/hle/service/ncm/ncm.h +++ b/src/core/hle/service/ncm/ncm.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/nfc/common/device.h b/src/core/hle/service/nfc/common/device.h index d59202d18f..98063bbc29 100644 --- a/src/core/hle/service/nfc/common/device.h +++ b/src/core/hle/service/nfc/common/device.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/nfc/common/device_manager.h b/src/core/hle/service/nfc/common/device_manager.h index 6c0e6b255e..116ae8cb7e 100644 --- a/src/core/hle/service/nfc/common/device_manager.h +++ b/src/core/hle/service/nfc/common/device_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nfc/mifare_result.h b/src/core/hle/service/nfc/mifare_result.h index 16a9171e60..399f01313e 100644 --- a/src/core/hle/service/nfc/mifare_result.h +++ b/src/core/hle/service/nfc/mifare_result.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nfc/mifare_types.h b/src/core/hle/service/nfc/mifare_types.h index 4679373994..237f60f0de 100644 --- a/src/core/hle/service/nfc/mifare_types.h +++ b/src/core/hle/service/nfc/mifare_types.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nfc/nfc.cpp b/src/core/hle/service/nfc/nfc.cpp index d3a986faea..f64445835e 100644 --- a/src/core/hle/service/nfc/nfc.cpp +++ b/src/core/hle/service/nfc/nfc.cpp @@ -18,71 +18,74 @@ namespace Service::NFC { class IUser final : public NfcInterface { public: - explicit IUser(Core::System& system_) : NfcInterface(system_, "NFC::IUser", BackendType::Nfc) {} + explicit IUser(Core::System& system_) : NfcInterface(system_, "NFC::IUser", BackendType::Nfc) { + // clang-format off + static const FunctionInfo functions[] = { + {0, &NfcInterface::Initialize, "InitializeOld"}, + {1, &NfcInterface::Finalize, "FinalizeOld"}, + {2, &NfcInterface::GetState, "GetStateOld"}, + {3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"}, + {400, &NfcInterface::Initialize, "Initialize"}, + {401, &NfcInterface::Finalize, "Finalize"}, + {402, &NfcInterface::GetState, "GetState"}, + {403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"}, + {404, &NfcInterface::ListDevices, "ListDevices"}, + {405, &NfcInterface::GetDeviceState, "GetDeviceState"}, + {406, &NfcInterface::GetNpadId, "GetNpadId"}, + {407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, + {408, &NfcInterface::StartDetection, "StartDetection"}, + {409, &NfcInterface::StopDetection, "StopDetection"}, + {410, &NfcInterface::GetTagInfo, "GetTagInfo"}, + {411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"}, + {412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"}, + {1000, &NfcInterface::ReadMifare, "ReadMifare"}, + {1001, &NfcInterface::WriteMifare ,"WriteMifare"}, + {1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"}, + {1301, nullptr, "KeepPassThroughSession"}, + {1302, nullptr, "ReleasePassThroughSession"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMapWithClass( - FunctionInfoTyped{0, &NfcInterface::Initialize, "InitializeOld"}, - FunctionInfoTyped{1, &NfcInterface::Finalize, "FinalizeOld"}, - FunctionInfoTyped{2, &NfcInterface::GetState, "GetStateOld"}, - FunctionInfoTyped{3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"}, - FunctionInfoTyped{400, &NfcInterface::Initialize, "Initialize"}, - FunctionInfoTyped{401, &NfcInterface::Finalize, "Finalize"}, - FunctionInfoTyped{402, &NfcInterface::GetState, "GetState"}, - FunctionInfoTyped{403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"}, - FunctionInfoTyped{404, &NfcInterface::ListDevices, "ListDevices"}, - FunctionInfoTyped{405, &NfcInterface::GetDeviceState, "GetDeviceState"}, - FunctionInfoTyped{406, &NfcInterface::GetNpadId, "GetNpadId"}, - FunctionInfoTyped{407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - FunctionInfoTyped{408, &NfcInterface::StartDetection, "StartDetection"}, - FunctionInfoTyped{409, &NfcInterface::StopDetection, "StopDetection"}, - FunctionInfoTyped{410, &NfcInterface::GetTagInfo, "GetTagInfo"}, - FunctionInfoTyped{411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"}, - FunctionInfoTyped{412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"}, - FunctionInfoTyped{1000, &NfcInterface::ReadMifare, "ReadMifare"}, - FunctionInfoTyped{1001, &NfcInterface::WriteMifare ,"WriteMifare"}, - FunctionInfoTyped{1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"}, - FunctionInfoTyped{1301, nullptr, "KeepPassThroughSession"}, - FunctionInfoTyped{1302, nullptr, "ReleasePassThroughSession"} - ); }; class ISystem final : public NfcInterface { public: - explicit ISystem(Core::System& system_) : NfcInterface{system_, "NFC::ISystem", BackendType::Nfc} {} + explicit ISystem(Core::System& system_) + : NfcInterface{system_, "NFC::ISystem", BackendType::Nfc} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &NfcInterface::Initialize, "InitializeOld"}, + {1, &NfcInterface::Finalize, "FinalizeOld"}, + {2, &NfcInterface::GetState, "GetStateOld"}, + {3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"}, + {100, &NfcInterface::SetNfcEnabled, "SetNfcEnabledOld"}, + {400, &NfcInterface::Initialize, "Initialize"}, + {401, &NfcInterface::Finalize, "Finalize"}, + {402, &NfcInterface::GetState, "GetState"}, + {403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"}, + {404, &NfcInterface::ListDevices, "ListDevices"}, + {405, &NfcInterface::GetDeviceState, "GetDeviceState"}, + {406, &NfcInterface::GetNpadId, "GetNpadId"}, + {407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, + {408, &NfcInterface::StartDetection, "StartDetection"}, + {409, &NfcInterface::StopDetection, "StopDetection"}, + {410, &NfcInterface::GetTagInfo, "GetTagInfo"}, + {411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"}, + {412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"}, + {500, &NfcInterface::SetNfcEnabled, "SetNfcEnabled"}, + {510, nullptr, "OutputTestWave"}, + {1000, &NfcInterface::ReadMifare, "ReadMifare"}, + {1001, &NfcInterface::WriteMifare, "WriteMifare"}, + {1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"}, + {1301, nullptr, "KeepPassThroughSession"}, + {1302, nullptr, "ReleasePassThroughSession"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMapWithClass( - FunctionInfoTyped{0, &NfcInterface::Initialize, "InitializeOld"}, - FunctionInfoTyped{1, &NfcInterface::Finalize, "FinalizeOld"}, - FunctionInfoTyped{2, &NfcInterface::GetState, "GetStateOld"}, - FunctionInfoTyped{3, &NfcInterface::IsNfcEnabled, "IsNfcEnabledOld"}, - FunctionInfoTyped{100, &NfcInterface::SetNfcEnabled, "SetNfcEnabledOld"}, - FunctionInfoTyped{400, &NfcInterface::Initialize, "Initialize"}, - FunctionInfoTyped{401, &NfcInterface::Finalize, "Finalize"}, - FunctionInfoTyped{402, &NfcInterface::GetState, "GetState"}, - FunctionInfoTyped{403, &NfcInterface::IsNfcEnabled, "IsNfcEnabled"}, - FunctionInfoTyped{404, &NfcInterface::ListDevices, "ListDevices"}, - FunctionInfoTyped{405, &NfcInterface::GetDeviceState, "GetDeviceState"}, - FunctionInfoTyped{406, &NfcInterface::GetNpadId, "GetNpadId"}, - FunctionInfoTyped{407, &NfcInterface::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - FunctionInfoTyped{408, &NfcInterface::StartDetection, "StartDetection"}, - FunctionInfoTyped{409, &NfcInterface::StopDetection, "StopDetection"}, - FunctionInfoTyped{410, &NfcInterface::GetTagInfo, "GetTagInfo"}, - FunctionInfoTyped{411, &NfcInterface::AttachActivateEvent, "AttachActivateEvent"}, - FunctionInfoTyped{412, &NfcInterface::AttachDeactivateEvent, "AttachDeactivateEvent"}, - FunctionInfoTyped{500, &NfcInterface::SetNfcEnabled, "SetNfcEnabled"}, - FunctionInfoTyped{510, nullptr, "OutputTestWave"}, - FunctionInfoTyped{1000, &NfcInterface::ReadMifare, "ReadMifare"}, - FunctionInfoTyped{1001, &NfcInterface::WriteMifare, "WriteMifare"}, - FunctionInfoTyped{1300, &NfcInterface::SendCommandByPassThrough, "SendCommandByPassThrough"}, - FunctionInfoTyped{1301, nullptr, "KeepPassThroughSession"}, - FunctionInfoTyped{1302, nullptr, "ReleasePassThroughSession"} - ); }; // MFInterface has an unique interface but it's identical to NfcInterface so we can keep the code @@ -90,49 +93,56 @@ public: using MFInterface = NfcInterface; class MFIUser final : public MFInterface { public: - explicit MFIUser(Core::System& system_) : MFInterface{system_, "NFC::MFInterface", BackendType::Mifare} {} + explicit MFIUser(Core::System& system_) + : MFInterface{system_, "NFC::MFInterface", BackendType::Mifare} { + // clang-format off + static const FunctionInfoTyped functions[] = { + {0, &MFIUser::Initialize, "Initialize"}, + {1, &MFIUser::Finalize, "Finalize"}, + {2, &MFIUser::ListDevices, "ListDevices"}, + {3, &MFIUser::StartDetection, "StartDetection"}, + {4, &MFIUser::StopDetection, "StopDetection"}, + {5, &MFIUser::ReadMifare, "Read"}, + {6, &MFIUser::WriteMifare, "Write"}, + {7, &MFIUser::GetTagInfo, "GetTagInfo"}, + {8, &MFIUser::AttachActivateEvent, "GetActivateEventHandle"}, + {9, &MFIUser::AttachDeactivateEvent, "GetDeactivateEventHandle"}, + {10, &MFIUser::GetState, "GetState"}, + {11, &MFIUser::GetDeviceState, "GetDeviceState"}, + {12, &MFIUser::GetNpadId, "GetNpadId"}, + {13, &MFIUser::AttachAvailabilityChangeEvent, "GetAvailabilityChangeEventHandle"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMapWithClass( - FunctionInfoTyped{0, &MFIUser::Initialize, "Initialize"}, - FunctionInfoTyped{1, &MFIUser::Finalize, "Finalize"}, - FunctionInfoTyped{2, &MFIUser::ListDevices, "ListDevices"}, - FunctionInfoTyped{3, &MFIUser::StartDetection, "StartDetection"}, - FunctionInfoTyped{4, &MFIUser::StopDetection, "StopDetection"}, - FunctionInfoTyped{5, &MFIUser::ReadMifare, "Read"}, - FunctionInfoTyped{6, &MFIUser::WriteMifare, "Write"}, - FunctionInfoTyped{7, &MFIUser::GetTagInfo, "GetTagInfo"}, - FunctionInfoTyped{8, &MFIUser::AttachActivateEvent, "GetActivateEventHandle"}, - FunctionInfoTyped{9, &MFIUser::AttachDeactivateEvent, "GetDeactivateEventHandle"}, - FunctionInfoTyped{10, &MFIUser::GetState, "GetState"}, - FunctionInfoTyped{11, &MFIUser::GetDeviceState, "GetDeviceState"}, - FunctionInfoTyped{12, &MFIUser::GetNpadId, "GetNpadId"}, - FunctionInfoTyped{13, &MFIUser::AttachAvailabilityChangeEvent, "GetAvailabilityChangeEventHandle"} - ); }; class IAm final : public ServiceFramework { public: - explicit IAm(Core::System& system_) : ServiceFramework{system_, "NFC::IAm"} {} + explicit IAm(Core::System& system_) : ServiceFramework{system_, "NFC::IAm"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Initialize"}, + {1, nullptr, "Finalize"}, + {2, nullptr, "NotifyForegroundApplet"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Initialize"}, - FunctionInfo{1, nullptr, "Finalize"}, - FunctionInfo{2, nullptr, "NotifyForegroundApplet"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class NFC_AM final : public ServiceFramework { public: - explicit NFC_AM(Core::System& system_) : ServiceFramework{system_, "nfc:am"} {} + explicit NFC_AM(Core::System& system_) : ServiceFramework{system_, "nfc:am"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &NFC_AM::CreateAmNfcInterface, "CreateAmNfcInterface"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -143,18 +153,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &NFC_AM::CreateAmNfcInterface, "CreateAmNfcInterface"} - ); }; class NFC_MF_U final : public ServiceFramework { public: - explicit NFC_MF_U(Core::System& system_) : ServiceFramework{system_, "nfc:mf:u"} {} + explicit NFC_MF_U(Core::System& system_) : ServiceFramework{system_, "nfc:mf:u"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &NFC_MF_U::CreateUserNfcInterface, "CreateUserNfcInterface"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -165,18 +175,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &NFC_MF_U::CreateUserNfcInterface, "CreateUserNfcInterface"} - ); }; class NFC_U final : public ServiceFramework { public: - explicit NFC_U(Core::System& system_) : ServiceFramework{system_, "nfc:user"} {} + explicit NFC_U(Core::System& system_) : ServiceFramework{system_, "nfc:user"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &NFC_U::CreateUserNfcInterface, "CreateUserNfcInterface"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -187,18 +197,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &NFC_U::CreateUserNfcInterface, "CreateUserNfcInterface"} - ); }; class NFC_SYS final : public ServiceFramework { public: - explicit NFC_SYS(Core::System& system_) : ServiceFramework{system_, "nfc:sys"} {} + explicit NFC_SYS(Core::System& system_) : ServiceFramework{system_, "nfc:sys"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &NFC_SYS::CreateSystemNfcInterface, "CreateSystemNfcInterface"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -209,10 +219,6 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &NFC_SYS::CreateSystemNfcInterface, "CreateSystemNfcInterface"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/nfc/nfc.h b/src/core/hle/service/nfc/nfc.h index d15955b755..bfda30d6f1 100644 --- a/src/core/hle/service/nfc/nfc.h +++ b/src/core/hle/service/nfc/nfc.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/nfc/nfc_interface.h b/src/core/hle/service/nfc/nfc_interface.h index 5cc0d8ec04..a1e0d8d9ca 100644 --- a/src/core/hle/service/nfc/nfc_interface.h +++ b/src/core/hle/service/nfc/nfc_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/nfc/nfc_result.h b/src/core/hle/service/nfc/nfc_result.h index 464b5fd69a..aab83c326c 100644 --- a/src/core/hle/service/nfc/nfc_result.h +++ b/src/core/hle/service/nfc/nfc_result.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nfc/nfc_types.h b/src/core/hle/service/nfc/nfc_types.h index 6d44014ea1..6774a9b4d6 100644 --- a/src/core/hle/service/nfc/nfc_types.h +++ b/src/core/hle/service/nfc/nfc_types.h @@ -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-FileCopyrightText: Copyright 2023 yuzu Emulator Project diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp index bfeb7d5553..e0c24679ab 100644 --- a/src/core/hle/service/nfp/nfp.cpp +++ b/src/core/hle/service/nfp/nfp.cpp @@ -14,134 +14,145 @@ namespace Service::NFP { class IUser final : public Interface { public: - explicit IUser(Core::System& system_) : Interface(system_, "NFP:IUser") {} + explicit IUser(Core::System& system_) : Interface(system_, "NFP:IUser") { + // clang-format off + static const FunctionInfoTyped functions[] = { + {0, &IUser::Initialize, "Initialize"}, + {1, &IUser::Finalize, "Finalize"}, + {2, &IUser::ListDevices, "ListDevices"}, + {3, &IUser::StartDetection, "StartDetection"}, + {4, &IUser::StopDetection, "StopDetection"}, + {5, &IUser::Mount, "Mount"}, + {6, &IUser::Unmount, "Unmount"}, + {7, &IUser::OpenApplicationArea, "OpenApplicationArea"}, + {8, &IUser::GetApplicationArea, "GetApplicationArea"}, + {9, &IUser::SetApplicationArea, "SetApplicationArea"}, + {10, &IUser::Flush, "Flush"}, + {11, &IUser::Restore, "Restore"}, + {12, &IUser::CreateApplicationArea, "CreateApplicationArea"}, + {13, &IUser::GetTagInfo, "GetTagInfo"}, + {14, &IUser::GetRegisterInfo, "GetRegisterInfo"}, + {15, &IUser::GetCommonInfo, "GetCommonInfo"}, + {16, &IUser::GetModelInfo, "GetModelInfo"}, + {17, &IUser::AttachActivateEvent, "AttachActivateEvent"}, + {18, &IUser::AttachDeactivateEvent, "AttachDeactivateEvent"}, + {19, &IUser::GetState, "GetState"}, + {20, &IUser::GetDeviceState, "GetDeviceState"}, + {21, &IUser::GetNpadId, "GetNpadId"}, + {22, &IUser::GetApplicationAreaSize, "GetApplicationAreaSize"}, + {23, &IUser::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, + {24, &IUser::RecreateApplicationArea, "RecreateApplicationArea"}, + {25, &IUser::StartDetection, "StartDetectionWithFilter"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMapWithClass( - FunctionInfoTyped{0, &IUser::Initialize, "Initialize"}, - FunctionInfoTyped{1, &IUser::Finalize, "Finalize"}, - FunctionInfoTyped{2, &IUser::ListDevices, "ListDevices"}, - FunctionInfoTyped{3, &IUser::StartDetection, "StartDetection"}, - FunctionInfoTyped{4, &IUser::StopDetection, "StopDetection"}, - FunctionInfoTyped{5, &IUser::Mount, "Mount"}, - FunctionInfoTyped{6, &IUser::Unmount, "Unmount"}, - FunctionInfoTyped{7, &IUser::OpenApplicationArea, "OpenApplicationArea"}, - FunctionInfoTyped{8, &IUser::GetApplicationArea, "GetApplicationArea"}, - FunctionInfoTyped{9, &IUser::SetApplicationArea, "SetApplicationArea"}, - FunctionInfoTyped{10, &IUser::Flush, "Flush"}, - FunctionInfoTyped{11, &IUser::Restore, "Restore"}, - FunctionInfoTyped{12, &IUser::CreateApplicationArea, "CreateApplicationArea"}, - FunctionInfoTyped{13, &IUser::GetTagInfo, "GetTagInfo"}, - FunctionInfoTyped{14, &IUser::GetRegisterInfo, "GetRegisterInfo"}, - FunctionInfoTyped{15, &IUser::GetCommonInfo, "GetCommonInfo"}, - FunctionInfoTyped{16, &IUser::GetModelInfo, "GetModelInfo"}, - FunctionInfoTyped{17, &IUser::AttachActivateEvent, "AttachActivateEvent"}, - FunctionInfoTyped{18, &IUser::AttachDeactivateEvent, "AttachDeactivateEvent"}, - FunctionInfoTyped{19, &IUser::GetState, "GetState"}, - FunctionInfoTyped{20, &IUser::GetDeviceState, "GetDeviceState"}, - FunctionInfoTyped{21, &IUser::GetNpadId, "GetNpadId"}, - FunctionInfoTyped{22, &IUser::GetApplicationAreaSize, "GetApplicationAreaSize"}, - FunctionInfoTyped{23, &IUser::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - FunctionInfoTyped{24, &IUser::RecreateApplicationArea, "RecreateApplicationArea"}, - FunctionInfoTyped{25, &IUser::StartDetection, "StartDetectionWithFilter"} - ); }; class ISystem final : public Interface { public: - explicit ISystem(Core::System& system_) : Interface(system_, "NFP:ISystem") {} + explicit ISystem(Core::System& system_) : Interface(system_, "NFP:ISystem") { + // clang-format off + static const FunctionInfoTyped functions[] = { + {0, &ISystem::InitializeSystem, "InitializeSystem"}, + {1, &ISystem::FinalizeSystem, "FinalizeSystem"}, + {2, &ISystem::ListDevices, "ListDevices"}, + {3, &ISystem::StartDetection, "StartDetection"}, + {4, &ISystem::StopDetection, "StopDetection"}, + {5, &ISystem::Mount, "Mount"}, + {6, &ISystem::Unmount, "Unmount"}, + {10, &ISystem::Flush, "Flush"}, + {11, &ISystem::Restore, "Restore"}, + {12, &ISystem::CreateApplicationArea, "CreateApplicationArea"}, + {13, &ISystem::GetTagInfo, "GetTagInfo"}, + {14, &ISystem::GetRegisterInfo, "GetRegisterInfo"}, + {15, &ISystem::GetCommonInfo, "GetCommonInfo"}, + {16, &ISystem::GetModelInfo, "GetModelInfo"}, + {17, &ISystem::AttachActivateEvent, "AttachActivateEvent"}, + {18, &ISystem::AttachDeactivateEvent, "AttachDeactivateEvent"}, + {19, &ISystem::GetState, "GetState"}, + {20, &ISystem::GetDeviceState, "GetDeviceState"}, + {21, &ISystem::GetNpadId, "GetNpadId"}, + {23, &ISystem::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, + {25, &ISystem::StartDetection, "StartDetectionWithFilter"}, + {100, &ISystem::Format, "Format"}, + {101, &ISystem::GetAdminInfo, "GetAdminInfo"}, + {102, &ISystem::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"}, + {103, &ISystem::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"}, + {104, &ISystem::DeleteRegisterInfo, "DeleteRegisterInfo"}, + {105, &ISystem::DeleteApplicationArea, "DeleteApplicationArea"}, + {106, &ISystem::ExistsApplicationArea, "ExistsApplicationArea"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMapWithClass( - FunctionInfoTyped{0, &ISystem::InitializeSystem, "InitializeSystem"}, - FunctionInfoTyped{1, &ISystem::FinalizeSystem, "FinalizeSystem"}, - FunctionInfoTyped{2, &ISystem::ListDevices, "ListDevices"}, - FunctionInfoTyped{3, &ISystem::StartDetection, "StartDetection"}, - FunctionInfoTyped{4, &ISystem::StopDetection, "StopDetection"}, - FunctionInfoTyped{5, &ISystem::Mount, "Mount"}, - FunctionInfoTyped{6, &ISystem::Unmount, "Unmount"}, - FunctionInfoTyped{10, &ISystem::Flush, "Flush"}, - FunctionInfoTyped{11, &ISystem::Restore, "Restore"}, - FunctionInfoTyped{12, &ISystem::CreateApplicationArea, "CreateApplicationArea"}, - FunctionInfoTyped{13, &ISystem::GetTagInfo, "GetTagInfo"}, - FunctionInfoTyped{14, &ISystem::GetRegisterInfo, "GetRegisterInfo"}, - FunctionInfoTyped{15, &ISystem::GetCommonInfo, "GetCommonInfo"}, - FunctionInfoTyped{16, &ISystem::GetModelInfo, "GetModelInfo"}, - FunctionInfoTyped{17, &ISystem::AttachActivateEvent, "AttachActivateEvent"}, - FunctionInfoTyped{18, &ISystem::AttachDeactivateEvent, "AttachDeactivateEvent"}, - FunctionInfoTyped{19, &ISystem::GetState, "GetState"}, - FunctionInfoTyped{20, &ISystem::GetDeviceState, "GetDeviceState"}, - FunctionInfoTyped{21, &ISystem::GetNpadId, "GetNpadId"}, - FunctionInfoTyped{23, &ISystem::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - FunctionInfoTyped{25, &ISystem::StartDetection, "StartDetectionWithFilter"}, - FunctionInfoTyped{100, &ISystem::Format, "Format"}, - FunctionInfoTyped{101, &ISystem::GetAdminInfo, "GetAdminInfo"}, - FunctionInfoTyped{102, &ISystem::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"}, - FunctionInfoTyped{103, &ISystem::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"}, - FunctionInfoTyped{104, &ISystem::DeleteRegisterInfo, "DeleteRegisterInfo"}, - FunctionInfoTyped{105, &ISystem::DeleteApplicationArea, "DeleteApplicationArea"}, - FunctionInfoTyped{106, &ISystem::ExistsApplicationArea, "ExistsApplicationArea"} - ); }; class IDebug final : public Interface { public: - explicit IDebug(Core::System& system_) : Interface(system_, "NFP:IDebug") {} + explicit IDebug(Core::System& system_) : Interface(system_, "NFP:IDebug") { + // clang-format off + static const FunctionInfoTyped functions[] = { + {0, &IDebug::InitializeDebug, "InitializeDebug"}, + {1, &IDebug::FinalizeDebug, "FinalizeDebug"}, + {2, &IDebug::ListDevices, "ListDevices"}, + {3, &IDebug::StartDetection, "StartDetection"}, + {4, &IDebug::StopDetection, "StopDetection"}, + {5, &IDebug::Mount, "Mount"}, + {6, &IDebug::Unmount, "Unmount"}, + {7, &IDebug::OpenApplicationArea, "OpenApplicationArea"}, + {8, &IDebug::GetApplicationArea, "GetApplicationArea"}, + {9, &IDebug::SetApplicationArea, "SetApplicationArea"}, + {10, &IDebug::Flush, "Flush"}, + {11, &IDebug::Restore, "Restore"}, + {12, &IDebug::CreateApplicationArea, "CreateApplicationArea"}, + {13, &IDebug::GetTagInfo, "GetTagInfo"}, + {14, &IDebug::GetRegisterInfo, "GetRegisterInfo"}, + {15, &IDebug::GetCommonInfo, "GetCommonInfo"}, + {16, &IDebug::GetModelInfo, "GetModelInfo"}, + {17, &IDebug::AttachActivateEvent, "AttachActivateEvent"}, + {18, &IDebug::AttachDeactivateEvent, "AttachDeactivateEvent"}, + {19, &IDebug::GetState, "GetState"}, + {20, &IDebug::GetDeviceState, "GetDeviceState"}, + {21, &IDebug::GetNpadId, "GetNpadId"}, + {22, &IDebug::GetApplicationAreaSize, "GetApplicationAreaSize"}, + {23, &IDebug::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, + {24, &IDebug::RecreateApplicationArea, "RecreateApplicationArea"}, + {25, &IDebug::StartDetection, "StartDetectionWithFilter"}, + {100, &IDebug::Format, "Format"}, + {101, &IDebug::GetAdminInfo, "GetAdminInfo"}, + {102, &IDebug::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"}, + {103, &IDebug::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"}, + {104, &IDebug::DeleteRegisterInfo, "DeleteRegisterInfo"}, + {105, &IDebug::DeleteApplicationArea, "DeleteApplicationArea"}, + {106, &IDebug::ExistsApplicationArea, "ExistsApplicationArea"}, + {200, &IDebug::GetAll, "GetAll"}, + {201, &IDebug::SetAll, "SetAll"}, + {202, &IDebug::FlushDebug, "FlushDebug"}, + {203, &IDebug::BreakTag, "BreakTag"}, + {204, &IDebug::ReadBackupData, "ReadBackupData"}, + {205, &IDebug::WriteBackupData, "WriteBackupData"}, + {206, &IDebug::WriteNtf, "WriteNtf"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMapWithClass( - FunctionInfoTyped{0, &IDebug::InitializeDebug, "InitializeDebug"}, - FunctionInfoTyped{1, &IDebug::FinalizeDebug, "FinalizeDebug"}, - FunctionInfoTyped{2, &IDebug::ListDevices, "ListDevices"}, - FunctionInfoTyped{3, &IDebug::StartDetection, "StartDetection"}, - FunctionInfoTyped{4, &IDebug::StopDetection, "StopDetection"}, - FunctionInfoTyped{5, &IDebug::Mount, "Mount"}, - FunctionInfoTyped{6, &IDebug::Unmount, "Unmount"}, - FunctionInfoTyped{7, &IDebug::OpenApplicationArea, "OpenApplicationArea"}, - FunctionInfoTyped{8, &IDebug::GetApplicationArea, "GetApplicationArea"}, - FunctionInfoTyped{9, &IDebug::SetApplicationArea, "SetApplicationArea"}, - FunctionInfoTyped{10, &IDebug::Flush, "Flush"}, - FunctionInfoTyped{11, &IDebug::Restore, "Restore"}, - FunctionInfoTyped{12, &IDebug::CreateApplicationArea, "CreateApplicationArea"}, - FunctionInfoTyped{13, &IDebug::GetTagInfo, "GetTagInfo"}, - FunctionInfoTyped{14, &IDebug::GetRegisterInfo, "GetRegisterInfo"}, - FunctionInfoTyped{15, &IDebug::GetCommonInfo, "GetCommonInfo"}, - FunctionInfoTyped{16, &IDebug::GetModelInfo, "GetModelInfo"}, - FunctionInfoTyped{17, &IDebug::AttachActivateEvent, "AttachActivateEvent"}, - FunctionInfoTyped{18, &IDebug::AttachDeactivateEvent, "AttachDeactivateEvent"}, - FunctionInfoTyped{19, &IDebug::GetState, "GetState"}, - FunctionInfoTyped{20, &IDebug::GetDeviceState, "GetDeviceState"}, - FunctionInfoTyped{21, &IDebug::GetNpadId, "GetNpadId"}, - FunctionInfoTyped{22, &IDebug::GetApplicationAreaSize, "GetApplicationAreaSize"}, - FunctionInfoTyped{23, &IDebug::AttachAvailabilityChangeEvent, "AttachAvailabilityChangeEvent"}, - FunctionInfoTyped{24, &IDebug::RecreateApplicationArea, "RecreateApplicationArea"}, - FunctionInfoTyped{25, &IDebug::StartDetection, "StartDetectionWithFilter"}, - FunctionInfoTyped{100, &IDebug::Format, "Format"}, - FunctionInfoTyped{101, &IDebug::GetAdminInfo, "GetAdminInfo"}, - FunctionInfoTyped{102, &IDebug::GetRegisterInfoPrivate, "GetRegisterInfoPrivate"}, - FunctionInfoTyped{103, &IDebug::SetRegisterInfoPrivate, "SetRegisterInfoPrivate"}, - FunctionInfoTyped{104, &IDebug::DeleteRegisterInfo, "DeleteRegisterInfo"}, - FunctionInfoTyped{105, &IDebug::DeleteApplicationArea, "DeleteApplicationArea"}, - FunctionInfoTyped{106, &IDebug::ExistsApplicationArea, "ExistsApplicationArea"}, - FunctionInfoTyped{200, &IDebug::GetAll, "GetAll"}, - FunctionInfoTyped{201, &IDebug::SetAll, "SetAll"}, - FunctionInfoTyped{202, &IDebug::FlushDebug, "FlushDebug"}, - FunctionInfoTyped{203, &IDebug::BreakTag, "BreakTag"}, - FunctionInfoTyped{204, &IDebug::ReadBackupData, "ReadBackupData"}, - FunctionInfoTyped{205, &IDebug::WriteBackupData, "WriteBackupData"}, - FunctionInfoTyped{206, &IDebug::WriteNtf, "WriteNtf"} - ); }; class IUserManager final : public ServiceFramework { public: - explicit IUserManager(Core::System& system_) : ServiceFramework{system_, "nfp:user"} {} + explicit IUserManager(Core::System& system_) : ServiceFramework{system_, "nfp:user"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IUserManager::CreateUserInterface, "CreateUserInterface"}, + }; + // clang-format on + + RegisterHandlers(functions); + } private: void CreateUserInterface(HLERequestContext& ctx) { @@ -151,21 +162,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IUserManager::CreateUserInterface, "CreateUserInterface"} - ); }; class ISystemManager final : public ServiceFramework { public: - explicit ISystemManager(Core::System& system_) : ServiceFramework{system_, "nfp:sys"} {} + explicit ISystemManager(Core::System& system_) : ServiceFramework{system_, "nfp:sys"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &ISystemManager::CreateSystemInterface, "CreateSystemInterface"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -176,18 +184,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &ISystemManager::CreateSystemInterface, "CreateSystemInterface"} - ); }; class IDebugManager final : public ServiceFramework { public: - explicit IDebugManager(Core::System& system_) : ServiceFramework{system_, "nfp:dbg"} {} + explicit IDebugManager(Core::System& system_) : ServiceFramework{system_, "nfp:dbg"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IDebugManager::CreateDebugInterface, "CreateDebugInterface"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -198,10 +206,6 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IDebugManager::CreateDebugInterface, "CreateDebugInterface"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/nfp/nfp.h b/src/core/hle/service/nfp/nfp.h index a5aac710b5..e7af7ae39d 100644 --- a/src/core/hle/service/nfp/nfp.h +++ b/src/core/hle/service/nfp/nfp.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/nfp/nfp_interface.h b/src/core/hle/service/nfp/nfp_interface.h index fa985b068e..531db84652 100644 --- a/src/core/hle/service/nfp/nfp_interface.h +++ b/src/core/hle/service/nfp/nfp_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/nfp/nfp_result.h b/src/core/hle/service/nfp/nfp_result.h index 6185338438..528b5417fa 100644 --- a/src/core/hle/service/nfp/nfp_result.h +++ b/src/core/hle/service/nfp/nfp_result.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/nfp/nfp_types.h b/src/core/hle/service/nfp/nfp_types.h index 8330134d18..108548ea46 100644 --- a/src/core/hle/service/nfp/nfp_types.h +++ b/src/core/hle/service/nfp/nfp_types.h @@ -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-FileCopyrightText: Copyright 2022 yuzu Emulator Project diff --git a/src/core/hle/service/ngc/ngc.cpp b/src/core/hle/service/ngc/ngc.cpp index fb3ef39093..e79108a1eb 100644 --- a/src/core/hle/service/ngc/ngc.cpp +++ b/src/core/hle/service/ngc/ngc.cpp @@ -21,10 +21,15 @@ namespace Service::NGC { class IService final : public ServiceFramework { public: - explicit IService(Core::System& system_) : ServiceFramework{system_, "ngct:u"} {} + explicit IService(Core::System& system_) : ServiceFramework{system_, "ngct:u"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IService::Match, "Match"}, + {1, &IService::Filter, "Filter"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -56,19 +61,23 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IService::Match, "Match"}, - FunctionInfo{1, &IService::Filter, "Filter"} - ); }; class NgcServiceImpl final : public ServiceFramework { public: - explicit NgcServiceImpl(Core::System& system_) : ServiceFramework(system_, "ngc:u") {} + explicit NgcServiceImpl(Core::System& system_) : ServiceFramework(system_, "ngc:u") { + // clang-format off + static const FunctionInfo functions[] = { + {0, &NgcServiceImpl::GetContentVersion, "GetContentVersion"}, + {1, &NgcServiceImpl::Check, "Check"}, + {2, &NgcServiceImpl::Mask, "Mask"}, + {3, &NgcServiceImpl::Reload, "Reload"}, + {4, &NgcServiceImpl::Check, "Check2"}, + {5, &NgcServiceImpl::Mask, "Mask2"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -141,34 +150,25 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &NgcServiceImpl::GetContentVersion, "GetContentVersion"}, - FunctionInfo{1, &NgcServiceImpl::Check, "Check"}, - FunctionInfo{2, &NgcServiceImpl::Mask, "Mask"}, - FunctionInfo{3, &NgcServiceImpl::Reload, "Reload"}, - FunctionInfo{4, &NgcServiceImpl::Check, "Check2"}, - FunctionInfo{5, &NgcServiceImpl::Mask, "Mask2"} - ); }; class IServiceWithManagementApi final : public ServiceFramework { public: - explicit IServiceWithManagementApi(Core::System& system_) : ServiceFramework(system_, "ngct:s") {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Match"}, - FunctionInfo{1, nullptr, "Filter"}, - FunctionInfo{100, nullptr, "ConfigureAutoUpdateSetting"}, - FunctionInfo{101, nullptr, "RequestResourceUpdateCheck"}, - FunctionInfo{110, nullptr, "Reload"}, - FunctionInfo{111, nullptr, "IsReloadRequired"}, - FunctionInfo{112, nullptr, "TryAcquireReloadRequestNotifier"}, - FunctionInfo{120, nullptr, "CalculateContentFingerprint"}, - FunctionInfo{130, nullptr, "TryEnableTemporalPassThrough"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit IServiceWithManagementApi(Core::System& system_) : ServiceFramework(system_, "ngct:s") { + // clang-format off + static const FunctionInfo functions[] = { + {0 , nullptr, "Match"}, + {1 , nullptr, "Filter"}, + {100, nullptr, "ConfigureAutoUpdateSetting"}, + {101, nullptr, "RequestResourceUpdateCheck"}, + {110, nullptr, "Reload"}, + {111, nullptr, "IsReloadRequired"}, + {112, nullptr, "TryAcquireReloadRequestNotifier"}, + {120, nullptr, "CalculateContentFingerprint"}, + {130, nullptr, "TryEnableTemporalPassThrough"}, + }; + // clang-format on + RegisterHandlers(functions); } }; @@ -179,10 +179,20 @@ static_assert(sizeof(SaveDataHandle) == 0x08); class IUserShimScopedObject final : public ServiceFramework { public: - explicit IUserShimScopedObject(Core::System& system_) : ServiceFramework(system_, "IUserShimScopedObject") {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit IUserShimScopedObject(Core::System& system_) : ServiceFramework(system_, "IUserShimScopedObject") { + // clang-format off + static const FunctionInfo functions[] = { + {450, nullptr, "InitializeForSaveData"}, + {451, nullptr, "FinalizeForSaveData"}, + {452, D<&IUserShimScopedObject::OpenSaveData>, "OpenSaveData"}, + {453, nullptr, "CloseSaveData"}, + {454, D<&IUserShimScopedObject::ReadSaveSlot>, "ReadSaveSlot"}, + {455, D<&IUserShimScopedObject::WriteSaveSlot>, "WriteSaveSlot"}, + {456, nullptr, "FlushSaveSlot"}, + {457, nullptr, "CommitSaveData"}, + }; + // clang-format on + RegisterHandlers(functions); } Result OpenSaveData(Account::Uid unk0, Out unk1) { @@ -200,43 +210,42 @@ public: // to implement R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{450, nullptr, "InitializeForSaveData"}, - FunctionInfo{451, nullptr, "FinalizeForSaveData"}, - FunctionInfo{452, D<&IUserShimScopedObject::OpenSaveData>, "OpenSaveData"}, - FunctionInfo{453, nullptr, "CloseSaveData"}, - FunctionInfo{454, D<&IUserShimScopedObject::ReadSaveSlot>, "ReadSaveSlot"}, - FunctionInfo{455, D<&IUserShimScopedObject::WriteSaveSlot>, "WriteSaveSlot"}, - FunctionInfo{456, nullptr, "FlushSaveSlot"}, - FunctionInfo{457, nullptr, "CommitSaveData"} - ); }; class IUserService final : public ServiceFramework { public: - explicit IUserService(Core::System& system_) : ServiceFramework(system_, "stpl:u") {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit IUserService(Core::System& system_) : ServiceFramework(system_, "stpl:u") { + // clang-format off + static const FunctionInfo functions[] = { + {0 , D<&IUserService::Cmd0>, "Cmd0"}, + }; + // clang-format on + RegisterHandlers(functions); } Result Cmd0(u32 unk0, OutInterface out_interface) { LOG_WARNING(Service_NGC, "stubbed"); *out_interface = std::make_shared(system); R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IUserService::Cmd0>, "Cmd0"} - ); }; class ISystemShimScopedObject final : public ServiceFramework { public: - explicit ISystemShimScopedObject(Core::System& system_) : ServiceFramework(system_, "ISystemShimScopedObject") {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit ISystemShimScopedObject(Core::System& system_) : ServiceFramework(system_, "ISystemShimScopedObject") { + // clang-format off + static const FunctionInfo functions[] = { + {106, nullptr, "Cmd106"}, + {107, nullptr, "Cmd107"}, + {108, D<&ISystemShimScopedObject::Cmd108>, "Cmd108"}, + {207, nullptr, "Cmd207"}, + {208, D<&ISystemShimScopedObject::Cmd208>, "Cmd208"}, + {209, nullptr, "Cmd209"}, + {210, nullptr, "Cmd210"}, + {211, nullptr, "Cmd211"}, + {212, nullptr, "Cmd212"}, + }; + // clang-format on + RegisterHandlers(functions); } Result Cmd108() { @@ -248,36 +257,23 @@ public: LOG_WARNING(Service_NGC, "stubbed"); R_THROW(IPC::ResultNotSupported); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{106, nullptr, "Cmd106"}, - FunctionInfo{107, nullptr, "Cmd107"}, - FunctionInfo{108, D<&ISystemShimScopedObject::Cmd108>, "Cmd108"}, - FunctionInfo{207, nullptr, "Cmd207"}, - FunctionInfo{208, D<&ISystemShimScopedObject::Cmd208>, "Cmd208"}, - FunctionInfo{209, nullptr, "Cmd209"}, - FunctionInfo{210, nullptr, "Cmd210"}, - FunctionInfo{211, nullptr, "Cmd211"}, - FunctionInfo{212, nullptr, "Cmd212"} - ); }; class ISystemService final : public ServiceFramework { public: - explicit ISystemService(Core::System& system_) : ServiceFramework(system_, "stpl:sys") {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit ISystemService(Core::System& system_) : ServiceFramework(system_, "stpl:sys") { + // clang-format off + static const FunctionInfo functions[] = { + {0 , D<&ISystemService::Cmd0>, "Cmd0"}, + }; + // clang-format on + RegisterHandlers(functions); } Result Cmd0(OutInterface out_interface) { LOG_WARNING(Service_NGC, "stubbed"); *out_interface = std::make_shared(system); R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ISystemService::Cmd0>, "Cmd0"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/ngc/ngc.h b/src/core/hle/service/ngc/ngc.h index 823b1aa819..7dc4a46577 100644 --- a/src/core/hle/service/ngc/ngc.h +++ b/src/core/hle/service/ngc/ngc.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index 5befe8e943..efada9b807 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -235,6 +235,15 @@ public: explicit IScanRequest(Core::System& system_) : ServiceFramework{system_, "IScanRequest"}, svc_ctx{system_, "IScanRequest"} { + static const FunctionInfo functions[] = { + {0, &IScanRequest::Submit, "Submit"}, + {1, &IScanRequest::IsProcessing, "IsProcessing"}, + {2, &IScanRequest::GetResult, "GetResult"}, + {3, &IScanRequest::GetSystemEventReadableHandle, "GetSystemEventReadableHandle"}, + {4, &IScanRequest::SetChannels, "SetChannels"}, + }; + RegisterHandlers(functions); + evt_scan_complete = CreateKEvent(svc_ctx, "IScanRequest:Complete"); evt_processing = CreateKEvent(svc_ctx, "IScanRequest:Processing"); } @@ -248,6 +257,8 @@ public: } private: + std::vector scan_results; + void Submit(HLERequestContext& ctx) { if (state.load() == State::Finished) { @@ -318,17 +329,6 @@ private: evt_scan_complete->Signal(system.Kernel()); } - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IScanRequest::Submit, "Submit"}, - FunctionInfo{1, &IScanRequest::IsProcessing, "IsProcessing"}, - FunctionInfo{2, &IScanRequest::GetResult, "GetResult"}, - FunctionInfo{3, &IScanRequest::GetSystemEventReadableHandle, "GetSystemEventReadableHandle"}, - FunctionInfo{4, &IScanRequest::SetChannels, "SetChannels"} - ); - std::vector scan_results; KernelHelpers::ServiceContext svc_ctx; Kernel::KEvent* evt_scan_complete{}; @@ -342,6 +342,36 @@ class IRequest final : public ServiceFramework { public: explicit IRequest(Core::System& system_) : ServiceFramework{system_, "IRequest"}, service_context{system_, "IRequest"} { + static const FunctionInfo functions[] = { + {0, &IRequest::GetRequestState, "GetRequestState"}, + {1, &IRequest::GetResult, "GetResult"}, + {2, &IRequest::GetSystemEventReadableHandles, "GetSystemEventReadableHandles"}, + {3, &IRequest::Cancel, "Cancel"}, + {4, &IRequest::Submit, "Submit"}, + {5, nullptr, "SetRequirement"}, + {6, &IRequest::SetRequirementPreset, "SetRequirementPreset"}, + {8, nullptr, "SetPriority"}, + {9, &IRequest::SetNetworkProfileId, "SetNetworkProfileId"}, + {10, nullptr, "SetRejectable"}, + {11, &IRequest::SetConnectionConfirmationOption, "SetConnectionConfirmationOption"}, + {12, nullptr, "SetPersistent"}, + {13, nullptr, "SetInstant"}, + {14, nullptr, "SetSustainable"}, + {15, nullptr, "SetRawPriority"}, + {16, nullptr, "SetGreedy"}, + {17, nullptr, "SetSharable"}, + {18, nullptr, "SetRequirementByRevision"}, + {19, nullptr, "GetRequirement"}, + {20, nullptr, "GetRevision"}, + {21, &IRequest::GetAppletInfo, "GetAppletInfo"}, + {22, nullptr, "GetAdditionalInfo"}, + {23, nullptr, "SetKeptInSleep"}, + {24, nullptr, "RegisterSocketDescriptor"}, + {25, nullptr, "UnregisterSocketDescriptor"}, + {26, nullptr, "GetNetworkAccessStatus"}, //21.0.0+ + }; + RegisterHandlers(functions); + event1 = CreateKEvent(service_context, "IRequest:Event1"); event2 = CreateKEvent(service_context, "IRequest:Event2"); state = RequestState::NotSubmitted; @@ -464,37 +494,6 @@ private: event1->Signal(system.Kernel()); } - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IRequest::GetRequestState, "GetRequestState"}, - FunctionInfo{1, &IRequest::GetResult, "GetResult"}, - FunctionInfo{2, &IRequest::GetSystemEventReadableHandles, "GetSystemEventReadableHandles"}, - FunctionInfo{3, &IRequest::Cancel, "Cancel"}, - FunctionInfo{4, &IRequest::Submit, "Submit"}, - FunctionInfo{5, nullptr, "SetRequirement"}, - FunctionInfo{6, &IRequest::SetRequirementPreset, "SetRequirementPreset"}, - FunctionInfo{8, nullptr, "SetPriority"}, - FunctionInfo{9, &IRequest::SetNetworkProfileId, "SetNetworkProfileId"}, - FunctionInfo{10, nullptr, "SetRejectable"}, - FunctionInfo{11, &IRequest::SetConnectionConfirmationOption, "SetConnectionConfirmationOption"}, - FunctionInfo{12, nullptr, "SetPersistent"}, - FunctionInfo{13, nullptr, "SetInstant"}, - FunctionInfo{14, nullptr, "SetSustainable"}, - FunctionInfo{15, nullptr, "SetRawPriority"}, - FunctionInfo{16, nullptr, "SetGreedy"}, - FunctionInfo{17, nullptr, "SetSharable"}, - FunctionInfo{18, nullptr, "SetRequirementByRevision"}, - FunctionInfo{19, nullptr, "GetRequirement"}, - FunctionInfo{20, nullptr, "GetRevision"}, - FunctionInfo{21, &IRequest::GetAppletInfo, "GetAppletInfo"}, - FunctionInfo{22, nullptr, "GetAdditionalInfo"}, - FunctionInfo{23, nullptr, "SetKeptInSleep"}, - FunctionInfo{24, nullptr, "RegisterSocketDescriptor"}, - FunctionInfo{25, nullptr, "UnregisterSocketDescriptor"}, - FunctionInfo{26, nullptr, "GetNetworkAccessStatus", MakeVersionGate({21,0,0})} - ); KernelHelpers::ServiceContext service_context; RequestState state; @@ -509,16 +508,14 @@ private: class INetworkProfile final : public ServiceFramework { public: - explicit INetworkProfile(Core::System& system_) : ServiceFramework{system_, "INetworkProfile"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit INetworkProfile(Core::System& system_) : ServiceFramework{system_, "INetworkProfile"} { + static const FunctionInfo functions[] = { + {0, nullptr, "Update"}, + {1, nullptr, "PersistOld"}, + {2, nullptr, "Persist"}, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Update"}, - FunctionInfo{1, nullptr, "PersistOld"}, - FunctionInfo{2, nullptr, "Persist"} - ); }; void IGeneralService::GetClientId(HLERequestContext& ctx) { @@ -1053,70 +1050,78 @@ void IGeneralService::GetCurrentAccessPoint(HLERequestContext& ctx) { rb.Push(ResultSuccess); } -std::optional IGeneralService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, &IGeneralService::GetClientId, "GetClientId"}, - FunctionInfo{2, &IGeneralService::CreateScanRequest, "CreateScanRequest"}, - FunctionInfo{4, &IGeneralService::CreateRequest, "CreateRequest"}, - FunctionInfo{5, &IGeneralService::GetCurrentNetworkProfile, "GetCurrentNetworkProfile"}, - FunctionInfo{6, &IGeneralService::EnumerateNetworkInterfaces, "EnumerateNetworkInterfaces"}, - FunctionInfo{7, &IGeneralService::EnumerateNetworkProfiles, "EnumerateNetworkProfiles"}, - FunctionInfo{8, &IGeneralService::GetNetworkProfile, "GetNetworkProfile"}, - FunctionInfo{9, &IGeneralService::SetNetworkProfile, "SetNetworkProfile"}, - FunctionInfo{10, &IGeneralService::RemoveNetworkProfile, "RemoveNetworkProfile"}, - FunctionInfo{11, &IGeneralService::GetScanData, "GetScanDataOld"}, - FunctionInfo{12, &IGeneralService::GetCurrentIpAddress, "GetCurrentIpAddress"}, - FunctionInfo{13, nullptr, "GetCurrentAccessPointOld"}, - FunctionInfo{14, &IGeneralService::CreateTemporaryNetworkProfile, "CreateTemporaryNetworkProfile"}, - FunctionInfo{15, &IGeneralService::GetCurrentIpConfigInfo, "GetCurrentIpConfigInfo"}, - FunctionInfo{16, &IGeneralService::SetWirelessCommunicationEnabled, "SetWirelessCommunicationEnabled"}, - FunctionInfo{17, &IGeneralService::IsWirelessCommunicationEnabled, "IsWirelessCommunicationEnabled"}, - FunctionInfo{18, &IGeneralService::GetInternetConnectionStatus, "GetInternetConnectionStatus"}, - FunctionInfo{19, &IGeneralService::SetEthernetCommunicationEnabled, "SetEthernetCommunicationEnabled"}, - FunctionInfo{20, &IGeneralService::IsEthernetCommunicationEnabled, "IsEthernetCommunicationEnabled"}, - FunctionInfo{21, &IGeneralService::IsAnyInternetRequestAccepted, "IsAnyInternetRequestAccepted"}, - FunctionInfo{22, &IGeneralService::IsAnyForegroundRequestAccepted, "IsAnyForegroundRequestAccepted"}, - FunctionInfo{23, nullptr, "PutToSleep"}, - FunctionInfo{24, nullptr, "WakeUp"}, - FunctionInfo{25, &IGeneralService::GetSsidListVersion, "GetSsidListVersion"}, - FunctionInfo{26, nullptr, "SetExclusiveClient"}, - FunctionInfo{27, nullptr, "GetDefaultIpSetting"}, - FunctionInfo{28, nullptr, "SetDefaultIpSetting"}, - FunctionInfo{29, nullptr, "SetWirelessCommunicationEnabledForTest"}, - FunctionInfo{30, nullptr, "SetEthernetCommunicationEnabledForTest"}, - FunctionInfo{31, nullptr, "GetTelemetorySystemEventReadableHandle"}, - FunctionInfo{32, nullptr, "GetTelemetryInfo"}, - FunctionInfo{33, &IGeneralService::ConfirmSystemAvailability, "ConfirmSystemAvailability", MakeVersionGate({2,0,0})}, - FunctionInfo{34, &IGeneralService::SetBackgroundRequestEnabled, "SetBackgroundRequestEnabled", MakeVersionGate({4,0,0})}, - FunctionInfo{35, &IGeneralService::GetScanDataV2, "GetScanData"}, - FunctionInfo{36, &IGeneralService::GetCurrentAccessPoint, "GetCurrentAccessPoint"}, - FunctionInfo{37, nullptr, "Shutdown"}, - FunctionInfo{38, nullptr, "GetAllowedChannels"}, - FunctionInfo{39, nullptr, "NotifyApplicationSuspended"}, - FunctionInfo{40, nullptr, "SetAcceptableNetworkTypeFlag"}, - FunctionInfo{41, nullptr, "GetAcceptableNetworkTypeFlag"}, - FunctionInfo{42, nullptr, "NotifyConnectionStateChanged"}, - FunctionInfo{43, nullptr, "SetWowlDelayedWakeTime"}, - FunctionInfo{44, nullptr, "IsWiredConnectionAvailable", MakeVersionGate({18,0,0})}, - FunctionInfo{45, nullptr, "IsNetworkEmulationFeatureEnabled", MakeVersionGate({18,0,0})}, - FunctionInfo{46, nullptr, "SelectActiveNetworkEmulationProfileIdForDebug", MakeVersionGate({18,0,0})}, - FunctionInfo{47, &IGeneralService::GetScanDataV3, "GetScanData", MakeVersionGate({19,0,0})}, - FunctionInfo{50, nullptr, "IsRewriteFeatureEnabled", MakeVersionGate({18,0,0})}, - FunctionInfo{51, nullptr, "CreateRewriteRule", MakeVersionGate({18,0,0})}, - FunctionInfo{52, nullptr, "DestroyRewriteRule", MakeVersionGate({18,0,0})} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IGeneralService::IGeneralService(Core::System& system_) : ServiceFramework{system_, "IGeneralService"} { + // clang-format off + + static const FunctionInfo functions[] = { + {1, &IGeneralService::GetClientId, "GetClientId"}, + {2, &IGeneralService::CreateScanRequest, "CreateScanRequest"}, + {4, &IGeneralService::CreateRequest, "CreateRequest"}, + {5, &IGeneralService::GetCurrentNetworkProfile, "GetCurrentNetworkProfile"}, + {6, &IGeneralService::EnumerateNetworkInterfaces, "EnumerateNetworkInterfaces"}, + {7, &IGeneralService::EnumerateNetworkProfiles, "EnumerateNetworkProfiles"}, + {8, &IGeneralService::GetNetworkProfile, "GetNetworkProfile"}, + {9, &IGeneralService::SetNetworkProfile, "SetNetworkProfile"}, + {10, &IGeneralService::RemoveNetworkProfile, "RemoveNetworkProfile"}, + {11, &IGeneralService::GetScanData, "GetScanDataOld"}, + {12, &IGeneralService::GetCurrentIpAddress, "GetCurrentIpAddress"}, + {13, nullptr, "GetCurrentAccessPointOld"}, + {14, &IGeneralService::CreateTemporaryNetworkProfile, "CreateTemporaryNetworkProfile"}, + {15, &IGeneralService::GetCurrentIpConfigInfo, "GetCurrentIpConfigInfo"}, + {16, &IGeneralService::SetWirelessCommunicationEnabled, "SetWirelessCommunicationEnabled"}, + {17, &IGeneralService::IsWirelessCommunicationEnabled, "IsWirelessCommunicationEnabled"}, + {18, &IGeneralService::GetInternetConnectionStatus, "GetInternetConnectionStatus"}, + {19, &IGeneralService::SetEthernetCommunicationEnabled, "SetEthernetCommunicationEnabled"}, + {20, &IGeneralService::IsEthernetCommunicationEnabled, "IsEthernetCommunicationEnabled"}, + {21, &IGeneralService::IsAnyInternetRequestAccepted, "IsAnyInternetRequestAccepted"}, + {22, &IGeneralService::IsAnyForegroundRequestAccepted, "IsAnyForegroundRequestAccepted"}, + {23, nullptr, "PutToSleep"}, + {24, nullptr, "WakeUp"}, + {25, &IGeneralService::GetSsidListVersion, "GetSsidListVersion"}, + {26, nullptr, "SetExclusiveClient"}, + {27, nullptr, "GetDefaultIpSetting"}, + {28, nullptr, "SetDefaultIpSetting"}, + {29, nullptr, "SetWirelessCommunicationEnabledForTest"}, + {30, nullptr, "SetEthernetCommunicationEnabledForTest"}, + {31, nullptr, "GetTelemetorySystemEventReadableHandle"}, + {32, nullptr, "GetTelemetryInfo"}, + {33, &IGeneralService::ConfirmSystemAvailability, "ConfirmSystemAvailability"}, // 2.0.0+ + {34, &IGeneralService::SetBackgroundRequestEnabled, "SetBackgroundRequestEnabled"}, // 4.0.0+ + {35, &IGeneralService::GetScanDataV2, "GetScanData"}, + {36, &IGeneralService::GetCurrentAccessPoint, "GetCurrentAccessPoint"}, + {37, nullptr, "Shutdown"}, + {38, nullptr, "GetAllowedChannels"}, + {39, nullptr, "NotifyApplicationSuspended"}, + {40, nullptr, "SetAcceptableNetworkTypeFlag"}, + {41, nullptr, "GetAcceptableNetworkTypeFlag"}, + {42, nullptr, "NotifyConnectionStateChanged"}, + {43, nullptr, "SetWowlDelayedWakeTime"}, + {44, nullptr, "IsWiredConnectionAvailable"}, // 18.0.0+ + {45, nullptr, "IsNetworkEmulationFeatureEnabled"}, // 18.0.0+ + {46, nullptr, "SelectActiveNetworkEmulationProfileIdForDebug"}, // 18.0.0+ + {47, &IGeneralService::GetScanDataV3, "GetScanData"}, // 19.0.0+ + {50, nullptr, "IsRewriteFeatureEnabled"}, // 18.0.0+ + {51, nullptr, "CreateRewriteRule"}, // 18.0.0+ + {52, nullptr, "DestroyRewriteRule"} // 18.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); } IGeneralService::~IGeneralService() = default; class NetworkInterface final : public ServiceFramework { public: - explicit NetworkInterface(const char* name, Core::System& system_) : ServiceFramework{system_, name} {} + explicit NetworkInterface(const char* name, Core::System& system_) + : ServiceFramework{system_, name} { + static const FunctionInfo functions[] = { + {4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"}, + {5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"}, + }; + RegisterHandlers(functions); + } private: void CreateGeneralServiceOld(HLERequestContext& ctx) { @@ -1134,14 +1139,6 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"}, - FunctionInfo{5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/nifm/nifm.h b/src/core/hle/service/nifm/nifm.h index 3f3535fa93..44859e0c51 100644 --- a/src/core/hle/service/nifm/nifm.h +++ b/src/core/hle/service/nifm/nifm.h @@ -51,7 +51,6 @@ private: void SetBackgroundRequestEnabled(HLERequestContext& ctx); void GetCurrentAccessPoint(HLERequestContext& ctx); void GetScanDataV3(HLERequestContext& ctx); - std::optional FindRequest(u32 key) override; }; } // namespace Service::NIFM diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp index c48bf54646..e5f2d85dde 100644 --- a/src/core/hle/service/nim/nim.cpp +++ b/src/core/hle/service/nim/nim.cpp @@ -24,13 +24,22 @@ namespace Service::NIM { class IShopServiceAsync final : public ServiceFramework { public: explicit IShopServiceAsync(Core::System& system_) - : ServiceFramework{system_, "IShopServiceAsync"} - , service_context{system_, "IShopServiceAsync"} { - completion_event = service_context.CreateEvent("IShopServiceAsync:Completion"); - } + : ServiceFramework{system_, "IShopServiceAsync"}, + service_context{system_, "IShopServiceAsync"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IShopServiceAsync::Cancel>, "Cancel"}, + {1, D<&IShopServiceAsync::GetSize>, "GetSize"}, + {2, D<&IShopServiceAsync::Read>, "Read"}, + {3, D<&IShopServiceAsync::GetErrorCode>, "GetErrorCode"}, + {4, D<&IShopServiceAsync::Request>, "Request"}, + {5, D<&IShopServiceAsync::Prepare>, "Prepare"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + completion_event = service_context.CreateEvent("IShopServiceAsync:Completion"); } ~IShopServiceAsync() override { @@ -43,6 +52,15 @@ public: } private: + KernelHelpers::ServiceContext service_context; + Kernel::KEvent* completion_event; + + std::jthread worker; + std::atomic error_code{0}; + + std::mutex data_mutex; + std::vector download_data; + void CancelImpl() { worker.request_stop(); if (worker.joinable()) { @@ -118,30 +136,19 @@ private: } R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IShopServiceAsync::Cancel>, "Cancel"}, - FunctionInfo{1, D<&IShopServiceAsync::GetSize>, "GetSize"}, - FunctionInfo{2, D<&IShopServiceAsync::Read>, "Read"}, - FunctionInfo{3, D<&IShopServiceAsync::GetErrorCode>, "GetErrorCode"}, - FunctionInfo{4, D<&IShopServiceAsync::Request>, "Request"}, - FunctionInfo{5, D<&IShopServiceAsync::Prepare>, "Prepare"} - ); - KernelHelpers::ServiceContext service_context; - Kernel::KEvent* completion_event; - std::jthread worker; - std::atomic error_code{0}; - std::mutex data_mutex; - std::vector download_data; }; class IShopServiceAccessor final : public ServiceFramework { public: explicit IShopServiceAccessor(Core::System& system_) - : ServiceFramework{system_, "IShopServiceAccessor"} {} + : ServiceFramework{system_, "IShopServiceAccessor"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IShopServiceAccessor::CreateAsyncInterface, "CreateAsyncInterface"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -153,19 +160,19 @@ private: rb.PushCopyObjects(ctx, async_interface->GetEvent()); rb.PushIpcInterface(ctx, std::move(async_interface)); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IShopServiceAccessor::CreateAsyncInterface, "CreateAsyncInterface"} - ); }; class IShopServiceAccessServer final : public ServiceFramework { public: explicit IShopServiceAccessServer(Core::System& system_) - : ServiceFramework{system_, "IShopServiceAccessServer"} {} + : ServiceFramework{system_, "IShopServiceAccessServer"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IShopServiceAccessServer::CreateAccessorInterface, "CreateAccessorInterface"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -175,252 +182,258 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IShopServiceAccessServer::CreateAccessorInterface, "CreateAccessorInterface"} - ); }; class NIM final : public ServiceFramework { public: - explicit NIM(Core::System& system_) : ServiceFramework{system_, "nim"} {} + explicit NIM(Core::System& system_) : ServiceFramework{system_, "nim"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "CreateSystemUpdateTask"}, + {1, nullptr, "DestroySystemUpdateTask"}, + {2, nullptr, "ListSystemUpdateTask"}, + {3, nullptr, "RequestSystemUpdateTaskRun"}, + {4, nullptr, "GetSystemUpdateTaskInfo"}, + {5, nullptr, "CommitSystemUpdateTask"}, + {6, nullptr, "CreateNetworkInstallTask"}, + {7, nullptr, "DestroyNetworkInstallTask"}, + {8, nullptr, "ListNetworkInstallTask"}, + {9, nullptr, "RequestNetworkInstallTaskRun"}, + {10, nullptr, "GetNetworkInstallTaskInfo"}, + {11, nullptr, "CommitNetworkInstallTask"}, + {12, nullptr, "RequestLatestSystemUpdateMeta"}, + {14, nullptr, "ListApplicationNetworkInstallTask"}, + {15, nullptr, "ListNetworkInstallTaskContentMeta"}, + {16, nullptr, "RequestLatestVersion"}, + {17, nullptr, "SetNetworkInstallTaskAttribute"}, + {18, nullptr, "AddNetworkInstallTaskContentMeta"}, + {19, nullptr, "GetDownloadedSystemDataPath"}, + {20, nullptr, "CalculateNetworkInstallTaskRequiredSize"}, + {21, nullptr, "IsExFatDriverIncluded"}, + {22, nullptr, "GetBackgroundDownloadStressTaskInfo"}, + {23, nullptr, "RequestDeviceAuthenticationToken"}, + {24, nullptr, "RequestGameCardRegistrationStatus"}, + {25, nullptr, "RequestRegisterGameCard"}, + {26, nullptr, "RequestRegisterNotificationToken"}, + {27, nullptr, "RequestDownloadTaskList"}, + {28, nullptr, "RequestApplicationControl"}, + {29, nullptr, "RequestLatestApplicationControl"}, + {30, nullptr, "RequestVersionList"}, + {31, nullptr, "CreateApplyDeltaTask"}, + {32, nullptr, "DestroyApplyDeltaTask"}, + {33, nullptr, "ListApplicationApplyDeltaTask"}, + {34, nullptr, "RequestApplyDeltaTaskRun"}, + {35, nullptr, "GetApplyDeltaTaskInfo"}, + {36, nullptr, "ListApplyDeltaTask"}, + {37, nullptr, "CommitApplyDeltaTask"}, + {38, nullptr, "CalculateApplyDeltaTaskRequiredSize"}, + {39, nullptr, "PrepareShutdown"}, + {40, nullptr, "ListApplyDeltaTask"}, + {41, nullptr, "ClearNotEnoughSpaceStateOfApplyDeltaTask"}, + {42, nullptr, "CreateApplyDeltaTaskFromDownloadTask"}, + {43, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"}, + {44, nullptr, "GetApplyDeltaTaskRequiredStorage"}, + {45, nullptr, "CalculateNetworkInstallTaskContentsSize"}, + {46, nullptr, "PrepareShutdownForSystemUpdate"}, + {47, nullptr, "FindMaxRequiredApplicationVersionOfTask"}, + {48, nullptr, "CommitNetworkInstallTaskPartially"}, + {49, nullptr, "ListNetworkInstallTaskCommittedContentMeta"}, + {50, nullptr, "ListNetworkInstallTaskNotCommittedContentMeta"}, + {51, nullptr, "FindMaxRequiredSystemVersionOfTask"}, + {52, nullptr, "GetNetworkInstallTaskErrorContext"}, + {53, nullptr, "CreateLocalCommunicationReceiveApplicationTask"}, + {54, nullptr, "DestroyLocalCommunicationReceiveApplicationTask"}, + {55, nullptr, "ListLocalCommunicationReceiveApplicationTask"}, + {56, nullptr, "RequestLocalCommunicationReceiveApplicationTaskRun"}, + {57, nullptr, "GetLocalCommunicationReceiveApplicationTaskInfo"}, + {58, nullptr, "CommitLocalCommunicationReceiveApplicationTask"}, + {59, nullptr, "ListLocalCommunicationReceiveApplicationTaskContentMeta"}, + {60, nullptr, "CreateLocalCommunicationSendApplicationTask"}, + {61, nullptr, "RequestLocalCommunicationSendApplicationTaskRun"}, + {62, nullptr, "GetLocalCommunicationReceiveApplicationTaskErrorContext"}, + {63, nullptr, "GetLocalCommunicationSendApplicationTaskInfo"}, + {64, nullptr, "DestroyLocalCommunicationSendApplicationTask"}, + {65, nullptr, "GetLocalCommunicationSendApplicationTaskErrorContext"}, + {66, nullptr, "CalculateLocalCommunicationReceiveApplicationTaskRequiredSize"}, + {67, nullptr, "ListApplicationLocalCommunicationReceiveApplicationTask"}, + {68, nullptr, "ListApplicationLocalCommunicationSendApplicationTask"}, + {69, nullptr, "CreateLocalCommunicationReceiveSystemUpdateTask"}, + {70, nullptr, "DestroyLocalCommunicationReceiveSystemUpdateTask"}, + {71, nullptr, "ListLocalCommunicationReceiveSystemUpdateTask"}, + {72, nullptr, "RequestLocalCommunicationReceiveSystemUpdateTaskRun"}, + {73, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskInfo"}, + {74, nullptr, "CommitLocalCommunicationReceiveSystemUpdateTask"}, + {75, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskErrorContext"}, + {76, nullptr, "CreateLocalCommunicationSendSystemUpdateTask"}, + {77, nullptr, "RequestLocalCommunicationSendSystemUpdateTaskRun"}, + {78, nullptr, "GetLocalCommunicationSendSystemUpdateTaskInfo"}, + {79, nullptr, "DestroyLocalCommunicationSendSystemUpdateTask"}, + {80, nullptr, "GetLocalCommunicationSendSystemUpdateTaskErrorContext"}, + {81, nullptr, "ListLocalCommunicationSendSystemUpdateTask"}, + {82, nullptr, "GetReceivedSystemDataPath"}, + {83, nullptr, "CalculateApplyDeltaTaskOccupiedSize"}, + {84, nullptr, "ReloadErrorSimulation"}, + {85, nullptr, "ListNetworkInstallTaskContentMetaFromInstallMeta"}, + {86, nullptr, "ListNetworkInstallTaskOccupiedSize"}, + {87, nullptr, "RequestQueryAvailableELicenses"}, + {88, nullptr, "RequestAssignELicenses"}, + {89, nullptr, "RequestExtendELicenses"}, + {90, nullptr, "RequestSyncELicenses"}, + {91, nullptr, "Unknown91"}, //6.0.0-14.1.2 + {92, nullptr, "Unknown92"}, //21.0.0+ + {93, nullptr, "RequestReportActiveELicenses"}, + {94, nullptr, "RequestReportActiveELicensesPassively"}, + {95, nullptr, "RequestRegisterDynamicRightsNotificationToken"}, + {96, nullptr, "RequestAssignAllDeviceLinkedELicenses"}, + {97, nullptr, "RequestRevokeAllELicenses"}, + {98, nullptr, "RequestPrefetchForDynamicRights"}, + {99, nullptr, "CreateNetworkInstallTask"}, + {100, nullptr, "ListNetworkInstallTaskRightsIds"}, + {101, nullptr, "RequestDownloadETickets"}, + {102, nullptr, "RequestQueryDownloadableContents"}, + {103, nullptr, "DeleteNetworkInstallTaskContentMeta"}, + {104, nullptr, "RequestIssueEdgeTokenForDebug"}, + {105, nullptr, "RequestQueryAvailableELicenses2"}, + {106, nullptr, "RequestAssignELicenses2"}, + {107, nullptr, "GetNetworkInstallTaskStateCounter"}, + {108, nullptr, "InvalidateDynamicRightsNaIdTokenCacheForDebug"}, + {109, nullptr, "ListNetworkInstallTaskPartialInstallContentMeta"}, + {110, nullptr, "ListNetworkInstallTaskRightsIdsFromIndex"}, + {111, nullptr, "AddNetworkInstallTaskContentMetaForUser"}, + {112, nullptr, "RequestAssignELicensesAndDownloadETickets"}, + {113, nullptr, "RequestQueryAvailableCommonELicenses"}, + {114, nullptr, "SetNetworkInstallTaskExtendedAttribute"}, + {115, nullptr, "GetNetworkInstallTaskExtendedAttribute"}, + {116, nullptr, "GetAllocatorInfo"}, + {117, nullptr, "RequestQueryDownloadableContentsByApplicationId"}, + {118, nullptr, "MarkNoDownloadRightsErrorResolved"}, + {119, nullptr, "GetApplyDeltaTaskAllAppliedContentMeta"}, + {120, nullptr, "PrioritizeNetworkInstallTask"}, + {121, nullptr, "RequestQueryAvailableCommonELicenses2"}, + {122, nullptr, "RequestAssignCommonELicenses"}, + {123, nullptr, "RequestAssignCommonELicenses2"}, + {124, nullptr, "IsNetworkInstallTaskFrontOfQueue"}, + {125, nullptr, "PrioritizeApplyDeltaTask"}, + {126, nullptr, "RerouteDownloadingPatch"}, + {127, nullptr, "UnmarkNoDownloadRightsErrorResolved"}, + {128, nullptr, "RequestContentsSize"}, + {129, nullptr, "RequestContentsAuthorizationToken"}, + {130, nullptr, "RequestCdnVendorDiscovery"}, + {131, nullptr, "RefreshDebugAvailability"}, + {132, nullptr, "ClearResponseSimulationEntry"}, + {133, nullptr, "RegisterResponseSimulationEntry"}, + {134, nullptr, "GetProcessedCdnVendors"}, + {135, nullptr, "RefreshRuntimeBehaviorsForDebug"}, + {136, nullptr, "RequestOnlineSubscriptionFreeTrialAvailability"}, + {137, nullptr, "GetNetworkInstallTaskContentMetaCount"}, + {138, nullptr, "RequestRevokeELicenses"}, + {139, nullptr, "EnableNetworkConnectionToUseApplicationCore"}, + {140, nullptr, "DisableNetworkConnectionToUseApplicationCore"}, + {141, nullptr, "IsNetworkConnectionEnabledToUseApplicationCore"}, + {142, nullptr, "RequestCheckSafeSystemVersion"}, + {143, nullptr, "RequestApplicationIcon"}, + {144, nullptr, "RequestDownloadIdbeIconFile"}, + {147, nullptr, "Unknown147"}, //18.0.0+ + {148, nullptr, "Unknown148"}, //18.0.0+ + {150, nullptr, "Unknown150"}, //19.0.0+ + {151, nullptr, "Unknown151"}, //20.0.0+ + {152, nullptr, "Unknown152"}, //20.0.0+ + {153, nullptr, "Unknown153"}, //20.0.0+ + {154, nullptr, "Unknown154"}, //20.0.0+ + {155, nullptr, "Unknown155"}, //20.0.0+ + {156, nullptr, "Unknown156"}, //20.0.0+ + {157, nullptr, "Unknown157"}, //20.0.0+ + {158, nullptr, "Unknown158"}, //20.0.0+ + {159, nullptr, "Unknown159"}, //20.0.0+ + {160, nullptr, "Unknown160"}, //20.0.0+ + {161, nullptr, "Unknown161"}, //20.0.0+ + {162, nullptr, "Unknown162"}, //20.0.0+ + {163, nullptr, "Unknown163"}, //20.0.0+ + {164, nullptr, "Unknown164"}, //20.0.0+ + {165, nullptr, "Unknown165"}, //20.0.0+ + {166, nullptr, "Unknown166"}, //20.0.0+ + {167, nullptr, "Unknown167"}, //20.0.0+ + {168, nullptr, "Unknown168"}, //20.0.0+ + {169, nullptr, "Unknown169"}, //20.0.0+ + {170, nullptr, "Unknown170"}, //20.0.0+ + {171, nullptr, "Unknown171"}, //20.0.0+ + {172, nullptr, "Unknown172"}, //20.0.0+ + {173, nullptr, "Unknown173"}, //20.0.0+ + {174, nullptr, "Unknown174"}, //20.0.0+ + {175, nullptr, "Unknown175"}, //20.0.0+ + {176, nullptr, "Unknown176"}, //20.0.0+ + {177, nullptr, "Unknown177"}, //20.0.0+ + {2000, nullptr, "Unknown2000"}, //20.0.0+ + {2001, nullptr, "Unknown2001"}, //20.0.0+ + {2002, nullptr, "Unknown2002"}, //20.0.0+ + {2003, nullptr, "Unknown2003"}, //20.0.0+ + {2004, nullptr, "Unknown2004"}, //20.0.0+ + {2007, nullptr, "Unknown2007"}, //20.0.0+ + {2011, nullptr, "Unknown2011"}, //20.0.0+ + {2012, nullptr, "Unknown2012"}, //20.0.0+ + {2013, nullptr, "Unknown2013"}, //20.0.0+ + {2014, nullptr, "Unknown2014"}, //20.0.0+ + {2015, nullptr, "Unknown2015"}, //20.0.0+ + {2016, nullptr, "Unknown2016"}, //20.0.0+ + {2017, nullptr, "Unknown2017"}, //20.0.0+ + {2018, nullptr, "Unknown2018"}, //20.0.0+ + {2019, nullptr, "Unknown2019"}, //20.0.0+ + {2020, nullptr, "Unknown2020"}, //20.0.0+ + {2021, nullptr, "Unknown2021"}, //20.0.0+ + {2022, nullptr, "Unknown2022"}, //20.0.0+ + {2023, nullptr, "Unknown2023"}, //20.0.0+ + {2024, nullptr, "Unknown2024"}, //20.0.0+ + {2025, nullptr, "Unknown2025"}, //20.0.0+ + {2026, nullptr, "Unknown2026"}, //20.0.0+ + {2027, nullptr, "Unknown2027"}, //20.0.0+ + {2028, nullptr, "Unknown2028"}, //20.0.0+ + {2029, nullptr, "Unknown2029"}, //20.0.0+ + {2030, nullptr, "Unknown2030"}, //20.0.0+ + {2031, nullptr, "Unknown2031"}, //20.0.0+ + {2032, nullptr, "Unknown2032"}, //20.0.0+ + {2033, nullptr, "Unknown2033"}, //20.0.0+ + {2034, nullptr, "Unknown2034"}, //20.0.0+ + {2035, nullptr, "Unknown2035"}, //20.0.0+ + {2036, nullptr, "Unknown2036"}, //20.0.0+ + {2037, nullptr, "Unknown2037"}, //20.0.0+ + {2038, nullptr, "Unknown2038"}, //20.0.0+ + {2039, nullptr, "Unknown2039"}, //20.0.0+ + {2040, nullptr, "Unknown2040"}, //20.0.0+ + {2041, nullptr, "Unknown2041"}, //20.0.0+ + {2042, nullptr, "Unknown2042"}, //20.0.0+ + {2043, nullptr, "Unknown2043"}, //20.0.0+ + {2044, nullptr, "Unknown2044"}, //20.0.0+ + {2045, nullptr, "Unknown2045"}, //20.0.0+ + {2046, nullptr, "Unknown2046"}, //20.0.0+ + {2047, nullptr, "Unknown2047"}, //20.0.0+ + {2048, nullptr, "Unknown2048"}, //20.0.0+ + {2049, nullptr, "Unknown2049"}, //20.0.0+ + {2050, nullptr, "Unknown2050"}, //20.0.0+ + {2051, nullptr, "Unknown2051"}, //20.0.0+ + {3000, nullptr, "RequestLatestApplicationIcon"}, //17.0.0+ + {3001, nullptr, "RequestDownloadIdbeLatestIconFile"}, //17.0.0+ + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateSystemUpdateTask"}, - FunctionInfo{1, nullptr, "DestroySystemUpdateTask"}, - FunctionInfo{2, nullptr, "ListSystemUpdateTask"}, - FunctionInfo{3, nullptr, "RequestSystemUpdateTaskRun"}, - FunctionInfo{4, nullptr, "GetSystemUpdateTaskInfo"}, - FunctionInfo{5, nullptr, "CommitSystemUpdateTask"}, - FunctionInfo{6, nullptr, "CreateNetworkInstallTask"}, - FunctionInfo{7, nullptr, "DestroyNetworkInstallTask"}, - FunctionInfo{8, nullptr, "ListNetworkInstallTask"}, - FunctionInfo{9, nullptr, "RequestNetworkInstallTaskRun"}, - FunctionInfo{10, nullptr, "GetNetworkInstallTaskInfo"}, - FunctionInfo{11, nullptr, "CommitNetworkInstallTask"}, - FunctionInfo{12, nullptr, "RequestLatestSystemUpdateMeta"}, - FunctionInfo{14, nullptr, "ListApplicationNetworkInstallTask"}, - FunctionInfo{15, nullptr, "ListNetworkInstallTaskContentMeta"}, - FunctionInfo{16, nullptr, "RequestLatestVersion"}, - FunctionInfo{17, nullptr, "SetNetworkInstallTaskAttribute"}, - FunctionInfo{18, nullptr, "AddNetworkInstallTaskContentMeta"}, - FunctionInfo{19, nullptr, "GetDownloadedSystemDataPath"}, - FunctionInfo{20, nullptr, "CalculateNetworkInstallTaskRequiredSize"}, - FunctionInfo{21, nullptr, "IsExFatDriverIncluded"}, - FunctionInfo{22, nullptr, "GetBackgroundDownloadStressTaskInfo"}, - FunctionInfo{23, nullptr, "RequestDeviceAuthenticationToken"}, - FunctionInfo{24, nullptr, "RequestGameCardRegistrationStatus"}, - FunctionInfo{25, nullptr, "RequestRegisterGameCard"}, - FunctionInfo{26, nullptr, "RequestRegisterNotificationToken"}, - FunctionInfo{27, nullptr, "RequestDownloadTaskList"}, - FunctionInfo{28, nullptr, "RequestApplicationControl"}, - FunctionInfo{29, nullptr, "RequestLatestApplicationControl"}, - FunctionInfo{30, nullptr, "RequestVersionList"}, - FunctionInfo{31, nullptr, "CreateApplyDeltaTask"}, - FunctionInfo{32, nullptr, "DestroyApplyDeltaTask"}, - FunctionInfo{33, nullptr, "ListApplicationApplyDeltaTask"}, - FunctionInfo{34, nullptr, "RequestApplyDeltaTaskRun"}, - FunctionInfo{35, nullptr, "GetApplyDeltaTaskInfo"}, - FunctionInfo{36, nullptr, "ListApplyDeltaTask"}, - FunctionInfo{37, nullptr, "CommitApplyDeltaTask"}, - FunctionInfo{38, nullptr, "CalculateApplyDeltaTaskRequiredSize"}, - FunctionInfo{39, nullptr, "PrepareShutdown"}, - FunctionInfo{40, nullptr, "ListApplyDeltaTask"}, - FunctionInfo{41, nullptr, "ClearNotEnoughSpaceStateOfApplyDeltaTask"}, - FunctionInfo{42, nullptr, "CreateApplyDeltaTaskFromDownloadTask"}, - FunctionInfo{43, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"}, - FunctionInfo{44, nullptr, "GetApplyDeltaTaskRequiredStorage"}, - FunctionInfo{45, nullptr, "CalculateNetworkInstallTaskContentsSize"}, - FunctionInfo{46, nullptr, "PrepareShutdownForSystemUpdate"}, - FunctionInfo{47, nullptr, "FindMaxRequiredApplicationVersionOfTask"}, - FunctionInfo{48, nullptr, "CommitNetworkInstallTaskPartially"}, - FunctionInfo{49, nullptr, "ListNetworkInstallTaskCommittedContentMeta"}, - FunctionInfo{50, nullptr, "ListNetworkInstallTaskNotCommittedContentMeta"}, - FunctionInfo{51, nullptr, "FindMaxRequiredSystemVersionOfTask"}, - FunctionInfo{52, nullptr, "GetNetworkInstallTaskErrorContext"}, - FunctionInfo{53, nullptr, "CreateLocalCommunicationReceiveApplicationTask"}, - FunctionInfo{54, nullptr, "DestroyLocalCommunicationReceiveApplicationTask"}, - FunctionInfo{55, nullptr, "ListLocalCommunicationReceiveApplicationTask"}, - FunctionInfo{56, nullptr, "RequestLocalCommunicationReceiveApplicationTaskRun"}, - FunctionInfo{57, nullptr, "GetLocalCommunicationReceiveApplicationTaskInfo"}, - FunctionInfo{58, nullptr, "CommitLocalCommunicationReceiveApplicationTask"}, - FunctionInfo{59, nullptr, "ListLocalCommunicationReceiveApplicationTaskContentMeta"}, - FunctionInfo{60, nullptr, "CreateLocalCommunicationSendApplicationTask"}, - FunctionInfo{61, nullptr, "RequestLocalCommunicationSendApplicationTaskRun"}, - FunctionInfo{62, nullptr, "GetLocalCommunicationReceiveApplicationTaskErrorContext"}, - FunctionInfo{63, nullptr, "GetLocalCommunicationSendApplicationTaskInfo"}, - FunctionInfo{64, nullptr, "DestroyLocalCommunicationSendApplicationTask"}, - FunctionInfo{65, nullptr, "GetLocalCommunicationSendApplicationTaskErrorContext"}, - FunctionInfo{66, nullptr, "CalculateLocalCommunicationReceiveApplicationTaskRequiredSize"}, - FunctionInfo{67, nullptr, "ListApplicationLocalCommunicationReceiveApplicationTask"}, - FunctionInfo{68, nullptr, "ListApplicationLocalCommunicationSendApplicationTask"}, - FunctionInfo{69, nullptr, "CreateLocalCommunicationReceiveSystemUpdateTask"}, - FunctionInfo{70, nullptr, "DestroyLocalCommunicationReceiveSystemUpdateTask"}, - FunctionInfo{71, nullptr, "ListLocalCommunicationReceiveSystemUpdateTask"}, - FunctionInfo{72, nullptr, "RequestLocalCommunicationReceiveSystemUpdateTaskRun"}, - FunctionInfo{73, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskInfo"}, - FunctionInfo{74, nullptr, "CommitLocalCommunicationReceiveSystemUpdateTask"}, - FunctionInfo{75, nullptr, "GetLocalCommunicationReceiveSystemUpdateTaskErrorContext"}, - FunctionInfo{76, nullptr, "CreateLocalCommunicationSendSystemUpdateTask"}, - FunctionInfo{77, nullptr, "RequestLocalCommunicationSendSystemUpdateTaskRun"}, - FunctionInfo{78, nullptr, "GetLocalCommunicationSendSystemUpdateTaskInfo"}, - FunctionInfo{79, nullptr, "DestroyLocalCommunicationSendSystemUpdateTask"}, - FunctionInfo{80, nullptr, "GetLocalCommunicationSendSystemUpdateTaskErrorContext"}, - FunctionInfo{81, nullptr, "ListLocalCommunicationSendSystemUpdateTask"}, - FunctionInfo{82, nullptr, "GetReceivedSystemDataPath"}, - FunctionInfo{83, nullptr, "CalculateApplyDeltaTaskOccupiedSize"}, - FunctionInfo{84, nullptr, "ReloadErrorSimulation"}, - FunctionInfo{85, nullptr, "ListNetworkInstallTaskContentMetaFromInstallMeta"}, - FunctionInfo{86, nullptr, "ListNetworkInstallTaskOccupiedSize"}, - FunctionInfo{87, nullptr, "RequestQueryAvailableELicenses"}, - FunctionInfo{88, nullptr, "RequestAssignELicenses"}, - FunctionInfo{89, nullptr, "RequestExtendELicenses"}, - FunctionInfo{90, nullptr, "RequestSyncELicenses"}, - FunctionInfo{91, nullptr, "Unknown91", MakeVersionGate({6,0,0}, {14,1,2})}, - FunctionInfo{92, nullptr, "Unknown92", MakeVersionGate({21,0,0})}, - FunctionInfo{93, nullptr, "RequestReportActiveELicenses"}, - FunctionInfo{94, nullptr, "RequestReportActiveELicensesPassively"}, - FunctionInfo{95, nullptr, "RequestRegisterDynamicRightsNotificationToken"}, - FunctionInfo{96, nullptr, "RequestAssignAllDeviceLinkedELicenses"}, - FunctionInfo{97, nullptr, "RequestRevokeAllELicenses"}, - FunctionInfo{98, nullptr, "RequestPrefetchForDynamicRights"}, - FunctionInfo{99, nullptr, "CreateNetworkInstallTask"}, - FunctionInfo{100, nullptr, "ListNetworkInstallTaskRightsIds"}, - FunctionInfo{101, nullptr, "RequestDownloadETickets"}, - FunctionInfo{102, nullptr, "RequestQueryDownloadableContents"}, - FunctionInfo{103, nullptr, "DeleteNetworkInstallTaskContentMeta"}, - FunctionInfo{104, nullptr, "RequestIssueEdgeTokenForDebug"}, - FunctionInfo{105, nullptr, "RequestQueryAvailableELicenses2"}, - FunctionInfo{106, nullptr, "RequestAssignELicenses2"}, - FunctionInfo{107, nullptr, "GetNetworkInstallTaskStateCounter"}, - FunctionInfo{108, nullptr, "InvalidateDynamicRightsNaIdTokenCacheForDebug"}, - FunctionInfo{109, nullptr, "ListNetworkInstallTaskPartialInstallContentMeta"}, - FunctionInfo{110, nullptr, "ListNetworkInstallTaskRightsIdsFromIndex"}, - FunctionInfo{111, nullptr, "AddNetworkInstallTaskContentMetaForUser"}, - FunctionInfo{112, nullptr, "RequestAssignELicensesAndDownloadETickets"}, - FunctionInfo{113, nullptr, "RequestQueryAvailableCommonELicenses"}, - FunctionInfo{114, nullptr, "SetNetworkInstallTaskExtendedAttribute"}, - FunctionInfo{115, nullptr, "GetNetworkInstallTaskExtendedAttribute"}, - FunctionInfo{116, nullptr, "GetAllocatorInfo"}, - FunctionInfo{117, nullptr, "RequestQueryDownloadableContentsByApplicationId"}, - FunctionInfo{118, nullptr, "MarkNoDownloadRightsErrorResolved"}, - FunctionInfo{119, nullptr, "GetApplyDeltaTaskAllAppliedContentMeta"}, - FunctionInfo{120, nullptr, "PrioritizeNetworkInstallTask"}, - FunctionInfo{121, nullptr, "RequestQueryAvailableCommonELicenses2"}, - FunctionInfo{122, nullptr, "RequestAssignCommonELicenses"}, - FunctionInfo{123, nullptr, "RequestAssignCommonELicenses2"}, - FunctionInfo{124, nullptr, "IsNetworkInstallTaskFrontOfQueue"}, - FunctionInfo{125, nullptr, "PrioritizeApplyDeltaTask"}, - FunctionInfo{126, nullptr, "RerouteDownloadingPatch"}, - FunctionInfo{127, nullptr, "UnmarkNoDownloadRightsErrorResolved"}, - FunctionInfo{128, nullptr, "RequestContentsSize"}, - FunctionInfo{129, nullptr, "RequestContentsAuthorizationToken"}, - FunctionInfo{130, nullptr, "RequestCdnVendorDiscovery"}, - FunctionInfo{131, nullptr, "RefreshDebugAvailability"}, - FunctionInfo{132, nullptr, "ClearResponseSimulationEntry"}, - FunctionInfo{133, nullptr, "RegisterResponseSimulationEntry"}, - FunctionInfo{134, nullptr, "GetProcessedCdnVendors"}, - FunctionInfo{135, nullptr, "RefreshRuntimeBehaviorsForDebug"}, - FunctionInfo{136, nullptr, "RequestOnlineSubscriptionFreeTrialAvailability"}, - FunctionInfo{137, nullptr, "GetNetworkInstallTaskContentMetaCount"}, - FunctionInfo{138, nullptr, "RequestRevokeELicenses"}, - FunctionInfo{139, nullptr, "EnableNetworkConnectionToUseApplicationCore"}, - FunctionInfo{140, nullptr, "DisableNetworkConnectionToUseApplicationCore"}, - FunctionInfo{141, nullptr, "IsNetworkConnectionEnabledToUseApplicationCore"}, - FunctionInfo{142, nullptr, "RequestCheckSafeSystemVersion"}, - FunctionInfo{143, nullptr, "RequestApplicationIcon"}, - FunctionInfo{144, nullptr, "RequestDownloadIdbeIconFile"}, - FunctionInfo{147, nullptr, "Unknown147", MakeVersionGate({18,0,0})}, - FunctionInfo{148, nullptr, "Unknown148", MakeVersionGate({18,0,0})}, - FunctionInfo{150, nullptr, "Unknown150", MakeVersionGate({19,0,0})}, - FunctionInfo{151, nullptr, "Unknown151", MakeVersionGate({20,0,0})}, - FunctionInfo{152, nullptr, "Unknown152", MakeVersionGate({20,0,0})}, - FunctionInfo{153, nullptr, "Unknown153", MakeVersionGate({20,0,0})}, - FunctionInfo{154, nullptr, "Unknown154", MakeVersionGate({20,0,0})}, - FunctionInfo{155, nullptr, "Unknown155", MakeVersionGate({20,0,0})}, - FunctionInfo{156, nullptr, "Unknown156", MakeVersionGate({20,0,0})}, - FunctionInfo{157, nullptr, "Unknown157", MakeVersionGate({20,0,0})}, - FunctionInfo{158, nullptr, "Unknown158", MakeVersionGate({20,0,0})}, - FunctionInfo{159, nullptr, "Unknown159", MakeVersionGate({20,0,0})}, - FunctionInfo{160, nullptr, "Unknown160", MakeVersionGate({20,0,0})}, - FunctionInfo{161, nullptr, "Unknown161", MakeVersionGate({20,0,0})}, - FunctionInfo{162, nullptr, "Unknown162", MakeVersionGate({20,0,0})}, - FunctionInfo{163, nullptr, "Unknown163", MakeVersionGate({20,0,0})}, - FunctionInfo{164, nullptr, "Unknown164", MakeVersionGate({20,0,0})}, - FunctionInfo{165, nullptr, "Unknown165", MakeVersionGate({20,0,0})}, - FunctionInfo{166, nullptr, "Unknown166", MakeVersionGate({20,0,0})}, - FunctionInfo{167, nullptr, "Unknown167", MakeVersionGate({20,0,0})}, - FunctionInfo{168, nullptr, "Unknown168", MakeVersionGate({20,0,0})}, - FunctionInfo{169, nullptr, "Unknown169", MakeVersionGate({20,0,0})}, - FunctionInfo{170, nullptr, "Unknown170", MakeVersionGate({20,0,0})}, - FunctionInfo{171, nullptr, "Unknown171", MakeVersionGate({20,0,0})}, - FunctionInfo{172, nullptr, "Unknown172", MakeVersionGate({20,0,0})}, - FunctionInfo{173, nullptr, "Unknown173", MakeVersionGate({20,0,0})}, - FunctionInfo{174, nullptr, "Unknown174", MakeVersionGate({20,0,0})}, - FunctionInfo{175, nullptr, "Unknown175", MakeVersionGate({20,0,0})}, - FunctionInfo{176, nullptr, "Unknown176", MakeVersionGate({20,0,0})}, - FunctionInfo{177, nullptr, "Unknown177", MakeVersionGate({20,0,0})}, - FunctionInfo{2000, nullptr, "Unknown2000", MakeVersionGate({20,0,0})}, - FunctionInfo{2001, nullptr, "Unknown2001", MakeVersionGate({20,0,0})}, - FunctionInfo{2002, nullptr, "Unknown2002", MakeVersionGate({20,0,0})}, - FunctionInfo{2003, nullptr, "Unknown2003", MakeVersionGate({20,0,0})}, - FunctionInfo{2004, nullptr, "Unknown2004", MakeVersionGate({20,0,0})}, - FunctionInfo{2007, nullptr, "Unknown2007", MakeVersionGate({20,0,0})}, - FunctionInfo{2011, nullptr, "Unknown2011", MakeVersionGate({20,0,0})}, - FunctionInfo{2012, nullptr, "Unknown2012", MakeVersionGate({20,0,0})}, - FunctionInfo{2013, nullptr, "Unknown2013", MakeVersionGate({20,0,0})}, - FunctionInfo{2014, nullptr, "Unknown2014", MakeVersionGate({20,0,0})}, - FunctionInfo{2015, nullptr, "Unknown2015", MakeVersionGate({20,0,0})}, - FunctionInfo{2016, nullptr, "Unknown2016", MakeVersionGate({20,0,0})}, - FunctionInfo{2017, nullptr, "Unknown2017", MakeVersionGate({20,0,0})}, - FunctionInfo{2018, nullptr, "Unknown2018", MakeVersionGate({20,0,0})}, - FunctionInfo{2019, nullptr, "Unknown2019", MakeVersionGate({20,0,0})}, - FunctionInfo{2020, nullptr, "Unknown2020", MakeVersionGate({20,0,0})}, - FunctionInfo{2021, nullptr, "Unknown2021", MakeVersionGate({20,0,0})}, - FunctionInfo{2022, nullptr, "Unknown2022", MakeVersionGate({20,0,0})}, - FunctionInfo{2023, nullptr, "Unknown2023", MakeVersionGate({20,0,0})}, - FunctionInfo{2024, nullptr, "Unknown2024", MakeVersionGate({20,0,0})}, - FunctionInfo{2025, nullptr, "Unknown2025", MakeVersionGate({20,0,0})}, - FunctionInfo{2026, nullptr, "Unknown2026", MakeVersionGate({20,0,0})}, - FunctionInfo{2027, nullptr, "Unknown2027", MakeVersionGate({20,0,0})}, - FunctionInfo{2028, nullptr, "Unknown2028", MakeVersionGate({20,0,0})}, - FunctionInfo{2029, nullptr, "Unknown2029", MakeVersionGate({20,0,0})}, - FunctionInfo{2030, nullptr, "Unknown2030", MakeVersionGate({20,0,0})}, - FunctionInfo{2031, nullptr, "Unknown2031", MakeVersionGate({20,0,0})}, - FunctionInfo{2032, nullptr, "Unknown2032", MakeVersionGate({20,0,0})}, - FunctionInfo{2033, nullptr, "Unknown2033", MakeVersionGate({20,0,0})}, - FunctionInfo{2034, nullptr, "Unknown2034", MakeVersionGate({20,0,0})}, - FunctionInfo{2035, nullptr, "Unknown2035", MakeVersionGate({20,0,0})}, - FunctionInfo{2036, nullptr, "Unknown2036", MakeVersionGate({20,0,0})}, - FunctionInfo{2037, nullptr, "Unknown2037", MakeVersionGate({20,0,0})}, - FunctionInfo{2038, nullptr, "Unknown2038", MakeVersionGate({20,0,0})}, - FunctionInfo{2039, nullptr, "Unknown2039", MakeVersionGate({20,0,0})}, - FunctionInfo{2040, nullptr, "Unknown2040", MakeVersionGate({20,0,0})}, - FunctionInfo{2041, nullptr, "Unknown2041", MakeVersionGate({20,0,0})}, - FunctionInfo{2042, nullptr, "Unknown2042", MakeVersionGate({20,0,0})}, - FunctionInfo{2043, nullptr, "Unknown2043", MakeVersionGate({20,0,0})}, - FunctionInfo{2044, nullptr, "Unknown2044", MakeVersionGate({20,0,0})}, - FunctionInfo{2045, nullptr, "Unknown2045", MakeVersionGate({20,0,0})}, - FunctionInfo{2046, nullptr, "Unknown2046", MakeVersionGate({20,0,0})}, - FunctionInfo{2047, nullptr, "Unknown2047", MakeVersionGate({20,0,0})}, - FunctionInfo{2048, nullptr, "Unknown2048", MakeVersionGate({20,0,0})}, - FunctionInfo{2049, nullptr, "Unknown2049", MakeVersionGate({20,0,0})}, - FunctionInfo{2050, nullptr, "Unknown2050", MakeVersionGate({20,0,0})}, - FunctionInfo{2051, nullptr, "Unknown2051", MakeVersionGate({20,0,0})}, - FunctionInfo{3000, nullptr, "RequestLatestApplicationIcon", MakeVersionGate({17,0,0})}, - FunctionInfo{3001, nullptr, "RequestDownloadIdbeLatestIconFile", MakeVersionGate({17,0,0})} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class NIM_ECA final : public ServiceFramework { public: - explicit NIM_ECA(Core::System& system_) : ServiceFramework{system_, "nim:eca"} {} + explicit NIM_ECA(Core::System& system_) : ServiceFramework{system_, "nim:eca"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &NIM_ECA::CreateServerInterface, "CreateServerInterface"}, + {1, nullptr, "RefreshDebugAvailability"}, + {2, nullptr, "ClearDebugResponse"}, + {3, nullptr, "RegisterDebugResponse"}, + {4, &NIM_ECA::IsLargeResourceAvailable, "IsLargeResourceAvailable"}, + {5, &NIM_ECA::CreateServerInterface2, "CreateServerInterface2"} // 17.0.0+ + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -450,53 +463,45 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &NIM_ECA::CreateServerInterface, "CreateServerInterface"}, - FunctionInfo{1, nullptr, "RefreshDebugAvailability"}, - FunctionInfo{2, nullptr, "ClearDebugResponse"}, - FunctionInfo{3, nullptr, "RegisterDebugResponse"}, - FunctionInfo{4, &NIM_ECA::IsLargeResourceAvailable, "IsLargeResourceAvailable"}, - FunctionInfo{5, &NIM_ECA::CreateServerInterface2, "CreateServerInterface2", MakeVersionGate({17,0,0})} - ); }; class NIM_SHP final : public ServiceFramework { public: - explicit NIM_SHP(Core::System& system_) : ServiceFramework{system_, "nim:shp"} {} + explicit NIM_SHP(Core::System& system_) : ServiceFramework{system_, "nim:shp"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestDeviceAuthenticationToken"}, + {1, nullptr, "RequestCachedDeviceAuthenticationToken"}, + {2, nullptr, "RequestEdgeToken"}, + {3, nullptr, "RequestCachedEdgeToken"}, + {100, nullptr, "RequestRegisterDeviceAccount"}, + {101, nullptr, "RequestUnregisterDeviceAccount"}, + {102, nullptr, "RequestDeviceAccountStatus"}, + {103, nullptr, "GetDeviceAccountInfo"}, + {104, nullptr, "RequestDeviceRegistrationInfo"}, + {105, nullptr, "RequestTransferDeviceAccount"}, + {106, nullptr, "RequestSyncRegistration"}, + {107, nullptr, "IsOwnDeviceId"}, + {200, nullptr, "RequestRegisterNotificationToken"}, + {300, nullptr, "RequestUnlinkDevice"}, + {301, nullptr, "RequestUnlinkDeviceIntegrated"}, + {302, nullptr, "RequestLinkDevice"}, + {303, nullptr, "HasDeviceLink"}, + {304, nullptr, "RequestUnlinkDeviceAll"}, + {305, nullptr, "RequestCreateVirtualAccount"}, + {306, nullptr, "RequestDeviceLinkStatus"}, + {400, nullptr, "GetAccountByVirtualAccount"}, + {401, nullptr, "GetVirtualAccount"}, + {500, nullptr, "RequestSyncTicketLegacy"}, + {501, nullptr, "RequestDownloadTicket"}, + {502, nullptr, "RequestDownloadTicketForPrepurchasedContents"}, + {503, nullptr, "RequestSyncTicket"}, + {504, nullptr, "RequestDownloadTicketForPrepurchasedContents2"}, + {505, nullptr, "RequestDownloadTicketForPrepurchasedContentsForAccount"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestDeviceAuthenticationToken"}, - FunctionInfo{1, nullptr, "RequestCachedDeviceAuthenticationToken"}, - FunctionInfo{2, nullptr, "RequestEdgeToken"}, - FunctionInfo{3, nullptr, "RequestCachedEdgeToken"}, - FunctionInfo{100, nullptr, "RequestRegisterDeviceAccount"}, - FunctionInfo{101, nullptr, "RequestUnregisterDeviceAccount"}, - FunctionInfo{102, nullptr, "RequestDeviceAccountStatus"}, - FunctionInfo{103, nullptr, "GetDeviceAccountInfo"}, - FunctionInfo{104, nullptr, "RequestDeviceRegistrationInfo"}, - FunctionInfo{105, nullptr, "RequestTransferDeviceAccount"}, - FunctionInfo{106, nullptr, "RequestSyncRegistration"}, - FunctionInfo{107, nullptr, "IsOwnDeviceId"}, - FunctionInfo{200, nullptr, "RequestRegisterNotificationToken"}, - FunctionInfo{300, nullptr, "RequestUnlinkDevice"}, - FunctionInfo{301, nullptr, "RequestUnlinkDeviceIntegrated"}, - FunctionInfo{302, nullptr, "RequestLinkDevice"}, - FunctionInfo{303, nullptr, "HasDeviceLink"}, - FunctionInfo{304, nullptr, "RequestUnlinkDeviceAll"}, - FunctionInfo{305, nullptr, "RequestCreateVirtualAccount"}, - FunctionInfo{306, nullptr, "RequestDeviceLinkStatus"}, - FunctionInfo{400, nullptr, "GetAccountByVirtualAccount"}, - FunctionInfo{401, nullptr, "GetVirtualAccount"}, - FunctionInfo{500, nullptr, "RequestSyncTicketLegacy"}, - FunctionInfo{501, nullptr, "RequestDownloadTicket"}, - FunctionInfo{502, nullptr, "RequestDownloadTicketForPrepurchasedContents"}, - FunctionInfo{503, nullptr, "RequestSyncTicket"}, - FunctionInfo{504, nullptr, "RequestDownloadTicketForPrepurchasedContents2"}, - FunctionInfo{505, nullptr, "RequestDownloadTicketForPrepurchasedContentsForAccount"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; @@ -506,7 +511,19 @@ public: explicit IEnsureNetworkClockAvailabilityService(Core::System& system_) : ServiceFramework{system_, "IEnsureNetworkClockAvailabilityService"}, service_context{system_, "IEnsureNetworkClockAvailabilityService"} { - finished_event = service_context.CreateEvent("IEnsureNetworkClockAvailabilityService:FinishEvent"); + static const FunctionInfo functions[] = { + {0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"}, + {1, &IEnsureNetworkClockAvailabilityService::GetFinishNotificationEvent, + "GetFinishNotificationEvent"}, + {2, &IEnsureNetworkClockAvailabilityService::GetResult, "GetResult"}, + {3, &IEnsureNetworkClockAvailabilityService::Cancel, "Cancel"}, + {4, &IEnsureNetworkClockAvailabilityService::IsProcessing, "IsProcessing"}, + {5, &IEnsureNetworkClockAvailabilityService::GetServerTime, "GetServerTime"}, + }; + RegisterHandlers(functions); + + finished_event = + service_context.CreateEvent("IEnsureNetworkClockAvailabilityService:FinishEvent"); } ~IEnsureNetworkClockAvailabilityService() override { @@ -563,27 +580,23 @@ private: rb.PushRaw(server_time); } - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"}, - FunctionInfo{1, &IEnsureNetworkClockAvailabilityService::GetFinishNotificationEvent, "GetFinishNotificationEvent"}, - FunctionInfo{2, &IEnsureNetworkClockAvailabilityService::GetResult, "GetResult"}, - FunctionInfo{3, &IEnsureNetworkClockAvailabilityService::Cancel, "Cancel"}, - FunctionInfo{4, &IEnsureNetworkClockAvailabilityService::IsProcessing, "IsProcessing"}, - FunctionInfo{5, &IEnsureNetworkClockAvailabilityService::GetServerTime, "GetServerTime"} - ); KernelHelpers::ServiceContext service_context; + Kernel::KEvent* finished_event; }; class NTC final : public ServiceFramework { public: - explicit NTC(Core::System& system_) : ServiceFramework{system_, "ntc"} {} + explicit NTC(Core::System& system_) : ServiceFramework{system_, "ntc"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &NTC::OpenEnsureNetworkClockAvailabilityService, "OpenEnsureNetworkClockAvailabilityService"}, + {100, &NTC::SuspendAutonomicTimeCorrection, "SuspendAutonomicTimeCorrection"}, + {101, &NTC::ResumeAutonomicTimeCorrection, "ResumeAutonomicTimeCorrection"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -609,24 +622,18 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &NTC::OpenEnsureNetworkClockAvailabilityService, "OpenEnsureNetworkClockAvailabilityService"}, - FunctionInfo{100, &NTC::SuspendAutonomicTimeCorrection, "SuspendAutonomicTimeCorrection"}, - FunctionInfo{101, &NTC::ResumeAutonomicTimeCorrection, "ResumeAutonomicTimeCorrection"} - ); }; class NIM_ECAS final : public ServiceFramework { public: - explicit NIM_ECAS(Core::System& system_) : ServiceFramework{system_, "nim:ecas"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RegisterSpecialClient"}, - FunctionInfo{1, nullptr, "UnregisterSpecialClient"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit NIM_ECAS(Core::System& system_) : ServiceFramework{system_, "nim:ecas"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RegisterSpecialClient"}, + {1, nullptr, "UnregisterSpecialClient"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/nim/nim.h b/src/core/hle/service/nim/nim.h index e7d599908d..0fad2a71af 100644 --- a/src/core/hle/service/nim/nim.h +++ b/src/core/hle/service/nim/nim.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/npns/npns.cpp b/src/core/hle/service/npns/npns.cpp index 90bf633e8b..b0f74bef06 100644 --- a/src/core/hle/service/npns/npns.cpp +++ b/src/core/hle/service/npns/npns.cpp @@ -19,10 +19,79 @@ class INpnsSystem final : public ServiceFramework { public: explicit INpnsSystem(Core::System& system_) : ServiceFramework{system_, "npns:s"}, service_context{system, "npns:s"}, - get_receive_event{service_context}, get_request_change_state_cancel_event{service_context} {} + get_receive_event{service_context}, get_request_change_state_cancel_event{service_context} { + // clang-format off + static const FunctionInfo functions[] = { + {1, nullptr, "ListenAll"}, + {2, C<&INpnsSystem::ListenTo>, "ListenTo"}, + {3, nullptr, "Receive"}, + {4, nullptr, "ReceiveRaw"}, + {5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"}, + {6, nullptr, "ListenUndelivered"}, + {7, nullptr, "GetStateChangeEvent"}, + {8, C<&INpnsSystem::ListenToByName>, "ListenToByName"}, + {11, nullptr, "SubscribeTopic"}, + {12, nullptr, "UnsubscribeTopic"}, + {13, nullptr, "QueryIsTopicExist"}, + {14, nullptr, "SubscribeTopicByAccount"}, // 18.0.0+ + {15, nullptr, "UnsubscribeTopicByAccount"}, // 18.0.0+ + {16, nullptr, "DownloadSubscriptionList"}, // 18.0.0+ + {21, nullptr, "CreateToken"}, + {22, nullptr, "CreateTokenWithApplicationId"}, + {23, nullptr, "DestroyToken"}, + {24, nullptr, "DestroyTokenWithApplicationId"}, + {25, nullptr, "QueryIsTokenValid"}, + {26, nullptr, "ListenToMyApplicationId"}, + {27, nullptr, "DestroyTokenAll"}, + {28, nullptr, "CreateTokenWithName"}, // 18.0.0+ + {29, nullptr, "DestroyTokenWithName"}, // 18.0.0+ + {31, nullptr, "UploadTokenToBaaS"}, + {32, nullptr, "DestroyTokenForBaaS"}, + {33, nullptr, "CreateTokenForBaaS"}, + {34, nullptr, "SetBaaSDeviceAccountIdList"}, + {35, nullptr, "LinkNsaId"}, // 17.0.0+ + {36, nullptr, "UnlinkNsaId"}, // 17.0.0+ + {37, nullptr, "RelinkNsaId"}, // 18.0.0+ + {40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent"}, // 17.0.0+ + {41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid"}, // 17.0.0+ + {42, nullptr, "SetNetworkServiceAccountIdTokenSuccess"}, // 17.0.0+ + {43, nullptr, "SetNetworkServiceAccountIdTokenFailure"}, // 17.0.0+ + {44, nullptr, "SetUidList"}, // 17.0.0+ + {45, nullptr, "PutDigitalTwinKeyValue"}, // 17.0.0+ + {51, nullptr, "DeleteDigitalTwinKeyValue"}, // 18.0.0+ + {101, nullptr, "Suspend"}, + {102, nullptr, "Resume"}, + {103, C<&INpnsSystem::GetState>, "GetState"}, + {104, nullptr, "GetStatistics"}, + {105, nullptr, "GetPlayReportRequestEvent"}, + {106, C<&INpnsSystem::GetLastNotifiedTime>, "GetLastNotifiedTime"}, // 18.0.0+ + {107, nullptr, "SetLastNotifiedTime"}, // 18.0.0+ + {111, nullptr, "GetJid"}, + {112, nullptr, "CreateJid"}, + {113, nullptr, "DestroyJid"}, + {114, nullptr, "AttachJid"}, + {115, nullptr, "DetachJid"}, + {120, nullptr, "CreateNotificationReceiver"}, + {151, nullptr, "GetStateWithHandover"}, + {152, nullptr, "GetStateChangeEventWithHandover"}, + {153, nullptr, "GetDropEventWithHandover"}, + {154, nullptr, "CreateTokenAsync"}, + {155, nullptr, "CreateTokenAsyncWithApplicationId"}, + {156, nullptr, "CreateTokenWithNameAsync"}, // 18.0.0+ + {161, C<&INpnsSystem::GetRequestChangeStateCancelEvent>, "GetRequestChangeStateCancelEvent"}, // 10.0.0+ + {162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"}, + {201, nullptr, "RequestChangeStateForceTimed"}, + {202, nullptr, "RequestChangeStateForceAsync"}, + {301, nullptr, "GetPassword"}, // 18.0.0+ + {302, nullptr, "GetAllImmigration"}, // 18.0.0+ + {303, nullptr, "GetNotificationHistories"}, // 18.0.0+ + {304, nullptr, "GetPersistentConnectionSummary"}, // 18.0.0+ + {305, nullptr, "GetDigitalTwinSummary"}, // 18.0.0+ + {306, nullptr, "GetDigitalTwinValue"}, // 18.0.0+ + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } ~INpnsSystem() override = default; @@ -71,74 +140,6 @@ private: R_SUCCEED(); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, nullptr, "ListenAll"}, - FunctionInfo{2, C<&INpnsSystem::ListenTo>, "ListenTo"}, - FunctionInfo{3, nullptr, "Receive"}, - FunctionInfo{4, nullptr, "ReceiveRaw"}, - FunctionInfo{5, C<&INpnsSystem::GetReceiveEvent>, "GetReceiveEvent"}, - FunctionInfo{6, nullptr, "ListenUndelivered"}, - FunctionInfo{7, nullptr, "GetStateChangeEvent"}, - FunctionInfo{8, C<&INpnsSystem::ListenToByName>, "ListenToByName"}, - FunctionInfo{11, nullptr, "SubscribeTopic"}, - FunctionInfo{12, nullptr, "UnsubscribeTopic"}, - FunctionInfo{13, nullptr, "QueryIsTopicExist"}, - FunctionInfo{14, nullptr, "SubscribeTopicByAccount", MakeVersionGate({18,0,0})}, - FunctionInfo{15, nullptr, "UnsubscribeTopicByAccount", MakeVersionGate({18,0,0})}, - FunctionInfo{16, nullptr, "DownloadSubscriptionList", MakeVersionGate({18,0,0})}, - FunctionInfo{21, nullptr, "CreateToken"}, - FunctionInfo{22, nullptr, "CreateTokenWithApplicationId"}, - FunctionInfo{23, nullptr, "DestroyToken"}, - FunctionInfo{24, nullptr, "DestroyTokenWithApplicationId"}, - FunctionInfo{25, nullptr, "QueryIsTokenValid"}, - FunctionInfo{26, nullptr, "ListenToMyApplicationId"}, - FunctionInfo{27, nullptr, "DestroyTokenAll"}, - FunctionInfo{28, nullptr, "CreateTokenWithName", MakeVersionGate({18,0,0})}, - FunctionInfo{29, nullptr, "DestroyTokenWithName", MakeVersionGate({18,0,0})}, - FunctionInfo{31, nullptr, "UploadTokenToBaaS"}, - FunctionInfo{32, nullptr, "DestroyTokenForBaaS"}, - FunctionInfo{33, nullptr, "CreateTokenForBaaS"}, - FunctionInfo{34, nullptr, "SetBaaSDeviceAccountIdList"}, - FunctionInfo{35, nullptr, "LinkNsaId", MakeVersionGate({17,0,0})}, - FunctionInfo{36, nullptr, "UnlinkNsaId", MakeVersionGate({17,0,0})}, - FunctionInfo{37, nullptr, "RelinkNsaId", MakeVersionGate({18,0,0})}, - FunctionInfo{40, nullptr, "GetNetworkServiceAccountIdTokenRequestEvent", MakeVersionGate({17,0,0})}, - FunctionInfo{41, nullptr, "TryPopNetworkServiceAccountIdTokenRequestUid", MakeVersionGate({17,0,0})}, - FunctionInfo{42, nullptr, "SetNetworkServiceAccountIdTokenSuccess", MakeVersionGate({17,0,0})}, - FunctionInfo{43, nullptr, "SetNetworkServiceAccountIdTokenFailure", MakeVersionGate({17,0,0})}, - FunctionInfo{44, nullptr, "SetUidList", MakeVersionGate({17,0,0})}, - FunctionInfo{45, nullptr, "PutDigitalTwinKeyValue", MakeVersionGate({17,0,0})}, - FunctionInfo{51, nullptr, "DeleteDigitalTwinKeyValue", MakeVersionGate({18,0,0})}, - FunctionInfo{101, nullptr, "Suspend"}, - FunctionInfo{102, nullptr, "Resume"}, - FunctionInfo{103, C<&INpnsSystem::GetState>, "GetState"}, - FunctionInfo{104, nullptr, "GetStatistics"}, - FunctionInfo{105, nullptr, "GetPlayReportRequestEvent"}, - FunctionInfo{106, C<&INpnsSystem::GetLastNotifiedTime>, "GetLastNotifiedTime", MakeVersionGate({18,0,0})}, - FunctionInfo{107, nullptr, "SetLastNotifiedTime", MakeVersionGate({18,0,0})}, - FunctionInfo{111, nullptr, "GetJid"}, - FunctionInfo{112, nullptr, "CreateJid"}, - FunctionInfo{113, nullptr, "DestroyJid"}, - FunctionInfo{114, nullptr, "AttachJid"}, - FunctionInfo{115, nullptr, "DetachJid"}, - FunctionInfo{120, nullptr, "CreateNotificationReceiver"}, - FunctionInfo{151, nullptr, "GetStateWithHandover"}, - FunctionInfo{152, nullptr, "GetStateChangeEventWithHandover"}, - FunctionInfo{153, nullptr, "GetDropEventWithHandover"}, - FunctionInfo{154, nullptr, "CreateTokenAsync"}, - FunctionInfo{155, nullptr, "CreateTokenAsyncWithApplicationId"}, - FunctionInfo{156, nullptr, "CreateTokenWithNameAsync", MakeVersionGate({18,0,0})}, - FunctionInfo{161, C<&INpnsSystem::GetRequestChangeStateCancelEvent>, "GetRequestChangeStateCancelEvent", MakeVersionGate({10,0,0})}, - FunctionInfo{162, nullptr, "RequestChangeStateForceTimedWithCancelEvent"}, - FunctionInfo{201, nullptr, "RequestChangeStateForceTimed"}, - FunctionInfo{202, nullptr, "RequestChangeStateForceAsync"}, - FunctionInfo{301, nullptr, "GetPassword", MakeVersionGate({18,0,0})}, - FunctionInfo{302, nullptr, "GetAllImmigration", MakeVersionGate({18,0,0})}, - FunctionInfo{303, nullptr, "GetNotificationHistories", MakeVersionGate({18,0,0})}, - FunctionInfo{304, nullptr, "GetPersistentConnectionSummary", MakeVersionGate({18,0,0})}, - FunctionInfo{305, nullptr, "GetDigitalTwinSummary", MakeVersionGate({18,0,0})}, - FunctionInfo{306, nullptr, "GetDigitalTwinValue", MakeVersionGate({18,0,0})} - ); KernelHelpers::ServiceContext service_context; Event get_receive_event; Event get_request_change_state_cancel_event; @@ -147,10 +148,34 @@ private: class INpnsUser final : public ServiceFramework { public: explicit INpnsUser(Core::System& system_) - : ServiceFramework{system_, "npns:u"}, service_context{system, "npns:u"}, get_receive_event{service_context} {} + : ServiceFramework{system_, "npns:u"}, service_context{system, "npns:u"}, get_receive_event{service_context} { + // clang-format off + static const FunctionInfo functions[] = { + {1, nullptr, "ListenAll"}, + {2, nullptr, "ListenTo"}, + {3, nullptr, "Receive"}, + {4, nullptr, "ReceiveRaw"}, + {5, C<&INpnsUser::GetReceiveEvent>, "GetReceiveEvent"}, + {7, nullptr, "GetStateChangeEvent"}, + {8, C<&INpnsUser::ListenToByName>, "ListenToByName"}, // 18.0.0+ + {21, nullptr, "CreateToken"}, + {23, nullptr, "DestroyToken"}, + {25, nullptr, "QueryIsTokenValid"}, + {26, nullptr, "ListenToMyApplicationId"}, + {101, nullptr, "Suspend"}, + {102, nullptr, "Resume"}, + {103, nullptr, "GetState"}, + {104, nullptr, "GetStatistics"}, + {111, nullptr, "GetJid"}, + {120, nullptr, "CreateNotificationReceiver"}, + {151, nullptr, "GetStateWithHandover"}, + {152, nullptr, "GetStateChangeEventWithHandover"}, + {153, nullptr, "GetDropEventWithHandover"}, + {154, nullptr, "CreateTokenAsync"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -170,29 +195,6 @@ private: R_SUCCEED(); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, nullptr, "ListenAll"}, - FunctionInfo{2, nullptr, "ListenTo"}, - FunctionInfo{3, nullptr, "Receive"}, - FunctionInfo{4, nullptr, "ReceiveRaw"}, - FunctionInfo{5, C<&INpnsUser::GetReceiveEvent>, "GetReceiveEvent"}, - FunctionInfo{7, nullptr, "GetStateChangeEvent"}, - FunctionInfo{8, C<&INpnsUser::ListenToByName>, "ListenToByName", MakeVersionGate({18,0,0})}, - FunctionInfo{21, nullptr, "CreateToken"}, - FunctionInfo{23, nullptr, "DestroyToken"}, - FunctionInfo{25, nullptr, "QueryIsTokenValid"}, - FunctionInfo{26, nullptr, "ListenToMyApplicationId"}, - FunctionInfo{101, nullptr, "Suspend"}, - FunctionInfo{102, nullptr, "Resume"}, - FunctionInfo{103, nullptr, "GetState"}, - FunctionInfo{104, nullptr, "GetStatistics"}, - FunctionInfo{111, nullptr, "GetJid"}, - FunctionInfo{120, nullptr, "CreateNotificationReceiver"}, - FunctionInfo{151, nullptr, "GetStateWithHandover"}, - FunctionInfo{152, nullptr, "GetStateChangeEventWithHandover"}, - FunctionInfo{153, nullptr, "GetDropEventWithHandover"}, - FunctionInfo{154, nullptr, "CreateTokenAsync"} - ); KernelHelpers::ServiceContext service_context; Event get_receive_event; }; diff --git a/src/core/hle/service/npns/npns.h b/src/core/hle/service/npns/npns.h index 0019fca763..e54a91a213 100644 --- a/src/core/hle/service/npns/npns.h +++ b/src/core/hle/service/npns/npns.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/ns/account_proxy_interface.cpp b/src/core/hle/service/ns/account_proxy_interface.cpp index 0107e16b72..2e3dcf928d 100644 --- a/src/core/hle/service/ns/account_proxy_interface.cpp +++ b/src/core/hle/service/ns/account_proxy_interface.cpp @@ -10,6 +10,13 @@ namespace Service::NS { IAccountProxyInterface::IAccountProxyInterface(Core::System& system_) : ServiceFramework{system_, "IAccountProxyInterface"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "CreateUserAccount"}, + }; + // clang-format on + + RegisterHandlers(functions); } IAccountProxyInterface::~IAccountProxyInterface() = default; diff --git a/src/core/hle/service/ns/account_proxy_interface.h b/src/core/hle/service/ns/account_proxy_interface.h index 37248726a9..14cec4ddbc 100644 --- a/src/core/hle/service/ns/account_proxy_interface.h +++ b/src/core/hle/service/ns/account_proxy_interface.h @@ -14,13 +14,6 @@ class IAccountProxyInterface final : public ServiceFramework FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateUserAccount"} - ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/application_manager_interface.cpp b/src/core/hle/service/ns/application_manager_interface.cpp index 7220c52dcb..348649917e 100644 --- a/src/core/hle/service/ns/application_manager_interface.cpp +++ b/src/core/hle/service/ns/application_manager_interface.cpp @@ -25,458 +25,6 @@ namespace Service::NS { -std::optional IApplicationManagerInterface::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IApplicationManagerInterface::ListApplicationRecord>, "ListApplicationRecord"}, - FunctionInfo{1, nullptr, "GenerateApplicationRecordCount"}, - FunctionInfo{2, D<&IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent>, "GetApplicationRecordUpdateSystemEvent"}, - FunctionInfo{3, nullptr, "GetApplicationViewDeprecated"}, - FunctionInfo{4, D<&IApplicationManagerInterface::DeleteApplicationEntity>, "DeleteApplicationEntity"}, - FunctionInfo{5, D<&IApplicationManagerInterface::DeleteApplicationCompletely>, "DeleteApplicationCompletely"}, - FunctionInfo{6, nullptr, "IsAnyApplicationEntityRedundant"}, - FunctionInfo{7, nullptr, "DeleteRedundantApplicationEntity"}, - FunctionInfo{8, nullptr, "IsApplicationEntityMovable"}, - FunctionInfo{9, nullptr, "MoveApplicationEntity"}, - FunctionInfo{11, nullptr, "CalculateApplicationOccupiedSize"}, - FunctionInfo{16, &IApplicationManagerInterface::PushApplicationRecord, "PushApplicationRecord"}, - FunctionInfo{17, nullptr, "ListApplicationRecordContentMeta"}, - FunctionInfo{19, nullptr, "LaunchApplicationOld"}, - FunctionInfo{21, nullptr, "GetApplicationContentPath"}, - FunctionInfo{22, nullptr, "TerminateApplication"}, - FunctionInfo{23, nullptr, "ResolveApplicationContentPath"}, - FunctionInfo{26, nullptr, "BeginInstallApplication"}, - FunctionInfo{27, nullptr, "DeleteApplicationRecord"}, - FunctionInfo{30, nullptr, "RequestApplicationUpdateInfo"}, - FunctionInfo{31, nullptr, "RequestUpdateApplication"}, - FunctionInfo{32, nullptr, "CancelApplicationDownload"}, - FunctionInfo{33, nullptr, "ResumeApplicationDownload"}, - FunctionInfo{35, nullptr, "UpdateVersionList"}, - FunctionInfo{36, nullptr, "PushLaunchVersion"}, - FunctionInfo{37, nullptr, "ListRequiredVersion"}, - FunctionInfo{38, D<&IApplicationManagerInterface::CheckApplicationLaunchVersion>, "CheckApplicationLaunchVersion"}, - FunctionInfo{39, nullptr, "CheckApplicationLaunchRights"}, - FunctionInfo{40, D<&IApplicationManagerInterface::GetApplicationLogoData>, "GetApplicationLogoData"}, - FunctionInfo{41, nullptr, "CalculateApplicationDownloadRequiredSize"}, - FunctionInfo{42, nullptr, "CleanupSdCard"}, - FunctionInfo{43, D<&IApplicationManagerInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"}, - FunctionInfo{44, D<&IApplicationManagerInterface::GetSdCardMountStatusChangedEvent>, "GetSdCardMountStatusChangedEvent"}, - FunctionInfo{45, nullptr, "GetGameCardAttachmentEvent"}, - FunctionInfo{46, nullptr, "GetGameCardAttachmentInfo"}, - FunctionInfo{47, D<&IApplicationManagerInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"}, - FunctionInfo{48, D<&IApplicationManagerInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"}, - FunctionInfo{49, nullptr, "GetSdCardRemovedEvent"}, - FunctionInfo{52, D<&IApplicationManagerInterface::GetGameCardUpdateDetectionEvent>, "GetGameCardUpdateDetectionEvent"}, - FunctionInfo{53, nullptr, "DisableApplicationAutoDelete"}, - FunctionInfo{54, nullptr, "EnableApplicationAutoDelete"}, - FunctionInfo{55, D<&IApplicationManagerInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"}, - FunctionInfo{56, nullptr, "SetApplicationTerminateResult"}, - FunctionInfo{57, nullptr, "ClearApplicationTerminateResult"}, - FunctionInfo{58, nullptr, "GetLastSdCardMountUnexpectedResult"}, - FunctionInfo{59, D<&IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"}, - FunctionInfo{60, nullptr, "ConvertLanguageCodeToApplicationLanguage"}, - FunctionInfo{61, nullptr, "GetBackgroundDownloadStressTaskInfo"}, - FunctionInfo{62, nullptr, "GetGameCardStopper"}, - FunctionInfo{63, nullptr, "IsSystemProgramInstalled"}, - FunctionInfo{64, nullptr, "StartApplyDeltaTask"}, - FunctionInfo{65, nullptr, "GetRequestServerStopper"}, - FunctionInfo{66, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"}, - FunctionInfo{67, nullptr, "CancelApplicationApplyDelta"}, - FunctionInfo{68, nullptr, "ResumeApplicationApplyDelta"}, - FunctionInfo{69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"}, - FunctionInfo{70, D<&IApplicationManagerInterface::ResumeAll>, "ResumeAll"}, - FunctionInfo{71, D<&IApplicationManagerInterface::GetStorageSize>, "GetStorageSize"}, - FunctionInfo{80, nullptr, "RequestDownloadApplication"}, - FunctionInfo{81, nullptr, "RequestDownloadAddOnContent"}, - FunctionInfo{82, nullptr, "DownloadApplication"}, - FunctionInfo{83, nullptr, "CheckApplicationResumeRights"}, - FunctionInfo{84, nullptr, "GetDynamicCommitEvent"}, - FunctionInfo{85, nullptr, "RequestUpdateApplication2"}, - FunctionInfo{86, nullptr, "EnableApplicationCrashReport"}, - FunctionInfo{87, nullptr, "IsApplicationCrashReportEnabled"}, - FunctionInfo{90, nullptr, "BoostSystemMemoryResourceLimit"}, - FunctionInfo{91, nullptr, "DeprecatedLaunchApplication"}, - FunctionInfo{92, nullptr, "GetRunningApplicationProgramId"}, - FunctionInfo{93, nullptr, "GetMainApplicationProgramIndex"}, - FunctionInfo{94, nullptr, "LaunchApplication"}, - FunctionInfo{95, nullptr, "GetApplicationLaunchInfo"}, - FunctionInfo{96, nullptr, "AcquireApplicationLaunchInfo"}, - FunctionInfo{97, nullptr, "GetMainApplicationProgramIndexByApplicationLaunchInfo"}, - FunctionInfo{98, nullptr, "EnableApplicationAllThreadDumpOnCrash"}, - FunctionInfo{99, nullptr, "LaunchDevMenu"}, - FunctionInfo{100, nullptr, "ResetToFactorySettings"}, - FunctionInfo{101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"}, - FunctionInfo{102, nullptr, "ResetToFactorySettingsForRefurbishment"}, - FunctionInfo{103, nullptr, "ResetToFactorySettingsWithPlatformRegion"}, - FunctionInfo{104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"}, - FunctionInfo{105, nullptr, "RequestResetToFactorySettingsSecurely"}, - FunctionInfo{106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"}, - FunctionInfo{200, nullptr, "CalculateUserSaveDataStatistics"}, - FunctionInfo{201, nullptr, "DeleteUserSaveDataAll"}, - FunctionInfo{210, nullptr, "DeleteUserSystemSaveData"}, - FunctionInfo{211, nullptr, "DeleteSaveData"}, - FunctionInfo{220, nullptr, "UnregisterNetworkServiceAccount"}, - FunctionInfo{221, D<&IApplicationManagerInterface::UnregisterNetworkServiceAccountWithUserSaveDataDeletion>, "UnregisterNetworkServiceAccountWithUserSaveDataDeletion"}, - FunctionInfo{300, nullptr, "GetApplicationShellEvent"}, - FunctionInfo{301, nullptr, "PopApplicationShellEventInfo"}, - FunctionInfo{302, nullptr, "LaunchLibraryApplet"}, - FunctionInfo{303, nullptr, "TerminateLibraryApplet"}, - FunctionInfo{304, nullptr, "LaunchSystemApplet"}, - FunctionInfo{305, nullptr, "TerminateSystemApplet"}, - FunctionInfo{306, nullptr, "LaunchOverlayApplet"}, - FunctionInfo{307, nullptr, "TerminateOverlayApplet"}, - FunctionInfo{400, D<&IApplicationManagerInterface::GetApplicationControlData>, "GetApplicationControlData"}, - FunctionInfo{401, nullptr, "InvalidateAllApplicationControlCache"}, - FunctionInfo{402, nullptr, "RequestDownloadApplicationControlData"}, - FunctionInfo{403, nullptr, "GetMaxApplicationControlCacheCount"}, - FunctionInfo{404, nullptr, "InvalidateApplicationControlCache"}, - FunctionInfo{405, nullptr, "ListApplicationControlCacheEntryInfo"}, - FunctionInfo{406, nullptr, "GetApplicationControlProperty"}, - FunctionInfo{407, &IApplicationManagerInterface::ListApplicationTitle, "ListApplicationTitle"}, - FunctionInfo{408, &IApplicationManagerInterface::ListApplicationIcon, "ListApplicationIcon"}, - FunctionInfo{411, nullptr, "Unknown411", MakeVersionGate({19,0,0})}, - FunctionInfo{412, nullptr, "Unknown412", MakeVersionGate({19,0,0})}, - FunctionInfo{413, nullptr, "Unknown413", MakeVersionGate({19,0,0})}, - FunctionInfo{414, nullptr, "Unknown414", MakeVersionGate({19,0,0})}, - FunctionInfo{415, nullptr, "Unknown415", MakeVersionGate({19,0,0})}, - FunctionInfo{416, nullptr, "Unknown416", MakeVersionGate({19,0,0})}, - FunctionInfo{417, nullptr, "InvalidateAllApplicationControlCacheOfTheStage", MakeVersionGate({19,0,0})}, - FunctionInfo{418, nullptr, "InvalidateApplicationControlCacheOfTheStage", MakeVersionGate({19,0,0})}, - FunctionInfo{419, D<&IApplicationManagerInterface::RequestDownloadApplicationControlDataInBackground>, "RequestDownloadApplicationControlDataInBackground"}, - FunctionInfo{420, nullptr, "CloneApplicationControlDataCacheForDebug"}, - FunctionInfo{421, nullptr, "Unknown421", MakeVersionGate({20,0,0})}, - FunctionInfo{422, nullptr, "Unknown422", MakeVersionGate({20,0,0})}, - FunctionInfo{423, nullptr, "Unknown423", MakeVersionGate({20,0,0})}, - FunctionInfo{424, nullptr, "Unknown424", MakeVersionGate({20,0,0})}, - FunctionInfo{425, nullptr, "Unknown425", MakeVersionGate({20,0,0})}, - FunctionInfo{426, nullptr, "Unknown426", MakeVersionGate({20,0,0})}, - FunctionInfo{427, nullptr, "Unknown427", MakeVersionGate({20,0,0})}, - FunctionInfo{428, nullptr, "Unknown428", MakeVersionGate({21,0,0})}, - FunctionInfo{429, nullptr, "Unknown429", MakeVersionGate({21,0,0})}, - FunctionInfo{430, nullptr, "Unknown430", MakeVersionGate({21,0,0})}, - FunctionInfo{502, nullptr, "RequestCheckGameCardRegistration"}, - FunctionInfo{503, nullptr, "RequestGameCardRegistrationGoldPoint"}, - FunctionInfo{504, nullptr, "RequestRegisterGameCard"}, - FunctionInfo{505, D<&IApplicationManagerInterface::GetGameCardMountFailureEvent>, "GetGameCardMountFailureEvent"}, - FunctionInfo{506, nullptr, "IsGameCardInserted"}, - FunctionInfo{507, nullptr, "EnsureGameCardAccess"}, - FunctionInfo{508, nullptr, "GetLastGameCardMountFailureResult"}, - FunctionInfo{509, nullptr, "ListApplicationIdOnGameCard"}, - FunctionInfo{510, nullptr, "GetGameCardPlatformRegion"}, - FunctionInfo{511, D<&IApplicationManagerInterface::GetGameCardWakenReadyEvent>, "GetGameCardWakenReadyEvent"}, - FunctionInfo{512, D<&IApplicationManagerInterface::IsGameCardApplicationRunning>, "IsGameCardApplicationRunning"}, - FunctionInfo{513, nullptr, "Unknown513", MakeVersionGate({20,0,0})}, - FunctionInfo{514, nullptr, "Unknown514", MakeVersionGate({20,0,0})}, - FunctionInfo{515, nullptr, "Unknown515", MakeVersionGate({20,0,0})}, - FunctionInfo{516, nullptr, "Unknown516", MakeVersionGate({21,0,0})}, - FunctionInfo{517, nullptr, "Unknown517", MakeVersionGate({21,0,0})}, - FunctionInfo{518, nullptr, "Unknown518", MakeVersionGate({21,0,0})}, - FunctionInfo{519, nullptr, "Unknown519", MakeVersionGate({21,0,0})}, - FunctionInfo{600, nullptr, "CountApplicationContentMeta"}, - FunctionInfo{601, nullptr, "ListApplicationContentMetaStatus"}, - FunctionInfo{602, nullptr, "ListAvailableAddOnContent"}, - FunctionInfo{603, nullptr, "GetOwnedApplicationContentMetaStatus"}, - FunctionInfo{604, nullptr, "RegisterContentsExternalKey"}, - FunctionInfo{605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"}, - FunctionInfo{606, nullptr, "GetContentMetaStorage"}, - FunctionInfo{607, nullptr, "ListAvailableAddOnContent"}, - FunctionInfo{609, nullptr, "ListAvailabilityAssuredAddOnContent"}, - FunctionInfo{610, nullptr, "GetInstalledContentMetaStorage"}, - FunctionInfo{611, nullptr, "PrepareAddOnContent"}, - FunctionInfo{700, nullptr, "PushDownloadTaskList"}, - FunctionInfo{701, nullptr, "ClearTaskStatusList"}, - FunctionInfo{702, nullptr, "RequestDownloadTaskList"}, - FunctionInfo{703, nullptr, "RequestEnsureDownloadTask"}, - FunctionInfo{704, nullptr, "ListDownloadTaskStatus"}, - FunctionInfo{705, nullptr, "RequestDownloadTaskListData"}, - FunctionInfo{800, nullptr, "RequestVersionList"}, - FunctionInfo{801, nullptr, "ListVersionList"}, - FunctionInfo{802, nullptr, "RequestVersionListData"}, - FunctionInfo{900, nullptr, "GetApplicationRecord"}, - FunctionInfo{901, nullptr, "GetApplicationRecordProperty"}, - FunctionInfo{902, nullptr, "EnableApplicationAutoUpdate"}, - FunctionInfo{903, nullptr, "DisableApplicationAutoUpdate"}, - FunctionInfo{904, D<&IApplicationManagerInterface::TouchApplication>, "TouchApplication"}, - FunctionInfo{905, nullptr, "RequestApplicationUpdate"}, - FunctionInfo{906, D<&IApplicationManagerInterface::IsApplicationUpdateRequested>, "IsApplicationUpdateRequested"}, - FunctionInfo{907, nullptr, "WithdrawApplicationUpdateRequest"}, - FunctionInfo{908, nullptr, "ListApplicationRecordInstalledContentMeta"}, - FunctionInfo{909, nullptr, "WithdrawCleanupAddOnContentsWithNoRightsRecommendation"}, - FunctionInfo{910, nullptr, "HasApplicationRecord"}, - FunctionInfo{911, nullptr, "SetPreInstalledApplication"}, - FunctionInfo{912, nullptr, "ClearPreInstalledApplicationFlag"}, - FunctionInfo{913, nullptr, "ListAllApplicationRecord"}, - FunctionInfo{914, nullptr, "HideApplicationRecord"}, - FunctionInfo{915, nullptr, "ShowApplicationRecord"}, - FunctionInfo{916, nullptr, "IsApplicationAutoDeleteDisabled"}, - FunctionInfo{916, nullptr, "Unknown916", MakeVersionGate({20,0,0})}, - FunctionInfo{917, nullptr, "Unknown917", MakeVersionGate({20,0,0})}, - FunctionInfo{918, nullptr, "Unknown918", MakeVersionGate({20,0,0})}, - FunctionInfo{919, nullptr, "Unknown919", MakeVersionGate({20,0,0})}, - FunctionInfo{920, nullptr, "Unknown920", MakeVersionGate({20,0,0})}, - FunctionInfo{921, nullptr, "Unknown921", MakeVersionGate({20,0,0})}, - FunctionInfo{922, nullptr, "Unknown922", MakeVersionGate({20,0,0})}, - FunctionInfo{923, nullptr, "Unknown923", MakeVersionGate({20,0,0})}, - FunctionInfo{928, nullptr, "Unknown928", MakeVersionGate({20,0,0})}, - FunctionInfo{929, nullptr, "Unknown929", MakeVersionGate({20,0,0})}, - FunctionInfo{930, nullptr, "Unknown930", MakeVersionGate({20,0,0})}, - FunctionInfo{931, nullptr, "Unknown931", MakeVersionGate({20,0,0})}, - FunctionInfo{933, nullptr, "Unknown933", MakeVersionGate({20,0,0})}, - FunctionInfo{934, nullptr, "Unknown934", MakeVersionGate({21,0,0})}, - FunctionInfo{935, nullptr, "Unknown935", MakeVersionGate({21,0,0})}, - FunctionInfo{936, D<&IApplicationManagerInterface::Unknown936>, "Unknown936", MakeVersionGate({21,0,0})}, - FunctionInfo{1000, nullptr, "RequestVerifyApplicationDeprecated"}, - FunctionInfo{1001, nullptr, "CorruptApplicationForDebug"}, - FunctionInfo{1002, nullptr, "RequestVerifyAddOnContentsRights"}, - FunctionInfo{1003, nullptr, "RequestVerifyApplication"}, - FunctionInfo{1004, nullptr, "CorruptContentForDebug"}, - FunctionInfo{1200, nullptr, "NeedsUpdateVulnerability"}, - FunctionInfo{1300, D<&IApplicationManagerInterface::IsAnyApplicationEntityInstalled>, "IsAnyApplicationEntityInstalled"}, - FunctionInfo{1301, nullptr, "DeleteApplicationContentEntities"}, - FunctionInfo{1302, nullptr, "CleanupUnrecordedApplicationEntity"}, - FunctionInfo{1303, nullptr, "CleanupAddOnContentsWithNoRights"}, - FunctionInfo{1304, nullptr, "DeleteApplicationContentEntity"}, - FunctionInfo{1305, nullptr, "TryDeleteRunningApplicationEntity"}, - FunctionInfo{1306, nullptr, "TryDeleteRunningApplicationCompletely"}, - FunctionInfo{1307, nullptr, "TryDeleteRunningApplicationContentEntities"}, - FunctionInfo{1308, nullptr, "DeleteApplicationCompletelyForDebug"}, - FunctionInfo{1309, nullptr, "CleanupUnavailableAddOnContents"}, - FunctionInfo{1310, nullptr, "RequestMoveApplicationEntity"}, - FunctionInfo{1311, nullptr, "EstimateSizeToMove"}, - FunctionInfo{1312, nullptr, "HasMovableEntity"}, - FunctionInfo{1313, nullptr, "CleanupOrphanContents"}, - FunctionInfo{1314, nullptr, "CheckPreconditionSatisfiedToMove"}, - FunctionInfo{1400, nullptr, "PrepareShutdown"}, - FunctionInfo{1500, nullptr, "FormatSdCard"}, - FunctionInfo{1501, nullptr, "NeedsSystemUpdateToFormatSdCard"}, - FunctionInfo{1502, nullptr, "GetLastSdCardFormatUnexpectedResult"}, - FunctionInfo{1504, nullptr, "InsertSdCard"}, - FunctionInfo{1505, nullptr, "RemoveSdCard"}, - FunctionInfo{1506, nullptr, "GetSdCardStartupStatus"}, - FunctionInfo{1508, nullptr, "Unknown1508", MakeVersionGate({20,0,0})}, - FunctionInfo{1509, nullptr, "Unknown1509", MakeVersionGate({20,0,0})}, - FunctionInfo{1510, nullptr, "Unknown1510", MakeVersionGate({20,0,0})}, - FunctionInfo{1511, nullptr, "Unknown1511", MakeVersionGate({20,0,0})}, - FunctionInfo{1512, nullptr, "Unknown1512", MakeVersionGate({20,0,0})}, - FunctionInfo{1600, nullptr, "GetSystemSeedForPseudoDeviceId"}, - FunctionInfo{1601, nullptr, "ResetSystemSeedForPseudoDeviceId"}, - FunctionInfo{1700, nullptr, "ListApplicationDownloadingContentMeta"}, - FunctionInfo{1701, D<&IApplicationManagerInterface::GetApplicationViewDeprecated>, "GetApplicationViewDeprecated"}, - FunctionInfo{1702, nullptr, "GetApplicationDownloadTaskStatus"}, - FunctionInfo{1703, nullptr, "GetApplicationViewDownloadErrorContext"}, - FunctionInfo{1704, D<&IApplicationManagerInterface::GetApplicationViewWithPromotionInfo>, "GetApplicationViewWithPromotionInfo"}, - FunctionInfo{1705, nullptr, "IsPatchAutoDeletableApplication"}, - FunctionInfo{1706, D<&IApplicationManagerInterface::GetApplicationView>, "GetApplicationView"}, - FunctionInfo{1800, nullptr, "IsNotificationSetupCompleted"}, - FunctionInfo{1801, nullptr, "GetLastNotificationInfoCount"}, - FunctionInfo{1802, nullptr, "ListLastNotificationInfo"}, - FunctionInfo{1803, nullptr, "ListNotificationTask"}, - FunctionInfo{1900, nullptr, "IsActiveAccount"}, - FunctionInfo{1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"}, - FunctionInfo{1902, nullptr, "GetApplicationTicketInfo"}, - FunctionInfo{1903, nullptr, "RequestDownloadApplicationPrepurchasedRightsForAccount"}, - FunctionInfo{2000, nullptr, "GetSystemDeliveryInfo"}, - FunctionInfo{2001, nullptr, "SelectLatestSystemDeliveryInfo"}, - FunctionInfo{2002, nullptr, "VerifyDeliveryProtocolVersion"}, - FunctionInfo{2003, nullptr, "GetApplicationDeliveryInfo"}, - FunctionInfo{2004, nullptr, "HasAllContentsToDeliver"}, - FunctionInfo{2005, nullptr, "CompareApplicationDeliveryInfo"}, - FunctionInfo{2006, nullptr, "CanDeliverApplication"}, - FunctionInfo{2007, nullptr, "ListContentMetaKeyToDeliverApplication"}, - FunctionInfo{2008, nullptr, "NeedsSystemUpdateToDeliverApplication"}, - FunctionInfo{2009, nullptr, "EstimateRequiredSize"}, - FunctionInfo{2010, nullptr, "RequestReceiveApplication"}, - FunctionInfo{2011, nullptr, "CommitReceiveApplication"}, - FunctionInfo{2012, nullptr, "GetReceiveApplicationProgress"}, - FunctionInfo{2013, nullptr, "RequestSendApplication"}, - FunctionInfo{2014, nullptr, "GetSendApplicationProgress"}, - FunctionInfo{2015, nullptr, "CompareSystemDeliveryInfo"}, - FunctionInfo{2016, nullptr, "ListNotCommittedContentMeta"}, - FunctionInfo{2017, nullptr, "CreateDownloadTask"}, - FunctionInfo{2018, nullptr, "GetApplicationDeliveryInfoHash"}, - FunctionInfo{2019, nullptr, "Unknown2019", MakeVersionGate({20,0,0})}, - FunctionInfo{2050, D<&IApplicationManagerInterface::GetApplicationRightsOnClient>, "GetApplicationRightsOnClient"}, - FunctionInfo{2051, nullptr, "InvalidateRightsIdCache"}, - FunctionInfo{2052, nullptr, "Unknown2052", MakeVersionGate({20,0,0})}, - FunctionInfo{2053, nullptr, "Unknown2053", MakeVersionGate({20,0,0})}, - FunctionInfo{2100, D<&IApplicationManagerInterface::GetApplicationTerminateResult>, "GetApplicationTerminateResult"}, - FunctionInfo{2101, nullptr, "GetRawApplicationTerminateResult"}, - FunctionInfo{2150, nullptr, "CreateRightsEnvironment"}, - FunctionInfo{2151, nullptr, "DestroyRightsEnvironment"}, - FunctionInfo{2152, nullptr, "ActivateRightsEnvironment"}, - FunctionInfo{2153, nullptr, "DeactivateRightsEnvironment"}, - FunctionInfo{2154, nullptr, "ForceActivateRightsContextForExit"}, - FunctionInfo{2155, nullptr, "UpdateRightsEnvironmentStatus"}, - FunctionInfo{2156, nullptr, "CreateRightsEnvironmentForMicroApplication"}, - FunctionInfo{2160, nullptr, "AddTargetApplicationToRightsEnvironment"}, - FunctionInfo{2161, nullptr, "SetUsersToRightsEnvironment"}, - FunctionInfo{2170, nullptr, "GetRightsEnvironmentStatus"}, - FunctionInfo{2171, nullptr, "GetRightsEnvironmentStatusChangedEvent"}, - FunctionInfo{2180, nullptr, "RequestExtendRightsInRightsEnvironment"}, - FunctionInfo{2181, nullptr, "GetResultOfExtendRightsInRightsEnvironment"}, - FunctionInfo{2182, nullptr, "SetActiveRightsContextUsingStateToRightsEnvironment"}, - FunctionInfo{2183, nullptr, "Unknown2183", MakeVersionGate({20,1,0})}, - FunctionInfo{2190, nullptr, "GetRightsEnvironmentHandleForApplication"}, - FunctionInfo{2199, nullptr, "GetRightsEnvironmentCountForDebug"}, - FunctionInfo{2200, nullptr, "GetGameCardApplicationCopyIdentifier"}, - FunctionInfo{2201, nullptr, "GetInstalledApplicationCopyIdentifier"}, - FunctionInfo{2250, nullptr, "RequestReportActiveELicence"}, - FunctionInfo{2300, nullptr, "ListEventLog"}, - FunctionInfo{2350, nullptr, "PerformAutoUpdateByApplicationId"}, - FunctionInfo{2351, nullptr, "RequestNoDownloadRightsErrorResolution"}, - FunctionInfo{2352, nullptr, "RequestResolveNoDownloadRightsError"}, - FunctionInfo{2353, nullptr, "GetApplicationDownloadTaskInfo"}, - FunctionInfo{2354, nullptr, "PrioritizeApplicationBackgroundTask"}, - FunctionInfo{2355, nullptr, "PreferStorageEfficientUpdate"}, - FunctionInfo{2356, nullptr, "RequestStorageEfficientUpdatePreferable"}, - FunctionInfo{2357, nullptr, "EnableMultiCoreDownload"}, - FunctionInfo{2358, nullptr, "DisableMultiCoreDownload"}, - FunctionInfo{2359, nullptr, "IsMultiCoreDownloadEnabled"}, - FunctionInfo{2360, nullptr, "GetApplicationDownloadTaskCount", MakeVersionGate({19,0,0})}, - FunctionInfo{2361, nullptr, "GetMaxApplicationDownloadTaskCount", MakeVersionGate({19,0,0})}, - FunctionInfo{2362, nullptr, "Unknown2362", MakeVersionGate({20,0,0})}, - FunctionInfo{2363, nullptr, "Unknown2363", MakeVersionGate({20,0,0})}, - FunctionInfo{2364, nullptr, "Unknown2364", MakeVersionGate({20,0,0})}, - FunctionInfo{2365, nullptr, "Unknown2365", MakeVersionGate({20,0,0})}, - FunctionInfo{2366, nullptr, "Unknown2366", MakeVersionGate({20,0,0})}, - FunctionInfo{2367, nullptr, "Unknown2367", MakeVersionGate({20,0,0})}, - FunctionInfo{2368, nullptr, "Unknown2368", MakeVersionGate({20,0,0})}, - FunctionInfo{2369, nullptr, "Unknown2369", MakeVersionGate({21,0,0})}, - FunctionInfo{2400, nullptr, "GetPromotionInfo"}, - FunctionInfo{2401, nullptr, "CountPromotionInfo"}, - FunctionInfo{2402, nullptr, "ListPromotionInfo"}, - FunctionInfo{2403, nullptr, "ImportPromotionJsonForDebug"}, - FunctionInfo{2404, nullptr, "ClearPromotionInfoForDebug"}, - FunctionInfo{2500, nullptr, "ConfirmAvailableTime"}, - FunctionInfo{2510, nullptr, "CreateApplicationResource"}, - FunctionInfo{2511, nullptr, "GetApplicationResource"}, - FunctionInfo{2513, nullptr, "LaunchMicroApplication"}, - FunctionInfo{2514, nullptr, "ClearTaskOfAsyncTaskManager"}, - FunctionInfo{2515, nullptr, "CleanupAllPlaceHolderAndFragmentsIfNoTask"}, - FunctionInfo{2516, nullptr, "EnsureApplicationCertificate"}, - FunctionInfo{2517, nullptr, "CreateApplicationInstance"}, - FunctionInfo{2518, nullptr, "UpdateQualificationForDebug"}, - FunctionInfo{2519, nullptr, "IsQualificationTransitionSupported"}, - FunctionInfo{2520, D<&IApplicationManagerInterface::IsQualificationTransitionSupportedByProcessId>, "IsQualificationTransitionSupportedByProcessId"}, - FunctionInfo{2521, nullptr, "GetRightsUserChangedEvent"}, - FunctionInfo{2522, nullptr, "IsRomRedirectionAvailable"}, - FunctionInfo{2523, nullptr, "GetProgramId", MakeVersionGate({17,0,0})}, - FunctionInfo{2524, nullptr, "Unknown2524", MakeVersionGate({19,0,0})}, - FunctionInfo{2525, nullptr, "Unknown2525", MakeVersionGate({20,0,0})}, - FunctionInfo{2800, nullptr, "GetApplicationIdOfPreomia"}, - FunctionInfo{3000, nullptr, "RegisterDeviceLockKey"}, - FunctionInfo{3001, nullptr, "UnregisterDeviceLockKey"}, - FunctionInfo{3002, nullptr, "VerifyDeviceLockKey"}, - FunctionInfo{3003, nullptr, "HideApplicationIcon"}, - FunctionInfo{3004, nullptr, "ShowApplicationIcon"}, - FunctionInfo{3005, nullptr, "HideApplicationTitle"}, - FunctionInfo{3006, nullptr, "ShowApplicationTitle"}, - FunctionInfo{3007, nullptr, "EnableGameCard"}, - FunctionInfo{3008, nullptr, "DisableGameCard"}, - FunctionInfo{3009, nullptr, "EnableLocalContentShare"}, - FunctionInfo{3010, nullptr, "DisableLocalContentShare"}, - FunctionInfo{3011, nullptr, "IsApplicationIconHidden"}, - FunctionInfo{3012, nullptr, "IsApplicationTitleHidden"}, - FunctionInfo{3013, nullptr, "IsGameCardEnabled"}, - FunctionInfo{3014, nullptr, "IsLocalContentShareEnabled"}, - FunctionInfo{3050, nullptr, "ListAssignELicenseTaskResult"}, - FunctionInfo{3104, nullptr, "GetApplicationNintendoLogo", MakeVersionGate({18,0,0})}, - FunctionInfo{3105, nullptr, "GetApplicationStartupMovie", MakeVersionGate({18,0,0})}, - FunctionInfo{4000, nullptr, "Unknown4000", MakeVersionGate({20,0,0})}, - FunctionInfo{4004, nullptr, "Unknown4004", MakeVersionGate({20,0,0})}, - FunctionInfo{4006, nullptr, "Unknown4006", MakeVersionGate({20,0,0})}, - FunctionInfo{4007, nullptr, "Unknown4007", MakeVersionGate({20,0,0})}, - FunctionInfo{4008, nullptr, "Unknown4008", MakeVersionGate({20,0,0})}, - FunctionInfo{4009, nullptr, "Unknown4009", MakeVersionGate({20,0,0})}, - FunctionInfo{4010, nullptr, "Unknown4010", MakeVersionGate({20,0,0})}, - FunctionInfo{4011, nullptr, "Unknown4011", MakeVersionGate({20,0,0})}, - FunctionInfo{4012, nullptr, "Unknown4012", MakeVersionGate({20,0,0})}, - FunctionInfo{4013, nullptr, "Unknown4013", MakeVersionGate({20,0,0})}, - FunctionInfo{4015, nullptr, "Unknown4015", MakeVersionGate({20,0,0})}, - FunctionInfo{4017, nullptr, "Unknown4017", MakeVersionGate({20,0,0})}, - FunctionInfo{4019, nullptr, "Unknown4019", MakeVersionGate({20,0,0})}, - FunctionInfo{4020, nullptr, "Unknown4020", MakeVersionGate({20,0,0})}, - FunctionInfo{4021, nullptr, "Unknown4021", MakeVersionGate({20,0,0})}, - FunctionInfo{4022, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4022", MakeVersionGate({20,0,0})}, - FunctionInfo{4023, D<&IApplicationManagerInterface::Unknown4023>, "Unknown4023", MakeVersionGate({20,0,0})}, - FunctionInfo{4024, nullptr, "Unknown4024", MakeVersionGate({20,0,0})}, - FunctionInfo{4025, nullptr, "Unknown4025", MakeVersionGate({20,0,0})}, - FunctionInfo{4026, nullptr, "Unknown4026", MakeVersionGate({20,0,0})}, - FunctionInfo{4027, nullptr, "Unknown4027", MakeVersionGate({20,0,0})}, - FunctionInfo{4028, nullptr, "Unknown4028", MakeVersionGate({20,0,0})}, - FunctionInfo{4029, nullptr, "Unknown4029", MakeVersionGate({20,0,0})}, - FunctionInfo{4030, nullptr, "Unknown4030", MakeVersionGate({20,0,0})}, - FunctionInfo{4031, nullptr, "Unknown4031", MakeVersionGate({20,0,0})}, - FunctionInfo{4032, nullptr, "Unknown4032", MakeVersionGate({20,0,0})}, - FunctionInfo{4033, nullptr, "Unknown4033", MakeVersionGate({20,0,0})}, - FunctionInfo{4034, nullptr, "Unknown4034", MakeVersionGate({20,0,0})}, - FunctionInfo{4035, nullptr, "Unknown4035", MakeVersionGate({20,0,0})}, - FunctionInfo{4037, nullptr, "Unknown4037", MakeVersionGate({20,0,0})}, - FunctionInfo{4038, nullptr, "Unknown4038", MakeVersionGate({20,0,0})}, - FunctionInfo{4039, nullptr, "Unknown4039", MakeVersionGate({20,0,0})}, - FunctionInfo{4040, nullptr, "Unknown4040", MakeVersionGate({20,0,0})}, - FunctionInfo{4041, nullptr, "Unknown4041", MakeVersionGate({20,0,0})}, - FunctionInfo{4042, D<&IApplicationManagerInterface::Unknown4042>, "Unknown4042", MakeVersionGate({20,0,0})}, - FunctionInfo{4043, nullptr, "Unknown4043", MakeVersionGate({20,0,0})}, - FunctionInfo{4044, nullptr, "Unknown4044", MakeVersionGate({20,0,0})}, - FunctionInfo{4045, nullptr, "Unknown4045", MakeVersionGate({20,0,0})}, - FunctionInfo{4046, nullptr, "Unknown4046", MakeVersionGate({20,0,0})}, - FunctionInfo{4049, nullptr, "Unknown4049", MakeVersionGate({20,0,0})}, - FunctionInfo{4050, nullptr, "Unknown4050", MakeVersionGate({20,0,0})}, - FunctionInfo{4051, nullptr, "Unknown4051", MakeVersionGate({20,0,0})}, - FunctionInfo{4052, nullptr, "Unknown4052", MakeVersionGate({20,0,0})}, - FunctionInfo{4053, D<&IApplicationManagerInterface::Unknown4053>, "Unknown4053", MakeVersionGate({20,0,0})}, - FunctionInfo{4054, nullptr, "Unknown4054", MakeVersionGate({20,0,0})}, - FunctionInfo{4055, nullptr, "Unknown4055", MakeVersionGate({20,0,0})}, - FunctionInfo{4056, nullptr, "Unknown4056", MakeVersionGate({20,0,0})}, - FunctionInfo{4057, nullptr, "Unknown4057", MakeVersionGate({20,0,0})}, - FunctionInfo{4058, nullptr, "Unknown4058", MakeVersionGate({20,0,0})}, - FunctionInfo{4059, nullptr, "Unknown4059", MakeVersionGate({20,0,0})}, - FunctionInfo{4060, nullptr, "Unknown4060", MakeVersionGate({20,0,0})}, - FunctionInfo{4061, nullptr, "Unknown4061", MakeVersionGate({20,0,0})}, - FunctionInfo{4062, nullptr, "Unknown4062", MakeVersionGate({20,0,0})}, - FunctionInfo{4063, nullptr, "Unknown4063", MakeVersionGate({20,0,0})}, - FunctionInfo{4064, nullptr, "Unknown4064", MakeVersionGate({20,0,0})}, - FunctionInfo{4065, nullptr, "Unknown4065", MakeVersionGate({20,0,0})}, - FunctionInfo{4066, nullptr, "Unknown4066", MakeVersionGate({20,0,0})}, - FunctionInfo{4067, nullptr, "Unknown4067", MakeVersionGate({20,0,0})}, - FunctionInfo{4068, nullptr, "Unknown4068", MakeVersionGate({20,0,0})}, - FunctionInfo{4069, nullptr, "Unknown4069", MakeVersionGate({20,0,0})}, - FunctionInfo{4070, nullptr, "Unknown4070", MakeVersionGate({20,0,0})}, - FunctionInfo{4071, nullptr, "Unknown4071", MakeVersionGate({20,0,0})}, - FunctionInfo{4072, nullptr, "Unknown4072", MakeVersionGate({20,0,0})}, - FunctionInfo{4073, nullptr, "Unknown4073", MakeVersionGate({20,0,0})}, - FunctionInfo{4074, nullptr, "Unknown4074", MakeVersionGate({20,0,0})}, - FunctionInfo{4075, nullptr, "Unknown4075", MakeVersionGate({20,0,0})}, - FunctionInfo{4076, nullptr, "Unknown4076", MakeVersionGate({20,0,0})}, - FunctionInfo{4077, nullptr, "Unknown4077", MakeVersionGate({20,0,0})}, - FunctionInfo{4078, nullptr, "Unknown4078", MakeVersionGate({20,0,0})}, - FunctionInfo{4079, nullptr, "Unknown4079", MakeVersionGate({20,0,0})}, - FunctionInfo{4080, nullptr, "Unknown4080", MakeVersionGate({20,0,0})}, - FunctionInfo{4081, nullptr, "Unknown4081", MakeVersionGate({20,0,0})}, - FunctionInfo{4083, nullptr, "Unknown4083", MakeVersionGate({20,0,0})}, - FunctionInfo{4084, nullptr, "Unknown4084", MakeVersionGate({20,0,0})}, - FunctionInfo{4085, nullptr, "Unknown4085", MakeVersionGate({20,0,0})}, - FunctionInfo{4086, nullptr, "Unknown4086", MakeVersionGate({20,0,0})}, - FunctionInfo{4087, nullptr, "Unknown4087", MakeVersionGate({20,0,0})}, - FunctionInfo{4088, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4088", MakeVersionGate({20,0,0})}, - FunctionInfo{4089, nullptr, "Unknown4089", MakeVersionGate({20,0,0})}, - FunctionInfo{4090, nullptr, "Unknown4090", MakeVersionGate({20,0,0})}, - FunctionInfo{4091, nullptr, "Unknown4091", MakeVersionGate({20,0,0})}, - FunctionInfo{4092, nullptr, "Unknown4092", MakeVersionGate({20,0,0})}, - FunctionInfo{4093, nullptr, "Unknown4093", MakeVersionGate({20,0,0})}, - FunctionInfo{4094, nullptr, "Unknown4094", MakeVersionGate({20,0,0})}, - FunctionInfo{4095, nullptr, "Unknown4095", MakeVersionGate({20,0,0})}, - FunctionInfo{4096, nullptr, "Unknown4096", MakeVersionGate({20,0,0})}, - FunctionInfo{4097, nullptr, "Unknown4097", MakeVersionGate({20,0,0})}, - FunctionInfo{4099, nullptr, "Unknown4099", MakeVersionGate({21,0,0})}, - FunctionInfo{4105, D<&IApplicationManagerInterface::Unknown4105>, "Unknown4105", MakeVersionGate({23,0,0})}, - FunctionInfo{5000, nullptr, "Unknown5000", MakeVersionGate({18,0,0})}, - FunctionInfo{5001, nullptr, "Unknown5001", MakeVersionGate({18,0,0})}, - FunctionInfo{9999, nullptr, "GetApplicationCertificate", MakeVersionGate({10,0,0}, {10,2,0})} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_) : ServiceFramework{system_, "IApplicationManagerInterface"}, service_context{system, "IApplicationManagerInterface"}, @@ -484,6 +32,458 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_ gamecard_update_detection_event{service_context}, gamecard_mount_status_event{service_context}, gamecard_mount_failure_event{service_context}, gamecard_waken_ready_event{service_context}, unknown_event{service_context} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IApplicationManagerInterface::ListApplicationRecord>, "ListApplicationRecord"}, + {1, nullptr, "GenerateApplicationRecordCount"}, + {2, D<&IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent>, "GetApplicationRecordUpdateSystemEvent"}, + {3, nullptr, "GetApplicationViewDeprecated"}, + {4, D<&IApplicationManagerInterface::DeleteApplicationEntity>, "DeleteApplicationEntity"}, + {5, D<&IApplicationManagerInterface::DeleteApplicationCompletely>, "DeleteApplicationCompletely"}, + {6, nullptr, "IsAnyApplicationEntityRedundant"}, + {7, nullptr, "DeleteRedundantApplicationEntity"}, + {8, nullptr, "IsApplicationEntityMovable"}, + {9, nullptr, "MoveApplicationEntity"}, + {11, nullptr, "CalculateApplicationOccupiedSize"}, + {16, &IApplicationManagerInterface::PushApplicationRecord, "PushApplicationRecord"}, + {17, nullptr, "ListApplicationRecordContentMeta"}, + {19, nullptr, "LaunchApplicationOld"}, + {21, nullptr, "GetApplicationContentPath"}, + {22, nullptr, "TerminateApplication"}, + {23, nullptr, "ResolveApplicationContentPath"}, + {26, nullptr, "BeginInstallApplication"}, + {27, nullptr, "DeleteApplicationRecord"}, + {30, nullptr, "RequestApplicationUpdateInfo"}, + {31, nullptr, "RequestUpdateApplication"}, + {32, nullptr, "CancelApplicationDownload"}, + {33, nullptr, "ResumeApplicationDownload"}, + {35, nullptr, "UpdateVersionList"}, + {36, nullptr, "PushLaunchVersion"}, + {37, nullptr, "ListRequiredVersion"}, + {38, D<&IApplicationManagerInterface::CheckApplicationLaunchVersion>, "CheckApplicationLaunchVersion"}, + {39, nullptr, "CheckApplicationLaunchRights"}, + {40, D<&IApplicationManagerInterface::GetApplicationLogoData>, "GetApplicationLogoData"}, + {41, nullptr, "CalculateApplicationDownloadRequiredSize"}, + {42, nullptr, "CleanupSdCard"}, + {43, D<&IApplicationManagerInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"}, + {44, D<&IApplicationManagerInterface::GetSdCardMountStatusChangedEvent>, "GetSdCardMountStatusChangedEvent"}, + {45, nullptr, "GetGameCardAttachmentEvent"}, + {46, nullptr, "GetGameCardAttachmentInfo"}, + {47, D<&IApplicationManagerInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"}, + {48, D<&IApplicationManagerInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"}, + {49, nullptr, "GetSdCardRemovedEvent"}, + {52, D<&IApplicationManagerInterface::GetGameCardUpdateDetectionEvent>, "GetGameCardUpdateDetectionEvent"}, + {53, nullptr, "DisableApplicationAutoDelete"}, + {54, nullptr, "EnableApplicationAutoDelete"}, + {55, D<&IApplicationManagerInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"}, + {56, nullptr, "SetApplicationTerminateResult"}, + {57, nullptr, "ClearApplicationTerminateResult"}, + {58, nullptr, "GetLastSdCardMountUnexpectedResult"}, + {59, D<&IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"}, + {60, nullptr, "ConvertLanguageCodeToApplicationLanguage"}, + {61, nullptr, "GetBackgroundDownloadStressTaskInfo"}, + {62, nullptr, "GetGameCardStopper"}, + {63, nullptr, "IsSystemProgramInstalled"}, + {64, nullptr, "StartApplyDeltaTask"}, + {65, nullptr, "GetRequestServerStopper"}, + {66, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"}, + {67, nullptr, "CancelApplicationApplyDelta"}, + {68, nullptr, "ResumeApplicationApplyDelta"}, + {69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"}, + {70, D<&IApplicationManagerInterface::ResumeAll>, "ResumeAll"}, + {71, D<&IApplicationManagerInterface::GetStorageSize>, "GetStorageSize"}, + {80, nullptr, "RequestDownloadApplication"}, + {81, nullptr, "RequestDownloadAddOnContent"}, + {82, nullptr, "DownloadApplication"}, + {83, nullptr, "CheckApplicationResumeRights"}, + {84, nullptr, "GetDynamicCommitEvent"}, + {85, nullptr, "RequestUpdateApplication2"}, + {86, nullptr, "EnableApplicationCrashReport"}, + {87, nullptr, "IsApplicationCrashReportEnabled"}, + {90, nullptr, "BoostSystemMemoryResourceLimit"}, + {91, nullptr, "DeprecatedLaunchApplication"}, + {92, nullptr, "GetRunningApplicationProgramId"}, + {93, nullptr, "GetMainApplicationProgramIndex"}, + {94, nullptr, "LaunchApplication"}, + {95, nullptr, "GetApplicationLaunchInfo"}, + {96, nullptr, "AcquireApplicationLaunchInfo"}, + {97, nullptr, "GetMainApplicationProgramIndexByApplicationLaunchInfo"}, + {98, nullptr, "EnableApplicationAllThreadDumpOnCrash"}, + {99, nullptr, "LaunchDevMenu"}, + {100, nullptr, "ResetToFactorySettings"}, + {101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"}, + {102, nullptr, "ResetToFactorySettingsForRefurbishment"}, + {103, nullptr, "ResetToFactorySettingsWithPlatformRegion"}, + {104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"}, + {105, nullptr, "RequestResetToFactorySettingsSecurely"}, + {106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"}, + {200, nullptr, "CalculateUserSaveDataStatistics"}, + {201, nullptr, "DeleteUserSaveDataAll"}, + {210, nullptr, "DeleteUserSystemSaveData"}, + {211, nullptr, "DeleteSaveData"}, + {220, nullptr, "UnregisterNetworkServiceAccount"}, + {221, D<&IApplicationManagerInterface::UnregisterNetworkServiceAccountWithUserSaveDataDeletion>, "UnregisterNetworkServiceAccountWithUserSaveDataDeletion"}, + {300, nullptr, "GetApplicationShellEvent"}, + {301, nullptr, "PopApplicationShellEventInfo"}, + {302, nullptr, "LaunchLibraryApplet"}, + {303, nullptr, "TerminateLibraryApplet"}, + {304, nullptr, "LaunchSystemApplet"}, + {305, nullptr, "TerminateSystemApplet"}, + {306, nullptr, "LaunchOverlayApplet"}, + {307, nullptr, "TerminateOverlayApplet"}, + {400, D<&IApplicationManagerInterface::GetApplicationControlData>, "GetApplicationControlData"}, + {401, nullptr, "InvalidateAllApplicationControlCache"}, + {402, nullptr, "RequestDownloadApplicationControlData"}, + {403, nullptr, "GetMaxApplicationControlCacheCount"}, + {404, nullptr, "InvalidateApplicationControlCache"}, + {405, nullptr, "ListApplicationControlCacheEntryInfo"}, + {406, nullptr, "GetApplicationControlProperty"}, + {407, &IApplicationManagerInterface::ListApplicationTitle, "ListApplicationTitle"}, + {408, &IApplicationManagerInterface::ListApplicationIcon, "ListApplicationIcon"}, + {411, nullptr, "Unknown411"}, //19.0.0+ + {412, nullptr, "Unknown412"}, //19.0.0+ + {413, nullptr, "Unknown413"}, //19.0.0+ + {414, nullptr, "Unknown414"}, //19.0.0+ + {415, nullptr, "Unknown415"}, //19.0.0+ + {416, nullptr, "Unknown416"}, //19.0.0+ + {417, nullptr, "InvalidateAllApplicationControlCacheOfTheStage"}, //19.0.0+ + {418, nullptr, "InvalidateApplicationControlCacheOfTheStage"}, //19.0.0+ + {419, D<&IApplicationManagerInterface::RequestDownloadApplicationControlDataInBackground>, "RequestDownloadApplicationControlDataInBackground"}, + {420, nullptr, "CloneApplicationControlDataCacheForDebug"}, + {421, nullptr, "Unknown421"}, //20.0.0+ + {422, nullptr, "Unknown422"}, //20.0.0+ + {423, nullptr, "Unknown423"}, //20.0.0+ + {424, nullptr, "Unknown424"}, //20.0.0+ + {425, nullptr, "Unknown425"}, //20.0.0+ + {426, nullptr, "Unknown426"}, //20.0.0+ + {427, nullptr, "Unknown427"}, //20.0.0+ + {428, nullptr, "Unknown428"}, //21.0.0+ + {429, nullptr, "Unknown429"}, //21.0.0+ + {430, nullptr, "Unknown430"}, //21.0.0+ + {502, nullptr, "RequestCheckGameCardRegistration"}, + {503, nullptr, "RequestGameCardRegistrationGoldPoint"}, + {504, nullptr, "RequestRegisterGameCard"}, + {505, D<&IApplicationManagerInterface::GetGameCardMountFailureEvent>, "GetGameCardMountFailureEvent"}, + {506, nullptr, "IsGameCardInserted"}, + {507, nullptr, "EnsureGameCardAccess"}, + {508, nullptr, "GetLastGameCardMountFailureResult"}, + {509, nullptr, "ListApplicationIdOnGameCard"}, + {510, nullptr, "GetGameCardPlatformRegion"}, + {511, D<&IApplicationManagerInterface::GetGameCardWakenReadyEvent>, "GetGameCardWakenReadyEvent"}, + {512, D<&IApplicationManagerInterface::IsGameCardApplicationRunning>, "IsGameCardApplicationRunning"}, + {513, nullptr, "Unknown513"}, //20.0.0+ + {514, nullptr, "Unknown514"}, //20.0.0+ + {515, nullptr, "Unknown515"}, //20.0.0+ + {516, nullptr, "Unknown516"}, //21.0.0+ + {517, nullptr, "Unknown517"}, //21.0.0+ + {518, nullptr, "Unknown518"}, //21.0.0+ + {519, nullptr, "Unknown519"}, //21.0.0+ + {600, nullptr, "CountApplicationContentMeta"}, + {601, nullptr, "ListApplicationContentMetaStatus"}, + {602, nullptr, "ListAvailableAddOnContent"}, + {603, nullptr, "GetOwnedApplicationContentMetaStatus"}, + {604, nullptr, "RegisterContentsExternalKey"}, + {605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"}, + {606, nullptr, "GetContentMetaStorage"}, + {607, nullptr, "ListAvailableAddOnContent"}, + {609, nullptr, "ListAvailabilityAssuredAddOnContent"}, + {610, nullptr, "GetInstalledContentMetaStorage"}, + {611, nullptr, "PrepareAddOnContent"}, + {700, nullptr, "PushDownloadTaskList"}, + {701, nullptr, "ClearTaskStatusList"}, + {702, nullptr, "RequestDownloadTaskList"}, + {703, nullptr, "RequestEnsureDownloadTask"}, + {704, nullptr, "ListDownloadTaskStatus"}, + {705, nullptr, "RequestDownloadTaskListData"}, + {800, nullptr, "RequestVersionList"}, + {801, nullptr, "ListVersionList"}, + {802, nullptr, "RequestVersionListData"}, + {900, nullptr, "GetApplicationRecord"}, + {901, nullptr, "GetApplicationRecordProperty"}, + {902, nullptr, "EnableApplicationAutoUpdate"}, + {903, nullptr, "DisableApplicationAutoUpdate"}, + {904, D<&IApplicationManagerInterface::TouchApplication>, "TouchApplication"}, + {905, nullptr, "RequestApplicationUpdate"}, + {906, D<&IApplicationManagerInterface::IsApplicationUpdateRequested>, "IsApplicationUpdateRequested"}, + {907, nullptr, "WithdrawApplicationUpdateRequest"}, + {908, nullptr, "ListApplicationRecordInstalledContentMeta"}, + {909, nullptr, "WithdrawCleanupAddOnContentsWithNoRightsRecommendation"}, + {910, nullptr, "HasApplicationRecord"}, + {911, nullptr, "SetPreInstalledApplication"}, + {912, nullptr, "ClearPreInstalledApplicationFlag"}, + {913, nullptr, "ListAllApplicationRecord"}, + {914, nullptr, "HideApplicationRecord"}, + {915, nullptr, "ShowApplicationRecord"}, + {916, nullptr, "IsApplicationAutoDeleteDisabled"}, + {916, nullptr, "Unknown916"}, //20.0.0+ + {917, nullptr, "Unknown917"}, //20.0.0+ + {918, nullptr, "Unknown918"}, //20.0.0+ + {919, nullptr, "Unknown919"}, //20.0.0+ + {920, nullptr, "Unknown920"}, //20.0.0+ + {921, nullptr, "Unknown921"}, //20.0.0+ + {922, nullptr, "Unknown922"}, //20.0.0+ + {923, nullptr, "Unknown923"}, //20.0.0+ + {928, nullptr, "Unknown928"}, //20.0.0+ + {929, nullptr, "Unknown929"}, //20.0.0+ + {930, nullptr, "Unknown930"}, //20.0.0+ + {931, nullptr, "Unknown931"}, //20.0.0+ + {933, nullptr, "Unknown933"}, //20.0.0+ + {934, nullptr, "Unknown934"}, //21.0.0+ + {935, nullptr, "Unknown935"}, //21.0.0+ + {936, D<&IApplicationManagerInterface::Unknown936>, "Unknown936"}, //21.0.0+ + {1000, nullptr, "RequestVerifyApplicationDeprecated"}, + {1001, nullptr, "CorruptApplicationForDebug"}, + {1002, nullptr, "RequestVerifyAddOnContentsRights"}, + {1003, nullptr, "RequestVerifyApplication"}, + {1004, nullptr, "CorruptContentForDebug"}, + {1200, nullptr, "NeedsUpdateVulnerability"}, + {1300, D<&IApplicationManagerInterface::IsAnyApplicationEntityInstalled>, "IsAnyApplicationEntityInstalled"}, + {1301, nullptr, "DeleteApplicationContentEntities"}, + {1302, nullptr, "CleanupUnrecordedApplicationEntity"}, + {1303, nullptr, "CleanupAddOnContentsWithNoRights"}, + {1304, nullptr, "DeleteApplicationContentEntity"}, + {1305, nullptr, "TryDeleteRunningApplicationEntity"}, + {1306, nullptr, "TryDeleteRunningApplicationCompletely"}, + {1307, nullptr, "TryDeleteRunningApplicationContentEntities"}, + {1308, nullptr, "DeleteApplicationCompletelyForDebug"}, + {1309, nullptr, "CleanupUnavailableAddOnContents"}, + {1310, nullptr, "RequestMoveApplicationEntity"}, + {1311, nullptr, "EstimateSizeToMove"}, + {1312, nullptr, "HasMovableEntity"}, + {1313, nullptr, "CleanupOrphanContents"}, + {1314, nullptr, "CheckPreconditionSatisfiedToMove"}, + {1400, nullptr, "PrepareShutdown"}, + {1500, nullptr, "FormatSdCard"}, + {1501, nullptr, "NeedsSystemUpdateToFormatSdCard"}, + {1502, nullptr, "GetLastSdCardFormatUnexpectedResult"}, + {1504, nullptr, "InsertSdCard"}, + {1505, nullptr, "RemoveSdCard"}, + {1506, nullptr, "GetSdCardStartupStatus"}, + {1508, nullptr, "Unknown1508"}, //20.0.0+ + {1509, nullptr, "Unknown1509"}, //20.0.0+ + {1510, nullptr, "Unknown1510"}, //20.0.0+ + {1511, nullptr, "Unknown1511"}, //20.0.0+ + {1512, nullptr, "Unknown1512"}, //20.0.0+ + {1600, nullptr, "GetSystemSeedForPseudoDeviceId"}, + {1601, nullptr, "ResetSystemSeedForPseudoDeviceId"}, + {1700, nullptr, "ListApplicationDownloadingContentMeta"}, + {1701, D<&IApplicationManagerInterface::GetApplicationViewDeprecated>, "GetApplicationViewDeprecated"}, + {1702, nullptr, "GetApplicationDownloadTaskStatus"}, + {1703, nullptr, "GetApplicationViewDownloadErrorContext"}, + {1704, D<&IApplicationManagerInterface::GetApplicationViewWithPromotionInfo>, "GetApplicationViewWithPromotionInfo"}, + {1705, nullptr, "IsPatchAutoDeletableApplication"}, + {1706, D<&IApplicationManagerInterface::GetApplicationView>, "GetApplicationView"}, + {1800, nullptr, "IsNotificationSetupCompleted"}, + {1801, nullptr, "GetLastNotificationInfoCount"}, + {1802, nullptr, "ListLastNotificationInfo"}, + {1803, nullptr, "ListNotificationTask"}, + {1900, nullptr, "IsActiveAccount"}, + {1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"}, + {1902, nullptr, "GetApplicationTicketInfo"}, + {1903, nullptr, "RequestDownloadApplicationPrepurchasedRightsForAccount"}, + {2000, nullptr, "GetSystemDeliveryInfo"}, + {2001, nullptr, "SelectLatestSystemDeliveryInfo"}, + {2002, nullptr, "VerifyDeliveryProtocolVersion"}, + {2003, nullptr, "GetApplicationDeliveryInfo"}, + {2004, nullptr, "HasAllContentsToDeliver"}, + {2005, nullptr, "CompareApplicationDeliveryInfo"}, + {2006, nullptr, "CanDeliverApplication"}, + {2007, nullptr, "ListContentMetaKeyToDeliverApplication"}, + {2008, nullptr, "NeedsSystemUpdateToDeliverApplication"}, + {2009, nullptr, "EstimateRequiredSize"}, + {2010, nullptr, "RequestReceiveApplication"}, + {2011, nullptr, "CommitReceiveApplication"}, + {2012, nullptr, "GetReceiveApplicationProgress"}, + {2013, nullptr, "RequestSendApplication"}, + {2014, nullptr, "GetSendApplicationProgress"}, + {2015, nullptr, "CompareSystemDeliveryInfo"}, + {2016, nullptr, "ListNotCommittedContentMeta"}, + {2017, nullptr, "CreateDownloadTask"}, + {2018, nullptr, "GetApplicationDeliveryInfoHash"}, + {2019, nullptr, "Unknown2019"}, //20.0.0+ + {2050, D<&IApplicationManagerInterface::GetApplicationRightsOnClient>, "GetApplicationRightsOnClient"}, + {2051, nullptr, "InvalidateRightsIdCache"}, + {2052, nullptr, "Unknown2052"}, //20.0.0+ + {2053, nullptr, "Unknown2053"}, //20.0.0+ + {2100, D<&IApplicationManagerInterface::GetApplicationTerminateResult>, "GetApplicationTerminateResult"}, + {2101, nullptr, "GetRawApplicationTerminateResult"}, + {2150, nullptr, "CreateRightsEnvironment"}, + {2151, nullptr, "DestroyRightsEnvironment"}, + {2152, nullptr, "ActivateRightsEnvironment"}, + {2153, nullptr, "DeactivateRightsEnvironment"}, + {2154, nullptr, "ForceActivateRightsContextForExit"}, + {2155, nullptr, "UpdateRightsEnvironmentStatus"}, + {2156, nullptr, "CreateRightsEnvironmentForMicroApplication"}, + {2160, nullptr, "AddTargetApplicationToRightsEnvironment"}, + {2161, nullptr, "SetUsersToRightsEnvironment"}, + {2170, nullptr, "GetRightsEnvironmentStatus"}, + {2171, nullptr, "GetRightsEnvironmentStatusChangedEvent"}, + {2180, nullptr, "RequestExtendRightsInRightsEnvironment"}, + {2181, nullptr, "GetResultOfExtendRightsInRightsEnvironment"}, + {2182, nullptr, "SetActiveRightsContextUsingStateToRightsEnvironment"}, + {2183, nullptr, "Unknown2183"}, //20.1.0+ + {2190, nullptr, "GetRightsEnvironmentHandleForApplication"}, + {2199, nullptr, "GetRightsEnvironmentCountForDebug"}, + {2200, nullptr, "GetGameCardApplicationCopyIdentifier"}, + {2201, nullptr, "GetInstalledApplicationCopyIdentifier"}, + {2250, nullptr, "RequestReportActiveELicence"}, + {2300, nullptr, "ListEventLog"}, + {2350, nullptr, "PerformAutoUpdateByApplicationId"}, + {2351, nullptr, "RequestNoDownloadRightsErrorResolution"}, + {2352, nullptr, "RequestResolveNoDownloadRightsError"}, + {2353, nullptr, "GetApplicationDownloadTaskInfo"}, + {2354, nullptr, "PrioritizeApplicationBackgroundTask"}, + {2355, nullptr, "PreferStorageEfficientUpdate"}, + {2356, nullptr, "RequestStorageEfficientUpdatePreferable"}, + {2357, nullptr, "EnableMultiCoreDownload"}, + {2358, nullptr, "DisableMultiCoreDownload"}, + {2359, nullptr, "IsMultiCoreDownloadEnabled"}, + {2360, nullptr, "GetApplicationDownloadTaskCount"}, //19.0.0+ + {2361, nullptr, "GetMaxApplicationDownloadTaskCount"}, //19.0.0+ + {2362, nullptr, "Unknown2362"}, //20.0.0+ + {2363, nullptr, "Unknown2363"}, //20.0.0+ + {2364, nullptr, "Unknown2364"}, //20.0.0+ + {2365, nullptr, "Unknown2365"}, //20.0.0+ + {2366, nullptr, "Unknown2366"}, //20.0.0+ + {2367, nullptr, "Unknown2367"}, //20.0.0+ + {2368, nullptr, "Unknown2368"}, //20.0.0+ + {2369, nullptr, "Unknown2369"}, //21.0.0+ + {2400, nullptr, "GetPromotionInfo"}, + {2401, nullptr, "CountPromotionInfo"}, + {2402, nullptr, "ListPromotionInfo"}, + {2403, nullptr, "ImportPromotionJsonForDebug"}, + {2404, nullptr, "ClearPromotionInfoForDebug"}, + {2500, nullptr, "ConfirmAvailableTime"}, + {2510, nullptr, "CreateApplicationResource"}, + {2511, nullptr, "GetApplicationResource"}, + {2513, nullptr, "LaunchMicroApplication"}, + {2514, nullptr, "ClearTaskOfAsyncTaskManager"}, + {2515, nullptr, "CleanupAllPlaceHolderAndFragmentsIfNoTask"}, + {2516, nullptr, "EnsureApplicationCertificate"}, + {2517, nullptr, "CreateApplicationInstance"}, + {2518, nullptr, "UpdateQualificationForDebug"}, + {2519, nullptr, "IsQualificationTransitionSupported"}, + {2520, D<&IApplicationManagerInterface::IsQualificationTransitionSupportedByProcessId>, "IsQualificationTransitionSupportedByProcessId"}, + {2521, nullptr, "GetRightsUserChangedEvent"}, + {2522, nullptr, "IsRomRedirectionAvailable"}, + {2523, nullptr, "GetProgramId"}, //17.0.0+ + {2524, nullptr, "Unknown2524"}, //19.0.0+ + {2525, nullptr, "Unknown2525"}, //20.0.0+ + {2800, nullptr, "GetApplicationIdOfPreomia"}, + {3000, nullptr, "RegisterDeviceLockKey"}, + {3001, nullptr, "UnregisterDeviceLockKey"}, + {3002, nullptr, "VerifyDeviceLockKey"}, + {3003, nullptr, "HideApplicationIcon"}, + {3004, nullptr, "ShowApplicationIcon"}, + {3005, nullptr, "HideApplicationTitle"}, + {3006, nullptr, "ShowApplicationTitle"}, + {3007, nullptr, "EnableGameCard"}, + {3008, nullptr, "DisableGameCard"}, + {3009, nullptr, "EnableLocalContentShare"}, + {3010, nullptr, "DisableLocalContentShare"}, + {3011, nullptr, "IsApplicationIconHidden"}, + {3012, nullptr, "IsApplicationTitleHidden"}, + {3013, nullptr, "IsGameCardEnabled"}, + {3014, nullptr, "IsLocalContentShareEnabled"}, + {3050, nullptr, "ListAssignELicenseTaskResult"}, + {3104, nullptr, "GetApplicationNintendoLogo"}, //18.0.0+ + {3105, nullptr, "GetApplicationStartupMovie"}, //18.0.0+ + {4000, nullptr, "Unknown4000"}, //20.0.0+ + {4004, nullptr, "Unknown4004"}, //20.0.0+ + {4006, nullptr, "Unknown4006"}, //20.0.0+ + {4007, nullptr, "Unknown4007"}, //20.0.0+ + {4008, nullptr, "Unknown4008"}, //20.0.0+ + {4009, nullptr, "Unknown4009"}, //20.0.0+ + {4010, nullptr, "Unknown4010"}, //20.0.0+ + {4011, nullptr, "Unknown4011"}, //20.0.0+ + {4012, nullptr, "Unknown4012"}, //20.0.0+ + {4013, nullptr, "Unknown4013"}, //20.0.0+ + {4015, nullptr, "Unknown4015"}, //20.0.0+ + {4017, nullptr, "Unknown4017"}, //20.0.0+ + {4019, nullptr, "Unknown4019"}, //20.0.0+ + {4020, nullptr, "Unknown4020"}, //20.0.0+ + {4021, nullptr, "Unknown4021"}, //20.0.0+ + {4022, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4022"}, //20.0.0+ + {4023, D<&IApplicationManagerInterface::Unknown4023>, "Unknown4023"}, //20.0.0+ + {4024, nullptr, "Unknown4024"}, //20.0.0+ + {4025, nullptr, "Unknown4025"}, //20.0.0+ + {4026, nullptr, "Unknown4026"}, //20.0.0+ + {4027, nullptr, "Unknown4027"}, //20.0.0+ + {4028, nullptr, "Unknown4028"}, //20.0.0+ + {4029, nullptr, "Unknown4029"}, //20.0.0+ + {4030, nullptr, "Unknown4030"}, //20.0.0+ + {4031, nullptr, "Unknown4031"}, //20.0.0+ + {4032, nullptr, "Unknown4032"}, //20.0.0+ + {4033, nullptr, "Unknown4033"}, //20.0.0+ + {4034, nullptr, "Unknown4034"}, //20.0.0+ + {4035, nullptr, "Unknown4035"}, //20.0.0+ + {4037, nullptr, "Unknown4037"}, //20.0.0+ + {4038, nullptr, "Unknown4038"}, //20.0.0+ + {4039, nullptr, "Unknown4039"}, //20.0.0+ + {4040, nullptr, "Unknown4040"}, //20.0.0+ + {4041, nullptr, "Unknown4041"}, //20.0.0+ + {4042, D<&IApplicationManagerInterface::Unknown4042>, "Unknown4042"}, //20.0.0+ + {4043, nullptr, "Unknown4043"}, //20.0.0+ + {4044, nullptr, "Unknown4044"}, //20.0.0+ + {4045, nullptr, "Unknown4045"}, //20.0.0+ + {4046, nullptr, "Unknown4046"}, //20.0.0+ + {4049, nullptr, "Unknown4049"}, //20.0.0+ + {4050, nullptr, "Unknown4050"}, //20.0.0+ + {4051, nullptr, "Unknown4051"}, //20.0.0+ + {4052, nullptr, "Unknown4052"}, //20.0.0+ + {4053, D<&IApplicationManagerInterface::Unknown4053>, "Unknown4053"}, //20.0.0+ + {4054, nullptr, "Unknown4054"}, //20.0.0+ + {4055, nullptr, "Unknown4055"}, //20.0.0+ + {4056, nullptr, "Unknown4056"}, //20.0.0+ + {4057, nullptr, "Unknown4057"}, //20.0.0+ + {4058, nullptr, "Unknown4058"}, //20.0.0+ + {4059, nullptr, "Unknown4059"}, //20.0.0+ + {4060, nullptr, "Unknown4060"}, //20.0.0+ + {4061, nullptr, "Unknown4061"}, //20.0.0+ + {4062, nullptr, "Unknown4062"}, //20.0.0+ + {4063, nullptr, "Unknown4063"}, //20.0.0+ + {4064, nullptr, "Unknown4064"}, //20.0.0+ + {4065, nullptr, "Unknown4065"}, //20.0.0+ + {4066, nullptr, "Unknown4066"}, //20.0.0+ + {4067, nullptr, "Unknown4067"}, //20.0.0+ + {4068, nullptr, "Unknown4068"}, //20.0.0+ + {4069, nullptr, "Unknown4069"}, //20.0.0+ + {4070, nullptr, "Unknown4070"}, //20.0.0+ + {4071, nullptr, "Unknown4071"}, //20.0.0+ + {4072, nullptr, "Unknown4072"}, //20.0.0+ + {4073, nullptr, "Unknown4073"}, //20.0.0+ + {4074, nullptr, "Unknown4074"}, //20.0.0+ + {4075, nullptr, "Unknown4075"}, //20.0.0+ + {4076, nullptr, "Unknown4076"}, //20.0.0+ + {4077, nullptr, "Unknown4077"}, //20.0.0+ + {4078, nullptr, "Unknown4078"}, //20.0.0+ + {4079, nullptr, "Unknown4079"}, //20.0.0+ + {4080, nullptr, "Unknown4080"}, //20.0.0+ + {4081, nullptr, "Unknown4081"}, //20.0.0+ + {4083, nullptr, "Unknown4083"}, //20.0.0+ + {4084, nullptr, "Unknown4084"}, //20.0.0+ + {4085, nullptr, "Unknown4085"}, //20.0.0+ + {4086, nullptr, "Unknown4086"}, //20.0.0+ + {4087, nullptr, "Unknown4087"}, //20.0.0+ + {4088, D<&IApplicationManagerInterface::Unknown4022>, "Unknown4088"}, //20.0.0+ + {4089, nullptr, "Unknown4089"}, //20.0.0+ + {4090, nullptr, "Unknown4090"}, //20.0.0+ + {4091, nullptr, "Unknown4091"}, //20.0.0+ + {4092, nullptr, "Unknown4092"}, //20.0.0+ + {4093, nullptr, "Unknown4093"}, //20.0.0+ + {4094, nullptr, "Unknown4094"}, //20.0.0+ + {4095, nullptr, "Unknown4095"}, //20.0.0+ + {4096, nullptr, "Unknown4096"}, //20.0.0+ + {4097, nullptr, "Unknown4097"}, //20.0.0+ + {4099, nullptr, "Unknown4099"}, //21.0.0+ + {4105, D<&IApplicationManagerInterface::Unknown4105>, "Unknown4105"}, //23.0.0+ + {5000, nullptr, "Unknown5000"}, //18.0.0+ + {5001, nullptr, "Unknown5001"}, //18.0.0+ + {9999, nullptr, "GetApplicationCertificate"}, //10.0.0-10.2.0 + }; + // clang-format on + + RegisterHandlers(functions); } IApplicationManagerInterface::~IApplicationManagerInterface() = default; diff --git a/src/core/hle/service/ns/application_manager_interface.h b/src/core/hle/service/ns/application_manager_interface.h index 592068823c..c4ca66f319 100644 --- a/src/core/hle/service/ns/application_manager_interface.h +++ b/src/core/hle/service/ns/application_manager_interface.h @@ -85,7 +85,6 @@ public: void PushApplicationRecord(HLERequestContext& ctx); void ListApplicationTitle(HLERequestContext& ctx); void ListApplicationIcon(HLERequestContext& ctx); - std::optional FindRequest(u32 key) override; private: KernelHelpers::ServiceContext service_context; diff --git a/src/core/hle/service/ns/application_version_interface.cpp b/src/core/hle/service/ns/application_version_interface.cpp index e1e747f6d2..0ed9514c2c 100644 --- a/src/core/hle/service/ns/application_version_interface.cpp +++ b/src/core/hle/service/ns/application_version_interface.cpp @@ -10,6 +10,25 @@ namespace Service::NS { IApplicationVersionInterface::IApplicationVersionInterface(Core::System& system_) : ServiceFramework{system_, "IApplicationVersionInterface"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetLaunchRequiredVersion"}, + {1, nullptr, "UpgradeLaunchRequiredVersion"}, + {35, nullptr, "UpdateVersionList"}, + {36, nullptr, "PushLaunchVersion"}, + {37, nullptr, "ListRequiredVersion"}, + {800, nullptr, "RequestVersionList"}, + {801, nullptr, "ListVersionList"}, + {802, nullptr, "RequestVersionListData"}, + {900, nullptr, "ImportAutoUpdatePolicyJsonForDebug"}, + {901, nullptr, "ListDefaultAutoUpdatePolicy"}, + {902, nullptr, "ListAutoUpdatePolicyForSpecificApplication"}, + {1000, nullptr, "PerformAutoUpdate"}, + {1001, nullptr, "ListAutoUpdateSchedule"}, + }; + // clang-format on + + RegisterHandlers(functions); } IApplicationVersionInterface::~IApplicationVersionInterface() = default; diff --git a/src/core/hle/service/ns/application_version_interface.h b/src/core/hle/service/ns/application_version_interface.h index c1f7710a00..fcbb966a4d 100644 --- a/src/core/hle/service/ns/application_version_interface.h +++ b/src/core/hle/service/ns/application_version_interface.h @@ -14,25 +14,6 @@ class IApplicationVersionInterface final : public ServiceFramework FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetLaunchRequiredVersion"}, - FunctionInfo{1, nullptr, "UpgradeLaunchRequiredVersion"}, - FunctionInfo{35, nullptr, "UpdateVersionList"}, - FunctionInfo{36, nullptr, "PushLaunchVersion"}, - FunctionInfo{37, nullptr, "ListRequiredVersion"}, - FunctionInfo{800, nullptr, "RequestVersionList"}, - FunctionInfo{801, nullptr, "ListVersionList"}, - FunctionInfo{802, nullptr, "RequestVersionListData"}, - FunctionInfo{900, nullptr, "ImportAutoUpdatePolicyJsonForDebug"}, - FunctionInfo{901, nullptr, "ListDefaultAutoUpdatePolicy"}, - FunctionInfo{902, nullptr, "ListAutoUpdatePolicyForSpecificApplication"}, - FunctionInfo{1000, nullptr, "PerformAutoUpdate"}, - FunctionInfo{1001, nullptr, "ListAutoUpdateSchedule"} - ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/async_result.cpp b/src/core/hle/service/ns/async_result.cpp index d93c510141..8617280bef 100644 --- a/src/core/hle/service/ns/async_result.cpp +++ b/src/core/hle/service/ns/async_result.cpp @@ -8,17 +8,17 @@ namespace Service::NS { -std::optional IAsyncResult::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Get"}, - FunctionInfo{1, D<&IAsyncResult::Cancel>, "Cancel"}, - FunctionInfo{2, nullptr, "GetErrorContext", MakeVersionGate({4,0,0})} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IAsyncResult::IAsyncResult(Core::System& system_, Service::Event* event_) : ServiceFramework{system_, "nn::ns::detail::IAsyncResult"}, event{event_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Get"}, + {1, D<&IAsyncResult::Cancel>, "Cancel"}, + {2, nullptr, "GetErrorContext"}, // 4.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); } IAsyncResult::~IAsyncResult() = default; diff --git a/src/core/hle/service/ns/async_result.h b/src/core/hle/service/ns/async_result.h index 1cad75bf47..914ea5a42c 100644 --- a/src/core/hle/service/ns/async_result.h +++ b/src/core/hle/service/ns/async_result.h @@ -13,7 +13,6 @@ public: private: Result Cancel(); - std::optional FindRequest(u32 key) override; Service::Event* event{}; }; diff --git a/src/core/hle/service/ns/content_management_interface.cpp b/src/core/hle/service/ns/content_management_interface.cpp index 45922ffab3..39b9cb6f70 100644 --- a/src/core/hle/service/ns/content_management_interface.cpp +++ b/src/core/hle/service/ns/content_management_interface.cpp @@ -15,6 +15,22 @@ namespace Service::NS { IContentManagementInterface::IContentManagementInterface(Core::System& system_) : ServiceFramework{system_, "IContentManagementInterface"} { + // clang-format off + static const FunctionInfo functions[] = { + {11, D<&IContentManagementInterface::CalculateApplicationOccupiedSize>, "CalculateApplicationOccupiedSize"}, + {43, D<&IContentManagementInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"}, + {47, D<&IContentManagementInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"}, + {48, D<&IContentManagementInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"}, + {71, D<&IContentManagementInterface::GetUnknown71>, "Unknown71"}, + {600, nullptr, "CountApplicationContentMeta"}, + {601, nullptr, "ListApplicationContentMetaStatus"}, + {605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"}, + {607, nullptr, "IsAnyApplicationRunning"}, + {608, nullptr, "Unknown608"}, //21.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); } IContentManagementInterface::~IContentManagementInterface() = default; diff --git a/src/core/hle/service/ns/content_management_interface.h b/src/core/hle/service/ns/content_management_interface.h index bddd044b45..df0c51a184 100644 --- a/src/core/hle/service/ns/content_management_interface.h +++ b/src/core/hle/service/ns/content_management_interface.h @@ -24,22 +24,6 @@ public: Result GetTotalSpaceSize(Out out_total_space_size, FileSys::StorageId storage_id); Result GetFreeSpaceSize(Out out_free_space_size, FileSys::StorageId storage_id); Result GetUnknown71(Out out_value_a, Out out_value_b, u8 flag); - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{11, D<&IContentManagementInterface::CalculateApplicationOccupiedSize>, "CalculateApplicationOccupiedSize"}, - FunctionInfo{43, D<&IContentManagementInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"}, - FunctionInfo{47, D<&IContentManagementInterface::GetTotalSpaceSize>, "GetTotalSpaceSize"}, - FunctionInfo{48, D<&IContentManagementInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"}, - FunctionInfo{71, D<&IContentManagementInterface::GetUnknown71>, "Unknown71"}, - FunctionInfo{600, nullptr, "CountApplicationContentMeta"}, - FunctionInfo{601, nullptr, "ListApplicationContentMetaStatus"}, - FunctionInfo{605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"}, - FunctionInfo{607, nullptr, "IsAnyApplicationRunning"}, - FunctionInfo{608, nullptr, "Unknown608", MakeVersionGate({21,0,0})} - ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/develop_interface.cpp b/src/core/hle/service/ns/develop_interface.cpp index 2fc41cd7dd..5a44c61f1b 100644 --- a/src/core/hle/service/ns/develop_interface.cpp +++ b/src/core/hle/service/ns/develop_interface.cpp @@ -9,6 +9,31 @@ namespace Service::NS { IDevelopInterface::IDevelopInterface(Core::System& system_) : ServiceFramework{system_, "ns:dev"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "LaunchProgram"}, + {1, nullptr, "TerminateProcess"}, + {2, nullptr, "TerminateProgram"}, + {4, nullptr, "GetShellEvent"}, + {5, nullptr, "GetShellEventInfo"}, + {6, nullptr, "TerminateApplication"}, + {7, nullptr, "PrepareLaunchProgramFromHost"}, + {8, nullptr, "LaunchApplicationFromHost"}, + {9, nullptr, "LaunchApplicationWithStorageIdForDevelop"}, + {10, nullptr, "IsSystemMemoryResourceLimitBoosted"}, + {11, nullptr, "GetRunningApplicationProcessIdForDevelop"}, + {12, nullptr, "SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop"}, + {13, nullptr, "CreateApplicationResourceForDevelop"}, + {14, nullptr, "IsPreomiaForDevelop"}, + {15, nullptr, "GetApplicationProgramIdFromHost"}, + {16, nullptr, "RefreshCachedDebugValues"}, + {17, nullptr, "PrepareLaunchApplicationFromHost"}, + {18, nullptr, "GetLaunchEvent"}, + {19, nullptr, "GetLaunchResult"}, + }; + // clang-format on + + RegisterHandlers(functions); } IDevelopInterface::~IDevelopInterface() = default; diff --git a/src/core/hle/service/ns/develop_interface.h b/src/core/hle/service/ns/develop_interface.h index 55e54fa38d..d7cb9e7a56 100644 --- a/src/core/hle/service/ns/develop_interface.h +++ b/src/core/hle/service/ns/develop_interface.h @@ -14,31 +14,6 @@ class IDevelopInterface final : public ServiceFramework { public: explicit IDevelopInterface(Core::System& system_); ~IDevelopInterface() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "LaunchProgram"}, - FunctionInfo{1, nullptr, "TerminateProcess"}, - FunctionInfo{2, nullptr, "TerminateProgram"}, - FunctionInfo{4, nullptr, "GetShellEvent"}, - FunctionInfo{5, nullptr, "GetShellEventInfo"}, - FunctionInfo{6, nullptr, "TerminateApplication"}, - FunctionInfo{7, nullptr, "PrepareLaunchProgramFromHost"}, - FunctionInfo{8, nullptr, "LaunchApplicationFromHost"}, - FunctionInfo{9, nullptr, "LaunchApplicationWithStorageIdForDevelop"}, - FunctionInfo{10, nullptr, "IsSystemMemoryResourceLimitBoosted"}, - FunctionInfo{11, nullptr, "GetRunningApplicationProcessIdForDevelop"}, - FunctionInfo{12, nullptr, "SetCurrentApplicationRightsEnvironmentCanBeActiveForDevelop"}, - FunctionInfo{13, nullptr, "CreateApplicationResourceForDevelop"}, - FunctionInfo{14, nullptr, "IsPreomiaForDevelop"}, - FunctionInfo{15, nullptr, "GetApplicationProgramIdFromHost"}, - FunctionInfo{16, nullptr, "RefreshCachedDebugValues"}, - FunctionInfo{17, nullptr, "PrepareLaunchApplicationFromHost"}, - FunctionInfo{18, nullptr, "GetLaunchEvent"}, - FunctionInfo{19, nullptr, "GetLaunchResult"} - ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/document_interface.cpp b/src/core/hle/service/ns/document_interface.cpp index f9a1e2267a..00593d1edc 100644 --- a/src/core/hle/service/ns/document_interface.cpp +++ b/src/core/hle/service/ns/document_interface.cpp @@ -12,6 +12,15 @@ namespace Service::NS { IDocumentInterface::IDocumentInterface(Core::System& system_) : ServiceFramework{system_, "IDocumentInterface"} { + // clang-format off + static const FunctionInfo functions[] = { + {21, nullptr, "GetApplicationContentPath"}, + {23, D<&IDocumentInterface::ResolveApplicationContentPath>, "ResolveApplicationContentPath"}, + {92, D<&IDocumentInterface::GetRunningApplicationProgramId>, "GetRunningApplicationProgramId"}, + }; + // clang-format on + + RegisterHandlers(functions); } IDocumentInterface::~IDocumentInterface() = default; diff --git a/src/core/hle/service/ns/document_interface.h b/src/core/hle/service/ns/document_interface.h index 43a194c3e6..4c8b15b54a 100644 --- a/src/core/hle/service/ns/document_interface.h +++ b/src/core/hle/service/ns/document_interface.h @@ -20,15 +20,6 @@ public: private: Result ResolveApplicationContentPath(ContentPath content_path); Result GetRunningApplicationProgramId(Out out_program_id, u64 caller_program_id); - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{21, nullptr, "GetApplicationContentPath"}, - FunctionInfo{23, D<&IDocumentInterface::ResolveApplicationContentPath>, "ResolveApplicationContentPath"}, - FunctionInfo{92, D<&IDocumentInterface::GetRunningApplicationProgramId>, "GetRunningApplicationProgramId"} - ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/download_task_interface.cpp b/src/core/hle/service/ns/download_task_interface.cpp index 9fe6ca512f..18db60e7b0 100644 --- a/src/core/hle/service/ns/download_task_interface.cpp +++ b/src/core/hle/service/ns/download_task_interface.cpp @@ -11,6 +11,21 @@ namespace Service::NS { IDownloadTaskInterface::IDownloadTaskInterface(Core::System& system_) : ServiceFramework{system_, "IDownloadTaskInterface"} { + // clang-format off + static const FunctionInfo functions[] = { + {701, nullptr, "ClearTaskStatusList"}, + {702, nullptr, "RequestDownloadTaskList"}, + {703, nullptr, "RequestEnsureDownloadTask"}, + {704, nullptr, "ListDownloadTaskStatus"}, + {705, nullptr, "RequestDownloadTaskListData"}, + {706, nullptr, "TryCommitCurrentApplicationDownloadTask"}, + {707, D<&IDownloadTaskInterface::EnableAutoCommit>, "EnableAutoCommit"}, + {708, D<&IDownloadTaskInterface::DisableAutoCommit>, "DisableAutoCommit"}, + {709, nullptr, "TriggerDynamicCommitEvent"}, + }; + // clang-format on + + RegisterHandlers(functions); } IDownloadTaskInterface::~IDownloadTaskInterface() = default; diff --git a/src/core/hle/service/ns/download_task_interface.h b/src/core/hle/service/ns/download_task_interface.h index 0fd2bacd42..1c46339daa 100644 --- a/src/core/hle/service/ns/download_task_interface.h +++ b/src/core/hle/service/ns/download_task_interface.h @@ -18,21 +18,6 @@ public: private: Result EnableAutoCommit(); Result DisableAutoCommit(); - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{701, nullptr, "ClearTaskStatusList"}, - FunctionInfo{702, nullptr, "RequestDownloadTaskList"}, - FunctionInfo{703, nullptr, "RequestEnsureDownloadTask"}, - FunctionInfo{704, nullptr, "ListDownloadTaskStatus"}, - FunctionInfo{705, nullptr, "RequestDownloadTaskListData"}, - FunctionInfo{706, nullptr, "TryCommitCurrentApplicationDownloadTask"}, - FunctionInfo{707, D<&IDownloadTaskInterface::EnableAutoCommit>, "EnableAutoCommit"}, - FunctionInfo{708, D<&IDownloadTaskInterface::DisableAutoCommit>, "DisableAutoCommit"}, - FunctionInfo{709, nullptr, "TriggerDynamicCommitEvent"} - ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/dynamic_rights_interface.cpp b/src/core/hle/service/ns/dynamic_rights_interface.cpp index 951ef4c4b2..0301085670 100644 --- a/src/core/hle/service/ns/dynamic_rights_interface.cpp +++ b/src/core/hle/service/ns/dynamic_rights_interface.cpp @@ -9,43 +9,43 @@ namespace Service::NS { -std::optional IDynamicRightsInterface::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestApplicationRightsOnServer"}, - FunctionInfo{1, nullptr, "RequestAssignRights"}, - FunctionInfo{4, nullptr, "DeprecatedRequestAssignRightsToResume"}, - FunctionInfo{5, D<&IDynamicRightsInterface::VerifyActivatedRightsOwners>, "VerifyActivatedRightsOwners"}, - FunctionInfo{6, nullptr, "DeprecatedGetApplicationRightsStatus"}, - FunctionInfo{7, nullptr, "RequestPrefetchForDynamicRights"}, - FunctionInfo{8, nullptr, "GetDynamicRightsState"}, - FunctionInfo{9, nullptr, "RequestApplicationRightsOnServerToResume"}, - FunctionInfo{10, nullptr, "RequestAssignRightsToResume"}, - FunctionInfo{11, nullptr, "GetActivatedRightsUsers"}, - FunctionInfo{12, nullptr, "GetApplicationRightsStatus"}, - FunctionInfo{13, D<&IDynamicRightsInterface::GetRunningApplicationStatus>, "GetRunningApplicationStatus"}, - FunctionInfo{14, nullptr, "SelectApplicationLicense"}, - FunctionInfo{15, nullptr, "RequestContentsAuthorizationToken"}, - FunctionInfo{16, nullptr, "QualifyUser"}, - FunctionInfo{17, nullptr, "QualifyUserWithProcessId"}, - FunctionInfo{18, D<&IDynamicRightsInterface::NotifyApplicationRightsCheckStart>, "NotifyApplicationRightsCheckStart"}, - FunctionInfo{19, nullptr, "UpdateUserList"}, - FunctionInfo{20, nullptr, "IsRightsLostUser"}, - FunctionInfo{21, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"}, - FunctionInfo{22, nullptr, "GetLimitedApplicationLicense"}, - FunctionInfo{23, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"}, - FunctionInfo{24, nullptr, "NotifyLimitedApplicationLicenseUpgradableEventForDebug"}, - FunctionInfo{25, nullptr, "RequestProceedDynamicRightsState"}, - FunctionInfo{26, D<&IDynamicRightsInterface::HasAccountRestrictedRightsInRunningApplications>, "HasAccountRestrictedRightsInRunningApplications"}, - FunctionInfo{27, nullptr, "Unknown27", MakeVersionGate({20,0,0})}, - FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,0,0})}, - FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({21,0,0})}, - FunctionInfo{30, nullptr, "Unknown30", MakeVersionGate({21,0,0})} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IDynamicRightsInterface::IDynamicRightsInterface(Core::System& system_) : ServiceFramework{system_, "DynamicRightsInterface"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestApplicationRightsOnServer"}, + {1, nullptr, "RequestAssignRights"}, + {4, nullptr, "DeprecatedRequestAssignRightsToResume"}, + {5, D<&IDynamicRightsInterface::VerifyActivatedRightsOwners>, "VerifyActivatedRightsOwners"}, + {6, nullptr, "DeprecatedGetApplicationRightsStatus"}, + {7, nullptr, "RequestPrefetchForDynamicRights"}, + {8, nullptr, "GetDynamicRightsState"}, + {9, nullptr, "RequestApplicationRightsOnServerToResume"}, + {10, nullptr, "RequestAssignRightsToResume"}, + {11, nullptr, "GetActivatedRightsUsers"}, + {12, nullptr, "GetApplicationRightsStatus"}, + {13, D<&IDynamicRightsInterface::GetRunningApplicationStatus>, "GetRunningApplicationStatus"}, + {14, nullptr, "SelectApplicationLicense"}, + {15, nullptr, "RequestContentsAuthorizationToken"}, + {16, nullptr, "QualifyUser"}, + {17, nullptr, "QualifyUserWithProcessId"}, + {18, D<&IDynamicRightsInterface::NotifyApplicationRightsCheckStart>, "NotifyApplicationRightsCheckStart"}, + {19, nullptr, "UpdateUserList"}, + {20, nullptr, "IsRightsLostUser"}, + {21, nullptr, "SetRequiredAddOnContentsOnContentsAvailabilityTransition"}, + {22, nullptr, "GetLimitedApplicationLicense"}, + {23, nullptr, "GetLimitedApplicationLicenseUpgradableEvent"}, + {24, nullptr, "NotifyLimitedApplicationLicenseUpgradableEventForDebug"}, + {25, nullptr, "RequestProceedDynamicRightsState"}, + {26, D<&IDynamicRightsInterface::HasAccountRestrictedRightsInRunningApplications>, "HasAccountRestrictedRightsInRunningApplications"}, + {27, nullptr, "Unknown27"}, //20.0.0+ + {28, nullptr, "Unknown28"}, //20.0.0+ + {29, nullptr, "Unknown29"}, //21.0.0+ + {30, nullptr, "Unknown30"}, //21.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); } IDynamicRightsInterface::~IDynamicRightsInterface() = default; diff --git a/src/core/hle/service/ns/dynamic_rights_interface.h b/src/core/hle/service/ns/dynamic_rights_interface.h index e8a1d81491..c3270aee05 100644 --- a/src/core/hle/service/ns/dynamic_rights_interface.h +++ b/src/core/hle/service/ns/dynamic_rights_interface.h @@ -21,8 +21,6 @@ private: Result GetRunningApplicationStatus(Out out_status, u64 rights_handle); Result VerifyActivatedRightsOwners(u64 rights_handle); Result HasAccountRestrictedRightsInRunningApplications(Out out_is_restricted); - - std::optional FindRequest(u32 key) override; }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/ecommerce_interface.cpp b/src/core/hle/service/ns/ecommerce_interface.cpp index 5687d09a02..b8794bb5fb 100644 --- a/src/core/hle/service/ns/ecommerce_interface.cpp +++ b/src/core/hle/service/ns/ecommerce_interface.cpp @@ -10,6 +10,19 @@ namespace Service::NS { IECommerceInterface::IECommerceInterface(Core::System& system_) : ServiceFramework{system_, "IECommerceInterface"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RequestLinkDevice"}, + {1, nullptr, "RequestCleanupAllPreInstalledApplications"}, + {2, nullptr, "RequestCleanupPreInstalledApplication"}, + {3, nullptr, "RequestSyncRights"}, + {4, nullptr, "RequestUnlinkDevice"}, + {5, nullptr, "RequestRevokeAllELicense"}, + {6, nullptr, "RequestSyncRightsBasedOnAssignedELicenses"}, + }; + // clang-format on + + RegisterHandlers(functions); } IECommerceInterface::~IECommerceInterface() = default; diff --git a/src/core/hle/service/ns/ecommerce_interface.h b/src/core/hle/service/ns/ecommerce_interface.h index d020ff5ef8..6ff9512123 100644 --- a/src/core/hle/service/ns/ecommerce_interface.h +++ b/src/core/hle/service/ns/ecommerce_interface.h @@ -14,19 +14,6 @@ class IECommerceInterface final : public ServiceFramework { public: explicit IECommerceInterface(Core::System& system_); ~IECommerceInterface() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RequestLinkDevice"}, - FunctionInfo{1, nullptr, "RequestCleanupAllPreInstalledApplications"}, - FunctionInfo{2, nullptr, "RequestCleanupPreInstalledApplication"}, - FunctionInfo{3, nullptr, "RequestSyncRights"}, - FunctionInfo{4, nullptr, "RequestUnlinkDevice"}, - FunctionInfo{5, nullptr, "RequestRevokeAllELicense"}, - FunctionInfo{6, nullptr, "RequestSyncRightsBasedOnAssignedELicenses"} - ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/factory_reset_interface.cpp b/src/core/hle/service/ns/factory_reset_interface.cpp index 1fc6edcc9b..11cdefb4be 100644 --- a/src/core/hle/service/ns/factory_reset_interface.cpp +++ b/src/core/hle/service/ns/factory_reset_interface.cpp @@ -8,21 +8,21 @@ namespace Service::NS { -std::optional IFactoryResetInterface::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{100, nullptr, "ResetToFactorySettings"}, - FunctionInfo{101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"}, - FunctionInfo{102, nullptr, "ResetToFactorySettingsForRefurbishment"}, - FunctionInfo{103, nullptr, "ResetToFactorySettingsWithPlatformRegion"}, - FunctionInfo{104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"}, - FunctionInfo{105, nullptr, "RequestResetToFactorySettingsSecurely"}, - FunctionInfo{106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IFactoryResetInterface::IFactoryResetInterface(Core::System& system_) : ServiceFramework{system_, "IFactoryResetInterface"} { + // clang-format off + static const FunctionInfo functions[] = { + {100, nullptr, "ResetToFactorySettings"}, + {101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"}, + {102, nullptr, "ResetToFactorySettingsForRefurbishment"}, + {103, nullptr, "ResetToFactorySettingsWithPlatformRegion"}, + {104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"}, + {105, nullptr, "RequestResetToFactorySettingsSecurely"}, + {106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"}, + }; + // clang-format on + + RegisterHandlers(functions); } IFactoryResetInterface::~IFactoryResetInterface() = default; diff --git a/src/core/hle/service/ns/factory_reset_interface.h b/src/core/hle/service/ns/factory_reset_interface.h index 3d5700fb71..8181d6b379 100644 --- a/src/core/hle/service/ns/factory_reset_interface.h +++ b/src/core/hle/service/ns/factory_reset_interface.h @@ -14,7 +14,6 @@ class IFactoryResetInterface final : public ServiceFramework FindRequest(u32 key) override; }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp index ff1654517b..fe057422ce 100644 --- a/src/core/hle/service/ns/ns.cpp +++ b/src/core/hle/service/ns/ns.cpp @@ -19,25 +19,25 @@ namespace Service::NS { class INotifyService final : public ServiceFramework { public: - explicit INotifyService(Core::System& system_) : ServiceFramework{system_, "pdm:ntfy"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "NotifyAppletEvent" }, - FunctionInfo{2, nullptr, "NotifyOperationModeChangeEvent" }, - FunctionInfo{3, nullptr, "NotifyPowerStateChangeEvent" }, - FunctionInfo{4, nullptr, "NotifyClearAllEvent" }, - FunctionInfo{5, nullptr, "NotifyEventForDebug" }, - FunctionInfo{6, nullptr, "SuspendUserAccountEventService" }, - FunctionInfo{7, nullptr, "ResumeUserAccountEventService" }, - FunctionInfo{8, nullptr, "NotifyLibraryAppletEvent" }, - FunctionInfo{9, nullptr, "Cmd9" }, - FunctionInfo{20, nullptr, "Cmd20" }, - FunctionInfo{30, nullptr, "Cmd30" }, - FunctionInfo{100, nullptr, "Cmd100" }, - FunctionInfo{101, nullptr, "Cmd101" } - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit INotifyService(Core::System& system_) : ServiceFramework{system_, "pdm:ntfy"} { + // clang-format off + static const FunctionInfo functions[] = { + { 0, nullptr, "NotifyAppletEvent" }, + { 2, nullptr, "NotifyOperationModeChangeEvent" }, + { 3, nullptr, "NotifyPowerStateChangeEvent" }, + { 4, nullptr, "NotifyClearAllEvent" }, + { 5, nullptr, "NotifyEventForDebug" }, + { 6, nullptr, "SuspendUserAccountEventService" }, + { 7, nullptr, "ResumeUserAccountEventService" }, + { 8, nullptr, "NotifyLibraryAppletEvent" }, + { 9, nullptr, "Cmd9" }, + { 20, nullptr, "Cmd20" }, + { 30, nullptr, "Cmd30" }, + { 100, nullptr, "Cmd100" }, + { 101, nullptr, "Cmd101" }, + }; + // clang-format on + RegisterHandlers(functions); } }; @@ -45,10 +45,18 @@ class IVulnerabilityManagerInterface final : public ServiceFramework { public: explicit IVulnerabilityManagerInterface(Core::System& system_) - : ServiceFramework{system_, "ns:vm"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "ns:vm"} { + // clang-format off + static const FunctionInfo functions[] = { + {1200, D<&IVulnerabilityManagerInterface::NeedsUpdateVulnerability>, "NeedsUpdateVulnerability"}, + {1201, nullptr, "UpdateSafeSystemVersionForDebug"}, + {1202, nullptr, "GetSafeSystemVersion"}, + {3100, D<&IVulnerabilityManagerInterface::GetSafeSystemVersionCheckInfo>, "GetSafeSystemVersionCheckInfo"}, + {3101, nullptr, "RequestUpdateSafeSystemVersionCheckInfo"}, + {3102, D<&IVulnerabilityManagerInterface::ResetSafeSystemVersionCheckInfo>, "ResetSafeSystemVersionCheckInfo"}, + }; + // clang-format on + RegisterHandlers(functions); } ~IVulnerabilityManagerInterface() override = default; @@ -68,15 +76,6 @@ public: LOG_WARNING(Service_NS, "(STUBBED)"); R_SUCCEED(); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1200, D<&IVulnerabilityManagerInterface::NeedsUpdateVulnerability>, "NeedsUpdateVulnerability"}, - FunctionInfo{1201, nullptr, "UpdateSafeSystemVersionForDebug"}, - FunctionInfo{1202, nullptr, "GetSafeSystemVersion"}, - FunctionInfo{3100, D<&IVulnerabilityManagerInterface::GetSafeSystemVersionCheckInfo>, "GetSafeSystemVersionCheckInfo"}, - FunctionInfo{3101, nullptr, "RequestUpdateSafeSystemVersionCheckInfo"}, - FunctionInfo{3102, D<&IVulnerabilityManagerInterface::ResetSafeSystemVersionCheckInfo>, "ResetSafeSystemVersionCheckInfo"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/ns/ns.h b/src/core/hle/service/ns/ns.h index f79b4ae3d6..2b14d115ca 100644 --- a/src/core/hle/service/ns/ns.h +++ b/src/core/hle/service/ns/ns.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/ns/ns_results.h b/src/core/hle/service/ns/ns_results.h index 16d2ea6f7b..52f4c0ea59 100644 --- a/src/core/hle/service/ns/ns_results.h +++ b/src/core/hle/service/ns/ns_results.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/ns/platform_service_manager.cpp b/src/core/hle/service/ns/platform_service_manager.cpp index dea6cb5c16..bf93a2edfa 100644 --- a/src/core/hle/service/ns/platform_service_manager.cpp +++ b/src/core/hle/service/ns/platform_service_manager.cpp @@ -27,28 +27,6 @@ namespace Service::NS { -std::optional IPlatformServiceManager::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IPlatformServiceManager::RequestLoad>, "RequestLoad"}, - FunctionInfo{1, D<&IPlatformServiceManager::GetLoadState>, "GetLoadState"}, - FunctionInfo{2, D<&IPlatformServiceManager::GetSize>, "GetSize"}, - FunctionInfo{3, D<&IPlatformServiceManager::GetSharedMemoryAddressOffset>, "GetSharedMemoryAddressOffset"}, - FunctionInfo{4, D<&IPlatformServiceManager::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"}, - FunctionInfo{5, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriority"}, - FunctionInfo{6, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriorityForSystem"}, - FunctionInfo{100, nullptr, "RequestApplicationFunctionAuthorization"}, - FunctionInfo{101, nullptr, "RequestApplicationFunctionAuthorizationByProcessId"}, - FunctionInfo{102, nullptr, "RequestApplicationFunctionAuthorizationByApplicationId"}, - FunctionInfo{103, nullptr, "RefreshApplicationFunctionBlackListDebugRecord"}, - FunctionInfo{104, nullptr, "RequestApplicationFunctionAuthorizationByProgramId"}, - FunctionInfo{105, nullptr, "GetFunctionBlackListSystemVersionToAuthorize"}, - FunctionInfo{106, nullptr, "GetFunctionBlackListVersion"}, - FunctionInfo{1000, nullptr, "LoadNgWordDataForPlatformRegionChina"}, - FunctionInfo{1001, nullptr, "GetNgWordDataSizeForPlatformRegionChina"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - struct FontRegion { u32 offset; u32 size; @@ -111,6 +89,28 @@ struct IPlatformServiceManager::Impl { IPlatformServiceManager::IPlatformServiceManager(Core::System& system_, const char* service_name_) : ServiceFramework{system_, service_name_}, impl{std::make_unique()} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IPlatformServiceManager::RequestLoad>, "RequestLoad"}, + {1, D<&IPlatformServiceManager::GetLoadState>, "GetLoadState"}, + {2, D<&IPlatformServiceManager::GetSize>, "GetSize"}, + {3, D<&IPlatformServiceManager::GetSharedMemoryAddressOffset>, "GetSharedMemoryAddressOffset"}, + {4, D<&IPlatformServiceManager::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"}, + {5, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriority"}, + {6, D<&IPlatformServiceManager::GetSharedFontInOrderOfPriority>, "GetSharedFontInOrderOfPriorityForSystem"}, + {100, nullptr, "RequestApplicationFunctionAuthorization"}, + {101, nullptr, "RequestApplicationFunctionAuthorizationByProcessId"}, + {102, nullptr, "RequestApplicationFunctionAuthorizationByApplicationId"}, + {103, nullptr, "RefreshApplicationFunctionBlackListDebugRecord"}, + {104, nullptr, "RequestApplicationFunctionAuthorizationByProgramId"}, + {105, nullptr, "GetFunctionBlackListSystemVersionToAuthorize"}, + {106, nullptr, "GetFunctionBlackListVersion"}, + {1000, nullptr, "LoadNgWordDataForPlatformRegionChina"}, + {1001, nullptr, "GetNgWordDataSizeForPlatformRegionChina"}, + }; + // clang-format on + RegisterHandlers(functions); + auto& fsc = system.GetFileSystemController(); // Attempt to load shared font data from disk diff --git a/src/core/hle/service/ns/platform_service_manager.h b/src/core/hle/service/ns/platform_service_manager.h index fb99a441f5..73521abbc2 100644 --- a/src/core/hle/service/ns/platform_service_manager.h +++ b/src/core/hle/service/ns/platform_service_manager.h @@ -68,12 +68,11 @@ private: Result GetSharedMemoryNativeHandle( OutCopyHandle out_shared_memory_native_handle); Result GetSharedFontInOrderOfPriority(OutArray out_font_codes, - OutArray out_font_offsets, - OutArray out_font_sizes, - Out out_fonts_are_loaded, Out out_font_count, - Set::LanguageCode language_code); + OutArray out_font_offsets, + OutArray out_font_sizes, + Out out_fonts_are_loaded, Out out_font_count, + Set::LanguageCode language_code); - std::optional FindRequest(u32 key) override; struct Impl; std::unique_ptr impl; }; diff --git a/src/core/hle/service/ns/query_service.cpp b/src/core/hle/service/ns/query_service.cpp index 13a1f33866..d22de1d169 100644 --- a/src/core/hle/service/ns/query_service.cpp +++ b/src/core/hle/service/ns/query_service.cpp @@ -14,40 +14,40 @@ namespace Service::NS { -std::optional IQueryService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "QueryAppletEvent"}, - FunctionInfo{1, nullptr, "QueryPlayStatistics"}, - FunctionInfo{2, nullptr, "QueryPlayStatisticsByUserAccountId"}, - FunctionInfo{3, nullptr, "QueryPlayStatisticsByNetworkServiceAccountId"}, - FunctionInfo{4, nullptr, "QueryPlayStatisticsByApplicationId"}, - FunctionInfo{5, D<&IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId>, "QueryPlayStatisticsByApplicationIdAndUserAccountId"}, - FunctionInfo{6, nullptr, "QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId"}, - FunctionInfo{7, nullptr, "QueryLastPlayTimeV0"}, - FunctionInfo{8, nullptr, "QueryPlayEvent"}, - FunctionInfo{9, nullptr, "GetAvailablePlayEventRange"}, - FunctionInfo{10, nullptr, "QueryAccountEvent"}, - FunctionInfo{11, nullptr, "QueryAccountPlayEvent"}, - FunctionInfo{12, nullptr, "GetAvailableAccountPlayEventRange"}, - FunctionInfo{13, nullptr, "QueryApplicationPlayStatisticsForSystemV0"}, - FunctionInfo{14, nullptr, "QueryRecentlyPlayedApplication"}, - FunctionInfo{15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"}, - FunctionInfo{16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"}, - FunctionInfo{17, D<&IQueryService::QueryLastPlayTime>, "QueryLastPlayTime"}, - FunctionInfo{18, D<&IQueryService::QueryApplicationPlayStatisticsForSystem>, "QueryApplicationPlayStatisticsForSystem"}, - FunctionInfo{19, D<&IQueryService::QueryApplicationPlayStatisticsByUserAccountIdForSystem>, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"}, - FunctionInfo{30, nullptr, "Cmd30" }, - FunctionInfo{31, nullptr, "Cmd31" }, - FunctionInfo{100, nullptr, "Cmd100" }, - FunctionInfo{110, nullptr, "Cmd110" }, - FunctionInfo{118, nullptr, "Cmd118" }, - FunctionInfo{119, nullptr, "Cmd119" } - ); - return HandlerTableGenerateWithFind(key, functions); -} - IQueryService::IQueryService(Core::System& system_) : ServiceFramework{system_, "pdm:qry"}, play_time_manager{std::make_unique()} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "QueryAppletEvent"}, + {1, nullptr, "QueryPlayStatistics"}, + {2, nullptr, "QueryPlayStatisticsByUserAccountId"}, + {3, nullptr, "QueryPlayStatisticsByNetworkServiceAccountId"}, + {4, nullptr, "QueryPlayStatisticsByApplicationId"}, + {5, D<&IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId>, "QueryPlayStatisticsByApplicationIdAndUserAccountId"}, + {6, nullptr, "QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId"}, + {7, nullptr, "QueryLastPlayTimeV0"}, + {8, nullptr, "QueryPlayEvent"}, + {9, nullptr, "GetAvailablePlayEventRange"}, + {10, nullptr, "QueryAccountEvent"}, + {11, nullptr, "QueryAccountPlayEvent"}, + {12, nullptr, "GetAvailableAccountPlayEventRange"}, + {13, nullptr, "QueryApplicationPlayStatisticsForSystemV0"}, + {14, nullptr, "QueryRecentlyPlayedApplication"}, + {15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"}, + {16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"}, + {17, D<&IQueryService::QueryLastPlayTime>, "QueryLastPlayTime"}, + {18, D<&IQueryService::QueryApplicationPlayStatisticsForSystem>, "QueryApplicationPlayStatisticsForSystem"}, + {19, D<&IQueryService::QueryApplicationPlayStatisticsByUserAccountIdForSystem>, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"}, + { 30, nullptr, "Cmd30" }, + { 31, nullptr, "Cmd31" }, + { 100, nullptr, "Cmd100" }, + { 110, nullptr, "Cmd110" }, + { 118, nullptr, "Cmd118" }, + { 119, nullptr, "Cmd119" }, + }; + // clang-format on + + RegisterHandlers(functions); } IQueryService::~IQueryService() = default; diff --git a/src/core/hle/service/ns/query_service.h b/src/core/hle/service/ns/query_service.h index 08267d3165..f5c0ae1058 100644 --- a/src/core/hle/service/ns/query_service.h +++ b/src/core/hle/service/ns/query_service.h @@ -62,7 +62,6 @@ private: OutArray out_stats, InArray application_ids); - std::optional FindRequest(u32 key) override; std::unique_ptr play_time_manager; }; diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp index c6cd822d24..1359cdbb95 100644 --- a/src/core/hle/service/ns/read_only_application_control_data_interface.cpp +++ b/src/core/hle/service/ns/read_only_application_control_data_interface.cpp @@ -73,21 +73,6 @@ void SanitizeJPEGImageSize(std::vector& image) { } // namespace -std::optional IReadOnlyApplicationControlDataInterface::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData>, "GetApplicationControlData"}, - FunctionInfo{1, D<&IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"}, - FunctionInfo{2, D<&IReadOnlyApplicationControlDataInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"}, - FunctionInfo{3, nullptr, "ConvertLanguageCodeToApplicationLanguage"}, - FunctionInfo{4, nullptr, "SelectApplicationDesiredLanguage"}, - FunctionInfo{5, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData2>, "GetApplicationControlData"}, - FunctionInfo{10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"}, - FunctionInfo{13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"}, - FunctionInfo{19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, - FunctionInfo{23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData", MakeVersionGate({23,0,0})} - ); - return HandlerTableGenerateWithFind(key, functions); -} // IAsyncValue implementation for ListApplicationTitle // https://switchbrew.org/wiki/NS_services#ListApplicationTitle @@ -99,6 +84,13 @@ public: , data_offset{offset} , data_size{size} { + static const FunctionInfo functions[] = { + {0, D<&IAsyncValue::GetSize>, "GetSize"}, + {1, D<&IAsyncValue::Get>, "Get"}, + {2, D<&IAsyncValue::Cancel>, "Cancel"}, + {3, D<&IAsyncValue::GetErrorContext>, "GetErrorContext"}, + }; + RegisterHandlers(functions); completion_event = service_context.CreateEvent("IAsyncValue:Completion"); completion_event->GetReadableEvent().Signal(system.Kernel()); } @@ -130,16 +122,6 @@ private: LOG_DEBUG(Service_NS, "called"); R_SUCCEED(); } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IAsyncValue::GetSize>, "GetSize"}, - FunctionInfo{1, D<&IAsyncValue::Get>, "Get"}, - FunctionInfo{2, D<&IAsyncValue::Cancel>, "Cancel"}, - FunctionInfo{3, D<&IAsyncValue::GetErrorContext>, "GetErrorContext"} - ); KernelHelpers::ServiceContext service_context; Kernel::KEvent* completion_event{}; s32 data_offset; @@ -149,6 +131,22 @@ private: IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterface( Core::System& system_) : ServiceFramework{system_, "IReadOnlyApplicationControlDataInterface"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData>, "GetApplicationControlData"}, + {1, D<&IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"}, + {2, D<&IReadOnlyApplicationControlDataInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"}, + {3, nullptr, "ConvertLanguageCodeToApplicationLanguage"}, + {4, nullptr, "SelectApplicationDesiredLanguage"}, + {5, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData2>, "GetApplicationControlData"}, + {10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"}, + {13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"}, + {19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, + {23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"}, //23.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); } IReadOnlyApplicationControlDataInterface::~IReadOnlyApplicationControlDataInterface() = default; diff --git a/src/core/hle/service/ns/read_only_application_control_data_interface.h b/src/core/hle/service/ns/read_only_application_control_data_interface.h index 3f68029583..a4a285151a 100644 --- a/src/core/hle/service/ns/read_only_application_control_data_interface.h +++ b/src/core/hle/service/ns/read_only_application_control_data_interface.h @@ -45,8 +45,6 @@ public: u8 flag1, u8 flag2, u64 application_id); - - std::optional FindRequest(u32 key) override; }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/read_only_application_record_interface.cpp b/src/core/hle/service/ns/read_only_application_record_interface.cpp index 7a7cf9ec58..8ce7851ae2 100644 --- a/src/core/hle/service/ns/read_only_application_record_interface.cpp +++ b/src/core/hle/service/ns/read_only_application_record_interface.cpp @@ -11,18 +11,17 @@ namespace Service::NS { -std::optional IReadOnlyApplicationRecordInterface::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IReadOnlyApplicationRecordInterface::HasApplicationRecord>, "HasApplicationRecord"}, - FunctionInfo{1, nullptr, "NotifyApplicationFailure"}, - FunctionInfo{2, D<&IReadOnlyApplicationRecordInterface::IsDataCorruptedResult>, "IsDataCorruptedResult"}, - FunctionInfo{3, D<&IReadOnlyApplicationRecordInterface::ListApplicationRecord>, "ListApplicationRecord"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IReadOnlyApplicationRecordInterface::IReadOnlyApplicationRecordInterface(Core::System& system_) : ServiceFramework{system_, "IReadOnlyApplicationRecordInterface"} { + static const FunctionInfo functions[] = { + {0, D<&IReadOnlyApplicationRecordInterface::HasApplicationRecord>, "HasApplicationRecord"}, + {1, nullptr, "NotifyApplicationFailure"}, + {2, D<&IReadOnlyApplicationRecordInterface::IsDataCorruptedResult>, "IsDataCorruptedResult"}, + {3, D<&IReadOnlyApplicationRecordInterface::ListApplicationRecord>, "ListApplicationRecord"}, + }; + // clang-format on + + RegisterHandlers(functions); } IReadOnlyApplicationRecordInterface::~IReadOnlyApplicationRecordInterface() = default; diff --git a/src/core/hle/service/ns/read_only_application_record_interface.h b/src/core/hle/service/ns/read_only_application_record_interface.h index 308e753e7d..dd842070e8 100644 --- a/src/core/hle/service/ns/read_only_application_record_interface.h +++ b/src/core/hle/service/ns/read_only_application_record_interface.h @@ -24,8 +24,6 @@ private: Result ListApplicationRecord( OutArray out_records, Out out_count, s32 entry_offset); - - std::optional FindRequest(u32 key) override; }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/service_getter_interface.cpp b/src/core/hle/service/ns/service_getter_interface.cpp index bbf30da3da..7b7f791650 100644 --- a/src/core/hle/service/ns/service_getter_interface.cpp +++ b/src/core/hle/service/ns/service_getter_interface.cpp @@ -20,25 +20,25 @@ namespace Service::NS { -std::optional IServiceGetterInterface::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{7988, D<&IServiceGetterInterface::GetDynamicRightsInterface>, "GetDynamicRightsInterface"}, - FunctionInfo{7989, D<&IServiceGetterInterface::GetReadOnlyApplicationControlDataInterface>, "GetReadOnlyApplicationControlDataInterface"}, - FunctionInfo{7991, D<&IServiceGetterInterface::GetReadOnlyApplicationRecordInterface>, "GetReadOnlyApplicationRecordInterface"}, - FunctionInfo{7992, D<&IServiceGetterInterface::GetECommerceInterface>, "GetECommerceInterface"}, - FunctionInfo{7993, D<&IServiceGetterInterface::GetApplicationVersionInterface>, "GetApplicationVersionInterface"}, - FunctionInfo{7994, D<&IServiceGetterInterface::GetFactoryResetInterface>, "GetFactoryResetInterface"}, - FunctionInfo{7995, D<&IServiceGetterInterface::GetAccountProxyInterface>, "GetAccountProxyInterface"}, - FunctionInfo{7996, D<&IServiceGetterInterface::GetApplicationManagerInterface>, "GetApplicationManagerInterface"}, - FunctionInfo{7997, D<&IServiceGetterInterface::GetDownloadTaskInterface>, "GetDownloadTaskInterface"}, - FunctionInfo{7998, D<&IServiceGetterInterface::GetContentManagementInterface>, "GetContentManagementInterface"}, - FunctionInfo{7999, D<&IServiceGetterInterface::GetDocumentInterface>, "GetDocumentInterface"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IServiceGetterInterface::IServiceGetterInterface(Core::System& system_, const char* name) : ServiceFramework{system_, name} { + // clang-format off + static const FunctionInfo functions[] = { + {7988, D<&IServiceGetterInterface::GetDynamicRightsInterface>, "GetDynamicRightsInterface"}, + {7989, D<&IServiceGetterInterface::GetReadOnlyApplicationControlDataInterface>, "GetReadOnlyApplicationControlDataInterface"}, + {7991, D<&IServiceGetterInterface::GetReadOnlyApplicationRecordInterface>, "GetReadOnlyApplicationRecordInterface"}, + {7992, D<&IServiceGetterInterface::GetECommerceInterface>, "GetECommerceInterface"}, + {7993, D<&IServiceGetterInterface::GetApplicationVersionInterface>, "GetApplicationVersionInterface"}, + {7994, D<&IServiceGetterInterface::GetFactoryResetInterface>, "GetFactoryResetInterface"}, + {7995, D<&IServiceGetterInterface::GetAccountProxyInterface>, "GetAccountProxyInterface"}, + {7996, D<&IServiceGetterInterface::GetApplicationManagerInterface>, "GetApplicationManagerInterface"}, + {7997, D<&IServiceGetterInterface::GetDownloadTaskInterface>, "GetDownloadTaskInterface"}, + {7998, D<&IServiceGetterInterface::GetContentManagementInterface>, "GetContentManagementInterface"}, + {7999, D<&IServiceGetterInterface::GetDocumentInterface>, "GetDocumentInterface"}, + }; + // clang-format on + + RegisterHandlers(functions); } IServiceGetterInterface::~IServiceGetterInterface() = default; diff --git a/src/core/hle/service/ns/service_getter_interface.h b/src/core/hle/service/ns/service_getter_interface.h index 8c33aafc27..fc36b04325 100644 --- a/src/core/hle/service/ns/service_getter_interface.h +++ b/src/core/hle/service/ns/service_getter_interface.h @@ -45,8 +45,6 @@ public: Result GetContentManagementInterface( Out> out_interface); Result GetDocumentInterface(Out> out_interface); - - std::optional FindRequest(u32 key) override; }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/system_update_control.cpp b/src/core/hle/service/ns/system_update_control.cpp index 3d1911c852..2711db508c 100644 --- a/src/core/hle/service/ns/system_update_control.cpp +++ b/src/core/hle/service/ns/system_update_control.cpp @@ -11,6 +11,35 @@ namespace Service::NS { ISystemUpdateControl::ISystemUpdateControl(Core::System& system_) : ServiceFramework{system_, "ISystemUpdateControl"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "HasDownloaded"}, + {1, nullptr, "RequestCheckLatestUpdate"}, + {2, nullptr, "RequestDownloadLatestUpdate"}, + {3, nullptr, "GetDownloadProgress"}, + {4, nullptr, "ApplyDownloadedUpdate"}, + {5, nullptr, "RequestPrepareCardUpdate"}, + {6, nullptr, "GetPrepareCardUpdateProgress"}, + {7, nullptr, "HasPreparedCardUpdate"}, + {8, nullptr, "ApplyCardUpdate"}, + {9, nullptr, "GetDownloadedEulaDataSize"}, + {10, nullptr, "GetDownloadedEulaData"}, + {11, nullptr, "SetupCardUpdate"}, + {12, nullptr, "GetPreparedCardUpdateEulaDataSize"}, + {13, nullptr, "GetPreparedCardUpdateEulaData"}, + {14, nullptr, "SetupCardUpdateViaSystemUpdater"}, + {15, nullptr, "HasReceived"}, + {16, nullptr, "RequestReceiveSystemUpdate"}, + {17, nullptr, "GetReceiveProgress"}, + {18, nullptr, "ApplyReceivedUpdate"}, + {19, nullptr, "GetReceivedEulaDataSize"}, + {20, nullptr, "GetReceivedEulaData"}, + {21, nullptr, "SetupToReceiveSystemUpdate"}, + {22, nullptr, "RequestCheckLatestUpdateIncludesRebootlessUpdate"}, + }; + // clang-format on + + RegisterHandlers(functions); } ISystemUpdateControl::~ISystemUpdateControl() = default; diff --git a/src/core/hle/service/ns/system_update_control.h b/src/core/hle/service/ns/system_update_control.h index acdf048e6c..70794f4abd 100644 --- a/src/core/hle/service/ns/system_update_control.h +++ b/src/core/hle/service/ns/system_update_control.h @@ -14,35 +14,6 @@ class ISystemUpdateControl final : public ServiceFramework public: explicit ISystemUpdateControl(Core::System& system_); ~ISystemUpdateControl() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "HasDownloaded"}, - FunctionInfo{1, nullptr, "RequestCheckLatestUpdate"}, - FunctionInfo{2, nullptr, "RequestDownloadLatestUpdate"}, - FunctionInfo{3, nullptr, "GetDownloadProgress"}, - FunctionInfo{4, nullptr, "ApplyDownloadedUpdate"}, - FunctionInfo{5, nullptr, "RequestPrepareCardUpdate"}, - FunctionInfo{6, nullptr, "GetPrepareCardUpdateProgress"}, - FunctionInfo{7, nullptr, "HasPreparedCardUpdate"}, - FunctionInfo{8, nullptr, "ApplyCardUpdate"}, - FunctionInfo{9, nullptr, "GetDownloadedEulaDataSize"}, - FunctionInfo{10, nullptr, "GetDownloadedEulaData"}, - FunctionInfo{11, nullptr, "SetupCardUpdate"}, - FunctionInfo{12, nullptr, "GetPreparedCardUpdateEulaDataSize"}, - FunctionInfo{13, nullptr, "GetPreparedCardUpdateEulaData"}, - FunctionInfo{14, nullptr, "SetupCardUpdateViaSystemUpdater"}, - FunctionInfo{15, nullptr, "HasReceived"}, - FunctionInfo{16, nullptr, "RequestReceiveSystemUpdate"}, - FunctionInfo{17, nullptr, "GetReceiveProgress"}, - FunctionInfo{18, nullptr, "ApplyReceivedUpdate"}, - FunctionInfo{19, nullptr, "GetReceivedEulaDataSize"}, - FunctionInfo{20, nullptr, "GetReceivedEulaData"}, - FunctionInfo{21, nullptr, "SetupToReceiveSystemUpdate"}, - FunctionInfo{22, nullptr, "RequestCheckLatestUpdateIncludesRebootlessUpdate"} - ); }; } // namespace Service::NS diff --git a/src/core/hle/service/ns/system_update_interface.cpp b/src/core/hle/service/ns/system_update_interface.cpp index 044d39835f..3f4d42fdb6 100644 --- a/src/core/hle/service/ns/system_update_interface.cpp +++ b/src/core/hle/service/ns/system_update_interface.cpp @@ -10,32 +10,32 @@ namespace Service::NS { -std::optional ISystemUpdateInterface::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ISystemUpdateInterface::GetBackgroundNetworkUpdateState>, "GetBackgroundNetworkUpdateState"}, - FunctionInfo{1, D<&ISystemUpdateInterface::OpenSystemUpdateControl>, "OpenSystemUpdateControl"}, - FunctionInfo{2, nullptr, "NotifyExFatDriverRequired"}, - FunctionInfo{3, nullptr, "ClearExFatDriverStatusForDebug"}, - FunctionInfo{4, nullptr, "RequestBackgroundNetworkUpdate"}, - FunctionInfo{5, nullptr, "NotifyBackgroundNetworkUpdate"}, - FunctionInfo{6, nullptr, "NotifyExFatDriverDownloadedForDebug"}, - FunctionInfo{9, D<&ISystemUpdateInterface::GetSystemUpdateNotificationEventForContentDelivery>, "GetSystemUpdateNotificationEventForContentDelivery"}, - FunctionInfo{10, nullptr, "NotifySystemUpdateForContentDelivery"}, - FunctionInfo{11, nullptr, "PrepareShutdown"}, - FunctionInfo{12, nullptr, "Unknown12"}, - FunctionInfo{13, nullptr, "Unknown13"}, - FunctionInfo{14, nullptr, "Unknown14"}, - FunctionInfo{15, nullptr, "Unknown15"}, - FunctionInfo{16, nullptr, "DestroySystemUpdateTask"}, - FunctionInfo{17, nullptr, "RequestSendSystemUpdate"}, - FunctionInfo{18, nullptr, "GetSendSystemUpdateProgress"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - ISystemUpdateInterface::ISystemUpdateInterface(Core::System& system_) : ServiceFramework{system_, "ns:su"}, service_context{system_, "ns:su"}, update_notification_event{service_context} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ISystemUpdateInterface::GetBackgroundNetworkUpdateState>, "GetBackgroundNetworkUpdateState"}, + {1, D<&ISystemUpdateInterface::OpenSystemUpdateControl>, "OpenSystemUpdateControl"}, + {2, nullptr, "NotifyExFatDriverRequired"}, + {3, nullptr, "ClearExFatDriverStatusForDebug"}, + {4, nullptr, "RequestBackgroundNetworkUpdate"}, + {5, nullptr, "NotifyBackgroundNetworkUpdate"}, + {6, nullptr, "NotifyExFatDriverDownloadedForDebug"}, + {9, D<&ISystemUpdateInterface::GetSystemUpdateNotificationEventForContentDelivery>, "GetSystemUpdateNotificationEventForContentDelivery"}, + {10, nullptr, "NotifySystemUpdateForContentDelivery"}, + {11, nullptr, "PrepareShutdown"}, + {12, nullptr, "Unknown12"}, + {13, nullptr, "Unknown13"}, + {14, nullptr, "Unknown14"}, + {15, nullptr, "Unknown15"}, + {16, nullptr, "DestroySystemUpdateTask"}, + {17, nullptr, "RequestSendSystemUpdate"}, + {18, nullptr, "GetSendSystemUpdateProgress"}, + }; + // clang-format on + + RegisterHandlers(functions); } ISystemUpdateInterface::~ISystemUpdateInterface() = default; diff --git a/src/core/hle/service/ns/system_update_interface.h b/src/core/hle/service/ns/system_update_interface.h index 2ea14f4f5e..76f8959ed6 100644 --- a/src/core/hle/service/ns/system_update_interface.h +++ b/src/core/hle/service/ns/system_update_interface.h @@ -33,7 +33,7 @@ private: Result GetSystemUpdateNotificationEventForContentDelivery( OutCopyHandle out_event); - std::optional FindRequest(u32 key) override; +private: KernelHelpers::ServiceContext service_context; Event update_notification_event; }; diff --git a/src/core/hle/service/nvdrv/devices/ioctl_serialization.h b/src/core/hle/service/nvdrv/devices/ioctl_serialization.h index c3baa3a75b..37d04e3cf1 100644 --- a/src/core/hle/service/nvdrv/devices/ioctl_serialization.h +++ b/src/core/hle/service/nvdrv/devices/ioctl_serialization.h @@ -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-FileCopyrightText: Copyright 2023 yuzu Emulator Project diff --git a/src/core/hle/service/nvdrv/devices/nvdevice.h b/src/core/hle/service/nvdrv/devices/nvdevice.h index 8adaddc60b..d23ec63bae 100644 --- a/src/core/hle/service/nvdrv/devices/nvdevice.h +++ b/src/core/hle/service/nvdrv/devices/nvdevice.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp index 358679b831..1e571be4c9 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp @@ -278,7 +278,7 @@ NvResult nvhost_gpu::AllocateObjectContext(IoctlAllocObjCtx& params) { params.flags = allowed_mask; } - s32_le ctx_class_number_index = + s32_le ctx_class_number_index = GetObjectContextClassNumberIndex(static_cast(params.class_num)); if (ctx_class_number_index < 0) { LOG_ERROR(Service_NVDRV, "Invalid class number for object context: {:#x}", diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h index 627686757b..1747881d48 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h index def9c254d1..e0735b7f01 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/nvdrv/devices/nvhost_vic.h b/src/core/hle/service/nvdrv/devices/nvhost_vic.h index 0cc04354a0..b1cbcb9ad7 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_vic.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_vic.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp index 81d8a3a63b..b252a2efa5 100644 --- a/src/core/hle/service/nvdrv/nvdrv.cpp +++ b/src/core/hle/service/nvdrv/nvdrv.cpp @@ -50,61 +50,55 @@ class NVGEM_C final : public ServiceFramework { public: explicit NVGEM_C(Core::System& system_) : ServiceFramework{system_, "nvgem:c"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + {0, nullptr, "Initialize"}, + {1, nullptr, "GetEventHandle"}, + {2, nullptr, "ControlNotification"}, + {3, nullptr, "SetNotificationPerm"}, + {4, nullptr, "SetCoreDumpPerm"}, + {5, nullptr, "GetAruid"}, + {6, nullptr, "Reset"}, + {7, nullptr, "GetAruid2"}, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Initialize"}, - FunctionInfo{1, nullptr, "GetEventHandle"}, - FunctionInfo{2, nullptr, "ControlNotification"}, - FunctionInfo{3, nullptr, "SetNotificationPerm"}, - FunctionInfo{4, nullptr, "SetCoreDumpPerm"}, - FunctionInfo{5, nullptr, "GetAruid"}, - FunctionInfo{6, nullptr, "Reset"}, - FunctionInfo{7, nullptr, "GetAruid2"} - ); }; class NVGEM_CD final : public ServiceFramework { public: explicit NVGEM_CD(Core::System& system_) : ServiceFramework{system_, "nvgem:cd"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + {0, nullptr, "Initialize"}, + {1, nullptr, "GetAruid"}, + {2, nullptr, "ReadNextBlock"}, + {3, nullptr, "GetNextBlockSize"}, + {4, nullptr, "ReadNextBlock2"}, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Initialize"}, - FunctionInfo{1, nullptr, "GetAruid"}, - FunctionInfo{2, nullptr, "ReadNextBlock"}, - FunctionInfo{3, nullptr, "GetNextBlockSize"}, - FunctionInfo{4, nullptr, "ReadNextBlock2"} - ); }; class NVDBG_D final : public ServiceFramework { public: explicit NVDBG_D(Core::System& system_) : ServiceFramework{system_, "nvdbg:d"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + {0, nullptr, "Open"}, + {1, nullptr, "Ioctl"}, + {2, nullptr, "Close"}, + {4, nullptr, "QueryEvent"}, + {9, nullptr, "DumpStatus"}, + {10, nullptr, "InitializeDevtools"}, + {11, nullptr, "Ioctl2"}, + {12, nullptr, "Ioctl3"}, + {13, nullptr, "SetConfiguration"}, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Open"}, - FunctionInfo{1, nullptr, "Ioctl"}, - FunctionInfo{2, nullptr, "Close"}, - FunctionInfo{4, nullptr, "QueryEvent"}, - FunctionInfo{9, nullptr, "DumpStatus"}, - FunctionInfo{10, nullptr, "InitializeDevtools"}, - FunctionInfo{11, nullptr, "Ioctl2"}, - FunctionInfo{12, nullptr, "Ioctl3"}, - FunctionInfo{13, nullptr, "SetConfiguration"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/nvdrv/nvdrv_interface.cpp b/src/core/hle/service/nvdrv/nvdrv_interface.cpp index db3dbd9f8e..5fae68adbb 100644 --- a/src/core/hle/service/nvdrv/nvdrv_interface.cpp +++ b/src/core/hle/service/nvdrv/nvdrv_interface.cpp @@ -245,6 +245,24 @@ void NVDRV::DumpGraphicsMemoryInfo(HLERequestContext& ctx) { NVDRV::NVDRV(Core::System& system_, std::shared_ptr nvdrv_, const char* name) : ServiceFramework{system_, name}, nvdrv{std::move(nvdrv_)} { + static const FunctionInfo functions[] = { + {0, &NVDRV::Open, "Open"}, + {1, &NVDRV::Ioctl1, "Ioctl"}, + {2, &NVDRV::Close, "Close"}, + {3, &NVDRV::Initialize, "Initialize"}, + {4, &NVDRV::QueryEvent, "QueryEvent"}, + {5, nullptr, "MapSharedMem"}, + {6, &NVDRV::GetStatus, "GetStatus"}, + {7, nullptr, "SetAruidForTest"}, + {8, &NVDRV::SetAruid, "SetAruid"}, + {9, &NVDRV::DumpGraphicsMemoryInfo, "DumpGraphicsMemoryInfo"}, + {10, nullptr, "InitializeDevtools"}, + {11, &NVDRV::Ioctl2, "Ioctl2"}, + {12, &NVDRV::Ioctl3, "Ioctl3"}, + {13, &NVDRV::SetGraphicsFirmwareMemoryMarginEnabled, + "SetGraphicsFirmwareMemoryMarginEnabled"}, + }; + RegisterHandlers(functions); } NVDRV::~NVDRV() { diff --git a/src/core/hle/service/nvdrv/nvdrv_interface.h b/src/core/hle/service/nvdrv/nvdrv_interface.h index b9b574398a..f628fca7df 100644 --- a/src/core/hle/service/nvdrv/nvdrv_interface.h +++ b/src/core/hle/service/nvdrv/nvdrv_interface.h @@ -38,27 +38,8 @@ private: void ServiceError(HLERequestContext& ctx, NvResult result); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &NVDRV::Open, "Open"}, - FunctionInfo{1, &NVDRV::Ioctl1, "Ioctl"}, - FunctionInfo{2, &NVDRV::Close, "Close"}, - FunctionInfo{3, &NVDRV::Initialize, "Initialize"}, - FunctionInfo{4, &NVDRV::QueryEvent, "QueryEvent"}, - FunctionInfo{5, nullptr, "MapSharedMem"}, - FunctionInfo{6, &NVDRV::GetStatus, "GetStatus"}, - FunctionInfo{7, nullptr, "SetAruidForTest"}, - FunctionInfo{8, &NVDRV::SetAruid, "SetAruid"}, - FunctionInfo{9, &NVDRV::DumpGraphicsMemoryInfo, "DumpGraphicsMemoryInfo"}, - FunctionInfo{10, nullptr, "InitializeDevtools"}, - FunctionInfo{11, &NVDRV::Ioctl2, "Ioctl2"}, - FunctionInfo{12, &NVDRV::Ioctl3, "Ioctl3"}, - FunctionInfo{13, &NVDRV::SetGraphicsFirmwareMemoryMarginEnabled, - "SetGraphicsFirmwareMemoryMarginEnabled"} - ); std::shared_ptr nvdrv; + u64 pid{}; bool is_initialized{}; NvCore::SessionId session_id{}; diff --git a/src/core/hle/service/nvdrv/nvmemp.cpp b/src/core/hle/service/nvdrv/nvmemp.cpp index 8e2e4dfacb..a5477faf1a 100644 --- a/src/core/hle/service/nvdrv/nvmemp.cpp +++ b/src/core/hle/service/nvdrv/nvmemp.cpp @@ -11,6 +11,11 @@ namespace Service::Nvidia { NVMEMP::NVMEMP(Core::System& system_) : ServiceFramework{system_, "nvmemp"} { + static const FunctionInfo functions[] = { + {0, &NVMEMP::Open, "Open"}, + {1, &NVMEMP::GetAruid, "GetAruid"}, + }; + RegisterHandlers(functions); } NVMEMP::~NVMEMP() = default; diff --git a/src/core/hle/service/nvdrv/nvmemp.h b/src/core/hle/service/nvdrv/nvmemp.h index e98b07c494..6ff59834fe 100644 --- a/src/core/hle/service/nvdrv/nvmemp.h +++ b/src/core/hle/service/nvdrv/nvmemp.h @@ -22,14 +22,6 @@ public: private: void Open(HLERequestContext& ctx); void GetAruid(HLERequestContext& ctx); - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &NVMEMP::Open, "Open"}, - FunctionInfo{1, &NVMEMP::GetAruid, "GetAruid"} - ); }; } // namespace Service::Nvidia diff --git a/src/core/hle/service/nvnflinger/binder.h b/src/core/hle/service/nvnflinger/binder.h index 124accb946..6c7ce0ed0f 100644 --- a/src/core/hle/service/nvnflinger/binder.h +++ b/src/core/hle/service/nvnflinger/binder.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/buffer_item.h b/src/core/hle/service/nvnflinger/buffer_item.h index 7fd808f546..718188d849 100644 --- a/src/core/hle/service/nvnflinger/buffer_item.h +++ b/src/core/hle/service/nvnflinger/buffer_item.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/buffer_item_consumer.h b/src/core/hle/service/nvnflinger/buffer_item_consumer.h index 9f95c92800..7857569c0f 100644 --- a/src/core/hle/service/nvnflinger/buffer_item_consumer.h +++ b/src/core/hle/service/nvnflinger/buffer_item_consumer.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2012 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/buffer_queue_consumer.h b/src/core/hle/service/nvnflinger/buffer_queue_consumer.h index a9226f1c35..84f36285c0 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_consumer.h +++ b/src/core/hle/service/nvnflinger/buffer_queue_consumer.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/buffer_queue_defs.h b/src/core/hle/service/nvnflinger/buffer_queue_defs.h index 6fd3156f4a..77ebd0a6a0 100644 --- a/src/core/hle/service/nvnflinger/buffer_queue_defs.h +++ b/src/core/hle/service/nvnflinger/buffer_queue_defs.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/buffer_transform_flags.h b/src/core/hle/service/nvnflinger/buffer_transform_flags.h index ffe579718f..6fb40d0a72 100644 --- a/src/core/hle/service/nvnflinger/buffer_transform_flags.h +++ b/src/core/hle/service/nvnflinger/buffer_transform_flags.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/consumer_base.h b/src/core/hle/service/nvnflinger/consumer_base.h index b29c16f86b..e187b520ca 100644 --- a/src/core/hle/service/nvnflinger/consumer_base.h +++ b/src/core/hle/service/nvnflinger/consumer_base.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2010 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/consumer_listener.h b/src/core/hle/service/nvnflinger/consumer_listener.h index 74a1939883..4b4d939551 100644 --- a/src/core/hle/service/nvnflinger/consumer_listener.h +++ b/src/core/hle/service/nvnflinger/consumer_listener.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp b/src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp index d72b49a8e7..5de604233d 100644 --- a/src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp +++ b/src/core/hle/service/nvnflinger/graphic_buffer_producer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2010 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/graphic_buffer_producer.h b/src/core/hle/service/nvnflinger/graphic_buffer_producer.h index 5d7cff7d38..05980eb482 100644 --- a/src/core/hle/service/nvnflinger/graphic_buffer_producer.h +++ b/src/core/hle/service/nvnflinger/graphic_buffer_producer.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2010 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp index c9023374c4..fa1becc34e 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver.cpp +++ b/src/core/hle/service/nvnflinger/hos_binder_driver.cpp @@ -11,21 +11,18 @@ namespace Service::Nvnflinger { -std::optional IHOSBinderDriver::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IHOSBinderDriver::TransactParcel>, "TransactParcel"}, - FunctionInfo{1, C<&IHOSBinderDriver::AdjustRefcount>, "AdjustRefcount"}, - FunctionInfo{2, C<&IHOSBinderDriver::GetNativeHandle>, "GetNativeHandle"}, - FunctionInfo{3, C<&IHOSBinderDriver::TransactParcelAuto>, "TransactParcelAuto"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IHOSBinderDriver::IHOSBinderDriver(Core::System& system_, std::shared_ptr server, std::shared_ptr surface_flinger) : ServiceFramework{system_, "IHOSBinderDriver"}, m_server(server), m_surface_flinger(surface_flinger) { + static const FunctionInfo functions[] = { + {0, C<&IHOSBinderDriver::TransactParcel>, "TransactParcel"}, + {1, C<&IHOSBinderDriver::AdjustRefcount>, "AdjustRefcount"}, + {2, C<&IHOSBinderDriver::GetNativeHandle>, "GetNativeHandle"}, + {3, C<&IHOSBinderDriver::TransactParcelAuto>, "TransactParcelAuto"}, + }; + RegisterHandlers(functions); } IHOSBinderDriver::~IHOSBinderDriver() = default; diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver.h b/src/core/hle/service/nvnflinger/hos_binder_driver.h index 7d44046115..6b551c91d2 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver.h +++ b/src/core/hle/service/nvnflinger/hos_binder_driver.h @@ -44,7 +44,6 @@ private: OutBuffer parcel_reply, u32 flags); private: - std::optional FindRequest(u32 key) override; const std::shared_ptr m_server; const std::shared_ptr m_surface_flinger; }; diff --git a/src/core/hle/service/nvnflinger/nvnflinger.cpp b/src/core/hle/service/nvnflinger/nvnflinger.cpp index 9e3b68b8a0..48862a747d 100644 --- a/src/core/hle/service/nvnflinger/nvnflinger.cpp +++ b/src/core/hle/service/nvnflinger/nvnflinger.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/nvnflinger.h b/src/core/hle/service/nvnflinger/nvnflinger.h index 5c41f3013c..2f5465e7ef 100644 --- a/src/core/hle/service/nvnflinger/nvnflinger.h +++ b/src/core/hle/service/nvnflinger/nvnflinger.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/parcel.h b/src/core/hle/service/nvnflinger/parcel.h index 4567942016..ed85512792 100644 --- a/src/core/hle/service/nvnflinger/parcel.h +++ b/src/core/hle/service/nvnflinger/parcel.h @@ -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-FileCopyrightText: Copyright 2021 yuzu Emulator Project diff --git a/src/core/hle/service/nvnflinger/pixel_format.h b/src/core/hle/service/nvnflinger/pixel_format.h index f77d0acfb3..b6e8b5f8a0 100644 --- a/src/core/hle/service/nvnflinger/pixel_format.h +++ b/src/core/hle/service/nvnflinger/pixel_format.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/producer_listener.h b/src/core/hle/service/nvnflinger/producer_listener.h index 6bf8aaf1ee..892f6d531d 100644 --- a/src/core/hle/service/nvnflinger/producer_listener.h +++ b/src/core/hle/service/nvnflinger/producer_listener.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2014 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/status.h b/src/core/hle/service/nvnflinger/status.h index 3fa0fe15b9..7b188b42f5 100644 --- a/src/core/hle/service/nvnflinger/status.h +++ b/src/core/hle/service/nvnflinger/status.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/ui/graphic_buffer.cpp b/src/core/hle/service/nvnflinger/ui/graphic_buffer.cpp index ede2a11933..5ba7a31cc8 100644 --- a/src/core/hle/service/nvnflinger/ui/graphic_buffer.cpp +++ b/src/core/hle/service/nvnflinger/ui/graphic_buffer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/ui/graphic_buffer.h b/src/core/hle/service/nvnflinger/ui/graphic_buffer.h index da430aa752..099429b3f0 100644 --- a/src/core/hle/service/nvnflinger/ui/graphic_buffer.h +++ b/src/core/hle/service/nvnflinger/ui/graphic_buffer.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2007 The Android Open Source Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/nvnflinger/window.h b/src/core/hle/service/nvnflinger/window.h index 36d6cde3db..78a99f57ae 100644 --- a/src/core/hle/service/nvnflinger/window.h +++ b/src/core/hle/service/nvnflinger/window.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/olsc/daemon_controller.cpp b/src/core/hle/service/olsc/daemon_controller.cpp index f25888170c..c449c6ff31 100644 --- a/src/core/hle/service/olsc/daemon_controller.cpp +++ b/src/core/hle/service/olsc/daemon_controller.cpp @@ -9,24 +9,26 @@ namespace Service::OLSC { -std::optional IDaemonController::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IDaemonController::GetApplicationAutoTransferSetting>, "GetApplicationAutoTransferSetting"}, - FunctionInfo{1, D<&IDaemonController::SetApplicationAutoTransferSetting>, "SetApplicationAutoTransferSetting"}, - FunctionInfo{2, D<&IDaemonController::GetGlobalAutoUploadSetting>, "GetGlobalAutoUploadSetting"}, - FunctionInfo{3, D<&IDaemonController::SetGlobalAutoUploadSetting>, "SetGlobalAutoUploadSetting"}, - FunctionInfo{4, D<&IDaemonController::RunTransferTaskAutonomyRegistration>, "RunTransferTaskAutonomyRegistration"}, - FunctionInfo{5, D<&IDaemonController::GetGlobalAutoDownloadSetting>, "GetGlobalAutoDownloadSetting", MakeVersionGate({11,0,0})}, - FunctionInfo{6, D<&IDaemonController::SetGlobalAutoDownloadSetting>, "SetGlobalAutoDownloadSetting", MakeVersionGate({11,0,0})}, - FunctionInfo{10, nullptr, "CreateForbiddenSaveDataInidication"}, - FunctionInfo{11, D<&IDaemonController::StopAutonomyTaskExecution>, "StopAutonomyTaskExecution"}, - FunctionInfo{12, D<&IDaemonController::GetAutonomyTaskStatus>, "GetAutonomyTaskStatus"}, - FunctionInfo{13, nullptr, "Unknown13_20_0_0_Plus", MakeVersionGate({20,0,0})} - ); - return HandlerTableGenerateWithFind(key, functions); -} +IDaemonController::IDaemonController(Core::System& system_) + : ServiceFramework{system_, "IDaemonController"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IDaemonController::GetApplicationAutoTransferSetting>, "GetApplicationAutoTransferSetting"}, + {1, D<&IDaemonController::SetApplicationAutoTransferSetting>, "SetApplicationAutoTransferSetting"}, + {2, D<&IDaemonController::GetGlobalAutoUploadSetting>, "GetGlobalAutoUploadSetting"}, + {3, D<&IDaemonController::SetGlobalAutoUploadSetting>, "SetGlobalAutoUploadSetting"}, + {4, D<&IDaemonController::RunTransferTaskAutonomyRegistration>, "RunTransferTaskAutonomyRegistration"}, + {5, D<&IDaemonController::GetGlobalAutoDownloadSetting>, "GetGlobalAutoDownloadSetting"}, // 11.0.0+ + {6, D<&IDaemonController::SetGlobalAutoDownloadSetting>, "SetGlobalAutoDownloadSetting"}, // 11.0.0+ + {10, nullptr, "CreateForbiddenSaveDataInidication"}, + {11, D<&IDaemonController::StopAutonomyTaskExecution>, "StopAutonomyTaskExecution"}, + {12, D<&IDaemonController::GetAutonomyTaskStatus>, "GetAutonomyTaskStatus"}, + {13, nullptr, "Unknown13_20_0_0_Plus"}, // 20.0.0+ + }; + // clang-format on -IDaemonController::IDaemonController(Core::System& system_) : ServiceFramework{system_, "IDaemonController"} {} + RegisterHandlers(functions); +} IDaemonController::~IDaemonController() = default; diff --git a/src/core/hle/service/olsc/daemon_controller.h b/src/core/hle/service/olsc/daemon_controller.h index b90d3ee778..70f3d9e235 100644 --- a/src/core/hle/service/olsc/daemon_controller.h +++ b/src/core/hle/service/olsc/daemon_controller.h @@ -38,8 +38,6 @@ private: Result GetAutonomyTaskStatus(Out out_status, Common::UUID user_id); - std::optional FindRequest(u32 key) override; - // Internal in-memory state to back the above APIs struct AppKey { Common::UUID user_id; diff --git a/src/core/hle/service/olsc/native_handle_holder.cpp b/src/core/hle/service/olsc/native_handle_holder.cpp index 1f6f8419fc..1e50195539 100644 --- a/src/core/hle/service/olsc/native_handle_holder.cpp +++ b/src/core/hle/service/olsc/native_handle_holder.cpp @@ -12,16 +12,16 @@ namespace Service::OLSC { -std::optional INativeHandleHolder::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&INativeHandleHolder::GetNativeHandle>, "GetNativeHandle"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - INativeHandleHolder::INativeHandleHolder(Core::System& system_) : ServiceFramework{system_, "INativeHandleHolder"}, service_context{system_, "OLSC"} { event = service_context.CreateEvent("OLSC::INativeHandleHolder"); + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&INativeHandleHolder::GetNativeHandle>, "GetNativeHandle"}, + }; + // clang-format on + + RegisterHandlers(functions); } INativeHandleHolder::~INativeHandleHolder() { diff --git a/src/core/hle/service/olsc/native_handle_holder.h b/src/core/hle/service/olsc/native_handle_holder.h index 0ab51c7ca0..e0eac50c28 100644 --- a/src/core/hle/service/olsc/native_handle_holder.h +++ b/src/core/hle/service/olsc/native_handle_holder.h @@ -25,7 +25,6 @@ public: private: Result GetNativeHandle(OutCopyHandle out_event); - std::optional FindRequest(u32 key) override; Service::KernelHelpers::ServiceContext service_context; Kernel::KEvent* event{}; diff --git a/src/core/hle/service/olsc/olsc.cpp b/src/core/hle/service/olsc/olsc.cpp index 03b8a696f5..a86c525f9a 100644 --- a/src/core/hle/service/olsc/olsc.cpp +++ b/src/core/hle/service/olsc/olsc.cpp @@ -6,179 +6,22 @@ #include "core/hle/service/olsc/olsc.h" #include "core/hle/service/olsc/olsc_service_for_application.h" -#include "core/hle/service/olsc/native_handle_holder.h" -#include "core/hle/service/olsc/stopper_object.h" -#include "core/hle/service/olsc/daemon_controller.h" -#include "core/hle/service/olsc/transfer_task_list_controller.h" -#include "core/hle/service/olsc/remote_storage_controller.h" +#include "core/hle/service/olsc/olsc_service_for_system_service.h" #include "core/hle/service/server_manager.h" #include "core/hle/service/service.h" -#include "core/hle/service/cmif_serialization.h" namespace Service::OLSC { class ISProfileBgAgentForSystemProcess final : public ServiceFramework { public: - explicit ISProfileBgAgentForSystemProcess(Core::System& system_) : ServiceFramework{system_, "spbg:sp"} {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit ISProfileBgAgentForSystemProcess(Core::System& system_) + : ServiceFramework{system_, "spbg:sp"} + { + static const FunctionInfo functions[] = { + { 100, nullptr, "OpenBgAgentController" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{100, nullptr, "OpenBgAgentController" } - ); -}; - -class IDaemonController; -class IRemoteStorageController; -class ITransferTaskListController; - -struct DataTransferPolicy { - u8 upload_policy; - u8 download_policy; -}; - -struct TransferTaskErrorInfo { - Common::UUID uid; - u64 application_id; - u8 unknown_0x18; - std::array reserved_0x19; - u64 unknown_0x20; - u32 error_code; - u32 reserved_0x2C; -}; -static_assert(sizeof(TransferTaskErrorInfo) == 0x30, "TransferTaskErrorInfo has incorrect size."); - -class IOlscServiceForSystemService final : public ServiceFramework { -public: - explicit IOlscServiceForSystemService(Core::System& system_) - : ServiceFramework{system_, "olsc:s"} { - } - - ~IOlscServiceForSystemService() override = default; - - Result GetTransferTaskListController( - Out> out_interface) { - LOG_INFO(Service_OLSC, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); - } - - Result GetRemoteStorageController( - Out> out_interface) { - LOG_INFO(Service_OLSC, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDaemonController( - Out> out_interface) { - LOG_INFO(Service_OLSC, "called"); - *out_interface = std::make_shared(system); - R_SUCCEED(); - } - - Result GetDataTransferPolicy( - Out out_policy, u64 application_id) { - LOG_WARNING(Service_OLSC, "(STUBBED) called"); - DataTransferPolicy policy{}; - policy.upload_policy = 0; - policy.download_policy = 0; - *out_policy = policy; - R_SUCCEED(); - } - - Result GetTransferTaskErrorInfo(Out out_info, - Common::UUID uuid, u64 application_id) { - LOG_WARNING(Service_OLSC, "(STUBBED) called, uuid={} application_id={:016X}", - uuid.FormattedString(), application_id); - - TransferTaskErrorInfo info{}; - info.uid = uuid; - info.application_id = application_id; - info.unknown_0x18 = 0; - info.reserved_0x19.fill(0); - info.unknown_0x20 = 0; - info.error_code = 0; - info.reserved_0x2C = 0; - - *out_info = info; - R_SUCCEED(); - } - - Result GetOlscServiceForSystemService( - Out> out_interface) { - LOG_INFO(Service_OLSC, "called"); - *out_interface = std::static_pointer_cast(shared_from_this()); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IOlscServiceForSystemService::GetTransferTaskListController>, "GetTransferTaskListController"}, - FunctionInfo{1, D<&IOlscServiceForSystemService::GetRemoteStorageController>, "GetRemoteStorageController"}, - FunctionInfo{2, D<&IOlscServiceForSystemService::GetDaemonController>, "GetDaemonController"}, - FunctionInfo{10, nullptr, "PrepareDeleteUserProperty"}, - FunctionInfo{11, nullptr, "DeleteUserSaveDataProperty"}, - FunctionInfo{12, nullptr, "InvalidateMountCache"}, - FunctionInfo{13, nullptr, "DeleteDeviceSaveDataProperty"}, - FunctionInfo{100, nullptr, "ListLastTransferTaskErrorInfo"}, - FunctionInfo{101, nullptr, "GetLastErrorInfoCount"}, - FunctionInfo{102, nullptr, "RemoveLastErrorInfoOld"}, - FunctionInfo{103, nullptr, "GetLastErrorInfo"}, - FunctionInfo{104, nullptr, "GetLastErrorEventHolder"}, - FunctionInfo{105, D<&IOlscServiceForSystemService::GetTransferTaskErrorInfo>, "GetTransferTaskErrorInfo"}, - FunctionInfo{200, D<&IOlscServiceForSystemService::GetDataTransferPolicy>, "GetDataTransferPolicy"}, - FunctionInfo{201, nullptr, "DeleteDataTransferPolicyCache"}, - FunctionInfo{202, nullptr, "Unknown202"}, - FunctionInfo{203, nullptr, "RequestUpdateDataTransferPolicyCacheAsync"}, - FunctionInfo{204, nullptr, "ClearDataTransferPolicyCache"}, - FunctionInfo{205, nullptr, "RequestGetDataTransferPolicyAsync"}, - FunctionInfo{206, nullptr, "Unknown206", MakeVersionGate({21,0,0})}, - FunctionInfo{300, nullptr, "GetUserSaveDataProperty"}, - FunctionInfo{301, nullptr, "SetUserSaveDataProperty"}, - FunctionInfo{302, nullptr, "Unknown302", MakeVersionGate({21,0,0})}, - FunctionInfo{400, nullptr, "CleanupSaveDataBackupContextForSpecificApplications"}, - FunctionInfo{900, nullptr, "DeleteAllTransferTask"}, - FunctionInfo{902, nullptr, "DeleteAllSeriesInfo"}, - FunctionInfo{903, nullptr, "DeleteAllSdaInfoCache"}, - FunctionInfo{904, nullptr, "DeleteAllApplicationSetting"}, - FunctionInfo{905, nullptr, "DeleteAllTransferTaskErrorInfo"}, - FunctionInfo{906, nullptr, "RegisterTransferTaskErrorInfo"}, - FunctionInfo{907, nullptr, "AddSaveDataArchiveInfoCache"}, - FunctionInfo{908, nullptr, "DeleteSeriesInfo"}, - FunctionInfo{909, nullptr, "GetSeriesInfo"}, - FunctionInfo{910, nullptr, "RemoveTransferTaskErrorInfo"}, - FunctionInfo{911, nullptr, "DeleteAllSeriesInfoForSaveDataBackup"}, - FunctionInfo{912, nullptr, "DeleteSeriesInfoForSaveDataBackup"}, - FunctionInfo{913, nullptr, "GetSeriesInfoForSaveDataBackup"}, - FunctionInfo{914, nullptr, "Unknown914", MakeVersionGate({20,2,0})}, - FunctionInfo{1000, nullptr, "UpdateIssueOld"}, - FunctionInfo{1010, nullptr, "Unknown1010"}, - FunctionInfo{1011, nullptr, "Unknown1011"}, - FunctionInfo{1012, nullptr, "Unknown1012"}, - FunctionInfo{1013, nullptr, "Unkown1013"}, - FunctionInfo{1014, nullptr, "Unknown1014"}, - FunctionInfo{1020, nullptr, "Unknown1020"}, - FunctionInfo{1021, nullptr, "Unknown1021"}, - FunctionInfo{1022, nullptr, "Unknown1022"}, - FunctionInfo{1023, nullptr, "Unknown1023"}, - FunctionInfo{1024, nullptr, "Unknown1024"}, - FunctionInfo{1100, nullptr, "RepairUpdateIssueInfoCacheAync"}, - FunctionInfo{1110, nullptr, "RepairGetIssueInfo"}, - FunctionInfo{1111, nullptr, "RepairListIssueInfo"}, - FunctionInfo{1112, nullptr, "RepairListOperationPermissionInfo"}, - FunctionInfo{1113, nullptr, "RepairListDataInfoForRepairedSaveDataDownload"}, - FunctionInfo{1114, nullptr, "RepairListDataInfoForOriginalSaveDataDownload"}, - FunctionInfo{1120, nullptr, "RepairUploadSaveDataAsync"}, - FunctionInfo{1121, nullptr, "RepairUploadSaveDataAsync1"}, - FunctionInfo{1122, nullptr, "RepairDownloadRepairedSaveDataAsync"}, - FunctionInfo{1123, nullptr, "RepairDownloadOriginalSaveDataAsync"}, - FunctionInfo{1124, nullptr, "RepairGetOperationProgressInfo"}, - FunctionInfo{10000, D<&IOlscServiceForSystemService::GetOlscServiceForSystemService>, "GetOlscServiceForSystemService"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/olsc/olsc.h b/src/core/hle/service/olsc/olsc.h index 620b634fae..62000529c5 100644 --- a/src/core/hle/service/olsc/olsc.h +++ b/src/core/hle/service/olsc/olsc.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/olsc/olsc_service_for_application.cpp b/src/core/hle/service/olsc/olsc_service_for_application.cpp index 8d6b20d7ff..73d7d4ed64 100644 --- a/src/core/hle/service/olsc/olsc_service_for_application.cpp +++ b/src/core/hle/service/olsc/olsc_service_for_application.cpp @@ -9,36 +9,36 @@ namespace Service::OLSC { -std::optional IOlscServiceForApplication::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IOlscServiceForApplication::Initialize>, "Initialize"}, - FunctionInfo{10, nullptr, "VerifySaveDataBackupLicenseAsync"}, - FunctionInfo{13, D<&IOlscServiceForApplication::GetSaveDataBackupSetting>, "GetSaveDataBackupSetting"}, - FunctionInfo{14, D<&IOlscServiceForApplication::SetSaveDataBackupSettingEnabled>, "SetSaveDataBackupSettingEnabled"}, - FunctionInfo{15, nullptr, "SetCustomData"}, - FunctionInfo{16, nullptr, "DeleteSaveDataBackupSetting"}, - FunctionInfo{18, nullptr, "GetSaveDataBackupInfoCache"}, - FunctionInfo{19, nullptr, "UpdateSaveDataBackupInfoCacheAsync"}, - FunctionInfo{22, nullptr, "DeleteSaveDataBackupAsync"}, - FunctionInfo{25, nullptr, "ListDownloadableSaveDataBackupInfoAsync"}, - FunctionInfo{26, nullptr, "DownloadSaveDataBackupAsync"}, - FunctionInfo{27, nullptr, "UploadSaveDataBackupAsync"}, - FunctionInfo{9010, nullptr, "VerifySaveDataBackupLicenseAsyncForDebug"}, - FunctionInfo{9013, nullptr, "GetSaveDataBackupSettingForDebug"}, - FunctionInfo{9014, nullptr, "SetSaveDataBackupSettingEnabledForDebug"}, - FunctionInfo{9015, nullptr, "SetCustomDataForDebug"}, - FunctionInfo{9016, nullptr, "DeleteSaveDataBackupSettingForDebug"}, - FunctionInfo{9018, nullptr, "GetSaveDataBackupInfoCacheForDebug"}, - FunctionInfo{9019, nullptr, "UpdateSaveDataBackupInfoCacheAsyncForDebug"}, - FunctionInfo{9022, nullptr, "DeleteSaveDataBackupAsyncForDebug"}, - FunctionInfo{9025, nullptr, "ListDownloadableSaveDataBackupInfoAsyncForDebug"}, - FunctionInfo{9026, nullptr, "DownloadSaveDataBackupAsyncForDebug"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IOlscServiceForApplication::IOlscServiceForApplication(Core::System& system_) : ServiceFramework{system_, "olsc:u"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IOlscServiceForApplication::Initialize>, "Initialize"}, + {10, nullptr, "VerifySaveDataBackupLicenseAsync"}, + {13, D<&IOlscServiceForApplication::GetSaveDataBackupSetting>, "GetSaveDataBackupSetting"}, + {14, D<&IOlscServiceForApplication::SetSaveDataBackupSettingEnabled>, "SetSaveDataBackupSettingEnabled"}, + {15, nullptr, "SetCustomData"}, + {16, nullptr, "DeleteSaveDataBackupSetting"}, + {18, nullptr, "GetSaveDataBackupInfoCache"}, + {19, nullptr, "UpdateSaveDataBackupInfoCacheAsync"}, + {22, nullptr, "DeleteSaveDataBackupAsync"}, + {25, nullptr, "ListDownloadableSaveDataBackupInfoAsync"}, + {26, nullptr, "DownloadSaveDataBackupAsync"}, + {27, nullptr, "UploadSaveDataBackupAsync"}, + {9010, nullptr, "VerifySaveDataBackupLicenseAsyncForDebug"}, + {9013, nullptr, "GetSaveDataBackupSettingForDebug"}, + {9014, nullptr, "SetSaveDataBackupSettingEnabledForDebug"}, + {9015, nullptr, "SetCustomDataForDebug"}, + {9016, nullptr, "DeleteSaveDataBackupSettingForDebug"}, + {9018, nullptr, "GetSaveDataBackupInfoCacheForDebug"}, + {9019, nullptr, "UpdateSaveDataBackupInfoCacheAsyncForDebug"}, + {9022, nullptr, "DeleteSaveDataBackupAsyncForDebug"}, + {9025, nullptr, "ListDownloadableSaveDataBackupInfoAsyncForDebug"}, + {9026, nullptr, "DownloadSaveDataBackupAsyncForDebug"}, + }; + // clang-format on + + RegisterHandlers(functions); } IOlscServiceForApplication::~IOlscServiceForApplication() = default; diff --git a/src/core/hle/service/olsc/olsc_service_for_application.h b/src/core/hle/service/olsc/olsc_service_for_application.h index 0d92f9ba78..8941659478 100644 --- a/src/core/hle/service/olsc/olsc_service_for_application.h +++ b/src/core/hle/service/olsc/olsc_service_for_application.h @@ -22,8 +22,6 @@ private: Result GetSaveDataBackupSetting(Out out_save_data_backup_setting); Result SetSaveDataBackupSettingEnabled(bool enabled, NS::Uid account_id); - std::optional FindRequest(u32 key) override; - bool initialized{}; }; diff --git a/src/core/hle/service/olsc/olsc_service_for_system_service.cpp b/src/core/hle/service/olsc/olsc_service_for_system_service.cpp new file mode 100644 index 0000000000..245bbd5c6b --- /dev/null +++ b/src/core/hle/service/olsc/olsc_service_for_system_service.cpp @@ -0,0 +1,144 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/olsc/daemon_controller.h" +#include "core/hle/service/olsc/olsc_service_for_system_service.h" +#include "core/hle/service/olsc/remote_storage_controller.h" +#include "core/hle/service/olsc/transfer_task_list_controller.h" + +namespace Service::OLSC { + +IOlscServiceForSystemService::IOlscServiceForSystemService(Core::System& system_) + : ServiceFramework{system_, "olsc:s"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IOlscServiceForSystemService::GetTransferTaskListController>, "GetTransferTaskListController"}, + {1, D<&IOlscServiceForSystemService::GetRemoteStorageController>, "GetRemoteStorageController"}, + {2, D<&IOlscServiceForSystemService::GetDaemonController>, "GetDaemonController"}, + {10, nullptr, "PrepareDeleteUserProperty"}, + {11, nullptr, "DeleteUserSaveDataProperty"}, + {12, nullptr, "InvalidateMountCache"}, + {13, nullptr, "DeleteDeviceSaveDataProperty"}, + {100, nullptr, "ListLastTransferTaskErrorInfo"}, + {101, nullptr, "GetLastErrorInfoCount"}, + {102, nullptr, "RemoveLastErrorInfoOld"}, + {103, nullptr, "GetLastErrorInfo"}, + {104, nullptr, "GetLastErrorEventHolder"}, + {105, D<&IOlscServiceForSystemService::GetTransferTaskErrorInfo>, "GetTransferTaskErrorInfo"}, + {200, D<&IOlscServiceForSystemService::GetDataTransferPolicy>, "GetDataTransferPolicy"}, + {201, nullptr, "DeleteDataTransferPolicyCache"}, + {202, nullptr, "Unknown202"}, + {203, nullptr, "RequestUpdateDataTransferPolicyCacheAsync"}, + {204, nullptr, "ClearDataTransferPolicyCache"}, + {205, nullptr, "RequestGetDataTransferPolicyAsync"}, + {206, nullptr, "Unknown206"}, //21.0.0+ + {300, nullptr, "GetUserSaveDataProperty"}, + {301, nullptr, "SetUserSaveDataProperty"}, + {302, nullptr, "Unknown302"}, //21.0.0+ + {400, nullptr, "CleanupSaveDataBackupContextForSpecificApplications"}, + {900, nullptr, "DeleteAllTransferTask"}, + {902, nullptr, "DeleteAllSeriesInfo"}, + {903, nullptr, "DeleteAllSdaInfoCache"}, + {904, nullptr, "DeleteAllApplicationSetting"}, + {905, nullptr, "DeleteAllTransferTaskErrorInfo"}, + {906, nullptr, "RegisterTransferTaskErrorInfo"}, + {907, nullptr, "AddSaveDataArchiveInfoCache"}, + {908, nullptr, "DeleteSeriesInfo"}, + {909, nullptr, "GetSeriesInfo"}, + {910, nullptr, "RemoveTransferTaskErrorInfo"}, + {911, nullptr, "DeleteAllSeriesInfoForSaveDataBackup"}, + {912, nullptr, "DeleteSeriesInfoForSaveDataBackup"}, + {913, nullptr, "GetSeriesInfoForSaveDataBackup"}, + {914, nullptr, "Unknown914"}, //20.2.0+ + {1000, nullptr, "UpdateIssueOld"}, + {1010, nullptr, "Unknown1010"}, + {1011, nullptr, "Unknown1011"}, + {1012, nullptr, "Unknown1012"}, + {1013, nullptr, "Unkown1013"}, + {1014, nullptr, "Unknown1014"}, + {1020, nullptr, "Unknown1020"}, + {1021, nullptr, "Unknown1021"}, + {1022, nullptr, "Unknown1022"}, + {1023, nullptr, "Unknown1023"}, + {1024, nullptr, "Unknown1024"}, + {1100, nullptr, "RepairUpdateIssueInfoCacheAync"}, + {1110, nullptr, "RepairGetIssueInfo"}, + {1111, nullptr, "RepairListIssueInfo"}, + {1112, nullptr, "RepairListOperationPermissionInfo"}, + {1113, nullptr, "RepairListDataInfoForRepairedSaveDataDownload"}, + {1114, nullptr, "RepairListDataInfoForOriginalSaveDataDownload"}, + {1120, nullptr, "RepairUploadSaveDataAsync"}, + {1121, nullptr, "RepairUploadSaveDataAsync1"}, + {1122, nullptr, "RepairDownloadRepairedSaveDataAsync"}, + {1123, nullptr, "RepairDownloadOriginalSaveDataAsync"}, + {1124, nullptr, "RepairGetOperationProgressInfo"}, + {10000, D<&IOlscServiceForSystemService::GetOlscServiceForSystemService>, "GetOlscServiceForSystemService"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +IOlscServiceForSystemService::~IOlscServiceForSystemService() = default; + +Result IOlscServiceForSystemService::GetTransferTaskListController( + Out> out_interface) { + LOG_INFO(Service_OLSC, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); +} + +Result IOlscServiceForSystemService::GetRemoteStorageController( + Out> out_interface) { + LOG_INFO(Service_OLSC, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); +} + +Result IOlscServiceForSystemService::GetDaemonController( + Out> out_interface) { + LOG_INFO(Service_OLSC, "called"); + *out_interface = std::make_shared(system); + R_SUCCEED(); +} + +Result IOlscServiceForSystemService::GetDataTransferPolicy( + Out out_policy, u64 application_id) { + LOG_WARNING(Service_OLSC, "(STUBBED) called"); + DataTransferPolicy policy{}; + policy.upload_policy = 0; + policy.download_policy = 0; + *out_policy = policy; + R_SUCCEED(); +} + +Result IOlscServiceForSystemService::GetTransferTaskErrorInfo(Out out_info, + Common::UUID uuid, u64 application_id) { + LOG_WARNING(Service_OLSC, "(STUBBED) called, uuid={} application_id={:016X}", + uuid.FormattedString(), application_id); + + TransferTaskErrorInfo info{}; + info.uid = uuid; + info.application_id = application_id; + info.unknown_0x18 = 0; + info.reserved_0x19.fill(0); + info.unknown_0x20 = 0; + info.error_code = 0; + info.reserved_0x2C = 0; + + *out_info = info; + R_SUCCEED(); +} + +Result IOlscServiceForSystemService::GetOlscServiceForSystemService( + Out> out_interface) { + LOG_INFO(Service_OLSC, "called"); + *out_interface = std::static_pointer_cast(shared_from_this()); + R_SUCCEED(); +} + +} // namespace Service::OLSC diff --git a/src/core/hle/service/olsc/olsc_service_for_system_service.h b/src/core/hle/service/olsc/olsc_service_for_system_service.h new file mode 100644 index 0000000000..d16c8b979b --- /dev/null +++ b/src/core/hle/service/olsc/olsc_service_for_system_service.h @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include + +#include "common/uuid.h" +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Service::OLSC { + +class IDaemonController; +class IRemoteStorageController; +class ITransferTaskListController; + +struct DataTransferPolicy { + u8 upload_policy; + u8 download_policy; +}; + +struct TransferTaskErrorInfo { + Common::UUID uid; + u64 application_id; + u8 unknown_0x18; + std::array reserved_0x19; + u64 unknown_0x20; + u32 error_code; + u32 reserved_0x2C; +}; +static_assert(sizeof(TransferTaskErrorInfo) == 0x30, "TransferTaskErrorInfo has incorrect size."); + +class IOlscServiceForSystemService final : public ServiceFramework { +public: + explicit IOlscServiceForSystemService(Core::System& system_); + ~IOlscServiceForSystemService() override; + +private: + Result GetTransferTaskListController( + Out> out_interface); + Result GetRemoteStorageController(Out> out_interface); + Result GetDaemonController(Out> out_interface); + Result GetDataTransferPolicy(Out out_policy, u64 application_id); + Result GetTransferTaskErrorInfo(Out out_info, Common::UUID uid, u64 application_id); + Result GetOlscServiceForSystemService( + Out> out_interface); +}; + +} // namespace Service::OLSC diff --git a/src/core/hle/service/olsc/remote_storage_controller.cpp b/src/core/hle/service/olsc/remote_storage_controller.cpp index 1e7825da30..817097b426 100644 --- a/src/core/hle/service/olsc/remote_storage_controller.cpp +++ b/src/core/hle/service/olsc/remote_storage_controller.cpp @@ -9,44 +9,44 @@ namespace Service::OLSC { - std::optional IRemoteStorageController::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetSaveDataArchiveInfoBySaveDataId"}, - FunctionInfo{1, nullptr, "GetSaveDataArchiveInfoByApplicationId"}, - FunctionInfo{3, nullptr, "GetSaveDataArchiveCount"}, - FunctionInfo{6, nullptr, "CleanupSaveDataArchives"}, - FunctionInfo{7, nullptr, "CreateSaveDataArchiveCacheUpdationTask"}, - FunctionInfo{8, nullptr, "CreateSaveDataArchiveCacheUpdationForSpecifiedApplicationTask"}, - FunctionInfo{9, nullptr, "Delete"}, - FunctionInfo{10, nullptr, "GetSeriesInfo"}, - FunctionInfo{11, nullptr, "CreateDeleteDataTask"}, - FunctionInfo{12, nullptr, "DeleteSeriesInfo"}, - FunctionInfo{13, nullptr, "CreateRegisterNotificationTokenTask"}, - FunctionInfo{14, D<&IRemoteStorageController::GetDataNewnessByApplicationId>, "GetDataNewnessByApplicationId"}, - FunctionInfo{15, nullptr, "RegisterUploadSaveDataTransferTaskForAutonomyRegistration"}, - FunctionInfo{16, nullptr, "CreateCleanupToDeleteSaveDataArchiveInfoTask"}, - FunctionInfo{17, nullptr, "ListDataInfo"}, - FunctionInfo{18, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV1"}, - FunctionInfo{19, nullptr, "GetDataInfoCacheUpdateNativeHandleHolder"}, - FunctionInfo{20, nullptr, "CreateSaveDataArchiveInfoCacheForSaveDataBackupUpdationTask"}, - FunctionInfo{21, nullptr, "ListSecondarySaves"}, - FunctionInfo{22, D<&IRemoteStorageController::GetSecondarySave>, "GetSecondarySave"}, - FunctionInfo{23, nullptr, "TouchSecondarySave"}, - FunctionInfo{24, nullptr, "GetSecondarySaveDataInfo"}, - FunctionInfo{25, nullptr, "RegisterDownloadSaveDataTransferTaskForAutonomyRegistration"}, - FunctionInfo{26, nullptr, "Unknown26", MakeVersionGate({20,0,0})}, - FunctionInfo{27, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV2", MakeVersionGate({20,0,0})}, - FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,0,0})}, - FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({21,0,0})}, - FunctionInfo{800, nullptr, "Unknown800", MakeVersionGate({20,0,0})}, - FunctionInfo{900, nullptr, "SetLoadedDataMissing"}, - FunctionInfo{901, nullptr, "Unknown901", MakeVersionGate({20,2,0})} - ); - return HandlerTableGenerateWithFind(key, functions); - } - IRemoteStorageController::IRemoteStorageController(Core::System& system_) : ServiceFramework{system_, "IRemoteStorageController"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetSaveDataArchiveInfoBySaveDataId"}, + {1, nullptr, "GetSaveDataArchiveInfoByApplicationId"}, + {3, nullptr, "GetSaveDataArchiveCount"}, + {6, nullptr, "CleanupSaveDataArchives"}, + {7, nullptr, "CreateSaveDataArchiveCacheUpdationTask"}, + {8, nullptr, "CreateSaveDataArchiveCacheUpdationForSpecifiedApplicationTask"}, + {9, nullptr, "Delete"}, + {10, nullptr, "GetSeriesInfo"}, + {11, nullptr, "CreateDeleteDataTask"}, + {12, nullptr, "DeleteSeriesInfo"}, + {13, nullptr, "CreateRegisterNotificationTokenTask"}, + {14, D<&IRemoteStorageController::GetDataNewnessByApplicationId>, "GetDataNewnessByApplicationId"}, + {15, nullptr, "RegisterUploadSaveDataTransferTaskForAutonomyRegistration"}, + {16, nullptr, "CreateCleanupToDeleteSaveDataArchiveInfoTask"}, + {17, nullptr, "ListDataInfo"}, + {18, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV1"}, + {19, nullptr, "GetDataInfoCacheUpdateNativeHandleHolder"}, + {20, nullptr, "CreateSaveDataArchiveInfoCacheForSaveDataBackupUpdationTask"}, + {21, nullptr, "ListSecondarySaves"}, + {22, D<&IRemoteStorageController::GetSecondarySave>, "GetSecondarySave"}, + {23, nullptr, "TouchSecondarySave"}, + {24, nullptr, "GetSecondarySaveDataInfo"}, + {25, nullptr, "RegisterDownloadSaveDataTransferTaskForAutonomyRegistration"}, + {26, nullptr, "Unknown26"}, //20.0.0+ + {27, D<&IRemoteStorageController::GetDataInfo>, "GetDataInfoV2"}, //20.0.0+ + {28, nullptr, "Unknown28"}, //20.0.0+ + {29, nullptr, "Unknown29"}, //21.0.0+ + {800, nullptr, "Unknown800"}, //20.0.0+ + {900, nullptr, "SetLoadedDataMissing"}, + {901, nullptr, "Unknown901"}, //20.2.0+ + }; + // clang-format on + + RegisterHandlers(functions); } IRemoteStorageController::~IRemoteStorageController() = default; diff --git a/src/core/hle/service/olsc/remote_storage_controller.h b/src/core/hle/service/olsc/remote_storage_controller.h index 20503d9800..21b439013a 100644 --- a/src/core/hle/service/olsc/remote_storage_controller.h +++ b/src/core/hle/service/olsc/remote_storage_controller.h @@ -21,8 +21,6 @@ private: u64 application_id); Result GetDataNewnessByApplicationId(Out out_newness, u64 application_id); Result GetDataInfo(Out> out_data, u64 application_id); - - std::optional FindRequest(u32 key) override; }; } // namespace Service::OLSC diff --git a/src/core/hle/service/olsc/transfer_task_list_controller.cpp b/src/core/hle/service/olsc/transfer_task_list_controller.cpp index af090fc292..95e41cdb51 100644 --- a/src/core/hle/service/olsc/transfer_task_list_controller.cpp +++ b/src/core/hle/service/olsc/transfer_task_list_controller.cpp @@ -11,45 +11,45 @@ namespace Service::OLSC { - std::optional ITransferTaskListController::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetTransferTaskCountForOcean"}, - FunctionInfo{1, nullptr, "GetTransferTaskInfoForOcean"}, - FunctionInfo{2, nullptr, "ListTransferTaskInfoForOcean"}, - FunctionInfo{3, nullptr, "DeleteTransferTaskForOcean"}, - FunctionInfo{4, nullptr, "RaiseTransferTaskPriorityForOcean"}, - FunctionInfo{5, D<&ITransferTaskListController::GetTransferTaskEndEventNativeHandleHolder>, "GetTransferTaskEndEventNativeHandleHolder"}, - FunctionInfo{6, nullptr, "GetTransferTaskProgressForOcean"}, - FunctionInfo{7, nullptr, "GetTransferTaskLastResultForOcean"}, - FunctionInfo{8, D<&ITransferTaskListController::StopNextTransferTaskExecution>, "StopNextTransferTaskExecution"}, - FunctionInfo{9, D<&ITransferTaskListController::GetTransferTaskStartEventNativeHandleHolder>, "GetTransferTaskStartEventNativeHandleHolder"}, - FunctionInfo{10, nullptr, "SuspendTransferTaskForOcean"}, - FunctionInfo{11, nullptr, "GetCurrentTransferTaskInfoForOcean"}, - FunctionInfo{12, nullptr, "FindTransferTaskInfoForOcean"}, - FunctionInfo{13, nullptr, "CancelCurrentRepairTransferTask"}, - FunctionInfo{14, nullptr, "GetRepairTransferTaskProgress"}, - FunctionInfo{15, nullptr, "EnsureExecutableForRepairTransferTask"}, - FunctionInfo{16, D<&ITransferTaskListController::GetTransferTaskCount>, "GetTransferTaskCount"}, - FunctionInfo{17, nullptr, "GetTransferTaskInfo"}, - FunctionInfo{18, nullptr, "ListTransferTaskInfo"}, - FunctionInfo{19, nullptr, "DeleteTransferTask"}, - FunctionInfo{20, nullptr, "RaiseTransferTaskPriority"}, - FunctionInfo{21, D<&ITransferTaskListController::GetTransferTaskProgress>, "GetTransferTaskProgress", MakeVersionGate({10,1,0})}, - FunctionInfo{22, nullptr, "GetTransferTaskLastResult"}, - FunctionInfo{23, nullptr, "SuspendTransferTask"}, - FunctionInfo{24, D<&ITransferTaskListController::GetCurrentTransferTaskInfo>, "GetCurrentTransferTaskInfo"}, - FunctionInfo{25, D<&ITransferTaskListController::FindTransferTaskInfo>, "FindTransferTaskInfo"}, - FunctionInfo{26, nullptr, "Unknown26", MakeVersionGate({20,1,0})}, - FunctionInfo{27, nullptr, "Unknown27", MakeVersionGate({20,1,0})}, - FunctionInfo{28, nullptr, "Unknown28", MakeVersionGate({20,1,0})}, - FunctionInfo{29, nullptr, "Unknown29", MakeVersionGate({20,1,0})}, - FunctionInfo{30, nullptr, "Unknown30", MakeVersionGate({20,1,0})} - ); - return HandlerTableGenerateWithFind(key, functions); - } - ITransferTaskListController::ITransferTaskListController(Core::System& system_) : ServiceFramework{system_, "ITransferTaskListController"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetTransferTaskCountForOcean"}, + {1, nullptr, "GetTransferTaskInfoForOcean"}, + {2, nullptr, "ListTransferTaskInfoForOcean"}, + {3, nullptr, "DeleteTransferTaskForOcean"}, + {4, nullptr, "RaiseTransferTaskPriorityForOcean"}, + {5, D<&ITransferTaskListController::GetTransferTaskEndEventNativeHandleHolder>, "GetTransferTaskEndEventNativeHandleHolder"}, + {6, nullptr, "GetTransferTaskProgressForOcean"}, + {7, nullptr, "GetTransferTaskLastResultForOcean"}, + {8, D<&ITransferTaskListController::StopNextTransferTaskExecution>, "StopNextTransferTaskExecution"}, + {9, D<&ITransferTaskListController::GetTransferTaskStartEventNativeHandleHolder>, "GetTransferTaskStartEventNativeHandleHolder"}, + {10, nullptr, "SuspendTransferTaskForOcean"}, + {11, nullptr, "GetCurrentTransferTaskInfoForOcean"}, + {12, nullptr, "FindTransferTaskInfoForOcean"}, + {13, nullptr, "CancelCurrentRepairTransferTask"}, + {14, nullptr, "GetRepairTransferTaskProgress"}, + {15, nullptr, "EnsureExecutableForRepairTransferTask"}, + {16, D<&ITransferTaskListController::GetTransferTaskCount>, "GetTransferTaskCount"}, + {17, nullptr, "GetTransferTaskInfo"}, + {18, nullptr, "ListTransferTaskInfo"}, + {19, nullptr, "DeleteTransferTask"}, + {20, nullptr, "RaiseTransferTaskPriority"}, + {21, D<&ITransferTaskListController::GetTransferTaskProgress>, "GetTransferTaskProgress"}, //10.1.0+ + {22, nullptr, "GetTransferTaskLastResult"}, + {23, nullptr, "SuspendTransferTask"}, + {24, D<&ITransferTaskListController::GetCurrentTransferTaskInfo>, "GetCurrentTransferTaskInfo"}, + {25, D<&ITransferTaskListController::FindTransferTaskInfo>, "FindTransferTaskInfo"}, + {26, nullptr, "Unknown26"}, //20.1.0+ + {27, nullptr, "Unknown27"}, //20.1.0+ + {28, nullptr, "Unknown28"}, //20.1.0+ + {29, nullptr, "Unknown29"}, //20.1.0+ + {30, nullptr, "Unknown30"}, //20.1.0+ + }; + // clang-format on + + RegisterHandlers(functions); } ITransferTaskListController::~ITransferTaskListController() = default; diff --git a/src/core/hle/service/olsc/transfer_task_list_controller.h b/src/core/hle/service/olsc/transfer_task_list_controller.h index 74c5eddee3..5f3429879a 100644 --- a/src/core/hle/service/olsc/transfer_task_list_controller.h +++ b/src/core/hle/service/olsc/transfer_task_list_controller.h @@ -27,8 +27,6 @@ private: Result GetTransferTaskProgress(); Result GetCurrentTransferTaskInfo(Out> out_info, u8 unknown); Result FindTransferTaskInfo(Out> out_info, InBuffer in); - - std::optional FindRequest(u32 key) override; }; } // namespace Service::OLSC diff --git a/src/core/hle/service/omm/omm.cpp b/src/core/hle/service/omm/omm.cpp index b95319e26b..cc0b686ab1 100644 --- a/src/core/hle/service/omm/omm.cpp +++ b/src/core/hle/service/omm/omm.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/omm/omm.h b/src/core/hle/service/omm/omm.h index 7bf04688ae..6b100a6d61 100644 --- a/src/core/hle/service/omm/omm.h +++ b/src/core/hle/service/omm/omm.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/omm/operation_mode_manager.cpp b/src/core/hle/service/omm/operation_mode_manager.cpp index e36f606442..1af7714d0d 100644 --- a/src/core/hle/service/omm/operation_mode_manager.cpp +++ b/src/core/hle/service/omm/operation_mode_manager.cpp @@ -10,6 +10,41 @@ namespace Service::OMM { IOperationModeManager::IOperationModeManager(Core::System& system_) : ServiceFramework{system_, "omm"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetOperationMode"}, + {1, nullptr, "GetOperationModeChangeEvent"}, + {2, nullptr, "EnableAudioVisual"}, + {3, nullptr, "DisableAudioVisual"}, + {4, nullptr, "EnterSleepAndWait"}, + {5, nullptr, "GetCradleStatus"}, + {6, nullptr, "FadeInDisplay"}, + {7, nullptr, "FadeOutDisplay"}, + {8, nullptr, "GetCradleFwVersion"}, + {9, nullptr, "NotifyCecSettingsChanged"}, + {10, nullptr, "SetOperationModePolicy"}, + {11, nullptr, "GetDefaultDisplayResolution"}, + {12, nullptr, "GetDefaultDisplayResolutionChangeEvent"}, + {13, nullptr, "UpdateDefaultDisplayResolution"}, + {14, nullptr, "ShouldSleepOnBoot"}, + {15, nullptr, "NotifyHdcpApplicationExecutionStarted"}, + {16, nullptr, "NotifyHdcpApplicationExecutionFinished"}, + {17, nullptr, "NotifyHdcpApplicationDrawingStarted"}, + {18, nullptr, "NotifyHdcpApplicationDrawingFinished"}, + {19, nullptr, "GetHdcpAuthenticationFailedEvent"}, + {20, nullptr, "GetHdcpAuthenticationFailedEmulationEnabled"}, + {21, nullptr, "SetHdcpAuthenticationFailedEmulation"}, + {22, nullptr, "GetHdcpStateChangeEvent"}, + {23, nullptr, "GetHdcpState"}, + {24, nullptr, "ShowCardUpdateProcessing"}, + {25, nullptr, "SetApplicationCecSettingsAndNotifyChanged"}, + {26, nullptr, "GetOperationModeSystemInfo"}, + {27, nullptr, "GetAppletFullAwakingSystemEvent"}, + {28, nullptr, "CreateCradleFirmwareUpdater"}, + }; + // clang-format on + + RegisterHandlers(functions); } IOperationModeManager::~IOperationModeManager() = default; diff --git a/src/core/hle/service/omm/operation_mode_manager.h b/src/core/hle/service/omm/operation_mode_manager.h index ea604c8f60..dd6753757c 100644 --- a/src/core/hle/service/omm/operation_mode_manager.h +++ b/src/core/hle/service/omm/operation_mode_manager.h @@ -18,41 +18,6 @@ class IOperationModeManager final : public ServiceFramework FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetOperationMode"}, - FunctionInfo{1, nullptr, "GetOperationModeChangeEvent"}, - FunctionInfo{2, nullptr, "EnableAudioVisual"}, - FunctionInfo{3, nullptr, "DisableAudioVisual"}, - FunctionInfo{4, nullptr, "EnterSleepAndWait"}, - FunctionInfo{5, nullptr, "GetCradleStatus"}, - FunctionInfo{6, nullptr, "FadeInDisplay"}, - FunctionInfo{7, nullptr, "FadeOutDisplay"}, - FunctionInfo{8, nullptr, "GetCradleFwVersion"}, - FunctionInfo{9, nullptr, "NotifyCecSettingsChanged"}, - FunctionInfo{10, nullptr, "SetOperationModePolicy"}, - FunctionInfo{11, nullptr, "GetDefaultDisplayResolution"}, - FunctionInfo{12, nullptr, "GetDefaultDisplayResolutionChangeEvent"}, - FunctionInfo{13, nullptr, "UpdateDefaultDisplayResolution"}, - FunctionInfo{14, nullptr, "ShouldSleepOnBoot"}, - FunctionInfo{15, nullptr, "NotifyHdcpApplicationExecutionStarted"}, - FunctionInfo{16, nullptr, "NotifyHdcpApplicationExecutionFinished"}, - FunctionInfo{17, nullptr, "NotifyHdcpApplicationDrawingStarted"}, - FunctionInfo{18, nullptr, "NotifyHdcpApplicationDrawingFinished"}, - FunctionInfo{19, nullptr, "GetHdcpAuthenticationFailedEvent"}, - FunctionInfo{20, nullptr, "GetHdcpAuthenticationFailedEmulationEnabled"}, - FunctionInfo{21, nullptr, "SetHdcpAuthenticationFailedEmulation"}, - FunctionInfo{22, nullptr, "GetHdcpStateChangeEvent"}, - FunctionInfo{23, nullptr, "GetHdcpState"}, - FunctionInfo{24, nullptr, "ShowCardUpdateProcessing"}, - FunctionInfo{25, nullptr, "SetApplicationCecSettingsAndNotifyChanged"}, - FunctionInfo{26, nullptr, "GetOperationModeSystemInfo"}, - FunctionInfo{27, nullptr, "GetAppletFullAwakingSystemEvent"}, - FunctionInfo{28, nullptr, "CreateCradleFirmwareUpdater"} - ); }; } // namespace Service::OMM diff --git a/src/core/hle/service/omm/policy_manager_system.cpp b/src/core/hle/service/omm/policy_manager_system.cpp index 1d46de7f3e..b9e8277f8c 100644 --- a/src/core/hle/service/omm/policy_manager_system.cpp +++ b/src/core/hle/service/omm/policy_manager_system.cpp @@ -10,6 +10,18 @@ namespace Service::OMM { IPolicyManagerSystem::IPolicyManagerSystem(Core::System& system_) : ServiceFramework{system_, "idle:sys"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetAutoPowerDownEvent"}, + {1, nullptr, "IsAutoPowerDownRequested"}, + {2, nullptr, "Unknown2"}, + {3, nullptr, "SetHandlingContext"}, + {4, nullptr, "LoadAndApplySettings"}, + {5, nullptr, "ReportUserIsActive"}, + }; + // clang-format on + + RegisterHandlers(functions); } IPolicyManagerSystem::~IPolicyManagerSystem() = default; diff --git a/src/core/hle/service/omm/policy_manager_system.h b/src/core/hle/service/omm/policy_manager_system.h index c6ff451e61..2fb6eb9293 100644 --- a/src/core/hle/service/omm/policy_manager_system.h +++ b/src/core/hle/service/omm/policy_manager_system.h @@ -18,18 +18,6 @@ class IPolicyManagerSystem final : public ServiceFramework public: explicit IPolicyManagerSystem(Core::System& system_); ~IPolicyManagerSystem() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetAutoPowerDownEvent"}, - FunctionInfo{1, nullptr, "IsAutoPowerDownRequested"}, - FunctionInfo{2, nullptr, "Unknown2"}, - FunctionInfo{3, nullptr, "SetHandlingContext"}, - FunctionInfo{4, nullptr, "LoadAndApplySettings"}, - FunctionInfo{5, nullptr, "ReportUserIsActive"} - ); }; } // namespace Service::OMM diff --git a/src/core/hle/service/omm/power_state_interface.cpp b/src/core/hle/service/omm/power_state_interface.cpp index 4150882695..04ea75b496 100644 --- a/src/core/hle/service/omm/power_state_interface.cpp +++ b/src/core/hle/service/omm/power_state_interface.cpp @@ -10,6 +10,24 @@ namespace Service::OMM { IPowerStateInterface::IPowerStateInterface(Core::System& system_) : ServiceFramework{system_, "spsm"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetState"}, + {1, nullptr, "EnterSleep"}, + {2, nullptr, "GetLastWakeReason"}, + {3, nullptr, "Shutdown"}, + {4, nullptr, "GetNotificationMessageEventHandle"}, + {5, nullptr, "ReceiveNotificationMessage"}, + {6, nullptr, "AnalyzeLogForLastSleepWakeSequence"}, + {7, nullptr, "ResetEventLog"}, + {8, nullptr, "AnalyzePerformanceLogForLastSleepWakeSequence"}, + {9, nullptr, "ChangeHomeButtonLongPressingTime"}, + {10, nullptr, "PutErrorState"}, + {11, nullptr, "InvalidateCurrentHomeButtonPressing"}, + }; + // clang-format on + + RegisterHandlers(functions); } IPowerStateInterface::~IPowerStateInterface() = default; diff --git a/src/core/hle/service/omm/power_state_interface.h b/src/core/hle/service/omm/power_state_interface.h index fed55a4361..dc1d376a13 100644 --- a/src/core/hle/service/omm/power_state_interface.h +++ b/src/core/hle/service/omm/power_state_interface.h @@ -18,24 +18,6 @@ class IPowerStateInterface final : public ServiceFramework public: explicit IPowerStateInterface(Core::System& system_); ~IPowerStateInterface() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetState"}, - FunctionInfo{1, nullptr, "EnterSleep"}, - FunctionInfo{2, nullptr, "GetLastWakeReason"}, - FunctionInfo{3, nullptr, "Shutdown"}, - FunctionInfo{4, nullptr, "GetNotificationMessageEventHandle"}, - FunctionInfo{5, nullptr, "ReceiveNotificationMessage"}, - FunctionInfo{6, nullptr, "AnalyzeLogForLastSleepWakeSequence"}, - FunctionInfo{7, nullptr, "ResetEventLog"}, - FunctionInfo{8, nullptr, "AnalyzePerformanceLogForLastSleepWakeSequence"}, - FunctionInfo{9, nullptr, "ChangeHomeButtonLongPressingTime"}, - FunctionInfo{10, nullptr, "PutErrorState"}, - FunctionInfo{11, nullptr, "InvalidateCurrentHomeButtonPressing"} - ); }; } // namespace Service::OMM diff --git a/src/core/hle/service/os/multi_wait.cpp b/src/core/hle/service/os/multi_wait.cpp index 7b80d28bed..c9bb256ab0 100644 --- a/src/core/hle/service/os/multi_wait.cpp +++ b/src/core/hle/service/os/multi_wait.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/os/multi_wait.h b/src/core/hle/service/os/multi_wait.h index 340c611b5b..c9076c21d7 100644 --- a/src/core/hle/service/os/multi_wait.h +++ b/src/core/hle/service/os/multi_wait.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/os/multi_wait_holder.cpp b/src/core/hle/service/os/multi_wait_holder.cpp index 01efa045b5..f3864218c9 100644 --- a/src/core/hle/service/os/multi_wait_holder.cpp +++ b/src/core/hle/service/os/multi_wait_holder.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/os/multi_wait_holder.h b/src/core/hle/service/os/multi_wait_holder.h index 646395a3f3..3b28ec6b5a 100644 --- a/src/core/hle/service/os/multi_wait_holder.h +++ b/src/core/hle/service/os/multi_wait_holder.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/os/multi_wait_utils.h b/src/core/hle/service/os/multi_wait_utils.h index 96d3a10f37..d8f3ade4c1 100644 --- a/src/core/hle/service/os/multi_wait_utils.h +++ b/src/core/hle/service/os/multi_wait_utils.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/os/mutex.h b/src/core/hle/service/os/mutex.h index 95ac9b117a..8e29bbb633 100644 --- a/src/core/hle/service/os/mutex.h +++ b/src/core/hle/service/os/mutex.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/pcie/pcie.cpp b/src/core/hle/service/pcie/pcie.cpp index f9aaa2d3b8..d162881ecf 100644 --- a/src/core/hle/service/pcie/pcie.cpp +++ b/src/core/hle/service/pcie/pcie.cpp @@ -15,62 +15,64 @@ namespace Service::PCIe { class ISession final : public ServiceFramework { public: - explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {} + explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "QueryFunctions"}, + {1, nullptr, "AcquireFunction"}, + {2, nullptr, "ReleaseFunction"}, + {3, nullptr, "GetFunctionState"}, + {4, nullptr, "GetBarProfile"}, + {5, nullptr, "ReadConfig"}, + {6, nullptr, "WriteConfig"}, + {7, nullptr, "ReadBarRegion"}, + {8, nullptr, "WriteBarRegion"}, + {9, nullptr, "FindCapability"}, + {10, nullptr, "FindExtendedCapability"}, + {11, nullptr, "MapDma"}, + {12, nullptr, "UnmapDma"}, + {13, nullptr, "UnmapDmaBusAddress"}, + {14, nullptr, "GetDmaBusAddress"}, + {15, nullptr, "GetDmaBusAddressRange"}, + {16, nullptr, "SetDmaEnable"}, + {17, nullptr, "AcquireIrq"}, + {18, nullptr, "ReleaseIrq"}, + {19, nullptr, "SetIrqEnable"}, + {20, nullptr, "GetIrqEvent"}, + {21, nullptr, "SetAspmEnable"}, + {22, nullptr, "SetResetUponResumeEnable"}, + {23, nullptr, "ResetFunction"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "QueryFunctions"}, - FunctionInfo{1, nullptr, "AcquireFunction"}, - FunctionInfo{2, nullptr, "ReleaseFunction"}, - FunctionInfo{3, nullptr, "GetFunctionState"}, - FunctionInfo{4, nullptr, "GetBarProfile"}, - FunctionInfo{5, nullptr, "ReadConfig"}, - FunctionInfo{6, nullptr, "WriteConfig"}, - FunctionInfo{7, nullptr, "ReadBarRegion"}, - FunctionInfo{8, nullptr, "WriteBarRegion"}, - FunctionInfo{9, nullptr, "FindCapability"}, - FunctionInfo{10, nullptr, "FindExtendedCapability"}, - FunctionInfo{11, nullptr, "MapDma"}, - FunctionInfo{12, nullptr, "UnmapDma"}, - FunctionInfo{13, nullptr, "UnmapDmaBusAddress"}, - FunctionInfo{14, nullptr, "GetDmaBusAddress"}, - FunctionInfo{15, nullptr, "GetDmaBusAddressRange"}, - FunctionInfo{16, nullptr, "SetDmaEnable"}, - FunctionInfo{17, nullptr, "AcquireIrq"}, - FunctionInfo{18, nullptr, "ReleaseIrq"}, - FunctionInfo{19, nullptr, "SetIrqEnable"}, - FunctionInfo{20, nullptr, "GetIrqEvent"}, - FunctionInfo{21, nullptr, "SetAspmEnable"}, - FunctionInfo{22, nullptr, "SetResetUponResumeEnable"}, - FunctionInfo{23, nullptr, "ResetFunction"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class PCIE final : public ServiceFramework { public: - explicit PCIE(Core::System& system_) : ServiceFramework{system_, "pcie"} {} + explicit PCIE(Core::System& system_) : ServiceFramework{system_, "pcie"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "RegisterClassDriver"}, + {1, nullptr, "QueryFunctionsUnregistered"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "RegisterClassDriver"}, - FunctionInfo{1, nullptr, "QueryFunctionsUnregistered"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class PCIE_LOG final : public ServiceFramework { public: - explicit PCIE_LOG(Core::System& system_) : ServiceFramework{system_, "pcie:log"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetLoggedState"}, - FunctionInfo{1, nullptr, "GetLoggedStateEvent"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit PCIE_LOG(Core::System& system_) : ServiceFramework{system_, "pcie:log"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetLoggedState"}, + {1, nullptr, "GetLoggedStateEvent"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/pcie/pcie.h b/src/core/hle/service/pcie/pcie.h index 5c2d4b805b..cf2048ce65 100644 --- a/src/core/hle/service/pcie/pcie.h +++ b/src/core/hle/service/pcie/pcie.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/pctl/parental_control_service.cpp b/src/core/hle/service/pctl/parental_control_service.cpp new file mode 100644 index 0000000000..51953c2657 --- /dev/null +++ b/src/core/hle/service/pctl/parental_control_service.cpp @@ -0,0 +1,498 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include + +#include "core/core.h" +#include "core/file_sys/control_metadata.h" +#include "core/file_sys/patch_manager.h" +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/pctl/parental_control_service.h" +#include "core/hle/service/pctl/pctl_results.h" + +namespace Service::PCTL { + +IParentalControlService::IParentalControlService(Core::System& system_, Capability capability_, + u64 program_id_) + : ServiceFramework{system_, "IParentalControlService"}, capability{capability_}, + program_id{program_id_}, + service_context{system_, "IParentalControlService"}, synchronization_event{service_context}, + unlinked_event{service_context}, request_suspension_event{service_context} { + // clang-format off + static const FunctionInfo functions[] = { + {1, D<&IParentalControlService::Initialize>, "Initialize"}, + {1001, D<&IParentalControlService::CheckFreeCommunicationPermission>, "CheckFreeCommunicationPermission"}, + {1002, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"}, + {1003, D<&IParentalControlService::ConfirmResumeApplicationPermission>, "ConfirmResumeApplicationPermission"}, + {1004, D<&IParentalControlService::ConfirmSnsPostPermission>, "ConfirmSnsPostPermission"}, + {1005, D<&IParentalControlService::ConfirmSystemSettingsPermission>, "ConfirmSystemSettingsPermission"}, + {1006, D<&IParentalControlService::IsRestrictionTemporaryUnlocked>, "IsRestrictionTemporaryUnlocked"}, + {1007, nullptr, "RevertRestrictionTemporaryUnlocked"}, + {1008, nullptr, "EnterRestrictedSystemSettings"}, + {1009, nullptr, "LeaveRestrictedSystemSettings"}, + {1010, D<&IParentalControlService::IsRestrictedSystemSettingsEntered>, "IsRestrictedSystemSettingsEntered"}, + {1011, nullptr, "RevertRestrictedSystemSettingsEntered"}, + {1012, nullptr, "GetRestrictedFeatures"}, + {1013, D<&IParentalControlService::ConfirmStereoVisionPermission>, "ConfirmStereoVisionPermission"}, + {1014, nullptr, "ConfirmPlayableApplicationVideoOld"}, + {1015, nullptr, "ConfirmPlayableApplicationVideo"}, + {1016, nullptr, "ConfirmShowNewsPermission"}, + {1017, D<&IParentalControlService::EndFreeCommunication>, "EndFreeCommunication"}, + {1018, D<&IParentalControlService::IsFreeCommunicationAvailable>, "IsFreeCommunicationAvailable"}, + {1019, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"}, + {1020, nullptr, "ConfirmLaunchSharedApplicationPermission"}, //20.0.0+ + {1021, nullptr, "TryBeginFreeCommunicationForStreamPlay"}, //21.0.0+ + {1022, nullptr, "EndFreeCommunicationForStreamPlay"}, //21.0.0+ + {1031, D<&IParentalControlService::IsRestrictionEnabled>, "IsRestrictionEnabled"}, + {1032, D<&IParentalControlService::GetSafetyLevel>, "GetSafetyLevel"}, + {1033, nullptr, "SetSafetyLevel"}, + {1034, nullptr, "GetSafetyLevelSettings"}, + {1035, D<&IParentalControlService::GetCurrentSettings>, "GetCurrentSettings"}, + {1036, nullptr, "SetCustomSafetyLevelSettings"}, + {1037, nullptr, "GetDefaultRatingOrganization"}, + {1038, nullptr, "SetDefaultRatingOrganization"}, + {1039, D<&IParentalControlService::GetFreeCommunicationApplicationListCount>, "GetFreeCommunicationApplicationListCount"}, + {1042, nullptr, "AddToFreeCommunicationApplicationList"}, + {1043, nullptr, "DeleteSettings"}, + {1044, nullptr, "GetFreeCommunicationApplicationList"}, + {1045, nullptr, "UpdateFreeCommunicationApplicationList"}, + {1046, nullptr, "DisableFeaturesForReset"}, + {1047, nullptr, "NotifyApplicationDownloadStarted"}, + {1048, nullptr, "NotifyNetworkProfileCreated"}, + {1049, nullptr, "ResetFreeCommunicationApplicationList"}, + {1050, nullptr, "AddToFreeCommunicationApplicationList"}, //20.0.0+ + {1051, nullptr, "NotifyApplicationDownloadStarted"}, //20.0.0+ + {1061, D<&IParentalControlService::ConfirmStereoVisionRestrictionConfigurable>, "ConfirmStereoVisionRestrictionConfigurable"}, + {1062, D<&IParentalControlService::GetStereoVisionRestriction>, "GetStereoVisionRestriction"}, + {1063, D<&IParentalControlService::SetStereoVisionRestriction>, "SetStereoVisionRestriction"}, + {1064, D<&IParentalControlService::ResetConfirmedStereoVisionPermission>, "ResetConfirmedStereoVisionPermission"}, + {1065, D<&IParentalControlService::IsStereoVisionPermitted>, "IsStereoVisionPermitted"}, + {1201, nullptr, "UnlockRestrictionTemporarily"}, + {1202, nullptr, "UnlockSystemSettingsRestriction"}, + {1203, nullptr, "SetPinCode"}, + {1204, nullptr, "GenerateInquiryCode"}, + {1205, nullptr, "CheckMasterKey"}, + {1206, D<&IParentalControlService::GetPinCodeLength>, "GetPinCodeLength"}, + {1207, nullptr, "GetPinCodeChangedEvent"}, + {1208, nullptr, "GetPinCode"}, + {1403, D<&IParentalControlService::IsPairingActive>, "IsPairingActive"}, + {1406, nullptr, "GetSettingsLastUpdated"}, + {1411, nullptr, "GetPairingAccountInfo"}, + {1421, nullptr, "GetAccountNickname"}, + {1424, nullptr, "GetAccountState"}, + {1425, nullptr, "RequestPostEvents"}, + {1426, nullptr, "GetPostEventInterval"}, + {1427, nullptr, "SetPostEventInterval"}, + {1432, D<&IParentalControlService::GetSynchronizationEvent>, "GetSynchronizationEvent"}, + {1451, D<&IParentalControlService::StartPlayTimer>, "StartPlayTimer"}, + {1452, D<&IParentalControlService::StopPlayTimer>, "StopPlayTimer"}, + {1453, D<&IParentalControlService::IsPlayTimerEnabled>, "IsPlayTimerEnabled"}, + {1454, D<&IParentalControlService::GetPlayTimerRemainingTime>, "GetPlayTimerRemainingTime"}, + {1455, D<&IParentalControlService::IsRestrictedByPlayTimer>, "IsRestrictedByPlayTimer"}, + {1456, D<&IParentalControlService::GetPlayTimerSettingsOld>, "GetPlayTimerSettingsOld"}, + {1457, D<&IParentalControlService::GetPlayTimerEventToRequestSuspension>, "GetPlayTimerEventToRequestSuspension"}, + {1458, D<&IParentalControlService::IsPlayTimerAlarmDisabled>, "IsPlayTimerAlarmDisabled"}, + {1459, D<&IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo>, "GetPlayTimerRemainingTimeDisplayInfo"}, + {1460, D<&IParentalControlService::Unknown1460>, "Unknown1460"}, + {1471, nullptr, "NotifyWrongPinCodeInputManyTimes"}, + {1472, nullptr, "CancelNetworkRequest"}, + {1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"}, + {1474, nullptr, "ClearUnlinkedEvent"}, + {1475, nullptr, "GetExtendedPlayTimerEvent"}, // 18.0.0+ + {1601, nullptr, "DisableAllFeatures"}, + {1602, nullptr, "PostEnableAllFeatures"}, + {1603, nullptr, "IsAllFeaturesDisabled"}, + {1901, nullptr, "DeleteFromFreeCommunicationApplicationListForDebug"}, + {1902, nullptr, "ClearFreeCommunicationApplicationListForDebug"}, + {1903, nullptr, "GetExemptApplicationListCountForDebug"}, + {1904, nullptr, "GetExemptApplicationListForDebug"}, + {1905, nullptr, "UpdateExemptApplicationListForDebug"}, + {1906, nullptr, "AddToExemptApplicationListForDebug"}, + {1907, nullptr, "DeleteFromExemptApplicationListForDebug"}, + {1908, nullptr, "ClearExemptApplicationListForDebug"}, + {1941, nullptr, "DeletePairing"}, + {1951, nullptr, "SetPlayTimerSettingsForDebug"}, + {1952, nullptr, "GetPlayTimerSpentTimeForTest"}, + {1953, nullptr, "SetPlayTimerAlarmDisabledForDebug"}, + {1954, nullptr, "IsBedtimeAlarmEnabled"}, // 18.0.0+ + {1955, nullptr, "GetBedtimeAlarmTime"}, // 18.0.0+ + {1956, nullptr, "GetBedtimeAlarmTimeHour"}, // 18.0.0+ + {1957, nullptr, "GetBedtimeAlarmTimeMinute"}, // 18.0.0+ + {2001, nullptr, "RequestPairingAsync"}, + {2002, nullptr, "FinishRequestPairing"}, + {2003, nullptr, "AuthorizePairingAsync"}, + {2004, nullptr, "FinishAuthorizePairing"}, + {2005, nullptr, "RetrievePairingInfoAsync"}, + {2006, nullptr, "FinishRetrievePairingInfo"}, + {2007, nullptr, "UnlinkPairingAsync"}, + {2008, nullptr, "FinishUnlinkPairing"}, + {2009, nullptr, "GetAccountMiiImageAsync"}, + {2010, nullptr, "FinishGetAccountMiiImage"}, + {2011, nullptr, "GetAccountMiiImageContentTypeAsync"}, + {2012, nullptr, "FinishGetAccountMiiImageContentType"}, + {2013, nullptr, "SynchronizeParentalControlSettingsAsync"}, + {2014, nullptr, "FinishSynchronizeParentalControlSettings"}, + {2015, nullptr, "FinishSynchronizeParentalControlSettingsWithLastUpdated"}, + {2016, nullptr, "RequestUpdateExemptionListAsync"}, //5.0.0+ + {145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings"}, // 18.0.0+ + {2017, nullptr, "AuthorizePairingAsync"}, //19.0.0+ + {2019, nullptr, "RequestUpdateDeviceUsersBackground"}, //19.0.0+ + {2021, nullptr, "RequestCopyPairingAsync"}, //20.0.0+ + {2022, nullptr, "FinishRequestCopyPairing"}, //20.0.0+ + {2023, nullptr, "IsFromPairingActiveDevice"}, //20.0.0+ + {2024, nullptr, "RollbackCopyPairing"}, //21.0.0+ + {3001, nullptr, "GetErrorContextChangedEvent"}, //20.0.0+ + {145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings"}, // 18.0.0+ + {195101, D<&IParentalControlService::SetPlayTimerSettings>, "SetPlayTimerSettingsForDebug"}, //18.0.0+ + }; + // clang-format on + RegisterHandlers(functions); +} + +IParentalControlService::~IParentalControlService() = default; + +bool IParentalControlService::CheckFreeCommunicationPermissionImpl() const { + if (states.temporary_unlocked) { + return true; + } + if ((states.application_info.parental_control_flag & 1) == 0) { + return true; + } + if (pin_code[0] == '\0') { + return true; + } + if (!settings.is_free_communication_default_on) { + return true; + } + // TODO(ogniK): Check for blacklisted/exempted applications. Return false can happen here + // but as we don't have multiproceses support yet, we can just assume our application is + // valid for the time being + return true; +} + +bool IParentalControlService::ConfirmStereoVisionPermissionImpl() const { + if (states.temporary_unlocked) { + return true; + } + if (pin_code[0] == '\0') { + return true; + } + if (!settings.is_stero_vision_restricted) { + return false; + } + return true; +} + +void IParentalControlService::SetStereoVisionRestrictionImpl(bool is_restricted) { + if (settings.disabled) { + return; + } + + if (pin_code[0] == '\0') { + return; + } + settings.is_stero_vision_restricted = is_restricted; +} + +Result IParentalControlService::Initialize() { + LOG_DEBUG(Service_PCTL, "called"); + + if (False(capability & (Capability::Application | Capability::System))) { + LOG_ERROR(Service_PCTL, "Invalid capability! capability={:X}", capability); + R_THROW(PCTL::ResultNoCapability); + } + + // TODO(ogniK): Recovery flag initialization for pctl:r + + if (program_id != 0) { + const FileSys::PatchManager pm{program_id, system.GetFileSystemController(), + system.GetContentProvider()}; + const auto control = pm.GetControlMetadata(); + if (control.first) { + states.tid_from_event = 0; + states.launch_time_valid = false; + states.is_suspended = false; + states.free_communication = false; + states.stereo_vision = false; + states.application_info = ApplicationInfo{ + .application_id = program_id, + .age_rating = control.first->GetRatingAge(), + .parental_control_flag = control.first->GetParentalControlFlag(), + .capability = capability, + }; + + if (False(capability & (Capability::System | Capability::Recovery))) { + // TODO(ogniK): Signal application launch event + } + } + } + + R_SUCCEED(); +} + +Result IParentalControlService::CheckFreeCommunicationPermission() { + LOG_DEBUG(Service_PCTL, "called"); + + if (!CheckFreeCommunicationPermissionImpl()) { + R_THROW(PCTL::ResultNoFreeCommunication); + } else { + states.free_communication = true; + R_SUCCEED(); + } +} + +Result IParentalControlService::ConfirmLaunchApplicationPermission( + InBuffer restriction_bitset, u64 nacp_flag, u64 application_id) { + LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag, + application_id); + R_SUCCEED(); +} + +Result IParentalControlService::ConfirmResumeApplicationPermission( + InBuffer restriction_bitset, u64 nacp_flag, u64 application_id) { + LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag, + application_id); + R_SUCCEED(); +} + +Result IParentalControlService::ConfirmSnsPostPermission() { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + R_THROW(PCTL::ResultNoFreeCommunication); +} + +Result IParentalControlService::ConfirmSystemSettingsPermission() { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + R_SUCCEED(); +} + +Result IParentalControlService::IsRestrictionTemporaryUnlocked( + Out out_is_temporary_unlocked) { + *out_is_temporary_unlocked = false; + LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}", + *out_is_temporary_unlocked); + R_SUCCEED(); +} + +Result IParentalControlService::IsRestrictedSystemSettingsEntered( + Out out_is_restricted_system_settings_entered) { + *out_is_restricted_system_settings_entered = false; + LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}", + *out_is_restricted_system_settings_entered); + R_SUCCEED(); +} + +Result IParentalControlService::ConfirmStereoVisionPermission() { + LOG_DEBUG(Service_PCTL, "called"); + states.stereo_vision = true; + R_SUCCEED(); +} + +Result IParentalControlService::EndFreeCommunication() { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + R_SUCCEED(); +} + +Result IParentalControlService::IsFreeCommunicationAvailable() { + LOG_DEBUG(Service_PCTL, "(STUBBED) called"); + + if (!CheckFreeCommunicationPermissionImpl()) { + R_THROW(PCTL::ResultNoFreeCommunication); + } else { + R_SUCCEED(); + } +} + +Result IParentalControlService::IsRestrictionEnabled(Out out_restriction_enabled) { + LOG_DEBUG(Service_PCTL, "called"); + + if (False(capability & (Capability::Status | Capability::Recovery))) { + LOG_ERROR(Service_PCTL, "Application does not have Status or Recovery capabilities!"); + *out_restriction_enabled = false; + R_THROW(PCTL::ResultNoCapability); + } + + *out_restriction_enabled = pin_code[0] != '\0'; + R_SUCCEED(); +} + +Result IParentalControlService::GetSafetyLevel(Out out_safety_level) { + *out_safety_level = 0; + LOG_WARNING(Service_PCTL, "(STUBBED) called, safety_level={}", *out_safety_level); + R_SUCCEED(); +} + +Result IParentalControlService::GetCurrentSettings(Out out_settings) { + LOG_INFO(Service_PCTL, "called"); + *out_settings = restriction_settings; + R_SUCCEED(); +} + +Result IParentalControlService::GetFreeCommunicationApplicationListCount(Out out_count) { + *out_count = 4; + LOG_WARNING(Service_PCTL, "(STUBBED) called, count={}", *out_count); + R_SUCCEED(); +} + +Result IParentalControlService::ConfirmStereoVisionRestrictionConfigurable() { + LOG_DEBUG(Service_PCTL, "called"); + + if (False(capability & Capability::StereoVision)) { + LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); + R_THROW(PCTL::ResultNoCapability); + } + + if (pin_code[0] == '\0') { + R_THROW(PCTL::ResultNoRestrictionEnabled); + } + + R_SUCCEED(); +} + +Result IParentalControlService::IsStereoVisionPermitted(Out out_is_permitted) { + LOG_DEBUG(Service_PCTL, "called"); + + if (!ConfirmStereoVisionPermissionImpl()) { + *out_is_permitted = false; + R_THROW(PCTL::ResultStereoVisionRestricted); + } else { + *out_is_permitted = true; + R_SUCCEED(); + } +} + +Result IParentalControlService::GetPinCodeLength(Out out_length) { + *out_length = 0; + LOG_WARNING(Service_PCTL, "(STUBBED) called, length={}", *out_length); + R_SUCCEED(); +} + +Result IParentalControlService::IsPairingActive(Out out_is_pairing_active) { + *out_is_pairing_active = false; + LOG_WARNING(Service_PCTL, "(STUBBED) called, is_pairing_active={}", *out_is_pairing_active); + R_SUCCEED(); +} + +Result IParentalControlService::GetSynchronizationEvent( + OutCopyHandle out_event) { + LOG_INFO(Service_PCTL, "called"); + *out_event = synchronization_event.GetHandle(); + R_SUCCEED(); +} + +Result IParentalControlService::StartPlayTimer() { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + R_SUCCEED(); +} + +Result IParentalControlService::StopPlayTimer() { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + R_SUCCEED(); +} + +Result IParentalControlService::IsPlayTimerEnabled(Out out_is_play_timer_enabled) { + *out_is_play_timer_enabled = false; + LOG_WARNING(Service_PCTL, "(STUBBED) called, enabled={}", *out_is_play_timer_enabled); + R_SUCCEED(); +} + +Result IParentalControlService::GetPlayTimerRemainingTime(Out out_remaining_time) { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + *out_remaining_time = std::numeric_limits::max(); + R_SUCCEED(); +} + +Result IParentalControlService::IsRestrictedByPlayTimer(Out out_is_restricted_by_play_timer) { + *out_is_restricted_by_play_timer = false; + LOG_WARNING(Service_PCTL, "(STUBBED) called, restricted={}", *out_is_restricted_by_play_timer); + R_SUCCEED(); +} + +Result IParentalControlService::GetPlayTimerSettingsOld( + Out out_play_timer_settings) { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + *out_play_timer_settings = {}; + R_SUCCEED(); +} + +Result IParentalControlService::GetPlayTimerSettings(Out out_play_timer_settings) { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + *out_play_timer_settings = raw_play_timer_settings; + R_SUCCEED(); +} + +Result IParentalControlService::SetPlayTimerSettings(PlayTimerSettings play_timer_settings) { + LOG_WARNING(Service_PCTL, "(STUBBED) called"); + raw_play_timer_settings = play_timer_settings; + R_SUCCEED(); +} + +Result IParentalControlService::GetPlayTimerEventToRequestSuspension( + OutCopyHandle out_event) { + LOG_INFO(Service_PCTL, "called"); + *out_event = request_suspension_event.GetHandle(); + R_SUCCEED(); +} + +Result IParentalControlService::IsPlayTimerAlarmDisabled(Out out_play_timer_alarm_disabled) { + *out_play_timer_alarm_disabled = false; + LOG_INFO(Service_PCTL, "called, is_play_timer_alarm_disabled={}", + *out_play_timer_alarm_disabled); + R_SUCCEED(); +} + +Result IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo(Out out_display_info) { + LOG_DEBUG(Service_PCTL, "called"); + *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; + R_SUCCEED(); +} + +Result IParentalControlService::Unknown1460(u8 in_unk, Out out_display_info) { + LOG_DEBUG(Service_PCTL, "called, in_unk={}", in_unk); + *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; + R_SUCCEED(); +} + +Result IParentalControlService::GetUnlinkedEvent(OutCopyHandle out_event) { + LOG_INFO(Service_PCTL, "called"); + *out_event = unlinked_event.GetHandle(); + R_SUCCEED(); +} + +Result IParentalControlService::GetStereoVisionRestriction( + Out out_stereo_vision_restriction) { + LOG_DEBUG(Service_PCTL, "called"); + + if (False(capability & Capability::StereoVision)) { + LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); + *out_stereo_vision_restriction = false; + R_THROW(PCTL::ResultNoCapability); + } + + *out_stereo_vision_restriction = settings.is_stero_vision_restricted; + R_SUCCEED(); +} + +Result IParentalControlService::SetStereoVisionRestriction(bool stereo_vision_restriction) { + LOG_DEBUG(Service_PCTL, "called, can_use={}", stereo_vision_restriction); + + if (False(capability & Capability::StereoVision)) { + LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); + R_THROW(PCTL::ResultNoCapability); + } + + SetStereoVisionRestrictionImpl(stereo_vision_restriction); + R_SUCCEED(); +} + +Result IParentalControlService::ResetConfirmedStereoVisionPermission() { + LOG_DEBUG(Service_PCTL, "called"); + + states.stereo_vision = false; + + R_SUCCEED(); +} + +} // namespace Service::PCTL diff --git a/src/core/hle/service/pctl/parental_control_service.h b/src/core/hle/service/pctl/parental_control_service.h new file mode 100644 index 0000000000..9dabe3d059 --- /dev/null +++ b/src/core/hle/service/pctl/parental_control_service.h @@ -0,0 +1,99 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator +// Project// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/kernel_helpers.h" +#include "core/hle/service/os/event.h" +#include "core/hle/service/pctl/pctl_types.h" +#include "core/hle/service/service.h" + +namespace Service::PCTL { + +class IParentalControlService final : public ServiceFramework { +public: + explicit IParentalControlService(Core::System& system_, Capability capability_, + u64 program_id_); + ~IParentalControlService() override; + +private: + bool CheckFreeCommunicationPermissionImpl() const; + bool ConfirmStereoVisionPermissionImpl() const; + void SetStereoVisionRestrictionImpl(bool is_restricted); + + Result Initialize(); + Result CheckFreeCommunicationPermission(); + Result ConfirmLaunchApplicationPermission(InBuffer restriction_bitset, + u64 nacp_flag, u64 application_id); + Result ConfirmResumeApplicationPermission(InBuffer restriction_bitset, + u64 nacp_flag, u64 application_id); + Result ConfirmSnsPostPermission(); + Result ConfirmSystemSettingsPermission(); + Result IsRestrictionTemporaryUnlocked(Out out_is_temporary_unlocked); + Result IsRestrictedSystemSettingsEntered(Out out_is_restricted_system_settings_entered); + Result ConfirmStereoVisionPermission(); + Result EndFreeCommunication(); + Result IsFreeCommunicationAvailable(); + Result IsRestrictionEnabled(Out out_restriction_enabled); + Result GetSafetyLevel(Out out_safety_level); + Result GetCurrentSettings(Out out_settings); + Result GetFreeCommunicationApplicationListCount(Out out_count); + Result ConfirmStereoVisionRestrictionConfigurable(); + Result IsStereoVisionPermitted(Out out_is_permitted); + Result GetPinCodeLength(Out out_length); + Result IsPairingActive(Out out_is_pairing_active); + Result GetSynchronizationEvent(OutCopyHandle out_event); + Result StartPlayTimer(); + Result StopPlayTimer(); + Result IsPlayTimerEnabled(Out out_is_play_timer_enabled); + Result GetPlayTimerRemainingTime(Out out_remaining_time); + Result IsRestrictedByPlayTimer(Out out_is_restricted_by_play_timer); + Result GetPlayTimerSettingsOld(Out out_play_timer_settings); + Result GetPlayTimerEventToRequestSuspension(OutCopyHandle out_event); + Result IsPlayTimerAlarmDisabled(Out out_play_timer_alarm_disabled); + Result GetPlayTimerRemainingTimeDisplayInfo(Out out_display_info); + Result Unknown1460(u8 in_unk, Out out_display_info); + Result GetUnlinkedEvent(OutCopyHandle out_event); + Result GetStereoVisionRestriction(Out out_stereo_vision_restriction); + Result SetStereoVisionRestriction(bool stereo_vision_restriction); + Result ResetConfirmedStereoVisionPermission(); + Result GetPlayTimerSettings(Out out_play_timer_settings); + Result SetPlayTimerSettings(PlayTimerSettings out_play_timer_settings); + + struct States { + u64 current_tid{}; + ApplicationInfo application_info{}; + u64 tid_from_event{}; + bool launch_time_valid{}; + bool is_suspended{}; + bool temporary_unlocked{}; + bool free_communication{}; + bool stereo_vision{}; + }; + + struct ParentalControlSettings { + bool is_stero_vision_restricted{}; + bool is_free_communication_default_on{}; + bool disabled{}; + }; + + States states{}; + ParentalControlSettings settings{}; + RestrictionSettings restriction_settings{}; + std::array pin_code{}; + Capability capability{}; + u64 program_id{}; + // TODO: this is raw + PlayTimerSettings raw_play_timer_settings{}; + + KernelHelpers::ServiceContext service_context; + Event synchronization_event; + Event unlinked_event; + Event request_suspension_event; +}; + +} // namespace Service::PCTL diff --git a/src/core/hle/service/pctl/parental_control_service_factory.cpp b/src/core/hle/service/pctl/parental_control_service_factory.cpp new file mode 100644 index 0000000000..ae278a9bbc --- /dev/null +++ b/src/core/hle/service/pctl/parental_control_service_factory.cpp @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/core.h" +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/pctl/parental_control_service.h" +#include "core/hle/service/pctl/parental_control_service_factory.h" + +namespace Service::PCTL { + +IParentalControlServiceFactory::IParentalControlServiceFactory(Core::System& system_, + const char* name_, + Capability capability_) + : ServiceFramework{system_, name_}, capability{capability_} { + static const FunctionInfo functions[] = { + {0, D<&IParentalControlServiceFactory::CreateService>, "CreateService"}, + {1, D<&IParentalControlServiceFactory::CreateServiceWithoutInitialize>, + "CreateServiceWithoutInitialize"}, + }; + RegisterHandlers(functions); +} + +IParentalControlServiceFactory::~IParentalControlServiceFactory() = default; + +Result IParentalControlServiceFactory::CreateService( + Out> out_service, ClientProcessId process_id) { + LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid); + *out_service = std::make_shared( + system, capability, system.ResolveCallerProgramId(*process_id)); + R_SUCCEED(); +} + +Result IParentalControlServiceFactory::CreateServiceWithoutInitialize( + Out> out_service, ClientProcessId process_id) { + LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid); + *out_service = std::make_shared( + system, capability, system.ResolveCallerProgramId(*process_id)); + R_SUCCEED(); +} + +} // namespace Service::PCTL diff --git a/src/core/hle/service/pctl/parental_control_service_factory.h b/src/core/hle/service/pctl/parental_control_service_factory.h new file mode 100644 index 0000000000..0b5afede82 --- /dev/null +++ b/src/core/hle/service/pctl/parental_control_service_factory.h @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/pctl/pctl_types.h" +#include "core/hle/service/service.h" + +namespace Service::PCTL { + +class IParentalControlService; + +class IParentalControlServiceFactory : public ServiceFramework { +public: + explicit IParentalControlServiceFactory(Core::System& system_, const char* name_, + Capability capability_); + ~IParentalControlServiceFactory() override; + + Result CreateService(Out> out_service, + ClientProcessId process_id); + Result CreateServiceWithoutInitialize(Out> out_service, + ClientProcessId process_id); + +private: + Capability capability{}; +}; + +void LoopProcess(Core::System& system); + +} // namespace Service::PCTL diff --git a/src/core/hle/service/pctl/pctl.cpp b/src/core/hle/service/pctl/pctl.cpp index 4f0fbbe702..37f18a5d58 100644 --- a/src/core/hle/service/pctl/pctl.cpp +++ b/src/core/hle/service/pctl/pctl.cpp @@ -4,636 +4,27 @@ // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include "common/common_funcs.h" -#include "core/file_sys/control_metadata.h" -#include "core/file_sys/patch_manager.h" -#include "core/hle/service/cmif_types.h" +#include "core/hle/service/pctl/parental_control_service_factory.h" #include "core/hle/service/pctl/pctl.h" #include "core/hle/service/server_manager.h" -#include "core/hle/service/service.h" -#include "core/hle/service/cmif_serialization.h" namespace Service::PCTL { -constexpr Result ResultNoFreeCommunication{ErrorModule::PCTL, 101}; -constexpr Result ResultStereoVisionRestricted{ErrorModule::PCTL, 104}; -constexpr Result ResultNoCapability{ErrorModule::PCTL, 131}; -constexpr Result ResultNoRestrictionEnabled{ErrorModule::PCTL, 181}; - -enum class Capability : u32 { - None = 0, - Application = 1 << 0, - SnsPost = 1 << 1, - Recovery = 1 << 6, - Status = 1 << 8, - StereoVision = 1 << 9, - System = 1 << 15, -}; -DECLARE_ENUM_FLAG_OPERATORS(Capability); - -struct ApplicationInfo { - u64 application_id{}; - std::array age_rating{}; - u32 parental_control_flag{}; - Capability capability{}; -}; -static_assert(sizeof(ApplicationInfo) == 0x30, "ApplicationInfo has incorrect size."); - -// This is nn::pctl::RestrictionSettings -struct RestrictionSettings { - u8 rating_age; - bool sns_post_restriction; - bool free_communication_restriction; -}; -static_assert(sizeof(RestrictionSettings) == 0x3, "RestrictionSettings has incorrect size."); - -// This is nn::pctl::PlayTimerSettingsOld -struct PlayTimerSettingsOld { - std::array settings; -}; -static_assert(sizeof(PlayTimerSettingsOld) == 0x34, "PlayTimerSettingsOld has incorrect size."); - -// This is nn::pctl::PlayTimerSettings -struct PlayTimerSettings { - std::array settings; //21.0.0+ now takes 0x44 -}; -static_assert(sizeof(PlayTimerSettings) == 0x44, "PlayTimerSettings has incorrect size."); - -enum class PlayTimerDisplayState : u8 { - TimesUp = 0, - BedtimeAlarm = 1, - RemainingTime = 2, - Unknown3 = 3, - Unknown4 = 4, - Unknown5 = 5, - TimerDisabled = 6, - NotConfigured = 7, -}; - -// This is nn::pctl::PlayTimerRemainingTimeDisplayInfo -struct PlayTimerRemainingTimeDisplayInfo { - PlayTimerDisplayState state; - INSERT_PADDING_BYTES(0x7); - u64 unknown_08; - u64 remaining_time; -}; -static_assert(sizeof(PlayTimerRemainingTimeDisplayInfo) == 0x18, "PlayTimerRemainingTimeDisplayInfo has incorrect size."); - -class IParentalControlService final : public ServiceFramework { -public: - explicit IParentalControlService(Core::System& system_, Capability capability_, - u64 program_id_) - : ServiceFramework{system_, "IParentalControlService"}, capability{capability_}, - program_id{program_id_}, - service_context{system_, "IParentalControlService"}, synchronization_event{service_context}, - unlinked_event{service_context}, request_suspension_event{service_context} { - } - - ~IParentalControlService() override = default; - - bool CheckFreeCommunicationPermissionImpl() const { - if (states.temporary_unlocked) { - return true; - } - if ((states.application_info.parental_control_flag & 1) == 0) { - return true; - } - if (pin_code[0] == '\0') { - return true; - } - if (!settings.is_free_communication_default_on) { - return true; - } - // TODO(ogniK): Check for blacklisted/exempted applications. Return false can happen here - // but as we don't have multiproceses support yet, we can just assume our application is - // valid for the time being - return true; - } - - bool ConfirmStereoVisionPermissionImpl() const { - if (states.temporary_unlocked) { - return true; - } - if (pin_code[0] == '\0') { - return true; - } - if (!settings.is_stero_vision_restricted) { - return false; - } - return true; - } - - void SetStereoVisionRestrictionImpl(bool is_restricted) { - if (settings.disabled) { - return; - } - - if (pin_code[0] == '\0') { - return; - } - settings.is_stero_vision_restricted = is_restricted; - } - - Result Initialize() { - LOG_DEBUG(Service_PCTL, "called"); - - if (False(capability & (Capability::Application | Capability::System))) { - LOG_ERROR(Service_PCTL, "Invalid capability! capability={:X}", capability); - R_THROW(PCTL::ResultNoCapability); - } - - // TODO(ogniK): Recovery flag initialization for pctl:r - - if (program_id != 0) { - const FileSys::PatchManager pm{program_id, system.GetFileSystemController(), - system.GetContentProvider()}; - const auto control = pm.GetControlMetadata(); - if (control.first) { - states.tid_from_event = 0; - states.launch_time_valid = false; - states.is_suspended = false; - states.free_communication = false; - states.stereo_vision = false; - states.application_info = ApplicationInfo{ - .application_id = program_id, - .age_rating = control.first->GetRatingAge(), - .parental_control_flag = control.first->GetParentalControlFlag(), - .capability = capability, - }; - - if (False(capability & (Capability::System | Capability::Recovery))) { - // TODO(ogniK): Signal application launch event - } - } - } - - R_SUCCEED(); - } - - Result CheckFreeCommunicationPermission() { - LOG_DEBUG(Service_PCTL, "called"); - - if (!CheckFreeCommunicationPermissionImpl()) { - R_THROW(PCTL::ResultNoFreeCommunication); - } else { - states.free_communication = true; - R_SUCCEED(); - } - } - - Result ConfirmLaunchApplicationPermission( - InBuffer restriction_bitset, u64 nacp_flag, u64 application_id) { - LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag, - application_id); - R_SUCCEED(); - } - - Result ConfirmResumeApplicationPermission( - InBuffer restriction_bitset, u64 nacp_flag, u64 application_id) { - LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag, - application_id); - R_SUCCEED(); - } - - Result ConfirmSnsPostPermission() { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - R_THROW(PCTL::ResultNoFreeCommunication); - } - - Result ConfirmSystemSettingsPermission() { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - R_SUCCEED(); - } - - Result IsRestrictionTemporaryUnlocked( - Out out_is_temporary_unlocked) { - *out_is_temporary_unlocked = false; - LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}", - *out_is_temporary_unlocked); - R_SUCCEED(); - } - - Result IsRestrictedSystemSettingsEntered( - Out out_is_restricted_system_settings_entered) { - *out_is_restricted_system_settings_entered = false; - LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}", - *out_is_restricted_system_settings_entered); - R_SUCCEED(); - } - - Result ConfirmStereoVisionPermission() { - LOG_DEBUG(Service_PCTL, "called"); - states.stereo_vision = true; - R_SUCCEED(); - } - - Result EndFreeCommunication() { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - R_SUCCEED(); - } - - Result IsFreeCommunicationAvailable() { - LOG_DEBUG(Service_PCTL, "(STUBBED) called"); - - if (!CheckFreeCommunicationPermissionImpl()) { - R_THROW(PCTL::ResultNoFreeCommunication); - } else { - R_SUCCEED(); - } - } - - Result IsRestrictionEnabled(Out out_restriction_enabled) { - LOG_DEBUG(Service_PCTL, "called"); - - if (False(capability & (Capability::Status | Capability::Recovery))) { - LOG_ERROR(Service_PCTL, "Application does not have Status or Recovery capabilities!"); - *out_restriction_enabled = false; - R_THROW(PCTL::ResultNoCapability); - } - - *out_restriction_enabled = pin_code[0] != '\0'; - R_SUCCEED(); - } - - Result GetSafetyLevel(Out out_safety_level) { - *out_safety_level = 0; - LOG_WARNING(Service_PCTL, "(STUBBED) called, safety_level={}", *out_safety_level); - R_SUCCEED(); - } - - Result GetCurrentSettings(Out out_settings) { - LOG_INFO(Service_PCTL, "called"); - *out_settings = restriction_settings; - R_SUCCEED(); - } - - Result GetFreeCommunicationApplicationListCount(Out out_count) { - *out_count = 4; - LOG_WARNING(Service_PCTL, "(STUBBED) called, count={}", *out_count); - R_SUCCEED(); - } - - Result ConfirmStereoVisionRestrictionConfigurable() { - LOG_DEBUG(Service_PCTL, "called"); - - if (False(capability & Capability::StereoVision)) { - LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); - R_THROW(PCTL::ResultNoCapability); - } - - if (pin_code[0] == '\0') { - R_THROW(PCTL::ResultNoRestrictionEnabled); - } - - R_SUCCEED(); - } - - Result IsStereoVisionPermitted(Out out_is_permitted) { - LOG_DEBUG(Service_PCTL, "called"); - - if (!ConfirmStereoVisionPermissionImpl()) { - *out_is_permitted = false; - R_THROW(PCTL::ResultStereoVisionRestricted); - } else { - *out_is_permitted = true; - R_SUCCEED(); - } - } - - Result GetPinCodeLength(Out out_length) { - *out_length = 0; - LOG_WARNING(Service_PCTL, "(STUBBED) called, length={}", *out_length); - R_SUCCEED(); - } - - Result IsPairingActive(Out out_is_pairing_active) { - *out_is_pairing_active = false; - LOG_WARNING(Service_PCTL, "(STUBBED) called, is_pairing_active={}", *out_is_pairing_active); - R_SUCCEED(); - } - - Result GetSynchronizationEvent( - OutCopyHandle out_event) { - LOG_INFO(Service_PCTL, "called"); - *out_event = synchronization_event.GetHandle(); - R_SUCCEED(); - } - - Result StartPlayTimer() { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - R_SUCCEED(); - } - - Result StopPlayTimer() { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - R_SUCCEED(); - } - - Result IsPlayTimerEnabled(Out out_is_play_timer_enabled) { - *out_is_play_timer_enabled = false; - LOG_WARNING(Service_PCTL, "(STUBBED) called, enabled={}", *out_is_play_timer_enabled); - R_SUCCEED(); - } - - Result GetPlayTimerRemainingTime(Out out_remaining_time) { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - *out_remaining_time = std::numeric_limits::max(); - R_SUCCEED(); - } - - Result IsRestrictedByPlayTimer(Out out_is_restricted_by_play_timer) { - *out_is_restricted_by_play_timer = false; - LOG_WARNING(Service_PCTL, "(STUBBED) called, restricted={}", *out_is_restricted_by_play_timer); - R_SUCCEED(); - } - - Result GetPlayTimerSettingsOld( - Out out_play_timer_settings) { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - *out_play_timer_settings = {}; - R_SUCCEED(); - } - - Result GetPlayTimerSettings(Out out_play_timer_settings) { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - *out_play_timer_settings = raw_play_timer_settings; - R_SUCCEED(); - } - - Result SetPlayTimerSettings(PlayTimerSettings play_timer_settings) { - LOG_WARNING(Service_PCTL, "(STUBBED) called"); - raw_play_timer_settings = play_timer_settings; - R_SUCCEED(); - } - - Result GetPlayTimerEventToRequestSuspension( - OutCopyHandle out_event) { - LOG_INFO(Service_PCTL, "called"); - *out_event = request_suspension_event.GetHandle(); - R_SUCCEED(); - } - - Result IsPlayTimerAlarmDisabled(Out out_play_timer_alarm_disabled) { - *out_play_timer_alarm_disabled = false; - LOG_INFO(Service_PCTL, "called, is_play_timer_alarm_disabled={}", - *out_play_timer_alarm_disabled); - R_SUCCEED(); - } - - Result GetPlayTimerRemainingTimeDisplayInfo(Out out_display_info) { - LOG_DEBUG(Service_PCTL, "called"); - *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; - R_SUCCEED(); - } - - Result Unknown1460(u8 in_unk, Out out_display_info) { - LOG_DEBUG(Service_PCTL, "called, in_unk={}", in_unk); - *out_display_info = {.state = PlayTimerDisplayState::NotConfigured}; - R_SUCCEED(); - } - - Result GetUnlinkedEvent(OutCopyHandle out_event) { - LOG_INFO(Service_PCTL, "called"); - *out_event = unlinked_event.GetHandle(); - R_SUCCEED(); - } - - Result GetStereoVisionRestriction( - Out out_stereo_vision_restriction) { - LOG_DEBUG(Service_PCTL, "called"); - - if (False(capability & Capability::StereoVision)) { - LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); - *out_stereo_vision_restriction = false; - R_THROW(PCTL::ResultNoCapability); - } - - *out_stereo_vision_restriction = settings.is_stero_vision_restricted; - R_SUCCEED(); - } - - Result SetStereoVisionRestriction(bool stereo_vision_restriction) { - LOG_DEBUG(Service_PCTL, "called, can_use={}", stereo_vision_restriction); - - if (False(capability & Capability::StereoVision)) { - LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); - R_THROW(PCTL::ResultNoCapability); - } - - SetStereoVisionRestrictionImpl(stereo_vision_restriction); - R_SUCCEED(); - } - - Result ResetConfirmedStereoVisionPermission() { - LOG_DEBUG(Service_PCTL, "called"); - - states.stereo_vision = false; - - R_SUCCEED(); - } - - struct States { - u64 current_tid{}; - ApplicationInfo application_info{}; - u64 tid_from_event{}; - bool launch_time_valid{}; - bool is_suspended{}; - bool temporary_unlocked{}; - bool free_communication{}; - bool stereo_vision{}; - }; - - struct ParentalControlSettings { - bool is_stero_vision_restricted{}; - bool is_free_communication_default_on{}; - bool disabled{}; - }; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, D<&IParentalControlService::Initialize>, "Initialize"}, - FunctionInfo{1001, D<&IParentalControlService::CheckFreeCommunicationPermission>, "CheckFreeCommunicationPermission"}, - FunctionInfo{1002, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"}, - FunctionInfo{1003, D<&IParentalControlService::ConfirmResumeApplicationPermission>, "ConfirmResumeApplicationPermission"}, - FunctionInfo{1004, D<&IParentalControlService::ConfirmSnsPostPermission>, "ConfirmSnsPostPermission"}, - FunctionInfo{1005, D<&IParentalControlService::ConfirmSystemSettingsPermission>, "ConfirmSystemSettingsPermission"}, - FunctionInfo{1006, D<&IParentalControlService::IsRestrictionTemporaryUnlocked>, "IsRestrictionTemporaryUnlocked"}, - FunctionInfo{1007, nullptr, "RevertRestrictionTemporaryUnlocked"}, - FunctionInfo{1008, nullptr, "EnterRestrictedSystemSettings"}, - FunctionInfo{1009, nullptr, "LeaveRestrictedSystemSettings"}, - FunctionInfo{1010, D<&IParentalControlService::IsRestrictedSystemSettingsEntered>, "IsRestrictedSystemSettingsEntered"}, - FunctionInfo{1011, nullptr, "RevertRestrictedSystemSettingsEntered"}, - FunctionInfo{1012, nullptr, "GetRestrictedFeatures"}, - FunctionInfo{1013, D<&IParentalControlService::ConfirmStereoVisionPermission>, "ConfirmStereoVisionPermission"}, - FunctionInfo{1014, nullptr, "ConfirmPlayableApplicationVideoOld"}, - FunctionInfo{1015, nullptr, "ConfirmPlayableApplicationVideo"}, - FunctionInfo{1016, nullptr, "ConfirmShowNewsPermission"}, - FunctionInfo{1017, D<&IParentalControlService::EndFreeCommunication>, "EndFreeCommunication"}, - FunctionInfo{1018, D<&IParentalControlService::IsFreeCommunicationAvailable>, "IsFreeCommunicationAvailable"}, - FunctionInfo{1019, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"}, - FunctionInfo{1020, nullptr, "ConfirmLaunchSharedApplicationPermission", MakeVersionGate({20,0,0})}, - FunctionInfo{1021, nullptr, "TryBeginFreeCommunicationForStreamPlay", MakeVersionGate({21,0,0})}, - FunctionInfo{1022, nullptr, "EndFreeCommunicationForStreamPlay", MakeVersionGate({21,0,0})}, - FunctionInfo{1031, D<&IParentalControlService::IsRestrictionEnabled>, "IsRestrictionEnabled"}, - FunctionInfo{1032, D<&IParentalControlService::GetSafetyLevel>, "GetSafetyLevel"}, - FunctionInfo{1033, nullptr, "SetSafetyLevel"}, - FunctionInfo{1034, nullptr, "GetSafetyLevelSettings"}, - FunctionInfo{1035, D<&IParentalControlService::GetCurrentSettings>, "GetCurrentSettings"}, - FunctionInfo{1036, nullptr, "SetCustomSafetyLevelSettings"}, - FunctionInfo{1037, nullptr, "GetDefaultRatingOrganization"}, - FunctionInfo{1038, nullptr, "SetDefaultRatingOrganization"}, - FunctionInfo{1039, D<&IParentalControlService::GetFreeCommunicationApplicationListCount>, "GetFreeCommunicationApplicationListCount"}, - FunctionInfo{1042, nullptr, "AddToFreeCommunicationApplicationList"}, - FunctionInfo{1043, nullptr, "DeleteSettings"}, - FunctionInfo{1044, nullptr, "GetFreeCommunicationApplicationList"}, - FunctionInfo{1045, nullptr, "UpdateFreeCommunicationApplicationList"}, - FunctionInfo{1046, nullptr, "DisableFeaturesForReset"}, - FunctionInfo{1047, nullptr, "NotifyApplicationDownloadStarted"}, - FunctionInfo{1048, nullptr, "NotifyNetworkProfileCreated"}, - FunctionInfo{1049, nullptr, "ResetFreeCommunicationApplicationList"}, - FunctionInfo{1050, nullptr, "AddToFreeCommunicationApplicationList", MakeVersionGate({20,0,0})}, - FunctionInfo{1051, nullptr, "NotifyApplicationDownloadStarted", MakeVersionGate({20,0,0})}, - FunctionInfo{1061, D<&IParentalControlService::ConfirmStereoVisionRestrictionConfigurable>, "ConfirmStereoVisionRestrictionConfigurable"}, - FunctionInfo{1062, D<&IParentalControlService::GetStereoVisionRestriction>, "GetStereoVisionRestriction"}, - FunctionInfo{1063, D<&IParentalControlService::SetStereoVisionRestriction>, "SetStereoVisionRestriction"}, - FunctionInfo{1064, D<&IParentalControlService::ResetConfirmedStereoVisionPermission>, "ResetConfirmedStereoVisionPermission"}, - FunctionInfo{1065, D<&IParentalControlService::IsStereoVisionPermitted>, "IsStereoVisionPermitted"}, - FunctionInfo{1201, nullptr, "UnlockRestrictionTemporarily"}, - FunctionInfo{1202, nullptr, "UnlockSystemSettingsRestriction"}, - FunctionInfo{1203, nullptr, "SetPinCode"}, - FunctionInfo{1204, nullptr, "GenerateInquiryCode"}, - FunctionInfo{1205, nullptr, "CheckMasterKey"}, - FunctionInfo{1206, D<&IParentalControlService::GetPinCodeLength>, "GetPinCodeLength"}, - FunctionInfo{1207, nullptr, "GetPinCodeChangedEvent"}, - FunctionInfo{1208, nullptr, "GetPinCode"}, - FunctionInfo{1403, D<&IParentalControlService::IsPairingActive>, "IsPairingActive"}, - FunctionInfo{1406, nullptr, "GetSettingsLastUpdated"}, - FunctionInfo{1411, nullptr, "GetPairingAccountInfo"}, - FunctionInfo{1421, nullptr, "GetAccountNickname"}, - FunctionInfo{1424, nullptr, "GetAccountState"}, - FunctionInfo{1425, nullptr, "RequestPostEvents"}, - FunctionInfo{1426, nullptr, "GetPostEventInterval"}, - FunctionInfo{1427, nullptr, "SetPostEventInterval"}, - FunctionInfo{1432, D<&IParentalControlService::GetSynchronizationEvent>, "GetSynchronizationEvent"}, - FunctionInfo{1451, D<&IParentalControlService::StartPlayTimer>, "StartPlayTimer"}, - FunctionInfo{1452, D<&IParentalControlService::StopPlayTimer>, "StopPlayTimer"}, - FunctionInfo{1453, D<&IParentalControlService::IsPlayTimerEnabled>, "IsPlayTimerEnabled"}, - FunctionInfo{1454, D<&IParentalControlService::GetPlayTimerRemainingTime>, "GetPlayTimerRemainingTime"}, - FunctionInfo{1455, D<&IParentalControlService::IsRestrictedByPlayTimer>, "IsRestrictedByPlayTimer"}, - FunctionInfo{1456, D<&IParentalControlService::GetPlayTimerSettingsOld>, "GetPlayTimerSettingsOld"}, - FunctionInfo{1457, D<&IParentalControlService::GetPlayTimerEventToRequestSuspension>, "GetPlayTimerEventToRequestSuspension"}, - FunctionInfo{1458, D<&IParentalControlService::IsPlayTimerAlarmDisabled>, "IsPlayTimerAlarmDisabled"}, - FunctionInfo{1459, D<&IParentalControlService::GetPlayTimerRemainingTimeDisplayInfo>, "GetPlayTimerRemainingTimeDisplayInfo"}, - FunctionInfo{1460, D<&IParentalControlService::Unknown1460>, "Unknown1460"}, - FunctionInfo{1471, nullptr, "NotifyWrongPinCodeInputManyTimes"}, - FunctionInfo{1472, nullptr, "CancelNetworkRequest"}, - FunctionInfo{1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"}, - FunctionInfo{1474, nullptr, "ClearUnlinkedEvent"}, - FunctionInfo{1475, nullptr, "GetExtendedPlayTimerEvent", MakeVersionGate({18,0,0})}, - FunctionInfo{1601, nullptr, "DisableAllFeatures"}, - FunctionInfo{1602, nullptr, "PostEnableAllFeatures"}, - FunctionInfo{1603, nullptr, "IsAllFeaturesDisabled"}, - FunctionInfo{1901, nullptr, "DeleteFromFreeCommunicationApplicationListForDebug"}, - FunctionInfo{1902, nullptr, "ClearFreeCommunicationApplicationListForDebug"}, - FunctionInfo{1903, nullptr, "GetExemptApplicationListCountForDebug"}, - FunctionInfo{1904, nullptr, "GetExemptApplicationListForDebug"}, - FunctionInfo{1905, nullptr, "UpdateExemptApplicationListForDebug"}, - FunctionInfo{1906, nullptr, "AddToExemptApplicationListForDebug"}, - FunctionInfo{1907, nullptr, "DeleteFromExemptApplicationListForDebug"}, - FunctionInfo{1908, nullptr, "ClearExemptApplicationListForDebug"}, - FunctionInfo{1941, nullptr, "DeletePairing"}, - FunctionInfo{1951, nullptr, "SetPlayTimerSettingsForDebug"}, - FunctionInfo{1952, nullptr, "GetPlayTimerSpentTimeForTest"}, - FunctionInfo{1953, nullptr, "SetPlayTimerAlarmDisabledForDebug"}, - FunctionInfo{1954, nullptr, "IsBedtimeAlarmEnabled", MakeVersionGate({18,0,0})}, - FunctionInfo{1955, nullptr, "GetBedtimeAlarmTime", MakeVersionGate({18,0,0})}, - FunctionInfo{1956, nullptr, "GetBedtimeAlarmTimeHour", MakeVersionGate({18,0,0})}, - FunctionInfo{1957, nullptr, "GetBedtimeAlarmTimeMinute", MakeVersionGate({18,0,0})}, - FunctionInfo{2001, nullptr, "RequestPairingAsync"}, - FunctionInfo{2002, nullptr, "FinishRequestPairing"}, - FunctionInfo{2003, nullptr, "AuthorizePairingAsync"}, - FunctionInfo{2004, nullptr, "FinishAuthorizePairing"}, - FunctionInfo{2005, nullptr, "RetrievePairingInfoAsync"}, - FunctionInfo{2006, nullptr, "FinishRetrievePairingInfo"}, - FunctionInfo{2007, nullptr, "UnlinkPairingAsync"}, - FunctionInfo{2008, nullptr, "FinishUnlinkPairing"}, - FunctionInfo{2009, nullptr, "GetAccountMiiImageAsync"}, - FunctionInfo{2010, nullptr, "FinishGetAccountMiiImage"}, - FunctionInfo{2011, nullptr, "GetAccountMiiImageContentTypeAsync"}, - FunctionInfo{2012, nullptr, "FinishGetAccountMiiImageContentType"}, - FunctionInfo{2013, nullptr, "SynchronizeParentalControlSettingsAsync"}, - FunctionInfo{2014, nullptr, "FinishSynchronizeParentalControlSettings"}, - FunctionInfo{2015, nullptr, "FinishSynchronizeParentalControlSettingsWithLastUpdated"}, - FunctionInfo{2016, nullptr, "RequestUpdateExemptionListAsync", MakeVersionGate({5,0,0})}, - FunctionInfo{145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings", MakeVersionGate({18,0,0})}, - FunctionInfo{2017, nullptr, "AuthorizePairingAsync", MakeVersionGate({19,0,0})}, - FunctionInfo{2019, nullptr, "RequestUpdateDeviceUsersBackground", MakeVersionGate({19,0,0})}, - FunctionInfo{2021, nullptr, "RequestCopyPairingAsync", MakeVersionGate({20,0,0})}, - FunctionInfo{2022, nullptr, "FinishRequestCopyPairing", MakeVersionGate({20,0,0})}, - FunctionInfo{2023, nullptr, "IsFromPairingActiveDevice", MakeVersionGate({20,0,0})}, - FunctionInfo{2024, nullptr, "RollbackCopyPairing", MakeVersionGate({21,0,0})}, - FunctionInfo{3001, nullptr, "GetErrorContextChangedEvent", MakeVersionGate({20,0,0})}, - FunctionInfo{145601, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings", MakeVersionGate({18,0,0})}, - FunctionInfo{195101, D<&IParentalControlService::SetPlayTimerSettings>, "SetPlayTimerSettingsForDebug", MakeVersionGate({18,0,0})} - ); - States states{}; - ParentalControlSettings settings{}; - RestrictionSettings restriction_settings{}; - std::array pin_code{}; - Capability capability{}; - u64 program_id{}; - // TODO: this is raw - PlayTimerSettings raw_play_timer_settings{}; - - KernelHelpers::ServiceContext service_context; - Event synchronization_event; - Event unlinked_event; - Event request_suspension_event; -}; - -class IParentalControlServiceFactory : public ServiceFramework { -public: - explicit IParentalControlServiceFactory(Core::System& system_, const char* name_, Capability capability_) - : ServiceFramework{system_, name_}, capability{capability_} - {} - - ~IParentalControlServiceFactory() override = default; - - Result CreateService(Out> out_service, ClientProcessId process_id) { - LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid); - *out_service = std::make_shared( - system, capability, system.ResolveCallerProgramId(*process_id)); - R_SUCCEED(); - } - - Result CreateServiceWithoutInitialize(Out> out_service, ClientProcessId process_id) { - LOG_DEBUG(Service_PCTL, "called, process_id={}", process_id.pid); - *out_service = std::make_shared( - system, capability, system.ResolveCallerProgramId(*process_id)); - R_SUCCEED(); - } - -private: - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IParentalControlServiceFactory::CreateService>, "CreateService"}, - FunctionInfo{1, D<&IParentalControlServiceFactory::CreateServiceWithoutInitialize>, "CreateServiceWithoutInitialize"} - ); - Capability capability{}; -}; - void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("pctl", std::make_shared(system, "pctl", Capability::Application | Capability::SnsPost | Capability::Status | Capability::StereoVision)); + server_manager->RegisterNamedService("pctl", + std::make_shared( + system, "pctl", + Capability::Application | Capability::SnsPost | + Capability::Status | Capability::StereoVision)); // TODO(ogniK): Implement remaining capabilities - server_manager->RegisterNamedService("pctl:a", std::make_shared(system, "pctl:a", Capability::None)); - server_manager->RegisterNamedService("pctl:r", std::make_shared(system, "pctl:r", Capability::None)); - server_manager->RegisterNamedService("pctl:s", std::make_shared(system, "pctl:s", Capability::None)); + server_manager->RegisterNamedService("pctl:a", std::make_shared( + system, "pctl:a", Capability::None)); + server_manager->RegisterNamedService("pctl:r", std::make_shared( + system, "pctl:r", Capability::None)); + server_manager->RegisterNamedService("pctl:s", std::make_shared( + system, "pctl:s", Capability::None)); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/pctl/pctl.h b/src/core/hle/service/pctl/pctl.h index 5f9d03d4df..020866aa3d 100644 --- a/src/core/hle/service/pctl/pctl.h +++ b/src/core/hle/service/pctl/pctl.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/pctl/pctl_results.h b/src/core/hle/service/pctl/pctl_results.h new file mode 100644 index 0000000000..0aa4714a9c --- /dev/null +++ b/src/core/hle/service/pctl/pctl_results.h @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/result.h" + +namespace Service::PCTL { + +constexpr Result ResultNoFreeCommunication{ErrorModule::PCTL, 101}; +constexpr Result ResultStereoVisionRestricted{ErrorModule::PCTL, 104}; +constexpr Result ResultNoCapability{ErrorModule::PCTL, 131}; +constexpr Result ResultNoRestrictionEnabled{ErrorModule::PCTL, 181}; + +} // namespace Service::PCTL diff --git a/src/core/hle/service/pctl/pctl_types.h b/src/core/hle/service/pctl/pctl_types.h new file mode 100644 index 0000000000..3a5a19099d --- /dev/null +++ b/src/core/hle/service/pctl/pctl_types.h @@ -0,0 +1,73 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "common/common_funcs.h" + +namespace Service::PCTL { + +enum class Capability : u32 { + None = 0, + Application = 1 << 0, + SnsPost = 1 << 1, + Recovery = 1 << 6, + Status = 1 << 8, + StereoVision = 1 << 9, + System = 1 << 15, +}; +DECLARE_ENUM_FLAG_OPERATORS(Capability); + +struct ApplicationInfo { + u64 application_id{}; + std::array age_rating{}; + u32 parental_control_flag{}; + Capability capability{}; +}; +static_assert(sizeof(ApplicationInfo) == 0x30, "ApplicationInfo has incorrect size."); + +// This is nn::pctl::RestrictionSettings +struct RestrictionSettings { + u8 rating_age; + bool sns_post_restriction; + bool free_communication_restriction; +}; +static_assert(sizeof(RestrictionSettings) == 0x3, "RestrictionSettings has incorrect size."); + +// This is nn::pctl::PlayTimerSettingsOld +struct PlayTimerSettingsOld { + std::array settings; +}; +static_assert(sizeof(PlayTimerSettingsOld) == 0x34, "PlayTimerSettingsOld has incorrect size."); + +// This is nn::pctl::PlayTimerSettings +struct PlayTimerSettings { + std::array settings; //21.0.0+ now takes 0x44 +}; +static_assert(sizeof(PlayTimerSettings) == 0x44, "PlayTimerSettings has incorrect size."); + +enum class PlayTimerDisplayState : u8 { + TimesUp = 0, + BedtimeAlarm = 1, + RemainingTime = 2, + Unknown3 = 3, + Unknown4 = 4, + Unknown5 = 5, + TimerDisabled = 6, + NotConfigured = 7, +}; + +// This is nn::pctl::PlayTimerRemainingTimeDisplayInfo +struct PlayTimerRemainingTimeDisplayInfo { + PlayTimerDisplayState state; + INSERT_PADDING_BYTES(0x7); + u64 unknown_08; + u64 remaining_time; +}; +static_assert(sizeof(PlayTimerRemainingTimeDisplayInfo) == 0x18, + "PlayTimerRemainingTimeDisplayInfo has incorrect size."); + +} // namespace Service::PCTL diff --git a/src/core/hle/service/pcv/pcv.cpp b/src/core/hle/service/pcv/pcv.cpp index bb3d748527..1b314f3518 100644 --- a/src/core/hle/service/pcv/pcv.cpp +++ b/src/core/hle/service/pcv/pcv.cpp @@ -15,76 +15,91 @@ namespace Service::PCV { class PCV final : public ServiceFramework { public: - explicit PCV(Core::System& system_) : ServiceFramework{system_, "pcv"} {} + explicit PCV(Core::System& system_) : ServiceFramework{system_, "pcv"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "SetPowerEnabled"}, + {1, nullptr, "SetClockEnabled"}, + {2, nullptr, "SetClockRate"}, + {3, nullptr, "GetClockRate"}, + {4, nullptr, "GetState"}, + {5, nullptr, "GetPossibleClockRates"}, + {6, nullptr, "SetMinVClockRate"}, + {7, nullptr, "SetReset"}, + {8, nullptr, "SetVoltageEnabled"}, + {9, nullptr, "GetVoltageEnabled"}, + {10, nullptr, "GetVoltageRange"}, + {11, nullptr, "SetVoltageValue"}, + {12, nullptr, "GetVoltageValue"}, + {13, nullptr, "GetTemperatureThresholds"}, + {14, nullptr, "SetTemperature"}, + {15, nullptr, "Initialize"}, + {16, nullptr, "IsInitialized"}, + {17, nullptr, "Finalize"}, + {18, nullptr, "PowerOn"}, + {19, nullptr, "PowerOff"}, + {20, nullptr, "ChangeVoltage"}, + {21, nullptr, "GetPowerClockInfoEvent"}, + {22, nullptr, "GetOscillatorClock"}, + {23, nullptr, "GetDvfsTable"}, + {24, nullptr, "GetModuleStateTable"}, + {25, nullptr, "GetPowerDomainStateTable"}, + {26, nullptr, "GetFuseInfo"}, + {27, nullptr, "GetDramId"}, + {28, nullptr, "IsPoweredOn"}, + {29, nullptr, "GetVoltage"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SetPowerEnabled"}, - FunctionInfo{1, nullptr, "SetClockEnabled"}, - FunctionInfo{2, nullptr, "SetClockRate"}, - FunctionInfo{3, nullptr, "GetClockRate"}, - FunctionInfo{4, nullptr, "GetState"}, - FunctionInfo{5, nullptr, "GetPossibleClockRates"}, - FunctionInfo{6, nullptr, "SetMinVClockRate"}, - FunctionInfo{7, nullptr, "SetReset"}, - FunctionInfo{8, nullptr, "SetVoltageEnabled"}, - FunctionInfo{9, nullptr, "GetVoltageEnabled"}, - FunctionInfo{10, nullptr, "GetVoltageRange"}, - FunctionInfo{11, nullptr, "SetVoltageValue"}, - FunctionInfo{12, nullptr, "GetVoltageValue"}, - FunctionInfo{13, nullptr, "GetTemperatureThresholds"}, - FunctionInfo{14, nullptr, "SetTemperature"}, - FunctionInfo{15, nullptr, "Initialize"}, - FunctionInfo{16, nullptr, "IsInitialized"}, - FunctionInfo{17, nullptr, "Finalize"}, - FunctionInfo{18, nullptr, "PowerOn"}, - FunctionInfo{19, nullptr, "PowerOff"}, - FunctionInfo{20, nullptr, "ChangeVoltage"}, - FunctionInfo{21, nullptr, "GetPowerClockInfoEvent"}, - FunctionInfo{22, nullptr, "GetOscillatorClock"}, - FunctionInfo{23, nullptr, "GetDvfsTable"}, - FunctionInfo{24, nullptr, "GetModuleStateTable"}, - FunctionInfo{25, nullptr, "GetPowerDomainStateTable"}, - FunctionInfo{26, nullptr, "GetFuseInfo"}, - FunctionInfo{27, nullptr, "GetDramId"}, - FunctionInfo{28, nullptr, "IsPoweredOn"}, - FunctionInfo{29, nullptr, "GetVoltage"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class PCV_ARB final : public ServiceFramework { public: - explicit PCV_ARB(Core::System& system_) : ServiceFramework{system_, "pcv:arb"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "ReleaseControl"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit PCV_ARB(Core::System& system_) : ServiceFramework{system_, "pcv:arb"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "ReleaseControl"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class PCV_IMM final : public ServiceFramework { public: - explicit PCV_IMM(Core::System& system_) : ServiceFramework{system_, "pcv:imm"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SetClockRate"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit PCV_IMM(Core::System& system_) : ServiceFramework{system_, "pcv:imm"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "SetClockRate"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IClkrstSession final : public ServiceFramework { public: explicit IClkrstSession(Core::System& system_, DeviceCode device_code_) - : ServiceFramework{system_, "IClkrstSession"}, device_code(device_code_) {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "IClkrstSession"}, device_code(device_code_) { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "SetClockEnabled"}, + {1, nullptr, "SetClockDisabled"}, + {2, nullptr, "SetResetAsserted"}, + {3, nullptr, "SetResetDeasserted"}, + {4, nullptr, "SetPowerEnabled"}, + {5, nullptr, "SetPowerDisabled"}, + {6, nullptr, "GetState"}, + {7, &IClkrstSession::SetClockRate, "SetClockRate"}, + {8, &IClkrstSession::GetClockRate, "GetClockRate"}, + {9, nullptr, "SetMinVClockRate"}, + {10, nullptr, "GetPossibleClockRates"}, + {11, nullptr, "GetDvfsTable"}, + }; + // clang-format on + RegisterHandlers(functions); } private: @@ -105,30 +120,25 @@ private: rb.Push(clock_rate); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SetClockEnabled"}, - FunctionInfo{1, nullptr, "SetClockDisabled"}, - FunctionInfo{2, nullptr, "SetResetAsserted"}, - FunctionInfo{3, nullptr, "SetResetDeasserted"}, - FunctionInfo{4, nullptr, "SetPowerEnabled"}, - FunctionInfo{5, nullptr, "SetPowerDisabled"}, - FunctionInfo{6, nullptr, "GetState"}, - FunctionInfo{7, &IClkrstSession::SetClockRate, "SetClockRate"}, - FunctionInfo{8, &IClkrstSession::GetClockRate, "GetClockRate"}, - FunctionInfo{9, nullptr, "SetMinVClockRate"}, - FunctionInfo{10, nullptr, "GetPossibleClockRates"}, - FunctionInfo{11, nullptr, "GetDvfsTable"} - ); DeviceCode device_code; u32 clock_rate{}; }; class CLKRST final : public ServiceFramework { public: - explicit CLKRST(Core::System& system_, const char* name) : ServiceFramework{system_, name} {} + explicit CLKRST(Core::System& system_, const char* name) : ServiceFramework{system_, name} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &CLKRST::OpenSession, "OpenSession"}, + {1, nullptr, "GetTemperatureThresholds"}, + {2, nullptr, "SetTemperature"}, + {3, nullptr, "GetModuleStateTable"}, + {4, nullptr, "GetModuleStateTableEvent"}, + {5, nullptr, "GetModuleStateTableMaxCount"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -143,26 +153,18 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system, device_code); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &CLKRST::OpenSession, "OpenSession"}, - FunctionInfo{1, nullptr, "GetTemperatureThresholds"}, - FunctionInfo{2, nullptr, "SetTemperature"}, - FunctionInfo{3, nullptr, "GetModuleStateTable"}, - FunctionInfo{4, nullptr, "GetModuleStateTableEvent"}, - FunctionInfo{5, nullptr, "GetModuleStateTableMaxCount"} - ); }; class CLKRST_A final : public ServiceFramework { public: - explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} {} + explicit CLKRST_A(Core::System& system_) : ServiceFramework{system_, "clkrst:a"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "ReleaseControl"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "ReleaseControl"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/pcv/pcv.h b/src/core/hle/service/pcv/pcv.h index bf541e6feb..27eb179ff4 100644 --- a/src/core/hle/service/pcv/pcv.h +++ b/src/core/hle/service/pcv/pcv.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/pm/pm.cpp b/src/core/hle/service/pm/pm.cpp index 3d431c305f..ff7053b690 100644 --- a/src/core/hle/service/pm/pm.cpp +++ b/src/core/hle/service/pm/pm.cpp @@ -47,7 +47,13 @@ void GetApplicationPidGeneric(Kernel::KernelCore& kernel, HLERequestContext& ctx class BootMode final : public ServiceFramework { public: - explicit BootMode(Core::System& system_) : ServiceFramework{system_, "pm:bm"} {} + explicit BootMode(Core::System& system_) : ServiceFramework{system_, "pm:bm"} { + static const FunctionInfo functions[] = { + {0, &BootMode::GetBootMode, "GetBootMode"}, + {1, &BootMode::SetMaintenanceBoot, "SetMaintenanceBoot"}, + }; + RegisterHandlers(functions); + } private: void GetBootMode(HLERequestContext& ctx) { @@ -67,19 +73,28 @@ private: rb.Push(ResultSuccess); } - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &BootMode::GetBootMode, "GetBootMode"}, - FunctionInfo{1, &BootMode::SetMaintenanceBoot, "SetMaintenanceBoot"} - ); SystemBootMode boot_mode = SystemBootMode::Normal; }; class DebugMonitor final : public ServiceFramework { public: - explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "pm:dmnt"} {} + explicit DebugMonitor(Core::System& system_) : ServiceFramework{system_, "pm:dmnt"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetJitDebugProcessIdList"}, + {1, nullptr, "StartProcess"}, + {2, &DebugMonitor::GetProcessId, "GetProcessId"}, + {3, nullptr, "HookToCreateProcess"}, + {4, &DebugMonitor::GetApplicationProcessId, "GetApplicationProcessId"}, + {5, nullptr, "HookToCreateApplicationProgress"}, + {6, nullptr, "ClearHook"}, + {65000, &DebugMonitor::AtmosphereGetProcessInfo, "AtmosphereGetProcessInfo"}, + {65001, nullptr, "AtmosphereGetCurrentLimitInfo"}, + }; + // clang-format on + + RegisterHandlers(functions); + } private: void GetProcessId(HLERequestContext& ctx) { @@ -149,26 +164,19 @@ private: rb.PushRaw(program_location); rb.PushRaw(override_status); } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetJitDebugProcessIdList"}, - FunctionInfo{1, nullptr, "StartProcess"}, - FunctionInfo{2, &DebugMonitor::GetProcessId, "GetProcessId"}, - FunctionInfo{3, nullptr, "HookToCreateProcess"}, - FunctionInfo{4, &DebugMonitor::GetApplicationProcessId, "GetApplicationProcessId"}, - FunctionInfo{5, nullptr, "HookToCreateApplicationProgress"}, - FunctionInfo{6, nullptr, "ClearHook"}, - FunctionInfo{65000, &DebugMonitor::AtmosphereGetProcessInfo, "AtmosphereGetProcessInfo"}, - FunctionInfo{65001, nullptr, "AtmosphereGetCurrentLimitInfo"} - ); }; class Info final : public ServiceFramework { public: - explicit Info(Core::System& system_) : ServiceFramework{system_, "pm:info"} {} + explicit Info(Core::System& system_) : ServiceFramework{system_, "pm:info"} { + static const FunctionInfo functions[] = { + {0, &Info::GetProgramId, "GetProgramId"}, + {65000, &Info::AtmosphereGetProcessId, "AtmosphereGetProcessId"}, + {65001, nullptr, "AtmosphereHasLaunchedProgram"}, + {65002, nullptr, "AtmosphereGetProcessInfo"}, + }; + RegisterHandlers(functions); + } private: void GetProgramId(HLERequestContext& ctx) { @@ -210,24 +218,27 @@ private: rb.Push(ResultSuccess); rb.Push(process->GetProcessId()); } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &Info::GetProgramId, "GetProgramId"}, - FunctionInfo{65000, &Info::AtmosphereGetProcessId, "AtmosphereGetProcessId"}, - FunctionInfo{65001, nullptr, "AtmosphereHasLaunchedProgram"}, - FunctionInfo{65002, nullptr, "AtmosphereGetProcessInfo"} - ); }; class Shell final : public ServiceFramework { public: - explicit Shell(Core::System& system_) : ServiceFramework{system_, "pm:shell"} {} + explicit Shell(Core::System& system_) : ServiceFramework{system_, "pm:shell"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "LaunchProgram"}, + {1, nullptr, "TerminateProcess"}, + {2, nullptr, "TerminateProgram"}, + {3, nullptr, "GetProcessEventHandle"}, + {4, nullptr, "GetProcessEventInfo"}, + {5, nullptr, "NotifyBootFinished"}, + {6, &Shell::GetApplicationProcessIdForShell, "GetApplicationProcessIdForShell"}, + {7, nullptr, "BoostSystemMemoryResourceLimit"}, + {8, nullptr, "BoostApplicationThreadResourceLimit"}, + {9, nullptr, "GetBootFinishedEventHandle"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -236,19 +247,6 @@ private: auto list = kernel.GetProcessList(); GetApplicationPidGeneric(system.Kernel(), ctx, list); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "LaunchProgram"}, - FunctionInfo{1, nullptr, "TerminateProcess"}, - FunctionInfo{2, nullptr, "TerminateProgram"}, - FunctionInfo{3, nullptr, "GetProcessEventHandle"}, - FunctionInfo{4, nullptr, "GetProcessEventInfo"}, - FunctionInfo{5, nullptr, "NotifyBootFinished"}, - FunctionInfo{6, &Shell::GetApplicationProcessIdForShell, "GetApplicationProcessIdForShell"}, - FunctionInfo{7, nullptr, "BoostSystemMemoryResourceLimit"}, - FunctionInfo{8, nullptr, "BoostApplicationThreadResourceLimit"}, - FunctionInfo{9, nullptr, "GetBootFinishedEventHandle"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/pm/pm.h b/src/core/hle/service/pm/pm.h index 5d4a1a171c..da70cfc6b8 100644 --- a/src/core/hle/service/pm/pm.h +++ b/src/core/hle/service/pm/pm.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp index a199c41d2c..e76c3ea93c 100644 --- a/src/core/hle/service/prepo/prepo.cpp +++ b/src/core/hle/service/prepo/prepo.cpp @@ -21,10 +21,45 @@ namespace Service::PlayReport { class PlayReport final : public ServiceFramework { public: - explicit PlayReport(const char* name, Core::System& system_) : ServiceFramework{system_, name} {} + explicit PlayReport(const char* name, Core::System& system_) : ServiceFramework{system_, name} { + // clang-format off + static const FunctionInfo functions[] = { + {10100, &PlayReport::SaveReport, "SaveReportOld"}, + {10101, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld"}, + {10102, &PlayReport::SaveReport, "SaveReportOld2"}, + {10103, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld2"}, + {10104, &PlayReport::SaveReport, "SaveReportOld3"}, + {10105, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld3"}, + {10106, &PlayReport::SaveReport, "SaveReport"}, + {10107, &PlayReport::SaveReportWithUser, "SaveReportWithUser"}, + {10200, &PlayReport::RequestImmediateTransmission, "RequestImmediateTransmission"}, + {10300, &PlayReport::GetTransmissionStatus, "GetTransmissionStatus"}, + {10400, &PlayReport::GetSystemSessionId, "GetSystemSessionId"}, + {20100, &PlayReport::SaveSystemReportOld, "SaveSystemReport"}, + {20101, &PlayReport::SaveSystemReportWithUserOld, "SaveSystemReportWithUser"}, + {20102, &PlayReport::SaveSystemReport, "SaveSystemReport"}, + {20103, &PlayReport::SaveSystemReportWithUser, "SaveSystemReportWithUser"}, + {20200, nullptr, "SetOperationMode"}, + {30100, nullptr, "ClearStorage"}, + {30200, nullptr, "ClearStatistics"}, + {30300, nullptr, "GetStorageUsage"}, + {30400, nullptr, "GetStatistics"}, + {30401, nullptr, "GetThroughputHistory"}, + {30500, nullptr, "GetLastUploadError"}, + {30600, nullptr, "GetApplicationUploadSummary"}, + {40100, nullptr, "IsUserAgreementCheckEnabled"}, + {40101, nullptr, "SetUserAgreementCheckEnabled"}, + {50100, nullptr, "ReadAllApplicationReportFiles"}, + {90100, nullptr, "ReadAllReportFiles"}, + {90101, nullptr, "Unknown90101"}, + {90102, nullptr, "Unknown90102"}, + {90200, nullptr, "GetStatistics"}, + {90201, nullptr, "GetThroughputHistory"}, + {90300, nullptr, "GetLastUploadError"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -179,51 +214,21 @@ private: IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{10100, &PlayReport::SaveReport, "SaveReportOld"}, - FunctionInfo{10101, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld"}, - FunctionInfo{10102, &PlayReport::SaveReport, "SaveReportOld2"}, - FunctionInfo{10103, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld2"}, - FunctionInfo{10104, &PlayReport::SaveReport, "SaveReportOld3"}, - FunctionInfo{10105, &PlayReport::SaveReportWithUser, "SaveReportWithUserOld3"}, - FunctionInfo{10106, &PlayReport::SaveReport, "SaveReport"}, - FunctionInfo{10107, &PlayReport::SaveReportWithUser, "SaveReportWithUser"}, - FunctionInfo{10200, &PlayReport::RequestImmediateTransmission, "RequestImmediateTransmission"}, - FunctionInfo{10300, &PlayReport::GetTransmissionStatus, "GetTransmissionStatus"}, - FunctionInfo{10400, &PlayReport::GetSystemSessionId, "GetSystemSessionId"}, - FunctionInfo{20100, &PlayReport::SaveSystemReportOld, "SaveSystemReport"}, - FunctionInfo{20101, &PlayReport::SaveSystemReportWithUserOld, "SaveSystemReportWithUser"}, - FunctionInfo{20102, &PlayReport::SaveSystemReport, "SaveSystemReport"}, - FunctionInfo{20103, &PlayReport::SaveSystemReportWithUser, "SaveSystemReportWithUser"}, - FunctionInfo{20200, nullptr, "SetOperationMode"}, - FunctionInfo{30100, nullptr, "ClearStorage"}, - FunctionInfo{30200, nullptr, "ClearStatistics"}, - FunctionInfo{30300, nullptr, "GetStorageUsage"}, - FunctionInfo{30400, nullptr, "GetStatistics"}, - FunctionInfo{30401, nullptr, "GetThroughputHistory"}, - FunctionInfo{30500, nullptr, "GetLastUploadError"}, - FunctionInfo{30600, nullptr, "GetApplicationUploadSummary"}, - FunctionInfo{40100, nullptr, "IsUserAgreementCheckEnabled"}, - FunctionInfo{40101, nullptr, "SetUserAgreementCheckEnabled"}, - FunctionInfo{50100, nullptr, "ReadAllApplicationReportFiles"}, - FunctionInfo{90100, nullptr, "ReadAllReportFiles"}, - FunctionInfo{90101, nullptr, "Unknown90101"}, - FunctionInfo{90102, nullptr, "Unknown90102"}, - FunctionInfo{90200, nullptr, "GetStatistics"}, - FunctionInfo{90201, nullptr, "GetThroughputHistory"}, - FunctionInfo{90300, nullptr, "GetLastUploadError"} - ); }; void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("prepo:a", std::make_shared("prepo:a", system)); - server_manager->RegisterNamedService("prepo:a2", std::make_shared("prepo:a2", system)); - server_manager->RegisterNamedService("prepo:m", std::make_shared("prepo:m", system)); - server_manager->RegisterNamedService("prepo:s", std::make_shared("prepo:s", system)); - server_manager->RegisterNamedService("prepo:u", std::make_shared("prepo:u", system)); + server_manager->RegisterNamedService("prepo:a", + std::make_shared("prepo:a", system)); + server_manager->RegisterNamedService("prepo:a2", + std::make_shared("prepo:a2", system)); + server_manager->RegisterNamedService("prepo:m", + std::make_shared("prepo:m", system)); + server_manager->RegisterNamedService("prepo:s", + std::make_shared("prepo:s", system)); + server_manager->RegisterNamedService("prepo:u", + std::make_shared("prepo:u", system)); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/hle/service/prepo/prepo.h b/src/core/hle/service/prepo/prepo.h index 2c2462f936..4caf752888 100644 --- a/src/core/hle/service/prepo/prepo.h +++ b/src/core/hle/service/prepo/prepo.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/psc/ovln/ovln_types.h b/src/core/hle/service/psc/ovln/ovln_types.h index f96b52fb49..d827f039fe 100644 --- a/src/core/hle/service/psc/ovln/ovln_types.h +++ b/src/core/hle/service/psc/ovln/ovln_types.h @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/core/hle/service/psc/ovln/receiver.cpp b/src/core/hle/service/psc/ovln/receiver.cpp new file mode 100644 index 0000000000..f43d705126 --- /dev/null +++ b/src/core/hle/service/psc/ovln/receiver.cpp @@ -0,0 +1,118 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/psc/ovln/receiver.h" +#include "core/hle/service/cmif_serialization.h" + +namespace Service::PSC { + +IReceiver::IReceiver(Core::System& system_) + : ServiceFramework{system_, "IReceiver"}, service_context{system_, "IReceiver"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IReceiver::AddSource>, "AddSource"}, + {1, D<&IReceiver::RemoveSource>, "RemoveSource"}, + {2, D<&IReceiver::GetReceiveEventHandle>, "GetReceiveEventHandle"}, + {3, D<&IReceiver::Receive>, "Receive"}, + {4, D<&IReceiver::ReceiveWithTick>, "ReceiveWithTick"}, + }; + // clang-format on + + RegisterHandlers(functions); + + receive_event = service_context.CreateEvent("IReceiver::ReceiveEvent"); +} + +IReceiver::~IReceiver() { + service_context.CloseEvent(receive_event); +} + +Result IReceiver::AddSource(SourceName source_name) { + const std::string name = source_name.GetString(); + LOG_INFO(Service_PSC, "called: source_name={}", name); + + // Add source if it doesn't already exist + if (message_sources.find(name) == message_sources.end()) { + message_sources[name] = {}; + } + + R_SUCCEED(); +} + +Result IReceiver::RemoveSource(SourceName source_name) { + const std::string name = source_name.GetString(); + LOG_INFO(Service_PSC, "called: source_name={}", name); + + // Remove source if it exists + message_sources.erase(name); + + R_SUCCEED(); +} + +Result IReceiver::GetReceiveEventHandle(OutCopyHandle out_event) { + LOG_INFO(Service_PSC, "called"); + *out_event = &receive_event->GetReadableEvent(); + R_SUCCEED(); +} + +Result IReceiver::Receive(Out out_notification, Out out_flags) { + u64 tick; + return ReceiveWithTick(out_notification, out_flags, Out(&tick)); +} + +Result IReceiver::ReceiveWithTick(Out out_notification, + Out out_flags, Out out_tick) { + LOG_DEBUG(Service_PSC, "called"); + + // Find the message with the lowest ID across all sources + const std::string* target_source = nullptr; + size_t target_index = 0; + + for (const auto& [source_name, messages] : message_sources) { + if (!messages.empty()) { + if (target_source == nullptr) { + target_source = &source_name; + target_index = 0; + } + // Note: In the real implementation, we would track message IDs + // For now, just use FIFO order + } + } + + if (target_source != nullptr) { + auto& messages = message_sources[*target_source]; + *out_notification = messages[target_index].first; + *out_flags = messages[target_index].second; + *out_tick = 0; // TODO: Implement tick tracking + + // Remove the message + messages.erase(messages.begin() + target_index); + + // Clear event if no more messages + bool has_messages = false; + for (const auto& [_, msgs] : message_sources) { + if (!msgs.empty()) { + has_messages = true; + break; + } + } + if (!has_messages) { + receive_event->Clear(system.Kernel()); + } + + R_SUCCEED(); + } + + // No messages available + *out_notification = {}; + *out_flags = {}; + *out_tick = 0; + + LOG_WARNING(Service_PSC, "No messages available"); + R_THROW(ResultUnknown); // TODO: Use proper OvlnResult::NoMessages when available +} + +} // namespace Service::PSC diff --git a/src/core/hle/service/psc/ovln/receiver.h b/src/core/hle/service/psc/ovln/receiver.h new file mode 100644 index 0000000000..5f73d1a66c --- /dev/null +++ b/src/core/hle/service/psc/ovln/receiver.h @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include +#include "core/hle/result.h" +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/kernel_helpers.h" +#include "core/hle/service/service.h" +#include "core/hle/service/psc/ovln/ovln_types.h" + +namespace Kernel { +class KReadableEvent; +} + +namespace Service::PSC { + +class IReceiver final : public ServiceFramework { +public: + explicit IReceiver(Core::System& system_); + ~IReceiver() override; + + IReceiver(const IReceiver&) = delete; + IReceiver& operator=(const IReceiver&) = delete; + +private: + Result AddSource(SourceName source_name); + Result RemoveSource(SourceName source_name); + Result GetReceiveEventHandle(OutCopyHandle out_event); + Result Receive(Out out_notification, Out out_flags); + Result ReceiveWithTick(Out out_notification, Out out_flags, + Out out_tick); + + KernelHelpers::ServiceContext service_context; + Kernel::KEvent* receive_event; + + std::map>> message_sources; +}; + +} // namespace Service::PSC diff --git a/src/core/hle/service/psc/ovln/receiver_service.cpp b/src/core/hle/service/psc/ovln/receiver_service.cpp index 0df9d802b9..3b0b180725 100644 --- a/src/core/hle/service/psc/ovln/receiver_service.cpp +++ b/src/core/hle/service/psc/ovln/receiver_service.cpp @@ -5,126 +5,19 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/psc/ovln/ovln_types.h" +#include "core/hle/service/psc/ovln/receiver.h" #include "core/hle/service/psc/ovln/receiver_service.h" namespace Service::PSC { -class IReceiver final : public ServiceFramework { -public: - explicit IReceiver(Core::System& system_) : ServiceFramework{system_, "IReceiver"}, service_context{system_, "IReceiver"} { - receive_event = service_context.CreateEvent("IReceiver::ReceiveEvent"); - } - - ~IReceiver() override { - service_context.CloseEvent(receive_event); - } - - Result AddSource(SourceName source_name) { - const std::string name = source_name.GetString(); - LOG_INFO(Service_PSC, "called: source_name={}", name); - // Add source if it doesn't already exist - if (message_sources.find(name) == message_sources.end()) { - message_sources[name] = {}; - } - R_SUCCEED(); - } - - Result RemoveSource(SourceName source_name) { - const std::string name = source_name.GetString(); - LOG_INFO(Service_PSC, "called: source_name={}", name); - // Remove source if it exists - message_sources.erase(name); - R_SUCCEED(); - } - - Result GetReceiveEventHandle(OutCopyHandle out_event) { - LOG_INFO(Service_PSC, "called"); - *out_event = &receive_event->GetReadableEvent(); - R_SUCCEED(); - } - - Result Receive(Out out_notification, Out out_flags) { - u64 tick; - return ReceiveWithTick(out_notification, out_flags, Out(&tick)); - } - - Result ReceiveWithTick(Out out_notification, Out out_flags, Out out_tick) { - LOG_DEBUG(Service_PSC, "called"); - - // Find the message with the lowest ID across all sources - const std::string* target_source = nullptr; - size_t target_index = 0; - - for (const auto& [source_name, messages] : message_sources) { - if (!messages.empty()) { - if (target_source == nullptr) { - target_source = &source_name; - target_index = 0; - } - // Note: In the real implementation, we would track message IDs - // For now, just use FIFO order - } - } - - if (target_source != nullptr) { - auto& messages = message_sources[*target_source]; - *out_notification = messages[target_index].first; - *out_flags = messages[target_index].second; - *out_tick = 0; // TODO: Implement tick tracking - - // Remove the message - messages.erase(messages.begin() + target_index); - - // Clear event if no more messages - bool has_messages = false; - for (const auto& [_, msgs] : message_sources) { - if (!msgs.empty()) { - has_messages = true; - break; - } - } - if (!has_messages) { - receive_event->Clear(system.Kernel()); - } - - R_SUCCEED(); - } - - // No messages available - *out_notification = {}; - *out_flags = {}; - *out_tick = 0; - - LOG_WARNING(Service_PSC, "No messages available"); - R_THROW(ResultUnknown); // TODO: Use proper OvlnResult::NoMessages when available - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IReceiver::AddSource>, "AddSource"}, - FunctionInfo{1, D<&IReceiver::RemoveSource>, "RemoveSource"}, - FunctionInfo{2, D<&IReceiver::GetReceiveEventHandle>, "GetReceiveEventHandle"}, - FunctionInfo{3, D<&IReceiver::Receive>, "Receive"}, - FunctionInfo{4, D<&IReceiver::ReceiveWithTick>, "ReceiveWithTick"} - ); - - KernelHelpers::ServiceContext service_context; - Kernel::KEvent* receive_event; - - std::map>> message_sources; -}; - -std::optional IReceiverService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IReceiverService::OpenReceiver>, "OpenReceiver"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IReceiverService::IReceiverService(Core::System& system_) : ServiceFramework{system_, "ovln:rcv"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IReceiverService::OpenReceiver>, "OpenReceiver"}, + }; + // clang-format on + + RegisterHandlers(functions); } IReceiverService::~IReceiverService() = default; diff --git a/src/core/hle/service/psc/ovln/receiver_service.h b/src/core/hle/service/psc/ovln/receiver_service.h index bd053cd50c..a7a9b012e8 100644 --- a/src/core/hle/service/psc/ovln/receiver_service.h +++ b/src/core/hle/service/psc/ovln/receiver_service.h @@ -20,8 +20,6 @@ public: private: Result OpenReceiver(Out> out_receiver); - - std::optional FindRequest(u32 key) override; }; } // namespace Service::PSC diff --git a/src/core/hle/service/psc/ovln/sender.cpp b/src/core/hle/service/psc/ovln/sender.cpp new file mode 100644 index 0000000000..dffcd4bc36 --- /dev/null +++ b/src/core/hle/service/psc/ovln/sender.cpp @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/psc/ovln/sender.h" + +namespace Service::PSC { + +ISender::ISender(Core::System& system_) : ServiceFramework{system_, "ISender"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ISender::Send>, "Send"}, + {1, nullptr, "GetUnreceivedMessageCount"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +ISender::~ISender() = default; + +Result ISender::Send(const OverlayNotification& notification, MessageFlags flags) { + std::string data; + for (const auto m : notification) { + data += fmt::format("{:016X} ", m); + } + + LOG_WARNING(Service_PSC, "(STUBBED) called, flags={} notification={}", flags.raw, data); + R_SUCCEED(); +} + +} // namespace Service::PSC diff --git a/src/core/hle/service/psc/ovln/sender.h b/src/core/hle/service/psc/ovln/sender.h new file mode 100644 index 0000000000..9b0fe786bd --- /dev/null +++ b/src/core/hle/service/psc/ovln/sender.h @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/psc/ovln/ovln_types.h" +#include "core/hle/service/service.h" + +namespace Service::PSC { + +class ISender final : public ServiceFramework { +public: + explicit ISender(Core::System& system_); + ~ISender() override; + +private: + Result Send(const OverlayNotification& notification, MessageFlags flags); +}; + +} // namespace Service::PSC diff --git a/src/core/hle/service/psc/ovln/sender_service.cpp b/src/core/hle/service/psc/ovln/sender_service.cpp index 5a36f1e1ec..8f80a5c461 100644 --- a/src/core/hle/service/psc/ovln/sender_service.cpp +++ b/src/core/hle/service/psc/ovln/sender_service.cpp @@ -5,43 +5,19 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "core/hle/service/cmif_serialization.h" -#include "core/hle/service/psc/ovln/ovln_types.h" +#include "core/hle/service/psc/ovln/sender.h" #include "core/hle/service/psc/ovln/sender_service.h" namespace Service::PSC { -class ISender final : public ServiceFramework { -public: - explicit ISender(Core::System& system_) : ServiceFramework{system_, "ISender"} {} - ~ISender() override = default; - - Result Send(const OverlayNotification& notification, MessageFlags flags) { - std::string data; - for (const auto m : notification) { - data += fmt::format("{:016X} ", m); - } - - LOG_WARNING(Service_PSC, "(STUBBED) called, flags={} notification={}", flags.raw, data); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ISender::Send>, "Send"}, - FunctionInfo{1, nullptr, "GetUnreceivedMessageCount"} - ); -}; - -std::optional ISenderService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ISenderService::OpenSender>, "OpenSender"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - ISenderService::ISenderService(Core::System& system_) : ServiceFramework{system_, "ovln:snd"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ISenderService::OpenSender>, "OpenSender"}, + }; + // clang-format on + + RegisterHandlers(functions); } ISenderService::~ISenderService() = default; diff --git a/src/core/hle/service/psc/ovln/sender_service.h b/src/core/hle/service/psc/ovln/sender_service.h index 90a9a33872..8176e85e23 100644 --- a/src/core/hle/service/psc/ovln/sender_service.h +++ b/src/core/hle/service/psc/ovln/sender_service.h @@ -19,9 +19,8 @@ public: ~ISenderService() override; private: - Result OpenSender(Out> out_sender, u32 sender_id, std::array data); - - std::optional FindRequest(u32 key) override; + Result OpenSender(Out> out_sender, u32 sender_id, + std::array data); }; } // namespace Service::PSC diff --git a/src/core/hle/service/psc/pm_control.cpp b/src/core/hle/service/psc/pm_control.cpp new file mode 100644 index 0000000000..fc5852f863 --- /dev/null +++ b/src/core/hle/service/psc/pm_control.cpp @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/psc/pm_control.h" + +namespace Service::PSC { + +IPmControl::IPmControl(Core::System& system_) : ServiceFramework{system_, "psc:c"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Initialize"}, + {1, nullptr, "DispatchRequest"}, + {2, nullptr, "GetResult"}, + {3, nullptr, "GetState"}, + {4, nullptr, "Cancel"}, + {5, nullptr, "PrintModuleInformation"}, + {6, nullptr, "GetModuleInformation"}, + {10, nullptr, "AcquireStateLock"}, + {11, nullptr, "HasStateLock"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +IPmControl::~IPmControl() = default; + +} // namespace Service::PSC diff --git a/src/core/hle/service/psc/pm_control.h b/src/core/hle/service/psc/pm_control.h new file mode 100644 index 0000000000..7967f7ab18 --- /dev/null +++ b/src/core/hle/service/psc/pm_control.h @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/service.h" + +namespace Service::PSC { + +class IPmControl final : public ServiceFramework { +public: + explicit IPmControl(Core::System& system_); + ~IPmControl() override; +}; + +} // namespace Service::PSC diff --git a/src/core/hle/service/psc/pm_module.cpp b/src/core/hle/service/psc/pm_module.cpp new file mode 100644 index 0000000000..38ca36ab8f --- /dev/null +++ b/src/core/hle/service/psc/pm_module.cpp @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/psc/pm_module.h" + +namespace Service::PSC { + +IPmModule::IPmModule(Core::System& system_) : ServiceFramework{system_, "IPmModule"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Initialize"}, + {1, nullptr, "GetRequest"}, + {2, nullptr, "Acknowledge"}, + {3, nullptr, "Finalize"}, + {4, nullptr, "AcknowledgeEx"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +IPmModule::~IPmModule() = default; + +} // namespace Service::PSC diff --git a/src/core/hle/service/psc/pm_module.h b/src/core/hle/service/psc/pm_module.h new file mode 100644 index 0000000000..dac8fcff2a --- /dev/null +++ b/src/core/hle/service/psc/pm_module.h @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/service.h" + +namespace Service::PSC { + +class IPmModule final : public ServiceFramework { +public: + explicit IPmModule(Core::System& system_); + ~IPmModule() override; +}; + +} // namespace Service::PSC diff --git a/src/core/hle/service/psc/pm_service.cpp b/src/core/hle/service/psc/pm_service.cpp new file mode 100644 index 0000000000..d1803bdf48 --- /dev/null +++ b/src/core/hle/service/psc/pm_service.cpp @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/service/cmif_serialization.h" +#include "core/hle/service/psc/pm_module.h" +#include "core/hle/service/psc/pm_service.h" + +namespace Service::PSC { + +IPmService::IPmService(Core::System& system_) : ServiceFramework{system_, "psc:m"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IPmService::GetPmModule>, "GetPmModule"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +IPmService::~IPmService() = default; + +Result IPmService::GetPmModule(Out> out_module) { + LOG_DEBUG(Service_PSC, "called"); + *out_module = std::make_shared(system); + R_SUCCEED(); +} + +} // namespace Service::PSC diff --git a/src/core/hle/service/psc/pm_service.h b/src/core/hle/service/psc/pm_service.h new file mode 100644 index 0000000000..721a0602c9 --- /dev/null +++ b/src/core/hle/service/psc/pm_service.h @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/cmif_types.h" +#include "core/hle/service/service.h" + +namespace Service::PSC { + +class IPmModule; + +class IPmService final : public ServiceFramework { +public: + explicit IPmService(Core::System& system_); + ~IPmService() override; + +private: + Result GetPmModule(Out> out_module); +}; + +} // namespace Service::PSC diff --git a/src/core/hle/service/psc/psc.cpp b/src/core/hle/service/psc/psc.cpp index 553c4f63a4..31fb9f0117 100644 --- a/src/core/hle/service/psc/psc.cpp +++ b/src/core/hle/service/psc/psc.cpp @@ -6,159 +6,102 @@ #include "core/hle/service/psc/ovln/receiver_service.h" #include "core/hle/service/psc/ovln/sender_service.h" +#include "core/hle/service/psc/pm_control.h" +#include "core/hle/service/psc/pm_service.h" #include "core/hle/service/psc/psc.h" #include "core/hle/service/psc/time/manager.h" #include "core/hle/service/psc/time/power_state_service.h" #include "core/hle/service/psc/time/service_manager.h" #include "core/hle/service/psc/time/static.h" #include "core/hle/service/service.h" -#include "core/hle/service/cmif_serialization.h" namespace Service::PSC { class PSC_L final : public ServiceFramework { public: - explicit PSC_L(Core::System& system_) : ServiceFramework{system_, "psc:l"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Initialize_3"}, - FunctionInfo{1, nullptr, "Lock"}, - FunctionInfo{2, nullptr, "Unlock"}, - FunctionInfo{3, nullptr, "IsLocked"}, - FunctionInfo{4, nullptr, "GetRelatedState"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit PSC_L(Core::System& system_) : ServiceFramework{system_, "psc:l"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Initialize_3"}, + {1, nullptr, "Lock"}, + {2, nullptr, "Unlock"}, + {3, nullptr, "IsLocked"}, + {4, nullptr, "GetRelatedState"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class INS_R final : public ServiceFramework { public: - explicit INS_R(Core::System& system_) : ServiceFramework{system_, "ins:r"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetInputSourceState"}, - FunctionInfo{1, nullptr, "GetTriggerTargetEvent"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit INS_R(Core::System& system_) : ServiceFramework{system_, "ins:r"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetInputSourceState"}, + {1, nullptr, "GetTriggerTargetEvent"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class INS_S final : public ServiceFramework { public: - explicit INS_S(Core::System& system_) : ServiceFramework{system_, "ins:s"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetNotifyEvent"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit INS_S(Core::System& system_) : ServiceFramework{system_, "ins:s"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetNotifyEvent"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class HSHL_SYS final : public ServiceFramework { public: - explicit HSHL_SYS(Core::System& system_) : ServiceFramework{system_, "hshl:sys"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetBatteryPercentage"}, - FunctionInfo{1, nullptr, "GetChargerType"}, - FunctionInfo{2, nullptr, "OpenChargeSession"}, - FunctionInfo{3, nullptr, "GetRawBatteryPercentage"}, - FunctionInfo{4, nullptr, "GetBatteryVoltageLevel"}, - FunctionInfo{5, nullptr, "OpenThermalSession"}, - FunctionInfo{6, nullptr, "GetAbnormalTemperatureSet"}, - FunctionInfo{7, nullptr, "OpenClockSession"}, - FunctionInfo{8, nullptr, "GetClockRate"}, - FunctionInfo{9, nullptr, "OpenBridgeSession"}, - FunctionInfo{10, nullptr, "GetBridgePowerSupply"}, - FunctionInfo{11, nullptr, "OpenVsysVoltageSession"}, - FunctionInfo{12, nullptr, "GetIsBatteryEnoughForFullAwake"}, - FunctionInfo{13, nullptr, "GetIsCharging"}, - FunctionInfo{14, nullptr, "Cmd14"}, - FunctionInfo{15, nullptr, "Cmd15"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit HSHL_SYS(Core::System& system_) : ServiceFramework{system_, "hshl:sys"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetBatteryPercentage"}, + {1, nullptr, "GetChargerType"}, + {2, nullptr, "OpenChargeSession"}, + {3, nullptr, "GetRawBatteryPercentage"}, + {4, nullptr, "GetBatteryVoltageLevel"}, + {5, nullptr, "OpenThermalSession"}, + {6, nullptr, "GetAbnormalTemperatureSet"}, + {7, nullptr, "OpenClockSession"}, + {8, nullptr, "GetClockRate"}, + {9, nullptr, "OpenBridgeSession"}, + {10, nullptr, "GetBridgePowerSupply"}, + {11, nullptr, "OpenVsysVoltageSession"}, + {12, nullptr, "GetIsBatteryEnoughForFullAwake"}, + {13, nullptr, "GetIsCharging"}, + {14, nullptr, "Cmd14"}, + {15, nullptr, "Cmd15"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class HSHL_SET final : public ServiceFramework { public: - explicit HSHL_SET(Core::System& system_) : ServiceFramework{system_, "hshl:set"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenChargeSession_2"}, - FunctionInfo{1, nullptr, "OpenThermalSession_2"}, - FunctionInfo{2, nullptr, "SetClockRate"}, - FunctionInfo{3, nullptr, "SetBridgePowerSupply"}, - FunctionInfo{4, nullptr, "Cmd4"}, - FunctionInfo{5, nullptr, "Cmd5"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit HSHL_SET(Core::System& system_) : ServiceFramework{system_, "hshl:set"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "OpenChargeSession_2"}, + {1, nullptr, "OpenThermalSession_2"}, + {2, nullptr, "SetClockRate"}, + {3, nullptr, "SetBridgePowerSupply"}, + {4, nullptr, "Cmd4"}, + {5, nullptr, "Cmd5"}, + }; + // clang-format on + RegisterHandlers(functions); } }; -class IPmModule final : public ServiceFramework { -public: - explicit IPmModule(Core::System& system_) : ServiceFramework{system_, "IPmModule"} {} - ~IPmModule() override = default; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Initialize"}, - FunctionInfo{1, nullptr, "GetRequest"}, - FunctionInfo{2, nullptr, "Acknowledge"}, - FunctionInfo{3, nullptr, "Finalize"}, - FunctionInfo{4, nullptr, "AcknowledgeEx"} - ); -}; - -class IPmService final : public ServiceFramework { -public: - explicit IPmService(Core::System& system_) : ServiceFramework{system_, "psc:m"} {} - ~IPmService() override = default; - -private: - Result GetPmModule(Out> out_module) { - LOG_DEBUG(Service_PSC, "called"); - *out_module = std::make_shared(system); - R_SUCCEED(); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IPmService::GetPmModule>, "GetPmModule"} - ); -}; - -class IPmControl final : public ServiceFramework { -public: - explicit IPmControl(Core::System& system_) : ServiceFramework{system_, "psc:c"} {} - ~IPmControl() override = default; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Initialize"}, - FunctionInfo{1, nullptr, "DispatchRequest"}, - FunctionInfo{2, nullptr, "GetResult"}, - FunctionInfo{3, nullptr, "GetState"}, - FunctionInfo{4, nullptr, "Cancel"}, - FunctionInfo{5, nullptr, "PrintModuleInformation"}, - FunctionInfo{6, nullptr, "GetModuleInformation"}, - FunctionInfo{10, nullptr, "AcquireStateLock"}, - FunctionInfo{11, nullptr, "HasStateLock"} - ); -}; - void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); diff --git a/src/core/hle/service/psc/psc.h b/src/core/hle/service/psc/psc.h index c83d07ca80..d89e6854cc 100644 --- a/src/core/hle/service/psc/psc.h +++ b/src/core/hle/service/psc/psc.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/psc/time/alarms.cpp b/src/core/hle/service/psc/time/alarms.cpp index c9070896b3..17a795c4c5 100644 --- a/src/core/hle/service/psc/time/alarms.cpp +++ b/src/core/hle/service/psc/time/alarms.cpp @@ -33,7 +33,8 @@ Alarm::~Alarm() { } Alarms::Alarms(Core::System& system, StandardSteadyClockCore& steady_clock, PowerStateRequestManager& power_state_request_manager) - : m_ctx{system, "Psc:Alarms"} + : m_system{system} + , m_ctx{system, "Psc:Alarms"} , m_steady_clock{steady_clock} , m_power_state_request_manager{power_state_request_manager} , m_event{m_ctx.CreateEvent("Psc:Alarms:Event")} @@ -135,7 +136,15 @@ Result Alarms::UpdateClosestAndSignal(Kernel::KernelCore& kernel) { IAlarmService::IAlarmService(Core::System& system_, std::shared_ptr manager) : ServiceFramework{system_, "time:al"} , m_alarms{manager->m_alarms} -{} +{ + // clang-format off + static const FunctionInfo functions[] = { + {0, &IAlarmService::CreateWakeupAlarm, "CreateWakeupAlarm"}, + {1, &IAlarmService::CreateBackgroundTaskAlarm, "CreateBackgroundTaskAlarm"}, + }; + // clang-format on + RegisterHandlers(functions); +} void IAlarmService::CreateWakeupAlarm(HLERequestContext& ctx) { LOG_DEBUG(Service_Time, "called."); @@ -156,6 +165,17 @@ void IAlarmService::CreateBackgroundTaskAlarm(HLERequestContext& ctx) { ISteadyClockAlarm::ISteadyClockAlarm(Core::System& system_, Alarms& alarms, AlarmType type) : ServiceFramework{system_, "ISteadyClockAlarm"}, m_ctx{system, "Psc:ISteadyClockAlarm"}, m_alarms{alarms}, m_alarm{system, m_ctx, type} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &ISteadyClockAlarm::GetAlarmEvent, "GetAlarmEvent"}, + {1, &ISteadyClockAlarm::Enable, "Enable"}, + {2, &ISteadyClockAlarm::Disable, "Disable"}, + {3, &ISteadyClockAlarm::IsEnabled, "IsEnabled"}, + {10, nullptr, "CreateWakeLock"}, + {11, nullptr, "DestroyWakeLock"}, + }; + // clang-format on + RegisterHandlers(functions); } void ISteadyClockAlarm::GetAlarmEvent(HLERequestContext& ctx) { diff --git a/src/core/hle/service/psc/time/alarms.h b/src/core/hle/service/psc/time/alarms.h index 6d916ca198..0a2fa7fac5 100644 --- a/src/core/hle/service/psc/time/alarms.h +++ b/src/core/hle/service/psc/time/alarms.h @@ -95,6 +95,7 @@ private: void Erase(Kernel::KernelCore& kernel, Alarm& alarm); Result UpdateClosestAndSignal(Kernel::KernelCore& kernel); + Core::System& m_system; KernelHelpers::ServiceContext m_ctx; StandardSteadyClockCore& m_steady_clock; @@ -113,14 +114,6 @@ public: private: void CreateWakeupAlarm(HLERequestContext& ctx); void CreateBackgroundTaskAlarm(HLERequestContext& ctx); - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IAlarmService::CreateWakeupAlarm, "CreateWakeupAlarm"}, - FunctionInfo{1, &IAlarmService::CreateBackgroundTaskAlarm, "CreateBackgroundTaskAlarm"} - ); Alarms& m_alarms; }; @@ -135,18 +128,8 @@ private: void Disable(HLERequestContext& ctx); void IsEnabled(HLERequestContext& ctx); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &ISteadyClockAlarm::GetAlarmEvent, "GetAlarmEvent"}, - FunctionInfo{1, &ISteadyClockAlarm::Enable, "Enable"}, - FunctionInfo{2, &ISteadyClockAlarm::Disable, "Disable"}, - FunctionInfo{3, &ISteadyClockAlarm::IsEnabled, "IsEnabled"}, - FunctionInfo{10, nullptr, "CreateWakeLock"}, - FunctionInfo{11, nullptr, "DestroyWakeLock"} - ); KernelHelpers::ServiceContext m_ctx; + Alarms& m_alarms; Alarm m_alarm; }; diff --git a/src/core/hle/service/psc/time/clocks/ephemeral_network_system_clock_core.h b/src/core/hle/service/psc/time/clocks/ephemeral_network_system_clock_core.h index 0a68867d94..0abe200206 100644 --- a/src/core/hle/service/psc/time/clocks/ephemeral_network_system_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/ephemeral_network_system_clock_core.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.cpp b/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.cpp index 6a74d45946..d0e596c504 100644 --- a/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.cpp +++ b/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.h b/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.h index 5722d8e965..832c6907a0 100644 --- a/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/standard_local_system_clock_core.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.cpp b/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.cpp index 6938d369fe..b3143ead71 100644 --- a/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.cpp +++ b/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.h b/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.h index bfafc7d71f..47a411e811 100644 --- a/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/standard_network_system_clock_core.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.cpp b/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.cpp index 7a72d7aa25..8fc44fd691 100644 --- a/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.cpp +++ b/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.h b/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.h index bbf98fcd5c..342d6385fd 100644 --- a/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/standard_steady_clock_core.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.h b/src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.h index 32b8bc3bcd..14c8e613f4 100644 --- a/src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/standard_user_system_clock_core.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/clocks/steady_clock_core.h b/src/core/hle/service/psc/time/clocks/steady_clock_core.h index f933cc15f8..31be5e25ad 100644 --- a/src/core/hle/service/psc/time/clocks/steady_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/steady_clock_core.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/clocks/system_clock_core.cpp b/src/core/hle/service/psc/time/clocks/system_clock_core.cpp index 2b7466831d..7ca5e8515e 100644 --- a/src/core/hle/service/psc/time/clocks/system_clock_core.cpp +++ b/src/core/hle/service/psc/time/clocks/system_clock_core.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/clocks/system_clock_core.h b/src/core/hle/service/psc/time/clocks/system_clock_core.h index 0b928432fb..d95bab5191 100644 --- a/src/core/hle/service/psc/time/clocks/system_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/system_clock_core.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp b/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp index 22da1fbccc..8666df57f1 100644 --- a/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp +++ b/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.h b/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.h index a7bea86a25..62890cd5ca 100644 --- a/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/tick_based_steady_clock_core.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/common.cpp b/src/core/hle/service/psc/time/common.cpp index a6d9f02ca3..dce2249ea1 100644 --- a/src/core/hle/service/psc/time/common.cpp +++ b/src/core/hle/service/psc/time/common.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/manager.h b/src/core/hle/service/psc/time/manager.h index 2cb8b58a2b..7c771d25f5 100644 --- a/src/core/hle/service/psc/time/manager.h +++ b/src/core/hle/service/psc/time/manager.h @@ -26,20 +26,20 @@ namespace Service::PSC::Time { class TimeManager { public: explicit TimeManager(Core::System& system) - : m_standard_steady_clock{system} - , m_tick_based_steady_clock{system} - , m_standard_local_system_clock{m_standard_steady_clock} - , m_standard_network_system_clock{m_standard_steady_clock} - , m_standard_user_system_clock{system, m_standard_local_system_clock - , m_standard_network_system_clock} - , m_ephemeral_network_clock{m_tick_based_steady_clock} - , m_shared_memory{system} - , m_power_state_request_manager{system} - , m_alarms{system, m_standard_steady_clock, m_power_state_request_manager} - , m_local_system_clock_context_writer{system, m_shared_memory} - , m_network_system_clock_context_writer{system, m_shared_memory, m_standard_user_system_clock} - , m_ephemeral_network_clock_context_writer{system} - {} + : m_system{system}, m_standard_steady_clock{system}, m_tick_based_steady_clock{m_system}, + m_standard_local_system_clock{m_standard_steady_clock}, + m_standard_network_system_clock{m_standard_steady_clock}, + m_standard_user_system_clock{m_system, m_standard_local_system_clock, + m_standard_network_system_clock}, + m_ephemeral_network_clock{m_tick_based_steady_clock}, m_shared_memory{m_system}, + m_power_state_request_manager{m_system}, m_alarms{m_system, m_standard_steady_clock, + m_power_state_request_manager}, + m_local_system_clock_context_writer{m_system, m_shared_memory}, + m_network_system_clock_context_writer{m_system, m_shared_memory, + m_standard_user_system_clock}, + m_ephemeral_network_clock_context_writer{m_system} {} + + Core::System& m_system; StandardSteadyClockCore m_standard_steady_clock; TickBasedSteadyClockCore m_tick_based_steady_clock; diff --git a/src/core/hle/service/psc/time/power_state_request_manager.h b/src/core/hle/service/psc/time/power_state_request_manager.h index 30a0c947d6..325f73913b 100644 --- a/src/core/hle/service/psc/time/power_state_request_manager.h +++ b/src/core/hle/service/psc/time/power_state_request_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/power_state_service.cpp b/src/core/hle/service/psc/time/power_state_service.cpp index 795aeb94a8..39af16b6f1 100644 --- a/src/core/hle/service/psc/time/power_state_service.cpp +++ b/src/core/hle/service/psc/time/power_state_service.cpp @@ -9,19 +9,20 @@ namespace Service::PSC::Time { -std::optional IPowerStateRequestHandler::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&IPowerStateRequestHandler::GetPowerStateRequestEventReadableHandle>, "GetPowerStateRequestEventReadableHandle"}, - FunctionInfo{1, D<&IPowerStateRequestHandler::GetAndClearPowerStateRequest>, "GetAndClearPowerStateRequest"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IPowerStateRequestHandler::IPowerStateRequestHandler( Core::System& system_, PowerStateRequestManager& power_state_request_manager) : ServiceFramework{system_, "time:p"} , m_power_state_request_manager{power_state_request_manager} -{} +{ + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&IPowerStateRequestHandler::GetPowerStateRequestEventReadableHandle>, "GetPowerStateRequestEventReadableHandle"}, + {1, D<&IPowerStateRequestHandler::GetAndClearPowerStateRequest>, "GetAndClearPowerStateRequest"}, + }; + // clang-format on + + RegisterHandlers(functions); +} Result IPowerStateRequestHandler::GetPowerStateRequestEventReadableHandle( OutCopyHandle out_event) { diff --git a/src/core/hle/service/psc/time/power_state_service.h b/src/core/hle/service/psc/time/power_state_service.h index 14d9c1a77a..81b3adf234 100644 --- a/src/core/hle/service/psc/time/power_state_service.h +++ b/src/core/hle/service/psc/time/power_state_service.h @@ -27,7 +27,6 @@ public: Result GetAndClearPowerStateRequest(Out out_cleared, Out out_priority); private: - std::optional FindRequest(u32 key) override; PowerStateRequestManager& m_power_state_request_manager; }; diff --git a/src/core/hle/service/psc/time/service_manager.cpp b/src/core/hle/service/psc/time/service_manager.cpp index be25ee9a70..e9f1407e4d 100644 --- a/src/core/hle/service/psc/time/service_manager.cpp +++ b/src/core/hle/service/psc/time/service_manager.cpp @@ -13,30 +13,6 @@ namespace Service::PSC::Time { - std::optional ServiceManager::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ServiceManager::GetStaticServiceAsUser>, "GetStaticServiceAsUser"}, - FunctionInfo{5, D<&ServiceManager::GetStaticServiceAsAdmin>, "GetStaticServiceAsAdmin"}, - FunctionInfo{6, D<&ServiceManager::GetStaticServiceAsRepair>, "GetStaticServiceAsRepair"}, - FunctionInfo{9, D<&ServiceManager::GetStaticServiceAsServiceManager>, "GetStaticServiceAsServiceManager"}, - FunctionInfo{10, D<&ServiceManager::SetupStandardSteadyClockCore>, "SetupStandardSteadyClockCore"}, - FunctionInfo{11, D<&ServiceManager::SetupStandardLocalSystemClockCore>, "SetupStandardLocalSystemClockCore"}, - FunctionInfo{12, D<&ServiceManager::SetupStandardNetworkSystemClockCore>, "SetupStandardNetworkSystemClockCore"}, - FunctionInfo{13, D<&ServiceManager::SetupStandardUserSystemClockCore>, "SetupStandardUserSystemClockCore"}, - FunctionInfo{14, D<&ServiceManager::SetupTimeZoneServiceCore>, "SetupTimeZoneServiceCore"}, - FunctionInfo{15, D<&ServiceManager::SetupEphemeralNetworkSystemClockCore>, "SetupEphemeralNetworkSystemClockCore"}, - FunctionInfo{50, D<&ServiceManager::GetStandardLocalClockOperationEvent>, "GetStandardLocalClockOperationEvent"}, - FunctionInfo{51, D<&ServiceManager::GetStandardNetworkClockOperationEventForServiceManager>, "GetStandardNetworkClockOperationEventForServiceManager"}, - FunctionInfo{52, D<&ServiceManager::GetEphemeralNetworkClockOperationEventForServiceManager>, "GetEphemeralNetworkClockOperationEventForServiceManager"}, - FunctionInfo{60, D<&ServiceManager::GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent"}, - FunctionInfo{100, D<&ServiceManager::SetStandardSteadyClockBaseTime>, "SetStandardSteadyClockBaseTime"}, - FunctionInfo{200, D<&ServiceManager::GetClosestAlarmUpdatedEvent>, "GetClosestAlarmUpdatedEvent"}, - FunctionInfo{201, D<&ServiceManager::CheckAndSignalAlarms>, "CheckAndSignalAlarms"}, - FunctionInfo{202, D<&ServiceManager::GetClosestAlarmInfo>, "GetClosestAlarmInfo "} - ); - return HandlerTableGenerateWithFind(key, functions); - } - ServiceManager::ServiceManager(Core::System& system_, std::shared_ptr time, ServerManager* server_manager) : ServiceFramework{system_, "time:m"}, m_time{std::move(time)}, @@ -51,6 +27,30 @@ ServiceManager::ServiceManager(Core::System& system_, std::shared_ptrm_network_system_clock_context_writer}, m_ephemeral_system_context_writer{m_time->m_ephemeral_network_clock_context_writer}, m_local_operation{system_}, m_network_operation{system_}, m_ephemeral_operation{system_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ServiceManager::GetStaticServiceAsUser>, "GetStaticServiceAsUser"}, + {5, D<&ServiceManager::GetStaticServiceAsAdmin>, "GetStaticServiceAsAdmin"}, + {6, D<&ServiceManager::GetStaticServiceAsRepair>, "GetStaticServiceAsRepair"}, + {9, D<&ServiceManager::GetStaticServiceAsServiceManager>, "GetStaticServiceAsServiceManager"}, + {10, D<&ServiceManager::SetupStandardSteadyClockCore>, "SetupStandardSteadyClockCore"}, + {11, D<&ServiceManager::SetupStandardLocalSystemClockCore>, "SetupStandardLocalSystemClockCore"}, + {12, D<&ServiceManager::SetupStandardNetworkSystemClockCore>, "SetupStandardNetworkSystemClockCore"}, + {13, D<&ServiceManager::SetupStandardUserSystemClockCore>, "SetupStandardUserSystemClockCore"}, + {14, D<&ServiceManager::SetupTimeZoneServiceCore>, "SetupTimeZoneServiceCore"}, + {15, D<&ServiceManager::SetupEphemeralNetworkSystemClockCore>, "SetupEphemeralNetworkSystemClockCore"}, + {50, D<&ServiceManager::GetStandardLocalClockOperationEvent>, "GetStandardLocalClockOperationEvent"}, + {51, D<&ServiceManager::GetStandardNetworkClockOperationEventForServiceManager>, "GetStandardNetworkClockOperationEventForServiceManager"}, + {52, D<&ServiceManager::GetEphemeralNetworkClockOperationEventForServiceManager>, "GetEphemeralNetworkClockOperationEventForServiceManager"}, + {60, D<&ServiceManager::GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedEvent"}, + {100, D<&ServiceManager::SetStandardSteadyClockBaseTime>, "SetStandardSteadyClockBaseTime"}, + {200, D<&ServiceManager::GetClosestAlarmUpdatedEvent>, "GetClosestAlarmUpdatedEvent"}, + {201, D<&ServiceManager::CheckAndSignalAlarms>, "CheckAndSignalAlarms"}, + {202, D<&ServiceManager::GetClosestAlarmInfo>, "GetClosestAlarmInfo "}, + }; + // clang-format on + RegisterHandlers(functions); + m_local_system_context_writer.Link(m_local_operation); m_network_system_context_writer.Link(m_network_operation); m_ephemeral_system_context_writer.Link(m_ephemeral_operation); diff --git a/src/core/hle/service/psc/time/service_manager.h b/src/core/hle/service/psc/time/service_manager.h index a8b94d8939..09cff25038 100644 --- a/src/core/hle/service/psc/time/service_manager.h +++ b/src/core/hle/service/psc/time/service_manager.h @@ -65,8 +65,6 @@ private: void SetupSAndP(); Result GetStaticService(OutInterface out_service, StaticServiceSetupInfo setup_info, const char* name); - std::optional FindRequest(u32 key) override; - std::shared_ptr m_time; ServerManager& m_server_manager; bool m_is_s_and_p_setup{}; diff --git a/src/core/hle/service/psc/time/shared_memory.cpp b/src/core/hle/service/psc/time/shared_memory.cpp index adef6bcd8b..b6841a87cb 100644 --- a/src/core/hle/service/psc/time/shared_memory.cpp +++ b/src/core/hle/service/psc/time/shared_memory.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/static.cpp b/src/core/hle/service/psc/time/static.cpp index 2b2b6f1f04..28cff3b764 100644 --- a/src/core/hle/service/psc/time/static.cpp +++ b/src/core/hle/service/psc/time/static.cpp @@ -33,31 +33,6 @@ constexpr Result GetTimeFromTimePointAndContext(s64* out_time, SteadyClockTimePo } } // namespace -std::optional StaticService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"}, - FunctionInfo{1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"}, - FunctionInfo{2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"}, - FunctionInfo{3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"}, - FunctionInfo{4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"}, - FunctionInfo{5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"}, - FunctionInfo{20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"}, - FunctionInfo{50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"}, - FunctionInfo{51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"}, - FunctionInfo{100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"}, - FunctionInfo{101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"}, - FunctionInfo{102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"}, - FunctionInfo{200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"}, - FunctionInfo{201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"}, - FunctionInfo{300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"}, - FunctionInfo{400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"}, - FunctionInfo{401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"}, - FunctionInfo{500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"}, - FunctionInfo{501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - StaticService::StaticService(Core::System& system_, StaticServiceSetupInfo setup_info, std::shared_ptr time, const char* name) : ServiceFramework{system_, name}, m_setup_info{setup_info}, m_time{time}, @@ -67,6 +42,31 @@ StaticService::StaticService(Core::System& system_, StaticServiceSetupInfo setup m_time_zone{m_time->m_time_zone}, m_ephemeral_network_clock{m_time->m_ephemeral_network_clock}, m_shared_memory{ m_time->m_shared_memory} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&StaticService::GetStandardUserSystemClock>, "GetStandardUserSystemClock"}, + {1, D<&StaticService::GetStandardNetworkSystemClock>, "GetStandardNetworkSystemClock"}, + {2, D<&StaticService::GetStandardSteadyClock>, "GetStandardSteadyClock"}, + {3, D<&StaticService::GetTimeZoneService>, "GetTimeZoneService"}, + {4, D<&StaticService::GetStandardLocalSystemClock>, "GetStandardLocalSystemClock"}, + {5, D<&StaticService::GetEphemeralNetworkSystemClock>, "GetEphemeralNetworkSystemClock"}, + {20, D<&StaticService::GetSharedMemoryNativeHandle>, "GetSharedMemoryNativeHandle"}, + {50, D<&StaticService::SetStandardSteadyClockInternalOffset>, "SetStandardSteadyClockInternalOffset"}, + {51, D<&StaticService::GetStandardSteadyClockRtcValue>, "GetStandardSteadyClockRtcValue"}, + {100, D<&StaticService::IsStandardUserSystemClockAutomaticCorrectionEnabled>, "IsStandardUserSystemClockAutomaticCorrectionEnabled"}, + {101, D<&StaticService::SetStandardUserSystemClockAutomaticCorrectionEnabled>, "SetStandardUserSystemClockAutomaticCorrectionEnabled"}, + {102, D<&StaticService::GetStandardUserSystemClockInitialYear>, "GetStandardUserSystemClockInitialYear"}, + {200, D<&StaticService::IsStandardNetworkSystemClockAccuracySufficient>, "IsStandardNetworkSystemClockAccuracySufficient"}, + {201, D<&StaticService::GetStandardUserSystemClockAutomaticCorrectionUpdatedTime>, "GetStandardUserSystemClockAutomaticCorrectionUpdatedTime"}, + {300, D<&StaticService::CalculateMonotonicSystemClockBaseTimePoint>, "CalculateMonotonicSystemClockBaseTimePoint"}, + {400, D<&StaticService::GetClockSnapshot>, "GetClockSnapshot"}, + {401, D<&StaticService::GetClockSnapshotFromSystemClockContext>, "GetClockSnapshotFromSystemClockContext"}, + {500, D<&StaticService::CalculateStandardUserSystemClockDifferenceByUser>, "CalculateStandardUserSystemClockDifferenceByUser"}, + {501, D<&StaticService::CalculateSpanBetween>, "CalculateSpanBetween"}, + }; + // clang-format on + + RegisterHandlers(functions); } Result StaticService::GetStandardUserSystemClock(OutInterface out_service) { diff --git a/src/core/hle/service/psc/time/static.h b/src/core/hle/service/psc/time/static.h index a86fec178f..52659166f1 100644 --- a/src/core/hle/service/psc/time/static.h +++ b/src/core/hle/service/psc/time/static.h @@ -71,8 +71,6 @@ private: Result GetClockSnapshotImpl(OutClockSnapshot out_snapshot, const SystemClockContext& user_context, const SystemClockContext& network_context, TimeType type); - std::optional FindRequest(u32 key) override; - StaticServiceSetupInfo m_setup_info; std::shared_ptr m_time; StandardLocalSystemClockCore& m_local_system_clock; diff --git a/src/core/hle/service/psc/time/steady_clock.cpp b/src/core/hle/service/psc/time/steady_clock.cpp index 3d138837d3..1d1551acf9 100644 --- a/src/core/hle/service/psc/time/steady_clock.cpp +++ b/src/core/hle/service/psc/time/steady_clock.cpp @@ -11,26 +11,26 @@ namespace Service::PSC::Time { -std::optional SteadyClock::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&SteadyClock::GetCurrentTimePoint>, "GetCurrentTimePoint"}, - FunctionInfo{2, D<&SteadyClock::GetTestOffset>, "GetTestOffset"}, - FunctionInfo{3, D<&SteadyClock::SetTestOffset>, "SetTestOffset"}, - FunctionInfo{100, D<&SteadyClock::GetRtcValue>, "GetRtcValue"}, - FunctionInfo{101, D<&SteadyClock::IsRtcResetDetected>, "IsRtcResetDetected"}, - FunctionInfo{102, D<&SteadyClock::GetSetupResultValue>, "GetSetupResultValue"}, - FunctionInfo{200, D<&SteadyClock::GetInternalOffset>, "GetInternalOffset"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - SteadyClock::SteadyClock(Core::System& system_, std::shared_ptr manager, bool can_write_steady_clock, bool can_write_uninitialized_clock) : ServiceFramework{system_, "ISteadyClock"} , m_clock_core{manager->m_standard_steady_clock} , m_can_write_steady_clock{can_write_steady_clock} , m_can_write_uninitialized_clock{can_write_uninitialized_clock} -{} +{ + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&SteadyClock::GetCurrentTimePoint>, "GetCurrentTimePoint"}, + {2, D<&SteadyClock::GetTestOffset>, "GetTestOffset"}, + {3, D<&SteadyClock::SetTestOffset>, "SetTestOffset"}, + {100, D<&SteadyClock::GetRtcValue>, "GetRtcValue"}, + {101, D<&SteadyClock::IsRtcResetDetected>, "IsRtcResetDetected"}, + {102, D<&SteadyClock::GetSetupResultValue>, "GetSetupResultValue"}, + {200, D<&SteadyClock::GetInternalOffset>, "GetInternalOffset"}, + }; + // clang-format on + RegisterHandlers(functions); +} Result SteadyClock::GetCurrentTimePoint(Out out_time_point) { SCOPE_EXIT { diff --git a/src/core/hle/service/psc/time/steady_clock.h b/src/core/hle/service/psc/time/steady_clock.h index e4de3e3717..8d3d9a6280 100644 --- a/src/core/hle/service/psc/time/steady_clock.h +++ b/src/core/hle/service/psc/time/steady_clock.h @@ -34,8 +34,6 @@ public: Result GetSetupResultValue(Out out_result); Result GetInternalOffset(Out out_internal_offset); - std::optional FindRequest(u32 key) override; - private: StandardSteadyClockCore& m_clock_core; bool m_can_write_steady_clock; diff --git a/src/core/hle/service/psc/time/system_clock.cpp b/src/core/hle/service/psc/time/system_clock.cpp index c08eca0b02..e978ffb5e5 100644 --- a/src/core/hle/service/psc/time/system_clock.cpp +++ b/src/core/hle/service/psc/time/system_clock.cpp @@ -11,23 +11,23 @@ namespace Service::PSC::Time { -std::optional SystemClock::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&SystemClock::GetCurrentTime>, "GetCurrentTime"}, - FunctionInfo{1, D<&SystemClock::SetCurrentTime>, "SetCurrentTime"}, - FunctionInfo{2, D<&SystemClock::GetSystemClockContext>, "GetSystemClockContext"}, - FunctionInfo{3, D<&SystemClock::SetSystemClockContext>, "SetSystemClockContext"}, - FunctionInfo{4, D<&SystemClock::GetOperationEventReadableHandle>, "GetOperationEventReadableHandle"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - SystemClock::SystemClock(Core::System& system_, SystemClockCore& clock_core, bool can_write_clock, bool can_write_uninitialized_clock) : ServiceFramework{system_, "ISystemClock"} , m_clock_core{clock_core} , m_can_write_clock{can_write_clock} , m_can_write_uninitialized_clock{can_write_uninitialized_clock} -{} +{ + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&SystemClock::GetCurrentTime>, "GetCurrentTime"}, + {1, D<&SystemClock::SetCurrentTime>, "SetCurrentTime"}, + {2, D<&SystemClock::GetSystemClockContext>, "GetSystemClockContext"}, + {3, D<&SystemClock::SetSystemClockContext>, "SetSystemClockContext"}, + {4, D<&SystemClock::GetOperationEventReadableHandle>, "GetOperationEventReadableHandle"}, + }; + // clang-format on + RegisterHandlers(functions); +} Result SystemClock::GetCurrentTime(Out out_time) { SCOPE_EXIT { diff --git a/src/core/hle/service/psc/time/system_clock.h b/src/core/hle/service/psc/time/system_clock.h index 4f7d285d39..0d91aaa735 100644 --- a/src/core/hle/service/psc/time/system_clock.h +++ b/src/core/hle/service/psc/time/system_clock.h @@ -31,7 +31,6 @@ public: Result GetOperationEventReadableHandle(OutCopyHandle out_event); private: - std::optional FindRequest(u32 key) override; SystemClockCore& m_clock_core; bool m_can_write_clock; bool m_can_write_uninitialized_clock; diff --git a/src/core/hle/service/psc/time/time_zone.cpp b/src/core/hle/service/psc/time/time_zone.cpp index 81bfb90929..e537a821db 100644 --- a/src/core/hle/service/psc/time/time_zone.cpp +++ b/src/core/hle/service/psc/time/time_zone.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/time_zone.h b/src/core/hle/service/psc/time/time_zone.h index 0e4ed6ed00..68a235e440 100644 --- a/src/core/hle/service/psc/time/time_zone.h +++ b/src/core/hle/service/psc/time/time_zone.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/psc/time/time_zone_service.cpp b/src/core/hle/service/psc/time/time_zone_service.cpp index 6a717846d3..bd6bb3ba93 100644 --- a/src/core/hle/service/psc/time/time_zone_service.cpp +++ b/src/core/hle/service/psc/time/time_zone_service.cpp @@ -13,33 +13,33 @@ namespace Service::PSC::Time { - std::optional TimeZoneService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"}, - FunctionInfo{1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"}, - FunctionInfo{2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"}, - FunctionInfo{3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"}, - FunctionInfo{4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"}, - FunctionInfo{5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"}, - FunctionInfo{6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"}, - FunctionInfo{7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"}, - FunctionInfo{8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"}, - FunctionInfo{20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"}, - FunctionInfo{100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"}, - FunctionInfo{101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"}, - FunctionInfo{201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"}, - FunctionInfo{202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"} - ); - return HandlerTableGenerateWithFind(key, functions); - } - TimeZoneService::TimeZoneService(Core::System& system_, StandardSteadyClockCore& clock_core, TimeZone& time_zone, bool can_write_timezone_device_location) : ServiceFramework{system_, "ITimeZoneService"} , m_clock_core{clock_core} , m_time_zone{time_zone} , m_can_write_timezone_device_location{can_write_timezone_device_location} -{} +{ + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&TimeZoneService::GetDeviceLocationName>, "GetDeviceLocationName"}, + {1, D<&TimeZoneService::SetDeviceLocationName>, "SetDeviceLocationName"}, + {2, D<&TimeZoneService::GetTotalLocationNameCount>, "GetTotalLocationNameCount"}, + {3, D<&TimeZoneService::LoadLocationNameList>, "LoadLocationNameList"}, + {4, D<&TimeZoneService::LoadTimeZoneRule>, "LoadTimeZoneRule"}, + {5, D<&TimeZoneService::GetTimeZoneRuleVersion>, "GetTimeZoneRuleVersion"}, + {6, D<&TimeZoneService::GetDeviceLocationNameAndUpdatedTime>, "GetDeviceLocationNameAndUpdatedTime"}, + {7, D<&TimeZoneService::SetDeviceLocationNameWithTimeZoneRule>, "SetDeviceLocationNameWithTimeZoneRule"}, + {8, D<&TimeZoneService::ParseTimeZoneBinary>, "ParseTimeZoneBinary"}, + {20, D<&TimeZoneService::GetDeviceLocationNameOperationEventReadableHandle>, "GetDeviceLocationNameOperationEventReadableHandle"}, + {100, D<&TimeZoneService::ToCalendarTime>, "ToCalendarTime"}, + {101, D<&TimeZoneService::ToCalendarTimeWithMyRule>, "ToCalendarTimeWithMyRule"}, + {201, D<&TimeZoneService::ToPosixTime>, "ToPosixTime"}, + {202, D<&TimeZoneService::ToPosixTimeWithMyRule>, "ToPosixTimeWithMyRule"}, + }; + // clang-format on + RegisterHandlers(functions); +} Result TimeZoneService::GetDeviceLocationName(Out out_location_name) { SCOPE_EXIT { diff --git a/src/core/hle/service/psc/time/time_zone_service.h b/src/core/hle/service/psc/time/time_zone_service.h index fbb107f87c..0067b08258 100644 --- a/src/core/hle/service/psc/time/time_zone_service.h +++ b/src/core/hle/service/psc/time/time_zone_service.h @@ -59,7 +59,6 @@ public: const CalendarTime& calendar_time); private: - std::optional FindRequest(u32 key) override; StandardSteadyClockCore& m_clock_core; TimeZone& m_time_zone; bool m_can_write_timezone_device_location; diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp index 5cad46f997..41d172b71b 100644 --- a/src/core/hle/service/ptm/psm.cpp +++ b/src/core/hle/service/ptm/psm.cpp @@ -21,13 +21,20 @@ namespace Service::PTM { class IPsmSession final : public ServiceFramework { public: explicit IPsmSession(Core::System& system_) - : ServiceFramework{system_, "IPsmSession"} - , service_context{system_, "IPsmSession"} { - state_change_event = service_context.CreateEvent("IPsmSession::state_change_event"); - } + : ServiceFramework{system_, "IPsmSession"}, service_context{system_, "IPsmSession"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IPsmSession::BindStateChangeEvent, "BindStateChangeEvent"}, + {1, &IPsmSession::UnbindStateChangeEvent, "UnbindStateChangeEvent"}, + {2, &IPsmSession::SetChargerTypeChangeEventEnabled, "SetChargerTypeChangeEventEnabled"}, + {3, &IPsmSession::SetPowerSupplyChangeEventEnabled, "SetPowerSupplyChangeEventEnabled"}, + {4, &IPsmSession::SetBatteryVoltageStateChangeEventEnabled, "SetBatteryVoltageStateChangeEventEnabled"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + state_change_event = service_context.CreateEvent("IPsmSession::state_change_event"); } ~IPsmSession() override { @@ -105,15 +112,8 @@ private: rb.Push(ResultSuccess); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IPsmSession::BindStateChangeEvent, "BindStateChangeEvent"}, - FunctionInfo{1, &IPsmSession::UnbindStateChangeEvent, "UnbindStateChangeEvent"}, - FunctionInfo{2, &IPsmSession::SetChargerTypeChangeEventEnabled, "SetChargerTypeChangeEventEnabled"}, - FunctionInfo{3, &IPsmSession::SetPowerSupplyChangeEventEnabled, "SetPowerSupplyChangeEventEnabled"}, - FunctionInfo{4, &IPsmSession::SetBatteryVoltageStateChangeEventEnabled, "SetBatteryVoltageStateChangeEventEnabled"} - ); - KernelHelpers::ServiceContext service_context; + bool should_signal_charger_type{}; bool should_signal_power_supply{}; bool should_signal_battery_voltage{}; @@ -122,6 +122,31 @@ private: }; PSM::PSM(Core::System& system_) : ServiceFramework{system_, "psm"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &PSM::GetBatteryChargePercentage, "GetBatteryChargePercentage"}, + {1, &PSM::GetChargerType, "GetChargerType"}, + {2, nullptr, "EnableBatteryCharging"}, + {3, nullptr, "DisableBatteryCharging"}, + {4, nullptr, "IsBatteryChargingEnabled"}, + {5, nullptr, "AcquireControllerPowerSupply"}, + {6, nullptr, "ReleaseControllerPowerSupply"}, + {7, &PSM::OpenSession, "OpenSession"}, + {8, nullptr, "EnableEnoughPowerChargeEmulation"}, + {9, nullptr, "DisableEnoughPowerChargeEmulation"}, + {10, nullptr, "EnableFastBatteryCharging"}, + {11, nullptr, "DisableFastBatteryCharging"}, + {12, &PSM::GetBatteryVoltageState, "GetBatteryVoltageState"}, + {13, nullptr, "GetRawBatteryChargePercentage"}, + {14, nullptr, "IsEnoughPowerSupplied"}, + {15, &PSM::GetBatteryAgePercentage, "GetBatteryAgePercentage"}, + {16, nullptr, "GetBatteryChargeInfoEvent"}, + {17, &PSM::GetBatteryChargeInfoFields, "GetBatteryChargeInfoFields"}, + {18, nullptr, "GetBatteryChargeCalibratedEvent"}, + }; + // clang-format on + + RegisterHandlers(functions); } PSM::~PSM() = default; diff --git a/src/core/hle/service/ptm/psm.h b/src/core/hle/service/ptm/psm.h index fe77b23d79..77c38d1f9b 100644 --- a/src/core/hle/service/ptm/psm.h +++ b/src/core/hle/service/ptm/psm.h @@ -28,31 +28,6 @@ private: void GetBatteryVoltageState(HLERequestContext& ctx); void GetBatteryAgePercentage(HLERequestContext& ctx); void GetBatteryChargeInfoFields(HLERequestContext& ctx); - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &PSM::GetBatteryChargePercentage, "GetBatteryChargePercentage"}, - FunctionInfo{1, &PSM::GetChargerType, "GetChargerType"}, - FunctionInfo{2, nullptr, "EnableBatteryCharging"}, - FunctionInfo{3, nullptr, "DisableBatteryCharging"}, - FunctionInfo{4, nullptr, "IsBatteryChargingEnabled"}, - FunctionInfo{5, nullptr, "AcquireControllerPowerSupply"}, - FunctionInfo{6, nullptr, "ReleaseControllerPowerSupply"}, - FunctionInfo{7, &PSM::OpenSession, "OpenSession"}, - FunctionInfo{8, nullptr, "EnableEnoughPowerChargeEmulation"}, - FunctionInfo{9, nullptr, "DisableEnoughPowerChargeEmulation"}, - FunctionInfo{10, nullptr, "EnableFastBatteryCharging"}, - FunctionInfo{11, nullptr, "DisableFastBatteryCharging"}, - FunctionInfo{12, &PSM::GetBatteryVoltageState, "GetBatteryVoltageState"}, - FunctionInfo{13, nullptr, "GetRawBatteryChargePercentage"}, - FunctionInfo{14, nullptr, "IsEnoughPowerSupplied"}, - FunctionInfo{15, &PSM::GetBatteryAgePercentage, "GetBatteryAgePercentage"}, - FunctionInfo{16, nullptr, "GetBatteryChargeInfoEvent"}, - FunctionInfo{17, &PSM::GetBatteryChargeInfoFields, "GetBatteryChargeInfoFields"}, - FunctionInfo{18, nullptr, "GetBatteryChargeCalibratedEvent"} - ); }; } // namespace Service::PTM diff --git a/src/core/hle/service/ptm/ptm.cpp b/src/core/hle/service/ptm/ptm.cpp index ad474ec411..de1d34a688 100644 --- a/src/core/hle/service/ptm/ptm.cpp +++ b/src/core/hle/service/ptm/ptm.cpp @@ -17,28 +17,28 @@ namespace Service::PTM { class PSM_MANU final : public ServiceFramework { public: explicit PSM_MANU(Core::System& system_) - : ServiceFramework{system_, "psm:manu"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "EnableVdd50StateControl"}, - FunctionInfo{1, nullptr, "DisableVdd50StateControl"}, - FunctionInfo{2, nullptr, "SetVdd50State"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "psm:manu"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "EnableVdd50StateControl"}, + {1, nullptr, "DisableVdd50StateControl"}, + {2, nullptr, "SetVdd50State"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class POWCTL final : public ServiceFramework { public: explicit POWCTL(Core::System& system_) - : ServiceFramework{system_, "powctl"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenSession"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "powctl"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "OpenSession"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/ptm/ptm.h b/src/core/hle/service/ptm/ptm.h index a0ae03d282..a62877e441 100644 --- a/src/core/hle/service/ptm/ptm.h +++ b/src/core/hle/service/ptm/ptm.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/ptm/ts.cpp b/src/core/hle/service/ptm/ts.cpp index f22ff2ec69..b1ac0c8f11 100644 --- a/src/core/hle/service/ptm/ts.cpp +++ b/src/core/hle/service/ptm/ts.cpp @@ -19,10 +19,16 @@ enum class Location : u8 { class ISession : public ServiceFramework { public: - explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} {} + explicit ISession(Core::System& system_) : ServiceFramework{system_, "ISession"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetTemperatureRange"}, + {2, nullptr, "SetMeasurementMode"}, + {4, &ISession::GetTemperature, "GetTemperature"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -33,15 +39,20 @@ private: rb.Push(ResultSuccess); rb.Push(temperature); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetTemperatureRange"}, - FunctionInfo{2, nullptr, "SetMeasurementMode"}, - FunctionInfo{4, &ISession::GetTemperature, "GetTemperature"} - ); }; TS::TS(Core::System& system_) : ServiceFramework{system_, "ts"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetTemperatureRange"}, + {1, &TS::GetTemperature, "GetTemperature"}, + {2, nullptr, "SetMeasurementMode"}, + {3, &TS::GetTemperatureMilliC, "GetTemperatureMilliC"}, + {4, &TS::OpenSession, "OpenSession"}, + }; + // clang-format on + + RegisterHandlers(functions); } TS::~TS() = default; diff --git a/src/core/hle/service/ptm/ts.h b/src/core/hle/service/ptm/ts.h index 21f3ac2b70..d8a0d49bf8 100644 --- a/src/core/hle/service/ptm/ts.h +++ b/src/core/hle/service/ptm/ts.h @@ -20,17 +20,6 @@ private: void GetTemperature(HLERequestContext& ctx); void GetTemperatureMilliC(HLERequestContext& ctx); void OpenSession(HLERequestContext& ctx); - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetTemperatureRange"}, - FunctionInfo{1, &TS::GetTemperature, "GetTemperature"}, - FunctionInfo{2, nullptr, "SetMeasurementMode"}, - FunctionInfo{3, &TS::GetTemperatureMilliC, "GetTemperatureMilliC"}, - FunctionInfo{4, &TS::OpenSession, "OpenSession"} - ); }; } // namespace Service::PTM diff --git a/src/core/hle/service/ro/ro.cpp b/src/core/hle/service/ro/ro.cpp index 838ff136f6..167bf04c9a 100644 --- a/src/core/hle/service/ro/ro.cpp +++ b/src/core/hle/service/ro/ro.cpp @@ -8,334 +8,21 @@ #include #include "core/hle/kernel/k_process.h" + +#include "core/hle/service/cmif_serialization.h" #include "core/hle/service/ro/ro.h" +#include "core/hle/service/ro/ro_nro_utils.h" +#include "core/hle/service/ro/ro_results.h" +#include "core/hle/service/ro/ro_types.h" #include "core/hle/service/server_manager.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 -#include "core/hle/service/cmif_serialization.h" namespace Service::RO { -constexpr Result ResultOutOfAddressSpace{ErrorModule::RO, 2}; -constexpr Result ResultAlreadyLoaded{ErrorModule::RO, 3}; -constexpr Result ResultInvalidNro{ErrorModule::RO, 4}; -constexpr Result ResultInvalidNrr{ErrorModule::RO, 6}; -constexpr Result ResultTooManyNro{ErrorModule::RO, 7}; -constexpr Result ResultTooManyNrr{ErrorModule::RO, 8}; -constexpr Result ResultNotAuthorized{ErrorModule::RO, 9}; -constexpr Result ResultInvalidNrrKind{ErrorModule::RO, 10}; -constexpr Result ResultInternalError{ErrorModule::RO, 1023}; -constexpr Result ResultInvalidAddress{ErrorModule::RO, 1025}; -constexpr Result ResultInvalidSize{ErrorModule::RO, 1026}; -constexpr Result ResultNotLoaded{ErrorModule::RO, 1028}; -constexpr Result ResultNotRegistered{ErrorModule::RO, 1029}; -constexpr Result ResultInvalidSession{ErrorModule::RO, 1030}; -constexpr Result ResultInvalidProcess{ErrorModule::RO, 1031}; - -namespace { - -struct ProcessMemoryRegion { - u64 address; - u64 size; -}; - -size_t GetTotalProcessMemoryRegionSize(const ProcessMemoryRegion* regions, size_t num_regions) { - size_t total = 0; - - for (size_t i = 0; i < num_regions; ++i) { - total += regions[i].size; - } - - return total; -} - -size_t SetupNroProcessMemoryRegions(ProcessMemoryRegion* regions, u64 nro_heap_address, - u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) { - // Reset region count. - size_t num_regions = 0; - - // We always want a region for the nro. - regions[num_regions++] = {nro_heap_address, nro_heap_size}; - - // If we have bss, create a region for bss. - if (bss_heap_size > 0) { - regions[num_regions++] = {bss_heap_address, bss_heap_size}; - } - - return num_regions; -} - -Result SetProcessMemoryPermission(Kernel::KProcess* process, u64 address, u64 size, - Kernel::Svc::MemoryPermission permission) { - auto& page_table = process->GetPageTable(); - - // Set permission. - R_RETURN(page_table.SetProcessMemoryPermission(address, size, permission)); -} - -Result UnmapProcessCodeMemory(Kernel::KProcess* process, u64 process_code_address, - const ProcessMemoryRegion* regions, size_t num_regions) { - // Get the total process memory region size. - const size_t total_size = GetTotalProcessMemoryRegionSize(regions, num_regions); - - auto& page_table = process->GetPageTable(); - - // Unmap each region in order. - size_t cur_offset = total_size; - for (size_t i = 0; i < num_regions; ++i) { - // We want to unmap in reverse order. - const auto& cur_region = regions[num_regions - 1 - i]; - - // Subtract to update the current offset. - cur_offset -= cur_region.size; - - // Unmap. - R_TRY(page_table.UnmapCodeMemory(process_code_address + cur_offset, cur_region.address, - cur_region.size)); - } - - R_SUCCEED(); -} - -Result EnsureGuardPages(Kernel::KProcessPageTable& page_table, u64 map_address, u64 map_size) { - Kernel::KMemoryInfo memory_info; - Kernel::Svc::PageInfo page_info; - - // Ensure page before mapping is unmapped. - R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info), - map_address - 1)); - R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free, - Kernel::ResultInvalidState); - - // Ensure page after mapping is unmapped. - R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info), - map_address + map_size)); - R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free, - Kernel::ResultInvalidState); - - // Successfully verified guard pages. - R_SUCCEED(); -} - -Result MapProcessCodeMemory(u64* out, Kernel::KProcess* process, const ProcessMemoryRegion* regions, - size_t num_regions, std::mt19937_64& generate_random) { - auto& page_table = process->GetPageTable(); - const u64 alias_code_start = - GetInteger(page_table.GetAliasCodeRegionStart()) / Kernel::PageSize; - const u64 alias_code_size = page_table.GetAliasCodeRegionSize() / Kernel::PageSize; - - for (size_t trial = 0; trial < 64; trial++) { - // Generate a new trial address. - const u64 mapped_address = - (alias_code_start + (generate_random() % alias_code_size)) * Kernel::PageSize; - - const auto MapRegions = [&] { - // Map the regions in order. - u64 mapped_size = 0; - for (size_t i = 0; i < num_regions; ++i) { - // If we fail, unmap up to where we've mapped. - ON_RESULT_FAILURE { - R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, i)); - }; - - // Map the current region. - R_TRY(page_table.MapCodeMemory(mapped_address + mapped_size, regions[i].address, - regions[i].size)); - - mapped_size += regions[i].size; - } - - // If we fail, unmap all mapped regions. - ON_RESULT_FAILURE { - R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, num_regions)); - }; - - // Ensure guard pages. - R_RETURN(EnsureGuardPages(page_table, mapped_address, mapped_size)); - }; - - if (R_SUCCEEDED(MapRegions())) { - // Set the output address. - *out = mapped_address; - R_SUCCEED(); - } - } - - // We failed to map anything. - R_THROW(RO::ResultOutOfAddressSpace); -} - -Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address, - u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size, - std::mt19937_64& generate_random) { - // Set up the process memory regions. - std::array regions{}; - const size_t num_regions = SetupNroProcessMemoryRegions( - regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size); - - // Re-map the nro/bss as code memory in the destination process. - R_RETURN(MapProcessCodeMemory(out_base_address, process, regions.data(), num_regions, - generate_random)); -} - -Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size, - u64 rw_size) { - const u64 rx_offset = 0; - const u64 ro_offset = rx_offset + rx_size; - const u64 rw_offset = ro_offset + ro_size; - - R_TRY(SetProcessMemoryPermission(process, base_address + rx_offset, rx_size, - Kernel::Svc::MemoryPermission::ReadExecute)); - R_TRY(SetProcessMemoryPermission(process, base_address + ro_offset, ro_size, - Kernel::Svc::MemoryPermission::Read)); - R_TRY(SetProcessMemoryPermission(process, base_address + rw_offset, rw_size, - Kernel::Svc::MemoryPermission::ReadWrite)); - - R_SUCCEED(); -} - -Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address, - u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) { - // Set up the process memory regions. - std::array regions{}; - const size_t num_regions = SetupNroProcessMemoryRegions( - regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size); - - // Unmap the nro/bss. - R_RETURN(UnmapProcessCodeMemory(process, base_address, regions.data(), num_regions)); -} - -} // namespace - -enum class NrrKind : u8 { - User = 0, - JitPlugin = 1, - Count, -}; - -static constexpr size_t ModuleIdSize = 0x20; -struct ModuleId { - std::array data; -}; -static_assert(sizeof(ModuleId) == ModuleIdSize); - -struct NrrCertification { - static constexpr size_t RsaKeySize = 0x100; - static constexpr size_t SignedSize = 0x120; - - u64 program_id_mask; - u64 program_id_pattern; - std::array reserved_10; - std::array modulus; - std::array signature; -}; -static_assert(sizeof(NrrCertification) == NrrCertification::RsaKeySize + NrrCertification::SignedSize); - -class NrrHeader { -public: - static constexpr u32 Magic = Common::MakeMagic('N', 'R', 'R', '0'); - -public: - bool IsMagicValid() const { - return m_magic == Magic; - } - - bool IsProgramIdValid() const { - return (m_program_id & m_certification.program_id_mask) == - m_certification.program_id_pattern; - } - - NrrKind GetNrrKind() const { - const NrrKind kind = static_cast(m_nrr_kind); - ASSERT(kind < NrrKind::Count); - return kind; - } - - u64 GetProgramId() const { - return m_program_id; - } - - u32 GetSize() const { - return m_size; - } - - u32 GetNumHashes() const { - return m_num_hashes; - } - - size_t GetHashesOffset() const { - return m_hashes_offset; - } - - u32 GetKeyGeneration() const { - return m_key_generation; - } - - const u8* GetCertificationSignature() const { - return m_certification.signature.data(); - } - - const u8* GetCertificationSignedArea() const { - return reinterpret_cast(std::addressof(m_certification)); - } - - const u8* GetCertificationModulus() const { - return m_certification.modulus.data(); - } - - const u8* GetSignature() const { - return m_signature.data(); - } - - size_t GetSignedAreaSize() const { - return m_size - GetSignedAreaOffset(); - } - - static constexpr size_t GetSignedAreaOffset() { - return offsetof(NrrHeader, m_program_id); - } - -private: - u32 m_magic; - u32 m_key_generation; - INSERT_PADDING_BYTES_NOINIT(8); - NrrCertification m_certification; - std::array m_signature; - u64 m_program_id; - u32 m_size; - u8 m_nrr_kind; // 7.0.0+ - INSERT_PADDING_BYTES_NOINIT(3); - u32 m_hashes_offset; - u32 m_num_hashes; - INSERT_PADDING_BYTES_NOINIT(8); -}; -static_assert(sizeof(NrrHeader) == 0x350, "NrrHeader has wrong size"); - -static constexpr u32 NRO_HEADER_MAGIC = Common::MakeMagic('N', 'R', 'O', '0'); -struct NroHeader { - u32 m_entrypoint_insn; - u32 m_mod_offset; - INSERT_PADDING_BYTES_NOINIT(0x8); - u32 m_magic; - INSERT_PADDING_BYTES_NOINIT(0x4); - u32 m_size; - INSERT_PADDING_BYTES_NOINIT(0x4); - u32 m_text_offset; - u32 m_text_size; - u32 m_ro_offset; - u32 m_ro_size; - u32 m_rw_offset; - u32 m_rw_size; - u32 m_bss_size; - INSERT_PADDING_BYTES_NOINIT(0x4); - ModuleId m_module_id; - INSERT_PADDING_BYTES_NOINIT(0x20); -}; -static_assert(sizeof(NroHeader) == 0x80, "NroHeader has wrong size"); - namespace { // Atmosphere defines as follows: @@ -848,21 +535,29 @@ private: class RoInterface : public ServiceFramework { public: - explicit RoInterface(Core::System& system_, const char* name_, std::shared_ptr ro, NrrKind nrr_kind) - : ServiceFramework{system_, name_} - , m_ro(ro) - , m_context_id(InvalidContextId) - , m_nrr_kind(nrr_kind) - {} + explicit RoInterface(Core::System& system_, const char* name_, std::shared_ptr ro, + NrrKind nrr_kind) + : ServiceFramework{system_, name_}, m_ro(ro), m_context_id(InvalidContextId), + m_nrr_kind(nrr_kind) { + + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&RoInterface::MapManualLoadModuleMemory>, "MapManualLoadModuleMemory"}, + {1, C<&RoInterface::UnmapManualLoadModuleMemory>, "UnmapManualLoadModuleMemory"}, + {2, C<&RoInterface::RegisterModuleInfo>, "RegisterModuleInfo"}, + {3, C<&RoInterface::UnregisterModuleInfo>, "UnregisterModuleInfo"}, + {4, C<&RoInterface::RegisterProcessHandle>, "RegisterProcessHandle"}, + {10, C<&RoInterface::RegisterProcessModuleInfo>, "RegisterProcessModuleInfo"}, + }; + // clang-format on + + RegisterHandlers(functions); + } ~RoInterface() { m_ro->UnregisterProcess(system.Kernel(), m_context_id); } - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - Result MapManualLoadModuleMemory(Out out_load_address, ClientProcessId client_pid, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) { R_TRY(m_ro->ValidateProcess(m_context_id, *client_pid)); @@ -899,14 +594,6 @@ public: } private: - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&RoInterface::MapManualLoadModuleMemory>, "MapManualLoadModuleMemory"}, - FunctionInfo{1, C<&RoInterface::UnmapManualLoadModuleMemory>, "UnmapManualLoadModuleMemory"}, - FunctionInfo{2, C<&RoInterface::RegisterModuleInfo>, "RegisterModuleInfo"}, - FunctionInfo{3, C<&RoInterface::UnregisterModuleInfo>, "UnregisterModuleInfo"}, - FunctionInfo{4, C<&RoInterface::RegisterProcessHandle>, "RegisterProcessHandle"}, - FunctionInfo{10, C<&RoInterface::RegisterProcessModuleInfo>, "RegisterProcessModuleInfo"} - ); std::shared_ptr m_ro{}; size_t m_context_id{}; NrrKind m_nrr_kind{}; @@ -919,14 +606,12 @@ class IDebugMonitorInterface final : public ServiceFramework FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "GetProcessModuleInfo" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetProcessModuleInfo" } - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/ro/ro.h b/src/core/hle/service/ro/ro.h index 74dc085368..c93aac3833 100644 --- a/src/core/hle/service/ro/ro.h +++ b/src/core/hle/service/ro/ro.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/ro/ro_nro_utils.cpp b/src/core/hle/service/ro/ro_nro_utils.cpp new file mode 100644 index 0000000000..1c2a97619d --- /dev/null +++ b/src/core/hle/service/ro/ro_nro_utils.cpp @@ -0,0 +1,188 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 + +#include "core/hle/kernel/k_process.h" +#include "core/hle/service/ro/ro_nro_utils.h" +#include "core/hle/service/ro/ro_results.h" + +namespace Service::RO { + +namespace { + +struct ProcessMemoryRegion { + u64 address; + u64 size; +}; + +size_t GetTotalProcessMemoryRegionSize(const ProcessMemoryRegion* regions, size_t num_regions) { + size_t total = 0; + + for (size_t i = 0; i < num_regions; ++i) { + total += regions[i].size; + } + + return total; +} + +size_t SetupNroProcessMemoryRegions(ProcessMemoryRegion* regions, u64 nro_heap_address, + u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) { + // Reset region count. + size_t num_regions = 0; + + // We always want a region for the nro. + regions[num_regions++] = {nro_heap_address, nro_heap_size}; + + // If we have bss, create a region for bss. + if (bss_heap_size > 0) { + regions[num_regions++] = {bss_heap_address, bss_heap_size}; + } + + return num_regions; +} + +Result SetProcessMemoryPermission(Kernel::KProcess* process, u64 address, u64 size, + Kernel::Svc::MemoryPermission permission) { + auto& page_table = process->GetPageTable(); + + // Set permission. + R_RETURN(page_table.SetProcessMemoryPermission(address, size, permission)); +} + +Result UnmapProcessCodeMemory(Kernel::KProcess* process, u64 process_code_address, + const ProcessMemoryRegion* regions, size_t num_regions) { + // Get the total process memory region size. + const size_t total_size = GetTotalProcessMemoryRegionSize(regions, num_regions); + + auto& page_table = process->GetPageTable(); + + // Unmap each region in order. + size_t cur_offset = total_size; + for (size_t i = 0; i < num_regions; ++i) { + // We want to unmap in reverse order. + const auto& cur_region = regions[num_regions - 1 - i]; + + // Subtract to update the current offset. + cur_offset -= cur_region.size; + + // Unmap. + R_TRY(page_table.UnmapCodeMemory(process_code_address + cur_offset, cur_region.address, + cur_region.size)); + } + + R_SUCCEED(); +} + +Result EnsureGuardPages(Kernel::KProcessPageTable& page_table, u64 map_address, u64 map_size) { + Kernel::KMemoryInfo memory_info; + Kernel::Svc::PageInfo page_info; + + // Ensure page before mapping is unmapped. + R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info), + map_address - 1)); + R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free, + Kernel::ResultInvalidState); + + // Ensure page after mapping is unmapped. + R_TRY(page_table.QueryInfo(std::addressof(memory_info), std::addressof(page_info), + map_address + map_size)); + R_UNLESS(memory_info.GetSvcState() == Kernel::Svc::MemoryState::Free, + Kernel::ResultInvalidState); + + // Successfully verified guard pages. + R_SUCCEED(); +} + +Result MapProcessCodeMemory(u64* out, Kernel::KProcess* process, const ProcessMemoryRegion* regions, + size_t num_regions, std::mt19937_64& generate_random) { + auto& page_table = process->GetPageTable(); + const u64 alias_code_start = + GetInteger(page_table.GetAliasCodeRegionStart()) / Kernel::PageSize; + const u64 alias_code_size = page_table.GetAliasCodeRegionSize() / Kernel::PageSize; + + for (size_t trial = 0; trial < 64; trial++) { + // Generate a new trial address. + const u64 mapped_address = + (alias_code_start + (generate_random() % alias_code_size)) * Kernel::PageSize; + + const auto MapRegions = [&] { + // Map the regions in order. + u64 mapped_size = 0; + for (size_t i = 0; i < num_regions; ++i) { + // If we fail, unmap up to where we've mapped. + ON_RESULT_FAILURE { + R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, i)); + }; + + // Map the current region. + R_TRY(page_table.MapCodeMemory(mapped_address + mapped_size, regions[i].address, + regions[i].size)); + + mapped_size += regions[i].size; + } + + // If we fail, unmap all mapped regions. + ON_RESULT_FAILURE { + R_ASSERT(UnmapProcessCodeMemory(process, mapped_address, regions, num_regions)); + }; + + // Ensure guard pages. + R_RETURN(EnsureGuardPages(page_table, mapped_address, mapped_size)); + }; + + if (R_SUCCEEDED(MapRegions())) { + // Set the output address. + *out = mapped_address; + R_SUCCEED(); + } + } + + // We failed to map anything. + R_THROW(RO::ResultOutOfAddressSpace); +} + +} // namespace + +Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address, + u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size, + std::mt19937_64& generate_random) { + // Set up the process memory regions. + std::array regions{}; + const size_t num_regions = SetupNroProcessMemoryRegions( + regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size); + + // Re-map the nro/bss as code memory in the destination process. + R_RETURN(MapProcessCodeMemory(out_base_address, process, regions.data(), num_regions, + generate_random)); +} + +Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size, + u64 rw_size) { + const u64 rx_offset = 0; + const u64 ro_offset = rx_offset + rx_size; + const u64 rw_offset = ro_offset + ro_size; + + R_TRY(SetProcessMemoryPermission(process, base_address + rx_offset, rx_size, + Kernel::Svc::MemoryPermission::ReadExecute)); + R_TRY(SetProcessMemoryPermission(process, base_address + ro_offset, ro_size, + Kernel::Svc::MemoryPermission::Read)); + R_TRY(SetProcessMemoryPermission(process, base_address + rw_offset, rw_size, + Kernel::Svc::MemoryPermission::ReadWrite)); + + R_SUCCEED(); +} + +Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address, + u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size) { + // Set up the process memory regions. + std::array regions{}; + const size_t num_regions = SetupNroProcessMemoryRegions( + regions.data(), nro_heap_address, nro_heap_size, bss_heap_address, bss_heap_size); + + // Unmap the nro/bss. + R_RETURN(UnmapProcessCodeMemory(process, base_address, regions.data(), num_regions)); +} + +} // namespace Service::RO diff --git a/src/core/hle/service/ro/ro_nro_utils.h b/src/core/hle/service/ro/ro_nro_utils.h new file mode 100644 index 0000000000..32b97abed2 --- /dev/null +++ b/src/core/hle/service/ro/ro_nro_utils.h @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 + +#pragma once + +#include + +#include "common/common_types.h" + +namespace Kernel { +class KProcess; +} + +union Result; + +namespace Service::RO { + +Result MapNro(u64* out_base_address, Kernel::KProcess* process, u64 nro_heap_address, + u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size, + std::mt19937_64& generate_random); +Result SetNroPerms(Kernel::KProcess* process, u64 base_address, u64 rx_size, u64 ro_size, + u64 rw_size); +Result UnmapNro(Kernel::KProcess* process, u64 base_address, u64 nro_heap_address, + u64 nro_heap_size, u64 bss_heap_address, u64 bss_heap_size); + +} // namespace Service::RO diff --git a/src/core/hle/service/ro/ro_results.h b/src/core/hle/service/ro/ro_results.h new file mode 100644 index 0000000000..906378bc7f --- /dev/null +++ b/src/core/hle/service/ro/ro_results.h @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 + +#pragma once + +#include "core/hle/result.h" + +namespace Service::RO { + +constexpr Result ResultOutOfAddressSpace{ErrorModule::RO, 2}; +constexpr Result ResultAlreadyLoaded{ErrorModule::RO, 3}; +constexpr Result ResultInvalidNro{ErrorModule::RO, 4}; +constexpr Result ResultInvalidNrr{ErrorModule::RO, 6}; +constexpr Result ResultTooManyNro{ErrorModule::RO, 7}; +constexpr Result ResultTooManyNrr{ErrorModule::RO, 8}; +constexpr Result ResultNotAuthorized{ErrorModule::RO, 9}; +constexpr Result ResultInvalidNrrKind{ErrorModule::RO, 10}; +constexpr Result ResultInternalError{ErrorModule::RO, 1023}; +constexpr Result ResultInvalidAddress{ErrorModule::RO, 1025}; +constexpr Result ResultInvalidSize{ErrorModule::RO, 1026}; +constexpr Result ResultNotLoaded{ErrorModule::RO, 1028}; +constexpr Result ResultNotRegistered{ErrorModule::RO, 1029}; +constexpr Result ResultInvalidSession{ErrorModule::RO, 1030}; +constexpr Result ResultInvalidProcess{ErrorModule::RO, 1031}; + +} // namespace Service::RO diff --git a/src/core/hle/service/ro/ro_types.h b/src/core/hle/service/ro/ro_types.h new file mode 100644 index 0000000000..8e88f43246 --- /dev/null +++ b/src/core/hle/service/ro/ro_types.h @@ -0,0 +1,142 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 + +#pragma once + +#include "common/assert.h" +#include "common/common_funcs.h" +#include "common/common_types.h" + +namespace Service::RO { + +enum class NrrKind : u8 { + User = 0, + JitPlugin = 1, + Count, +}; + +static constexpr size_t ModuleIdSize = 0x20; +struct ModuleId { + std::array data; +}; +static_assert(sizeof(ModuleId) == ModuleIdSize); + +struct NrrCertification { + static constexpr size_t RsaKeySize = 0x100; + static constexpr size_t SignedSize = 0x120; + + u64 program_id_mask; + u64 program_id_pattern; + std::array reserved_10; + std::array modulus; + std::array signature; +}; +static_assert(sizeof(NrrCertification) == + NrrCertification::RsaKeySize + NrrCertification::SignedSize); + +class NrrHeader { +public: + static constexpr u32 Magic = Common::MakeMagic('N', 'R', 'R', '0'); + +public: + bool IsMagicValid() const { + return m_magic == Magic; + } + + bool IsProgramIdValid() const { + return (m_program_id & m_certification.program_id_mask) == + m_certification.program_id_pattern; + } + + NrrKind GetNrrKind() const { + const NrrKind kind = static_cast(m_nrr_kind); + ASSERT(kind < NrrKind::Count); + return kind; + } + + u64 GetProgramId() const { + return m_program_id; + } + + u32 GetSize() const { + return m_size; + } + + u32 GetNumHashes() const { + return m_num_hashes; + } + + size_t GetHashesOffset() const { + return m_hashes_offset; + } + + u32 GetKeyGeneration() const { + return m_key_generation; + } + + const u8* GetCertificationSignature() const { + return m_certification.signature.data(); + } + + const u8* GetCertificationSignedArea() const { + return reinterpret_cast(std::addressof(m_certification)); + } + + const u8* GetCertificationModulus() const { + return m_certification.modulus.data(); + } + + const u8* GetSignature() const { + return m_signature.data(); + } + + size_t GetSignedAreaSize() const { + return m_size - GetSignedAreaOffset(); + } + + static constexpr size_t GetSignedAreaOffset() { + return offsetof(NrrHeader, m_program_id); + } + +private: + u32 m_magic; + u32 m_key_generation; + INSERT_PADDING_BYTES_NOINIT(8); + NrrCertification m_certification; + std::array m_signature; + u64 m_program_id; + u32 m_size; + u8 m_nrr_kind; // 7.0.0+ + INSERT_PADDING_BYTES_NOINIT(3); + u32 m_hashes_offset; + u32 m_num_hashes; + INSERT_PADDING_BYTES_NOINIT(8); +}; +static_assert(sizeof(NrrHeader) == 0x350, "NrrHeader has wrong size"); + +static constexpr u32 NRO_HEADER_MAGIC = Common::MakeMagic('N', 'R', 'O', '0'); +struct NroHeader { + u32 m_entrypoint_insn; + u32 m_mod_offset; + INSERT_PADDING_BYTES_NOINIT(0x8); + u32 m_magic; + INSERT_PADDING_BYTES_NOINIT(0x4); + u32 m_size; + INSERT_PADDING_BYTES_NOINIT(0x4); + u32 m_text_offset; + u32 m_text_size; + u32 m_ro_offset; + u32 m_ro_size; + u32 m_rw_offset; + u32 m_rw_size; + u32 m_bss_size; + INSERT_PADDING_BYTES_NOINIT(0x4); + ModuleId m_module_id; + INSERT_PADDING_BYTES_NOINIT(0x20); +}; +static_assert(sizeof(NroHeader) == 0x80, "NroHeader has wrong size"); + +} // namespace Service::RO diff --git a/src/core/hle/service/server_manager.h b/src/core/hle/service/server_manager.h index 5173ce46e1..d86d20b7c5 100644 --- a/src/core/hle/service/server_manager.h +++ b/src/core/hle/service/server_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 2c6e8d1c07..225b92a783 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -19,7 +19,6 @@ #include "core/hle/service/service.h" #include "core/hle/service/sm/sm.h" #include "core/reporter.h" -#include "frontend_common/firmware_manager.h" namespace Service { @@ -48,9 +47,24 @@ ServiceFrameworkBase::~ServiceFrameworkBase() { const auto guard = ServiceFrameworkBase::LockService(); } -void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info, bool gated) { +void ServiceFrameworkBase::RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n) { + // Usually this array is sorted by id already, so hint to insert at the end + handlers.reserve(handlers.size() + n); + for (std::size_t i = 0; i < n; ++i) + handlers.emplace_hint(handlers.cend(), functions[i].expected_header, functions[i]); +} + +void ServiceFrameworkBase::RegisterHandlersBaseTipc(const FunctionInfoBase* functions, std::size_t n) { + // Usually this array is sorted by id already, so hint to insert at the end + handlers_tipc.reserve(handlers_tipc.size() + n); + for (std::size_t i = 0; i < n; ++i) + handlers_tipc.emplace_hint(handlers_tipc.cend(), functions[i].expected_header, functions[i]); +} + +void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, + const FunctionInfoBase* info) { auto cmd_buf = ctx.CommandBuffer(); - std::string function_name = bool(info) ? info->name : ""; + std::string function_name = info == nullptr ? "" : info->name; fmt::memory_buffer buf; fmt::format_to(std::back_inserter(buf), "function '{}({})': port='{}' cmd_buf={{[0]={:#x}", ctx.GetCommand(), function_name, service_name, cmd_buf[0]); @@ -59,11 +73,7 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, c buf.push_back('}'); system.GetReporter().SaveUnimplementedFunctionReport(ctx, ctx.GetCommand(), function_name, service_name); - if (gated) { - LOG_ERROR(Service, "Version gated {}", fmt::to_string(buf)); - } else { - UNIMPLEMENTED_MSG("Unknown / unimplemented {}", fmt::to_string(buf)); - } + UNIMPLEMENTED_MSG("Unknown / unimplemented {}", fmt::to_string(buf)); if (Settings::values.use_auto_stub) { LOG_WARNING(Service, "Using auto stub fallback!"); IPC::ResponseBuilder rb{ctx, 2}; @@ -71,33 +81,17 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, c } } -[[nodiscard]] static bool VersionGateCheck(Core::System& system, u32 vg) { - u32 const c_maj = FirmwareManager::GetFirmwareVersion(system).first.major; - u32 const c_min = FirmwareManager::GetFirmwareVersion(system).first.minor; - u32 const c_pat = FirmwareManager::GetFirmwareVersion(system).first.micro; - u32 const cg = (c_pat << 0) | (c_min << 4) | (c_maj << 8); - u32 const sg = (vg >> 16) & 0xffff; - u32 const ug = vg & 0xffff; - // feature available after current - if (sg && cg < sg) - return false; - // feature until xxx (0 = up to current) - return ug ? ug >= cg : true; -} - void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) { - const bool is_cmd_read = ctx.GetCommand() == 0; - auto const info = FindRequest(ctx.GetCommand()); - if (!info.has_value() || info->handler_callback == nullptr) - return ReportUnimplementedFunction(ctx, &*info, false); - - if (!VersionGateCheck(system, info->version_gating)) - { - return ReportUnimplementedFunction(ctx, &*info, true); - } + const auto command = ctx.GetCommand(); + auto it = handlers.find(command); + const bool is_cmd_read = command == 0; + FunctionInfoBase const* info = it == handlers.end() ? nullptr : &it->second; + if (info == nullptr || info->handler_callback == nullptr) + return ReportUnimplementedFunction(ctx, info); LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer())); handler_invoker(this, info->handler_callback, ctx); + if (is_i_storage && is_cmd_read) { const auto* const process = ctx.GetThread().GetOwnerProcess(); if (process != nullptr && system.IsNVDECActiveForProcess(process->GetId())) { @@ -107,15 +101,10 @@ void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) { } void ServiceFrameworkBase::InvokeRequestTipc(HLERequestContext& ctx) { - auto const info = FindRequestTipc(ctx.GetCommand()); - if (!info.has_value() || info->handler_callback == nullptr) - return ReportUnimplementedFunction(ctx, &*info, false); - - LOG_ERROR(Service, "check for {} version_gating: {}", info->name, info->version_gating); - if (!VersionGateCheck(system, info->version_gating)) - { - return ReportUnimplementedFunction(ctx, &*info, true); - } + auto it = handlers_tipc.find(ctx.GetCommand()); + FunctionInfoBase const* info = it == handlers_tipc.end() ? nullptr : &it->second; + if (info == nullptr || info->handler_callback == nullptr) + return ReportUnimplementedFunction(ctx, info); LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer())); handler_invoker(this, info->handler_callback, ctx); diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h index e8bd8683ea..ea98897e79 100644 --- a/src/core/hle/service/service.h +++ b/src/core/hle/service/service.h @@ -7,11 +7,7 @@ #pragma once #include -#include #include -#include -#include -#include "frozen/map.h" #include "common/container/unordered_map.h" #include "common/common_types.h" #include "core/hle/service/hle_ipc.h" @@ -81,35 +77,30 @@ protected: [[nodiscard]] virtual std::unique_lock LockService() noexcept { return std::unique_lock{lock_service}; } - - static constexpr u32 MakeVersionGate(std::tuple since, std::tuple until = {0, 0, 0}) { - auto const [s_maj, s_min, s_pat] = since; - auto const [u_maj, u_min, u_pat] = until; - return (u_pat << 0) | (u_min << 4) | (u_maj << 8) - | (s_pat << 16) | (s_min << 20) | (s_maj << 24); - } - - struct FunctionInfoBase { - HandlerFnP handler_callback; - const char* name; - u32 version_gating; - }; - static_assert(std::is_trivially_constructible_v); private: template friend class ServiceFramework; - using InvokerFn = void(ServiceFrameworkBase* object, HandlerFnP member, HLERequestContext& ctx); + struct FunctionInfoBase { + u32 expected_header; + HandlerFnP handler_callback; + const char* name; + }; - explicit ServiceFrameworkBase(Core::System& system_, const char* service_name_, u32 max_sessions_, InvokerFn* handler_invoker_); + using InvokerFn = void(ServiceFrameworkBase* object, HandlerFnP member, + HLERequestContext& ctx); + + explicit ServiceFrameworkBase(Core::System& system_, const char* service_name_, + u32 max_sessions_, InvokerFn* handler_invoker_); ~ServiceFrameworkBase() override; - virtual std::optional FindRequest(u32 key) = 0; - virtual std::optional FindRequestTipc(u32 key) = 0; - - void ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info, bool gated); + void RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n); + void RegisterHandlersBaseTipc(const FunctionInfoBase* functions, std::size_t n); + void ReportUnimplementedFunction(HLERequestContext& ctx, const FunctionInfoBase* info); protected: + ::Common::unordered_map handlers; + ::Common::unordered_map handlers_tipc; /// Used to gain exclusive access to the service members, e.g. from CoreTiming thread. std::mutex lock_service; /// System context that the service operates under. @@ -130,7 +121,8 @@ protected: /** * Framework for implementing HLE services. Dispatches on the header id of incoming SyncRequests * based on a table mapping header ids to handler functions. Service implementations should inherit - * from ServiceFramework using the CRTP (`class Foo : public ServiceFramework { ... };`) + * from ServiceFramework using the CRTP (`class Foo : public ServiceFramework { ... };`) and + * populate it with handlers by calling #RegisterHandlers. * * In order to avoid duplicating code in the binary and exposing too many implementation details in * the header, this class is split into a non-templated base (ServiceFrameworkBase) and a template @@ -151,77 +143,50 @@ protected: /// @param expected_header_ request header in the command buffer which will trigger dispatch to this handler /// @param handler_callback_ member function in this service which will be called to handle the request /// @param name_ human-friendly name for the request. Used mostly for logging purposes. - explicit constexpr FunctionInfoTyped(u32 expected_header_, HandlerFnP handler_callback_, const char* name_, u32 version_gating_ = 0) - : handler_callback{handler_callback_} - , name{name_} - , version_gating{version_gating_} - , expected_header{expected_header_} - {} - HandlerFnP handler_callback; - const char* name; - u32 version_gating; - u32 expected_header; + FunctionInfoTyped(u32 expected_header_, HandlerFnP handler_callback_, const char* name_) + : FunctionInfoBase{expected_header_, HandlerFnP(handler_callback_), name_} {} }; using FunctionInfo = FunctionInfoTyped; - // expected_header serves as a key to 'address' function handlers, thus only include the minimal - template - struct FunctionValueInfo { - explicit constexpr FunctionValueInfo(HandlerFnP handler_callback_, const char* name_, u32 version_gating_) - : handler_callback{handler_callback_} - , name{name_} - , version_gating{version_gating_} - {} - HandlerFnP handler_callback; - const char* name; - u32 version_gating; - }; - - template - //requires (std::same_as && ...) - [[nodiscard]] static consteval frozen::map, sizeof...(Ts)> CreateStaticMap(Ts... args) { - return frozen::map, sizeof...(args)>{ - {args.expected_header, FunctionValueInfo{args.handler_callback, args.name, args.version_gating}}... - }; - } - - // Used exclusively by NFC - template - //requires (std::same_as> && ...) - [[nodiscard]] static consteval frozen::map, sizeof...(Ts)> CreateStaticMapWithClass(Ts... args) { - return frozen::map, sizeof...(args)>{ - {args.expected_header, FunctionValueInfo{args.handler_callback, args.name, args.version_gating}}... - }; - } - - template - [[nodiscard]] static std::optional HandlerTableGenerateWithFind(u32 key, T const& map) { - auto const it = map.find(key); - if (it != map.end()) { - auto const r = it->second; - return std::optional{{ - HandlerFnP(r.handler_callback), - r.name, - r.version_gating - }}; - } - return std::nullopt; - } - - /// @brief Initializes the handler with no functions installed. - /// @param system_ The system context to construct this service under. - /// @param service_name_ Name of the service. - /// @param max_sessions_ Maximum number of sessions that can be connected to this service at the - /// same time. + /** + * Initializes the handler with no functions installed. + * + * @param system_ The system context to construct this service under. + * @param service_name_ Name of the service. + * @param max_sessions_ Maximum number of sessions that can be connected to this service at the + * same time. + */ explicit ServiceFramework(Core::System& system_, const char* service_name_, u32 max_sessions_ = ServerSessionCountMax) - : ServiceFrameworkBase(system_, service_name_, max_sessions_, Invoker) - {} + : ServiceFrameworkBase(system_, service_name_, max_sessions_, Invoker) {} - std::optional FindRequest(u32 key) override { - UNREACHABLE(); + /// Registers handlers in the service. + template + void RegisterHandlers(const FunctionInfoTyped (&functions)[N]) { + RegisterHandlers(functions, N); } - std::optional FindRequestTipc(u32 key) override { - UNREACHABLE(); + + /** + * Registers handlers in the service. Usually prefer using the other RegisterHandlers + * overload in order to avoid needing to specify the array size. + */ + template + void RegisterHandlers(const FunctionInfoTyped* functions, std::size_t n) { + RegisterHandlersBase(functions, n); + } + + /// Registers handlers in the service. + template + void RegisterHandlersTipc(const FunctionInfoTyped (&functions)[N]) { + RegisterHandlersTipc(functions, N); + } + + /** + * Registers handlers in the service. Usually prefer using the other RegisterHandlers + * overload in order to avoid needing to specify the array size. + */ + template + void RegisterHandlersTipc(const FunctionInfoTyped* functions, std::size_t n) { + RegisterHandlersBaseTipc(functions, n); } protected: diff --git a/src/core/hle/service/services.h b/src/core/hle/service/services.h index da5281ff29..4072afa3d1 100644 --- a/src/core/hle/service/services.h +++ b/src/core/hle/service/services.h @@ -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-FileCopyrightText: Copyright 2024 yuzu Emulator Project diff --git a/src/core/hle/service/set/factory_settings_server.cpp b/src/core/hle/service/set/factory_settings_server.cpp index 70d02fab3b..d663283c98 100644 --- a/src/core/hle/service/set/factory_settings_server.cpp +++ b/src/core/hle/service/set/factory_settings_server.cpp @@ -10,6 +10,55 @@ namespace Service::Set { IFactorySettingsServer::IFactorySettingsServer(Core::System& system_) : ServiceFramework{system_, "set:cal"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetBluetoothBdAddress"}, + {1, nullptr, "GetConfigurationId1"}, + {2, nullptr, "GetAccelerometerOffset"}, + {3, nullptr, "GetAccelerometerScale"}, + {4, nullptr, "GetGyroscopeOffset"}, + {5, nullptr, "GetGyroscopeScale"}, + {6, nullptr, "GetWirelessLanMacAddress"}, + {7, nullptr, "GetWirelessLanCountryCodeCount"}, + {8, nullptr, "GetWirelessLanCountryCodes"}, + {9, nullptr, "GetSerialNumber"}, + {10, nullptr, "SetInitialSystemAppletProgramId"}, + {11, nullptr, "SetOverlayDispProgramId"}, + {12, nullptr, "GetBatteryLot"}, + {14, nullptr, "GetEciDeviceCertificate"}, + {15, nullptr, "GetEticketDeviceCertificate"}, + {16, nullptr, "GetSslKey"}, + {17, nullptr, "GetSslCertificate"}, + {18, nullptr, "GetGameCardKey"}, + {19, nullptr, "GetGameCardCertificate"}, + {20, nullptr, "GetEciDeviceKey"}, + {21, nullptr, "GetEticketDeviceKey"}, + {22, nullptr, "GetSpeakerParameter"}, + {23, nullptr, "GetLcdVendorId"}, + {24, nullptr, "GetEciDeviceCertificate2"}, + {25, nullptr, "GetEciDeviceKey2"}, + {26, nullptr, "GetAmiiboKey"}, + {27, nullptr, "GetAmiiboEcqvCertificate"}, + {28, nullptr, "GetAmiiboEcdsaCertificate"}, + {29, nullptr, "GetAmiiboEcqvBlsKey"}, + {30, nullptr, "GetAmiiboEcqvBlsCertificate"}, + {31, nullptr, "GetAmiiboEcqvBlsRootCertificate"}, + {32, nullptr, "GetUsbTypeCPowerSourceCircuitVersion"}, + {33, nullptr, "GetAnalogStickModuleTypeL"}, + {34, nullptr, "GetAnalogStickModelParameterL"}, + {35, nullptr, "GetAnalogStickFactoryCalibrationL"}, + {36, nullptr, "GetAnalogStickModuleTypeR"}, + {37, nullptr, "GetAnalogStickModelParameterR"}, + {38, nullptr, "GetAnalogStickFactoryCalibrationR"}, + {39, nullptr, "GetConsoleSixAxisSensorModuleType"}, + {40, nullptr, "GetConsoleSixAxisSensorHorizontalOffset"}, + {41, nullptr, "GetBatteryVersion"}, + {42, nullptr, "GetDeviceId"}, + {43, nullptr, "GetConsoleSixAxisSensorMountType"}, + }; + // clang-format on + + RegisterHandlers(functions); } IFactorySettingsServer::~IFactorySettingsServer() = default; diff --git a/src/core/hle/service/set/factory_settings_server.h b/src/core/hle/service/set/factory_settings_server.h index dcc329f9c2..ddffcee643 100644 --- a/src/core/hle/service/set/factory_settings_server.h +++ b/src/core/hle/service/set/factory_settings_server.h @@ -18,55 +18,6 @@ class IFactorySettingsServer final : public ServiceFramework FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetBluetoothBdAddress"}, - FunctionInfo{1, nullptr, "GetConfigurationId1"}, - FunctionInfo{2, nullptr, "GetAccelerometerOffset"}, - FunctionInfo{3, nullptr, "GetAccelerometerScale"}, - FunctionInfo{4, nullptr, "GetGyroscopeOffset"}, - FunctionInfo{5, nullptr, "GetGyroscopeScale"}, - FunctionInfo{6, nullptr, "GetWirelessLanMacAddress"}, - FunctionInfo{7, nullptr, "GetWirelessLanCountryCodeCount"}, - FunctionInfo{8, nullptr, "GetWirelessLanCountryCodes"}, - FunctionInfo{9, nullptr, "GetSerialNumber"}, - FunctionInfo{10, nullptr, "SetInitialSystemAppletProgramId"}, - FunctionInfo{11, nullptr, "SetOverlayDispProgramId"}, - FunctionInfo{12, nullptr, "GetBatteryLot"}, - FunctionInfo{14, nullptr, "GetEciDeviceCertificate"}, - FunctionInfo{15, nullptr, "GetEticketDeviceCertificate"}, - FunctionInfo{16, nullptr, "GetSslKey"}, - FunctionInfo{17, nullptr, "GetSslCertificate"}, - FunctionInfo{18, nullptr, "GetGameCardKey"}, - FunctionInfo{19, nullptr, "GetGameCardCertificate"}, - FunctionInfo{20, nullptr, "GetEciDeviceKey"}, - FunctionInfo{21, nullptr, "GetEticketDeviceKey"}, - FunctionInfo{22, nullptr, "GetSpeakerParameter"}, - FunctionInfo{23, nullptr, "GetLcdVendorId"}, - FunctionInfo{24, nullptr, "GetEciDeviceCertificate2"}, - FunctionInfo{25, nullptr, "GetEciDeviceKey2"}, - FunctionInfo{26, nullptr, "GetAmiiboKey"}, - FunctionInfo{27, nullptr, "GetAmiiboEcqvCertificate"}, - FunctionInfo{28, nullptr, "GetAmiiboEcdsaCertificate"}, - FunctionInfo{29, nullptr, "GetAmiiboEcqvBlsKey"}, - FunctionInfo{30, nullptr, "GetAmiiboEcqvBlsCertificate"}, - FunctionInfo{31, nullptr, "GetAmiiboEcqvBlsRootCertificate"}, - FunctionInfo{32, nullptr, "GetUsbTypeCPowerSourceCircuitVersion"}, - FunctionInfo{33, nullptr, "GetAnalogStickModuleTypeL"}, - FunctionInfo{34, nullptr, "GetAnalogStickModelParameterL"}, - FunctionInfo{35, nullptr, "GetAnalogStickFactoryCalibrationL"}, - FunctionInfo{36, nullptr, "GetAnalogStickModuleTypeR"}, - FunctionInfo{37, nullptr, "GetAnalogStickModelParameterR"}, - FunctionInfo{38, nullptr, "GetAnalogStickFactoryCalibrationR"}, - FunctionInfo{39, nullptr, "GetConsoleSixAxisSensorModuleType"}, - FunctionInfo{40, nullptr, "GetConsoleSixAxisSensorHorizontalOffset"}, - FunctionInfo{41, nullptr, "GetBatteryVersion"}, - FunctionInfo{42, nullptr, "GetDeviceId"}, - FunctionInfo{43, nullptr, "GetConsoleSixAxisSensorMountType"} - ); }; } // namespace Service::Set diff --git a/src/core/hle/service/set/firmware_debug_settings_server.cpp b/src/core/hle/service/set/firmware_debug_settings_server.cpp index 35fb43f7e7..c491675567 100644 --- a/src/core/hle/service/set/firmware_debug_settings_server.cpp +++ b/src/core/hle/service/set/firmware_debug_settings_server.cpp @@ -10,6 +10,23 @@ namespace Service::Set { IFirmwareDebugSettingsServer::IFirmwareDebugSettingsServer(Core::System& system_) : ServiceFramework{system_, "set:fd"} { + // clang-format off + static const FunctionInfo functions[] = { + {2, nullptr, "SetSettingsItemValue"}, + {3, nullptr, "ResetSettingsItemValue"}, + {4, nullptr, "CreateSettingsItemKeyIterator"}, + {10, nullptr, "ReadSettings"}, + {11, nullptr, "ResetSettings"}, + {20, nullptr, "SetWebInspectorFlag"}, + {21, nullptr, "SetAllowedSslHosts"}, + {22, nullptr, "SetHostFsMountPoint"}, + {23, nullptr, "SetMemoryUsageRateFlag"}, + {24, nullptr, "CommitSettings"}, //20.0.0+ + {27, nullptr, "SetHttpAuthConfigs"}, //21.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); } IFirmwareDebugSettingsServer::~IFirmwareDebugSettingsServer() = default; diff --git a/src/core/hle/service/set/firmware_debug_settings_server.h b/src/core/hle/service/set/firmware_debug_settings_server.h index 3727a1a94c..05019faa9f 100644 --- a/src/core/hle/service/set/firmware_debug_settings_server.h +++ b/src/core/hle/service/set/firmware_debug_settings_server.h @@ -18,23 +18,6 @@ class IFirmwareDebugSettingsServer final : public ServiceFramework FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{2, nullptr, "SetSettingsItemValue"}, - FunctionInfo{3, nullptr, "ResetSettingsItemValue"}, - FunctionInfo{4, nullptr, "CreateSettingsItemKeyIterator"}, - FunctionInfo{10, nullptr, "ReadSettings"}, - FunctionInfo{11, nullptr, "ResetSettings"}, - FunctionInfo{20, nullptr, "SetWebInspectorFlag"}, - FunctionInfo{21, nullptr, "SetAllowedSslHosts"}, - FunctionInfo{22, nullptr, "SetHostFsMountPoint"}, - FunctionInfo{23, nullptr, "SetMemoryUsageRateFlag"}, - FunctionInfo{24, nullptr, "CommitSettings", MakeVersionGate({20,0,0})}, - FunctionInfo{27, nullptr, "SetHttpAuthConfigs", MakeVersionGate({21,0,0})} - ); }; } // namespace Service::Set diff --git a/src/core/hle/service/set/key_code_map.h b/src/core/hle/service/set/key_code_map.h index c76dc57298..8e010e718b 100644 --- a/src/core/hle/service/set/key_code_map.h +++ b/src/core/hle/service/set/key_code_map.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later diff --git a/src/core/hle/service/set/setting_formats/appln_settings.cpp b/src/core/hle/service/set/setting_formats/appln_settings.cpp index f7c7d5b912..5726a41cdf 100644 --- a/src/core/hle/service/set/setting_formats/appln_settings.cpp +++ b/src/core/hle/service/set/setting_formats/appln_settings.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/set/setting_formats/appln_settings.h b/src/core/hle/service/set/setting_formats/appln_settings.h index ba9af998ab..2128a631e0 100644 --- a/src/core/hle/service/set/setting_formats/appln_settings.h +++ b/src/core/hle/service/set/setting_formats/appln_settings.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/set/setting_formats/device_settings.cpp b/src/core/hle/service/set/setting_formats/device_settings.cpp index 5f295404d9..6e9c321d8e 100644 --- a/src/core/hle/service/set/setting_formats/device_settings.cpp +++ b/src/core/hle/service/set/setting_formats/device_settings.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/set/setting_formats/private_settings.cpp b/src/core/hle/service/set/setting_formats/private_settings.cpp index 81c3624826..c3a67b60eb 100644 --- a/src/core/hle/service/set/setting_formats/private_settings.cpp +++ b/src/core/hle/service/set/setting_formats/private_settings.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/set/setting_formats/private_settings.h b/src/core/hle/service/set/setting_formats/private_settings.h index 6579e95e04..75e3e03886 100644 --- a/src/core/hle/service/set/setting_formats/private_settings.h +++ b/src/core/hle/service/set/setting_formats/private_settings.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/set/setting_formats/system_settings.cpp b/src/core/hle/service/set/setting_formats/system_settings.cpp index 258e213e13..fd70e2ace3 100644 --- a/src/core/hle/service/set/setting_formats/system_settings.cpp +++ b/src/core/hle/service/set/setting_formats/system_settings.cpp @@ -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-FileCopyrightText: Copyright 2018 yuzu Emulator Project diff --git a/src/core/hle/service/set/settings.h b/src/core/hle/service/set/settings.h index 03cd4bb661..e6288af2e5 100644 --- a/src/core/hle/service/set/settings.h +++ b/src/core/hle/service/set/settings.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/set/settings_server.cpp b/src/core/hle/service/set/settings_server.cpp index 4580cb723b..942dddc9bc 100644 --- a/src/core/hle/service/set/settings_server.cpp +++ b/src/core/hle/service/set/settings_server.cpp @@ -89,26 +89,26 @@ LanguageCode GetLanguageCodeFromIndex(std::size_t index) { return available_language_codes.at(index); } -std::optional ISettingsServer::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&ISettingsServer::GetLanguageCode>, "GetLanguageCode"}, - FunctionInfo{1, C<&ISettingsServer::GetAvailableLanguageCodes>, "GetAvailableLanguageCodes"}, - FunctionInfo{2, C<&ISettingsServer::MakeLanguageCode>, "MakeLanguageCode"}, - FunctionInfo{3, C<&ISettingsServer::GetAvailableLanguageCodeCount>, "GetAvailableLanguageCodeCount"}, - FunctionInfo{4, C<&ISettingsServer::GetRegionCode>, "GetRegionCode"}, - FunctionInfo{5, C<&ISettingsServer::GetAvailableLanguageCodes2>, "GetAvailableLanguageCodes2"}, - FunctionInfo{6, C<&ISettingsServer::GetAvailableLanguageCodeCount2>, "GetAvailableLanguageCodeCount2"}, - FunctionInfo{7, C<&ISettingsServer::GetKeyCodeMap>, "GetKeyCodeMap"}, - FunctionInfo{8, C<&ISettingsServer::GetQuestFlag>, "GetQuestFlag"}, - FunctionInfo{9, C<&ISettingsServer::GetKeyCodeMap2>, "GetKeyCodeMap2"}, - FunctionInfo{10, nullptr, "GetFirmwareVersionForDebug"}, - FunctionInfo{11, C<&ISettingsServer::GetDeviceNickName>, "GetDeviceNickName"}, - FunctionInfo{12, C<&ISettingsServer::GetKeyCodeMapByPort>, "GetKeyCodeMapByPort"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - ISettingsServer::ISettingsServer(Core::System& system_) : ServiceFramework{system_, "set"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&ISettingsServer::GetLanguageCode>, "GetLanguageCode"}, + {1, C<&ISettingsServer::GetAvailableLanguageCodes>, "GetAvailableLanguageCodes"}, + {2, C<&ISettingsServer::MakeLanguageCode>, "MakeLanguageCode"}, + {3, C<&ISettingsServer::GetAvailableLanguageCodeCount>, "GetAvailableLanguageCodeCount"}, + {4, C<&ISettingsServer::GetRegionCode>, "GetRegionCode"}, + {5, C<&ISettingsServer::GetAvailableLanguageCodes2>, "GetAvailableLanguageCodes2"}, + {6, C<&ISettingsServer::GetAvailableLanguageCodeCount2>, "GetAvailableLanguageCodeCount2"}, + {7, C<&ISettingsServer::GetKeyCodeMap>, "GetKeyCodeMap"}, + {8, C<&ISettingsServer::GetQuestFlag>, "GetQuestFlag"}, + {9, C<&ISettingsServer::GetKeyCodeMap2>, "GetKeyCodeMap2"}, + {10, nullptr, "GetFirmwareVersionForDebug"}, + {11, C<&ISettingsServer::GetDeviceNickName>, "GetDeviceNickName"}, + {12, C<&ISettingsServer::GetKeyCodeMapByPort>, "GetKeyCodeMapByPort"}, + }; + // clang-format on + + RegisterHandlers(functions); } ISettingsServer::~ISettingsServer() = default; diff --git a/src/core/hle/service/set/settings_server.h b/src/core/hle/service/set/settings_server.h index 2aa487b8b1..c37a65cbc9 100644 --- a/src/core/hle/service/set/settings_server.h +++ b/src/core/hle/service/set/settings_server.h @@ -26,19 +26,31 @@ public: private: Result GetLanguageCode(Out out_language_code); - Result GetAvailableLanguageCodes(Out out_count, OutArray language_codes); - Result MakeLanguageCode(Out out_language_code, Language language); - Result GetAvailableLanguageCodeCount(Out out_count); - Result GetRegionCode(Out out_region_code); - Result GetAvailableLanguageCodes2(Out out_count, OutArray language_codes); - Result GetAvailableLanguageCodeCount2(Out out_count); - Result GetKeyCodeMap(OutLargeData out_key_code_map); - Result GetQuestFlag(Out out_quest_flag); - Result GetKeyCodeMap2(OutLargeData out_key_code_map); - Result GetDeviceNickName(OutLargeData, BufferAttr_HipcMapAlias> out_device_name); - Result GetKeyCodeMapByPort(OutLargeData out_key_code_map, u32 port); - std::optional FindRequest(u32 key) override; + Result GetAvailableLanguageCodes(Out out_count, + OutArray language_codes); + + Result MakeLanguageCode(Out out_language_code, Language language); + + Result GetAvailableLanguageCodeCount(Out out_count); + + Result GetRegionCode(Out out_region_code); + + Result GetAvailableLanguageCodes2( + Out out_count, OutArray language_codes); + + Result GetAvailableLanguageCodeCount2(Out out_count); + + Result GetKeyCodeMap(OutLargeData out_key_code_map); + + Result GetQuestFlag(Out out_quest_flag); + + Result GetKeyCodeMap2(OutLargeData out_key_code_map); + + Result GetDeviceNickName( + OutLargeData, BufferAttr_HipcMapAlias> out_device_name); + + Result GetKeyCodeMapByPort(OutLargeData out_key_code_map, u32 port); }; } // namespace Service::Set diff --git a/src/core/hle/service/set/system_settings_server.cpp b/src/core/hle/service/set/system_settings_server.cpp index 925207d927..52642e37f7 100644 --- a/src/core/hle/service/set/system_settings_server.cpp +++ b/src/core/hle/service/set/system_settings_server.cpp @@ -114,239 +114,240 @@ Result GetFirmwareVersionImpl(FirmwareVersionFormat& out_firmware, Core::System& return ResultSuccess; } -std::optional ISystemSettingsServer::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&ISystemSettingsServer::SetLanguageCode>, "SetLanguageCode"}, - FunctionInfo{1, nullptr, "SetNetworkSettings"}, - FunctionInfo{2, nullptr, "GetNetworkSettings"}, - FunctionInfo{3, C<&ISystemSettingsServer::GetFirmwareVersion>, "GetFirmwareVersion"}, - FunctionInfo{4, C<&ISystemSettingsServer::GetFirmwareVersion2>, "GetFirmwareVersion2"}, - FunctionInfo{5, nullptr, "GetFirmwareVersionDigest"}, - FunctionInfo{7, C<&ISystemSettingsServer::GetLockScreenFlag>, "GetLockScreenFlag"}, - FunctionInfo{8, C<&ISystemSettingsServer::SetLockScreenFlag>, "SetLockScreenFlag"}, - FunctionInfo{9, nullptr, "GetBacklightSettings"}, - FunctionInfo{10, nullptr, "SetBacklightSettings"}, - FunctionInfo{11, nullptr, "SetBluetoothDevicesSettings"}, - FunctionInfo{12, nullptr, "GetBluetoothDevicesSettings"}, - FunctionInfo{13, C<&ISystemSettingsServer::GetExternalSteadyClockSourceId>, "GetExternalSteadyClockSourceId"}, - FunctionInfo{14, C<&ISystemSettingsServer::SetExternalSteadyClockSourceId>, "SetExternalSteadyClockSourceId"}, - FunctionInfo{15, C<&ISystemSettingsServer::GetUserSystemClockContext>, "GetUserSystemClockContext"}, - FunctionInfo{16, C<&ISystemSettingsServer::SetUserSystemClockContext>, "SetUserSystemClockContext"}, - FunctionInfo{17, C<&ISystemSettingsServer::GetAccountSettings>, "GetAccountSettings"}, - FunctionInfo{18, C<&ISystemSettingsServer::SetAccountSettings>, "SetAccountSettings"}, - FunctionInfo{19, nullptr, "GetAudioVolume"}, - FunctionInfo{20, nullptr, "SetAudioVolume"}, - FunctionInfo{21, C<&ISystemSettingsServer::GetEulaVersions>, "GetEulaVersions"}, - FunctionInfo{22, C<&ISystemSettingsServer::SetEulaVersions>, "SetEulaVersions"}, - FunctionInfo{23, C<&ISystemSettingsServer::GetColorSetId>, "GetColorSetId"}, - FunctionInfo{24, C<&ISystemSettingsServer::SetColorSetId>, "SetColorSetId"}, - FunctionInfo{25, C<&ISystemSettingsServer::GetConsoleInformationUploadFlag>, "GetConsoleInformationUploadFlag"}, - FunctionInfo{26, C<&ISystemSettingsServer::SetConsoleInformationUploadFlag>, "SetConsoleInformationUploadFlag"}, - FunctionInfo{27, C<&ISystemSettingsServer::GetAutomaticApplicationDownloadFlag>, "GetAutomaticApplicationDownloadFlag"}, - FunctionInfo{28, C<&ISystemSettingsServer::SetAutomaticApplicationDownloadFlag>, "SetAutomaticApplicationDownloadFlag"}, - FunctionInfo{29, C<&ISystemSettingsServer::GetNotificationSettings>, "GetNotificationSettings"}, - FunctionInfo{30, C<&ISystemSettingsServer::SetNotificationSettings>, "SetNotificationSettings"}, - FunctionInfo{31, C<&ISystemSettingsServer::GetAccountNotificationSettings>, "GetAccountNotificationSettings"}, - FunctionInfo{32, C<&ISystemSettingsServer::SetAccountNotificationSettings>, "SetAccountNotificationSettings"}, - FunctionInfo{35, C<&ISystemSettingsServer::GetVibrationMasterVolume>, "GetVibrationMasterVolume"}, - FunctionInfo{36, C<&ISystemSettingsServer::SetVibrationMasterVolume>, "SetVibrationMasterVolume"}, - FunctionInfo{37, C<&ISystemSettingsServer::GetSettingsItemValueSize>, "GetSettingsItemValueSize"}, - FunctionInfo{38, C<&ISystemSettingsServer::GetSettingsItemValue>, "GetSettingsItemValue"}, - FunctionInfo{39, C<&ISystemSettingsServer::GetTvSettings>, "GetTvSettings"}, - FunctionInfo{40, C<&ISystemSettingsServer::SetTvSettings>, "SetTvSettings"}, - FunctionInfo{41, nullptr, "GetEdid"}, - FunctionInfo{42, nullptr, "SetEdid"}, - FunctionInfo{43, C<&ISystemSettingsServer::GetAudioOutputMode>, "GetAudioOutputMode"}, - FunctionInfo{44, C<&ISystemSettingsServer::SetAudioOutputMode>, "SetAudioOutputMode"}, - FunctionInfo{45, C<&ISystemSettingsServer::GetSpeakerAutoMuteFlag>, "GetSpeakerAutoMuteFlag"}, - FunctionInfo{46, C<&ISystemSettingsServer::SetSpeakerAutoMuteFlag>, "SetSpeakerAutoMuteFlag"}, - FunctionInfo{47, C<&ISystemSettingsServer::GetQuestFlag>, "GetQuestFlag"}, - FunctionInfo{48, C<&ISystemSettingsServer::SetQuestFlag>, "SetQuestFlag"}, - FunctionInfo{49, nullptr, "GetDataDeletionSettings"}, - FunctionInfo{50, nullptr, "SetDataDeletionSettings"}, - FunctionInfo{51, nullptr, "GetInitialSystemAppletProgramId"}, - FunctionInfo{52, nullptr, "GetOverlayDispProgramId"}, - FunctionInfo{53, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationName>, "GetDeviceTimeZoneLocationName"}, - FunctionInfo{54, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationName>, "SetDeviceTimeZoneLocationName"}, - FunctionInfo{55, nullptr, "GetWirelessCertificationFileSize"}, - FunctionInfo{56, nullptr, "GetWirelessCertificationFile"}, - FunctionInfo{57, C<&ISystemSettingsServer::SetRegionCode>, "SetRegionCode"}, - FunctionInfo{58, C<&ISystemSettingsServer::GetNetworkSystemClockContext>, "GetNetworkSystemClockContext"}, - FunctionInfo{59, C<&ISystemSettingsServer::SetNetworkSystemClockContext>, "SetNetworkSystemClockContext"}, - FunctionInfo{60, C<&ISystemSettingsServer::IsUserSystemClockAutomaticCorrectionEnabled>, "IsUserSystemClockAutomaticCorrectionEnabled"}, - FunctionInfo{61, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionEnabled>, "SetUserSystemClockAutomaticCorrectionEnabled"}, - FunctionInfo{62, C<&ISystemSettingsServer::GetDebugModeFlag>, "GetDebugModeFlag"}, - FunctionInfo{63, C<&ISystemSettingsServer::GetPrimaryAlbumStorage>, "GetPrimaryAlbumStorage"}, - FunctionInfo{64, C<&ISystemSettingsServer::SetPrimaryAlbumStorage>, "SetPrimaryAlbumStorage"}, - FunctionInfo{65, C<&ISystemSettingsServer::GetUsb30EnableFlag>, "GetUsb30EnableFlag"}, - FunctionInfo{66, C<&ISystemSettingsServer::SetUsb30EnableFlag>, "SetUsb30EnableFlag"}, - FunctionInfo{67, C<&ISystemSettingsServer::GetBatteryLot>, "GetBatteryLot"}, - FunctionInfo{68, C<&ISystemSettingsServer::GetSerialNumber>, "GetSerialNumber"}, - FunctionInfo{69, C<&ISystemSettingsServer::GetNfcEnableFlag>, "GetNfcEnableFlag"}, - FunctionInfo{70, C<&ISystemSettingsServer::SetNfcEnableFlag>, "SetNfcEnableFlag"}, - FunctionInfo{71, C<&ISystemSettingsServer::GetSleepSettings>, "GetSleepSettings"}, - FunctionInfo{72, C<&ISystemSettingsServer::SetSleepSettings>, "SetSleepSettings"}, - FunctionInfo{73, C<&ISystemSettingsServer::GetWirelessLanEnableFlag>, "GetWirelessLanEnableFlag"}, - FunctionInfo{74, C<&ISystemSettingsServer::SetWirelessLanEnableFlag>, "SetWirelessLanEnableFlag"}, - FunctionInfo{75, C<&ISystemSettingsServer::GetInitialLaunchSettings>, "GetInitialLaunchSettings"}, - FunctionInfo{76, C<&ISystemSettingsServer::SetInitialLaunchSettings>, "SetInitialLaunchSettings"}, - FunctionInfo{77, C<&ISystemSettingsServer::GetDeviceNickName>, "GetDeviceNickName"}, - FunctionInfo{78, C<&ISystemSettingsServer::SetDeviceNickName>, "SetDeviceNickName"}, - FunctionInfo{79, C<&ISystemSettingsServer::GetProductModel>, "GetProductModel"}, - FunctionInfo{80, nullptr, "GetLdnChannel"}, - FunctionInfo{81, nullptr, "SetLdnChannel"}, - FunctionInfo{82, nullptr, "AcquireTelemetryDirtyFlagEventHandle"}, - FunctionInfo{83, nullptr, "GetTelemetryDirtyFlags"}, - FunctionInfo{84, nullptr, "GetPtmBatteryLot"}, - FunctionInfo{85, nullptr, "SetPtmBatteryLot"}, - FunctionInfo{86, nullptr, "GetPtmFuelGaugeParameter"}, - FunctionInfo{87, nullptr, "SetPtmFuelGaugeParameter"}, - FunctionInfo{88, C<&ISystemSettingsServer::GetBluetoothEnableFlag>, "GetBluetoothEnableFlag"}, - FunctionInfo{89, C<&ISystemSettingsServer::SetBluetoothEnableFlag>, "SetBluetoothEnableFlag"}, - FunctionInfo{90, C<&ISystemSettingsServer::GetMiiAuthorId>, "GetMiiAuthorId"}, - FunctionInfo{91, nullptr, "SetShutdownRtcValue"}, - FunctionInfo{92, nullptr, "GetShutdownRtcValue"}, - FunctionInfo{93, nullptr, "AcquireFatalDirtyFlagEventHandle"}, - FunctionInfo{94, nullptr, "GetFatalDirtyFlags"}, - FunctionInfo{95, C<&ISystemSettingsServer::GetAutoUpdateEnableFlag>, "GetAutoUpdateEnableFlag"}, - FunctionInfo{96, C<&ISystemSettingsServer::SetAutoUpdateEnableFlag>, "SetAutoUpdateEnableFlag"}, - FunctionInfo{97, nullptr, "GetNxControllerSettings"}, - FunctionInfo{98, nullptr, "SetNxControllerSettings"}, - FunctionInfo{99, C<&ISystemSettingsServer::GetBatteryPercentageFlag>, "GetBatteryPercentageFlag"}, - FunctionInfo{100, C<&ISystemSettingsServer::SetBatteryPercentageFlag>, "SetBatteryPercentageFlag"}, - FunctionInfo{101, nullptr, "GetExternalRtcResetFlag"}, - FunctionInfo{102, nullptr, "SetExternalRtcResetFlag"}, - FunctionInfo{103, nullptr, "GetUsbFullKeyEnableFlag"}, - FunctionInfo{104, nullptr, "SetUsbFullKeyEnableFlag"}, - FunctionInfo{105, C<&ISystemSettingsServer::SetExternalSteadyClockInternalOffset>, "SetExternalSteadyClockInternalOffset"}, - FunctionInfo{106, C<&ISystemSettingsServer::GetExternalSteadyClockInternalOffset>, "GetExternalSteadyClockInternalOffset"}, - FunctionInfo{107, nullptr, "GetBacklightSettingsEx"}, - FunctionInfo{108, nullptr, "SetBacklightSettingsEx"}, - FunctionInfo{109, nullptr, "GetHeadphoneVolumeWarningCount"}, - FunctionInfo{110, nullptr, "SetHeadphoneVolumeWarningCount"}, - FunctionInfo{111, nullptr, "GetBluetoothAfhEnableFlag"}, - FunctionInfo{112, nullptr, "SetBluetoothAfhEnableFlag"}, - FunctionInfo{113, nullptr, "GetBluetoothBoostEnableFlag"}, - FunctionInfo{114, nullptr, "SetBluetoothBoostEnableFlag"}, - FunctionInfo{115, nullptr, "GetInRepairProcessEnableFlag"}, - FunctionInfo{116, nullptr, "SetInRepairProcessEnableFlag"}, - FunctionInfo{117, nullptr, "GetHeadphoneVolumeUpdateFlag"}, - FunctionInfo{118, nullptr, "SetHeadphoneVolumeUpdateFlag"}, - FunctionInfo{119, nullptr, "NeedsToUpdateHeadphoneVolume"}, - FunctionInfo{120, C<&ISystemSettingsServer::GetPushNotificationActivityModeOnSleep>, "GetPushNotificationActivityModeOnSleep"}, - FunctionInfo{121, C<&ISystemSettingsServer::SetPushNotificationActivityModeOnSleep>, "SetPushNotificationActivityModeOnSleep"}, - FunctionInfo{122, nullptr, "GetServiceDiscoveryControlSettings"}, - FunctionInfo{123, nullptr, "SetServiceDiscoveryControlSettings"}, - FunctionInfo{124, C<&ISystemSettingsServer::GetErrorReportSharePermission>, "GetErrorReportSharePermission"}, - FunctionInfo{125, C<&ISystemSettingsServer::SetErrorReportSharePermission>, "SetErrorReportSharePermission"}, - FunctionInfo{126, C<&ISystemSettingsServer::GetAppletLaunchFlags>, "GetAppletLaunchFlags"}, - FunctionInfo{127, C<&ISystemSettingsServer::SetAppletLaunchFlags>, "SetAppletLaunchFlags"}, - FunctionInfo{128, nullptr, "GetConsoleSixAxisSensorAccelerationBias"}, - FunctionInfo{129, nullptr, "SetConsoleSixAxisSensorAccelerationBias"}, - FunctionInfo{130, nullptr, "GetConsoleSixAxisSensorAngularVelocityBias"}, - FunctionInfo{131, nullptr, "SetConsoleSixAxisSensorAngularVelocityBias"}, - FunctionInfo{132, nullptr, "GetConsoleSixAxisSensorAccelerationGain"}, - FunctionInfo{133, nullptr, "SetConsoleSixAxisSensorAccelerationGain"}, - FunctionInfo{134, nullptr, "GetConsoleSixAxisSensorAngularVelocityGain"}, - FunctionInfo{135, nullptr, "SetConsoleSixAxisSensorAngularVelocityGain"}, - FunctionInfo{136, C<&ISystemSettingsServer::GetKeyboardLayout>, "GetKeyboardLayout"}, - FunctionInfo{137, C<&ISystemSettingsServer::SetKeyboardLayout>, "SetKeyboardLayout"}, - FunctionInfo{138, nullptr, "GetWebInspectorFlag"}, - FunctionInfo{139, nullptr, "GetAllowedSslHosts"}, - FunctionInfo{140, nullptr, "GetHostFsMountPoint"}, - FunctionInfo{141, nullptr, "GetRequiresRunRepairTimeReviser"}, - FunctionInfo{142, nullptr, "SetRequiresRunRepairTimeReviser"}, - FunctionInfo{143, nullptr, "SetBlePairingSettings"}, - FunctionInfo{144, nullptr, "GetBlePairingSettings"}, - FunctionInfo{145, nullptr, "GetConsoleSixAxisSensorAngularVelocityTimeBias"}, - FunctionInfo{146, nullptr, "SetConsoleSixAxisSensorAngularVelocityTimeBias"}, - FunctionInfo{147, nullptr, "GetConsoleSixAxisSensorAngularAcceleration"}, - FunctionInfo{148, nullptr, "SetConsoleSixAxisSensorAngularAcceleration"}, - FunctionInfo{149, C<&ISystemSettingsServer::GetRebootlessSystemUpdateVersion>, "GetRebootlessSystemUpdateVersion"}, - FunctionInfo{150, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime>, "GetDeviceTimeZoneLocationUpdatedTime"}, - FunctionInfo{151, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime>, "SetDeviceTimeZoneLocationUpdatedTime"}, - FunctionInfo{152, C<&ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime>, "GetUserSystemClockAutomaticCorrectionUpdatedTime"}, - FunctionInfo{153, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionUpdatedTime>, "SetUserSystemClockAutomaticCorrectionUpdatedTime"}, - FunctionInfo{154, nullptr, "GetAccountOnlineStorageSettings"}, - FunctionInfo{155, nullptr, "SetAccountOnlineStorageSettings"}, - FunctionInfo{156, nullptr, "GetPctlReadyFlag"}, - FunctionInfo{157, nullptr, "SetPctlReadyFlag"}, - FunctionInfo{158, nullptr, "GetAnalogStickUserCalibrationL"}, - FunctionInfo{159, nullptr, "SetAnalogStickUserCalibrationL"}, - FunctionInfo{160, nullptr, "GetAnalogStickUserCalibrationR"}, - FunctionInfo{161, nullptr, "SetAnalogStickUserCalibrationR"}, - FunctionInfo{162, nullptr, "GetPtmBatteryVersion"}, - FunctionInfo{163, nullptr, "SetPtmBatteryVersion"}, - FunctionInfo{164, nullptr, "GetUsb30HostEnableFlag"}, - FunctionInfo{165, nullptr, "SetUsb30HostEnableFlag"}, - FunctionInfo{166, nullptr, "GetUsb30DeviceEnableFlag"}, - FunctionInfo{167, nullptr, "SetUsb30DeviceEnableFlag"}, - FunctionInfo{168, nullptr, "GetThemeId"}, - FunctionInfo{169, nullptr, "SetThemeId"}, - FunctionInfo{170, C<&ISystemSettingsServer::GetChineseTraditionalInputMethod>, "GetChineseTraditionalInputMethod"}, - FunctionInfo{171, nullptr, "SetChineseTraditionalInputMethod"}, - FunctionInfo{172, nullptr, "GetPtmCycleCountReliability"}, - FunctionInfo{173, nullptr, "SetPtmCycleCountReliability"}, - FunctionInfo{174, C<&ISystemSettingsServer::GetHomeMenuScheme>, "GetHomeMenuScheme"}, - FunctionInfo{175, nullptr, "GetThemeSettings"}, - FunctionInfo{176, nullptr, "SetThemeSettings"}, - FunctionInfo{177, nullptr, "GetThemeKey"}, - FunctionInfo{178, nullptr, "SetThemeKey"}, - FunctionInfo{179, nullptr, "GetZoomFlag"}, - FunctionInfo{180, nullptr, "SetZoomFlag"}, - FunctionInfo{181, nullptr, "GetT"}, - FunctionInfo{182, nullptr, "SetT"}, - FunctionInfo{183, C<&ISystemSettingsServer::GetPlatformRegion>, "GetPlatformRegion"}, - FunctionInfo{184, C<&ISystemSettingsServer::SetPlatformRegion>, "SetPlatformRegion"}, - FunctionInfo{185, C<&ISystemSettingsServer::GetHomeMenuSchemeModel>, "GetHomeMenuSchemeModel"}, - FunctionInfo{186, nullptr, "GetMemoryUsageRateFlag"}, - FunctionInfo{187, C<&ISystemSettingsServer::GetTouchScreenMode>, "GetTouchScreenMode"}, - FunctionInfo{188, C<&ISystemSettingsServer::SetTouchScreenMode>, "SetTouchScreenMode"}, - FunctionInfo{189, nullptr, "GetButtonConfigSettingsFull"}, - FunctionInfo{190, nullptr, "SetButtonConfigSettingsFull"}, - FunctionInfo{191, nullptr, "GetButtonConfigSettingsEmbedded"}, - FunctionInfo{192, nullptr, "SetButtonConfigSettingsEmbedded"}, - FunctionInfo{193, nullptr, "GetButtonConfigSettingsLeft"}, - FunctionInfo{194, nullptr, "SetButtonConfigSettingsLeft"}, - FunctionInfo{195, nullptr, "GetButtonConfigSettingsRight"}, - FunctionInfo{196, nullptr, "SetButtonConfigSettingsRight"}, - FunctionInfo{197, nullptr, "GetButtonConfigRegisteredSettingsEmbedded"}, - FunctionInfo{198, nullptr, "SetButtonConfigRegisteredSettingsEmbedded"}, - FunctionInfo{199, nullptr, "GetButtonConfigRegisteredSettings"}, - FunctionInfo{200, nullptr, "SetButtonConfigRegisteredSettings"}, - FunctionInfo{201, C<&ISystemSettingsServer::GetFieldTestingFlag>, "GetFieldTestingFlag"}, - FunctionInfo{202, nullptr, "SetFieldTestingFlag"}, - FunctionInfo{203, C<&ISystemSettingsServer::GetPanelCrcMode>, "GetPanelCrcMode"}, - FunctionInfo{204, C<&ISystemSettingsServer::SetPanelCrcMode>, "SetPanelCrcMode"}, - FunctionInfo{205, nullptr, "GetNxControllerSettingsEx"}, - FunctionInfo{206, nullptr, "SetNxControllerSettingsEx"}, - FunctionInfo{207, nullptr, "GetHearingProtectionSafeguardFlag"}, - FunctionInfo{208, nullptr, "SetHearingProtectionSafeguardFlag"}, - FunctionInfo{209, nullptr, "GetHearingProtectionSafeguardRemainingTime"}, - FunctionInfo{210, nullptr, "SetHearingProtectionSafeguardRemainingTime"}, - FunctionInfo{221, nullptr, "GetForceMonauralOutputFlag", MakeVersionGate({17,0,0})}, - FunctionInfo{222, nullptr, "SetForceMonauralOutputFlag", MakeVersionGate({17,0,0})}, - FunctionInfo{251, nullptr, "GetAccountIdentificationSettings", MakeVersionGate({18,0,0})}, - FunctionInfo{252, nullptr, "SetAccountIdentificationSettings", MakeVersionGate({18,0,0})}, - FunctionInfo{263, nullptr, "AcquireVphymDirtyFlagEventHandle", MakeVersionGate({20,0,0})}, - FunctionInfo{264, nullptr, "GetVphymDirtyFlags", MakeVersionGate({20,0,0})}, - FunctionInfo{282, nullptr, "ConvertToProductModel", MakeVersionGate({20,0,0})}, - FunctionInfo{283, nullptr, "ConvertToProductModelName", MakeVersionGate({20,0,0})}, - FunctionInfo{289, nullptr, "GetDefaultAccountIdentificationFlagSet", MakeVersionGate({20,0,0})}, - FunctionInfo{300, nullptr, "AcquirePushNotificationDirtyFlagEventHandle", MakeVersionGate({20,0,0})}, - FunctionInfo{301, nullptr, "GetPushNotificationDirtyFlags", MakeVersionGate({20,0,0})}, - FunctionInfo{306, nullptr, "GetPinCodeReregistrationGuideAccounts", MakeVersionGate({20,0,0})}, - FunctionInfo{307, nullptr, "SetPinCodeReregistrationGuideAccounts", MakeVersionGate({20,0,0})}, - FunctionInfo{315, C<&ISystemSettingsServer::GetHttpAuthConfigs>, "GetHttpAuthConfigs", MakeVersionGate({21,0,0})}, - FunctionInfo{319, C<&ISystemSettingsServer::GetAccountUserSettings>, "GetAccountUserSettings", MakeVersionGate({21,0,0})}, - FunctionInfo{320, nullptr, "SetAccountUserSettings", MakeVersionGate({21,0,0})}, - FunctionInfo{321, C<&ISystemSettingsServer::GetDefaultAccountUserSettings>, "GetDefaultAccountUserSettings", MakeVersionGate({21,0,0})} - ); - return HandlerTableGenerateWithFind(key, functions); -} - ISystemSettingsServer::ISystemSettingsServer(Core::System& system_) - : ServiceFramework{system_, "set:sys"} { + : ServiceFramework{system_, "set:sys"}, m_system{system} { + // clang-format off + static const FunctionInfo functions[] = { + {0, C<&ISystemSettingsServer::SetLanguageCode>, "SetLanguageCode"}, + {1, nullptr, "SetNetworkSettings"}, + {2, nullptr, "GetNetworkSettings"}, + {3, C<&ISystemSettingsServer::GetFirmwareVersion>, "GetFirmwareVersion"}, + {4, C<&ISystemSettingsServer::GetFirmwareVersion2>, "GetFirmwareVersion2"}, + {5, nullptr, "GetFirmwareVersionDigest"}, + {7, C<&ISystemSettingsServer::GetLockScreenFlag>, "GetLockScreenFlag"}, + {8, C<&ISystemSettingsServer::SetLockScreenFlag>, "SetLockScreenFlag"}, + {9, nullptr, "GetBacklightSettings"}, + {10, nullptr, "SetBacklightSettings"}, + {11, nullptr, "SetBluetoothDevicesSettings"}, + {12, nullptr, "GetBluetoothDevicesSettings"}, + {13, C<&ISystemSettingsServer::GetExternalSteadyClockSourceId>, "GetExternalSteadyClockSourceId"}, + {14, C<&ISystemSettingsServer::SetExternalSteadyClockSourceId>, "SetExternalSteadyClockSourceId"}, + {15, C<&ISystemSettingsServer::GetUserSystemClockContext>, "GetUserSystemClockContext"}, + {16, C<&ISystemSettingsServer::SetUserSystemClockContext>, "SetUserSystemClockContext"}, + {17, C<&ISystemSettingsServer::GetAccountSettings>, "GetAccountSettings"}, + {18, C<&ISystemSettingsServer::SetAccountSettings>, "SetAccountSettings"}, + {19, nullptr, "GetAudioVolume"}, + {20, nullptr, "SetAudioVolume"}, + {21, C<&ISystemSettingsServer::GetEulaVersions>, "GetEulaVersions"}, + {22, C<&ISystemSettingsServer::SetEulaVersions>, "SetEulaVersions"}, + {23, C<&ISystemSettingsServer::GetColorSetId>, "GetColorSetId"}, + {24, C<&ISystemSettingsServer::SetColorSetId>, "SetColorSetId"}, + {25, C<&ISystemSettingsServer::GetConsoleInformationUploadFlag>, "GetConsoleInformationUploadFlag"}, + {26, C<&ISystemSettingsServer::SetConsoleInformationUploadFlag>, "SetConsoleInformationUploadFlag"}, + {27, C<&ISystemSettingsServer::GetAutomaticApplicationDownloadFlag>, "GetAutomaticApplicationDownloadFlag"}, + {28, C<&ISystemSettingsServer::SetAutomaticApplicationDownloadFlag>, "SetAutomaticApplicationDownloadFlag"}, + {29, C<&ISystemSettingsServer::GetNotificationSettings>, "GetNotificationSettings"}, + {30, C<&ISystemSettingsServer::SetNotificationSettings>, "SetNotificationSettings"}, + {31, C<&ISystemSettingsServer::GetAccountNotificationSettings>, "GetAccountNotificationSettings"}, + {32, C<&ISystemSettingsServer::SetAccountNotificationSettings>, "SetAccountNotificationSettings"}, + {35, C<&ISystemSettingsServer::GetVibrationMasterVolume>, "GetVibrationMasterVolume"}, + {36, C<&ISystemSettingsServer::SetVibrationMasterVolume>, "SetVibrationMasterVolume"}, + {37, C<&ISystemSettingsServer::GetSettingsItemValueSize>, "GetSettingsItemValueSize"}, + {38, C<&ISystemSettingsServer::GetSettingsItemValue>, "GetSettingsItemValue"}, + {39, C<&ISystemSettingsServer::GetTvSettings>, "GetTvSettings"}, + {40, C<&ISystemSettingsServer::SetTvSettings>, "SetTvSettings"}, + {41, nullptr, "GetEdid"}, + {42, nullptr, "SetEdid"}, + {43, C<&ISystemSettingsServer::GetAudioOutputMode>, "GetAudioOutputMode"}, + {44, C<&ISystemSettingsServer::SetAudioOutputMode>, "SetAudioOutputMode"}, + {45, C<&ISystemSettingsServer::GetSpeakerAutoMuteFlag>, "GetSpeakerAutoMuteFlag"}, + {46, C<&ISystemSettingsServer::SetSpeakerAutoMuteFlag>, "SetSpeakerAutoMuteFlag"}, + {47, C<&ISystemSettingsServer::GetQuestFlag>, "GetQuestFlag"}, + {48, C<&ISystemSettingsServer::SetQuestFlag>, "SetQuestFlag"}, + {49, nullptr, "GetDataDeletionSettings"}, + {50, nullptr, "SetDataDeletionSettings"}, + {51, nullptr, "GetInitialSystemAppletProgramId"}, + {52, nullptr, "GetOverlayDispProgramId"}, + {53, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationName>, "GetDeviceTimeZoneLocationName"}, + {54, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationName>, "SetDeviceTimeZoneLocationName"}, + {55, nullptr, "GetWirelessCertificationFileSize"}, + {56, nullptr, "GetWirelessCertificationFile"}, + {57, C<&ISystemSettingsServer::SetRegionCode>, "SetRegionCode"}, + {58, C<&ISystemSettingsServer::GetNetworkSystemClockContext>, "GetNetworkSystemClockContext"}, + {59, C<&ISystemSettingsServer::SetNetworkSystemClockContext>, "SetNetworkSystemClockContext"}, + {60, C<&ISystemSettingsServer::IsUserSystemClockAutomaticCorrectionEnabled>, "IsUserSystemClockAutomaticCorrectionEnabled"}, + {61, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionEnabled>, "SetUserSystemClockAutomaticCorrectionEnabled"}, + {62, C<&ISystemSettingsServer::GetDebugModeFlag>, "GetDebugModeFlag"}, + {63, C<&ISystemSettingsServer::GetPrimaryAlbumStorage>, "GetPrimaryAlbumStorage"}, + {64, C<&ISystemSettingsServer::SetPrimaryAlbumStorage>, "SetPrimaryAlbumStorage"}, + {65, C<&ISystemSettingsServer::GetUsb30EnableFlag>, "GetUsb30EnableFlag"}, + {66, C<&ISystemSettingsServer::SetUsb30EnableFlag>, "SetUsb30EnableFlag"}, + {67, C<&ISystemSettingsServer::GetBatteryLot>, "GetBatteryLot"}, + {68, C<&ISystemSettingsServer::GetSerialNumber>, "GetSerialNumber"}, + {69, C<&ISystemSettingsServer::GetNfcEnableFlag>, "GetNfcEnableFlag"}, + {70, C<&ISystemSettingsServer::SetNfcEnableFlag>, "SetNfcEnableFlag"}, + {71, C<&ISystemSettingsServer::GetSleepSettings>, "GetSleepSettings"}, + {72, C<&ISystemSettingsServer::SetSleepSettings>, "SetSleepSettings"}, + {73, C<&ISystemSettingsServer::GetWirelessLanEnableFlag>, "GetWirelessLanEnableFlag"}, + {74, C<&ISystemSettingsServer::SetWirelessLanEnableFlag>, "SetWirelessLanEnableFlag"}, + {75, C<&ISystemSettingsServer::GetInitialLaunchSettings>, "GetInitialLaunchSettings"}, + {76, C<&ISystemSettingsServer::SetInitialLaunchSettings>, "SetInitialLaunchSettings"}, + {77, C<&ISystemSettingsServer::GetDeviceNickName>, "GetDeviceNickName"}, + {78, C<&ISystemSettingsServer::SetDeviceNickName>, "SetDeviceNickName"}, + {79, C<&ISystemSettingsServer::GetProductModel>, "GetProductModel"}, + {80, nullptr, "GetLdnChannel"}, + {81, nullptr, "SetLdnChannel"}, + {82, nullptr, "AcquireTelemetryDirtyFlagEventHandle"}, + {83, nullptr, "GetTelemetryDirtyFlags"}, + {84, nullptr, "GetPtmBatteryLot"}, + {85, nullptr, "SetPtmBatteryLot"}, + {86, nullptr, "GetPtmFuelGaugeParameter"}, + {87, nullptr, "SetPtmFuelGaugeParameter"}, + {88, C<&ISystemSettingsServer::GetBluetoothEnableFlag>, "GetBluetoothEnableFlag"}, + {89, C<&ISystemSettingsServer::SetBluetoothEnableFlag>, "SetBluetoothEnableFlag"}, + {90, C<&ISystemSettingsServer::GetMiiAuthorId>, "GetMiiAuthorId"}, + {91, nullptr, "SetShutdownRtcValue"}, + {92, nullptr, "GetShutdownRtcValue"}, + {93, nullptr, "AcquireFatalDirtyFlagEventHandle"}, + {94, nullptr, "GetFatalDirtyFlags"}, + {95, C<&ISystemSettingsServer::GetAutoUpdateEnableFlag>, "GetAutoUpdateEnableFlag"}, + {96, C<&ISystemSettingsServer::SetAutoUpdateEnableFlag>, "SetAutoUpdateEnableFlag"}, + {97, nullptr, "GetNxControllerSettings"}, + {98, nullptr, "SetNxControllerSettings"}, + {99, C<&ISystemSettingsServer::GetBatteryPercentageFlag>, "GetBatteryPercentageFlag"}, + {100, C<&ISystemSettingsServer::SetBatteryPercentageFlag>, "SetBatteryPercentageFlag"}, + {101, nullptr, "GetExternalRtcResetFlag"}, + {102, nullptr, "SetExternalRtcResetFlag"}, + {103, nullptr, "GetUsbFullKeyEnableFlag"}, + {104, nullptr, "SetUsbFullKeyEnableFlag"}, + {105, C<&ISystemSettingsServer::SetExternalSteadyClockInternalOffset>, "SetExternalSteadyClockInternalOffset"}, + {106, C<&ISystemSettingsServer::GetExternalSteadyClockInternalOffset>, "GetExternalSteadyClockInternalOffset"}, + {107, nullptr, "GetBacklightSettingsEx"}, + {108, nullptr, "SetBacklightSettingsEx"}, + {109, nullptr, "GetHeadphoneVolumeWarningCount"}, + {110, nullptr, "SetHeadphoneVolumeWarningCount"}, + {111, nullptr, "GetBluetoothAfhEnableFlag"}, + {112, nullptr, "SetBluetoothAfhEnableFlag"}, + {113, nullptr, "GetBluetoothBoostEnableFlag"}, + {114, nullptr, "SetBluetoothBoostEnableFlag"}, + {115, nullptr, "GetInRepairProcessEnableFlag"}, + {116, nullptr, "SetInRepairProcessEnableFlag"}, + {117, nullptr, "GetHeadphoneVolumeUpdateFlag"}, + {118, nullptr, "SetHeadphoneVolumeUpdateFlag"}, + {119, nullptr, "NeedsToUpdateHeadphoneVolume"}, + {120, C<&ISystemSettingsServer::GetPushNotificationActivityModeOnSleep>, "GetPushNotificationActivityModeOnSleep"}, + {121, C<&ISystemSettingsServer::SetPushNotificationActivityModeOnSleep>, "SetPushNotificationActivityModeOnSleep"}, + {122, nullptr, "GetServiceDiscoveryControlSettings"}, + {123, nullptr, "SetServiceDiscoveryControlSettings"}, + {124, C<&ISystemSettingsServer::GetErrorReportSharePermission>, "GetErrorReportSharePermission"}, + {125, C<&ISystemSettingsServer::SetErrorReportSharePermission>, "SetErrorReportSharePermission"}, + {126, C<&ISystemSettingsServer::GetAppletLaunchFlags>, "GetAppletLaunchFlags"}, + {127, C<&ISystemSettingsServer::SetAppletLaunchFlags>, "SetAppletLaunchFlags"}, + {128, nullptr, "GetConsoleSixAxisSensorAccelerationBias"}, + {129, nullptr, "SetConsoleSixAxisSensorAccelerationBias"}, + {130, nullptr, "GetConsoleSixAxisSensorAngularVelocityBias"}, + {131, nullptr, "SetConsoleSixAxisSensorAngularVelocityBias"}, + {132, nullptr, "GetConsoleSixAxisSensorAccelerationGain"}, + {133, nullptr, "SetConsoleSixAxisSensorAccelerationGain"}, + {134, nullptr, "GetConsoleSixAxisSensorAngularVelocityGain"}, + {135, nullptr, "SetConsoleSixAxisSensorAngularVelocityGain"}, + {136, C<&ISystemSettingsServer::GetKeyboardLayout>, "GetKeyboardLayout"}, + {137, C<&ISystemSettingsServer::SetKeyboardLayout>, "SetKeyboardLayout"}, + {138, nullptr, "GetWebInspectorFlag"}, + {139, nullptr, "GetAllowedSslHosts"}, + {140, nullptr, "GetHostFsMountPoint"}, + {141, nullptr, "GetRequiresRunRepairTimeReviser"}, + {142, nullptr, "SetRequiresRunRepairTimeReviser"}, + {143, nullptr, "SetBlePairingSettings"}, + {144, nullptr, "GetBlePairingSettings"}, + {145, nullptr, "GetConsoleSixAxisSensorAngularVelocityTimeBias"}, + {146, nullptr, "SetConsoleSixAxisSensorAngularVelocityTimeBias"}, + {147, nullptr, "GetConsoleSixAxisSensorAngularAcceleration"}, + {148, nullptr, "SetConsoleSixAxisSensorAngularAcceleration"}, + {149, C<&ISystemSettingsServer::GetRebootlessSystemUpdateVersion>, "GetRebootlessSystemUpdateVersion"}, + {150, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime>, "GetDeviceTimeZoneLocationUpdatedTime"}, + {151, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime>, "SetDeviceTimeZoneLocationUpdatedTime"}, + {152, C<&ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime>, "GetUserSystemClockAutomaticCorrectionUpdatedTime"}, + {153, C<&ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionUpdatedTime>, "SetUserSystemClockAutomaticCorrectionUpdatedTime"}, + {154, nullptr, "GetAccountOnlineStorageSettings"}, + {155, nullptr, "SetAccountOnlineStorageSettings"}, + {156, nullptr, "GetPctlReadyFlag"}, + {157, nullptr, "SetPctlReadyFlag"}, + {158, nullptr, "GetAnalogStickUserCalibrationL"}, + {159, nullptr, "SetAnalogStickUserCalibrationL"}, + {160, nullptr, "GetAnalogStickUserCalibrationR"}, + {161, nullptr, "SetAnalogStickUserCalibrationR"}, + {162, nullptr, "GetPtmBatteryVersion"}, + {163, nullptr, "SetPtmBatteryVersion"}, + {164, nullptr, "GetUsb30HostEnableFlag"}, + {165, nullptr, "SetUsb30HostEnableFlag"}, + {166, nullptr, "GetUsb30DeviceEnableFlag"}, + {167, nullptr, "SetUsb30DeviceEnableFlag"}, + {168, nullptr, "GetThemeId"}, + {169, nullptr, "SetThemeId"}, + {170, C<&ISystemSettingsServer::GetChineseTraditionalInputMethod>, "GetChineseTraditionalInputMethod"}, + {171, nullptr, "SetChineseTraditionalInputMethod"}, + {172, nullptr, "GetPtmCycleCountReliability"}, + {173, nullptr, "SetPtmCycleCountReliability"}, + {174, C<&ISystemSettingsServer::GetHomeMenuScheme>, "GetHomeMenuScheme"}, + {175, nullptr, "GetThemeSettings"}, + {176, nullptr, "SetThemeSettings"}, + {177, nullptr, "GetThemeKey"}, + {178, nullptr, "SetThemeKey"}, + {179, nullptr, "GetZoomFlag"}, + {180, nullptr, "SetZoomFlag"}, + {181, nullptr, "GetT"}, + {182, nullptr, "SetT"}, + {183, C<&ISystemSettingsServer::GetPlatformRegion>, "GetPlatformRegion"}, + {184, C<&ISystemSettingsServer::SetPlatformRegion>, "SetPlatformRegion"}, + {185, C<&ISystemSettingsServer::GetHomeMenuSchemeModel>, "GetHomeMenuSchemeModel"}, + {186, nullptr, "GetMemoryUsageRateFlag"}, + {187, C<&ISystemSettingsServer::GetTouchScreenMode>, "GetTouchScreenMode"}, + {188, C<&ISystemSettingsServer::SetTouchScreenMode>, "SetTouchScreenMode"}, + {189, nullptr, "GetButtonConfigSettingsFull"}, + {190, nullptr, "SetButtonConfigSettingsFull"}, + {191, nullptr, "GetButtonConfigSettingsEmbedded"}, + {192, nullptr, "SetButtonConfigSettingsEmbedded"}, + {193, nullptr, "GetButtonConfigSettingsLeft"}, + {194, nullptr, "SetButtonConfigSettingsLeft"}, + {195, nullptr, "GetButtonConfigSettingsRight"}, + {196, nullptr, "SetButtonConfigSettingsRight"}, + {197, nullptr, "GetButtonConfigRegisteredSettingsEmbedded"}, + {198, nullptr, "SetButtonConfigRegisteredSettingsEmbedded"}, + {199, nullptr, "GetButtonConfigRegisteredSettings"}, + {200, nullptr, "SetButtonConfigRegisteredSettings"}, + {201, C<&ISystemSettingsServer::GetFieldTestingFlag>, "GetFieldTestingFlag"}, + {202, nullptr, "SetFieldTestingFlag"}, + {203, C<&ISystemSettingsServer::GetPanelCrcMode>, "GetPanelCrcMode"}, + {204, C<&ISystemSettingsServer::SetPanelCrcMode>, "SetPanelCrcMode"}, + {205, nullptr, "GetNxControllerSettingsEx"}, + {206, nullptr, "SetNxControllerSettingsEx"}, + {207, nullptr, "GetHearingProtectionSafeguardFlag"}, + {208, nullptr, "SetHearingProtectionSafeguardFlag"}, + {209, nullptr, "GetHearingProtectionSafeguardRemainingTime"}, + {210, nullptr, "SetHearingProtectionSafeguardRemainingTime"}, + {221, nullptr, "GetForceMonauralOutputFlag"}, //17.0.0+ + {222, nullptr, "SetForceMonauralOutputFlag"}, //17.0.0+ + {251, nullptr, "GetAccountIdentificationSettings"}, //18.0.0+ + {252, nullptr, "SetAccountIdentificationSettings"}, //18.0.0+ + {263, nullptr, "AcquireVphymDirtyFlagEventHandle"}, //20.0.0+ + {264, nullptr, "GetVphymDirtyFlags"}, //20.0.0+ + {282, nullptr, "ConvertToProductModel"}, //20.0.0+ + {283, nullptr, "ConvertToProductModelName"}, //20.0.0+ + {289, nullptr, "GetDefaultAccountIdentificationFlagSet"}, //20.0.0+ + {300, nullptr, "AcquirePushNotificationDirtyFlagEventHandle"}, //20.0.0+ + {301, nullptr, "GetPushNotificationDirtyFlags"}, //20.0.0+ + {306, nullptr, "GetPinCodeReregistrationGuideAccounts"}, //20.0.0+ + {307, nullptr, "SetPinCodeReregistrationGuideAccounts"}, //20.0.0+ + {315, C<&ISystemSettingsServer::GetHttpAuthConfigs>, "GetHttpAuthConfigs"}, //21.0.0+ + {319, C<&ISystemSettingsServer::GetAccountUserSettings>, "GetAccountUserSettings"}, //21.0.0+ + {320, nullptr, "SetAccountUserSettings"}, //21.0.0+ + {321, C<&ISystemSettingsServer::GetDefaultAccountUserSettings>, "GetDefaultAccountUserSettings"}, //21.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); + SetupSettings(); m_system_settings.region_code = diff --git a/src/core/hle/service/set/system_settings_server.h b/src/core/hle/service/set/system_settings_server.h index 471ed61176..1d56e61f88 100644 --- a/src/core/hle/service/set/system_settings_server.h +++ b/src/core/hle/service/set/system_settings_server.h @@ -179,7 +179,7 @@ private: void StoreSettings(); void SetSaveNeeded(); - std::optional FindRequest(u32 key) override; + Core::System& m_system; SystemSettings m_system_settings{}; PrivateSettings m_private_settings{}; DeviceSettings m_device_settings{}; diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp index 5c196b3218..c75c5437df 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp @@ -18,16 +18,7 @@ #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/server_manager.h" #include "core/hle/service/sm/sm.h" -#include "common/assert.h" -#include "common/logging.h" -#include "core/core.h" -#include "core/hle/kernel/k_client_port.h" -#include "core/hle/kernel/k_port.h" -#include "core/hle/kernel/k_scoped_resource_reservation.h" -#include "core/hle/kernel/k_server_session.h" -#include "core/hle/kernel/k_session.h" -#include "core/hle/service/ipc_helpers.h" -#include "core/hle/service/server_manager.h" +#include "core/hle/service/sm/sm_controller.h" namespace Service::SM { @@ -36,116 +27,6 @@ constexpr Result ResultAlreadyRegistered(ErrorModule::SM, 4); constexpr Result ResultInvalidServiceName(ErrorModule::SM, 6); constexpr Result ResultNotRegistered(ErrorModule::SM, 7); -class Controller final : public ServiceFramework { -public: - // https://switchbrew.org/wiki/IPC_Marshalling - explicit Controller(Core::System& system_) : ServiceFramework{system_, "IpcController"} {} - ~Controller() override = default; - - void ConvertCurrentObjectToDomain(HLERequestContext& ctx) { - ASSERT_MSG(!ctx.GetManager()->IsDomain(), "Session is already a domain"); - LOG_DEBUG(Service, "called, server_session={}", ctx.Session()->GetId()); - ctx.GetManager()->ConvertToDomainOnRequestEnd(); - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(1); // Converted sessions start with 1 request handler - } - - void CloneCurrentObject(HLERequestContext& ctx) { - LOG_DEBUG(Service, "called"); - - auto session_manager = ctx.GetManager(); - - // FIXME: this is duplicated from the SVC, it should just call it instead - // once this is a proper process - - // Reserve a new session from the process resource limit. - Kernel::KScopedResourceReservation session_reservation(system.Kernel(), Kernel::GetCurrentProcessPointer(kernel), Kernel::LimitableResource::SessionCountMax); - ASSERT(session_reservation.Succeeded()); - - // Create the session. - Kernel::KSession* session = Kernel::KSession::Create(kernel); - ASSERT(session != nullptr); - - // Initialize the session. - session->Initialize(kernel, nullptr, 0); - - // Commit the session reservation. - session_reservation.Commit(); - - // Register the session. - Kernel::KSession::Register(kernel, session); - - // Register with server manager. - session_manager->GetServerManager().RegisterSession(&session->GetServerSession(), - session_manager); - - // We succeeded. - IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; - rb.Push(ResultSuccess); - rb.PushMoveObjects(ctx, session->GetClientSession()); - } - - void CloneCurrentObjectEx(HLERequestContext& ctx) { - LOG_DEBUG(Service, "called"); - - CloneCurrentObject(ctx); - } - - void QueryPointerBufferSize(HLERequestContext& ctx) { - LOG_DEBUG(Service, "called"); - - auto* process = Kernel::GetCurrentProcessPointer(kernel); - ASSERT(process != nullptr); - - u32 buffer_size = process->GetPointerBufferSize(); - if (buffer_size > (std::numeric_limits::max)()) { - LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping"); - buffer_size = (std::numeric_limits::max)(); - } - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.Push(static_cast(buffer_size)); - } - - void SetPointerBufferSize(HLERequestContext& ctx) { - LOG_DEBUG(Service, "called"); - - auto* process = Kernel::GetCurrentProcessPointer(kernel); - ASSERT(process != nullptr); - - IPC::RequestParser rp{ctx}; - - u32 requested_size = rp.PopRaw(); - - if (requested_size > (std::numeric_limits::max)()) { - LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF"); - requested_size = (std::numeric_limits::max)(); - } - - process->SetPointerBufferSize(requested_size); - - LOG_INFO(Service, "Pointer buffer size dynamically updated to {:#x} bytes by process", requested_size); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &Controller::ConvertCurrentObjectToDomain, "ConvertCurrentObjectToDomain"}, - FunctionInfo{1, nullptr, "CopyFromCurrentDomain"}, - FunctionInfo{2, &Controller::CloneCurrentObject, "CloneCurrentObject"}, - FunctionInfo{3, &Controller::QueryPointerBufferSize, "QueryPointerBufferSize"}, - FunctionInfo{4, &Controller::CloneCurrentObjectEx, "CloneCurrentObjectEx"}, - FunctionInfo{5, &Controller::SetPointerBufferSize, "SetPointerBufferSize"} //TODO: where does this come from - ); -}; - ServiceManager::ServiceManager(Kernel::KernelCore& kernel_) : kernel{kernel_} { controller_interface = std::make_unique(kernel.System()); } @@ -231,51 +112,6 @@ Result ServiceManager::GetServicePort(Kernel::KClientPort** out_client_port, return ResultSuccess; } -/// Interface to "sm:" service -class SM final : public ServiceFramework { -public: - explicit SM(ServiceManager& service_manager_, Core::System& system_); - ~SM() override; - -private: - void Initialize(HLERequestContext& ctx); - void GetServiceCmif(HLERequestContext& ctx); - void GetServiceTipc(HLERequestContext& ctx); - void RegisterServiceCmif(HLERequestContext& ctx); - void RegisterServiceTipc(HLERequestContext& ctx); - void UnregisterService(HLERequestContext& ctx); - void AtmosphereHasService(HLERequestContext& ctx); - - Result GetServiceImpl(Kernel::KClientSession** out_client_session, HLERequestContext& ctx); - void RegisterServiceImpl(HLERequestContext& ctx, std::string name, u32 max_session_count, bool is_light); - - // TODO: We reuse function list for both TIPC and non-TIPC - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - std::optional FindRequestTipc(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &SM::Initialize, "Initialize"}, - FunctionInfo{1, &SM::GetServiceTipc, "GetService"}, - FunctionInfo{2, &SM::RegisterServiceTipc, "RegisterService"}, - FunctionInfo{3, &SM::UnregisterService, "UnregisterService"}, - FunctionInfo{4, nullptr, "DetachClient"}, - FunctionInfo{65000, nullptr, "AtmosphereInstallMitm"}, - FunctionInfo{65001, nullptr, "AtmosphereUninstallMitm"}, - FunctionInfo{65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"}, - FunctionInfo{65003, nullptr, "AtmosphereAcknowledgeMitmSession"}, - FunctionInfo{65004, nullptr, "AtmosphereHasMitm"}, - FunctionInfo{65005, nullptr, "AtmosphereWaitMitm"}, - FunctionInfo{65006, nullptr, "AtmosphereDeclareFutureMitm"}, - FunctionInfo{65100, &SM::AtmosphereHasService, "AtmosphereHasService"}, - FunctionInfo{65101, nullptr, "AtmosphereWaitService"} - ); - - ServiceManager& service_manager; -}; - /** * SM::Initialize service function * Inputs: @@ -358,7 +194,7 @@ Result SM::GetServiceImpl(Kernel::KClientSession** out_client_session, HLEReques // Create a new session. Kernel::KClientSession* session{}; - if (const auto result = client_port->CreateSession(system.Kernel(), &session); result.IsError()) { + if (const auto result = client_port->CreateSession(kernel, &session); result.IsError()) { LOG_ERROR(Service_SM, "called service={} -> error {:#08x}", name, result.raw); return result; } @@ -429,7 +265,42 @@ void SM::AtmosphereHasService(HLERequestContext& ctx) { SM::SM(ServiceManager& service_manager_, Core::System& system_) : ServiceFramework{system_, "sm:", 64} , service_manager{service_manager_} -{} + , kernel{system_.Kernel()} +{ + RegisterHandlers({ + {0, &SM::Initialize, "Initialize"}, + {1, &SM::GetServiceCmif, "GetService"}, + {2, &SM::RegisterServiceCmif, "RegisterService"}, + {3, &SM::UnregisterService, "UnregisterService"}, + {4, nullptr, "DetachClient"}, + // TODO: are these non-TIPC as well? + {65000, nullptr, "AtmosphereInstallMitm"}, + {65001, nullptr, "AtmosphereUninstallMitm"}, + {65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"}, + {65003, nullptr, "AtmosphereAcknowledgeMitmSession"}, + {65004, nullptr, "AtmosphereHasMitm"}, + {65005, nullptr, "AtmosphereWaitMitm"}, + {65006, nullptr, "AtmosphereDeclareFutureMitm"}, + {65100, &SM::AtmosphereHasService, "AtmosphereHasService"}, + {65101, nullptr, "AtmosphereWaitService"}, + }); + RegisterHandlersTipc({ + {0, &SM::Initialize, "Initialize"}, + {1, &SM::GetServiceTipc, "GetService"}, + {2, &SM::RegisterServiceTipc, "RegisterService"}, + {3, &SM::UnregisterService, "UnregisterService"}, + {4, nullptr, "DetachClient"}, + {65000, nullptr, "AtmosphereInstallMitm"}, + {65001, nullptr, "AtmosphereUninstallMitm"}, + {65002, nullptr, "Deprecated_AtmosphereAssociatePidTidForMitm"}, + {65003, nullptr, "AtmosphereAcknowledgeMitmSession"}, + {65004, nullptr, "AtmosphereHasMitm"}, + {65005, nullptr, "AtmosphereWaitMitm"}, + {65006, nullptr, "AtmosphereDeclareFutureMitm"}, + {65100, &SM::AtmosphereHasService, "AtmosphereHasService"}, + {65101, nullptr, "AtmosphereWaitService"}, + }); +} SM::~SM() = default; diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h index f17fc60080..c520a46fb2 100644 --- a/src/core/hle/service/sm/sm.h +++ b/src/core/hle/service/sm/sm.h @@ -33,7 +33,29 @@ class SessionRequestHandler; namespace Service::SM { class Controller; -class SM; + +/// Interface to "sm:" service +class SM final : public ServiceFramework { +public: + explicit SM(ServiceManager& service_manager_, Core::System& system_); + ~SM() override; + +private: + void Initialize(HLERequestContext& ctx); + void GetServiceCmif(HLERequestContext& ctx); + void GetServiceTipc(HLERequestContext& ctx); + void RegisterServiceCmif(HLERequestContext& ctx); + void RegisterServiceTipc(HLERequestContext& ctx); + void UnregisterService(HLERequestContext& ctx); + void AtmosphereHasService(HLERequestContext& ctx); + + Result GetServiceImpl(Kernel::KClientSession** out_client_session, HLERequestContext& ctx); + void RegisterServiceImpl(HLERequestContext& ctx, std::string name, u32 max_session_count, + bool is_light); + + ServiceManager& service_manager; + Kernel::KernelCore& kernel; +}; class ServiceManager { public: diff --git a/src/core/hle/service/sm/sm_controller.cpp b/src/core/hle/service/sm/sm_controller.cpp new file mode 100644 index 0000000000..125eb4a247 --- /dev/null +++ b/src/core/hle/service/sm/sm_controller.cpp @@ -0,0 +1,128 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "common/assert.h" +#include "common/logging.h" +#include "core/core.h" +#include "core/hle/kernel/k_client_port.h" +#include "core/hle/kernel/k_port.h" +#include "core/hle/kernel/k_scoped_resource_reservation.h" +#include "core/hle/kernel/k_server_session.h" +#include "core/hle/kernel/k_session.h" +#include "core/hle/service/ipc_helpers.h" +#include "core/hle/service/server_manager.h" +#include "core/hle/service/sm/sm_controller.h" + +namespace Service::SM { + +void Controller::ConvertCurrentObjectToDomain(HLERequestContext& ctx) { + ASSERT_MSG(!ctx.GetManager()->IsDomain(), "Session is already a domain"); + LOG_DEBUG(Service, "called, server_session={}", ctx.Session()->GetId()); + ctx.GetManager()->ConvertToDomainOnRequestEnd(); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(1); // Converted sessions start with 1 request handler +} + +void Controller::CloneCurrentObject(HLERequestContext& ctx) { + LOG_DEBUG(Service, "called"); + + auto session_manager = ctx.GetManager(); + + // FIXME: this is duplicated from the SVC, it should just call it instead + // once this is a proper process + + // Reserve a new session from the process resource limit. + Kernel::KScopedResourceReservation session_reservation(system.Kernel(), Kernel::GetCurrentProcessPointer(kernel), Kernel::LimitableResource::SessionCountMax); + ASSERT(session_reservation.Succeeded()); + + // Create the session. + Kernel::KSession* session = Kernel::KSession::Create(kernel); + ASSERT(session != nullptr); + + // Initialize the session. + session->Initialize(kernel, nullptr, 0); + + // Commit the session reservation. + session_reservation.Commit(); + + // Register the session. + Kernel::KSession::Register(kernel, session); + + // Register with server manager. + session_manager->GetServerManager().RegisterSession(&session->GetServerSession(), + session_manager); + + // We succeeded. + IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; + rb.Push(ResultSuccess); + rb.PushMoveObjects(ctx, session->GetClientSession()); +} + +void Controller::CloneCurrentObjectEx(HLERequestContext& ctx) { + LOG_DEBUG(Service, "called"); + + CloneCurrentObject(ctx); +} + +void Controller::QueryPointerBufferSize(HLERequestContext& ctx) { + LOG_DEBUG(Service, "called"); + + auto* process = Kernel::GetCurrentProcessPointer(kernel); + ASSERT(process != nullptr); + + u32 buffer_size = process->GetPointerBufferSize(); + if (buffer_size > (std::numeric_limits::max)()) { + LOG_WARNING(Service, "Pointer buffer size exceeds u16 max, clamping"); + buffer_size = (std::numeric_limits::max)(); + } + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(ResultSuccess); + rb.Push(static_cast(buffer_size)); +} + +void Controller::SetPointerBufferSize(HLERequestContext& ctx) { + LOG_DEBUG(Service, "called"); + + auto* process = Kernel::GetCurrentProcessPointer(kernel); + ASSERT(process != nullptr); + + IPC::RequestParser rp{ctx}; + + u32 requested_size = rp.PopRaw(); + + if (requested_size > (std::numeric_limits::max)()) { + LOG_WARNING(Service, "Requested pointer buffer size too large, clamping to 0xFFFF"); + requested_size = (std::numeric_limits::max)(); + } + + process->SetPointerBufferSize(requested_size); + + LOG_INFO(Service, "Pointer buffer size dynamically updated to {:#x} bytes by process", requested_size); + + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(ResultSuccess); +} + + +// https://switchbrew.org/wiki/IPC_Marshalling +Controller::Controller(Core::System& system_) : ServiceFramework{system_, "IpcController"} { + static const FunctionInfo functions[] = { + {0, &Controller::ConvertCurrentObjectToDomain, "ConvertCurrentObjectToDomain"}, + {1, nullptr, "CopyFromCurrentDomain"}, + {2, &Controller::CloneCurrentObject, "CloneCurrentObject"}, + {3, &Controller::QueryPointerBufferSize, "QueryPointerBufferSize"}, + {4, &Controller::CloneCurrentObjectEx, "CloneCurrentObjectEx"}, + {5, &Controller::SetPointerBufferSize, "SetPointerBufferSize"}, //TODO: where does this come from + }; + RegisterHandlers(functions); +} + +Controller::~Controller() = default; + +} // namespace Service::SM diff --git a/src/core/hle/service/sm/sm_controller.h b/src/core/hle/service/sm/sm_controller.h new file mode 100644 index 0000000000..f1fa327ff7 --- /dev/null +++ b/src/core/hle/service/sm/sm_controller.h @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "core/hle/service/service.h" + +namespace Core { +class System; +} + +namespace Service::SM { + +class Controller final : public ServiceFramework { +public: + explicit Controller(Core::System& system_); + ~Controller() override; + +private: + void ConvertCurrentObjectToDomain(HLERequestContext& ctx); + void CloneCurrentObject(HLERequestContext& ctx); + void CloneCurrentObjectEx(HLERequestContext& ctx); + void QueryPointerBufferSize(HLERequestContext& ctx); + void SetPointerBufferSize(HLERequestContext& ctx); +}; + +} // namespace Service::SM diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index 63bd7051ca..0137a3be66 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -1083,6 +1083,59 @@ void BSD_USA::OnProxyPacketReceived(const Network::ProxyPacket& packet) { BSD_USA::BSD_USA(Core::System& system_, const char* name, bool is_user_) : ServiceFramework{system_, name} , is_user{is_user_} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &BSD_USA::RegisterClient, "RegisterClient"}, + {1, &BSD_USA::StartMonitoring, "StartMonitoring"}, + {2, &BSD_USA::Socket, "Socket"}, + {3, &BSD_USA::SocketExempt, "SocketExempt"}, + {4, nullptr, "Open"}, + {5, &BSD_USA::Select, "Select"}, + {6, &BSD_USA::Poll, "Poll"}, + {7, nullptr, "Sysctl"}, + {8, &BSD_USA::Recv, "Recv"}, + {9, &BSD_USA::RecvFrom, "RecvFrom"}, + {10, &BSD_USA::Send, "Send"}, + {11, &BSD_USA::SendTo, "SendTo"}, + {12, &BSD_USA::Accept, "Accept"}, + {13, &BSD_USA::Bind, "Bind"}, + {14, &BSD_USA::Connect, "Connect"}, + {15, &BSD_USA::GetPeerName, "GetPeerName"}, + {16, &BSD_USA::GetSockName, "GetSockName"}, + {17, &BSD_USA::GetSockOpt, "GetSockOpt"}, + {18, &BSD_USA::Listen, "Listen"}, + {19, nullptr, "Ioctl"}, + {20, &BSD_USA::Fcntl, "Fcntl"}, + {21, &BSD_USA::SetSockOpt, "SetSockOpt"}, + {22, &BSD_USA::Shutdown, "Shutdown"}, + {23, nullptr, "ShutdownAllSockets"}, + {24, &BSD_USA::Write, "Write"}, + {25, &BSD_USA::Read, "Read"}, + {26, &BSD_USA::Close, "Close"}, + {27, &BSD_USA::DuplicateSocket, "DuplicateSocket"}, + {28, nullptr, "GetResourceStatistics"}, + {29, nullptr, "RecvMMsg"}, //3.0.0+ + {30, nullptr, "SendMMsg"}, //3.0.0+ + {31, &BSD_USA::EventFd, "EventFd"}, //7.0.0+ + {32, nullptr, "RegisterResourceStatisticsName"}, //7.0.0+ + {33, nullptr, "RegisterClientShared"}, //10.0.0+ + {34, nullptr, "GetSocketStatistics"}, //15.0.0+ + {35, nullptr, "NifIoctl"}, //17.0.0+ + {36, nullptr, "Unknown36"}, //18.0.0+ + {37, nullptr, "Unknown37"}, //18.0.0+ + {38, nullptr, "Unknown38"}, //18.0.0+ + {39, nullptr, "Unknown39"}, //20.0.0+ + {40, nullptr, "Unknown40"}, //20.0.0+ + {41, nullptr, "Unknown41"}, //21.0.0+ + {42, nullptr, "Unknown42"}, //21.0.0+ + {43, nullptr, "Unknown43"}, //21.0.0+ + {200, nullptr, "SetThreadCoreMask"}, //15.0.0+ + {201, nullptr, "GetThreadCoreMask"}, //15.0.0+ + }; + // clang-format on + + RegisterHandlers(functions); + if (auto room_member = Network::GetRoomMember().lock()) { proxy_packet_received = room_member->BindOnProxyPacketReceived( [this](const Network::ProxyPacket& packet) { OnProxyPacketReceived(packet); }); @@ -1103,12 +1156,40 @@ std::unique_lock BSD_USA::LockService() noexcept { BSDCFG::BSDCFG(Core::System& system_, const char *name) : ServiceFramework{system_, name} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "SetIfUp"}, + {1, nullptr, "SetIfUpWithEvent"}, + {2, nullptr, "CancelIf"}, + {3, nullptr, "SetIfDown"}, + {4, nullptr, "GetIfState"}, + {5, nullptr, "DhcpRenew"}, + {6, nullptr, "AddStaticArpEntry"}, + {7, nullptr, "RemoveArpEntry"}, + {8, nullptr, "LookupArpEntry"}, + {9, nullptr, "LookupArpEntry2"}, + {10, nullptr, "ClearArpEntries"}, + {11, nullptr, "ClearArpEntries2"}, + {12, nullptr, "PrintArpEntries"}, + {13, nullptr, "Unknown13"}, + {14, nullptr, "Unknown14"}, + {15, nullptr, "Unknown15"}, + }; + // clang-format on + + RegisterHandlers(functions); } BSDCFG::~BSDCFG() = default; BSD_NU::BSD_NU(Core::System& system_) : ServiceFramework{system_, "bsd:nu"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "CreateUserService"}, + }; + // clang-format on + RegisterHandlers(functions); } BSD_NU::~BSD_NU() = default; diff --git a/src/core/hle/service/sockets/bsd.h b/src/core/hle/service/sockets/bsd.h index c2aa343d51..5cc3eb5b81 100644 --- a/src/core/hle/service/sockets/bsd.h +++ b/src/core/hle/service/sockets/bsd.h @@ -1,5 +1,6 @@ // SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -189,58 +190,6 @@ private: protected: std::unique_lock LockService() noexcept override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &BSD_USA::RegisterClient, "RegisterClient"}, - FunctionInfo{1, &BSD_USA::StartMonitoring, "StartMonitoring"}, - FunctionInfo{2, &BSD_USA::Socket, "Socket"}, - FunctionInfo{3, &BSD_USA::SocketExempt, "SocketExempt"}, - FunctionInfo{4, nullptr, "Open"}, - FunctionInfo{5, &BSD_USA::Select, "Select"}, - FunctionInfo{6, &BSD_USA::Poll, "Poll"}, - FunctionInfo{7, nullptr, "Sysctl"}, - FunctionInfo{8, &BSD_USA::Recv, "Recv"}, - FunctionInfo{9, &BSD_USA::RecvFrom, "RecvFrom"}, - FunctionInfo{10, &BSD_USA::Send, "Send"}, - FunctionInfo{11, &BSD_USA::SendTo, "SendTo"}, - FunctionInfo{12, &BSD_USA::Accept, "Accept"}, - FunctionInfo{13, &BSD_USA::Bind, "Bind"}, - FunctionInfo{14, &BSD_USA::Connect, "Connect"}, - FunctionInfo{15, &BSD_USA::GetPeerName, "GetPeerName"}, - FunctionInfo{16, &BSD_USA::GetSockName, "GetSockName"}, - FunctionInfo{17, &BSD_USA::GetSockOpt, "GetSockOpt"}, - FunctionInfo{18, &BSD_USA::Listen, "Listen"}, - FunctionInfo{19, nullptr, "Ioctl"}, - FunctionInfo{20, &BSD_USA::Fcntl, "Fcntl"}, - FunctionInfo{21, &BSD_USA::SetSockOpt, "SetSockOpt"}, - FunctionInfo{22, &BSD_USA::Shutdown, "Shutdown"}, - FunctionInfo{23, nullptr, "ShutdownAllSockets"}, - FunctionInfo{24, &BSD_USA::Write, "Write"}, - FunctionInfo{25, &BSD_USA::Read, "Read"}, - FunctionInfo{26, &BSD_USA::Close, "Close"}, - FunctionInfo{27, &BSD_USA::DuplicateSocket, "DuplicateSocket"}, - FunctionInfo{28, nullptr, "GetResourceStatistics"}, - FunctionInfo{29, nullptr, "RecvMMsg", MakeVersionGate({3,0,0})}, - FunctionInfo{30, nullptr, "SendMMsg", MakeVersionGate({3,0,0})}, - FunctionInfo{31, &BSD_USA::EventFd, "EventFd", MakeVersionGate({7,0,0})}, - FunctionInfo{32, nullptr, "RegisterResourceStatisticsName", MakeVersionGate({7,0,0})}, - FunctionInfo{33, nullptr, "RegisterClientShared", MakeVersionGate({10,0,0})}, - FunctionInfo{34, nullptr, "GetSocketStatistics", MakeVersionGate({15,0,0})}, - FunctionInfo{35, nullptr, "NifIoctl", MakeVersionGate({17,0,0})}, - FunctionInfo{36, nullptr, "Unknown36", MakeVersionGate({18,0,0})}, - FunctionInfo{37, nullptr, "Unknown37", MakeVersionGate({18,0,0})}, - FunctionInfo{38, nullptr, "Unknown38", MakeVersionGate({18,0,0})}, - FunctionInfo{39, nullptr, "Unknown39", MakeVersionGate({20,0,0})}, - FunctionInfo{40, nullptr, "Unknown40", MakeVersionGate({20,0,0})}, - FunctionInfo{41, nullptr, "Unknown41", MakeVersionGate({21,0,0})}, - FunctionInfo{42, nullptr, "Unknown42", MakeVersionGate({21,0,0})}, - FunctionInfo{43, nullptr, "Unknown43", MakeVersionGate({21,0,0})}, - FunctionInfo{200, nullptr, "SetThreadCoreMask", MakeVersionGate({15,0,0})}, - FunctionInfo{201, nullptr, "GetThreadCoreMask", MakeVersionGate({15,0,0})} - ); bool is_user = false; }; @@ -248,41 +197,12 @@ class BSDCFG final : public ServiceFramework { public: explicit BSDCFG(Core::System& system_, const char *name); ~BSDCFG() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SetIfUp"}, - FunctionInfo{1, nullptr, "SetIfUpWithEvent"}, - FunctionInfo{2, nullptr, "CancelIf"}, - FunctionInfo{3, nullptr, "SetIfDown"}, - FunctionInfo{4, nullptr, "GetIfState"}, - FunctionInfo{5, nullptr, "DhcpRenew"}, - FunctionInfo{6, nullptr, "AddStaticArpEntry"}, - FunctionInfo{7, nullptr, "RemoveArpEntry"}, - FunctionInfo{8, nullptr, "LookupArpEntry"}, - FunctionInfo{9, nullptr, "LookupArpEntry2"}, - FunctionInfo{10, nullptr, "ClearArpEntries"}, - FunctionInfo{11, nullptr, "ClearArpEntries2"}, - FunctionInfo{12, nullptr, "PrintArpEntries"}, - FunctionInfo{13, nullptr, "Unknown13"}, - FunctionInfo{14, nullptr, "Unknown14"}, - FunctionInfo{15, nullptr, "Unknown15"} - ); }; class BSD_NU final : public ServiceFramework { public: explicit BSD_NU(Core::System& system_); ~BSD_NU() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateUserService"} - ); }; } // namespace Service::Sockets diff --git a/src/core/hle/service/sockets/nsd.cpp b/src/core/hle/service/sockets/nsd.cpp index 8f042aee75..241f2971ca 100644 --- a/src/core/hle/service/sockets/nsd.cpp +++ b/src/core/hle/service/sockets/nsd.cpp @@ -29,6 +29,38 @@ struct EnvironmentIdentifier { static_assert(sizeof(EnvironmentIdentifier) == 0x8); NSD::NSD(Core::System& system_, const char* name) : ServiceFramework{system_, name} { + // clang-format off + static const FunctionInfo functions[] = { + {5, nullptr, "GetSettingUrl"}, + {10, nullptr, "GetSettingName"}, + {11, &NSD::GetEnvironmentIdentifier, "GetEnvironmentIdentifier"}, + {12, nullptr, "GetDeviceId"}, + {13, nullptr, "DeleteSettings"}, + {14, nullptr, "ImportSettings"}, + {15, &NSD::SetChangeEnvironmentIdentifierDisabled, "SetChangeEnvironmentIdentifierDisabled"}, + {20, &NSD::Resolve, "Resolve"}, + {21, &NSD::ResolveEx, "ResolveEx"}, + {30, nullptr, "GetNasServiceSetting"}, + {31, nullptr, "GetNasServiceSettingEx"}, + {40, nullptr, "GetNasRequestFqdn"}, + {41, nullptr, "GetNasRequestFqdnEx"}, + {42, nullptr, "GetNasApiFqdn"}, + {43, nullptr, "GetNasApiFqdnEx"}, + {50, nullptr, "GetCurrentSetting"}, + {51, nullptr, "WriteTestParameter"}, + {52, nullptr, "ReadTestParameter"}, + {60, nullptr, "ReadSaveDataFromFsForTest"}, + {61, nullptr, "WriteSaveDataToFsForTest"}, + {62, nullptr, "DeleteSaveDataOfFsForTest"}, + {63, nullptr, "IsChangeEnvironmentIdentifierDisabled"}, + {64, nullptr, "SetWithoutDomainExchangeFqdns"}, + {100, &NSD::GetApplicationServerEnvironmentType, "GetApplicationServerEnvironmentType"}, + {101, nullptr, "SetApplicationServerEnvironmentType"}, + {102, nullptr, "DeleteApplicationServerEnvironmentType"}, + }; + // clang-format on + + RegisterHandlers(functions); } static std::string ResolveImpl(const std::string& fqdn_in) { diff --git a/src/core/hle/service/sockets/nsd.h b/src/core/hle/service/sockets/nsd.h index f3e4d48aff..e4a4588467 100644 --- a/src/core/hle/service/sockets/nsd.h +++ b/src/core/hle/service/sockets/nsd.h @@ -25,38 +25,6 @@ private: void ResolveEx(HLERequestContext& ctx); void GetEnvironmentIdentifier(HLERequestContext& ctx); void GetApplicationServerEnvironmentType(HLERequestContext& ctx); - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{5, nullptr, "GetSettingUrl"}, - FunctionInfo{10, nullptr, "GetSettingName"}, - FunctionInfo{11, &NSD::GetEnvironmentIdentifier, "GetEnvironmentIdentifier"}, - FunctionInfo{12, nullptr, "GetDeviceId"}, - FunctionInfo{13, nullptr, "DeleteSettings"}, - FunctionInfo{14, nullptr, "ImportSettings"}, - FunctionInfo{15, &NSD::SetChangeEnvironmentIdentifierDisabled, "SetChangeEnvironmentIdentifierDisabled"}, - FunctionInfo{20, &NSD::Resolve, "Resolve"}, - FunctionInfo{21, &NSD::ResolveEx, "ResolveEx"}, - FunctionInfo{30, nullptr, "GetNasServiceSetting"}, - FunctionInfo{31, nullptr, "GetNasServiceSettingEx"}, - FunctionInfo{40, nullptr, "GetNasRequestFqdn"}, - FunctionInfo{41, nullptr, "GetNasRequestFqdnEx"}, - FunctionInfo{42, nullptr, "GetNasApiFqdn"}, - FunctionInfo{43, nullptr, "GetNasApiFqdnEx"}, - FunctionInfo{50, nullptr, "GetCurrentSetting"}, - FunctionInfo{51, nullptr, "WriteTestParameter"}, - FunctionInfo{52, nullptr, "ReadTestParameter"}, - FunctionInfo{60, nullptr, "ReadSaveDataFromFsForTest"}, - FunctionInfo{61, nullptr, "WriteSaveDataToFsForTest"}, - FunctionInfo{62, nullptr, "DeleteSaveDataOfFsForTest"}, - FunctionInfo{63, nullptr, "IsChangeEnvironmentIdentifierDisabled"}, - FunctionInfo{64, nullptr, "SetWithoutDomainExchangeFqdns"}, - FunctionInfo{100, &NSD::GetApplicationServerEnvironmentType, "GetApplicationServerEnvironmentType"}, - FunctionInfo{101, nullptr, "SetApplicationServerEnvironmentType"}, - FunctionInfo{102, nullptr, "DeleteApplicationServerEnvironmentType"} - ); }; } // namespace Service::Sockets diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp index c89705356e..93c01bf786 100644 --- a/src/core/hle/service/sockets/sfdnsres.cpp +++ b/src/core/hle/service/sockets/sfdnsres.cpp @@ -21,6 +21,25 @@ namespace Service::Sockets { SFDNSRES::SFDNSRES(Core::System& system_) : ServiceFramework{system_, "sfdnsres"} { + static const FunctionInfo functions[] = { + {0, nullptr, "SetDnsAddressesPrivateRequest"}, + {1, nullptr, "GetDnsAddressPrivateRequest"}, + {2, &SFDNSRES::GetHostByNameRequest, "GetHostByNameRequest"}, + {3, nullptr, "GetHostByAddrRequest"}, + {4, nullptr, "GetHostStringErrorRequest"}, + {5, &SFDNSRES::GetGaiStringErrorRequest, "GetGaiStringErrorRequest"}, + {6, &SFDNSRES::GetAddrInfoRequest, "GetAddrInfoRequest"}, + {7, nullptr, "GetNameInfoRequest"}, + {8, nullptr, "RequestCancelHandleRequest"}, + {9, nullptr, "CancelRequest"}, + {10, &SFDNSRES::GetHostByNameRequestWithOptions, "GetHostByNameRequestWithOptions"}, + {11, nullptr, "GetHostByAddrRequestWithOptions"}, + {12, &SFDNSRES::GetAddrInfoRequestWithOptions, "GetAddrInfoRequestWithOptions"}, + {13, nullptr, "GetNameInfoRequestWithOptions"}, + {14, &SFDNSRES::ResolverSetOptionRequest, "ResolverSetOptionRequest"}, + {15, nullptr, "ResolverGetOptionRequest"}, + }; + RegisterHandlers(functions); } SFDNSRES::~SFDNSRES() = default; @@ -391,6 +410,14 @@ void SFDNSRES::ResolverSetOptionRequest(HLERequestContext& ctx) { DNS_PRIV::DNS_PRIV(Core::System& system_) : ServiceFramework{system_, "dns:priv"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Cmd0"}, + {1, nullptr, "Cmd1"}, + {2, nullptr, "Cmd2"}, + }; + // clang-format on + RegisterHandlers(functions); } DNS_PRIV::~DNS_PRIV() = default; diff --git a/src/core/hle/service/sockets/sfdnsres.h b/src/core/hle/service/sockets/sfdnsres.h index b365d03b2d..4302edc43e 100644 --- a/src/core/hle/service/sockets/sfdnsres.h +++ b/src/core/hle/service/sockets/sfdnsres.h @@ -26,43 +26,12 @@ private: void GetAddrInfoRequest(HLERequestContext& ctx); void GetAddrInfoRequestWithOptions(HLERequestContext& ctx); void ResolverSetOptionRequest(HLERequestContext& ctx); - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SetDnsAddressesPrivateRequest"}, - FunctionInfo{1, nullptr, "GetDnsAddressPrivateRequest"}, - FunctionInfo{2, &SFDNSRES::GetHostByNameRequest, "GetHostByNameRequest"}, - FunctionInfo{3, nullptr, "GetHostByAddrRequest"}, - FunctionInfo{4, nullptr, "GetHostStringErrorRequest"}, - FunctionInfo{5, &SFDNSRES::GetGaiStringErrorRequest, "GetGaiStringErrorRequest"}, - FunctionInfo{6, &SFDNSRES::GetAddrInfoRequest, "GetAddrInfoRequest"}, - FunctionInfo{7, nullptr, "GetNameInfoRequest"}, - FunctionInfo{8, nullptr, "RequestCancelHandleRequest"}, - FunctionInfo{9, nullptr, "CancelRequest"}, - FunctionInfo{10, &SFDNSRES::GetHostByNameRequestWithOptions, "GetHostByNameRequestWithOptions"}, - FunctionInfo{11, nullptr, "GetHostByAddrRequestWithOptions"}, - FunctionInfo{12, &SFDNSRES::GetAddrInfoRequestWithOptions, "GetAddrInfoRequestWithOptions"}, - FunctionInfo{13, nullptr, "GetNameInfoRequestWithOptions"}, - FunctionInfo{14, &SFDNSRES::ResolverSetOptionRequest, "ResolverSetOptionRequest"}, - FunctionInfo{15, nullptr, "ResolverGetOptionRequest"} - ); }; class DNS_PRIV final : public ServiceFramework { public: explicit DNS_PRIV(Core::System& system_); ~DNS_PRIV() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Cmd0"}, - FunctionInfo{1, nullptr, "Cmd1"}, - FunctionInfo{2, nullptr, "Cmd2"} - ); }; } // namespace Service::Sockets diff --git a/src/core/hle/service/sockets/sockets.cpp b/src/core/hle/service/sockets/sockets.cpp index 1c723e96a6..e96d7c5638 100644 --- a/src/core/hle/service/sockets/sockets.cpp +++ b/src/core/hle/service/sockets/sockets.cpp @@ -15,49 +15,49 @@ namespace Service::Sockets { class ETHC_C final : public ServiceFramework { public: explicit ETHC_C(Core::System& system_) - : ServiceFramework{system_, "ethc:c"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Initialize"}, - FunctionInfo{1, nullptr, "Cancel"}, - FunctionInfo{2, nullptr, "GetResult"}, - FunctionInfo{3, nullptr, "GetMediaList"}, - FunctionInfo{4, nullptr, "SetMediaType"}, - FunctionInfo{5, nullptr, "GetMediaType"}, - FunctionInfo{6, nullptr, "GetMacAddress"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "ethc:c"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "Initialize"}, + {1, nullptr, "Cancel"}, + {2, nullptr, "GetResult"}, + {3, nullptr, "GetMediaList"}, + {4, nullptr, "SetMediaType"}, + {5, nullptr, "GetMediaType"}, + {6, nullptr, "GetMacAddress"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class ETHC_I final : public ServiceFramework { public: explicit ETHC_I(Core::System& system_) - : ServiceFramework{system_, "ethc:i"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetReadableHandle"}, - FunctionInfo{1, nullptr, "Cancel"}, - FunctionInfo{2, nullptr, "GetResult"}, - FunctionInfo{3, nullptr, "GetInterfaceList"}, - FunctionInfo{4, nullptr, "GetInterfaceCount"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "ethc:i"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetReadableHandle"}, + {1, nullptr, "Cancel"}, + {2, nullptr, "GetResult"}, + {3, nullptr, "GetInterfaceList"}, + {4, nullptr, "GetInterfaceCount"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class ISfDriverServiceCreator final : public ServiceFramework { public: explicit ISfDriverServiceCreator(Core::System& system_) - : ServiceFramework{system_, "eth:nd"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateDriverService"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + : ServiceFramework{system_, "eth:nd"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "CreateDriverService"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/sockets/sockets_translate.h b/src/core/hle/service/sockets/sockets_translate.h index bd6721fd3e..b1dfc71961 100644 --- a/src/core/hle/service/sockets/sockets_translate.h +++ b/src/core/hle/service/sockets/sockets_translate.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/spl/spl.cpp b/src/core/hle/service/spl/spl.cpp index ad0251fac5..81be99c360 100644 --- a/src/core/hle/service/spl/spl.cpp +++ b/src/core/hle/service/spl/spl.cpp @@ -8,22 +8,181 @@ namespace Service::SPL { -SPL::SPL(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:") {} +SPL::SPL(Core::System& system_, std::shared_ptr module_) + : Interface(system_, std::move(module_), "spl:") { + // clang-format off + static const FunctionInfo functions[] = { + {0, &SPL::GetConfig, "GetConfig"}, + {1, &SPL::ModularExponentiate, "ModularExponentiate"}, + {5, &SPL::SetConfig, "SetConfig"}, + {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, + {11, &SPL::IsDevelopment, "IsDevelopment"}, + {24, &SPL::SetBootReason, "SetBootReason"}, + {25, &SPL::GetBootReason, "GetBootReason"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + SPL::~SPL() = default; -SPL_MIG::SPL_MIG(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:mig") {} +SPL_MIG::SPL_MIG(Core::System& system_, std::shared_ptr module_) + : Interface(system_, std::move(module_), "spl:mig") { + // clang-format off + static const FunctionInfo functions[] = { + {0, &SPL::GetConfig, "GetConfig"}, + {1, &SPL::ModularExponentiate, "ModularExponentiate"}, + {2, &SPL::GenerateAesKek, "GenerateAesKek"}, + {3, nullptr, "LoadAesKey"}, + {4, &SPL::GenerateAesKey, "GenerateAesKey"}, + {5, &SPL::SetConfig, "SetConfig"}, + {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, + {11, &SPL::IsDevelopment, "IsDevelopment"}, + {14, nullptr, "DecryptAesKey"}, + {15, nullptr, "CryptAesCtr"}, + {16, nullptr, "ComputeCmac"}, + {21, nullptr, "AllocateAesKeyslot"}, + {22, nullptr, "DeallocateAesKeySlot"}, + {23, nullptr, "GetAesKeyslotAvailableEvent"}, + {24, &SPL::SetBootReason, "SetBootReason"}, + {25, &SPL::GetBootReason, "GetBootReason"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + SPL_MIG::~SPL_MIG() = default; -SPL_FS::SPL_FS(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:fs") {} +SPL_FS::SPL_FS(Core::System& system_, std::shared_ptr module_) + : Interface(system_, std::move(module_), "spl:fs") { + // clang-format off + static const FunctionInfo functions[] = { + {0, &SPL::GetConfig, "GetConfig"}, + {1, &SPL::ModularExponentiate, "ModularExponentiate"}, + {2, nullptr, "GenerateAesKek"}, + {3, nullptr, "LoadAesKey"}, + {4, nullptr, "GenerateAesKey"}, + {5, &SPL::SetConfig, "SetConfig"}, + {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, + {9, nullptr, "ImportLotusKey"}, + {10, nullptr, "DecryptLotusMessage"}, + {11, &SPL::IsDevelopment, "IsDevelopment"}, + {12, nullptr, "GenerateSpecificAesKey"}, + {14, nullptr, "DecryptAesKey"}, + {15, nullptr, "CryptAesCtr"}, + {16, nullptr, "ComputeCmac"}, + {19, nullptr, "LoadTitleKey"}, + {21, nullptr, "AllocateAesKeyslot"}, + {22, nullptr, "DeallocateAesKeySlot"}, + {23, nullptr, "GetAesKeyslotAvailableEvent"}, + {24, &SPL::SetBootReason, "SetBootReason"}, + {25, &SPL::GetBootReason, "GetBootReason"}, + {31, nullptr, "GetPackage2Hash"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + SPL_FS::~SPL_FS() = default; -SPL_SSL::SPL_SSL(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:ssl") {} +SPL_SSL::SPL_SSL(Core::System& system_, std::shared_ptr module_) + : Interface(system_, std::move(module_), "spl:ssl") { + // clang-format off + static const FunctionInfo functions[] = { + {0, &SPL::GetConfig, "GetConfig"}, + {1, &SPL::ModularExponentiate, "ModularExponentiate"}, + {2, nullptr, "GenerateAesKek"}, + {3, nullptr, "LoadAesKey"}, + {4, nullptr, "GenerateAesKey"}, + {5, &SPL::SetConfig, "SetConfig"}, + {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, + {11, &SPL::IsDevelopment, "IsDevelopment"}, + {13, nullptr, "DecryptDeviceUniqueData"}, + {14, nullptr, "DecryptAesKey"}, + {15, nullptr, "CryptAesCtr"}, + {16, nullptr, "ComputeCmac"}, + {21, nullptr, "AllocateAesKeyslot"}, + {22, nullptr, "DeallocateAesKeySlot"}, + {23, nullptr, "GetAesKeyslotAvailableEvent"}, + {24, &SPL::SetBootReason, "SetBootReason"}, + {25, &SPL::GetBootReason, "GetBootReason"}, + {26, nullptr, "DecryptAndStoreSslClientCertKey"}, + {27, nullptr, "ModularExponentiateWithSslClientCertKey"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + SPL_SSL::~SPL_SSL() = default; -SPL_ES::SPL_ES(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:es") {} +SPL_ES::SPL_ES(Core::System& system_, std::shared_ptr module_) + : Interface(system_, std::move(module_), "spl:es") { + // clang-format off + static const FunctionInfo functions[] = { + {0, &SPL::GetConfig, "GetConfig"}, + {1, &SPL::ModularExponentiate, "ModularExponentiate"}, + {2, nullptr, "GenerateAesKek"}, + {3, nullptr, "LoadAesKey"}, + {4, nullptr, "GenerateAesKey"}, + {5, &SPL::SetConfig, "SetConfig"}, + {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, + {11, &SPL::IsDevelopment, "IsDevelopment"}, + {13, nullptr, "DecryptDeviceUniqueData"}, + {14, nullptr, "DecryptAesKey"}, + {15, nullptr, "CryptAesCtr"}, + {16, nullptr, "ComputeCmac"}, + {17, nullptr, "ImportEsKey"}, + {18, nullptr, "UnwrapTitleKey"}, + {20, nullptr, "PrepareEsCommonKey"}, + {21, nullptr, "AllocateAesKeyslot"}, + {22, nullptr, "DeallocateAesKeySlot"}, + {23, nullptr, "GetAesKeyslotAvailableEvent"}, + {24, &SPL::SetBootReason, "SetBootReason"}, + {25, &SPL::GetBootReason, "GetBootReason"}, + {28, nullptr, "DecryptAndStoreDrmDeviceCertKey"}, + {29, nullptr, "ModularExponentiateWithDrmDeviceCertKey"}, + {31, nullptr, "PrepareEsArchiveKey"}, + {32, nullptr, "LoadPreparedAesKey"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + SPL_ES::~SPL_ES() = default; -SPL_MANU::SPL_MANU(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "spl:manu") {} +SPL_MANU::SPL_MANU(Core::System& system_, std::shared_ptr module_) + : Interface(system_, std::move(module_), "spl:manu") { + // clang-format off + static const FunctionInfo functions[] = { + {0, &SPL::GetConfig, "GetConfig"}, + {1, &SPL::ModularExponentiate, "ModularExponentiate"}, + {2, nullptr, "GenerateAesKek"}, + {3, nullptr, "LoadAesKey"}, + {4, nullptr, "GenerateAesKey"}, + {5, &SPL::SetConfig, "SetConfig"}, + {7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, + {11, &SPL::IsDevelopment, "IsDevelopment"}, + {13, nullptr, "DecryptDeviceUniqueData"}, + {14, nullptr, "DecryptAesKey"}, + {15, nullptr, "CryptAesCtr"}, + {16, nullptr, "ComputeCmac"}, + {21, nullptr, "AllocateAesKeyslot"}, + {22, nullptr, "DeallocateAesKeySlot"}, + {23, nullptr, "GetAesKeyslotAvailableEvent"}, + {24, &SPL::SetBootReason, "SetBootReason"}, + {25, &SPL::GetBootReason, "GetBootReason"}, + {30, nullptr, "ReencryptDeviceUniqueData"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + SPL_MANU::~SPL_MANU() = default; } // namespace Service::SPL diff --git a/src/core/hle/service/spl/spl.h b/src/core/hle/service/spl/spl.h index 8f84d2a3d3..83a3cda539 100644 --- a/src/core/hle/service/spl/spl.h +++ b/src/core/hle/service/spl/spl.h @@ -18,177 +18,36 @@ class SPL final : public Module::Interface { public: explicit SPL(Core::System& system_, std::shared_ptr module_); ~SPL() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &SPL::GetConfig, "GetConfig"}, - FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"}, - FunctionInfo{5, &SPL::SetConfig, "SetConfig"}, - FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, - FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"}, - FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"}, - FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"} - ); }; class SPL_MIG final : public Module::Interface { public: explicit SPL_MIG(Core::System& system_, std::shared_ptr module_); ~SPL_MIG() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &SPL::GetConfig, "GetConfig"}, - FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"}, - FunctionInfo{2, &SPL::GenerateAesKek, "GenerateAesKek"}, - FunctionInfo{3, nullptr, "LoadAesKey"}, - FunctionInfo{4, &SPL::GenerateAesKey, "GenerateAesKey"}, - FunctionInfo{5, &SPL::SetConfig, "SetConfig"}, - FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, - FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"}, - FunctionInfo{14, nullptr, "DecryptAesKey"}, - FunctionInfo{15, nullptr, "CryptAesCtr"}, - FunctionInfo{16, nullptr, "ComputeCmac"}, - FunctionInfo{21, nullptr, "AllocateAesKeyslot"}, - FunctionInfo{22, nullptr, "DeallocateAesKeySlot"}, - FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"}, - FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"}, - FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"} - ); }; class SPL_FS final : public Module::Interface { public: explicit SPL_FS(Core::System& system_, std::shared_ptr module_); ~SPL_FS() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &SPL::GetConfig, "GetConfig"}, - FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"}, - FunctionInfo{2, nullptr, "GenerateAesKek"}, - FunctionInfo{3, nullptr, "LoadAesKey"}, - FunctionInfo{4, nullptr, "GenerateAesKey"}, - FunctionInfo{5, &SPL::SetConfig, "SetConfig"}, - FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, - FunctionInfo{9, nullptr, "ImportLotusKey"}, - FunctionInfo{10, nullptr, "DecryptLotusMessage"}, - FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"}, - FunctionInfo{12, nullptr, "GenerateSpecificAesKey"}, - FunctionInfo{14, nullptr, "DecryptAesKey"}, - FunctionInfo{15, nullptr, "CryptAesCtr"}, - FunctionInfo{16, nullptr, "ComputeCmac"}, - FunctionInfo{19, nullptr, "LoadTitleKey"}, - FunctionInfo{21, nullptr, "AllocateAesKeyslot"}, - FunctionInfo{22, nullptr, "DeallocateAesKeySlot"}, - FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"}, - FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"}, - FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"}, - FunctionInfo{31, nullptr, "GetPackage2Hash"} - ); }; class SPL_SSL final : public Module::Interface { public: explicit SPL_SSL(Core::System& system_, std::shared_ptr module_); ~SPL_SSL() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &SPL::GetConfig, "GetConfig"}, - FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"}, - FunctionInfo{2, nullptr, "GenerateAesKek"}, - FunctionInfo{3, nullptr, "LoadAesKey"}, - FunctionInfo{4, nullptr, "GenerateAesKey"}, - FunctionInfo{5, &SPL::SetConfig, "SetConfig"}, - FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, - FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"}, - FunctionInfo{13, nullptr, "DecryptDeviceUniqueData"}, - FunctionInfo{14, nullptr, "DecryptAesKey"}, - FunctionInfo{15, nullptr, "CryptAesCtr"}, - FunctionInfo{16, nullptr, "ComputeCmac"}, - FunctionInfo{21, nullptr, "AllocateAesKeyslot"}, - FunctionInfo{22, nullptr, "DeallocateAesKeySlot"}, - FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"}, - FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"}, - FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"}, - FunctionInfo{26, nullptr, "DecryptAndStoreSslClientCertKey"}, - FunctionInfo{27, nullptr, "ModularExponentiateWithSslClientCertKey"} - ); }; class SPL_ES final : public Module::Interface { public: explicit SPL_ES(Core::System& system_, std::shared_ptr module_); ~SPL_ES() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &SPL::GetConfig, "GetConfig"}, - FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"}, - FunctionInfo{2, nullptr, "GenerateAesKek"}, - FunctionInfo{3, nullptr, "LoadAesKey"}, - FunctionInfo{4, nullptr, "GenerateAesKey"}, - FunctionInfo{5, &SPL::SetConfig, "SetConfig"}, - FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, - FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"}, - FunctionInfo{13, nullptr, "DecryptDeviceUniqueData"}, - FunctionInfo{14, nullptr, "DecryptAesKey"}, - FunctionInfo{15, nullptr, "CryptAesCtr"}, - FunctionInfo{16, nullptr, "ComputeCmac"}, - FunctionInfo{17, nullptr, "ImportEsKey"}, - FunctionInfo{18, nullptr, "UnwrapTitleKey"}, - FunctionInfo{20, nullptr, "PrepareEsCommonKey"}, - FunctionInfo{21, nullptr, "AllocateAesKeyslot"}, - FunctionInfo{22, nullptr, "DeallocateAesKeySlot"}, - FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"}, - FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"}, - FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"}, - FunctionInfo{28, nullptr, "DecryptAndStoreDrmDeviceCertKey"}, - FunctionInfo{29, nullptr, "ModularExponentiateWithDrmDeviceCertKey"}, - FunctionInfo{31, nullptr, "PrepareEsArchiveKey"}, - FunctionInfo{32, nullptr, "LoadPreparedAesKey"} - ); }; class SPL_MANU final : public Module::Interface { public: explicit SPL_MANU(Core::System& system_, std::shared_ptr module_); ~SPL_MANU() override; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &SPL::GetConfig, "GetConfig"}, - FunctionInfo{1, &SPL::ModularExponentiate, "ModularExponentiate"}, - FunctionInfo{2, nullptr, "GenerateAesKek"}, - FunctionInfo{3, nullptr, "LoadAesKey"}, - FunctionInfo{4, nullptr, "GenerateAesKey"}, - FunctionInfo{5, &SPL::SetConfig, "SetConfig"}, - FunctionInfo{7, &SPL::GenerateRandomBytes, "GenerateRandomBytes"}, - FunctionInfo{11, &SPL::IsDevelopment, "IsDevelopment"}, - FunctionInfo{13, nullptr, "DecryptDeviceUniqueData"}, - FunctionInfo{14, nullptr, "DecryptAesKey"}, - FunctionInfo{15, nullptr, "CryptAesCtr"}, - FunctionInfo{16, nullptr, "ComputeCmac"}, - FunctionInfo{21, nullptr, "AllocateAesKeyslot"}, - FunctionInfo{22, nullptr, "DeallocateAesKeySlot"}, - FunctionInfo{23, nullptr, "GetAesKeyslotAvailableEvent"}, - FunctionInfo{24, &SPL::SetBootReason, "SetBootReason"}, - FunctionInfo{25, &SPL::GetBootReason, "GetBootReason"}, - FunctionInfo{30, nullptr, "ReencryptDeviceUniqueData"} - ); }; } // namespace Service::SPL diff --git a/src/core/hle/service/spl/spl_module.cpp b/src/core/hle/service/spl/spl_module.cpp index 594575d9a0..520cb1860b 100644 --- a/src/core/hle/service/spl/spl_module.cpp +++ b/src/core/hle/service/spl/spl_module.cpp @@ -204,15 +204,14 @@ Result Module::Interface::GetConfigImpl(u64* out_config, ConfigItem config_item) class CSRNG final : public Module::Interface { public: - explicit CSRNG(Core::System& system_, std::shared_ptr module_) : Interface(system_, std::move(module_), "csrng") {} - ~CSRNG() override = default; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit CSRNG(Core::System& system_, std::shared_ptr module_) + : Interface(system_, std::move(module_), "csrng") { + static const FunctionInfo functions[] = { + {0, &CSRNG::GenerateRandomBytes, "GenerateRandomBytes"}, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &CSRNG::GenerateRandomBytes, "GenerateRandomBytes"} - ); + ~CSRNG() override = default; }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/spl/spl_results.h b/src/core/hle/service/spl/spl_results.h index dd7ba11f34..8c09be49ab 100644 --- a/src/core/hle/service/spl/spl_results.h +++ b/src/core/hle/service/spl/spl_results.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/spl/spl_types.h b/src/core/hle/service/spl/spl_types.h index 91f9cc0321..d7f0c4afbb 100644 --- a/src/core/hle/service/spl/spl_types.h +++ b/src/core/hle/service/spl/spl_types.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/ssl/cert_store.cpp b/src/core/hle/service/ssl/cert_store.cpp index b321e5d32b..ee5bf8306b 100644 --- a/src/core/hle/service/ssl/cert_store.cpp +++ b/src/core/hle/service/ssl/cert_store.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/ssl/cert_store.h b/src/core/hle/service/ssl/cert_store.h index 613d7b02af..4bbb3c9c1a 100644 --- a/src/core/hle/service/ssl/cert_store.h +++ b/src/core/hle/service/ssl/cert_store.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index c5902079ee..999efd4295 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp @@ -74,17 +74,57 @@ struct SslContextSharedData { class ISslConnection final : public ServiceFramework { public: - explicit ISslConnection(Core::System& system_in, SslVersion ssl_version_in, std::shared_ptr& shared_data_in, std::unique_ptr&& backend_in) - : ServiceFramework{system_in, "ISslConnection"} - , ssl_version{ssl_version_in} - , shared_data{shared_data_in} - , backend{std::move(backend_in)} { - backend->SetVerifyOption(verify_option); - shared_data->connection_count++; - } + explicit ISslConnection(Core::System& system_in, SslVersion ssl_version_in, + std::shared_ptr& shared_data_in, + std::unique_ptr&& backend_in) + : ServiceFramework{system_in, "ISslConnection"}, ssl_version{ssl_version_in}, + shared_data{shared_data_in}, backend{std::move(backend_in)} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ISslConnection::SetSocketDescriptor>, "SetSocketDescriptor"}, + {1, D<&ISslConnection::SetHostName>, "SetHostName"}, + {2, D<&ISslConnection::SetVerifyOption>, "SetVerifyOption"}, + {3, D<&ISslConnection::SetIoMode>, "SetIoMode"}, + {4, D<&ISslConnection::GetSocketDescriptor>, "GetSocketDescriptor"}, + {5, D<&ISslConnection::GetHostName>, "GetHostName"}, + {6, nullptr, "GetVerifyOption"}, + {7, D<&ISslConnection::GetIoMode>, "GetIoMode"}, + {8, D<&ISslConnection::DoHandshake>, "DoHandshake"}, + {9, &ISslConnection::DoHandshakeGetServerCert, "DoHandshakeGetServerCert"}, + {10, D<&ISslConnection::Read>, "Read"}, + {11, D<&ISslConnection::Write>, "Write"}, + {12, D<&ISslConnection::Pending>, "Pending"}, + {13, D<&ISslConnection::Peek>, "Peek"}, + {14, D<&ISslConnection::Poll>, "Poll"}, + {15, D<&ISslConnection::GetVerifyCertError>, "GetVerifyCertError"}, + {16, D<&ISslConnection::GetNeededServerCertBufferSize>, "GetNeededServerCertBufferSize"}, + {17, D<&ISslConnection::SetSessionCacheMode>, "SetSessionCacheMode"}, + {18, D<&ISslConnection::GetSessionCacheMode>, "GetSessionCacheMode"}, + {19, D<&ISslConnection::FlushSessionCache>, "FlushSessionCache"}, + {20, D<&ISslConnection::SetRenegotiationMode>, "SetRenegotiationMode"}, + {21, D<&ISslConnection::GetRenegotiationMode>, "GetRenegotiationMode"}, + {22, D<&ISslConnection::SetOption>, "SetOption"}, + {23, D<&ISslConnection::GetOption>, "GetOption"}, + {24, nullptr, "GetVerifyCertErrors"}, + {25, nullptr, "GetCipherInfo"}, + {26, D<&ISslConnection::SetNextAlpnProto>, "SetNextAlpnProto"}, + {27, D<&ISslConnection::GetNextAlpnProto>, "GetNextAlpnProto"}, + {28, nullptr, "SetDtlsSocketDescriptor"}, + {29, nullptr, "GetDtlsHandshakeTimeout"}, + {30, nullptr, "SetPrivateOption"}, + {31, nullptr, "SetSrtpCiphers"}, + {32, nullptr, "GetSrtpCipher"}, + {33, nullptr, "ExportKeyingMaterial"}, + {34, nullptr, "SetIoTimeout"}, + {35, nullptr, "GetIoTimeout"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); + + backend->SetVerifyOption(verify_option); + + shared_data->connection_count++; } ~ISslConnection() { @@ -392,44 +432,6 @@ private: R_SUCCEED(); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ISslConnection::SetSocketDescriptor>, "SetSocketDescriptor"}, - FunctionInfo{1, D<&ISslConnection::SetHostName>, "SetHostName"}, - FunctionInfo{2, D<&ISslConnection::SetVerifyOption>, "SetVerifyOption"}, - FunctionInfo{3, D<&ISslConnection::SetIoMode>, "SetIoMode"}, - FunctionInfo{4, D<&ISslConnection::GetSocketDescriptor>, "GetSocketDescriptor"}, - FunctionInfo{5, D<&ISslConnection::GetHostName>, "GetHostName"}, - FunctionInfo{6, nullptr, "GetVerifyOption"}, - FunctionInfo{7, D<&ISslConnection::GetIoMode>, "GetIoMode"}, - FunctionInfo{8, D<&ISslConnection::DoHandshake>, "DoHandshake"}, - FunctionInfo{9, &ISslConnection::DoHandshakeGetServerCert, "DoHandshakeGetServerCert"}, - FunctionInfo{10, D<&ISslConnection::Read>, "Read"}, - FunctionInfo{11, D<&ISslConnection::Write>, "Write"}, - FunctionInfo{12, D<&ISslConnection::Pending>, "Pending"}, - FunctionInfo{13, D<&ISslConnection::Peek>, "Peek"}, - FunctionInfo{14, D<&ISslConnection::Poll>, "Poll"}, - FunctionInfo{15, D<&ISslConnection::GetVerifyCertError>, "GetVerifyCertError"}, - FunctionInfo{16, D<&ISslConnection::GetNeededServerCertBufferSize>, "GetNeededServerCertBufferSize"}, - FunctionInfo{17, D<&ISslConnection::SetSessionCacheMode>, "SetSessionCacheMode"}, - FunctionInfo{18, D<&ISslConnection::GetSessionCacheMode>, "GetSessionCacheMode"}, - FunctionInfo{19, D<&ISslConnection::FlushSessionCache>, "FlushSessionCache"}, - FunctionInfo{20, D<&ISslConnection::SetRenegotiationMode>, "SetRenegotiationMode"}, - FunctionInfo{21, D<&ISslConnection::GetRenegotiationMode>, "GetRenegotiationMode"}, - FunctionInfo{22, D<&ISslConnection::SetOption>, "SetOption"}, - FunctionInfo{23, D<&ISslConnection::GetOption>, "GetOption"}, - FunctionInfo{24, nullptr, "GetVerifyCertErrors"}, - FunctionInfo{25, nullptr, "GetCipherInfo"}, - FunctionInfo{26, D<&ISslConnection::SetNextAlpnProto>, "SetNextAlpnProto"}, - FunctionInfo{27, D<&ISslConnection::GetNextAlpnProto>, "GetNextAlpnProto"}, - FunctionInfo{28, nullptr, "SetDtlsSocketDescriptor"}, - FunctionInfo{29, nullptr, "GetDtlsHandshakeTimeout"}, - FunctionInfo{30, nullptr, "SetPrivateOption"}, - FunctionInfo{31, nullptr, "SetSrtpCiphers"}, - FunctionInfo{32, nullptr, "GetSrtpCipher"}, - FunctionInfo{33, nullptr, "ExportKeyingMaterial"}, - FunctionInfo{34, nullptr, "SetIoTimeout"}, - FunctionInfo{35, nullptr, "GetIoTimeout"} - ); SslVersion ssl_version; std::shared_ptr shared_data; std::unique_ptr backend; @@ -450,9 +452,29 @@ public: explicit ISslContext(Core::System& system_, SslVersion version) : ServiceFramework{system_, "ISslContext"}, ssl_version{version}, shared_data{std::make_shared()} { + static const FunctionInfo functions[] = { + {0, &ISslContext::SetOption, "SetOption"}, + {1, &ISslContext::GetOption, "GetOption"}, + {2, &ISslContext::CreateConnection, "CreateConnection"}, + {3, &ISslContext::GetConnectionCount, "GetConnectionCount"}, + {4, &ISslContext::ImportServerPki, "ImportServerPki"}, + {5, &ISslContext::ImportClientPki, "ImportClientPki"}, + {6, nullptr, "RemoveServerPki"}, + {7, nullptr, "RemoveClientPki"}, + {8, D<&ISslContext::RegisterInternalPki>, "RegisterInternalPki"}, + {9, nullptr, "AddPolicyOid"}, + {10, nullptr, "ImportCrl"}, + {11, nullptr, "RemoveCrl"}, + {12, nullptr, "ImportClientCertKeyPki"}, + {13, nullptr, "GeneratePrivateKeyAndCert"}, + }; + RegisterHandlers(functions); } private: + SslVersion ssl_version; + std::shared_ptr shared_data; + void SetOption(HLERequestContext& ctx) { struct Parameters { ContextOption option; @@ -539,36 +561,28 @@ private: LOG_WARNING(Service_SSL, "(STUBBED) called"); R_SUCCEED(); } - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &ISslContext::SetOption, "SetOption"}, - FunctionInfo{1, &ISslContext::GetOption, "GetOption"}, - FunctionInfo{2, &ISslContext::CreateConnection, "CreateConnection"}, - FunctionInfo{3, &ISslContext::GetConnectionCount, "GetConnectionCount"}, - FunctionInfo{4, &ISslContext::ImportServerPki, "ImportServerPki"}, - FunctionInfo{5, &ISslContext::ImportClientPki, "ImportClientPki"}, - FunctionInfo{6, nullptr, "RemoveServerPki"}, - FunctionInfo{7, nullptr, "RemoveClientPki"}, - FunctionInfo{8, D<&ISslContext::RegisterInternalPki>, "RegisterInternalPki"}, - FunctionInfo{9, nullptr, "AddPolicyOid"}, - FunctionInfo{10, nullptr, "ImportCrl"}, - FunctionInfo{11, nullptr, "RemoveCrl"}, - FunctionInfo{12, nullptr, "ImportClientCertKeyPki"}, - FunctionInfo{13, nullptr, "GeneratePrivateKeyAndCert"} - ); - SslVersion ssl_version; - std::shared_ptr shared_data; }; class ISslService final : public ServiceFramework { public: - explicit ISslService(Core::System& system_) : ServiceFramework{system_, "ssl"}, cert_store{system} {} + explicit ISslService(Core::System& system_) + : ServiceFramework{system_, "ssl"}, cert_store{system} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &ISslService::CreateContext, "CreateContext"}, + {1, nullptr, "GetContextCount"}, + {2, D<&ISslService::GetCertificates>, "GetCertificates"}, + {3, D<&ISslService::GetCertificateBufSize>, "GetCertificateBufSize"}, + {4, nullptr, "DebugIoctl"}, + {5, &ISslService::SetInterfaceVersion, "SetInterfaceVersion"}, + {6, nullptr, "FlushSessionCache"}, + {7, nullptr, "SetDebugOption"}, + {8, nullptr, "GetDebugOption"}, + {8, nullptr, "ClearTls12FallbackFlag"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -614,116 +628,147 @@ private: } private: - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &ISslService::CreateContext, "CreateContext"}, - FunctionInfo{1, nullptr, "GetContextCount"}, - FunctionInfo{2, D<&ISslService::GetCertificates>, "GetCertificates"}, - FunctionInfo{3, D<&ISslService::GetCertificateBufSize>, "GetCertificateBufSize"}, - FunctionInfo{4, nullptr, "DebugIoctl"}, - FunctionInfo{5, &ISslService::SetInterfaceVersion, "SetInterfaceVersion"}, - FunctionInfo{6, nullptr, "FlushSessionCache"}, - FunctionInfo{7, nullptr, "SetDebugOption"}, - FunctionInfo{8, nullptr, "GetDebugOption"}, - FunctionInfo{8, nullptr, "ClearTls12FallbackFlag"} - ); CertStore cert_store; }; class ISslServiceForSystem final : public ServiceFramework { -public: - explicit ISslServiceForSystem(Core::System& system_) : ServiceFramework{system_, "ssl:s"} {} + public: + explicit ISslServiceForSystem(Core::System& system_) : ServiceFramework{system_, "ssl:s"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, D<&ISslServiceForSystem::CreateContext>, "CreateContext"}, + {1, D<&ISslServiceForSystem::GetContextCount>, "GetContextCount"}, + {2, D<&ISslServiceForSystem::GetCertificates>, "GetCertificates"}, + {3, D<&ISslServiceForSystem::GetCertificateBufSize>, "GetCertificateBufSize"}, + {4, D<&ISslServiceForSystem::DebugIoctl>, "DebugIoctl"}, + {5, D<&ISslServiceForSystem::SetInterfaceVersion>, "SetInterfaceVersion"}, + {6, D<&ISslServiceForSystem::FlushSessionCache>, "FlushSessionCache"}, + {7, D<&ISslServiceForSystem::SetDebugOption>, "SetDebugOption"}, + {8, D<&ISslServiceForSystem::GetDebugOption>, "GetDebugOption"}, + {9, D<&ISslServiceForSystem::ClearTls12FallbackFlag>, "ClearTls12FallbackFlag"}, + {100, D<&ISslServiceForSystem::CreateContextForSystem>, "CreateContextForSystem"}, + {101, D<&ISslServiceForSystem::SetThreadCoreMask>, "SetThreadCoreMask"}, + {102, D<&ISslServiceForSystem::GetThreadCoreMask>, "GetThreadCoreMask"}, + {103, D<&ISslServiceForSystem::VerifySignature>, "VerifySignature"} + }; + // clang-format on - Result CreateContext() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); + RegisterHandlers(functions); + }; + + Result CreateContext() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result GetContextCount() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result GetCertificates() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result GetCertificateBufSize() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result DebugIoctl() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result SetInterfaceVersion() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result FlushSessionCache() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result SetDebugOption() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result GetDebugOption() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result ClearTls12FallbackFlag() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result CreateContextForSystem() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result SetThreadCoreMask() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result GetThreadCoreMask() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; + + Result VerifySignature() { + LOG_DEBUG(Service_SSL, "(STUBBED) called."); + + // TODO (jarrodnorwell) + + return ResultSuccess; + }; }; - Result GetContextCount() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result GetCertificates() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result GetCertificateBufSize() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result DebugIoctl() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result SetInterfaceVersion() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result FlushSessionCache() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result SetDebugOption() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result GetDebugOption() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result ClearTls12FallbackFlag() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result CreateContextForSystem() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result SetThreadCoreMask() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result GetThreadCoreMask() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - Result VerifySignature() { - LOG_DEBUG(Service_SSL, "(STUBBED) called."); - R_SUCCEED(); - }; - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); - } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, D<&ISslServiceForSystem::CreateContext>, "CreateContext"}, - FunctionInfo{1, D<&ISslServiceForSystem::GetContextCount>, "GetContextCount"}, - FunctionInfo{2, D<&ISslServiceForSystem::GetCertificates>, "GetCertificates"}, - FunctionInfo{3, D<&ISslServiceForSystem::GetCertificateBufSize>, "GetCertificateBufSize"}, - FunctionInfo{4, D<&ISslServiceForSystem::DebugIoctl>, "DebugIoctl"}, - FunctionInfo{5, D<&ISslServiceForSystem::SetInterfaceVersion>, "SetInterfaceVersion"}, - FunctionInfo{6, D<&ISslServiceForSystem::FlushSessionCache>, "FlushSessionCache"}, - FunctionInfo{7, D<&ISslServiceForSystem::SetDebugOption>, "SetDebugOption"}, - FunctionInfo{8, D<&ISslServiceForSystem::GetDebugOption>, "GetDebugOption"}, - FunctionInfo{9, D<&ISslServiceForSystem::ClearTls12FallbackFlag>, "ClearTls12FallbackFlag"}, - FunctionInfo{100, D<&ISslServiceForSystem::CreateContextForSystem>, "CreateContextForSystem"}, - FunctionInfo{101, D<&ISslServiceForSystem::SetThreadCoreMask>, "SetThreadCoreMask"}, - FunctionInfo{102, D<&ISslServiceForSystem::GetThreadCoreMask>, "GetThreadCoreMask"}, - FunctionInfo{103, D<&ISslServiceForSystem::VerifySignature>, "VerifySignature"} - ); -}; - void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); diff --git a/src/core/hle/service/ssl/ssl.h b/src/core/hle/service/ssl/ssl.h index f6e21bbb3b..dc9f2b746b 100644 --- a/src/core/hle/service/ssl/ssl.h +++ b/src/core/hle/service/ssl/ssl.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/ssl/ssl_types.h b/src/core/hle/service/ssl/ssl_types.h index 16623c0fc5..cbd84ad1f9 100644 --- a/src/core/hle/service/ssl/ssl_types.h +++ b/src/core/hle/service/ssl/ssl_types.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/tma/tma.cpp b/src/core/hle/service/tma/tma.cpp index e9198eea64..c2fb33cd16 100644 --- a/src/core/hle/service/tma/tma.cpp +++ b/src/core/hle/service/tma/tma.cpp @@ -19,14 +19,12 @@ class HTC_TENV final : public ServiceFramework { public: explicit HTC_TENV(Core::System& system_) : ServiceFramework{system_, "htc:tenv"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + {0, nullptr, "GetServiceInterface"}, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetServiceInterface"} - ); }; void LoopProcess(Core::System& system) { diff --git a/src/core/hle/service/usb/usb.cpp b/src/core/hle/service/usb/usb.cpp index f7dc15e3db..ff2a377172 100644 --- a/src/core/hle/service/usb/usb.cpp +++ b/src/core/hle/service/usb/usb.cpp @@ -17,127 +17,137 @@ namespace Service::USB { class IDsInterface final : public ServiceFramework { public: - explicit IDsInterface(Core::System& system_) : ServiceFramework{system_, "IDsInterface"} {} + explicit IDsInterface(Core::System& system_) : ServiceFramework{system_, "IDsInterface"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "AddEndpoint"}, + {1, nullptr, "GetSetupEvent"}, + {2, nullptr, "GetSetupPacket"}, + {3, nullptr, "Enable"}, + {4, nullptr, "Disable"}, + {5, nullptr, "CtrlIn"}, + {6, nullptr, "CtrlOut"}, + {7, nullptr, "GetCtrlInCompletionEvent"}, + {8, nullptr, "GetCtrlInUrbReport"}, + {9, nullptr, "GetCtrlOutCompletionEvent"}, + {10, nullptr, "GetCtrlOutUrbReport"}, + {11, nullptr, "CtrlStall"}, + {12, nullptr, "AppendConfigurationData"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "AddEndpoint"}, - FunctionInfo{1, nullptr, "GetSetupEvent"}, - FunctionInfo{2, nullptr, "GetSetupPacket"}, - FunctionInfo{3, nullptr, "Enable"}, - FunctionInfo{4, nullptr, "Disable"}, - FunctionInfo{5, nullptr, "CtrlIn"}, - FunctionInfo{6, nullptr, "CtrlOut"}, - FunctionInfo{7, nullptr, "GetCtrlInCompletionEvent"}, - FunctionInfo{8, nullptr, "GetCtrlInUrbReport"}, - FunctionInfo{9, nullptr, "GetCtrlOutCompletionEvent"}, - FunctionInfo{10, nullptr, "GetCtrlOutUrbReport"}, - FunctionInfo{11, nullptr, "CtrlStall"}, - FunctionInfo{12, nullptr, "AppendConfigurationData"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IDsRootSession final : public ServiceFramework { public: - explicit IDsRootSession(Core::System& system_) : ServiceFramework{system_, "usb:ds"} {} + explicit IDsRootSession(Core::System& system_) : ServiceFramework{system_, "usb:ds"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "OpenDsService"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenDsService"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IClientEpSession final : public ServiceFramework { public: explicit IClientEpSession(Core::System& system_) - : ServiceFramework{system_, "IClientEpSession"} {} + : ServiceFramework{system_, "IClientEpSession"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "ReOpen"}, + {1, nullptr, "Close"}, + {2, nullptr, "GetCompletionEvent"}, + {3, nullptr, "PopulateRing"}, + {4, nullptr, "PostBufferAsync"}, + {5, nullptr, "GetXferReport"}, + {6, nullptr, "PostBufferMultiAsync"}, + {7, nullptr, "CreateSmmuSpace"}, + {8, nullptr, "ShareReportRing"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "ReOpen"}, - FunctionInfo{1, nullptr, "Close"}, - FunctionInfo{2, nullptr, "GetCompletionEvent"}, - FunctionInfo{3, nullptr, "PopulateRing"}, - FunctionInfo{4, nullptr, "PostBufferAsync"}, - FunctionInfo{5, nullptr, "GetXferReport"}, - FunctionInfo{6, nullptr, "PostBufferMultiAsync"}, - FunctionInfo{7, nullptr, "CreateSmmuSpace"}, - FunctionInfo{8, nullptr, "ShareReportRing"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IClientIfSession final : public ServiceFramework { public: explicit IClientIfSession(Core::System& system_) - : ServiceFramework{system_, "IClientIfSession"} {} + : ServiceFramework{system_, "IClientIfSession"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetStateChangeEvent"}, + {1, nullptr, "SetInterface"}, + {2, nullptr, "GetInterface"}, + {3, nullptr, "GetAlternateInterface"}, + {4, nullptr, "GetCurrentFrame"}, + {5, nullptr, "CtrlXferAsync"}, + {6, nullptr, "GetCtrlXferCompletionEvent"}, + {7, nullptr, "GetCtrlXferReport"}, + {8, nullptr, "ResetDevice"}, + {9, nullptr, "OpenUsbEp"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetStateChangeEvent"}, - FunctionInfo{1, nullptr, "SetInterface"}, - FunctionInfo{2, nullptr, "GetInterface"}, - FunctionInfo{3, nullptr, "GetAlternateInterface"}, - FunctionInfo{4, nullptr, "GetCurrentFrame"}, - FunctionInfo{5, nullptr, "CtrlXferAsync"}, - FunctionInfo{6, nullptr, "GetCtrlXferCompletionEvent"}, - FunctionInfo{7, nullptr, "GetCtrlXferReport"}, - FunctionInfo{8, nullptr, "ResetDevice"}, - FunctionInfo{9, nullptr, "OpenUsbEp"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IClientRootSession final : public ServiceFramework { public: - explicit IClientRootSession(Core::System& system_) : ServiceFramework{system_, "usb:hs"} {} + explicit IClientRootSession(Core::System& system_) : ServiceFramework{system_, "usb:hs"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "BindClientProcess"}, + {1, nullptr, "QueryAllInterfaces"}, + {2, nullptr, "QueryAvailableInterfaces"}, + {3, nullptr, "QueryAcquiredInterfaces"}, + {4, nullptr, "CreateInterfaceAvailableEvent"}, + {5, nullptr, "DestroyInterfaceAvailableEvent"}, + {6, nullptr, "GetInterfaceStateChangeEvent"}, + {7, nullptr, "AcquireUsbIf"}, + {8, nullptr, "SetTestMode"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "BindClientProcess"}, - FunctionInfo{1, nullptr, "QueryAllInterfaces"}, - FunctionInfo{2, nullptr, "QueryAvailableInterfaces"}, - FunctionInfo{3, nullptr, "QueryAcquiredInterfaces"}, - FunctionInfo{4, nullptr, "CreateInterfaceAvailableEvent"}, - FunctionInfo{5, nullptr, "DestroyInterfaceAvailableEvent"}, - FunctionInfo{6, nullptr, "GetInterfaceStateChangeEvent"}, - FunctionInfo{7, nullptr, "AcquireUsbIf"}, - FunctionInfo{8, nullptr, "SetTestMode"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IPdSession final : public ServiceFramework { public: - explicit IPdSession(Core::System& system_) : ServiceFramework{system_, "IPdSession"} {} + explicit IPdSession(Core::System& system_) : ServiceFramework{system_, "IPdSession"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "BindNoticeEvent"}, + {1, nullptr, "UnbindNoticeEvent"}, + {2, nullptr, "GetStatus"}, + {3, nullptr, "GetNotice"}, + {4, nullptr, "EnablePowerRequestNotice"}, + {5, nullptr, "DisablePowerRequestNotice"}, + {6, nullptr, "ReplyPowerRequest"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "BindNoticeEvent"}, - FunctionInfo{1, nullptr, "UnbindNoticeEvent"}, - FunctionInfo{2, nullptr, "GetStatus"}, - FunctionInfo{3, nullptr, "GetNotice"}, - FunctionInfo{4, nullptr, "EnablePowerRequestNotice"}, - FunctionInfo{5, nullptr, "DisablePowerRequestNotice"}, - FunctionInfo{6, nullptr, "ReplyPowerRequest"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IPdManager final : public ServiceFramework { public: - explicit IPdManager(Core::System& system_) : ServiceFramework{system_, "usb:pd"} {} + explicit IPdManager(Core::System& system_) : ServiceFramework{system_, "usb:pd"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IPdManager::OpenSession, "OpenSession"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -148,39 +158,40 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IPdManager::OpenSession, "OpenSession"} - ); }; class IPdCradleSession final : public ServiceFramework { public: explicit IPdCradleSession(Core::System& system_) - : ServiceFramework{system_, "IPdCradleSession"} {} + : ServiceFramework{system_, "IPdCradleSession"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "SetCradleVdo"}, + {1, nullptr, "GetCradleVdo"}, + {2, nullptr, "ResetCradleUsbHub"}, + {3, nullptr, "GetHostPdcFirmwareType"}, + {4, nullptr, "GetHostPdcFirmwareRevision"}, + {5, nullptr, "GetHostPdcManufactureId"}, + {6, nullptr, "GetHostPdcDeviceId"}, + {7, nullptr, "EnableCradleRecovery"}, + {8, nullptr, "DisableCradleRecovery"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "SetCradleVdo"}, - FunctionInfo{1, nullptr, "GetCradleVdo"}, - FunctionInfo{2, nullptr, "ResetCradleUsbHub"}, - FunctionInfo{3, nullptr, "GetHostPdcFirmwareType"}, - FunctionInfo{4, nullptr, "GetHostPdcFirmwareRevision"}, - FunctionInfo{5, nullptr, "GetHostPdcManufactureId"}, - FunctionInfo{6, nullptr, "GetHostPdcDeviceId"}, - FunctionInfo{7, nullptr, "EnableCradleRecovery"}, - FunctionInfo{8, nullptr, "DisableCradleRecovery"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IPdCradleManager final : public ServiceFramework { public: - explicit IPdCradleManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:c"} {} + explicit IPdCradleManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:c"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, &IPdCradleManager::OpenCradleSession, "OpenCradleSession"}, + }; + // clang-format on - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } private: @@ -191,64 +202,61 @@ private: rb.Push(ResultSuccess); rb.PushIpcInterface(ctx, system); } - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, &IPdCradleManager::OpenCradleSession, "OpenCradleSession"} - ); }; class IPmMainService final : public ServiceFramework { public: - explicit IPmMainService(Core::System& system_) : ServiceFramework{system_, "usb:pm"} {} + explicit IPmMainService(Core::System& system_) : ServiceFramework{system_, "usb:pm"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetPowerEvent"}, + {1, nullptr, "GetPowerState"}, + {2, nullptr, "GetDataEvent"}, + {3, nullptr, "GetDataRole"}, + {4, nullptr, "SetDiagData"}, + {5, nullptr, "GetDiagData"}, + }; + // clang-format on - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetPowerEvent"}, - FunctionInfo{1, nullptr, "GetPowerState"}, - FunctionInfo{2, nullptr, "GetDataEvent"}, - FunctionInfo{3, nullptr, "GetDataRole"}, - FunctionInfo{4, nullptr, "SetDiagData"}, - FunctionInfo{5, nullptr, "GetDiagData"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + RegisterHandlers(functions); } }; class IPdManufactureManager final : public ServiceFramework { public: - explicit IPdManufactureManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:m"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenManufactureSession"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit IPdManufactureManager(Core::System& system_) : ServiceFramework{system_, "usb:pd:m"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "OpenManufactureSession"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IQdbManager final : public ServiceFramework { public: - explicit IQdbManager(Core::System& system_) : ServiceFramework{system_, "usb:qdb"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "ImportQuirkDevices"}, - FunctionInfo{1, nullptr, "HasQuirk"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit IQdbManager(Core::System& system_) : ServiceFramework{system_, "usb:qdb"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "ImportQuirkDevices"}, + {1, nullptr, "HasQuirk"}, + }; + // clang-format on + RegisterHandlers(functions); } }; class IPmObserverService final : public ServiceFramework { public: - explicit IPmObserverService(Core::System& system_) : ServiceFramework{system_, "usb:obsv"} {} - - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetTopologyChangeEvent"}, - FunctionInfo{1, nullptr, "GetFlattenedTopology"} - ); - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + explicit IPmObserverService(Core::System& system_) : ServiceFramework{system_, "usb:obsv"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetTopologyChangeEvent"}, + {1, nullptr, "GetFlattenedTopology"}, + }; + // clang-format on + RegisterHandlers(functions); } }; diff --git a/src/core/hle/service/usb/usb.h b/src/core/hle/service/usb/usb.h index 98376ebc0c..cc25a3b29e 100644 --- a/src/core/hle/service/usb/usb.h +++ b/src/core/hle/service/usb/usb.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/vi/application_display_service.cpp b/src/core/hle/service/vi/application_display_service.cpp index dcebb2eba9..f179ba676a 100644 --- a/src/core/hle/service/vi/application_display_service.cpp +++ b/src/core/hle/service/vi/application_display_service.cpp @@ -17,38 +17,38 @@ namespace Service::VI { -std::optional IApplicationDisplayService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{100, C<&IApplicationDisplayService::GetRelayService>, "GetRelayService"}, - FunctionInfo{101, C<&IApplicationDisplayService::GetSystemDisplayService>, "GetSystemDisplayService"}, - FunctionInfo{102, C<&IApplicationDisplayService::GetManagerDisplayService>, "GetManagerDisplayService"}, - FunctionInfo{103, C<&IApplicationDisplayService::GetIndirectDisplayTransactionService>, "GetIndirectDisplayTransactionService"}, - FunctionInfo{1000, C<&IApplicationDisplayService::ListDisplays>, "ListDisplays"}, - FunctionInfo{1010, C<&IApplicationDisplayService::OpenDisplay>, "OpenDisplay"}, - FunctionInfo{1011, C<&IApplicationDisplayService::OpenDefaultDisplay>, "OpenDefaultDisplay"}, - FunctionInfo{1020, C<&IApplicationDisplayService::CloseDisplay>, "CloseDisplay"}, - FunctionInfo{1101, C<&IApplicationDisplayService::SetDisplayEnabled>, "SetDisplayEnabled"}, - FunctionInfo{1102, C<&IApplicationDisplayService::GetDisplayResolution>, "GetDisplayResolution"}, - FunctionInfo{2020, C<&IApplicationDisplayService::OpenLayer>, "OpenLayer"}, - FunctionInfo{2021, C<&IApplicationDisplayService::CloseLayer>, "CloseLayer"}, - FunctionInfo{2030, C<&IApplicationDisplayService::CreateStrayLayer>, "CreateStrayLayer"}, - FunctionInfo{2031, C<&IApplicationDisplayService::DestroyStrayLayer>, "DestroyStrayLayer"}, - FunctionInfo{2101, C<&IApplicationDisplayService::SetLayerScalingMode>, "SetLayerScalingMode"}, - FunctionInfo{2102, C<&IApplicationDisplayService::ConvertScalingMode>, "ConvertScalingMode"}, - FunctionInfo{2103, C<&IApplicationDisplayService::Cmd2103>, "Cmd2103"}, - FunctionInfo{2450, C<&IApplicationDisplayService::GetIndirectLayerImageMap>, "GetIndirectLayerImageMap"}, - FunctionInfo{2451, nullptr, "GetIndirectLayerImageCropMap"}, - FunctionInfo{2460, C<&IApplicationDisplayService::GetIndirectLayerImageRequiredMemoryInfo>, "GetIndirectLayerImageRequiredMemoryInfo"}, - FunctionInfo{5202, C<&IApplicationDisplayService::GetDisplayVsyncEvent>, "GetDisplayVsyncEvent"}, - FunctionInfo{5203, nullptr, "GetDisplayVsyncEventForDebug"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IApplicationDisplayService::IApplicationDisplayService(Core::System& system_, std::shared_ptr container) : ServiceFramework{system_, "IApplicationDisplayService"}, m_container{std::move(container)}, m_context{system, "IApplicationDisplayService"} { + // clang-format off + static const FunctionInfo functions[] = { + {100, C<&IApplicationDisplayService::GetRelayService>, "GetRelayService"}, + {101, C<&IApplicationDisplayService::GetSystemDisplayService>, "GetSystemDisplayService"}, + {102, C<&IApplicationDisplayService::GetManagerDisplayService>, "GetManagerDisplayService"}, + {103, C<&IApplicationDisplayService::GetIndirectDisplayTransactionService>, "GetIndirectDisplayTransactionService"}, + {1000, C<&IApplicationDisplayService::ListDisplays>, "ListDisplays"}, + {1010, C<&IApplicationDisplayService::OpenDisplay>, "OpenDisplay"}, + {1011, C<&IApplicationDisplayService::OpenDefaultDisplay>, "OpenDefaultDisplay"}, + {1020, C<&IApplicationDisplayService::CloseDisplay>, "CloseDisplay"}, + {1101, C<&IApplicationDisplayService::SetDisplayEnabled>, "SetDisplayEnabled"}, + {1102, C<&IApplicationDisplayService::GetDisplayResolution>, "GetDisplayResolution"}, + {2020, C<&IApplicationDisplayService::OpenLayer>, "OpenLayer"}, + {2021, C<&IApplicationDisplayService::CloseLayer>, "CloseLayer"}, + {2030, C<&IApplicationDisplayService::CreateStrayLayer>, "CreateStrayLayer"}, + {2031, C<&IApplicationDisplayService::DestroyStrayLayer>, "DestroyStrayLayer"}, + {2101, C<&IApplicationDisplayService::SetLayerScalingMode>, "SetLayerScalingMode"}, + {2102, C<&IApplicationDisplayService::ConvertScalingMode>, "ConvertScalingMode"}, + {2103, C<&IApplicationDisplayService::Cmd2103>, "Cmd2103"}, + {2450, C<&IApplicationDisplayService::GetIndirectLayerImageMap>, "GetIndirectLayerImageMap"}, + {2451, nullptr, "GetIndirectLayerImageCropMap"}, + {2460, C<&IApplicationDisplayService::GetIndirectLayerImageRequiredMemoryInfo>, "GetIndirectLayerImageRequiredMemoryInfo"}, + {5202, C<&IApplicationDisplayService::GetDisplayVsyncEvent>, "GetDisplayVsyncEvent"}, + {5203, nullptr, "GetDisplayVsyncEventForDebug"}, + }; + // clang-format on + + RegisterHandlers(functions); } IApplicationDisplayService::~IApplicationDisplayService() { diff --git a/src/core/hle/service/vi/application_display_service.h b/src/core/hle/service/vi/application_display_service.h index 0b5898ee56..d2db391efd 100644 --- a/src/core/hle/service/vi/application_display_service.h +++ b/src/core/hle/service/vi/application_display_service.h @@ -74,8 +74,8 @@ public: s64 width, s64 height); private: - std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; + KernelHelpers::ServiceContext m_context; std::mutex m_lock{}; std::set m_open_layer_ids{}; diff --git a/src/core/hle/service/vi/application_root_service.cpp b/src/core/hle/service/vi/application_root_service.cpp index f12c564277..2204f77ed4 100644 --- a/src/core/hle/service/vi/application_root_service.cpp +++ b/src/core/hle/service/vi/application_root_service.cpp @@ -14,17 +14,14 @@ namespace Service::VI { -std::optional IApplicationRootService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, C<&IApplicationRootService::GetDisplayService>, "GetDisplayService"}, - FunctionInfo{1, nullptr, "GetDisplayServiceWithProxyNameExchange"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IApplicationRootService::IApplicationRootService(Core::System& system_, std::shared_ptr container) : ServiceFramework{system_, "vi:u"}, m_container{std::move(container)} { + static const FunctionInfo functions[] = { + {0, C<&IApplicationRootService::GetDisplayService>, "GetDisplayService"}, + {1, nullptr, "GetDisplayServiceWithProxyNameExchange"}, + }; + RegisterHandlers(functions); } IApplicationRootService::~IApplicationRootService() = default; diff --git a/src/core/hle/service/vi/application_root_service.h b/src/core/hle/service/vi/application_root_service.h index 4deaa04f4c..b66293b73f 100644 --- a/src/core/hle/service/vi/application_root_service.h +++ b/src/core/hle/service/vi/application_root_service.h @@ -30,7 +30,6 @@ private: Policy policy); private: - std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; }; diff --git a/src/core/hle/service/vi/display.h b/src/core/hle/service/vi/display.h index fceda75e39..543c6ee68d 100644 --- a/src/core/hle/service/vi/display.h +++ b/src/core/hle/service/vi/display.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/vi/display_list.h b/src/core/hle/service/vi/display_list.h index f710ac472c..bf9cf78a27 100644 --- a/src/core/hle/service/vi/display_list.h +++ b/src/core/hle/service/vi/display_list.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/vi/layer.h b/src/core/hle/service/vi/layer.h index e4c9c98646..9bd6d033ac 100644 --- a/src/core/hle/service/vi/layer.h +++ b/src/core/hle/service/vi/layer.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/vi/layer_list.h b/src/core/hle/service/vi/layer_list.h index 4afca6f403..8fc7cd3ade 100644 --- a/src/core/hle/service/vi/layer_list.h +++ b/src/core/hle/service/vi/layer_list.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/vi/manager_display_service.cpp b/src/core/hle/service/vi/manager_display_service.cpp index 1b3b0f3379..34a0175b49 100644 --- a/src/core/hle/service/vi/manager_display_service.cpp +++ b/src/core/hle/service/vi/manager_display_service.cpp @@ -10,96 +10,96 @@ namespace Service::VI { -std::optional IManagerDisplayService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{200, nullptr, "AllocateProcessHeapBlock"}, - FunctionInfo{201, nullptr, "FreeProcessHeapBlock"}, - FunctionInfo{1102, nullptr, "GetDisplayResolution"}, - FunctionInfo{2010, C<&IManagerDisplayService::CreateManagedLayer>, "CreateManagedLayer"}, - FunctionInfo{2011, C<&IManagerDisplayService::DestroyManagedLayer>, "DestroyManagedLayer"}, - FunctionInfo{2012, nullptr, "CreateStrayLayer"}, - FunctionInfo{2050, nullptr, "CreateIndirectLayer"}, - FunctionInfo{2051, nullptr, "DestroyIndirectLayer"}, - FunctionInfo{2052, nullptr, "CreateIndirectProducerEndPoint"}, - FunctionInfo{2053, nullptr, "DestroyIndirectProducerEndPoint"}, - FunctionInfo{2054, nullptr, "CreateIndirectConsumerEndPoint"}, - FunctionInfo{2055, nullptr, "DestroyIndirectConsumerEndPoint"}, - FunctionInfo{2060, nullptr, "CreateWatermarkCompositor"}, - FunctionInfo{2062, nullptr, "SetWatermarkText"}, - FunctionInfo{2063, nullptr, "SetWatermarkLayerStacks"}, - FunctionInfo{2300, nullptr, "AcquireLayerTexturePresentingEvent"}, - FunctionInfo{2301, nullptr, "ReleaseLayerTexturePresentingEvent"}, - FunctionInfo{2302, nullptr, "GetDisplayHotplugEvent"}, - FunctionInfo{2303, nullptr, "GetDisplayModeChangedEvent"}, - FunctionInfo{2402, nullptr, "GetDisplayHotplugState"}, - FunctionInfo{2501, nullptr, "GetCompositorErrorInfo"}, - FunctionInfo{2601, nullptr, "GetDisplayErrorEvent"}, - FunctionInfo{2701, nullptr, "GetDisplayFatalErrorEvent"}, - FunctionInfo{4201, nullptr, "SetDisplayAlpha"}, - FunctionInfo{4203, nullptr, "SetDisplayLayerStack"}, - FunctionInfo{4205, nullptr, "SetDisplayPowerState"}, - FunctionInfo{4206, nullptr, "SetDefaultDisplay"}, - FunctionInfo{4207, nullptr, "ResetDisplayPanel"}, - FunctionInfo{4208, nullptr, "SetDisplayFatalErrorEnabled"}, - FunctionInfo{4209, nullptr, "IsDisplayPanelOn"}, - FunctionInfo{4300, nullptr, "GetInternalPanelId"}, - FunctionInfo{6000, C<&IManagerDisplayService::AddToLayerStack>, "AddToLayerStack"}, - FunctionInfo{6001, nullptr, "RemoveFromLayerStack"}, - FunctionInfo{6002, C<&IManagerDisplayService::SetLayerVisibility>, "SetLayerVisibility"}, - FunctionInfo{6003, nullptr, "SetLayerConfig"}, - FunctionInfo{6004, nullptr, "AttachLayerPresentationTracer"}, - FunctionInfo{6005, nullptr, "DetachLayerPresentationTracer"}, - FunctionInfo{6006, nullptr, "StartLayerPresentationRecording"}, - FunctionInfo{6007, nullptr, "StopLayerPresentationRecording"}, - FunctionInfo{6008, nullptr, "StartLayerPresentationFenceWait"}, - FunctionInfo{6009, nullptr, "StopLayerPresentationFenceWait"}, - FunctionInfo{6010, nullptr, "GetLayerPresentationAllFencesExpiredEvent"}, - FunctionInfo{6011, nullptr, "EnableLayerAutoClearTransitionBuffer"}, - FunctionInfo{6012, nullptr, "DisableLayerAutoClearTransitionBuffer"}, - FunctionInfo{6013, nullptr, "SetLayerOpacity"}, - FunctionInfo{6014, nullptr, "AttachLayerWatermarkCompositor"}, - FunctionInfo{6015, nullptr, "DetachLayerWatermarkCompositor"}, - FunctionInfo{7000, nullptr, "SetContentVisibility"}, - FunctionInfo{8000, nullptr, "SetConductorLayer"}, - FunctionInfo{8001, nullptr, "SetTimestampTracking"}, - FunctionInfo{8100, nullptr, "SetIndirectProducerFlipOffset"}, - FunctionInfo{8200, nullptr, "CreateSharedBufferStaticStorage"}, - FunctionInfo{8201, nullptr, "CreateSharedBufferTransferMemory"}, - FunctionInfo{8202, nullptr, "DestroySharedBuffer"}, - FunctionInfo{8203, nullptr, "BindSharedLowLevelLayerToManagedLayer"}, - FunctionInfo{8204, nullptr, "BindSharedLowLevelLayerToIndirectLayer"}, - FunctionInfo{8207, nullptr, "UnbindSharedLowLevelLayer"}, - FunctionInfo{8208, nullptr, "ConnectSharedLowLevelLayerToSharedBuffer"}, - FunctionInfo{8209, nullptr, "DisconnectSharedLowLevelLayerFromSharedBuffer"}, - FunctionInfo{8210, nullptr, "CreateSharedLayer"}, - FunctionInfo{8211, nullptr, "DestroySharedLayer"}, - FunctionInfo{8216, nullptr, "AttachSharedLayerToLowLevelLayer"}, - FunctionInfo{8217, nullptr, "ForceDetachSharedLayerFromLowLevelLayer"}, - FunctionInfo{8218, nullptr, "StartDetachSharedLayerFromLowLevelLayer"}, - FunctionInfo{8219, nullptr, "FinishDetachSharedLayerFromLowLevelLayer"}, - FunctionInfo{8220, nullptr, "GetSharedLayerDetachReadyEvent"}, - FunctionInfo{8221, nullptr, "GetSharedLowLevelLayerSynchronizedEvent"}, - FunctionInfo{8222, nullptr, "CheckSharedLowLevelLayerSynchronized"}, - FunctionInfo{8223, nullptr, "RegisterSharedBufferImporterAruid"}, - FunctionInfo{8224, nullptr, "UnregisterSharedBufferImporterAruid"}, - FunctionInfo{8227, nullptr, "CreateSharedBufferProcessHeap"}, - FunctionInfo{8228, nullptr, "GetSharedLayerLayerStacks"}, - FunctionInfo{8229, nullptr, "SetSharedLayerLayerStacks"}, - FunctionInfo{8291, nullptr, "PresentDetachedSharedFrameBufferToLowLevelLayer"}, - FunctionInfo{8292, nullptr, "FillDetachedSharedFrameBufferColor"}, - FunctionInfo{8293, nullptr, "GetDetachedSharedFrameBufferImage"}, - FunctionInfo{8294, nullptr, "SetDetachedSharedFrameBufferImage"}, - FunctionInfo{8295, nullptr, "CopyDetachedSharedFrameBufferImage"}, - FunctionInfo{8296, nullptr, "SetDetachedSharedFrameBufferSubImage"}, - FunctionInfo{8297, nullptr, "GetSharedFrameBufferContentParameter"}, - FunctionInfo{8298, nullptr, "ExpandStartupLogoOnSharedFrameBuffer"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IManagerDisplayService::IManagerDisplayService(Core::System& system_, std::shared_ptr container) : ServiceFramework{system_, "IManagerDisplayService"}, m_container{std::move(container)} { + // clang-format off + static const FunctionInfo functions[] = { + {200, nullptr, "AllocateProcessHeapBlock"}, + {201, nullptr, "FreeProcessHeapBlock"}, + {1102, nullptr, "GetDisplayResolution"}, + {2010, C<&IManagerDisplayService::CreateManagedLayer>, "CreateManagedLayer"}, + {2011, C<&IManagerDisplayService::DestroyManagedLayer>, "DestroyManagedLayer"}, + {2012, nullptr, "CreateStrayLayer"}, + {2050, nullptr, "CreateIndirectLayer"}, + {2051, nullptr, "DestroyIndirectLayer"}, + {2052, nullptr, "CreateIndirectProducerEndPoint"}, + {2053, nullptr, "DestroyIndirectProducerEndPoint"}, + {2054, nullptr, "CreateIndirectConsumerEndPoint"}, + {2055, nullptr, "DestroyIndirectConsumerEndPoint"}, + {2060, nullptr, "CreateWatermarkCompositor"}, + {2062, nullptr, "SetWatermarkText"}, + {2063, nullptr, "SetWatermarkLayerStacks"}, + {2300, nullptr, "AcquireLayerTexturePresentingEvent"}, + {2301, nullptr, "ReleaseLayerTexturePresentingEvent"}, + {2302, nullptr, "GetDisplayHotplugEvent"}, + {2303, nullptr, "GetDisplayModeChangedEvent"}, + {2402, nullptr, "GetDisplayHotplugState"}, + {2501, nullptr, "GetCompositorErrorInfo"}, + {2601, nullptr, "GetDisplayErrorEvent"}, + {2701, nullptr, "GetDisplayFatalErrorEvent"}, + {4201, nullptr, "SetDisplayAlpha"}, + {4203, nullptr, "SetDisplayLayerStack"}, + {4205, nullptr, "SetDisplayPowerState"}, + {4206, nullptr, "SetDefaultDisplay"}, + {4207, nullptr, "ResetDisplayPanel"}, + {4208, nullptr, "SetDisplayFatalErrorEnabled"}, + {4209, nullptr, "IsDisplayPanelOn"}, + {4300, nullptr, "GetInternalPanelId"}, + {6000, C<&IManagerDisplayService::AddToLayerStack>, "AddToLayerStack"}, + {6001, nullptr, "RemoveFromLayerStack"}, + {6002, C<&IManagerDisplayService::SetLayerVisibility>, "SetLayerVisibility"}, + {6003, nullptr, "SetLayerConfig"}, + {6004, nullptr, "AttachLayerPresentationTracer"}, + {6005, nullptr, "DetachLayerPresentationTracer"}, + {6006, nullptr, "StartLayerPresentationRecording"}, + {6007, nullptr, "StopLayerPresentationRecording"}, + {6008, nullptr, "StartLayerPresentationFenceWait"}, + {6009, nullptr, "StopLayerPresentationFenceWait"}, + {6010, nullptr, "GetLayerPresentationAllFencesExpiredEvent"}, + {6011, nullptr, "EnableLayerAutoClearTransitionBuffer"}, + {6012, nullptr, "DisableLayerAutoClearTransitionBuffer"}, + {6013, nullptr, "SetLayerOpacity"}, + {6014, nullptr, "AttachLayerWatermarkCompositor"}, + {6015, nullptr, "DetachLayerWatermarkCompositor"}, + {7000, nullptr, "SetContentVisibility"}, + {8000, nullptr, "SetConductorLayer"}, + {8001, nullptr, "SetTimestampTracking"}, + {8100, nullptr, "SetIndirectProducerFlipOffset"}, + {8200, nullptr, "CreateSharedBufferStaticStorage"}, + {8201, nullptr, "CreateSharedBufferTransferMemory"}, + {8202, nullptr, "DestroySharedBuffer"}, + {8203, nullptr, "BindSharedLowLevelLayerToManagedLayer"}, + {8204, nullptr, "BindSharedLowLevelLayerToIndirectLayer"}, + {8207, nullptr, "UnbindSharedLowLevelLayer"}, + {8208, nullptr, "ConnectSharedLowLevelLayerToSharedBuffer"}, + {8209, nullptr, "DisconnectSharedLowLevelLayerFromSharedBuffer"}, + {8210, nullptr, "CreateSharedLayer"}, + {8211, nullptr, "DestroySharedLayer"}, + {8216, nullptr, "AttachSharedLayerToLowLevelLayer"}, + {8217, nullptr, "ForceDetachSharedLayerFromLowLevelLayer"}, + {8218, nullptr, "StartDetachSharedLayerFromLowLevelLayer"}, + {8219, nullptr, "FinishDetachSharedLayerFromLowLevelLayer"}, + {8220, nullptr, "GetSharedLayerDetachReadyEvent"}, + {8221, nullptr, "GetSharedLowLevelLayerSynchronizedEvent"}, + {8222, nullptr, "CheckSharedLowLevelLayerSynchronized"}, + {8223, nullptr, "RegisterSharedBufferImporterAruid"}, + {8224, nullptr, "UnregisterSharedBufferImporterAruid"}, + {8227, nullptr, "CreateSharedBufferProcessHeap"}, + {8228, nullptr, "GetSharedLayerLayerStacks"}, + {8229, nullptr, "SetSharedLayerLayerStacks"}, + {8291, nullptr, "PresentDetachedSharedFrameBufferToLowLevelLayer"}, + {8292, nullptr, "FillDetachedSharedFrameBufferColor"}, + {8293, nullptr, "GetDetachedSharedFrameBufferImage"}, + {8294, nullptr, "SetDetachedSharedFrameBufferImage"}, + {8295, nullptr, "CopyDetachedSharedFrameBufferImage"}, + {8296, nullptr, "SetDetachedSharedFrameBufferSubImage"}, + {8297, nullptr, "GetSharedFrameBufferContentParameter"}, + {8298, nullptr, "ExpandStartupLogoOnSharedFrameBuffer"}, + }; + // clang-format on + + RegisterHandlers(functions); } IManagerDisplayService::~IManagerDisplayService() = default; diff --git a/src/core/hle/service/vi/manager_display_service.h b/src/core/hle/service/vi/manager_display_service.h index 1c7a79f337..2e05e730c7 100644 --- a/src/core/hle/service/vi/manager_display_service.h +++ b/src/core/hle/service/vi/manager_display_service.h @@ -37,7 +37,6 @@ public: Result SetLayerVisibility(bool visible, u64 layer_id); private: - std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; }; diff --git a/src/core/hle/service/vi/manager_root_service.cpp b/src/core/hle/service/vi/manager_root_service.cpp index 0cc98bc2c0..094261e060 100644 --- a/src/core/hle/service/vi/manager_root_service.cpp +++ b/src/core/hle/service/vi/manager_root_service.cpp @@ -15,21 +15,18 @@ namespace Service::VI { -std::optional IManagerRootService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{2, C<&IManagerRootService::GetDisplayService>, "GetDisplayService"}, - FunctionInfo{3, nullptr, "GetDisplayServiceWithProxyNameExchange"}, - FunctionInfo{100, nullptr, "PrepareFatal"}, - FunctionInfo{101, nullptr, "ShowFatal"}, - FunctionInfo{102, nullptr, "DrawFatalRectangle"}, - FunctionInfo{103, nullptr, "DrawFatalText32"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - IManagerRootService::IManagerRootService(Core::System& system_, std::shared_ptr container) : ServiceFramework{system_, "vi:m"}, m_container{std::move(container)} { + static const FunctionInfo functions[] = { + {2, C<&IManagerRootService::GetDisplayService>, "GetDisplayService"}, + {3, nullptr, "GetDisplayServiceWithProxyNameExchange"}, + {100, nullptr, "PrepareFatal"}, + {101, nullptr, "ShowFatal"}, + {102, nullptr, "DrawFatalRectangle"}, + {103, nullptr, "DrawFatalText32"}, + }; + RegisterHandlers(functions); } IManagerRootService::~IManagerRootService() = default; diff --git a/src/core/hle/service/vi/manager_root_service.h b/src/core/hle/service/vi/manager_root_service.h index 78c0d1f80d..114dc36c07 100644 --- a/src/core/hle/service/vi/manager_root_service.h +++ b/src/core/hle/service/vi/manager_root_service.h @@ -29,7 +29,6 @@ public: Policy policy); private: - std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; }; diff --git a/src/core/hle/service/vi/service_creator.cpp b/src/core/hle/service/vi/service_creator.cpp index 2b8e5f9577..34dbf7baae 100644 --- a/src/core/hle/service/vi/service_creator.cpp +++ b/src/core/hle/service/vi/service_creator.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/vi/service_creator.h b/src/core/hle/service/vi/service_creator.h index c6ba1797dc..8b50e94af5 100644 --- a/src/core/hle/service/vi/service_creator.h +++ b/src/core/hle/service/vi/service_creator.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/vi/shared_buffer_manager.h b/src/core/hle/service/vi/shared_buffer_manager.h index d1ce57ee27..807db10f31 100644 --- a/src/core/hle/service/vi/shared_buffer_manager.h +++ b/src/core/hle/service/vi/shared_buffer_manager.h @@ -18,10 +18,6 @@ class KPageGroup; class KReadableEvent; } // namespace Kernel -namespace Core { -class System; -} - namespace Service::android { class BufferQueueProducer; } diff --git a/src/core/hle/service/vi/system_display_service.cpp b/src/core/hle/service/vi/system_display_service.cpp index 997f0a51fc..aa225f69df 100644 --- a/src/core/hle/service/vi/system_display_service.cpp +++ b/src/core/hle/service/vi/system_display_service.cpp @@ -12,63 +12,63 @@ namespace Service::VI { -std::optional ISystemDisplayService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1200, nullptr, "GetZOrderCountMin"}, - FunctionInfo{1202, nullptr, "GetZOrderCountMax"}, - FunctionInfo{1203, nullptr, "GetDisplayLogicalResolution"}, - FunctionInfo{1204, nullptr, "SetDisplayMagnification"}, - FunctionInfo{2201, nullptr, "SetLayerPosition"}, - FunctionInfo{2203, nullptr, "SetLayerSize"}, - FunctionInfo{2204, C<&ISystemDisplayService::GetLayerZ>, "GetLayerZ"}, - FunctionInfo{2205, C<&ISystemDisplayService::SetLayerZ>, "SetLayerZ"}, - FunctionInfo{2207, C<&ISystemDisplayService::SetLayerVisibility>, "SetLayerVisibility"}, - FunctionInfo{2209, nullptr, "SetLayerAlpha"}, - FunctionInfo{2210, nullptr, "SetLayerPositionAndSize"}, - FunctionInfo{2312, nullptr, "CreateStrayLayer"}, - FunctionInfo{2400, nullptr, "OpenIndirectLayer"}, - FunctionInfo{2401, nullptr, "CloseIndirectLayer"}, - FunctionInfo{2402, nullptr, "FlipIndirectLayer"}, - FunctionInfo{3000, C<&ISystemDisplayService::ListDisplayModes>, "ListDisplayModes"}, - FunctionInfo{3001, nullptr, "ListDisplayRgbRanges"}, - FunctionInfo{3002, nullptr, "ListDisplayContentTypes"}, - FunctionInfo{3200, C<&ISystemDisplayService::GetDisplayMode>, "GetDisplayMode"}, - FunctionInfo{3201, nullptr, "SetDisplayMode"}, - FunctionInfo{3202, nullptr, "GetDisplayUnderscan"}, - FunctionInfo{3203, nullptr, "SetDisplayUnderscan"}, - FunctionInfo{3204, nullptr, "GetDisplayContentType"}, - FunctionInfo{3205, nullptr, "SetDisplayContentType"}, - FunctionInfo{3206, nullptr, "GetDisplayRgbRange"}, - FunctionInfo{3207, nullptr, "SetDisplayRgbRange"}, - FunctionInfo{3208, nullptr, "GetDisplayCmuMode"}, - FunctionInfo{3209, nullptr, "SetDisplayCmuMode"}, - FunctionInfo{3210, nullptr, "GetDisplayContrastRatio"}, - FunctionInfo{3211, nullptr, "SetDisplayContrastRatio"}, - FunctionInfo{3214, nullptr, "GetDisplayGamma"}, - FunctionInfo{3215, nullptr, "SetDisplayGamma"}, - FunctionInfo{3216, nullptr, "GetDisplayCmuLuma"}, - FunctionInfo{3217, nullptr, "SetDisplayCmuLuma"}, - FunctionInfo{3218, nullptr, "SetDisplayCrcMode"}, - FunctionInfo{6013, nullptr, "GetLayerPresentationSubmissionTimestamps"}, - FunctionInfo{8225, C<&ISystemDisplayService::GetSharedBufferMemoryHandleId>, "GetSharedBufferMemoryHandleId"}, - FunctionInfo{8250, C<&ISystemDisplayService::OpenSharedLayer>, "OpenSharedLayer"}, - FunctionInfo{8251, nullptr, "CloseSharedLayer"}, - FunctionInfo{8252, C<&ISystemDisplayService::ConnectSharedLayer>, "ConnectSharedLayer"}, - FunctionInfo{8253, nullptr, "DisconnectSharedLayer"}, - FunctionInfo{8254, C<&ISystemDisplayService::AcquireSharedFrameBuffer>, "AcquireSharedFrameBuffer"}, - FunctionInfo{8255, C<&ISystemDisplayService::PresentSharedFrameBuffer>, "PresentSharedFrameBuffer"}, - FunctionInfo{8256, C<&ISystemDisplayService::GetSharedFrameBufferAcquirableEvent>, "GetSharedFrameBufferAcquirableEvent"}, - FunctionInfo{8257, nullptr, "FillSharedFrameBufferColor"}, - FunctionInfo{8258, C<&ISystemDisplayService::CancelSharedFrameBuffer>, "CancelSharedFrameBuffer"}, - FunctionInfo{9000, nullptr, "GetDp2hdmiController"} - ); - return HandlerTableGenerateWithFind(key, functions); +ISystemDisplayService::ISystemDisplayService(Core::System& system_, + std::shared_ptr container) + : ServiceFramework{system_, "ISystemDisplayService"}, m_container{std::move(container)} { + // clang-format off + static const FunctionInfo functions[] = { + {1200, nullptr, "GetZOrderCountMin"}, + {1202, nullptr, "GetZOrderCountMax"}, + {1203, nullptr, "GetDisplayLogicalResolution"}, + {1204, nullptr, "SetDisplayMagnification"}, + {2201, nullptr, "SetLayerPosition"}, + {2203, nullptr, "SetLayerSize"}, + {2204, C<&ISystemDisplayService::GetLayerZ>, "GetLayerZ"}, + {2205, C<&ISystemDisplayService::SetLayerZ>, "SetLayerZ"}, + {2207, C<&ISystemDisplayService::SetLayerVisibility>, "SetLayerVisibility"}, + {2209, nullptr, "SetLayerAlpha"}, + {2210, nullptr, "SetLayerPositionAndSize"}, + {2312, nullptr, "CreateStrayLayer"}, + {2400, nullptr, "OpenIndirectLayer"}, + {2401, nullptr, "CloseIndirectLayer"}, + {2402, nullptr, "FlipIndirectLayer"}, + {3000, C<&ISystemDisplayService::ListDisplayModes>, "ListDisplayModes"}, + {3001, nullptr, "ListDisplayRgbRanges"}, + {3002, nullptr, "ListDisplayContentTypes"}, + {3200, C<&ISystemDisplayService::GetDisplayMode>, "GetDisplayMode"}, + {3201, nullptr, "SetDisplayMode"}, + {3202, nullptr, "GetDisplayUnderscan"}, + {3203, nullptr, "SetDisplayUnderscan"}, + {3204, nullptr, "GetDisplayContentType"}, + {3205, nullptr, "SetDisplayContentType"}, + {3206, nullptr, "GetDisplayRgbRange"}, + {3207, nullptr, "SetDisplayRgbRange"}, + {3208, nullptr, "GetDisplayCmuMode"}, + {3209, nullptr, "SetDisplayCmuMode"}, + {3210, nullptr, "GetDisplayContrastRatio"}, + {3211, nullptr, "SetDisplayContrastRatio"}, + {3214, nullptr, "GetDisplayGamma"}, + {3215, nullptr, "SetDisplayGamma"}, + {3216, nullptr, "GetDisplayCmuLuma"}, + {3217, nullptr, "SetDisplayCmuLuma"}, + {3218, nullptr, "SetDisplayCrcMode"}, + {6013, nullptr, "GetLayerPresentationSubmissionTimestamps"}, + {8225, C<&ISystemDisplayService::GetSharedBufferMemoryHandleId>, "GetSharedBufferMemoryHandleId"}, + {8250, C<&ISystemDisplayService::OpenSharedLayer>, "OpenSharedLayer"}, + {8251, nullptr, "CloseSharedLayer"}, + {8252, C<&ISystemDisplayService::ConnectSharedLayer>, "ConnectSharedLayer"}, + {8253, nullptr, "DisconnectSharedLayer"}, + {8254, C<&ISystemDisplayService::AcquireSharedFrameBuffer>, "AcquireSharedFrameBuffer"}, + {8255, C<&ISystemDisplayService::PresentSharedFrameBuffer>, "PresentSharedFrameBuffer"}, + {8256, C<&ISystemDisplayService::GetSharedFrameBufferAcquirableEvent>, "GetSharedFrameBufferAcquirableEvent"}, + {8257, nullptr, "FillSharedFrameBufferColor"}, + {8258, C<&ISystemDisplayService::CancelSharedFrameBuffer>, "CancelSharedFrameBuffer"}, + {9000, nullptr, "GetDp2hdmiController"}, + }; + // clang-format on + RegisterHandlers(functions); } -ISystemDisplayService::ISystemDisplayService(Core::System& system_, std::shared_ptr container) - : ServiceFramework{system_, "ISystemDisplayService"}, m_container{std::move(container)} -{} - ISystemDisplayService::~ISystemDisplayService() = default; Result ISystemDisplayService::GetLayerZ(Out out_z_value, u64 layer_id) { diff --git a/src/core/hle/service/vi/system_display_service.h b/src/core/hle/service/vi/system_display_service.h index 04c9f0977e..a3b88c519d 100644 --- a/src/core/hle/service/vi/system_display_service.h +++ b/src/core/hle/service/vi/system_display_service.h @@ -47,7 +47,6 @@ private: Result CancelSharedFrameBuffer(u64 layer_id, s64 slot); private: - std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; }; diff --git a/src/core/hle/service/vi/system_root_service.cpp b/src/core/hle/service/vi/system_root_service.cpp index c078be37a3..c761f136e2 100644 --- a/src/core/hle/service/vi/system_root_service.cpp +++ b/src/core/hle/service/vi/system_root_service.cpp @@ -14,17 +14,14 @@ namespace Service::VI { -std::optional ISystemRootService::FindRequest(u32 key) { - static constexpr auto functions = CreateStaticMap( - FunctionInfo{1, C<&ISystemRootService::GetDisplayService>, "GetDisplayService"}, - FunctionInfo{3, nullptr, "GetDisplayServiceWithProxyNameExchange"} - ); - return HandlerTableGenerateWithFind(key, functions); -} - ISystemRootService::ISystemRootService(Core::System& system_, std::shared_ptr container) - : ServiceFramework{system_, "vi:s"}, m_container{std::move(container)} -{} + : ServiceFramework{system_, "vi:s"}, m_container{std::move(container)} { + static const FunctionInfo functions[] = { + {1, C<&ISystemRootService::GetDisplayService>, "GetDisplayService"}, + {3, nullptr, "GetDisplayServiceWithProxyNameExchange"}, + }; + RegisterHandlers(functions); +} ISystemRootService::~ISystemRootService() = default; diff --git a/src/core/hle/service/vi/system_root_service.h b/src/core/hle/service/vi/system_root_service.h index baf516fec5..1587e0e30f 100644 --- a/src/core/hle/service/vi/system_root_service.h +++ b/src/core/hle/service/vi/system_root_service.h @@ -29,7 +29,6 @@ private: Out> out_application_display_service, Policy policy); - std::optional FindRequest(u32 key) override; const std::shared_ptr m_container; }; diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index b388efaf6f..2ea64f5d32 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/vi/vi.h b/src/core/hle/service/vi/vi.h index 7c1f350d84..bcc55228aa 100644 --- a/src/core/hle/service/vi/vi.h +++ b/src/core/hle/service/vi/vi.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/vi/vi_results.h b/src/core/hle/service/vi/vi_results.h index 22bac799f0..89b7317792 100644 --- a/src/core/hle/service/vi/vi_results.h +++ b/src/core/hle/service/vi/vi_results.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 diff --git a/src/core/hle/service/vi/vi_types.h b/src/core/hle/service/vi/vi_types.h index 95ff663582..2d4287169a 100644 --- a/src/core/hle/service/vi/vi_types.h +++ b/src/core/hle/service/vi/vi_types.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/core/hle/service/wlan/wlan.cpp b/src/core/hle/service/wlan/wlan.cpp index fa68ff51ba..bcd357d57a 100644 --- a/src/core/hle/service/wlan/wlan.cpp +++ b/src/core/hle/service/wlan/wlan.cpp @@ -16,248 +16,232 @@ class ILocalManager final : public ServiceFramework { public: explicit ILocalManager(Core::System& system_) : ServiceFramework{system_, "wlan:lcl"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "OpenMasterMode" }, + { 0, nullptr, "OpenMode_2" }, + { 1, nullptr, "CloseMasterMode" }, + { 1, nullptr, "CloseMode_2" }, + { 2, nullptr, "OpenClientMode" }, + { 2, nullptr, "GetMacAddress_2" }, + { 3, nullptr, "CloseClientMode" }, + { 3, nullptr, "CreateBss" }, + { 4, nullptr, "OpenSpectatorMode" }, + { 4, nullptr, "DestroyBss" }, + { 5, nullptr, "CloseSpectatorMode" }, + { 5, nullptr, "StartScan_2" }, + { 6, nullptr, "GetMacAddress_2" }, + { 6, nullptr, "StopScan_2" }, + { 7, nullptr, "CreateBss" }, + { 7, nullptr, "Connect_2" }, + { 8, nullptr, "DestroyBss" }, + { 8, nullptr, "CancelConnect_2" }, + { 9, nullptr, "StartScan_2" }, + { 9, nullptr, "Join" }, + { 10, nullptr, "StopScan_2" }, + { 10, nullptr, "CancelJoin" }, + { 11, nullptr, "Connect_2" }, + { 11, nullptr, "Disconnect_2" }, + { 12, nullptr, "CancelConnect_2" }, + { 12, nullptr, "SetBeaconLostCount" }, + { 13, nullptr, "Join" }, + { 13, nullptr, "GetSystemEvent_2" }, + { 14, nullptr, "CancelJoin" }, + { 14, nullptr, "GetConnectionStatus_2" }, + { 15, nullptr, "Disconnect_2" }, + { 15, nullptr, "GetClientStatus" }, + { 16, nullptr, "SetBeaconLostCount" }, + { 16, nullptr, "GetBssIndicationEvent" }, + { 17, nullptr, "GetSystemEvent_2" }, + { 17, nullptr, "GetBssIndicationInfo" }, + { 18, nullptr, "GetConnectionStatus_2" }, + { 18, nullptr, "GetState_2" }, + { 19, nullptr, "GetClientStatus" }, + { 19, nullptr, "GetAllowedChannels" }, + { 20, nullptr, "GetBssIndicationEvent" }, + { 20, nullptr, "AddIe" }, + { 21, nullptr, "GetBssIndicationInfo" }, + { 21, nullptr, "DeleteIe" }, + { 22, nullptr, "GetState_2" }, + { 22, nullptr, "PutFrameRaw" }, + { 23, nullptr, "GetAllowedChannels" }, + { 23, nullptr, "CancelGetFrame" }, + { 24, nullptr, "AddIe" }, + { 24, nullptr, "CreateRxEntry" }, + { 25, nullptr, "DeleteIe" }, + { 25, nullptr, "DeleteRxEntry" }, + { 26, nullptr, "PutFrameRaw" }, + { 26, nullptr, "AddEthertypeToRxEntry" }, + { 27, nullptr, "CancelGetFrame" }, + { 27, nullptr, "DeleteEthertypeFromRxEntry" }, + { 28, nullptr, "CreateRxEntry" }, + { 28, nullptr, "AddMatchingDataToRxEntry" }, + { 29, nullptr, "DeleteRxEntry" }, + { 29, nullptr, "RemoveMatchingDataFromRxEntry" }, + { 30, nullptr, "AddEthertypeToRxEntry" }, + { 30, nullptr, "GetScanResult_2" }, + { 31, nullptr, "DeleteEthertypeFromRxEntry" }, + { 31, nullptr, "PutActionFrameOneShot" }, + { 32, nullptr, "AddMatchingDataToRxEntry" }, + { 32, nullptr, "SetActionFrameWithBeacon" }, + { 33, nullptr, "RemoveMatchingDataFromRxEntry" }, + { 33, nullptr, "CancelActionFrameWithBeacon" }, + { 34, nullptr, "GetScanResult_2" }, + { 34, nullptr, "CreateRxEntryForActionFrame" }, + { 35, nullptr, "PutActionFrameOneShot" }, + { 35, nullptr, "DeleteRxEntryForActionFrame" }, + { 36, nullptr, "SetActionFrameWithBeacon" }, + { 36, nullptr, "AddSubtypeToRxEntryForActionFrame" }, + { 37, nullptr, "CancelActionFrameWithBeacon" }, + { 37, nullptr, "DeleteSubtypeFromRxEntryForActionFrame" }, + { 38, nullptr, "CreateRxEntryForActionFrame" }, + { 38, nullptr, "CancelGetActionFrame" }, + { 39, nullptr, "DeleteRxEntryForActionFrame" }, + { 39, nullptr, "GetRssi_2" }, + { 40, nullptr, "AddSubtypeToRxEntryForActionFrame" }, + { 40, nullptr, "SetMaxAssociationNumber" }, + { 41, nullptr, "DeleteSubtypeFromRxEntryForActionFrame" }, + { 41, nullptr, "Cmd41" }, + { 42, nullptr, "CancelGetActionFrame" }, + { 42, nullptr, "Cmd42" }, + { 43, nullptr, "GetRssi_2" }, + { 43, nullptr, "Cmd43" }, + { 44, nullptr, "SetMaxAssociationNumber" }, + { 45, nullptr, "OpenLcsMasterMode" }, + { 46, nullptr, "CloseLcsMasterMode" }, + { 47, nullptr, "OpenLcsClientMode" }, + { 48, nullptr, "CloseLcsClientMode" }, + { 49, nullptr, "GetChannelStats" }, + { 50, nullptr, "Cmd50" }, + { 51, nullptr, "Cmd51" }, + { 52, nullptr, "Cmd52" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "OpenMasterMode"}, - FunctionInfo{0, nullptr, "OpenMode_2"}, - FunctionInfo{1, nullptr, "CloseMasterMode"}, - FunctionInfo{1, nullptr, "CloseMode_2"}, - FunctionInfo{2, nullptr, "OpenClientMode"}, - FunctionInfo{2, nullptr, "GetMacAddress_2"}, - FunctionInfo{3, nullptr, "CloseClientMode"}, - FunctionInfo{3, nullptr, "CreateBss"}, - FunctionInfo{4, nullptr, "OpenSpectatorMode"}, - FunctionInfo{4, nullptr, "DestroyBss"}, - FunctionInfo{5, nullptr, "CloseSpectatorMode"}, - FunctionInfo{5, nullptr, "StartScan_2"}, - FunctionInfo{6, nullptr, "GetMacAddress_2"}, - FunctionInfo{6, nullptr, "StopScan_2"}, - FunctionInfo{7, nullptr, "CreateBss"}, - FunctionInfo{7, nullptr, "Connect_2"}, - FunctionInfo{8, nullptr, "DestroyBss"}, - FunctionInfo{8, nullptr, "CancelConnect_2"}, - FunctionInfo{9, nullptr, "StartScan_2"}, - FunctionInfo{9, nullptr, "Join"}, - FunctionInfo{10, nullptr, "StopScan_2"}, - FunctionInfo{10, nullptr, "CancelJoin"}, - FunctionInfo{11, nullptr, "Connect_2"}, - FunctionInfo{11, nullptr, "Disconnect_2"}, - FunctionInfo{12, nullptr, "CancelConnect_2"}, - FunctionInfo{12, nullptr, "SetBeaconLostCount"}, - FunctionInfo{13, nullptr, "Join"}, - FunctionInfo{13, nullptr, "GetSystemEvent_2"}, - FunctionInfo{14, nullptr, "CancelJoin"}, - FunctionInfo{14, nullptr, "GetConnectionStatus_2"}, - FunctionInfo{15, nullptr, "Disconnect_2"}, - FunctionInfo{15, nullptr, "GetClientStatus"}, - FunctionInfo{16, nullptr, "SetBeaconLostCount"}, - FunctionInfo{16, nullptr, "GetBssIndicationEvent"}, - FunctionInfo{17, nullptr, "GetSystemEvent_2"}, - FunctionInfo{17, nullptr, "GetBssIndicationInfo"}, - FunctionInfo{18, nullptr, "GetConnectionStatus_2"}, - FunctionInfo{18, nullptr, "GetState_2"}, - FunctionInfo{19, nullptr, "GetClientStatus"}, - FunctionInfo{19, nullptr, "GetAllowedChannels"}, - FunctionInfo{20, nullptr, "GetBssIndicationEvent"}, - FunctionInfo{20, nullptr, "AddIe"}, - FunctionInfo{21, nullptr, "GetBssIndicationInfo"}, - FunctionInfo{21, nullptr, "DeleteIe"}, - FunctionInfo{22, nullptr, "GetState_2"}, - FunctionInfo{22, nullptr, "PutFrameRaw"}, - FunctionInfo{23, nullptr, "GetAllowedChannels"}, - FunctionInfo{23, nullptr, "CancelGetFrame"}, - FunctionInfo{24, nullptr, "AddIe"}, - FunctionInfo{24, nullptr, "CreateRxEntry"}, - FunctionInfo{25, nullptr, "DeleteIe"}, - FunctionInfo{25, nullptr, "DeleteRxEntry"}, - FunctionInfo{26, nullptr, "PutFrameRaw"}, - FunctionInfo{26, nullptr, "AddEthertypeToRxEntry"}, - FunctionInfo{27, nullptr, "CancelGetFrame"}, - FunctionInfo{27, nullptr, "DeleteEthertypeFromRxEntry"}, - FunctionInfo{28, nullptr, "CreateRxEntry"}, - FunctionInfo{28, nullptr, "AddMatchingDataToRxEntry"}, - FunctionInfo{29, nullptr, "DeleteRxEntry"}, - FunctionInfo{29, nullptr, "RemoveMatchingDataFromRxEntry"}, - FunctionInfo{30, nullptr, "AddEthertypeToRxEntry"}, - FunctionInfo{30, nullptr, "GetScanResult_2"}, - FunctionInfo{31, nullptr, "DeleteEthertypeFromRxEntry"}, - FunctionInfo{31, nullptr, "PutActionFrameOneShot"}, - FunctionInfo{32, nullptr, "AddMatchingDataToRxEntry"}, - FunctionInfo{32, nullptr, "SetActionFrameWithBeacon"}, - FunctionInfo{33, nullptr, "RemoveMatchingDataFromRxEntry"}, - FunctionInfo{33, nullptr, "CancelActionFrameWithBeacon"}, - FunctionInfo{34, nullptr, "GetScanResult_2"}, - FunctionInfo{34, nullptr, "CreateRxEntryForActionFrame"}, - FunctionInfo{35, nullptr, "PutActionFrameOneShot"}, - FunctionInfo{35, nullptr, "DeleteRxEntryForActionFrame"}, - FunctionInfo{36, nullptr, "SetActionFrameWithBeacon"}, - FunctionInfo{36, nullptr, "AddSubtypeToRxEntryForActionFrame"}, - FunctionInfo{37, nullptr, "CancelActionFrameWithBeacon"}, - FunctionInfo{37, nullptr, "DeleteSubtypeFromRxEntryForActionFrame"}, - FunctionInfo{38, nullptr, "CreateRxEntryForActionFrame"}, - FunctionInfo{38, nullptr, "CancelGetActionFrame"}, - FunctionInfo{39, nullptr, "DeleteRxEntryForActionFrame"}, - FunctionInfo{39, nullptr, "GetRssi_2"}, - FunctionInfo{40, nullptr, "AddSubtypeToRxEntryForActionFrame"}, - FunctionInfo{40, nullptr, "SetMaxAssociationNumber"}, - FunctionInfo{41, nullptr, "DeleteSubtypeFromRxEntryForActionFrame"}, - FunctionInfo{41, nullptr, "Cmd41"}, - FunctionInfo{42, nullptr, "CancelGetActionFrame"}, - FunctionInfo{42, nullptr, "Cmd42"}, - FunctionInfo{43, nullptr, "GetRssi_2"}, - FunctionInfo{43, nullptr, "Cmd43"}, - FunctionInfo{44, nullptr, "SetMaxAssociationNumber"}, - FunctionInfo{45, nullptr, "OpenLcsMasterMode"}, - FunctionInfo{46, nullptr, "CloseLcsMasterMode"}, - FunctionInfo{47, nullptr, "OpenLcsClientMode"}, - FunctionInfo{48, nullptr, "CloseLcsClientMode"}, - FunctionInfo{49, nullptr, "GetChannelStats"}, - FunctionInfo{50, nullptr, "Cmd50"}, - FunctionInfo{51, nullptr, "Cmd51"}, - FunctionInfo{52, nullptr, "Cmd52"} - ); }; class ILocalGetFrame final : public ServiceFramework { public: explicit ILocalGetFrame(Core::System& system_) : ServiceFramework{system_, "wlan:lg"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "GetFrameRaw" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetFrameRaw" } - ); }; class ILocalGetActionFrame final : public ServiceFramework { public: explicit ILocalGetActionFrame(Core::System& system_) : ServiceFramework{system_, "wlan:lga"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "GetActionFrame" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetActionFrame" } - ); }; class ISocketGetFrame final : public ServiceFramework { public: explicit ISocketGetFrame(Core::System& system_) : ServiceFramework{system_, "wlan:sg"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "GetFrameRaw" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "GetFrameRaw" } - ); }; class ISocketManager final : public ServiceFramework { public: explicit ISocketManager(Core::System& system_) : ServiceFramework{system_, "wlan:soc"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "PutFrameRaw_2" }, + { 1, nullptr, "CancelGetFrame_2" }, + { 2, nullptr, "CreateRxEntry_2" }, + { 3, nullptr, "DeleteRxEntry_2" }, + { 4, nullptr, "AddEthertypeToRxEntry_2" }, + { 5, nullptr, "DeleteEthertypeFromRxEntry_2" }, + { 6, nullptr, "GetMacAddress_3" }, + { 7, nullptr, "SwitchTsfTimerFunction" }, + { 8, nullptr, "GetDeltaTimeBetweenSystemAndTsf" }, + { 9, nullptr, "RegisterSharedMemory" }, + { 10, nullptr, "UnregisterSharedMemory" }, + { 11, nullptr, "EnableSharedMemory" }, + { 12, nullptr, "SetMulticastFilter" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "PutFrameRaw_2"}, - FunctionInfo{1, nullptr, "CancelGetFrame_2"}, - FunctionInfo{2, nullptr, "CreateRxEntry_2"}, - FunctionInfo{3, nullptr, "DeleteRxEntry_2"}, - FunctionInfo{4, nullptr, "AddEthertypeToRxEntry_2"}, - FunctionInfo{5, nullptr, "DeleteEthertypeFromRxEntry_2"}, - FunctionInfo{6, nullptr, "GetMacAddress_3"}, - FunctionInfo{7, nullptr, "SwitchTsfTimerFunction"}, - FunctionInfo{8, nullptr, "GetDeltaTimeBetweenSystemAndTsf"}, - FunctionInfo{9, nullptr, "RegisterSharedMemory"}, - FunctionInfo{10, nullptr, "UnregisterSharedMemory"}, - FunctionInfo{11, nullptr, "EnableSharedMemory"}, - FunctionInfo{12, nullptr, "SetMulticastFilter"} - ); }; class IDetectManager final : public ServiceFramework { public: explicit IDetectManager(Core::System& system_) : ServiceFramework{system_, "wlan:dtc"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "Cmd0" }, + { 1, nullptr, "Cmd1" }, + { 2, nullptr, "Cmd2" }, + { 3, nullptr, "Cmd3" }, + { 4, nullptr, "Cmd4" }, + { 5, nullptr, "Cmd5" }, + { 6, nullptr, "Cmd6" }, + { 7, nullptr, "Cmd7" }, + { 8, nullptr, "Cmd8" }, + { 9, nullptr, "Cmd9" }, + { 10, nullptr, "Cmd10" }, + { 11, nullptr, "Cmd11" }, + { 12, nullptr, "Cmd12" }, + { 13, nullptr, "Cmd13" }, + { 14, nullptr, "Cmd14" }, + { 15, nullptr, "Cmd15" }, + { 16, nullptr, "Cmd16" }, + { 17, nullptr, "Cmd17" }, + { 18, nullptr, "Cmd18" }, + { 19, nullptr, "Cmd19" }, + { 20, nullptr, "Cmd20" }, + { 21, nullptr, "Cmd21" }, + { 22, nullptr, "Cmd22" }, + { 23, nullptr, "Cmd23" }, + { 24, nullptr, "Cmd24" }, + { 25, nullptr, "Cmd25" }, + { 26, nullptr, "Cmd26" }, + { 27, nullptr, "Cmd27" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "Cmd0"}, - FunctionInfo{1, nullptr, "Cmd1"}, - FunctionInfo{2, nullptr, "Cmd2"}, - FunctionInfo{3, nullptr, "Cmd3"}, - FunctionInfo{4, nullptr, "Cmd4"}, - FunctionInfo{5, nullptr, "Cmd5"}, - FunctionInfo{6, nullptr, "Cmd6"}, - FunctionInfo{7, nullptr, "Cmd7"}, - FunctionInfo{8, nullptr, "Cmd8"}, - FunctionInfo{9, nullptr, "Cmd9"}, - FunctionInfo{10, nullptr, "Cmd10"}, - FunctionInfo{11, nullptr, "Cmd11"}, - FunctionInfo{12, nullptr, "Cmd12"}, - FunctionInfo{13, nullptr, "Cmd13"}, - FunctionInfo{14, nullptr, "Cmd14"}, - FunctionInfo{15, nullptr, "Cmd15"}, - FunctionInfo{16, nullptr, "Cmd16"}, - FunctionInfo{17, nullptr, "Cmd17"}, - FunctionInfo{18, nullptr, "Cmd18"}, - FunctionInfo{19, nullptr, "Cmd19"}, - FunctionInfo{20, nullptr, "Cmd20"}, - FunctionInfo{21, nullptr, "Cmd21"}, - FunctionInfo{22, nullptr, "Cmd22"}, - FunctionInfo{23, nullptr, "Cmd23"}, - FunctionInfo{24, nullptr, "Cmd24"}, - FunctionInfo{25, nullptr, "Cmd25"}, - FunctionInfo{26, nullptr, "Cmd26"}, - FunctionInfo{27, nullptr, "Cmd27"} - ); }; class IPrivateServiceCreator final : public ServiceFramework { public: explicit IPrivateServiceCreator(Core::System& system_) : ServiceFramework{system_, "wlan:p"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "CreateWirelessCommunicationService" }, + { 1, nullptr, "CreatePrivateWirelessCommunicationService" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateWirelessCommunicationService"}, - FunctionInfo{1, nullptr, "CreatePrivateWirelessCommunicationService"} - ); }; class ISfDriverServiceCreator final : public ServiceFramework { public: explicit ISfDriverServiceCreator(Core::System& system_) : ServiceFramework{system_, "wlan:nd"} - {} - - std::optional FindRequest(u32 key) override { - return HandlerTableGenerateWithFind(key, functions); + { + static const FunctionInfo functions[] = { + { 0, nullptr, "CreateDriverService" }, + }; + RegisterHandlers(functions); } - static constexpr auto functions = CreateStaticMap( - FunctionInfo{0, nullptr, "CreateDriverService" } - ); }; void LoopProcess(Core::System& system) { diff --git a/tools/README.md b/tools/README.md index f6a520a69c..cde6a21464 100644 --- a/tools/README.md +++ b/tools/README.md @@ -8,7 +8,7 @@ Tools for Eden and other subprojects. When adding new scripts please use `#!/bin ## Binaries -- `maxwell-spirv`: Converts Maxwell shaders (dumped from `.ash` files) into SPIR-V code sent to stdout. +- `maxwell-spirv`: Converts Maxwell shaders (dumped from `.ash` files) into SPIR-V code (emitted into STDOUT). - `maxwell-disas`: Dumb raw Maxwell disassembler. - `maxwell-ir`: Dump generated IR of Maxwell shaders. From aaa0bcb9bf5694d62538c361b210147294a5ce3d Mon Sep 17 00:00:00 2001 From: xbzk Date: Thu, 15 Oct 2026 12:13:17 +0200 Subject: [PATCH 111/128] [patcher, ro, settings] runtime tls patch (#4492) optimization and nuke toggle (#4502) (#4523) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- This is a follow up for the biomutant fix. By the time i knew it was shallow, coz i was running patchtext routine even for svc and modules, causing a routine which were needed to run 14 times to run 4000+ instead. Since some perf loss was reported in 30 sep nightly, and it caused ac3r to not boot, we had added a temp toggle, which is now being removed as optimizations + fix are in. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4523 Reviewed-by: lizzie Reviewed-by: MaranBr --- .../features/settings/model/BooleanSetting.kt | 3 +- .../settings/model/view/SettingsItem.kt | 7 --- .../settings/ui/SettingsFragmentPresenter.kt | 1 - .../app/src/main/res/values/strings.xml | 2 - src/common/settings.h | 2 - src/core/arm/nce/patcher.cpp | 42 +++++++++++++ src/core/arm/nce/patcher.h | 7 +++ src/core/hle/service/ro/ro.cpp | 62 ++++++++++++------- src/qt_common/config/shared_translation.cpp | 4 -- 9 files changed, 89 insertions(+), 41 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index 2f2d3823f8..0548004cf5 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -17,7 +17,6 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"), SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"), NCE_INVALIDATION_GPU_READBACK("nce_invalidation_gpu_readback"), - NCE_RUNTIME_NRO_PATCH("nce_runtime_nro_patch"), FIX_BLOOM_EFFECTS("fix_bloom_effects"), EMULATE_BGR565("emulate_bgr565"), RESCALE_HACK("rescale_hack"), @@ -95,7 +94,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { ENABLE_QUICK_SETTINGS("enable_quick_settings"); -// external fun isFrameSkippingEnabled(): Boolean + //external fun isFrameSkippingEnabled(): Boolean external fun isFrameInterpolationEnabled(): Boolean override fun getBoolean(needsGlobal: Boolean): Boolean = diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 8346339ee4..690c746628 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -866,13 +866,6 @@ abstract class SettingsItem( descriptionId = R.string.nce_invalidation_gpu_readback_description ) ) - put( - SwitchSetting( - BooleanSetting.NCE_RUNTIME_NRO_PATCH, - titleId = R.string.nce_runtime_nro_patch, - descriptionId = R.string.nce_runtime_nro_patch_description - ) - ) put( SwitchSetting( BooleanSetting.FIX_BLOOM_EFFECTS, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index 74e1e90836..f9185e39e6 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -555,7 +555,6 @@ class SettingsFragmentPresenter( add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key) add(BooleanSetting.NCE_INVALIDATION_GPU_READBACK.key) - add(BooleanSetting.NCE_RUNTIME_NRO_PATCH.key) add(BooleanSetting.FIX_BLOOM_EFFECTS.key) add(BooleanSetting.EMULATE_BGR565.key) add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key) diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 703a91fd02..191506c818 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -595,8 +595,6 @@ Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it\'s performance. This may cause glitches or crashes on some games. GPU Readback Before NCE Invalidation Temporary. Fix Ender Magnolia (and other UE titles) crashes. May reduce performance. Improvement in progress. - Patch Runtime NROs for NCE - Temporary. Fix Biomutant boot. May impact performance. Improvement in progress. Fix Bloom Effects Reduces bloom blur in LA/EOW (Adreno A6XX - A7XX/ Turnip), removes bloom in Burnout. Warning: may cause graphical artifacts in other games. Emulate BGR565 diff --git a/src/common/settings.h b/src/common/settings.h index 2a4bf3e9e4..d1f891607b 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -641,8 +641,6 @@ struct Values { true}; SwitchableSetting nce_invalidation_gpu_readback{ linkage, false, "nce_invalidation_gpu_readback", Category::RendererHacks}; - SwitchableSetting nce_runtime_nro_patch{ - linkage, false, "nce_runtime_nro_patch", Category::RendererHacks}; SwitchableSetting async_presentation{linkage, #ifdef __ANDROID__ true, diff --git a/src/core/arm/nce/patcher.cpp b/src/core/arm/nce/patcher.cpp index 7d2041d4d2..f21d7cacdc 100644 --- a/src/core/arm/nce/patcher.cpp +++ b/src/core/arm/nce/patcher.cpp @@ -45,6 +45,23 @@ Patcher::Patcher() : c(m_patch_instructions), c_pre(m_patch_instructions_pre) { WriteLoadContext(c_pre); } +Patcher::Patcher(std::span text) : c(m_patch_instructions), c_pre(m_patch_instructions_pre) { + modules.emplace_back(); + curr_patch = &modules.back(); + const auto words = std::span{reinterpret_cast(text.data()), text.size() / sizeof(u32)}; + for (u32 i = ModuleCodeIndex; i < static_cast(words.size()); ++i) { + const uintptr_t offset = i * sizeof(u32); + if (auto mrs = MRS{words[i]}; mrs.Verify() && mrs.GetRt() != 31 && (mrs.GetSystemReg() == TpidrEl0 || mrs.GetSystemReg() == TpidrroEl0)) { + BranchToPatch(offset); + const auto src_reg = mrs.GetSystemReg() == TpidrroEl0 ? oaknut::SystemReg::TPIDRRO_EL0 : oaknut::SystemReg::TPIDR_EL0; + WriteMrsHandler(offset + sizeof(u32), oaknut::XReg{static_cast(mrs.GetRt())}, src_reg); + } else if (auto msr = MSR{words[i]}; msr.Verify() && msr.GetSystemReg() == TpidrEl0) { + BranchToPatch(offset); + WriteMsrHandler(offset + sizeof(u32), oaknut::XReg{static_cast(msr.GetRt())}); + } + } +} + Patcher::~Patcher() = default; bool Patcher::PatchText(std::span program_image, const Kernel::CodeSet::Segment& code) { @@ -182,6 +199,31 @@ bool Patcher::PatchText(std::span program_image, const Kernel::CodeSet return true; } +std::span Patcher::RelocateRuntimeTls( + s64 patch_offset, std::vector& out_patches) { + const auto& patch = modules.front(); + const auto can_branch = [](s64 offset) { + return offset % 4 == 0 && offset >= -static_cast(MaxRelativeBranch) && offset < static_cast(MaxRelativeBranch); + }; + out_patches.clear(); + out_patches.reserve(patch.m_branch_to_patch_relocations.size()); + for (const auto& rel : patch.m_branch_to_patch_relocations) { + const s64 offset = patch_offset + rel.patch_offset - static_cast(rel.module_offset); + if (!can_branch(offset)) {return {};} + u32 replacement; + oaknut::CodeGenerator rc{&replacement}; + rc.B(offset); + out_patches.push_back({rel.module_offset, replacement}); + } + for (const auto& rel : patch.m_branch_to_module_relocations) { + const s64 offset = static_cast(rel.module_offset) - patch_offset - rel.patch_offset; + if (!can_branch(offset)) {return {};} + oaknut::CodeGenerator rc{m_patch_instructions.data() + rel.patch_offset / sizeof(u32)}; + rc.B(offset); + } + return m_patch_instructions; +} + bool Patcher::RelocateAndCopy(Common::ProcessAddress load_base, const Kernel::CodeSet::Segment& code, std::vector& program_image, EntryTrampolines* out_trampolines) { const size_t patch_size = GetSectionSize(); const size_t pre_patch_size = GetPreSectionSize(); diff --git a/src/core/arm/nce/patcher.h b/src/core/arm/nce/patcher.h index a3b314000c..695161cd18 100644 --- a/src/core/arm/nce/patcher.h +++ b/src/core/arm/nce/patcher.h @@ -48,15 +48,22 @@ using ModuleTextAddress = u64; using PatchTextAddress = u64; using EntryTrampolines = ::Common::unordered_map; +struct InstructionPatch { + u64 offset; + u32 replacement; +}; + class Patcher { public: void SetModuleID(const ModuleID& id) { module_id = id; } explicit Patcher(); + explicit Patcher(std::span text); ~Patcher(); bool PatchText(std::span program_image, const Kernel::CodeSet::Segment& code); bool RelocateAndCopy(Common::ProcessAddress load_base, const Kernel::CodeSet::Segment& code, std::vector& program_image, EntryTrampolines* out_trampolines); + std::span RelocateRuntimeTls(s64 patch_offset, std::vector& out_patches); size_t GetSectionSize() const noexcept; size_t GetPreSectionSize() const noexcept; diff --git a/src/core/hle/service/ro/ro.cpp b/src/core/hle/service/ro/ro.cpp index 167bf04c9a..335efa3ad3 100644 --- a/src/core/hle/service/ro/ro.cpp +++ b/src/core/hle/service/ro/ro.cpp @@ -7,6 +7,7 @@ #include #include +#include "common/scope_exit.h" #include "core/hle/kernel/k_process.h" #include "core/hle/service/cmif_serialization.h" @@ -425,36 +426,51 @@ public: R_TRY(context->ValidateNro(std::addressof(nro_info->module_id), std::addressof(rx_size), std::addressof(ro_size), std::addressof(rw_size), nro_info->base_address, nro_size, bss_size)); + R_TRY(SetNroPerms(context->GetProcess(), nro_info->base_address, rx_size, ro_size, rw_size + bss_size)); #ifdef HAS_NCE - if (Settings::values.nce_runtime_nro_patch.GetValue()) { - if (Settings::IsNceEnabled()) { - auto* process = context->GetProcess(); - auto& memory = process->GetMemory(); - - std::vector image(total_size); - memory.ReadBlock(nro_info->base_address, image.data(), rx_size); - - Kernel::CodeSet::Segment code{.size = static_cast(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(); + if (Settings::IsNceEnabled()) { + auto* process = context->GetProcess(); + auto& memory = process->GetMemory(); + std::vector text(rx_size); + memory.ReadBlock(nro_info->base_address, text.data(), text.size()); + Core::NCE::Patcher patch{text}; + const size_t patch_size = patch.GetSectionSize(); + if (patch_size != 0) { constexpr auto permission = Kernel::Svc::MemoryPermission::ReadExecute; - auto* patch_memory = Kernel::KSharedMemory::Create(kernel); + SCOPE_EXIT { patch_memory->Close(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); + Kernel::KSharedMemory::Register(kernel, patch_memory); + const std::array offsets{static_cast(total_size + Kernel::PageSize),-static_cast(patch_size + Kernel::PageSize)}; + std::vector tls_patches; + std::span instructions; + u64 patch_address = 0; + for (const s64 offset : offsets) { + instructions = patch.RelocateRuntimeTls(offset, tls_patches); + if (instructions.empty()) {continue;} + const u64 address = static_cast(static_cast(nro_info->base_address) + offset); + if (R_FAILED(patch_memory->Map(*process, address, patch_size, permission))) {continue;} + patch_address = address; + break; + } + R_UNLESS(patch_address != 0, RO::ResultOutOfAddressSpace); + const Result add_shared_memory_result = process->AddSharedMemory(kernel, patch_memory, patch_address, patch_size); + if (R_FAILED(add_shared_memory_result)) { + R_ASSERT(patch_memory->Unmap(*process, patch_address, patch_size)); + } + R_TRY(add_shared_memory_result); + std::memcpy(patch_memory->GetPointer(), instructions.data(), instructions.size_bytes()); + auto* ptr = reinterpret_cast(patch_address); + __builtin___clear_cache(ptr, ptr + instructions.size_bytes()); + for (const auto& instruction : tls_patches) { + const u64 address = nro_info->base_address + instruction.offset; + memory.Write32(address, instruction.replacement); + ptr = reinterpret_cast(address); + __builtin___clear_cache(ptr, ptr + sizeof(u32)); + } } } #endif - // Set NRO perms. - R_TRY(SetNroPerms(context->GetProcess(), nro_info->base_address, rx_size, ro_size, - rw_size + bss_size)); context->SetNroInfoInUse(nro_info, true); nro_info->code_size = rx_size + ro_size; diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index 964a4cdad4..09e64b98f0 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -198,10 +198,6 @@ std::unique_ptr InitializeTranslations(QObject* parent) { tr("GPU Readback Before NCE Invalidation"), tr("Flushes GPU buffer data back to guest memory before NCE invalidates the whole " "guest page, preserving it while the CPU store proceeds.")); - INSERT(Settings, nce_runtime_nro_patch, - tr("Patch Runtime NROs for NCE"), - tr("Applies NCE code patches to runtime-loaded NRO modules." - "This is required for some games to run correctly.")); INSERT(Settings, vsync_mode, tr("VSync Mode:"), tr("FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen " "refresh rate.\nFIFO Relaxed allows tearing as it recovers from a slow down.\n" From d8c6c59b679867d2595fdc0953df033475e23380 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Fri, 16 Oct 2026 01:17:53 +0200 Subject: [PATCH 112/128] Fix Check Strings after 4523 (#4534) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4534 --- src/android/app/src/main/res/values-ar/strings.xml | 2 -- src/android/app/src/main/res/values-zh-rTW/strings.xml | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 09722b486e..2fdff9847b 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -589,8 +589,6 @@ يتخطى بعض عمليات إبطال ذاكرة التخزين المؤقتة من جانب وحدة المعالجة المركزية أثناء تحديثات الذاكرة، مما يقلل من استخدام وحدة المعالجة المركزية ويحسن أداءها. قد يتسبب ذلك في حدوث أعطال أو تعطل في بعض الألعاب. إعادة قراءة وحدة معالجة الرسومات قبل إبطال صلاحية NCE إصلاح مؤقت. يعالج مشكلة تعطل لعبة Ender Magnolia (وغيرها من ألعاب UE). قد يؤدي إلى انخفاض في الأداء. يجري العمل على تحسينه. - تصحيح حالات NRO في وقت التشغيل لـ NCE - حل مؤقت. إصلاح مشكلة تشغيل لعبة Biomutant. قد يؤثر ذلك على الأداء. يجري العمل على تحسينه. إصلاح تأثيرات التوهج يقلل من ضبابية التوهج في LA/EOW (Adreno A6XX - A7XX/ Turnip)، ويزيل التوهج في Burnout. تحذير: قد يسبب تشوهات رسومية في ألعاب أخرى. محاكاة BGR565 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 3f3272daf4..3f0c6d9215 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -579,8 +579,6 @@ 在記憶體更新期間跳過某些 CPU 端快取的失效處理,減少 CPU 使用率並提高其性能。可能會導致某些遊戲出現故障或當機 在 NCE 無效化前進行 GPU 回讀 (暫時性功能)修復 \"終結者瑪格諾莉亞:霧中綻放\" 及其它使用虛幻引擎之遊戲中的當機問題,可能會降低效能。此功能正在改善中 - 對 NCE Runtime 的 NRO 檔案進行修補 - (暫時性功能)修復 \"Biomutant\" 的啟動問題,可能會對效能造成影響。此功能正在改善中 修正光暈特效 在 \"薩爾達傳說:織夢島\" 和 \"薩爾達傳說:智慧的再現\" 中減少光暈模糊的問題並移除 \"橫衝直撞:狂飆樂園重製版\" 中的光暈效果(適用於 Adreno A6XX - A7XX/ Turnip)。警告:可能會在其它遊戲中導致圖形異常 模擬 BGR565 @@ -1197,4 +1195,4 @@ 授權 來自 AMD 的升級圖像品質 - + \ No newline at end of file From e0d47f2790e3f758fa2188926a0bb2f56af6b310 Mon Sep 17 00:00:00 2001 From: crueter Date: Fri, 16 Oct 2026 21:41:11 +0200 Subject: [PATCH 113/128] [cmake] fix macOS compilation by forcing lz4 to be static (#4540) Signed-off-by: crueter - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4540 --- CMakeModules/find/Findlz4.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeModules/find/Findlz4.cmake b/CMakeModules/find/Findlz4.cmake index d4f2153162..77ac390160 100644 --- a/CMakeModules/find/Findlz4.cmake +++ b/CMakeModules/find/Findlz4.cmake @@ -24,7 +24,7 @@ else() endif() if (lz4_FOUND AND NOT TARGET lz4::lz4) - if (TARGET LZ4::lz4_shared) + if (TARGET LZ4::lz4_shared AND NOT YUZU_STATIC_BUILD) add_library(lz4::lz4 ALIAS LZ4::lz4_shared) elseif (TARGET LZ4::lz4_static) add_library(lz4::lz4 ALIAS LZ4::lz4_static) From de7e6e01d43e8cf2ec193d74fa053b0d7949955f Mon Sep 17 00:00:00 2001 From: John Date: Sun, 18 Oct 2026 00:17:28 +0200 Subject: [PATCH 114/128] Revert [input_common/joycon] Enumerate SDL devices iff SDL signals change (#4486) (#4545) Due to causing the platform windows to crash when a controller is activated. - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Co-authored-by: Your Name Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4545 Reviewed-by: lizzie Reviewed-by: Maufeat --- src/input_common/drivers/joycon.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/input_common/drivers/joycon.cpp b/src/input_common/drivers/joycon.cpp index 047e7eb6d8..ded92d3f1d 100644 --- a/src/input_common/drivers/joycon.cpp +++ b/src/input_common/drivers/joycon.cpp @@ -83,21 +83,20 @@ void Joycons::ScanThread(std::stop_token stop_token) { constexpr u16 nintendo_vendor_id = 0x057e; Common::SetCurrentThreadName("JoyconScanThread"); - auto last_ret = 0u; do { - auto ret = SDL_hid_device_change_count(); - if (last_ret == 0u || last_ret != ret) { - last_ret = ret; - SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0); - for (auto* cur_dev = devs; cur_dev; cur_dev = cur_dev->next) { - if (IsDeviceNew(cur_dev)) { - LOG_DEBUG(Input, "Device Found,type : {:04X} {:04X}", cur_dev->vendor_id, cur_dev->product_id); - RegisterNewDevice(cur_dev); - } - cur_dev = cur_dev->next; + SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0); + SDL_hid_device_info* cur_dev = devs; + + while (cur_dev) { + if (IsDeviceNew(cur_dev)) { + LOG_DEBUG(Input, "Device Found,type : {:04X} {:04X}", cur_dev->vendor_id, + cur_dev->product_id); + RegisterNewDevice(cur_dev); } - SDL_hid_free_enumeration(devs); + cur_dev = cur_dev->next; } + + SDL_hid_free_enumeration(devs); } while (Common::StoppableTimedWait(stop_token, std::chrono::seconds{5})); } From 989768aa46720e3fcab9e2111e3ddd70819c382b Mon Sep 17 00:00:00 2001 From: John Date: Mon, 19 Oct 2026 15:58:04 +0200 Subject: [PATCH 115/128] Fix [core, gpu, threads] Multithreading refactor (#4254) (#4548) Performance loss regression fixed in Link's Awakening, Castlevania, Super Mario RPG, etc Tested by Mr. Knobs on Android and myself on Linux Multicore ON may be fixed for some users using Intel CPUs. Games include: FF Tactics, Shredder's Revenge, Unity Engine Games. - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4548 Reviewed-by: Maufeat Reviewed-by: lizzie --- .../service/nvnflinger/hardware_composer.cpp | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/core/hle/service/nvnflinger/hardware_composer.cpp b/src/core/hle/service/nvnflinger/hardware_composer.cpp index 5decb791e1..9ac56e17bb 100644 --- a/src/core/hle/service/nvnflinger/hardware_composer.cpp +++ b/src/core/hle/service/nvnflinger/hardware_composer.cpp @@ -57,8 +57,21 @@ u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, Display& display, // Set default speed limit to 100%. *out_speed_scale = 1.0f; + // If no layers are visible, skip the logic. Acquiring and holding buffers here would + // consume the producer's queue without ever presenting. + bool any_visible = false; + for (auto& layer : display.stack.layers) { + if (layer->visible) { + any_visible = true; + break; + } + } + if (!any_visible) { + return 1; + } + + // Wait for the previous composite, bounding the number of in-flight composites. nvdisp.WaitForComposite(); - this->ReleaseFramebuffersLocked(display); // Determine the number of vsync periods to wait before composing again. std::optional swap_interval{}; @@ -152,6 +165,13 @@ u32 HardwareComposer::ComposeLocked(f32* out_speed_scale, Display& display, // Advance by 1 frame (60 FPS compositing) m_frame_number += 1; + // Release framebuffers once the frame has been handed to the compositor. This happens + // within the same vsync period as the acquire (release_frame_number is checked against + // the advanced counter), so the producer gets its buffers back immediately instead of + // losing a queue slot for a whole frame. + // TODO: support release fences; releasing before the composite has finished can tear. + this->ReleaseFramebuffersLocked(display); + return 1; } From 305f40100d76ec57b13c2f03eafd490db83691cb Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Sun, 25 Oct 2026 10:03:16 +0100 Subject: [PATCH 116/128] Fix aarch and android builds (#4576) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- credit: John and Crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4576 Reviewed-by: crueter --- src/android/app/build.gradle.kts | 2 +- src/core/arm/nce/arm_nce_asm_definitions.h | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 3ae6d73994..69dd6a8e4f 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -259,7 +259,7 @@ android { externalNativeBuild { cmake { - version = "3.31.6" + version = "3.31.5" path = file("${edenDir}/CMakeLists.txt") } } diff --git a/src/core/arm/nce/arm_nce_asm_definitions.h b/src/core/arm/nce/arm_nce_asm_definitions.h index 8ea4383f73..ec6abd62d2 100644 --- a/src/core/arm/nce/arm_nce_asm_definitions.h +++ b/src/core/arm/nce/arm_nce_asm_definitions.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 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 */ @@ -5,9 +8,22 @@ #define __ASSEMBLY__ +// Newer Linux UAPI headers check __ASSEMBLER__ instead of __ASSEMBLY__ to hide C declarations. +// Without it, asm-generic/signal.h redeclares sigset_t and clashes with glibc's. Only define it +// around these includes, since glibc headers also look at __ASSEMBLER__. +#ifndef __ASSEMBLER__ +#define __ASSEMBLER__ +#define EDEN_NCE_UNDEF_ASSEMBLER +#endif + #include #include +#ifdef EDEN_NCE_UNDEF_ASSEMBLER +#undef __ASSEMBLER__ +#undef EDEN_NCE_UNDEF_ASSEMBLER +#endif + #define ReturnToRunCodeByExceptionLevelChangeSignal SIGUSR2 #define BreakFromRunCodeSignal SIGURG #define GuestAccessFaultSignal SIGSEGV From eb88a40a8eb0fe847281ea6913fcc7ff7daedcd2 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Sun, 25 Oct 2026 16:06:46 +0100 Subject: [PATCH 117/128] [qt] fix graphics API toggle getting stuck on OpenGL_GLSL (#4577) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4577 Reviewed-by: crueter Reviewed-by: CamilleLaVey --- src/yuzu/main_window.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 60bfbae5cd..6e21265f9e 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -3661,12 +3661,12 @@ void MainWindow::OnToggleGraphicsAPI() { api = Settings::RendererBackend::OpenGL_GLSL; break; case Settings::RendererBackend::OpenGL_GLSL: - api = Settings::RendererBackend::OpenGL_GLSL; - break; - case Settings::RendererBackend::OpenGL_SPIRV: api = Settings::RendererBackend::OpenGL_GLASM; break; case Settings::RendererBackend::OpenGL_GLASM: + api = Settings::RendererBackend::OpenGL_SPIRV; + break; + case Settings::RendererBackend::OpenGL_SPIRV: api = Settings::RendererBackend::Null; break; #else From 05f36d990ce5301b310871451201a72e4c52b4df Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Mon, 26 Oct 2026 16:23:23 +0100 Subject: [PATCH 118/128] [chore] re-add out/ to .gitignore (#4578) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4578 Reviewed-by: crueter Reviewed-by: CamilleLaVey --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 20ed5e93c1..873b99bec2 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ # Build directory /[Bb]uild*/ doc-build/ +out/ AppDir/ uruntime From 58968bd1274d8ebb1f159ad31500dde8d74abea6 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Mon, 26 Oct 2026 17:23:18 +0100 Subject: [PATCH 119/128] [core] Support block-compressed NSZ and XCZ (#4552) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- - Add NCZBLOCK (nsz -B / .xcz) reader: each read decodes only the covered blocks and re-encrypts CTR sections, no disk output. - Allow installing solid .nsz to NAND via DecompressNCZForInstall (lazy, incremental decode with frontier, O(n) instead of O(n^2)). - Accept BKTR updates with thousands of sections (MaxSectionCount = 0x10000). - Wire .nsz/.xcz into loader, registered cache, scanner, and NAND install (content_manager.h), and reject solid NCZ from the game list. - Bump the pinned zstd to 33618c8 in cpmfile.json, which includes the upstream AArch64 revert ([33618c89](https://github.com/facebook/zstd/commit/33618c89e511637f8a6ef955b3501766d71feb53)) for a ZSTD_decodeSequence branch optimization that could corrupt data on ARM64; without it, solid NCZ decoding on Android fails with "Data corruption detected". NCZ format and CTR counter semantics follow the reference nsz tool and its Rust port: - https://github.com/nicoboss/nsz (Decompressor.py, BlockDecompressorReader.py) - https://docs.rs/nsz-rs/0.3.0/src/nsz_rs/decompress.rs.html The last-block edge case (decompressed size is an exact multiple of block size) is handled as described in https://github.com/nicoboss/nsz/issues/210 Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4552 Reviewed-by: CamilleLaVey Reviewed-by: Shinmegumi --- cpmfile.json | 4 +- .../main/java/org/yuzu/yuzu_emu/model/Game.kt | 2 +- .../org/yuzu/yuzu_emu/utils/GameHelper.kt | 2 +- .../app/src/main/jni/game_metadata.cpp | 4 +- src/common/zstd_compression.cpp | 9 + src/common/zstd_compression.h | 14 + src/core/CMakeLists.txt | 2 + src/core/crypto/ncz_decompressor.cpp | 430 ++++++++++++++++++ src/core/crypto/ncz_decompressor.h | 35 ++ src/core/file_sys/registered_cache.cpp | 46 +- src/core/file_sys/submission_package.cpp | 12 + src/core/loader/loader.cpp | 48 +- src/core/loader/loader.h | 2 + src/core/loader/nsp.cpp | 11 + src/frontend_common/content_manager.h | 6 +- src/qt_common/game_list/worker.cpp | 10 +- src/qt_common/qt_common.cpp | 3 +- src/yuzu/main_window.cpp | 11 +- 18 files changed, 624 insertions(+), 27 deletions(-) create mode 100644 src/core/crypto/ncz_decompressor.cpp create mode 100644 src/core/crypto/ncz_decompressor.h diff --git a/cpmfile.json b/cpmfile.json index 9cac812b7a..0032734712 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -351,13 +351,13 @@ }, "zstd": { "find_args": "MODULE", - "hash": "cc5ad4b119a9c2ea57f0b71eeff01113bb506e0d17000159c5409cb8236d22e38c52d5e9e97e7947a4bf1b2dfc44b6c503ab2d9aedbd59458435c6a2849cb029", + "hash": "2b006c3c110c38bd2f5896b42d36a38931c8eae261f30552f9a9fd04458d218d8f1a1425f117fd12af545ed77042e4b2d1a1a9b6286c4d0b9d74ef79f20a8f08", "min_version": "1.5", "options": [ "ZSTD_BUILD_SHARED OFF" ], "repo": "facebook/zstd", "source_subdir": "build/cmake", - "version": "b8d6101fba" + "version": "33618c8" } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt index 6717894c93..f5f0cda0e9 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/Game.kt @@ -100,7 +100,7 @@ class Game( companion object { val extensions: Set = HashSet( - listOf("xci", "nsp", "nca", "nro") + listOf("xci", "nsp", "nca", "nro", "nsz", "xcz") ) } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt index 411b764e36..bb2337a310 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/GameHelper.kt @@ -109,7 +109,7 @@ object GameHelper { // File extensions considered as external content, buuut should // be done better imo. - private val externalContentExtensions = setOf("nsp", "xci") + private val externalContentExtensions = setOf("nsp", "xci", "nsz", "xcz") private fun scanContentContainersRecursive( files: Array, diff --git a/src/android/app/src/main/jni/game_metadata.cpp b/src/android/app/src/main/jni/game_metadata.cpp index 49d92bca75..9b6cd44e9f 100644 --- a/src/android/app/src/main/jni/game_metadata.cpp +++ b/src/android/app/src/main/jni/game_metadata.cpp @@ -76,7 +76,9 @@ jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobj auto const file_type = loader->GetFileType(); if (file_type == Loader::FileType::Unknown || file_type == Loader::FileType::Error) return false; - if ((file_type == Loader::FileType::NSP || file_type == Loader::FileType::XCI) && !Loader::IsBootableGameContainer(file, file_type)) + if ((file_type == Loader::FileType::NSP || file_type == Loader::FileType::XCI || + file_type == Loader::FileType::NSZ || file_type == Loader::FileType::XCZ) && + !Loader::IsBootableGameContainer(file, file_type)) return false; u64 program_id = 0; return loader->ReadProgramId(program_id) == Loader::ResultStatus::Success; diff --git a/src/common/zstd_compression.cpp b/src/common/zstd_compression.cpp index cb6ec171b5..7665482ee6 100644 --- a/src/common/zstd_compression.cpp +++ b/src/common/zstd_compression.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -46,4 +49,10 @@ std::vector DecompressDataZSTD(std::span compressed) { return decompressed; } +std::size_t DecompressDataZSTD(std::span compressed, std::span output) { + const std::size_t result = + ZSTD_decompress(output.data(), output.size(), compressed.data(), compressed.size()); + return ZSTD_isError(result) ? 0 : result; +} + } // namespace Common::Compression diff --git a/src/common/zstd_compression.h b/src/common/zstd_compression.h index a5ab2d05bd..819d7d201a 100644 --- a/src/common/zstd_compression.h +++ b/src/common/zstd_compression.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -42,4 +45,15 @@ namespace Common::Compression { */ [[nodiscard]] std::vector DecompressDataZSTD(std::span compressed); +/** + * Decompresses a single Zstandard frame into a caller-provided buffer of known size. + * + * @param compressed the compressed source memory region. + * @param output the destination buffer. Its size is the maximum number of bytes to write. + * + * @return the number of bytes written, or 0 if the frame is invalid or doesn't fit. An empty + * frame also returns 0. + */ +[[nodiscard]] std::size_t DecompressDataZSTD(std::span compressed, std::span output); + } // namespace Common::Compression diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 31f9931d3a..1b578f67ba 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -33,6 +33,8 @@ add_library(core STATIC crypto/encryption_layer.h crypto/key_manager.cpp crypto/key_manager.h + crypto/ncz_decompressor.cpp + crypto/ncz_decompressor.h crypto/partition_data_manager.cpp crypto/partition_data_manager.h crypto/xts_encryption_layer.cpp diff --git a/src/core/crypto/ncz_decompressor.cpp b/src/core/crypto/ncz_decompressor.cpp new file mode 100644 index 0000000000..5f56e55375 --- /dev/null +++ b/src/core/crypto/ncz_decompressor.cpp @@ -0,0 +1,430 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "common/common_types.h" +#include "common/logging.h" +#include "common/zstd_compression.h" +#include "core/crypto/aes_util.h" +#include "core/crypto/key_manager.h" +#include "core/crypto/ncz_decompressor.h" +#include "core/file_sys/vfs/vfs.h" + +namespace Core::Crypto { + +namespace { + +constexpr u64 HeaderSize = 0x4000; +constexpr std::size_t SectionWire = 0x40; +constexpr std::size_t BlockFixed = 0x18; +constexpr std::size_t Chunk = 0x100000; +// Upper bound on NCZ section entries (64 bytes each, so the table is at most 4 MiB). A base NCA +// has a handful of sections, but nsz stores an update's patch (BKTR) data one entry per +// subsection, which is thousands of them. +constexpr u64 MaxSectionCount = 0x10000; +constexpr std::array SectionsMagic{'N', 'C', 'Z', 'S', 'E', 'C', 'T', 'N'}; +constexpr std::array BlockMagic{'N', 'C', 'Z', 'B', 'L', 'O', 'C', 'K'}; + +struct Section { + s64 offset, size; + u64 crypto_type; + Key128 key, counter; + bool Ctr() const { return crypto_type == 3 || crypto_type == 4; } +}; + +struct BlockHeader { + u32 exponent; + u64 decompressed_size; + std::vector sizes; +}; + +u64 Le(const u8* p, std::size_t n) { + u64 v = 0; + for (std::size_t i = n; i-- > 0;) v = (v << 8) | p[i]; + return v; +} + +// Mirrors nsz AESCTR.seek(): upper 8 bytes = stored counter, lower 8 = absolute NCA offset / 16. +void SetIv(Key128& iv, const Key128& base, u64 off) { + iv = base; + u64 blk = off >> 4; + for (std::size_t i = 0; i < 8; ++i) { iv[15 - i] = static_cast(blk & 0xFF); blk >>= 8; } +} + +// Parse header + section table + optional block header. Returns payload_start. +std::optional, std::optional>> ParseHeader( + const FileSys::VirtualFile& f, u64& payload_start) { + const u64 fsize = f->GetSize(); + if (fsize < HeaderSize + 16) return std::nullopt; + + const auto head = f->ReadBytes(16, HeaderSize); + if (head.size() != 16 || !std::equal(head.begin(), head.begin() + 8, SectionsMagic.begin())) + return std::nullopt; + const u64 count = Le(head.data() + 8, 8); + if (count == 0 || count > MaxSectionCount || count * SectionWire > fsize - HeaderSize - 16) + return std::nullopt; + + const auto table = f->ReadBytes(count * SectionWire, HeaderSize + 16); + if (table.size() != count * SectionWire) return std::nullopt; + + std::vector
sections; + sections.reserve(count + 1); + for (u64 i = 0; i < count; ++i) { + const u8* e = table.data() + i * SectionWire; + Section s{}; + s.offset = static_cast(Le(e, 8)); + s.size = static_cast(Le(e + 8, 8)); + s.crypto_type = Le(e + 16, 8); + std::memcpy(s.key.data(), e + 32, 16); + std::memcpy(s.counter.data(), e + 48, 16); + sections.push_back(s); + } + + const u64 block_start = HeaderSize + 16 + count * SectionWire; + const auto fixed = f->ReadBytes(BlockFixed, block_start); + std::optional bh; + if (fixed.size() == BlockFixed && + std::equal(fixed.begin(), fixed.begin() + 8, BlockMagic.begin())) { + BlockHeader b{}; + b.exponent = fixed[11]; + const s32 n = static_cast(Le(fixed.data() + 12, 4)); + if (n <= 0) return std::nullopt; + b.decompressed_size = Le(fixed.data() + 16, 8); + const auto sizes = f->ReadBytes(static_cast(n) * 4, block_start + BlockFixed); + if (sizes.size() != static_cast(n) * 4) return std::nullopt; + b.sizes.resize(n); + for (s32 i = 0; i < n; ++i) b.sizes[i] = static_cast(Le(sizes.data() + i * 4, 4)); + payload_start = block_start + BlockFixed + static_cast(n) * 4; + bh = std::move(b); + } else { + payload_start = block_start; + } + + if (!sections.empty() && sections[0].offset > static_cast(HeaderSize)) { + Section fake{}; + fake.offset = static_cast(HeaderSize); + fake.size = sections[0].offset - static_cast(HeaderSize); + sections.insert(sections.begin(), fake); + } + return std::make_pair(std::move(sections), std::move(bh)); +} + +// Sequential reader over independently-compressed blocks, one block cached (like nsz_rs). +class BlockReader { +public: + BlockReader(FileSys::VirtualFile f, const BlockHeader& bh, u64 payload_start) + : source{std::move(f)}, block_size{1ULL << bh.exponent}, sizes{bh.sizes}, + decompressed_size{bh.decompressed_size} { + if (bh.exponent < 14 || bh.exponent > 32 || sizes.empty()) + throw std::runtime_error("bad NCZBLOCK header"); + u64 off = payload_start; + offsets.reserve(sizes.size()); + for (u32 s : sizes) { offsets.push_back(off); off += s; } + } + + // Fills `out` from `position`; returns bytes written. + std::size_t ReadAt(u64 position, std::span out) { + std::size_t done = 0; + while (done < out.size() && position < decompressed_size) { + const u64 id = position / block_size; + if (id >= sizes.size()) break; + if (cache_id != id && !Load(id)) break; + const u64 in = position - id * block_size; + const std::size_t n = static_cast( + std::min(out.size() - done, cache.size() - in)); + std::memcpy(out.data() + done, cache.data() + in, n); + done += n; + position += n; + } + return done; + } + +private: + bool Load(u64 id) { + u64 want = block_size; + if (id + 1 == sizes.size()) { + const u64 rem = decompressed_size % block_size; + if (rem > 0) want = rem; // avoid the 0-size bug from the original nsz + } + try { cache.resize(static_cast(want)); } + catch (const std::bad_alloc&) { return false; } + const u32 csize = sizes[id]; + if (csize < want) { + const auto comp = source->ReadBytes(csize, offsets[id]); + if (comp.size() != csize || + Common::Compression::DecompressDataZSTD(comp, cache) != want) return false; + } else if (source->Read(cache.data(), cache.size(), offsets[id]) != cache.size()) { + return false; + } + cache_id = id; + return true; + } + + FileSys::VirtualFile source; + u64 block_size; + std::vector offsets; + std::vector sizes; + u64 decompressed_size; + u64 cache_id = ~0ULL; + std::vector cache; +}; + +class BlockNczFile final : public FileSys::VfsFile { +public: + BlockNczFile(std::string name_, std::vector hdr_, std::vector
sections_, + std::unique_ptr body_) + : name{std::move(name_)}, hdr{std::move(hdr_)}, sections{std::move(sections_)}, + body{std::move(body_)} { + nca_size = HeaderSize; + for (const auto& s : sections) + nca_size = std::max(nca_size, static_cast(s.offset + s.size)); + ciphers.reserve(sections.size()); + for (const auto& s : sections) + ciphers.push_back(s.Ctr() ? std::make_unique>(s.key, Mode::CTR) + : nullptr); + } + + std::string GetName() const override { return name; } + std::size_t GetSize() const override { return static_cast(nca_size); } + bool Resize(std::size_t) override { return false; } + FileSys::VirtualDir GetContainingDirectory() const override { return nullptr; } + bool IsWritable() const override { return false; } + bool IsReadable() const override { return true; } + + std::size_t Read(u8* data, std::size_t len, std::size_t off) const override { + if (off >= nca_size) return 0; + len = static_cast(std::min(len, nca_size - off)); + const u64 end = off + len; + u64 pos = off; + if (pos < HeaderSize) { + const u64 n = std::min(end, HeaderSize) - pos; + std::memcpy(data, hdr.data() + pos, static_cast(n)); + pos += n; + } + std::scoped_lock lock{mutex}; + for (std::size_t i = 0; i < sections.size() && pos < end; ++i) { + const auto& s = sections[i]; + const u64 begin = std::max(static_cast(s.offset), HeaderSize); + const u64 stop = std::max(static_cast(s.offset + s.size), begin); + if (stop <= pos) continue; + if (pos < begin) { + const u64 g = std::min(end, begin); + std::memset(data + (pos - off), 0, static_cast(g - pos)); + pos = g; + if (pos >= end) break; + } + const u64 pe = std::min(end, stop); + const std::span piece(data + (pos - off), static_cast(pe - pos)); + if (body->ReadAt(pos - HeaderSize, piece) != piece.size()) + return static_cast(pos - off); + if (ciphers[i]) { + Key128 iv{}; + SetIv(iv, s.counter, pos); + ciphers[i]->SetIV(iv); + ciphers[i]->Transcode(piece.data(), piece.size(), piece.data(), Op::Encrypt); + } + pos = pe; + } + return len; + } + + std::size_t Write(const u8*, std::size_t, std::size_t) override { return 0; } + bool Rename(std::string_view) override { return false; } + +private: + const std::string name; + const std::vector hdr; + const std::vector
sections; + const std::unique_ptr body; + std::vector>> ciphers; + mutable std::mutex mutex; + u64 nca_size{}; +}; + +// Solid NCZ: one zstd stream over the whole body. Decoded incrementally into memory, up to the +// requested offset, so sequential install reads are O(n) instead of O(n^2). +class SolidNczFile final : public FileSys::VfsFile { +public: + SolidNczFile(std::string name_, FileSys::VirtualFile source_, + std::vector
sections_, u64 payload_start_) + : name{std::move(name_)}, source{std::move(source_)}, sections{std::move(sections_)}, + payload_start{payload_start_} { + const auto raw_header = source->ReadBytes(HeaderSize, 0); + data.assign(raw_header.begin(), raw_header.end()); + frontier = HeaderSize; + } + + ~SolidNczFile() override { + if (stream != nullptr) ZSTD_freeDStream(stream); + } + + std::string GetName() const override { return name; } + std::size_t GetSize() const override { + u64 size = HeaderSize; + for (const auto& s : sections) + size = std::max(size, static_cast(s.offset + s.size)); + return static_cast(size); + } + bool Resize(std::size_t) override { return false; } + FileSys::VirtualDir GetContainingDirectory() const override { return nullptr; } + bool IsWritable() const override { return false; } + bool IsReadable() const override { return true; } + + std::size_t Read(u8* out, std::size_t len, std::size_t off) const override { + std::scoped_lock lock{mutex}; + const u64 nca_size = GetSize(); + if (off >= nca_size) return 0; + len = static_cast(std::min(len, nca_size - off)); + const u64 needed = off + len; + if (needed > frontier && !DecodeTo(needed)) return 0; + std::memcpy(out, data.data() + off, len); + return len; + } + + std::size_t Write(const u8*, std::size_t, std::size_t) override { return 0; } + bool Rename(std::string_view) override { return false; } + +private: + bool DecodeTo(u64 needed) const { + if (stream == nullptr) { + stream = ZSTD_createDStream(); + if (stream == nullptr) return false; + ZSTD_DCtx_setParameter(stream, ZSTD_d_windowLogMax, 31); + read_pos = payload_start; + } + + const u64 file_size = source->GetSize(); + std::vector out_buf(Chunk); + + std::size_t index = 0; + for (; index < sections.size(); ++index) { + const auto& s = sections[index]; + const u64 begin = std::max(static_cast(s.offset), HeaderSize); + const u64 end = std::max(static_cast(s.offset) + static_cast(s.size), + begin); + if (end > frontier) break; + } + + for (; index < sections.size() && frontier < needed; ++index) { + const auto& s = sections[index]; + const u64 begin = std::max(static_cast(s.offset), HeaderSize); + const u64 end = std::max(static_cast(s.offset) + static_cast(s.size), + begin); + if (end <= frontier) continue; + u64 pos = std::max(begin, frontier); + + std::optional> cipher; + if (s.Ctr()) cipher.emplace(s.key, Mode::CTR); + + while (pos < end && frontier < needed) { + const u64 want = std::min(end - pos, out_buf.size()); + std::size_t produced = 0; + while (produced < want) { + if (in.pos >= in.size) { + const u64 remaining = file_size - read_pos; + const std::size_t chunk = static_cast( + std::min(Chunk, remaining)); + if (chunk == 0) { LOG_ERROR(Crypto, "Solid NCZ: truncated"); return false; } + const auto bytes = source->ReadBytes(chunk, read_pos); + if (bytes.empty()) { LOG_ERROR(Crypto, "Solid NCZ: truncated"); return false; } + read_pos += bytes.size(); + in_buf.assign(bytes.begin(), bytes.end()); + in.src = in_buf.data(); + in.size = in_buf.size(); + in.pos = 0; + } + ZSTD_outBuffer outb{out_buf.data() + produced, want - produced, 0}; + const std::size_t res = ZSTD_decompressStream(stream, &outb, &in); + if (ZSTD_isError(res)) { + LOG_ERROR(Crypto, "Solid NCZ: zstd error"); + return false; + } + produced += outb.pos; + } + if (cipher) { + Key128 iv{}; + SetIv(iv, s.counter, pos); + cipher->SetIV(iv); + cipher->Transcode(out_buf.data(), produced, out_buf.data(), Op::Encrypt); + } + data.insert(data.end(), out_buf.begin(), out_buf.begin() + produced); + pos += produced; + frontier = pos; + } + } + return frontier >= needed; + } + + const std::string name; + const FileSys::VirtualFile source; + const std::vector
sections; + const u64 payload_start; + mutable std::mutex mutex; + mutable std::vector data; + mutable ZSTD_DStream* stream = nullptr; + mutable u64 read_pos = 0; + mutable u64 frontier = 0; + mutable std::vector in_buf; + mutable ZSTD_inBuffer in{nullptr, 0, 0}; +}; + +// Shared opener: block path always; solid only when allow_solid is true. +FileSys::VirtualFile OpenNcz(const FileSys::VirtualFile& f, std::string_view name, + bool allow_solid) { + if (!f) return nullptr; + u64 ps = 0; + auto parsed = ParseHeader(f, ps); + if (!parsed) return nullptr; + auto& [sections, block] = *parsed; + + if (block) { + auto hdr = f->ReadBytes(HeaderSize, 0); + if (hdr.size() != HeaderSize) return nullptr; + std::unique_ptr body; + try { body = std::make_unique(f, *block, ps); } + catch (const std::exception& e) { + LOG_ERROR(Crypto, "Failed to open NCZBLOCK: {}", e.what()); + return nullptr; + } + return std::make_shared(std::string{name}, std::move(hdr), + std::move(sections), std::move(body)); + } + + if (allow_solid) { + return std::make_shared(std::string{name}, f, std::move(sections), ps); + } + + LOG_DEBUG(Crypto, "Solid NCZ {} skipped (only NCZBLOCK is supported for play)", name); + return nullptr; +} + +} // Anonymous namespace + +bool IsBlockCompressedNCZ(const FileSys::VirtualFile& f) { + if (!f) return false; + u64 ps = 0; + const auto p = ParseHeader(f, ps); + return p && p->second.has_value(); +} + +FileSys::VirtualFile DecompressNCZ(const FileSys::VirtualFile& f, std::string_view name) { + return OpenNcz(f, name, /*allow_solid=*/false); +} + +FileSys::VirtualFile DecompressNCZForInstall(const FileSys::VirtualFile& f, + std::string_view name) { + return OpenNcz(f, name, /*allow_solid=*/true); +} + +} // namespace Core::Crypto \ No newline at end of file diff --git a/src/core/crypto/ncz_decompressor.h b/src/core/crypto/ncz_decompressor.h new file mode 100644 index 0000000000..9557f8c517 --- /dev/null +++ b/src/core/crypto/ncz_decompressor.h @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include + +#include "core/file_sys/vfs/vfs_types.h" + +namespace Core::Crypto { + +/** + * Opens an NCZBLOCK-compressed NCA (nsz -B / .xcz block format) as a VirtualFile backed by + * on-demand block decoding. Nothing is written to disk; each read decodes only the blocks it + * covers and re-encrypts CTR sections. Solid NCZ is not supported. + * + * @param ncz_file The raw NCZ payload (e.g. ".ncz" entry from an NSZ/XCZ PFS0). + * @param output_name Name to give the returned VirtualFile (e.g. ".nca"). + * + * @return a VirtualFile for the NCA, or nullptr if the NCZ is malformed or not NCZBLOCK. + */ +[[nodiscard]] FileSys::VirtualFile DecompressNCZ(const FileSys::VirtualFile& ncz_file, + std::string_view output_name); + +/** + * Returns true if the given file is an NCZ payload in block-compressed (NCZBLOCK) form, + * i.e. one that DecompressNCZ() can open. Solid NCZ returns false. + */ +[[nodiscard]] bool IsBlockCompressedNCZ(const FileSys::VirtualFile& ncz_file); + +// Install to NAND: same as DecompressNCZ, but solid NCZ is decoded on demand too. +[[nodiscard]] FileSys::VirtualFile DecompressNCZForInstall( + const FileSys::VirtualFile& ncz_file, std::string_view output_name); + +} // namespace Core::Crypto \ No newline at end of file diff --git a/src/core/file_sys/registered_cache.cpp b/src/core/file_sys/registered_cache.cpp index 1f430434f7..26e73d260a 100644 --- a/src/core/file_sys/registered_cache.cpp +++ b/src/core/file_sys/registered_cache.cpp @@ -16,6 +16,7 @@ #include "common/random.h" #include "common/string_util.h" #include "core/crypto/key_manager.h" +#include "core/crypto/ncz_decompressor.h" #include "core/file_sys/card_image.h" #include "core/file_sys/common_funcs.h" #include "core/file_sys/content_archive.h" @@ -158,6 +159,25 @@ static std::shared_ptr OpenContainerAsNsp(const VirtualFile& file, Loader:: return nullptr; } +// Checks that every .ncz entry in the container is NCZBLOCK. Solid NCZ has no random access, +// and the whole point of this build is to reject it at scan time so such files never appear +// in the game list. Containers without any .ncz (plain NSP/XCI) pass through. +static bool ContainerIsFullyBlockCompressed(const std::shared_ptr& nsp) { + if (!nsp) { + return false; + } + for (const auto& entry : nsp->GetFiles()) { + const auto name = entry->GetName(); + if (name.size() < 4 || name.substr(name.size() - 4) != ".ncz") { + continue; + } + if (!Core::Crypto::IsBlockCompressedNCZ(entry)) { + return false; // solid NCZ -> reject the whole container + } + } + return true; // no .ncz at all, or all block-compressed +} + template bool ForEachContainerEntry(const std::shared_ptr& nsp, bool only_content, std::optional base_program_id, Callback&& on_entry) { @@ -811,7 +831,14 @@ std::vector RegisteredCache::ListEntriesFilter( } static std::shared_ptr GetNCAFromNSPForID(const NSP& nsp, const NcaID& id) { - auto file = nsp.GetFile(fmt::format("{}.nca", Common::HexToString(id, false))); + const auto id_string = Common::HexToString(id, false); + auto file = nsp.GetFile(fmt::format("{}.nca", id_string)); + if (file == nullptr) { + if (auto ncz_file = nsp.GetFile(fmt::format("{}.ncz", id_string))) { + file = Core::Crypto::DecompressNCZForInstall( + ncz_file, fmt::format("{}.nca", id_string)); + } + } if (file == nullptr) { return nullptr; } @@ -1273,6 +1300,12 @@ bool ManualContentProvider::AddEntriesFromContainer(VirtualFile file, bool only_ return false; } + // Reject solid NCZ (.nsz without -B): only block-compressed NCZ is supported. + if (!ContainerIsFullyBlockCompressed(nsp)) { + LOG_DEBUG(Service_FS, "Skipping solid-compressed container: {}", file->GetName()); + return false; + } + return ForEachContainerEntry( nsp, only_content, base_program_id, [this](TitleType title_type, ContentRecordType content_type, u64 title_id, @@ -1415,8 +1448,9 @@ void ExternalContentProvider::ScanDirectory(const VirtualDir& dir) { } const auto extension = Common::ToLower(filename.substr(dot_pos + 1)); - - if (extension == "nsp") { + // .xcz is an XCI container, but its updates only work through the NSP/PFS0 path + // (DecompressNCZ), not ProcessXCI. So route .xcz here on purpose. + if (extension == "nsp" || extension == "nsz" || extension == "xcz") { ProcessNSP(file); } else if (extension == "xci") { ProcessXCI(file); @@ -1434,6 +1468,12 @@ void ExternalContentProvider::ProcessNSP(const VirtualFile& file) { return; } + // Reject solid NCZ (.nsz without -B): Eden only supports block-compressed NCZ. + if (!ContainerIsFullyBlockCompressed(nsp)) { + LOG_DEBUG(Service_FS, "Skipping solid-compressed container: {}", file->GetName()); + return; + } + LOG_DEBUG(Service_FS, "Processing NSP file: {}", file->GetName()); AddExternalEntriesFromContainer(nsp, entries, versions, multi_version_entries); } diff --git a/src/core/file_sys/submission_package.cpp b/src/core/file_sys/submission_package.cpp index 0ea323492b..1a39d819f6 100644 --- a/src/core/file_sys/submission_package.cpp +++ b/src/core/file_sys/submission_package.cpp @@ -12,6 +12,7 @@ #include "common/hex_util.h" #include "common/logging.h" #include "core/crypto/key_manager.h" +#include "core/crypto/ncz_decompressor.h" #include "core/file_sys/common_funcs.h" #include "core/file_sys/content_archive.h" #include "core/file_sys/nca_metadata.h" @@ -246,6 +247,17 @@ void NSP::ReadNCAs(const std::vector& files) { const auto id_string = Common::HexToString(rec.nca_id, false); auto next_file = pfs->GetFile(fmt::format("{}.nca", id_string)); + if (next_file == nullptr) { + auto ncz_file = pfs->GetFile(fmt::format("{}.ncz", id_string)); + if (ncz_file != nullptr) { + next_file = Core::Crypto::DecompressNCZ(ncz_file, fmt::format("{}.nca", id_string)); + if (next_file == nullptr) { + LOG_DEBUG(Service_FS, "Skipping solid or unsupported NCZ content {}.ncz", id_string); + continue; + } + } + } + if (next_file == nullptr) { if (rec.type != ContentRecordType::DeltaFragment) { LOG_WARNING(Service_FS, diff --git a/src/core/loader/loader.cpp b/src/core/loader/loader.cpp index 90e23ccc11..92e2e2f602 100644 --- a/src/core/loader/loader.cpp +++ b/src/core/loader/loader.cpp @@ -82,23 +82,27 @@ std::shared_ptr OpenContainerAsNsp(FileSys::VirtualFile file, File return nullptr; } - if (type == FileType::NSP) { + if (type == FileType::NSP || type == FileType::NSZ) { auto nsp = std::make_shared(file, program_id, program_index); return nsp->GetStatus() == ResultStatus::Success ? nsp : nullptr; } - if (type == FileType::XCI) { + if (type == FileType::XCI || type == FileType::XCZ) { FileSys::XCI xci{file, program_id, program_index}; - if (xci.GetStatus() != ResultStatus::Success) { - return nullptr; + if (xci.GetStatus() == ResultStatus::Success) { + auto secure_nsp = xci.GetSecurePartitionNSP(); + if (secure_nsp != nullptr && secure_nsp->GetStatus() == ResultStatus::Success) { + return secure_nsp; + } } - auto secure_nsp = xci.GetSecurePartitionNSP(); - if (secure_nsp == nullptr || secure_nsp->GetStatus() != ResultStatus::Success) { - return nullptr; + // PFS0-shaped .xcz (NSZ-style container) does not parse as XCI; fall back to NSP. + if (type == FileType::XCZ) { + auto nsp = std::make_shared(file, program_id, program_index); + return nsp->GetStatus() == ResultStatus::Success ? nsp : nullptr; } - return secure_nsp; + return nullptr; } return nullptr; @@ -144,7 +148,8 @@ FileType IdentifyFile(FileSys::VirtualFile file) { } bool IsContainerType(FileType type) { - return type == FileType::NSP || type == FileType::XCI; + return type == FileType::NSP || type == FileType::NSZ || type == FileType::XCI || + type == FileType::XCZ; } bool IsBootableGameContainer(FileSys::VirtualFile file, FileType type, u64 program_id, @@ -180,8 +185,12 @@ FileType GuessFromFilename(const std::string& name) { return FileType::NCA; else if (extension == "xci") return FileType::XCI; + else if (extension == "xcz") + return FileType::XCZ; else if (extension == "nsp") return FileType::NSP; + else if (extension == "nsz") + return FileType::NSZ; else if (extension == "kip") return FileType::KIP; return FileType::Unknown; @@ -197,10 +206,14 @@ std::string GetFileTypeString(FileType type) { return "NCA"; case FileType::XCI: return "XCI"; + case FileType::XCZ: + return "XCZ"; case FileType::NAX: return "NAX"; case FileType::NSP: return "NSP"; + case FileType::NSZ: + return "NSZ"; case FileType::KIP: return "KIP"; case FileType::DeconstructedRomDirectory: @@ -326,12 +339,29 @@ static std::unique_ptr GetFileLoader(Core::System& system, FileSys::V system.GetContentProvider(), program_id, program_index); + // NCZ-compressed XCI container. XCI-shaped .xcz goes to the XCI loader, while + // PFS0-shaped (NSZ-style) .xcz containers fall back to the NSP loader. + case FileType::XCZ: { + FileSys::XCI probe{file, program_id, program_index}; + if (probe.GetStatus() == ResultStatus::Success && + probe.GetSecurePartitionNSP() != nullptr) { + return std::make_unique(std::move(file), + system.GetFileSystemController(), + system.GetContentProvider(), program_id, + program_index); + } + return std::make_unique(std::move(file), system.GetFileSystemController(), + system.GetContentProvider(), program_id, + program_index); + } + // NX NAX (NintendoAesXts) file format. case FileType::NAX: return std::make_unique(std::move(file)); // NX NSP (Nintendo Submission Package) file format case FileType::NSP: + case FileType::NSZ: return std::make_unique(std::move(file), system.GetFileSystemController(), system.GetContentProvider(), program_id, program_index); diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h index 95ce638da0..d3c0230cb0 100644 --- a/src/core/loader/loader.h +++ b/src/core/loader/loader.h @@ -42,7 +42,9 @@ enum class FileType { NRO, NCA, NSP, + NSZ, XCI, + XCZ, NAX, KIP, DeconstructedRomDirectory, diff --git a/src/core/loader/nsp.cpp b/src/core/loader/nsp.cpp index cfc908b4ef..8b2c79394d 100644 --- a/src/core/loader/nsp.cpp +++ b/src/core/loader/nsp.cpp @@ -56,6 +56,17 @@ AppLoader_NSP::AppLoader_NSP(FileSys::VirtualFile file_, AppLoader_NSP::~AppLoader_NSP() = default; FileType AppLoader_NSP::IdentifyType(const FileSys::VirtualFile& nsp_file) { + // .nsz is NSP-compatible; return NSZ so the game list shows the right type. + if (nsp_file->GetName().ends_with(".nsz")) { + return FileType::NSZ; + } + + // PFS0-shaped .xcz containers are handled by this loader too; report XCZ so the game + // list does not show them as NSP. XCI-shaped .xcz is identified by AppLoader_XCI. + if (nsp_file->GetName().ends_with(".xcz")) { + return FileType::XCZ; + } + const FileSys::NSP nsp(nsp_file); if (nsp.GetStatus() != ResultStatus::Success) { diff --git a/src/frontend_common/content_manager.h b/src/frontend_common/content_manager.h index 4f3112e3fb..6d79098efa 100644 --- a/src/frontend_common/content_manager.h +++ b/src/frontend_common/content_manager.h @@ -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-FileCopyrightText: 2024 yuzu Emulator Project @@ -163,7 +163,9 @@ inline InstallResult InstallNSP(Core::System& system, FileSys::VfsFilesystem& vf std::shared_ptr nsp; FileSys::VirtualFile file = vfs.OpenFile(filename, FileSys::OpenMode::Read); - if (boost::to_lower_copy(file->GetName()).ends_with("nsp")) { + const auto lower_name = boost::to_lower_copy(file->GetName()); + + if (lower_name.ends_with("nsp") || lower_name.ends_with("nsz")) { nsp = std::make_shared(file); if (nsp->IsExtractedType()) { return InstallResult::Failure; diff --git a/src/qt_common/game_list/worker.cpp b/src/qt_common/game_list/worker.cpp index 586a26e8b9..6b6f93447d 100644 --- a/src/qt_common/game_list/worker.cpp +++ b/src/qt_common/game_list/worker.cpp @@ -360,7 +360,8 @@ void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_pa } if (target == ScanTarget::PopulateGameList && - (file_type == Loader::FileType::XCI || file_type == Loader::FileType::NSP) && + (file_type == Loader::FileType::XCI || file_type == Loader::FileType::XCZ || + file_type == Loader::FileType::NSP || file_type == Loader::FileType::NSZ) && !Loader::IsBootableGameContainer(file, file_type)) { return true; } @@ -375,7 +376,9 @@ void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_pa program_id, file); } else if (Settings::values.ext_content_from_game_dirs.GetValue() && (file_type == Loader::FileType::XCI || - file_type == Loader::FileType::NSP)) { + file_type == Loader::FileType::XCZ || + file_type == Loader::FileType::NSP || + file_type == Loader::FileType::NSZ)) { void(provider->AddEntriesFromContainer(file)); } } else { @@ -402,7 +405,8 @@ void GameListWorker::ScanFileSystem(ScanTarget target, const std::string& dir_pa }; if (res2 == Loader::ResultStatus::Success && program_ids.size() > 1 && - (file_type == Loader::FileType::XCI || file_type == Loader::FileType::NSP)) { + (file_type == Loader::FileType::XCI || file_type == Loader::FileType::XCZ || + file_type == Loader::FileType::NSP || file_type == Loader::FileType::NSZ)) { for (const auto id : program_ids) { // dravee suggested this, only viable way to // not show sub-games in qlaunch for now. diff --git a/src/qt_common/qt_common.cpp b/src/qt_common/qt_common.cpp index b9b8caf6e8..794aeaabb1 100644 --- a/src/qt_common/qt_common.cpp +++ b/src/qt_common/qt_common.cpp @@ -57,7 +57,8 @@ std::unique_ptr emu_thread = nullptr; const QStringList supported_file_extensions = {QStringLiteral("nro"), QStringLiteral("nso"), QStringLiteral("nca"), QStringLiteral("xci"), - QStringLiteral("nsp"), QStringLiteral("kip")}; + QStringLiteral("xcz"), QStringLiteral("nsp"), + QStringLiteral("nsz"), QStringLiteral("kip")}; Core::Frontend::WindowSystemType GetWindowSystemType() { // Determine WSI type based on Qt platform. diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 6e21265f9e..ad76e5b2db 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -2797,9 +2797,9 @@ void MainWindow::IncrementInstallProgress() { void MainWindow::OnMenuInstallToNAND() { const QString file_filter = - tr("Installable Switch File (*.nca *.nsp *.xci);;Nintendo Content Archive " - "(*.nca);;Nintendo Submission Package (*.nsp);;NX Cartridge " - "Image (*.xci)"); + tr("Installable Switch File (*.nca *.nsp *.nsz *.xci *.xcz);;Nintendo Content Archive " + "(*.nca);;Nintendo Submission Package (*.nsp *.nsz);;NX Cartridge " + "Image (*.xci *.xcz)"); QStringList filenames = QFileDialog::getOpenFileNames( this, tr("Install Files"), QString::fromStdString(UISettings::values.roms_path), @@ -2856,7 +2856,10 @@ void MainWindow::OnMenuInstallToNAND() { QFuture future; ContentManager::InstallResult result; - if (file.endsWith(QStringLiteral("nsp"), Qt::CaseInsensitive)) { + if (file.endsWith(QStringLiteral("nsp"), Qt::CaseInsensitive) || + file.endsWith(QStringLiteral("nsz"), Qt::CaseInsensitive) || + file.endsWith(QStringLiteral("xci"), Qt::CaseInsensitive) || + file.endsWith(QStringLiteral("xcz"), Qt::CaseInsensitive)) { const auto progress_callback = [this](size_t size, size_t progress) { emit UpdateInstallProgress(); if (install_progress->wasCanceled()) { From a95efaf18f50721aa6f5cdce8b5b94e858ffd8d1 Mon Sep 17 00:00:00 2001 From: wildcard Date: Mon, 26 Oct 2026 17:23:45 +0100 Subject: [PATCH 120/128] [vulkan] Fix TOTK dark squares (#4565) Qualcomm and Turnip use different subpixel rounding for Vulkan texture gather coordinates than the Switch's Maxwell GPU. This can select the wrong texels near texture boundaries, producing large black squares in TOTK - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4565 Reviewed-by: CamilleLaVey Reviewed-by: Shinmegumi --- src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index a85e2811a3..e9403580d5 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -447,7 +447,9 @@ PipelineCache::PipelineCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, driver_id == VK_DRIVER_ID_AMD_OPEN_SOURCE || driver_id == VK_DRIVER_ID_MESA_RADV || driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS || - driver_id == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA, + driver_id == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA || + driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY || + driver_id == VK_DRIVER_ID_MESA_TURNIP, .has_broken_spirv_clamp = driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS, .has_broken_spirv_position_input = driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY, From 0689f73147ebeddb9ac5fb8b0edf2625425f8d71 Mon Sep 17 00:00:00 2001 From: xbzk Date: Mon, 26 Oct 2026 17:24:00 +0100 Subject: [PATCH 121/128] [ir] resolve conditional Phi inputs when tracking bindless texture handles (#4551) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Aimed to fix Ender Magnolia missing shader textures. Main example is Yolvan character bullets. By using windows version of the game, dxvk lib to make it vulkan, and renderdoc, it was possible to capture bullets, and by tracking backward composition and comparing with a similar scene from eden with missing bullets, it was possible to unveil the missing functionality: conditional Phi inputs resolve for bindless handles. By ignoring the boolean predicate register in the shader, handles for these shaders were resolving to some old value instead of proper live conditional ones. TESTS: -Compare Yolvan bullets -Usual roam on main titles for regression check. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4551 Reviewed-by: CamilleLaVey Reviewed-by: Shinmegumi --- .../frontend/ir/breadth_first_search.h | 11 ++- src/shader_recompiler/ir_opt/texture_pass.cpp | 87 +++++++++++++++---- 2 files changed, 79 insertions(+), 19 deletions(-) diff --git a/src/shader_recompiler/frontend/ir/breadth_first_search.h b/src/shader_recompiler/frontend/ir/breadth_first_search.h index ec55425549..afe153f180 100644 --- a/src/shader_recompiler/frontend/ir/breadth_first_search.h +++ b/src/shader_recompiler/frontend/ir/breadth_first_search.h @@ -1,8 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once +#include #include #include #include @@ -13,9 +17,10 @@ namespace Shader::IR { -template -auto BreadthFirstSearch(const Value& value, Pred&& pred) +template +auto BreadthFirstSearch(Value value, Pred&& pred, Resolve&& resolve = {}) -> std::invoke_result_t { + value = resolve(value); if (value.IsImmediate()) { // Nothing to do with immediates return std::nullopt; @@ -36,7 +41,7 @@ auto BreadthFirstSearch(const Value& value, Pred&& pred) } // Visit the right most arguments first for (size_t arg = inst->NumArgs(); arg--;) { - const Value arg_value{inst->Arg(arg)}; + const Value arg_value{resolve(inst->Arg(arg))}; if (arg_value.IsImmediate()) { continue; } diff --git a/src/shader_recompiler/ir_opt/texture_pass.cpp b/src/shader_recompiler/ir_opt/texture_pass.cpp index fe34a67555..fae69ab91b 100644 --- a/src/shader_recompiler/ir_opt/texture_pass.cpp +++ b/src/shader_recompiler/ir_opt/texture_pass.cpp @@ -31,6 +31,60 @@ struct TextureInst { using TextureInstVector = boost::container::small_vector; +const IR::Block* ConditionalHeader(const IR::Block* body) { + const auto predecessors{body->ImmPredecessors()}; + const auto successors{body->ImmSuccessors()}; + if (predecessors.size() != 1 || successors.size() != 1) return nullptr; + const IR::Block* const header{predecessors[0]}; + const auto targets{header->ImmSuccessors()}; + if (targets.size() != 2 || targets[0] != body || targets[1] != successors[0] || + targets[1]->ImmPredecessors().size() != 2 || header->empty() || + header->back().GetOpcode() != IR::Opcode::ConditionRef) { + return nullptr; + } + return header; +} + +std::pair Condition(IR::Value value) { + bool negated{}; + while (const IR::Inst* inst = value.TryInstRecursive()) { + if (inst->GetOpcode() == IR::Opcode::LogicalNot) negated = !negated; + else if (inst->GetOpcode() != IR::Opcode::ConditionRef) break; + value = inst->Arg(0); + } + return {value.Resolve(), negated}; +} + +IR::Value ResolveConditionalPhi(IR::Value value, const IR::Block* block) { + if (!value.Resolve().IsPhi() || !(block = ConditionalHeader(block))) return value; + const auto [condition, negated]{Condition(block->back().Arg(0))}; + boost::container::small_vector visited; + while (value.Resolve().IsPhi() && std::ranges::find(visited, block) == visited.end()) { + visited.push_back(block); + const IR::Inst* const phi{value.InstRecursive()}; + const auto predecessors{block->ImmPredecessors()}; + if (predecessors.size() == 1) { + block = predecessors[0]; + continue; + } + if (predecessors.size() != 2 || phi->NumArgs() != 2) break; + const IR::Block* body{predecessors[0]}; + const IR::Block* header{ConditionalHeader(body)}; + if (header != predecessors[1]) { + body = predecessors[1]; + header = ConditionalHeader(body); + if (header != predecessors[0]) break; + } + const auto [other_condition, other_negated]{Condition(header->back().Arg(0))}; + if (condition == other_condition && (phi->PhiBlock(0) == header || phi->PhiBlock(0) == body)) { + const IR::Block* const incoming{negated == other_negated ? body : header}; + value = phi->Arg(phi->PhiBlock(0) == incoming ? 0 : 1); + } + block = header; + } + return value; +} + constexpr u32 DESCRIPTOR_SIZE = 8; constexpr u32 DESCRIPTOR_SIZE_SHIFT = u32(std::countr_zero(DESCRIPTOR_SIZE)); constexpr u32 DESCRIPTOR_MAX_COUNT = 1024; @@ -299,23 +353,23 @@ static inline bool IsTexturePixelFormatIntegerCached(Environment& env, } -std::optional Track(const IR::Value& value, Environment& env, const HostTranslateInfo& host_info); -static inline std::optional TrackCached(const IR::Value& v, Environment& env, const HostTranslateInfo& host_info) { - if (const IR::Inst* key = v.InstRecursive()) { +std::optional Track(const IR::Value& value, Environment& env, const HostTranslateInfo& host_info, const IR::Block* block); +static inline std::optional TrackCached(const IR::Value& v, Environment& env, const HostTranslateInfo& host_info, const IR::Block* block) { + if (const IR::Inst* key = v.TryInstRecursive()) { if (auto it = env.track_cache.find(key); it != env.track_cache.end()) return it->second; - auto found = Track(v, env, host_info); + auto found = Track(v, env, host_info, block); if (found) env.track_cache.emplace(key, *found); return found; } - return Track(v, env, host_info); + return Track(v, env, host_info, block); } -std::optional TryGetConstBuffer(const IR::Inst* inst, Environment& env, const HostTranslateInfo& host_info); +std::optional TryGetConstBuffer(const IR::Inst* inst, Environment& env, const HostTranslateInfo& host_info, const IR::Block* block); -std::optional Track(const IR::Value& value, Environment& env, const HostTranslateInfo& host_info) { - return IR::BreadthFirstSearch(value, [&env, &host_info](const IR::Inst* inst) { - return TryGetConstBuffer(inst, env, host_info); - }); +std::optional Track(const IR::Value& value, Environment& env, const HostTranslateInfo& host_info, const IR::Block* block) { + return IR::BreadthFirstSearch(value, [&env, &host_info, block](const IR::Inst* inst) { + return TryGetConstBuffer(inst, env, host_info, block); + }, [&](IR::Value operand) { return ResolveConditionalPhi(operand, block); }); } std::optional TryGetConstant(IR::Value& value, Environment& env) { @@ -339,13 +393,13 @@ std::optional TryGetConstant(IR::Value& value, Environment& env) { return ReadCbufCached(env, index_number, offset_number); } -std::optional TryGetConstBuffer(const IR::Inst* inst, Environment& env, const HostTranslateInfo& host_info) { +std::optional TryGetConstBuffer(const IR::Inst* inst, Environment& env, const HostTranslateInfo& host_info, const IR::Block* block) { switch (inst->GetOpcode()) { default: return std::nullopt; case IR::Opcode::BitwiseOr32: { - std::optional lhs{TrackCached(inst->Arg(0), env, host_info)}; - std::optional rhs{TrackCached(inst->Arg(1), env, host_info)}; + std::optional lhs{TrackCached(inst->Arg(0), env, host_info, block)}; + std::optional rhs{TrackCached(inst->Arg(1), env, host_info, block)}; if (!lhs || !rhs) { return std::nullopt; } @@ -375,7 +429,7 @@ std::optional TryGetConstBuffer(const IR::Inst* inst, Environme if (!shift.IsImmediate()) { return std::nullopt; } - std::optional lhs{TrackCached(inst->Arg(0), env, host_info)}; + std::optional lhs{TrackCached(inst->Arg(0), env, host_info, block)}; if (lhs) { lhs->shift_left = shift.U32(); } @@ -403,7 +457,7 @@ std::optional TryGetConstBuffer(const IR::Inst* inst, Environme return std::nullopt; } while (false); } - std::optional lhs{TrackCached(op1, env, host_info)}; + std::optional lhs{TrackCached(op1, env, host_info, block)}; if (lhs) { lhs->shift_left = static_cast(std::countr_zero(op2.U32())); } @@ -469,7 +523,7 @@ std::optional TryGetConstBuffer(const IR::Inst* inst, Environme TextureInst MakeInst(Environment& env, IR::Block* block, IR::Inst& inst, const HostTranslateInfo& host_info) { ConstBufferAddr addr; if (IsBindless(inst)) { - const std::optional track_addr{TrackCached(inst.Arg(0), env, host_info)}; + const std::optional track_addr{TrackCached(inst.Arg(0), env, host_info, block)}; if (!track_addr) { throw NotImplementedException("Failed to track bindless texture constant buffer"); @@ -671,6 +725,7 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo env.track_cache.clear(); TextureInstVector to_replace; for (IR::Block* const block : program.post_order_blocks) { + env.track_cache.clear(); for (IR::Inst& inst : block->Instructions()) { if (!IsTextureInstruction(inst)) { continue; From 0e11fe8b5e3d3b563946726ed06cb44b2bf5ccb3 Mon Sep 17 00:00:00 2001 From: xbzk Date: Mon, 26 Oct 2026 17:24:28 +0100 Subject: [PATCH 122/128] [video_core, settings] readback for nce invalidations (#4490) optimization and nuke toggles (#4502) (#4531) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Follow up for #4490: Originally i was racing locks between dirty and clean invalidations, but +94% were clean so it was causing useless locks. Solutioin was to share locks between both. P.S.: THIS IS INTENDED TO FIX RANDOM CRASHES IN UE, OBJECTIVELY REPRODUCIBLE IN ENDER MAGNOLIA IN ANDROID. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4531 Reviewed-by: CamilleLaVey Reviewed-by: Shinmegumi --- .../features/settings/model/BooleanSetting.kt | 1 - .../features/settings/model/view/SettingsItem.kt | 7 ------- .../settings/ui/SettingsFragmentPresenter.kt | 1 - src/android/app/src/main/res/values-ar/strings.xml | 2 -- .../app/src/main/res/values-zh-rTW/strings.xml | 2 -- src/android/app/src/main/res/values/strings.xml | 2 -- src/common/settings.h | 2 -- src/qt_common/config/shared_translation.cpp | 4 ---- src/video_core/gpu.cpp | 6 +++--- src/video_core/rasterizer_interface.h | 9 +++++++++ src/video_core/renderer_vulkan/vk_rasterizer.cpp | 12 ++++++++++++ src/video_core/renderer_vulkan/vk_rasterizer.h | 1 + 12 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt index 0548004cf5..6c33fc7812 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt @@ -16,7 +16,6 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting { RENDERER_USE_SPEED_LIMIT("use_speed_limit"), USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"), SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"), - NCE_INVALIDATION_GPU_READBACK("nce_invalidation_gpu_readback"), FIX_BLOOM_EFFECTS("fix_bloom_effects"), EMULATE_BGR565("emulate_bgr565"), RESCALE_HACK("rescale_hack"), diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 690c746628..f968a0ae18 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt @@ -859,13 +859,6 @@ abstract class SettingsItem( descriptionId = R.string.skip_cpu_inner_invalidation_description ) ) - put( - SwitchSetting( - BooleanSetting.NCE_INVALIDATION_GPU_READBACK, - titleId = R.string.nce_invalidation_gpu_readback, - descriptionId = R.string.nce_invalidation_gpu_readback_description - ) - ) put( SwitchSetting( BooleanSetting.FIX_BLOOM_EFFECTS, diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt index f9185e39e6..824a54181e 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -554,7 +554,6 @@ class SettingsFragmentPresenter( add(HeaderSetting(R.string.hacks)) add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key) - add(BooleanSetting.NCE_INVALIDATION_GPU_READBACK.key) add(BooleanSetting.FIX_BLOOM_EFFECTS.key) add(BooleanSetting.EMULATE_BGR565.key) add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key) diff --git a/src/android/app/src/main/res/values-ar/strings.xml b/src/android/app/src/main/res/values-ar/strings.xml index 2fdff9847b..3be04d9186 100644 --- a/src/android/app/src/main/res/values-ar/strings.xml +++ b/src/android/app/src/main/res/values-ar/strings.xml @@ -587,8 +587,6 @@ يجعل اللعبة تعتقد أن عمل وحدة معالجة الرسومات ينتهي بشكل أسرع مما هو عليه في الواقع، لذلك تتوقف عن خفض الدقة ومسافة العرض لتتناسب مع سرعات جهاز Switch. تخطي إبطال صلاحية وحدة المعالجة المركزية الداخلية يتخطى بعض عمليات إبطال ذاكرة التخزين المؤقتة من جانب وحدة المعالجة المركزية أثناء تحديثات الذاكرة، مما يقلل من استخدام وحدة المعالجة المركزية ويحسن أداءها. قد يتسبب ذلك في حدوث أعطال أو تعطل في بعض الألعاب. - إعادة قراءة وحدة معالجة الرسومات قبل إبطال صلاحية NCE - إصلاح مؤقت. يعالج مشكلة تعطل لعبة Ender Magnolia (وغيرها من ألعاب UE). قد يؤدي إلى انخفاض في الأداء. يجري العمل على تحسينه. إصلاح تأثيرات التوهج يقلل من ضبابية التوهج في LA/EOW (Adreno A6XX - A7XX/ Turnip)، ويزيل التوهج في Burnout. تحذير: قد يسبب تشوهات رسومية في ألعاب أخرى. محاكاة BGR565 diff --git a/src/android/app/src/main/res/values-zh-rTW/strings.xml b/src/android/app/src/main/res/values-zh-rTW/strings.xml index 3f0c6d9215..1391f1bc6e 100644 --- a/src/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/android/app/src/main/res/values-zh-rTW/strings.xml @@ -577,8 +577,6 @@ 讓遊戲誤以為 GPU 工作能更快完成,避免遊戲為了配合 Switch 的時脈而降低解析度與渲染距離 跳過 CPU 內部失效處理 在記憶體更新期間跳過某些 CPU 端快取的失效處理,減少 CPU 使用率並提高其性能。可能會導致某些遊戲出現故障或當機 - 在 NCE 無效化前進行 GPU 回讀 - (暫時性功能)修復 \"終結者瑪格諾莉亞:霧中綻放\" 及其它使用虛幻引擎之遊戲中的當機問題,可能會降低效能。此功能正在改善中 修正光暈特效 在 \"薩爾達傳說:織夢島\" 和 \"薩爾達傳說:智慧的再現\" 中減少光暈模糊的問題並移除 \"橫衝直撞:狂飆樂園重製版\" 中的光暈效果(適用於 Adreno A6XX - A7XX/ Turnip)。警告:可能會在其它遊戲中導致圖形異常 模擬 BGR565 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 191506c818..33e1eaa340 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -593,8 +593,6 @@ Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch\'s clocks. Skip CPU Inner Invalidation Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it\'s performance. This may cause glitches or crashes on some games. - GPU Readback Before NCE Invalidation - Temporary. Fix Ender Magnolia (and other UE titles) crashes. May reduce performance. Improvement in progress. Fix Bloom Effects Reduces bloom blur in LA/EOW (Adreno A6XX - A7XX/ Turnip), removes bloom in Burnout. Warning: may cause graphical artifacts in other games. Emulate BGR565 diff --git a/src/common/settings.h b/src/common/settings.h index d1f891607b..b57bec5c12 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -639,8 +639,6 @@ struct Values { Specialization::Default, true, true}; - SwitchableSetting nce_invalidation_gpu_readback{ - linkage, false, "nce_invalidation_gpu_readback", Category::RendererHacks}; SwitchableSetting async_presentation{linkage, #ifdef __ANDROID__ true, diff --git a/src/qt_common/config/shared_translation.cpp b/src/qt_common/config/shared_translation.cpp index 09e64b98f0..bb92d896f8 100644 --- a/src/qt_common/config/shared_translation.cpp +++ b/src/qt_common/config/shared_translation.cpp @@ -194,10 +194,6 @@ std::unique_ptr InitializeTranslations(QObject* parent) { INSERT(Settings, skip_cpu_inner_invalidation, tr("Skip CPU Inner Invalidation"), tr("Skips certain cache invalidations during memory updates, reducing CPU usage and " "improving latency. This may cause soft-crashes.")); - INSERT(Settings, nce_invalidation_gpu_readback, - tr("GPU Readback Before NCE Invalidation"), - tr("Flushes GPU buffer data back to guest memory before NCE invalidates the whole " - "guest page, preserving it while the CPU store proceeds.")); INSERT(Settings, vsync_mode, tr("VSync Mode:"), tr("FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen " "refresh rate.\nFIFO Relaxed allows tearing as it recovers from a slow down.\n" diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index 4e36d086e6..1621b24125 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -227,17 +227,17 @@ struct GPU::Impl { /// Notify rasterizer that any caches of the specified region should be invalidated void InvalidateRegion(DAddr addr, u64 size, bool preserve_gpu_writes) { - if (Settings::values.nce_invalidation_gpu_readback.GetValue()) { + if (preserve_gpu_writes) { VideoCore::RasterizerInterface* rasterizer = renderer->ReadRasterizer(); - if (preserve_gpu_writes && rasterizer->MustFlushRegion(addr, size, VideoCommon::CacheType::BufferCache)) { + if (!rasterizer->TryCacheInvalidation(addr, size)) { 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; } + return; } gpu_thread.InvalidateRegion(addr, size); } diff --git a/src/video_core/rasterizer_interface.h b/src/video_core/rasterizer_interface.h index 481efbf53b..b527c0e2a9 100644 --- a/src/video_core/rasterizer_interface.h +++ b/src/video_core/rasterizer_interface.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -111,6 +114,12 @@ public: /// Notify rasterizer that any caches of the specified region are desync with guest virtual void OnCacheInvalidation(PAddr addr, u64 size) = 0; + virtual bool TryCacheInvalidation(DAddr addr, u64 size) { + if (MustFlushRegion(addr, size, VideoCommon::CacheType::BufferCache)) return false; + OnCacheInvalidation(addr, size); + return true; + } + virtual bool OnCPUWrite(PAddr addr, u64 size) = 0; /// Sync memory between guest and host. diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index f43bea1220..264ffb28b5 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -798,6 +798,18 @@ void RasterizerVulkan::OnCacheInvalidation(DAddr addr, u64 size) { pipeline_cache.InvalidateRegion(addr, size); } +bool RasterizerVulkan::TryCacheInvalidation(DAddr addr, u64 size) { + if (addr == 0 || size == 0) return true; + { + std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex}; + if (buffer_cache.IsRegionGpuModified(addr, size)) return false; + texture_cache.WriteMemory(addr, size); + buffer_cache.WriteMemory(addr, size); + } + pipeline_cache.InvalidateRegion(addr, size); + return true; +} + void RasterizerVulkan::InvalidateGPUCache() { gpu.InvalidateGPUCache(); } diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index 7470aa4f14..ae9929ca0b 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -106,6 +106,7 @@ public: VideoCommon::CacheType which = VideoCommon::CacheType::All) override; void InnerInvalidation(std::span> sequences) override; void OnCacheInvalidation(DAddr addr, u64 size) override; + bool TryCacheInvalidation(DAddr addr, u64 size) override; bool OnCPUWrite(DAddr addr, u64 size) override; void InvalidateGPUCache() override; void UnmapMemory(DAddr addr, u64 size) override; From 5239cbe2a78d6533e3541a71c4d3c723818dcb6e Mon Sep 17 00:00:00 2001 From: xbzk Date: Mon, 26 Oct 2026 17:24:45 +0100 Subject: [PATCH 123/128] [nce] handles duplicate NCE interrupts (#4530) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Another crash observed in Ender Magnolia: A deadlock caused between CPUCore_0/GPU/GPUFencingThread. CPUCore_0 waits for GPU work inside the NCE fault handler GPU waits for the syncpoint mutex GPUFencingThread holds that mutex while waiting for CPUCore_0 NCE interrupt lock The fix makes duplicate interrupts return before acquiring the lock, while the first request keeps its original behavior. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4530 Reviewed-by: CamilleLaVey Reviewed-by: Shinmegumi --- src/core/arm/nce/arm_nce.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/arm/nce/arm_nce.cpp b/src/core/arm/nce/arm_nce.cpp index 63d5638fce..438dd4d981 100644 --- a/src/core/arm/nce/arm_nce.cpp +++ b/src/core/arm/nce/arm_nce.cpp @@ -369,8 +369,8 @@ void ArmNce::SetContext(const Kernel::Svc::ThreadContext& ctx) { } void ArmNce::SignalInterrupt(Kernel::KThread* thread) { - // Add break loop condition. - m_guest_ctx.esr_el1.fetch_or(static_cast(HaltReason::BreakLoop)); + constexpr u64 break_loop = static_cast(HaltReason::BreakLoop); + if ((m_guest_ctx.esr_el1.fetch_or(break_loop) & break_loop) != 0) return; auto* params = &thread->GetNativeExecutionParameters(); LockThreadParameters(params); From a3debcf731143aabd6eefee406d511551d3c9a73 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Mon, 26 Oct 2026 17:25:24 +0100 Subject: [PATCH 124/128] [buffer_cashe] use old logic when Optimized Vertex Buffers is disabled (#4528) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Fixes vertex explosions on Turnip. Fixes Celeste on QCOM. Fixes new issues discovered after #3579 Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4528 Reviewed-by: CamilleLaVey Reviewed-by: Shinmegumi --- src/video_core/buffer_cache/buffer_cache.h | 82 +++++++++++++++------- 1 file changed, 55 insertions(+), 27 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 53addb5dec..f30c85911f 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -1738,36 +1738,64 @@ void BufferCache

::TouchBuffer(Buffer& buffer, BufferId buffer_id) noexcept { template bool BufferCache

::SynchronizeBuffer(Buffer& buffer, DAddr device_addr, u32 size) { - upload_copies.clear(); - u64 total_size_bytes = 0; - u64 largest_copy = 0; - const DAddr buffer_start = buffer.cpu_addr_cached; - const auto add_upload = [&](DAddr start, DAddr end) { - if (start == end) return; - const u64 range_size = end - start; - upload_copies.push_back(BufferCopy{ - .src_offset = total_size_bytes, - .dst_offset = start - buffer_start, - .size = range_size, +#ifdef __ANDROID__ + const bool use_optimized_vertex_buffers = Settings::values.use_optimized_vertex_buffers.GetValue(); +#else + constexpr bool use_optimized_vertex_buffers = true; +#endif + + if (use_optimized_vertex_buffers) { + upload_copies.clear(); + u64 total_size_bytes = 0; + u64 largest_copy = 0; + const DAddr buffer_start = buffer.cpu_addr_cached; + const auto add_upload = [&](DAddr start, DAddr end) { + if (start == end) return; + const u64 range_size = end - start; + upload_copies.push_back(BufferCopy{ + .src_offset = total_size_bytes, + .dst_offset = start - buffer_start, + .size = range_size, + }); + total_size_bytes += range_size; + largest_copy = (std::max)(largest_copy, range_size); + }; + memory_tracker.ForEachUploadRange(device_addr, size, [&](u64 device_addr_out, u64 range_size) { + DAddr upload_start = device_addr_out; + gpu_modified_ranges.ForEachInRange(device_addr_out, range_size, [&](DAddr gpu_start, DAddr gpu_end) { + add_upload(upload_start, gpu_start); + upload_start = gpu_end; + }); + add_upload(upload_start, device_addr_out + range_size); }); - total_size_bytes += range_size; - largest_copy = (std::max)(largest_copy, range_size); - }; - memory_tracker.ForEachUploadRange(device_addr, size, [&](u64 device_addr_out, u64 range_size) { - DAddr upload_start = device_addr_out; - gpu_modified_ranges.ForEachInRange(device_addr_out, range_size, [&](DAddr gpu_start, DAddr gpu_end) { - add_upload(upload_start, gpu_start); - upload_start = gpu_end; + if (total_size_bytes == 0) { + return true; + } + const std::span copies_span(upload_copies.data(), upload_copies.size()); + UploadMemory(buffer, total_size_bytes, largest_copy, copies_span); + any_buffer_uploaded = true; + return false; + } else { + boost::container::small_vector copies; + u64 total_size_bytes = 0; + u64 largest_copy = 0; + DAddr buffer_start = buffer.CpuAddr(); + memory_tracker.ForEachUploadRange(device_addr, size, [&](u64 device_addr_out, u64 range_size) { + copies.push_back(BufferCopy{ + .src_offset = total_size_bytes, + .dst_offset = device_addr_out - buffer_start, + .size = range_size, + }); + total_size_bytes += range_size; + largest_copy = (std::max)(largest_copy, range_size); }); - add_upload(upload_start, device_addr_out + range_size); - }); - if (total_size_bytes == 0) { - return true; + if (total_size_bytes == 0) { + return true; + } + const std::span copies_span(copies.data(), copies.size()); + UploadMemory(buffer, total_size_bytes, largest_copy, copies_span); + return false; } - const std::span copies_span(upload_copies.data(), upload_copies.size()); - UploadMemory(buffer, total_size_bytes, largest_copy, copies_span); - any_buffer_uploaded = true; - return false; } template From cbd4cf2d8ce9b66936bff8a19be4715e770e0c71 Mon Sep 17 00:00:00 2001 From: John Date: Mon, 26 Oct 2026 17:25:47 +0100 Subject: [PATCH 125/128] [hle][core] Hang Freeze Fix - Video Fixes - Revert Microsleep (#4316) (#4525) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Credit: amicuchu Co-Authored-By: Claude Opus 5.5 - Fixes Mario Strikers Intro Freezing from legacy. - Microsleep no longer needed for Absolum Video freezing and other videos freezing. - Revert `[service, nvhost] added machinery to allow microsleep between nvdec read requests to avoid guest panic in some games #4316` - Tested with CPU/GPU decoding on Linux/Windows. Special thanks to xbzk Co-authored-by: Your Name Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4525 Reviewed-by: Maufeat Reviewed-by: Shinmegumi --- src/core/core.cpp | 40 +++---------------- src/core/core.h | 4 +- .../service/filesystem/fsp/fs_i_storage.cpp | 12 ++++++ .../hle/service/filesystem/fsp/fs_i_storage.h | 6 +++ .../service/nvdrv/devices/nvhost_nvdec.cpp | 11 +---- src/core/hle/service/service.cpp | 16 +------- src/core/hle/service/service.h | 2 - 7 files changed, 28 insertions(+), 63 deletions(-) diff --git a/src/core/core.cpp b/src/core/core.cpp index 046ee53346..06543b0833 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include "game_settings.h" @@ -249,30 +248,12 @@ struct System::Impl { } } - void NotifyNVDECChannelOpen(u64 process_id) { - std::scoped_lock lock{nvdec_active_mutex}; - ++nvdec_active_channels[process_id]; - } - - void NotifyNVDECChannelClose(u64 process_id) { - std::scoped_lock lock{nvdec_active_mutex}; - const auto it = nvdec_active_channels.find(process_id); - if (it == nvdec_active_channels.end()) { - return; - } - if (--it->second == 0) { - nvdec_active_channels.erase(it); - } + void SetNVDECActive(bool is_nvdec_active) { + nvdec_active = is_nvdec_active; } bool GetNVDECActive() { - std::scoped_lock lock{nvdec_active_mutex}; - return !nvdec_active_channels.empty(); - } - - bool IsNVDECActiveForProcess(u64 process_id) { - std::scoped_lock lock{nvdec_active_mutex}; - return nvdec_active_channels.contains(process_id); + return nvdec_active; } void InitializeDebugger(System& system, u16 port) { @@ -528,8 +509,6 @@ struct System::Impl { mutable std::mutex suspend_guard; std::mutex general_channel_mutex; - std::mutex nvdec_active_mutex; - std::unordered_map nvdec_active_channels; std::atomic_bool is_paused{}; std::atomic_bool is_shutting_down{}; std::atomic_bool is_powered_on{}; @@ -537,6 +516,7 @@ struct System::Impl { bool extended_memory_layout : 1 = false; bool exit_locked : 1 = false; bool exit_requested : 1 = false; + bool nvdec_active : 1 = false; void EnsureGeneralChannelInitialized(System& system) { if (!general_channel_event) { @@ -600,22 +580,14 @@ void System::UnstallApplication() { impl->UnstallApplication(); } -void System::NotifyNVDECChannelOpen(u64 process_id) { - impl->NotifyNVDECChannelOpen(process_id); -} - -void System::NotifyNVDECChannelClose(u64 process_id) { - impl->NotifyNVDECChannelClose(process_id); +void System::SetNVDECActive(bool is_nvdec_active) { + impl->SetNVDECActive(is_nvdec_active); } bool System::GetNVDECActive() { return impl->GetNVDECActive(); } -bool System::IsNVDECActiveForProcess(u64 process_id) { - return impl->IsNVDECActiveForProcess(process_id); -} - void System::InitializeDebugger() { impl->InitializeDebugger(*this, Settings::values.gdbstub_port.GetValue()); } diff --git a/src/core/core.h b/src/core/core.h index e26093f260..d88ed64151 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -191,10 +191,8 @@ public: std::unique_lock StallApplication(); void UnstallApplication(); - void NotifyNVDECChannelOpen(u64 process_id); - void NotifyNVDECChannelClose(u64 process_id); + void SetNVDECActive(bool is_nvdec_active); [[nodiscard]] bool GetNVDECActive(); - [[nodiscard]] bool IsNVDECActiveForProcess(u64 process_id); /** * Initialize the debugger. diff --git a/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp b/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp index 50b7d1e765..8541c17817 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp +++ b/src/core/hle/service/filesystem/fsp/fs_i_storage.cpp @@ -4,6 +4,10 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include +#include +#include + #include "core/file_sys/errors.h" #include "core/hle/service/cmif_serialization.h" #include "core/hle/service/filesystem/fsp/fs_i_storage.h" @@ -31,6 +35,14 @@ Result IStorage::Read( R_UNLESS(length >= 0, FileSys::ResultInvalidSize); R_UNLESS(offset >= 0, FileSys::ResultInvalidOffset); + const auto now = std::chrono::steady_clock::now(); + if (now < next_read_tick) { + std::this_thread::sleep_for(next_read_tick - now); + } + next_read_tick = std::chrono::steady_clock::now() + + std::chrono::nanoseconds{std::min(length, MaxChargedReadSize) * + 1'000'000'000 / ReadBytesPerSecond}; + // Read the data from the Storage backend backend->Read(out_bytes.data(), length, offset); diff --git a/src/core/hle/service/filesystem/fsp/fs_i_storage.h b/src/core/hle/service/filesystem/fsp/fs_i_storage.h index e676c52220..bac72d73c7 100644 --- a/src/core/hle/service/filesystem/fsp/fs_i_storage.h +++ b/src/core/hle/service/filesystem/fsp/fs_i_storage.h @@ -6,6 +6,8 @@ #pragma once +#include + #include "core/file_sys/vfs/vfs.h" #include "core/hle/service/cmif_types.h" #include "core/hle/service/filesystem/filesystem.h" @@ -20,6 +22,10 @@ public: private: FileSys::VirtualFile backend; + static constexpr s64 ReadBytesPerSecond = 40'000'000; + static constexpr s64 MaxChargedReadSize = 64 * 1024; + std::chrono::steady_clock::time_point next_read_tick{}; + Result Read( OutBuffer out_bytes, s64 offset, s64 length); diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp index f47369adb8..7ac3dfaa46 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp @@ -8,7 +8,6 @@ #include "common/assert.h" #include "common/logging.h" #include "core/core.h" -#include "core/hle/kernel/k_process.h" #include "core/hle/service/nvdrv/core/container.h" #include "core/hle/service/nvdrv/devices/ioctl_serialization.h" #include "core/hle/service/nvdrv/devices/nvhost_nvdec.h" @@ -72,23 +71,17 @@ NvResult nvhost_nvdec::Ioctl3(DeviceFD fd, Ioctl command, std::span in void nvhost_nvdec::OnOpen(NvCore::SessionId session_id, DeviceFD fd) { LOG_INFO(Service_NVDRV, "NVDEC video stream started"); + system.SetNVDECActive(true); sessions[fd] = session_id; - if (const auto* session = core.GetSession(session_id); - session != nullptr && session->process != nullptr) { - system.NotifyNVDECChannelOpen(session->process->GetId()); - } host1x.StartDevice(fd, Tegra::Host1x::ChannelType::NvDec, channel_syncpoint); } void nvhost_nvdec::OnClose(DeviceFD fd) { LOG_INFO(Service_NVDRV, "NVDEC video stream ended"); host1x.StopDevice(fd, Tegra::Host1x::ChannelType::NvDec); + system.SetNVDECActive(false); auto it = sessions.find(fd); if (it != sessions.end()) { - if (const auto* session = core.GetSession(it->second); - session != nullptr && session->process != nullptr) { - system.NotifyNVDECChannelClose(session->process->GetId()); - } sessions.erase(it); } } diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 225b92a783..b4fe2b3ed5 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -4,16 +4,12 @@ // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include #include -#include -#include #include "common/assert.h" #include "common/logging.h" #include "common/settings.h" #include "core/core.h" #include "core/hle/ipc.h" -#include "core/hle/kernel/k_process.h" #include "core/hle/kernel/kernel.h" #include "core/hle/service/ipc_helpers.h" #include "core/hle/service/service.h" @@ -37,7 +33,6 @@ ServiceFrameworkBase::ServiceFrameworkBase(Core::System& system_, const char* se : SessionRequestHandler(system_.Kernel(), service_name_) , system{system_} , service_name{service_name_} - , is_i_storage{std::string_view{service_name_} == "IStorage"} , handler_invoker{handler_invoker_} , max_sessions{max_sessions_} {} @@ -82,22 +77,13 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(HLERequestContext& ctx, } void ServiceFrameworkBase::InvokeRequest(HLERequestContext& ctx) { - const auto command = ctx.GetCommand(); - auto it = handlers.find(command); - const bool is_cmd_read = command == 0; + auto it = handlers.find(ctx.GetCommand()); FunctionInfoBase const* info = it == handlers.end() ? nullptr : &it->second; if (info == nullptr || info->handler_callback == nullptr) return ReportUnimplementedFunction(ctx, info); LOG_TRACE(Service, "{}", MakeFunctionString(info->name, GetServiceName(), ctx.CommandBuffer())); handler_invoker(this, info->handler_callback, ctx); - - if (is_i_storage && is_cmd_read) { - const auto* const process = ctx.GetThread().GetOwnerProcess(); - if (process != nullptr && system.IsNVDECActiveForProcess(process->GetId())) { - std::this_thread::sleep_for(std::chrono::microseconds{600}); - } - } } void ServiceFrameworkBase::InvokeRequestTipc(HLERequestContext& ctx) { diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h index ea98897e79..68b0d636d8 100644 --- a/src/core/hle/service/service.h +++ b/src/core/hle/service/service.h @@ -107,8 +107,6 @@ protected: Core::System& system; /// Identifier string used to connect to the service. const char* service_name; - /// Whether this is the IStorage service. - const bool is_i_storage; /// Function used to safely up-cast pointers to the derived class before invoking a handler. InvokerFn* handler_invoker; /// Maximum number of concurrent sessions that this service can handle. From b7c1ded1593c3c2dc58625824a04e30a63fe80c7 Mon Sep 17 00:00:00 2001 From: xbzk Date: Mon, 26 Oct 2026 17:26:07 +0100 Subject: [PATCH 126/128] [file_sys] added log for newer keys needed error (#4519) - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- One log line which could have spared me from a lot of trouble. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4519 Reviewed-by: CamilleLaVey Reviewed-by: Shinmegumi --- src/core/file_sys/content_archive.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/file_sys/content_archive.cpp b/src/core/file_sys/content_archive.cpp index b47b9437d0..1ba7bd3de3 100644 --- a/src/core/file_sys/content_archive.cpp +++ b/src/core/file_sys/content_archive.cpp @@ -45,6 +45,7 @@ NCA::NCA(VirtualFile file_, const NCA* base_nca, bool allow_missing_base) // Ensure we have the proper key area keys to continue. const u8 master_key_id = MasterKeyIdForKeyGeneration(reader->GetKeyGeneration()); if (!keys.HasKey(Core::Crypto::S128KeyType::KeyArea, master_key_id, reader->GetKeyIndex())) { + LOG_ERROR(Loader, "Cannot decrypt {}: keys for gen 0x{:02X}+ required.", file->GetName(), reader->GetKeyGeneration()); status = Loader::ResultStatus::ErrorMissingKeyAreaKey; return; } From 26a03d2473787abf3223b2d0e65b291eee00c1e1 Mon Sep 17 00:00:00 2001 From: John Date: Mon, 26 Oct 2026 17:26:32 +0100 Subject: [PATCH 127/128] Revert "[video_core] Improve asynchronous shader building (#2560)" (#4512) Restores performance but need to check TOTK item icons and Jamboree graphic issues. - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4512 Reviewed-by: CamilleLaVey Reviewed-by: Shinmegumi --- src/video_core/renderer_opengl/gl_shader_cache.cpp | 5 +++++ src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index df69eb97f5..277cf222fa 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp @@ -414,6 +414,11 @@ GraphicsPipeline* ShaderCache::BuiltPipeline(GraphicsPipeline* pipeline) const n if (!use_asynchronous_shaders) { return pipeline; } + // If something is using depth, we can assume that games are not rendering anything which + // will be used one time. + if (maxwell3d->regs.zeta_enable) { + return nullptr; + } // If games are using a small index count, we can assume these are full screen quads. // Usually these shaders are only used once for building textures so we can assume they // can't be built async diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index e9403580d5..d4ffcd8317 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -789,6 +789,11 @@ GraphicsPipeline* PipelineCache::BuiltPipeline(GraphicsPipeline* pipeline) const if (!use_asynchronous_shaders) { return pipeline; } + // If something is using depth, we can assume that games are not rendering anything which + // will be used one time. + if (maxwell3d->regs.zeta_enable) { + return nullptr; + } // If games are using a small index count, we can assume these are full screen quads. // Usually these shaders are only used once for building textures so we can assume they // can't be built async From a2aa4d97e10a8345babfe647e1abd5ed5909c623 Mon Sep 17 00:00:00 2001 From: crueter Date: Thu, 29 Oct 2026 17:10:37 +0100 Subject: [PATCH 128/128] [docs] Remove AI restrictions, and adapt to new open registration (#4585) Registration is now open. Enjoy Signed-off-by: crueter - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4585 Reviewed-by: lizzie --- .github/PULL_REQUEST_TEMPLATE.md | 1 - CONTRIBUTING.md | 39 ++---- docs/policies/AI.md | 203 ------------------------------- 3 files changed, 8 insertions(+), 235 deletions(-) delete mode 100644 docs/policies/AI.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 422efb5fdc..bdf9d048e8 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,5 +1,4 @@ - [ ] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). -- [ ] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md). - [ ] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8c16de9ddb..c87dd11dbe 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,15 +16,14 @@ Eden is free, open-source, copyleft software, licensed under the terms of the [G ### Policies -- We are trialing a slightly relaxed AI policy to allow high-quality contributors to use AI *responsibly*. Please read our [detailed AI policy](docs/policies/AI.md) for more info. -- Usage of any form of profanity or otherwise unsavory language is generally discouraged. - - This is primarily because it rarely helps to actually understand what's going on. - - Remember that your comments should be focused and actually address what's happening. With very few exceptions, expletives are actively detrimental at best. -- New code must follow the same general style as the surrounding codebase. Exceptions may be granted in certain cases. +- AI usage is allowed, but we reserve the right to close and rework your PR if you don't fully understand the changes you're making. + - As a common courtesy, please disclose your AI usage under the PR description, as `Assisted-by: ()`. +- Usage of any form of profanity or otherwise unsavory language is discouraged but not strictly disallowed. +- New code must follow the same style as the surrounding codebase. Exceptions may be granted in certain cases. - Maintainers reserve the right to change your patches and pull requests at will. We will try to avoid this. - You should generally respect all decisions made by the [code owners](docs/CODEOWNERS) in your particular subsystem. - However, if you feel they are overstepping or are incorrect, don't be afraid to stand your ground! Maintainers are not always correct. -- While we do *not* adhere to the terms of a formal code of conduct, you will generally be expected to respect other developers, contributors, and community members. +- While we do *not* adhere to the terms of a formal code of conduct, you are expected to treat other developers, contributors, and community members respectfully. - You **must** have basic knowledge of [Git](https://git-scm.com/learn). Knowing how to manage your branches and follow proper fork policies is a necessity. ### Where do I start? @@ -38,7 +37,8 @@ You may also search for open issues on [GitHub](https://github.com/eden-emulator There are five primary ways to contribute. - Submit pull requests directly to our source tree - - You must first request an account on our Forgejo. See [Signup](#how-do-i-sign-up) + - You must first [create an account](https://git.eden-emu.dev/user/sign_up). + - You may use an internal account, or you may use a GitHub/Codeberg account linked to our instance. - Submit pull requests to our [GitHub mirror](https://github.com/eden-emulator/Issue-Reports) - Note that this is subject to being removed by DMCA, so don't rely on this. - Submit pull requests to our [Codeberg mirror](https://codeberg.org/eden-emu/eden) @@ -50,31 +50,8 @@ There are five primary ways to contribute. To test your changes, ensure to read the [build documentation](./docs/Build.md) for your specific platform(s) to ensure everything compiles and works properly. You should also make sure that your branch is up-to-date with the upstream `master` branch before opening a pull request. -### How do I sign up? - -

-To sign up and begin contributing... (click to open) - -Email [crueter@crueter.xyz](mailto:crueter@crueter.xyz) with the following format: - -```txt -Subject: [Eden Git] Registration Request -Username: -Email: -I wish to sign up because... -``` - -Received mail that does not follow this format will be ignored. - -Once your request is processed, you will receive a confirmation email with your temporary password and some information on Git access and policies. If you do not receive a response within 48 hours, feel free to send another email. - -> [!WARNING] -> Some email providers may place the response email in your spam/junk folder; notable offenders include Gmail and Outlook. *Always* ensure to check your Spam or Junk folder. - -
- ## Non-code Contributions Alongside the other contribution methods listed up top, you can also choose to contribute through documentation, organization, or community guides. These can be done either through the code contribution methods described above, or created externally and shared via our Discord community. -If you have an external tool/page that you believe would be handy to integrate/link into Eden, please additionally email our developers at [`developers@eden-emu.dev`](mailto:developers@eden-emu.dev). **Do not submit vibe-coded or AI generated tools or applications**. +If you have an external tool/page that you believe would be handy to integrate/link into Eden, please additionally email our developers at [`developers@eden-emu.dev`](mailto:developers@eden-emu.dev). diff --git a/docs/policies/AI.md b/docs/policies/AI.md deleted file mode 100644 index dd4b4a7fb2..0000000000 --- a/docs/policies/AI.md +++ /dev/null @@ -1,203 +0,0 @@ -# AI Policy - -> [!WARNING] -> We are trialing a slightly relaxed AI policy to allow high-quality contributors to use AI *responsibly*. -> This policy is subject to change at any point in time, so check back frequently. -> -> This banner will be removed once we have finalized our revised policy. - -- [AI Policy](#ai-policy) - - [TL;DR](#tldr) - - [Definitions](#definitions) - - [Scope](#scope) - - [Introduction](#introduction) - - [Requirements](#requirements) - - [Sign-off, Authorship, and Copyright](#sign-off-authorship-and-copyright) - - [Permitted Usage](#permitted-usage) - - [Recommended Prior Discussion](#recommended-prior-discussion) - - [Forbidden Usage](#forbidden-usage) - - [Human Effort Denial of Service](#human-effort-denial-of-service) - - [Disclosure](#disclosure) - - [Codebase Ingestion](#codebase-ingestion) - - [Enforcement](#enforcement) - - [Addendum: AI Commit Messages](#addendum-ai-commit-messages) - - [References](#references) - -## TL;DR - -AI-assisted contributions are welcome, provided you take responsibility for them. - -- You **must** disclose any AI or LLM usage in your pull request description *and* commit message. -- You **must** be able to explain, defend, and revise every line of code you submit. -- Commit messages, PR descriptions, issues, and comments **must** be written by you. Verbatim AI output is not acceptable. -- Undisclosed AI usage will result in your contribution being rejected. -- Low-quality contributions, disclosed or not, will be reworked or rejected. -- Spamming automated PRs, comments, or issues is treated as a Denial of Service (DoS) attack on our reviewers; see [Human Effort Denial of Service](#human-effort-denial-of-service). - -## Definitions - -An *AI or LLM-based tool* is any piece of software that generates code, text, or other content through machine learning models. This includes, but is not limited to: chat assistants, agentic coding tools/harnesses, inline code completion suggestions you have accepted into the code, and AI-driven explanation/refactoring features. - -For the purposes of this policy, basic deterministic/static development tools (such as clang-tidy, git, compilers, etc.) are not considered AI tools. - -Terms such as "substantially", "large-scale", "majority", and "low-quality" are intentionally left vague, and will be interpreted at the maintainers' discretion. When in doubt, ask first. - -## Scope - -This policy applies to all code contributions, alongside issues and pull requests surrounding this codebase. This includes: - -- Commit messages -- PR descriptions -- Code review comments -- Issue/PR comments -- Patches submitted via e-mail - -Areas that are not directly related to code--such as our surrounding communities--are not covered by the terms of this policy. Additionally, spelling/grammar checking via AI or LLM-based tools is not covered under this document. - -## Introduction - -In the right hands, AI and LLM-based tools are incredibly useful for getting features and bugfixes out the door as fast as possible. At the same time, reviewer bandwidth is a scarce resource. We are therefore open to AI-assisted contributions, provided they are produced and disclosed properly. - -The goal of this document is *not* to set arbitrary restrictions, but rather to keep our development healthy and stable, while still allowing contributors to use the tools they find helpful. A contribution must be worth more to the project than the time it takes to review it. - -Throughout this document, **must** and **must not** are inflexible, binding requirements. Refusal to follow these is treated as a violation of the terms outlined in this document. - -## Requirements - -These apply to all contributions, whether AI-assisted or not. AI-assisted contributions also carry additional disclosure requirements as outlined in [Disclosure](#disclosure). - -1. *Disclosure*. Any and all usage of AI or LLM-based tools within any contribution **must** be explicitly marked and disclosed as appropriate. -2. *Responsibility*. The human submitter of any contribution is held wholly responsible for the accuracy, completeness, and intent of what is submitted. You **must** be able to explain, defend, and revise your code during review. -3. *Review*. All code **must** be thoroughly reviewed by the author before opening a PR or marking it ready for review. -4. *Testing*. All code changes **must** be tested directly by the human author. -5. *Quality*. All submitted code is held to a strict standard of excellence. Low-quality AI-generated content does not uphold this standard. -6. *Licensing*. All code **must** be compatible with the GPLv3 or later. You **must** warrant that you have the right to submit it under those terms, and that it was not copied from work published under an incompatible license. - -## Sign-off, Authorship, and Copyright - -AI agents **must not** add `Signed-off-by:` tags. The human submitter **must** sign off on all changes. - -Similarly, AI agents cannot hold authorship or copyright over code, and **must not** add `Co-authored-by:` or `Co-developed-by:` tags. The human submitter **must** author all changes. - -## Permitted Usage - -This is a non-exhaustive list of permitted uses of AI and LLM-based tools, provided they are disclosed properly. - -- Drafting issues and pull requests, provided the final text and submitted code are substantially your own. -- Debugging issues, bugs, glitches, and crashes, whether pre-existing or introduced by your own changes. -- Reviewing your own changes before submitting a PR. -- Research, brainstorming, and codebase searching/understanding. -- Applying tedious but not particularly large changes, such as mass-migrating specific classes to polyfills or abstractions. - -## Recommended Prior Discussion - -Some usage cases are not necessarily forbidden nor permitted. These should be discussed with maintainers in an issue or e-mail *before* submission. Maintainers and reviewers may also comment on this during the review/submission phase. - -- Generating boilerplate/scaffolding for new code. -- Writing unit tests. -- Large-scale refactors primarily driven by an AI agent. -- Any contribution where an AI agent or model was responsible for the majority of the implementation. - -## Forbidden Usage - -This is a non-exhaustive list of strictly forbidden uses of AI and LLM-based tools. - -- Vibecoding, or changes entirely authored by AI agents without human intervention or understanding. - - If you don't choose to put in the necessary effort to understand every line of code you submitted, neither will we. -- Fully AI-generated commit messages, PR descriptions, issues, or comments. See [Addendum: AI Commit Messages](#addendum-ai-commit-messages). -- Submission of AI-assisted work that is not disclosed per the [Disclosure](#disclosure) requirements. -- Low-quality submissions that fail to satisfy our standard of code excellence. -- Submitting secrets, credentials, private user data, or unpublished security reports to third-party AI services. - - This includes console keys, encryption material, and private vulnerability disclosures. -- Verbatim AI code reviews (e.g. Codex/Copilot reviews). - -## Human Effort Denial of Service - -Using automated tools and AI to submit PRs, issues, and comments that we have to carefully review and handle is considered a [Denial-of-service attack](https://en.wikipedia.org/wiki/Denial-of-service_attack) on our human effort. - -It takes very little effort on your side (an LLM prompt) to generate a large amount of effort on ours (careful and thorough code review). Please respect our time and don't do that. - -## Disclosure - -How you disclose AI usage is up to you. However, it **must** be explicit, easy to identify, and placed both within the commit message *and* the surrounding PR description. For patches submitted by e-mail, the cover letter counts as the PR description. We recommend an `Assisted-by:` footer: - -```txt -Assisted-by: () -``` - -For instance: - -```txt -Assisted-by: Claude Opus 5.5 (initial draft and code review) -``` - -Contributions without a commit message (e.g. issues/comments) should instead use a plain sentence in the text body such as `I used to help with `. PRs and commit messages may opt to use this format as well. - -Multi-commit series/squashes **must** maintain the trailer. Maintainers will handle this for merges to master, but you are responsible for ensuring the disclosure survives into the final commit/PR body of squashes within your branches. - -Regardless, what matters is that reviewers can tell *at a glance* where and how AI was involved in your contribution. - -## Codebase Ingestion - -Ingestion of this codebase by LLMs for any purpose--such as training or prompt context--is permitted *for now*. This may change at any point as litigation and court rulings around AI and code copyright proceed. - -AI models may have ingested AGPLv3 or otherwise copyleft-incompatible code and may regurgitate it. You remain responsible for ensuring that all code you submit is compatible with the GPLv3 or later. - -## Enforcement - -- If we suspect undisclosed AI usage in a contribution, we will ask for disclosure. -- Refusal to provide disclosure will result in rejection of the contribution, and your PR or issue will be closed. Maintainers may choose to rework it themselves if the change is worth having. -- Accounts that spam us with repeated automated PRs or comments will be blocked or permanently suspended from our Git instance. -- Maintainers reserve the right to close your issues and pull requests if you don't follow the guidelines and procedures outlined in this document, and refuse or fail to make changes as necessary to comply. -- Repeated failures to comply may result in loss of contribution privileges. - -## Addendum: AI Commit Messages - -The patchset for pull request [#3422](https://git.eden-emu.dev/eden-emu/eden/pulls/3422) was fed into a dedicated code AI model, and it produced the following: - -```txt -profile_manager: Refactor user deletion to use index instead of UUID - -This commit improves the user profile deletion flow in the following ways: - -1. **UI layer (ConfigureProfileManager)**: - - Replaces UUID-based deletion with index-based deletion - - Passes the selected row index from the tree view to the confirmation dialog - - Emits deleteUser(int index) signal from ConfigureProfileManagerDeleteDialog - - Removes lambda capture and std::function callback in favor of direct signal/slot connection - -2. **Delete dialog**: - - Changes SetInfo() signature to accept index instead of accept callback - - Stores index internally and emits it via deleteUser signal on acceptance - -3. **Core ProfileManager**: - - Refactors RemoveUser(UUID) → RemoveProfileAtIndex(index) - - Removes duplicated stable_partition + save logic from RemoveUser() - - Centralizes profile removal and save-file writing in RemoveProfileAtIndex() - -4. **Minor follow-up**: - - Adds profile_manager.ResetUserSaveFile() call in PopulateUserList() to ensure consistent state when refreshing the user list - -These changes eliminate redundant code, reduce the risk of UUID → index mismatch bugs, and make the deletion path more straightforward and maintainable. - -Fixes: potential inconsistency when user order changes between UI and backend -``` - -This: - -- Is needlessly verbose (nobody cares about most of these details) -- Doesn't address the actual purpose of the PR (fixing a double-deletion bug in the profile manager) -- Has unicode arrows (this is bad for command-line editors) -- Uses corporate and word-salad language that pads out the message to make it look like a lot changed - -A good commit message should be concise, descriptive, and convey the *intent* behind the change, such as the bug being fixed or the feature being added. It should *not* be a detailed changelog of every individual byte that's changed. - -## References - -This policy document has been adapted from the AI policies of numerous other free and open-source projects, whether restrictive or permissive. - -- [Gitea](https://github.com/go-gitea/gitea/blob/main/CONTRIBUTING.md#ai-contribution-policy) -- The [Linux kernel](https://kernel.org/doc/html/next/process/coding-assistants.html) -- [Gentoo Linux](https://wiki.gentoo.org/wiki/Project:Council/AI_policy) -- [cURL](https://curl.se/dev/contribute.html#on-ai-use-in-curl) -- [FastAPI](https://tiangolo.com/open-source/contributing/#automated-code-and-ai)